Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problems when compiling a project using Avalonia UI. Help is needed #1118

Open
FibonacciFox opened this issue Jul 18, 2023 · 5 comments
Open

Comments

@FibonacciFox
Copy link

FibonacciFox commented Jul 18, 2023

Hello, jakubmisek.
I can't solve the problem for a very long time. There is a library .Net, which builds the project and replaces the AvaloniaXaml.Load(this) call with !XamlIlPopulateTrampoline(this). (screenshots are attached). In PHP, is it compiled into
call_Load?0.Target(call_Load?0, this, , this); Because of this, it is impossible to build the project because the library cannot find AvaloniaXaml.Load(this) in the class. Link to the code section:
XamlCompilerTaskExecutor.cs

Here is what happens in c# :
image
image

Here's what's going on in php:

image
image

But if you specify in php like this:

public function Load(object $This){
      AvaloniaXamlLoader::Load($This)
}

Will compile to:

public virtual void Load(object This){
     AvaloniaXamlLoader.Load(This)
}

But that won't help in any way, because it's still waiting for AvaloniaXamlLoader.Load(this); when compiling.
I will be very grateful in finding a solution to this problem.

@jakubmisek
Copy link
Member

The compiler sees several Load() overloads, so it postpones the resolution to runtime using the callsite (call_Load?0).

The fix would be to improve the compiler so it resolves the Load(object) overload in compile time - I'm not sure, why it's not resolving it already, it should.

@FibonacciFox
Copy link
Author

The compiler sees several Load() overloads, so it postpones the resolution to runtime using the callsite (call_Load?0).

The fix would be to improve the compiler so it resolves the Load(object) overload in compile time - I'm not sure, why it's not resolving it already, it should.

As I understand it, this problem can be solved only at the compiler level?

@kekekeks
Copy link

For a reference: this is how XAML compiler task tries to match AvaloniaXamlLoader.Load(this) call.

It currently recognizes the normal

ldarg.0
call AvaloniaXamlLoader.Load(object)

pattern and the monstrosity generated by F# compiler.

The peachpie pattern won't be easily recognizable since it would require us to analyze the CallSite static variable initialization that happens elsewhere and looks like an internal implementation detail.

So the preferable solution would be for peachpie to just emit the simple ldarg.0+call sequence.

@jakubmisek
Copy link
Member

@kekekeks the compiler mainly emits simple .ldarg+.call. Here it's probably an unimplemented optimization where due to more similar overloads, it falls back to runtime overload resolution.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants