Browse Source

webidl: wasmjob: fixed multi used function

mattias 3 years ago
parent
commit
4809c1fa64

+ 41 - 29
packages/webidl/src/webidltopas.pp

@@ -135,17 +135,17 @@ type
     function WriteDictionaryDefs(aList: TIDLDefinitionList): Integer; virtual;
     function WriteForwardClassDefs(aList: TIDLDefinitionList): Integer; virtual;
     function WriteInterfaceDefs(aList: TIDLDefinitionList): Integer; virtual;
-    function WriteMethodDefs(aList: TIDLDefinitionList): Integer; virtual;
+    function WriteMethodDefs(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; virtual;
     function WriteUtilityMethods(Intf: TIDLInterfaceDefinition): Integer; virtual;
     function WriteTypeDefsAndCallbacks(aList: TIDLDefinitionList): Integer; virtual;
     function WriteEnumDefs(aList: TIDLDefinitionList): Integer; virtual;
-    function WriteConsts(aList: TIDLDefinitionList): Integer; virtual;
-    function WriteProperties(aList: TIDLDefinitionList): Integer; virtual;
-    function WritePlainFields(aList: TIDLDefinitionList): Integer; virtual;
-    function WriteDictionaryFields(aList: TIDLDefinitionList): Integer; virtual;
-    function WritePrivateReadOnlyFields(aList: TIDLDefinitionList): Integer; virtual;
-    function WritePrivateGetters(aList: TIDLDefinitionList): Integer; virtual;
-    function WritePrivateSetters(aList: TIDLDefinitionList): Integer; virtual;
+    function WriteConsts(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WriteProperties(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WritePlainFields(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WriteDictionaryFields(aDict: TIDLDictionaryDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WritePrivateReadOnlyFields(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WritePrivateGetters(aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer; virtual;
+    function WritePrivateSetters(aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer; virtual;
     // Definitions. Return true if a definition was written.
     function WriteForwardClassDef(D: TIDLStructuredDefinition): Boolean; virtual;
     function WriteFunctionTypeDefinition(aDef: TIDLFunctionDefinition): Boolean; virtual;
@@ -153,7 +153,7 @@ type
     function WriteTypeDef(aDef: TIDLTypeDefDefinition): Boolean; virtual;
     function WriteRecordDef(aDef: TIDLRecordDefinition): Boolean; virtual;
     function WriteEnumDef(aDef: TIDLEnumDefinition): Boolean; virtual;
-    function WriteDictionaryField(aField: TIDLDictionaryMemberDefinition): Boolean; virtual;
+    function WriteDictionaryField(aDict: TIDLDictionaryDefinition; aField: TIDLDictionaryMemberDefinition): Boolean; virtual;
     function WriteField(aAttr: TIDLAttributeDefinition): Boolean; virtual;
     function WriteConst(aConst: TIDLConstDefinition): Boolean ; virtual;
     function WriteInterfaceDef(Intf: TIDLInterfaceDefinition): Boolean; virtual;
@@ -373,29 +373,35 @@ begin
           Inc(Result);
 end;
 
-function TBaseWebIDLToPas.WritePrivateReadOnlyFields(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WritePrivateReadOnlyFields(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 begin
   Result:=0;
+  if aParent=nil then ;
   if aList=nil then ;
 end;
 
-function TBaseWebIDLToPas.WritePrivateGetters(aList: TIDLDefinitionList
-  ): Integer;
+function TBaseWebIDLToPas.WritePrivateGetters(
+  aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer;
 begin
   Result:=0;
+  if aParent=nil then ;
   if aList=nil then ;
 end;
 
-function TBaseWebIDLToPas.WritePrivateSetters(aList: TIDLDefinitionList
-  ): Integer;
+function TBaseWebIDLToPas.WritePrivateSetters(
+  aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer;
 begin
   Result:=0;
+  if aParent=nil then ;
   if aList=nil then ;
 end;
 
-function TBaseWebIDLToPas.WriteProperties(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WriteProperties(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 begin
   Result:=0;
+  if aParent=nil then ;
   if aList=nil then ;
 end;
 
@@ -410,12 +416,14 @@ begin
   Addln('%s = %s;',[GetName(aConst),S])
 end;
 
-function TBaseWebIDLToPas.WriteConsts(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WriteConsts(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 
 Var
   D: TIDLDefinition;
 
 begin
+  if aParent=nil then ;
   EnsureSection(csConst);
   Indent;
   Result:=0;
@@ -426,13 +434,15 @@ begin
   Undent;
 end;
 
-function TBaseWebIDLToPas.WritePlainFields(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WritePlainFields(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 
 Var
   D: TIDLDefinition;
   A: TIDLAttributeDefinition absolute D;
 
 begin
+  if aParent=nil then ;
   EnsureSection(csDeclaration);
   Result:=0;
   For D in aList do
@@ -442,7 +452,7 @@ begin
           Inc(Result);
 end;
 
-function TBaseWebIDLToPas.WriteDictionaryField(
+function TBaseWebIDLToPas.WriteDictionaryField(aDict: TIDLDictionaryDefinition;
   aField: TIDLDictionaryMemberDefinition): Boolean;
 
 Var
@@ -462,7 +472,8 @@ begin
   AddLn(Def);
 end;
 
-function TBaseWebIDLToPas.WriteDictionaryFields(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WriteDictionaryFields(
+  aDict: TIDLDictionaryDefinition; aList: TIDLDefinitionList): Integer;
 
 Var
   D: TIDLDefinition;
@@ -473,12 +484,13 @@ begin
   Result:=0;
   For D in aList do
     if D is TIDLDictionaryMemberDefinition then
-      if WriteDictionaryField(M) then
+      if WriteDictionaryField(aDict,M) then
         Inc(Result);
   Undent;
 end;
 
-function TBaseWebIDLToPas.WriteMethodDefs(aList: TIDLDefinitionList): Integer;
+function TBaseWebIDLToPas.WriteMethodDefs(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 
 Var
   D: TIDLDefinition;
@@ -673,9 +685,9 @@ begin
     // private section
     AddLn('Private');
     Indent;
-    WritePrivateReadOnlyFields(ML);
-    WritePrivateGetters(ML);
-    WritePrivateSetters(ML);
+    WritePrivateReadOnlyFields(Intf,ML);
+    WritePrivateGetters(Intf,ML);
+    WritePrivateSetters(Intf,ML);
     Undent;
     // write public section
     AddLn('Public');
@@ -683,16 +695,16 @@ begin
       begin
       Indent;
       PushSection(csUnknown);
-      WriteConsts(ML);
+      WriteConsts(Intf,ML);
       PopSection;
       Undent;
       AddLn('Public');
       end;
     Indent;
-    WritePlainFields(ML);
-    WriteMethodDefs(ML);
+    WritePlainFields(Intf,ML);
+    WriteMethodDefs(Intf,ML);
     WriteUtilityMethods(Intf);
-    WriteProperties(ML);
+    WriteProperties(Intf,ML);
     Undent;
     AddLn('end;');
   finally
@@ -724,7 +736,7 @@ begin
     // class and ancestor
     Decl:=GetDictionaryDefHead(CurClassName,aDict);
     AddLn(Decl);
-    WriteDictionaryFields(DefList);
+    WriteDictionaryFields(aDict,DefList);
     AddLn('end;');
   finally
     DefList.Free;

+ 10 - 9
packages/webidl/src/webidltopas2js.pp

@@ -52,14 +52,14 @@ type
     // Code generation routines. Return the number of actually written defs.
     function WriteFunctionDefinition(aDef: TIDLFunctionDefinition): Boolean;
       override;
-    function WritePrivateReadOnlyFields(aList: TIDLDefinitionList): Integer;
+    function WritePrivateReadOnlyFields(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer;
       override;
-    function WriteProperties(aList: TIDLDefinitionList): Integer; override;
+    function WriteProperties(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; override;
     // Definitions. Return true if a definition was written.
     function WriteConst(aConst: TIDLConstDefinition): Boolean; override;
     function WriteField(aAttr: TIDLAttributeDefinition): Boolean; override;
     function WritePrivateReadOnlyField(aAttr: TIDLAttributeDefinition): Boolean; virtual;
-    function WriteReadonlyProperty(aAttr: TIDLAttributeDefinition): Boolean; virtual;
+    function WriteReadonlyProperty(aParent: TIDLDefinition; aAttr: TIDLAttributeDefinition): Boolean; virtual;
   Public
     constructor Create(TheOwner: TComponent); override;
     Property Pas2jsOptions: TPas2jsConversionOptions Read FPas2jsOptions Write FPas2jsOptions;
@@ -205,8 +205,8 @@ begin
   end;
 end;
 
-function TWebIDLToPas2js.WritePrivateReadOnlyFields(aList: TIDLDefinitionList
-  ): Integer;
+function TWebIDLToPas2js.WritePrivateReadOnlyFields(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 
 Var
   D: TIDLDefinition;
@@ -221,7 +221,8 @@ begin
           Inc(Result);
 end;
 
-function TWebIDLToPas2js.WriteProperties(aList: TIDLDefinitionList): Integer;
+function TWebIDLToPas2js.WriteProperties(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 Var
   D: TIDLDefinition;
   A: TIDLAttributeDefinition absolute D;
@@ -230,7 +231,7 @@ begin
   For D in aList do
     if (D is TIDLAttributeDefinition) then
       if (aoReadOnly in A.Options) then
-        if WriteReadOnlyProperty(A) then
+        if WriteReadOnlyProperty(aParent,A) then
           Inc(Result);
 end;
 
@@ -284,8 +285,8 @@ begin
   Result:=true;
 end;
 
-function TWebIDLToPas2js.WriteReadonlyProperty(aAttr: TIDLAttributeDefinition
-  ): Boolean;
+function TWebIDLToPas2js.WriteReadonlyProperty(aParent: TIDLDefinition;
+  aAttr: TIDLAttributeDefinition): Boolean;
 
 Var
   TN,N,PN: String;

+ 64 - 67
packages/webidl/src/webidltowasmjob.pp

@@ -58,9 +58,6 @@ const
 type
   TPasDataWasmJob = class(TPasData)
   public
-    GetterBody: String; // also used for Function body
-    SetterBody: String;
-    HasFuncBody: boolean;
   end;
 
   { TWebIDLToPasWasmJob }
@@ -70,6 +67,7 @@ type
     FPasInterfacePrefix: String;
     FPasInterfaceSuffix: String;
   Protected
+    FWritingPasInterface: boolean;
     function BaseUnits: String; override;
     // Auxiliary routines
     function GetPasClassName(const aName: string): string; overload; // convert to PasInterfacePrefix+X+FPasInterfaceSuffix
@@ -87,24 +85,24 @@ type
     function WriteOtherImplicitTypes(Intf: TIDLInterfaceDefinition; aMemberList: TIDLDefinitionList): Integer;
       override;
     // Code generation routines. Return the number of actually written defs.
-    function WritePrivateGetters(aList: TIDLDefinitionList): Integer; override;
-    function WritePrivateSetters(aList: TIDLDefinitionList): Integer; override;
-    function WriteProperties(aList: TIDLDefinitionList): Integer; override;
+    function WritePrivateGetters(aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer; override;
+    function WritePrivateSetters(aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer; override;
+    function WriteProperties(aParent: TIDLDefinition; aList: TIDLDefinitionList): Integer; override;
     function WriteUtilityMethods(Intf: TIDLInterfaceDefinition): Integer;
       override;
     // Definitions. Return true if a definition was written.
     function WriteEnumDef(aDef: TIDLEnumDefinition): Boolean; override;
-    function WriteDictionaryField(aField: TIDLDictionaryMemberDefinition
-      ): Boolean; override;
+    function WriteDictionaryField(aDict: TIDLDictionaryDefinition;
+      aField: TIDLDictionaryMemberDefinition): Boolean; override;
     function WriteForwardClassDef(D: TIDLStructuredDefinition): Boolean;
       override;
     function WriteFunctionDefinition(aDef: TIDLFunctionDefinition): Boolean;
       override;
     function WriteFunctionTypeDefinition(aDef: TIDLFunctionDefinition
       ): Boolean; override;
-    function WritePrivateGetter(Attr: TIDLAttributeDefinition): boolean; virtual;
-    function WritePrivateSetter(Attr: TIDLAttributeDefinition): boolean; virtual;
-    function WriteProperty(Attr: TIDLAttributeDefinition): boolean; virtual;
+    function WritePrivateGetter(aParent: TIDLStructuredDefinition; Attr: TIDLAttributeDefinition): boolean; virtual;
+    function WritePrivateSetter(aParent: TIDLStructuredDefinition; Attr: TIDLAttributeDefinition): boolean; virtual;
+    function WriteProperty(aParent: TIDLDefinition; Attr: TIDLAttributeDefinition): boolean; virtual;
     function WriteRecordDef(aDef: TIDLRecordDefinition): Boolean; override;
     procedure WriteSequenceDef(aDef: TIDLSequenceTypeDefDefinition); override;
   Public
@@ -297,71 +295,77 @@ var
 begin
   Result:=1;
 
-  // Pascal interface and ancestor
-  aPasIntfName:=GetPasIntfName(Intf);
+  FWritingPasInterface:=true;
+  try
 
-  Decl:=aPasIntfName+' = interface';
-  if Assigned(Intf.ParentInterface) then
-    ParentName:=GetPasIntfName(Intf.ParentInterface as TIDLInterfaceDefinition)
-  else
-    ParentName:=GetTypeName(Intf.ParentName);
-  if ParentName='' then
-    ParentName:=PasInterfacePrefix+'Object'+PasInterfaceSuffix;
-  if ParentName<>'' then
-    Decl:=Decl+'('+ParentName+')';
-  AddLn(Decl);
+    // Pascal interface and ancestor
+    aPasIntfName:=GetPasIntfName(Intf);
+
+    Decl:=aPasIntfName+' = interface';
+    if Assigned(Intf.ParentInterface) then
+      ParentName:=GetPasIntfName(Intf.ParentInterface as TIDLInterfaceDefinition)
+    else
+      ParentName:=GetTypeName(Intf.ParentName);
+    if ParentName='' then
+      ParentName:=PasInterfacePrefix+'Object'+PasInterfaceSuffix;
+    if ParentName<>'' then
+      Decl:=Decl+'('+ParentName+')';
+    AddLn(Decl);
 
-  Indent;
+    Indent;
 
-  // GUID
-  AddLn('['''+ComputeGUID(Decl,aMemberList)+''']');
+    // GUID
+    AddLn('['''+ComputeGUID(Decl,aMemberList)+''']');
 
-  // private members
-  WritePrivateGetters(aMemberList);
-  WritePrivateSetters(aMemberList);
+    // private members
+    WritePrivateGetters(Intf,aMemberList);
+    WritePrivateSetters(Intf,aMemberList);
 
-  // public members
-  WriteMethodDefs(aMemberList);
-  WriteProperties(aMemberList);
+    // public members
+    WriteMethodDefs(Intf,aMemberList);
+    WriteProperties(Intf,aMemberList);
 
-  Undent;
-  AddLn('end;');
-  AddLn('');
+    Undent;
+    AddLn('end;');
+    AddLn('');
+  finally
+    FWritingPasInterface:=false;
+  end;
 end;
 
-function TWebIDLToPasWasmJob.WritePrivateGetters(aList: TIDLDefinitionList
-  ): Integer;
+function TWebIDLToPasWasmJob.WritePrivateGetters(aParent: TIDLStructuredDefinition;
+  aList: TIDLDefinitionList): Integer;
 var
   D: TIDLDefinition;
 begin
   Result:=0;
   for D in aList do
     if D is TIDLAttributeDefinition then
-      if WritePrivateGetter(TIDLAttributeDefinition(D)) then
+      if WritePrivateGetter(aParent,TIDLAttributeDefinition(D)) then
         inc(Result);
 end;
 
-function TWebIDLToPasWasmJob.WritePrivateSetters(aList: TIDLDefinitionList
-  ): Integer;
+function TWebIDLToPasWasmJob.WritePrivateSetters(
+  aParent: TIDLStructuredDefinition; aList: TIDLDefinitionList): Integer;
 var
   D: TIDLDefinition;
 begin
   Result:=0;
   for D in aList do
     if D is TIDLAttributeDefinition then
-      if WritePrivateSetter(TIDLAttributeDefinition(D)) then
+      if WritePrivateSetter(aParent,TIDLAttributeDefinition(D)) then
         inc(Result);
 end;
 
-function TWebIDLToPasWasmJob.WriteProperties(aList: TIDLDefinitionList
-  ): Integer;
+function TWebIDLToPasWasmJob.WriteProperties(aParent: TIDLDefinition;
+  aList: TIDLDefinitionList): Integer;
 var
   D: TIDLDefinition;
 begin
   Result:=0;
   for D in aList do
     if D is TIDLAttributeDefinition then
-      if WriteProperty(TIDLAttributeDefinition(D)) then
+      if WriteProperty(aParent,TIDLAttributeDefinition(D)) then
         inc(Result);
 end;
 
@@ -388,10 +392,12 @@ begin
 end;
 
 function TWebIDLToPasWasmJob.WriteDictionaryField(
-  aField: TIDLDictionaryMemberDefinition): Boolean;
+  aDict: TIDLDictionaryDefinition; aField: TIDLDictionaryMemberDefinition
+  ): Boolean;
 var
   N, TN: String;
 begin
+  if aDict<>nil then ;
   Result:=True;
   N:=GetName(aField);
   TN:=GetTypeName(aField.MemberType);
@@ -506,7 +512,7 @@ begin
 
     end;
   aClassName:=GetName(aDef.Parent);
-  AddFuncBody:=not Data.HasFuncBody;
+  AddFuncBody:=not FWritingPasInterface;
 
   Overloads:=GetOverloads(ADef);
   try
@@ -609,7 +615,6 @@ begin
       end;
 
       end;
-    Data.HasFuncBody:=true;
   finally
     Overloads.Free;
   end;
@@ -621,7 +626,6 @@ var
   FuncName, ReturnTypeName, ResolvedReturnTypeName: String;
   ArgName, ArgTypeName, ArgResolvedTypename: String;
   VarSection, FetchArgs, Params, Call, Code, GetFunc: String;
-  Data: TPasDataWasmJob;
   Args: TIDLDefinitionList;
   ArgDef: TIDLArgumentDefinition;
   ArgNames: TStringList;
@@ -650,9 +654,7 @@ begin
   else
     AddLn(FuncName+' = function '+Params+': '+ReturnTypeName+' of object;');
 
-  Data:=TPasDataWasmJob(aDef.Data);
-  if Data.HasFuncBody then exit;
-  Data.HasFuncBody:=true;
+  if FWritingPasInterface then exit;
 
   ArgNames:=TStringList.Create;
   try
@@ -755,10 +757,9 @@ begin
   end;
 end;
 
-function TWebIDLToPasWasmJob.WritePrivateGetter(Attr: TIDLAttributeDefinition
-  ): boolean;
+function TWebIDLToPasWasmJob.WritePrivateGetter(
+  aParent: TIDLStructuredDefinition; Attr: TIDLAttributeDefinition): boolean;
 var
-  Data: TPasDataWasmJob;
   FuncName, aClassName, Code, ReadFuncName, Call,
     AttrTypeName, AttrResolvedTypeName, ObjClassName: String;
   AttrType: TIDLDefinition;
@@ -766,7 +767,6 @@ begin
   Result:=true;
   if Attr.AttributeType=nil then
     exit;
-  Data:=Attr.Data as TPasDataWasmJob;
 
   FuncName:=GetterPrefix+GetName(Attr);
   AttrType:=GetResolvedType(Attr.AttributeType,AttrTypeName,AttrResolvedTypeName);
@@ -780,9 +780,9 @@ begin
 
   AddLn('function '+FuncName+': '+AttrTypeName+';');
 
-  if Data.GetterBody<>'' then exit;
+  if FWritingPasInterface then exit;
 
-  aClassName:=GetName(Attr.Parent);
+  aClassName:=GetName(aParent);
   Call:='';
 
   case AttrResolvedTypeName of
@@ -815,23 +815,20 @@ begin
   Code:=Code+'  Result:='+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
 
-  Data.GetterBody:=Code;
   IncludeImplementationCode.Add(Code);
 end;
 
-function TWebIDLToPasWasmJob.WritePrivateSetter(Attr: TIDLAttributeDefinition
-  ): boolean;
+function TWebIDLToPasWasmJob.WritePrivateSetter(
+  aParent: TIDLStructuredDefinition; Attr: TIDLAttributeDefinition): boolean;
 var
   FuncName, aClassName, WriteFuncName, Code, Call,
     AttrTypeName, AttrResolvedTypeName: String;
-  Data: TPasDataWasmJob;
   AttrType: TIDLDefinition;
 begin
   if aoReadOnly in Attr.Options then
     exit(false);
   if Attr.AttributeType=nil then
     exit;
-  Data:=Attr.Data as TPasDataWasmJob;
 
   Result:=true;
   FuncName:=SetterPrefix+GetName(Attr);
@@ -845,9 +842,9 @@ begin
 
   AddLn('procedure '+FuncName+'(const aValue: '+AttrTypeName+');');
 
-  if Data.SetterBody<>'' then exit;
+  if FWritingPasInterface then exit;
 
-  aClassName:=GetName(Attr.Parent);
+  aClassName:=GetName(aParent);
   Call:='';
 
   case AttrResolvedTypeName of
@@ -877,16 +874,16 @@ begin
   Code:=Code+'  '+Call+';'+sLineBreak;
   Code:=Code+'end;'+sLineBreak;
 
-  Data.SetterBody:=Code;
   IncludeImplementationCode.Add(Code);
 end;
 
-function TWebIDLToPasWasmJob.WriteProperty(Attr: TIDLAttributeDefinition
-  ): boolean;
+function TWebIDLToPasWasmJob.WriteProperty(aParent: TIDLDefinition;
+  Attr: TIDLAttributeDefinition): boolean;
 var
   PropName, Code, AttrTypeName, AttrResolvedTypeName: String;
   AttrType: TIDLDefinition;
 begin
+  if aParent=nil then ;
   if Attr.AttributeType=nil then
     begin
     writeln('Note: skipping field "'+Attr.Name+'" without type at '+GetDefPos(Attr));