Browse Source

webidl: wasmjob: create unique local var

mattias 3 years ago
parent
commit
c50ef1efcf
1 changed files with 62 additions and 43 deletions
  1. 62 43
      packages/webidl/src/webidltowasmjob.pp

+ 62 - 43
packages/webidl/src/webidltowasmjob.pp

@@ -331,10 +331,21 @@ end;
 
 
 function TWebIDLToPasWasmJob.WriteFunctionDefinition(
 function TWebIDLToPasWasmJob.WriteFunctionDefinition(
   aDef: TIDLFunctionDefinition): Boolean;
   aDef: TIDLFunctionDefinition): Boolean;
+var
+  ArgNames: TStringList;
 
 
   function CreateLocal(aName: string): string;
   function CreateLocal(aName: string): string;
+  var
+    i: Integer;
   begin
   begin
     Result:=aName;
     Result:=aName;
+    if ArgNames.IndexOf(Result)>=0 then
+      begin
+      i:=2;
+      while ArgNames.IndexOf(Result+IntToStr(i))>=0 do inc(i);
+      Result:=Result+IntToStr(i);
+      end;
+    ArgNames.Add(Result);
   end;
   end;
 
 
 Var
 Var
@@ -415,54 +426,62 @@ begin
 
 
       if not AddFuncBody then continue;
       if not AddFuncBody then continue;
 
 
-      InvokeCode:='';
-      if RT<>'' then
-        InvokeCode:='Result:=';
-      VarSection:='';
-      TryCode:='';
-      FinallyCode:='';
-      Args:='';
-      for CurDef in ArgDefList do
-        begin
-        if Args<>'' then
-          Args:=Args+',';
-        ArgName:=GetName(ArgDef);
-        ArgType:=FindGlobalDef(ArgDef.ArgumentType.TypeName);
-        if (ArgType is TIDLFunctionDefinition) and (foCallBack in TIDLFunctionDefinition(ArgType).Options) then
+      ArgNames:=TStringList.Create;
+      try
+        for CurDef in ArgDefList do
+          ArgNames.Add(GetName(ArgDef));
+
+        InvokeCode:='';
+        if RT<>'' then
+          InvokeCode:='Result:=';
+        VarSection:='';
+        TryCode:='';
+        FinallyCode:='';
+        Args:='';
+        for CurDef in ArgDefList do
           begin
           begin
-          LocalName:=CreateLocal('m');
-          VarSection:=VarSection+'  '+LocalName+': TJOB_JSValueMethod;'+sLineBreak;
-          WrapperFn:='JOBCall'+GetName(TIDLFunctionDefinition(ArgType));
-          TryCode:=TryCode+'  '+LocalName+':=TJOB_JSValueMethod.Create(TMethod('+ArgName+'),@'+WrapperFn+');'+sLineBreak;
-          FinallyCode:=FinallyCode+'    '+LocalName+'.free;'+sLineBreak;
-          ArgName:=LocalName;
+          if Args<>'' then
+            Args:=Args+',';
+          ArgName:=GetName(ArgDef);
+          ArgType:=FindGlobalDef(ArgDef.ArgumentType.TypeName);
+          if (ArgType is TIDLFunctionDefinition) and (foCallBack in TIDLFunctionDefinition(ArgType).Options) then
+            begin
+            LocalName:=CreateLocal('m');
+            VarSection:=VarSection+'  '+LocalName+': TJOB_JSValueMethod;'+sLineBreak;
+            WrapperFn:='JOBCall'+GetName(TIDLFunctionDefinition(ArgType));
+            TryCode:=TryCode+'  '+LocalName+':=TJOB_JSValueMethod.Create(TMethod('+ArgName+'),@'+WrapperFn+');'+sLineBreak;
+            FinallyCode:=FinallyCode+'    '+LocalName+'.free;'+sLineBreak;
+            ArgName:=LocalName;
+            end;
+          Args:=Args+ArgName;
           end;
           end;
-        Args:=Args+ArgName;
-        end;
-      Args:=',['+Args+']';
+        Args:=',['+Args+']';
 
 
-      InvokeCode:=InvokeCode+InvokeName+'('''+aDef.Name+''''+Args+')';
+        InvokeCode:=InvokeCode+InvokeName+'('''+aDef.Name+''''+Args+')';
 
 
-      Code:=ProcKind+' '+aClassName+'.'+Sig+sLineBreak;
-      if VarSection<>'' then
-        Code:=Code+'var'+sLineBreak+VarSection;
-      Code:=Code+'begin'+sLineBreak;
-      if TryCode<>'' then
-        begin
-        Code:=Code+TryCode;
-        Code:=Code+'  try'+sLineBreak;
-        Code:=Code+'    '+InvokeCode+';'+sLineBreak;
-        Code:=Code+'  finally'+sLineBreak;
-        Code:=Code+FinallyCode;
-        Code:=Code+'  end;'+sLineBreak;
-        end
-      else
-        begin
-        Code:=Code+'  '+InvokeCode+';'+sLineBreak;
-        end;
-      Code:=Code+'end;'+sLineBreak;
+        Code:=ProcKind+' '+aClassName+'.'+Sig+sLineBreak;
+        if VarSection<>'' then
+          Code:=Code+'var'+sLineBreak+VarSection;
+        Code:=Code+'begin'+sLineBreak;
+        if TryCode<>'' then
+          begin
+          Code:=Code+TryCode;
+          Code:=Code+'  try'+sLineBreak;
+          Code:=Code+'    '+InvokeCode+';'+sLineBreak;
+          Code:=Code+'  finally'+sLineBreak;
+          Code:=Code+FinallyCode;
+          Code:=Code+'  end;'+sLineBreak;
+          end
+        else
+          begin
+          Code:=Code+'  '+InvokeCode+';'+sLineBreak;
+          end;
+        Code:=Code+'end;'+sLineBreak;
 
 
-      IncludeImplementationCode.Add(Code);
+        IncludeImplementationCode.Add(Code);
+      finally
+        ArgNames.Free;
+      end;
 
 
       end;
       end;
     Data.HasFuncBody:=true;
     Data.HasFuncBody:=true;