Browse Source

Invoke function calling the correct construction function.

Henrique Gottardi Werlang 5 months ago
parent
commit
516be722e2
1 changed files with 17 additions and 2 deletions
  1. 17 2
      packages/rtl/src/rtti.pas

+ 17 - 2
packages/rtl/src/rtti.pas

@@ -2228,7 +2228,7 @@ end;
 function TRttiMethod.GetProcedureSignature: TRttiProcedureSignature;
 function TRttiMethod.GetProcedureSignature: TRttiProcedureSignature;
 begin
 begin
   if not Assigned(FProcedureSignature) then
   if not Assigned(FProcedureSignature) then
-    FProcedureSignature := TRttiProcedureSignature.Create;
+    FProcedureSignature := TRttiProcedureSignature.Create(MethodTypeInfo.ProcSig);
 
 
   Result := FProcedureSignature;
   Result := FProcedureSignature;
 end;
 end;
@@ -2242,15 +2242,30 @@ function TRttiMethod.Invoke(const Instance: TValue; const Args: array of TValue)
 var
 var
   A: Integer;
   A: Integer;
   AArgs: TJSValueDynArray;
   AArgs: TJSValueDynArray;
+  Func: TJSFunction;
+  InstanceObject: TJSObject;
   ReturnValue: JSValue;
   ReturnValue: JSValue;
 
 
 begin
 begin
+  InstanceObject := TJSObject(Instance.AsJSValue);
+
   SetLength(AArgs, Length(Args));
   SetLength(AArgs, Length(Args));
 
 
   for A := Low(Args) to High(Args) do
   for A := Low(Args) to High(Args) do
     AArgs[A] := Args[A].AsJSValue;
     AArgs[A] := Args[A].AsJSValue;
 
 
-  ReturnValue := TJSFunction(TJSObject(Instance.AsJSValue)[MethodTypeInfo.Name]).apply(TJSObject(Instance.AsJSValue), AArgs);
+  if IsConstructor then
+  begin
+    Func := TJSFunction(InstanceObject['$create']);
+
+    ReturnValue := Func.apply(InstanceObject, [MethodTypeInfo.Name, AArgs]);
+  end
+  else
+  begin
+    Func := TJSFunction(InstanceObject[MethodTypeInfo.Name]);
+
+    ReturnValue := Func.apply(InstanceObject, AArgs);
+  end;
 
 
   if Assigned(ReturnType) then
   if Assigned(ReturnType) then
     TValue.Make(ReturnValue, ReturnType.Handle, Result)
     TValue.Make(ReturnValue, ReturnType.Handle, Result)