Browse Source

webidl: wasmjob: fixed idlinterface arg

mattias 3 years ago
parent
commit
becbd5411c
2 changed files with 27 additions and 23 deletions
  1. 9 9
      packages/webidl/src/webidltopas.pp
  2. 18 14
      packages/webidl/src/webidltowasmjob.pp

+ 9 - 9
packages/webidl/src/webidltopas.pp

@@ -1119,23 +1119,23 @@ function TBaseWebIDLToPas.GetArguments(aList: TIDLDefinitionList;
   ForceBrackets: Boolean): String;
 
 Var
-  I, Def: TIDLDefinition;
+  I, ArgType: TIDLDefinition;
   Arg: TIDLArgumentDefinition absolute I;
-  ArgName, aTypeName: string;
+  ArgName, ArgTypeName, ArgResolvedTypeName: string;
 
 begin
   Result:='';
   For I in aList do
     begin
     ArgName:=GetName(Arg);
-    aTypeName:=GetTypeName(Arg.ArgumentType);
-    ArgName:=ArgName+': '+aTypeName;
-    Def:=FindGlobalDef(Arg.ArgumentType.TypeName);
+    ArgType:=GetResolvedType(Arg.ArgumentType,ArgTypeName,ArgResolvedTypeName);
+    ArgName:=ArgName+': '+ArgTypeName;
     //writeln('TBaseWebIDLToPas.GetArguments Arg="',ArgName,'" A.ArgumentType.TypeName=',Arg.ArgumentType.TypeName,' ',Def<>nil);
-    if (Def is TIDLFunctionDefinition)
-        or (Def is TIDLDictionaryDefinition)
-        or (Arg.ArgumentType.TypeName='sequence')
-        or SameText(aTypeName,'UnicodeString') then
+    if (ArgType is TIDLFunctionDefinition)
+        or (ArgType is TIDLDictionaryDefinition)
+        or (ArgType is TIDLSequenceTypeDefDefinition)
+        or (ArgResolvedTypeName='UnicodeString')
+        or (ArgResolvedTypeName='UTF8String') then
       ArgName:='const '+ArgName;
     if Result<>'' then
       Result:=Result+'; ';

+ 18 - 14
packages/webidl/src/webidltowasmjob.pp

@@ -78,6 +78,8 @@ type
     function GetTypeName(const aTypeName: String; ForTypeDef: Boolean=False
       ): String; override;
     function GetPasIntfName(Intf: TIDLDefinition): string;
+    function GetResolvedType(aDef: TIDLTypeDefDefinition; out aTypeName,
+      aResolvedTypename: string): TIDLDefinition; overload; override;
     function GetInterfaceDefHead(Intf: TIDLInterfaceDefinition): String;
       override;
     function GetDictionaryDefHead(const CurClassName: string;
@@ -267,6 +269,14 @@ begin
   Result:=GetPasClassName(Result);
 end;
 
+function TWebIDLToPasWasmJob.GetResolvedType(aDef: TIDLTypeDefDefinition; out
+  aTypeName, aResolvedTypename: string): TIDLDefinition;
+begin
+  Result:=inherited GetResolvedType(aDef, aTypeName, aResolvedTypename);
+  if Result is TIDLInterfaceDefinition then
+    aTypeName:=GetPasClassName(aTypeName);
+end;
+
 function TWebIDLToPasWasmJob.GetInterfaceDefHead(Intf: TIDLInterfaceDefinition
   ): String;
 var
@@ -502,10 +512,7 @@ begin
       if ReturnDef is TIDLSequenceTypeDefDefinition then
         InvokeClassName:=ClassPrefix+'Array'+ClassSuffix
       else if ReturnDef is TIDLInterfaceDefinition then
-        begin
-        InvokeClassName:=ReturnTypeName;
-        ReturnTypeName:=GetPasIntfName(ReturnDef);
-        end
+        InvokeClassName:=GetName(ReturnDef)
       else if ResolvedReturnTypeName=PasInterfacePrefix+'Object'+PasInterfaceSuffix then
         begin
         InvokeClassName:=ClassPrefix+'Object'+ClassSuffix;
@@ -572,17 +579,14 @@ begin
               writeln('Hint: TWebIDLToPasWasmJob.WriteFunctionDefinition sequence of ',ArgTypeName);
             raise EConvertError.Create('[20220725172246] not yet supported: passing an array of '+ArgTypeName+' as argument at '+GetDefPos(ArgDef));
             end
-          else
+          else if (ArgType is TIDLFunctionDefinition) and (foCallBack in TIDLFunctionDefinition(ArgType).Options) then
             begin
-            if (ArgType is TIDLFunctionDefinition) and (foCallBack in TIDLFunctionDefinition(ArgType).Options) then
-              begin
-              LocalName:=CreateLocal('m');
-              VarSection:=VarSection+'  '+LocalName+': '+JOB_JSValueTypeNames[jivkMethod]+';'+sLineBreak;
-              WrapperFn:='JOBCall'+GetName(TIDLFunctionDefinition(ArgType));
-              TryCode:=TryCode+'  '+LocalName+':='+JOB_JSValueTypeNames[jivkMethod]+'.Create(TMethod('+ArgName+'),@'+WrapperFn+');'+sLineBreak;
-              FinallyCode:=FinallyCode+'    '+LocalName+'.free;'+sLineBreak;
-              ArgName:=LocalName;
-              end;
+            LocalName:=CreateLocal('m');
+            VarSection:=VarSection+'  '+LocalName+': '+JOB_JSValueTypeNames[jivkMethod]+';'+sLineBreak;
+            WrapperFn:='JOBCall'+GetName(TIDLFunctionDefinition(ArgType));
+            TryCode:=TryCode+'  '+LocalName+':='+JOB_JSValueTypeNames[jivkMethod]+'.Create(TMethod('+ArgName+'),@'+WrapperFn+');'+sLineBreak;
+            FinallyCode:=FinallyCode+'    '+LocalName+'.free;'+sLineBreak;
+            ArgName:=LocalName;
             end;
           Args:=Args+ArgName;
           end;