webidl: wasmjob: fixed idlinterface arg

This commit is contained in:
mattias 2022-07-27 23:56:55 +02:00
parent c9947b4ee6
commit becbd5411c
2 changed files with 27 additions and 23 deletions

View File

@ -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+'; ';

View File

@ -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;