diff --git a/packages/webidl/src/webidltopas.pp b/packages/webidl/src/webidltopas.pp index e1df801265..23f01407c6 100644 --- a/packages/webidl/src/webidltopas.pp +++ b/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+'; '; diff --git a/packages/webidl/src/webidltowasmjob.pp b/packages/webidl/src/webidltowasmjob.pp index 46ce9f2a8d..75c1dff20d 100644 --- a/packages/webidl/src/webidltowasmjob.pp +++ b/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;