2
0
Эх сурвалжийг харах

pastojs: record rtti: add reference to type for records with rtti members

mattias 1 өдөр өмнө
parent
commit
e36cb38acf

+ 3 - 6
packages/pastojs/src/fppas2js.pp

@@ -19195,7 +19195,6 @@ var
   ObjLit: TJSObjectLiteral;
   Call: TJSCallExpression;
   HasRTTIMembers: Boolean;
-  RecordInfo: TJSObjectLiteralElement;
 begin
   // module.$rtti.$Record("typename",{});
   Call:=CreateRTTINewType(El,GetBIName(pbifnRTTINewRecord),false,FuncContext,ObjLit);
@@ -19208,11 +19207,9 @@ begin
 
   HasRTTIMembers:=CreateRTTIMembers(El,Src,FuncContext,MembersSrc,MembersFuncContext,Call,false);
   if HasRTTIMembers then
-  begin
-    RecordInfo := ObjLit.Elements.AddElement;
-    RecordInfo.Name := GetBIName(pbivnPtrRecord);
-    RecordInfo.Expr := CreatePrimitiveDotExpr('this', El);
-  end
+    // append this:  module.$rtti.$Record("typename",{},this);
+    // The rtti gets a $record reference to the record type.
+    Call.AddArg(CreatePrimitiveDotExpr('this', El))
   else
     begin
     // no published members, add "module.$rtti.$Record..."

+ 5 - 5
packages/pastojs/tests/tcgenerics.pas

@@ -329,7 +329,7 @@ begin
     LinesToStr([ // statements
     'var $impl = $mod.$impl;',
     'rtl.recNewT(this, "TAnt$G1", function () {',
-    '  var $r = $mod.$rtti.$Record("TAnt<Test1.TBird>", {});',
+    '  var $r = $mod.$rtti.$Record("TAnt<Test1.TBird>", {}, this);',
     '  this.$initSpec = function () {',
     '    this.x = $impl.TBird.$new();',
     '    $r.addField("x", $mod.$rtti["TBird"]);',
@@ -355,7 +355,7 @@ begin
     '    this.b = s.b;',
     '    return this;',
     '  };',
-    '  var $r = $mod.$rtti.$Record("TBird", {});',
+    '  var $r = $mod.$rtti.$Record("TBird", {}, this);',
     '  $r.addField("b", rtl.word);',
     '});',
     '$impl.f = $mod.TAnt$G1.$new();',
@@ -1566,7 +1566,7 @@ begin
     '        this.b = s.b;',
     '        return this;',
     '      };',
-    '      var $r = $mod.$rtti.$Record("TBird", {});',
+    '      var $r = $mod.$rtti.$Record("TBird", {}, this);',
     '      $r.addField("b", rtl.word);',
     '    });',
     '    $impl.f = null;',
@@ -2777,7 +2777,7 @@ begin
     '        this.b = s.b;',
     '        return this;',
     '      };',
-    '      var $r = $mod.$rtti.$Record("TBird", {});',
+    '      var $r = $mod.$rtti.$Record("TBird", {}, this);',
     '      $r.addField("b", rtl.word);',
     '    });',
     '    rtl.createClass($impl, "TAnt", pas.system.TObject, function () {',
@@ -2951,7 +2951,7 @@ begin
     '        this.b = s.b;',
     '        return this;',
     '      };',
-    '      var $r = $mod.$rtti.$Record("TBird", {});',
+    '      var $r = $mod.$rtti.$Record("TBird", {}, this);',
     '      $r.addField("b", rtl.word);',
     '    });',
     '    $impl.f = null;',

+ 5 - 5
packages/pastojs/tests/tcmodules.pas

@@ -18562,7 +18562,7 @@ begin
     '      this.y = s.y;',
     '      return this;',
     '    };',
-    '    var $r = $mod.$rtti.$Record("TObject.TPoint", {});',
+    '    var $r = $mod.$rtti.$Record("TObject.TPoint", {}, this);',
     '    $r.addField("x", rtl.byte);',
     '    $r.addField("y", rtl.byte);',
     '  });',
@@ -33698,7 +33698,7 @@ begin
     '    this.y = s.y;',
     '    return this;',
     '  };',
-    '  var $r = $mod.$rtti.$Record("TPoint", {});',
+    '  var $r = $mod.$rtti.$Record("TPoint", {}, this);',
     '  $r.addField("x", rtl.longint);',
     '  $r.addField("y", rtl.longint);',
     '});',
@@ -33745,7 +33745,7 @@ begin
     '    this.d = rtl.arrayRef(s.d);',
     '    return this;',
     '  };',
-    '  var $r = $mod.$rtti.$Record("TFloatRec", {});',
+    '  var $r = $mod.$rtti.$Record("TFloatRec", {}, this);',
     '  $mod.$rtti.$DynArray("TFloatRec.d$a", {',
     '    eltype: rtl.char',
     '  });',
@@ -33789,7 +33789,7 @@ begin
     '  this.$assign = function (s) {',
     '    return this;',
     '  };',
-    '  var $r = $mod.$rtti.$Record("TPoint", {});',
+    '  var $r = $mod.$rtti.$Record("TPoint", {}, this);',
     '  $r.addField("p", $mod.$rtti["TPoint.TProc"]);',
     '}, true);',
     '']),
@@ -34848,7 +34848,7 @@ begin
     '    this.Height = s.Height;',
     '    return this;',
     '  };',
-    '  var $r = $mod.$rtti.$Record("TRec", {});',
+    '  var $r = $mod.$rtti.$Record("TRec", {}, this);',
     '  $r.addField("Size", rtl.word, 2, {',
     '    attr: [',
     '        $mod.TCustomAttribute,',

+ 1 - 1
utils/pas2js/dist/rtl.js

@@ -1610,7 +1610,7 @@ var rtl = {
     $ProcVar: function(name,o){ return this.$inherited(name,rtl.tTypeInfoProcVar,o); },
     $RefToProcVar: function(name,o){ return this.$inherited(name,rtl.tTypeInfoRefToProcVar,o); },
     $MethodVar: function(name,o){ return this.$inherited(name,rtl.tTypeInfoMethodVar,o); },
-    $Record: function(name,o){ return this.$Scope(name,rtl.tTypeInfoRecord,o); },
+    $Record: function(name,o,typ){ if(typ) o.$record = typ; return this.$Scope(name,rtl.tTypeInfoRecord,o); },
     $Class: function(name,o){ return this.$Scope(name,rtl.tTypeInfoClass,o); },
     $ClassRef: function(name,o){ return this.$inherited(name,rtl.tTypeInfoClassRef,o); },
     $Pointer: function(name,o){ return this.$inherited(name,rtl.tTypeInfoPointer,o); },