Skip to content

Commit

Permalink
avoids .ctor, calls static factory method
Browse files Browse the repository at this point in the history
  • Loading branch information
jakubmisek committed Apr 29, 2023
1 parent 371f15b commit 328db28
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
21 changes: 17 additions & 4 deletions src/Peachpie.CodeAnalysis/CodeGen/DynamicOperationFactory.cs
Expand Up @@ -399,11 +399,24 @@ bool TryConstructRuntimeChainElement(BoundExpression expr, out RuntimeChainEleme
/// <summary>Emits new instance of wrapper with value. Returns wrapper.</summary>
public TypeSymbol EmitWrapParam(NamedTypeSymbol wrapper, ITypeSymbol value)
{
// Template: new wrapper(<STACK:value>)
TypeSymbol t;

var ctor = wrapper.InstanceConstructors.Single(m => m.ParameterCount == 1);
Debug.Assert(SymbolEqualityComparer.Default.Equals(ctor.Parameters[0].Type, value));
var t = _cg.EmitCall(ILOpCode.Newobj, ctor);
// prefer factory method Create(RuntimeTypeHandle) over the struct's .ctor

// Template: wrapper.Create( <STACK:value> )
var create = wrapper.GetMembers("Create").OfType<MethodSymbol>().SingleOrDefault(m => m.ParameterCount == 1);
if (create != null)
{
Debug.Assert(SymbolEqualityComparer.Default.Equals(create.Parameters[0].Type, value));
t = _cg.EmitCall(ILOpCode.Call, create);
}
else
{
// Template: new wrapper(<STACK:value>)
var ctor = wrapper.InstanceConstructors.Single(m => m.ParameterCount == 1);
Debug.Assert(SymbolEqualityComparer.Default.Equals(ctor.Parameters[0].Type, value));
t = _cg.EmitCall(ILOpCode.Newobj, ctor);
}

AddArg(t, byref: false);

Expand Down
3 changes: 3 additions & 0 deletions src/Peachpie.Runtime/Dynamic/SpecialParams.cs
Expand Up @@ -173,6 +173,9 @@ void ISpecialParamHolder.Process(CallSiteContext info, Expression valueExpr)

/// <summary>Initializes the structure.</summary>
public CallerTypeParam(RuntimeTypeHandle value) => Value = value;

/// <summary>Creates the structure.</summary>
public static CallerTypeParam Create(RuntimeTypeHandle value) => new CallerTypeParam(value);
}

/// <summary>
Expand Down

0 comments on commit 328db28

Please sign in to comment.