mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-22 12:09:22 +02:00
wasmjob: fixed pass literal string
This commit is contained in:
parent
b819dc02c7
commit
04ae910f3b
@ -164,6 +164,9 @@ type
|
||||
procedure TestFuncArgMethod_UnicodeString;
|
||||
procedure TestFuncArgMethod_Object;
|
||||
procedure TestFuncArgMethod_Variant;
|
||||
procedure TestFuncArgMethod_VariantNumber;
|
||||
procedure TestFuncArgMethod_VariantString;
|
||||
procedure TestFuncArgMethod_VariantObject;
|
||||
|
||||
// dictionaries
|
||||
|
||||
@ -220,8 +223,10 @@ function JOBCallTBirdCallVariant(const aMethod: TMethod; var H: TJOBCallbackHelp
|
||||
var
|
||||
v: Variant;
|
||||
begin
|
||||
writeln('JOBCallTBirdCallVariant START');
|
||||
v:=H.GetVariant;
|
||||
Result:=H.AllocVariant(TBirdCallVariant(aMethod)(v));
|
||||
writeln('JOBCallTBirdCallVariant END');
|
||||
end;
|
||||
|
||||
{ TApplication }
|
||||
@ -267,6 +272,15 @@ end;
|
||||
function TWasmApp.OnBirdCallVariant(const v: Variant): Variant;
|
||||
begin
|
||||
Result:=v;
|
||||
case VarType(v) of
|
||||
varEmpty: writeln('TWasmApp.OnBirdCallVariant Result=unassigned');
|
||||
varNull: writeln('TWasmApp.OnBirdCallVariant Result=Null');
|
||||
else
|
||||
if VarIsBool(v) or VarIsNumeric(v) or VarIsStr(v) then
|
||||
writeln('TWasmApp.OnBirdCallVariant Result=',v)
|
||||
else
|
||||
writeln('TWasmApp.OnBirdCallVariant VarType(v)=',VarType(v));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TWasmApp.Run;
|
||||
@ -298,6 +312,9 @@ begin
|
||||
TestFuncArgMethod_UnicodeString;
|
||||
TestFuncArgMethod_Object;
|
||||
TestFuncArgMethod_Variant;
|
||||
TestFuncArgMethod_VariantNumber;
|
||||
TestFuncArgMethod_VariantString;
|
||||
TestFuncArgMethod_VariantObject;
|
||||
end;
|
||||
|
||||
procedure TWasmApp.TestBooleanProperty;
|
||||
@ -806,20 +823,158 @@ procedure TWasmApp.TestFuncArgMethod_Variant;
|
||||
var
|
||||
v: Variant;
|
||||
begin
|
||||
Prefix:='TWasmApp.TestFuncArgMethod_Variant;';
|
||||
Bird.Name:='TestFuncArgMethod_Variant;';
|
||||
Prefix:='TWasmApp.TestFuncArgMethod_Variant';
|
||||
Bird.Name:='TestFuncArgMethod_Variant';
|
||||
|
||||
v:=Bird.EchoVariant(true,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(true,...) VarType',varBoolean,VarType(v));
|
||||
AssertEqual('Bird.EchoVariant(true,...)',true,v);
|
||||
|
||||
v:=Bird.EchoVariant(false,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(false,...) VarType',varBoolean,VarType(v));
|
||||
AssertEqual('Bird.EchoVariant(false,...)',false,v);
|
||||
|
||||
// v:=Bird.EchoVariant(Variants.Null,@OnBirdCallVariant);
|
||||
// AssertEqual('Bird.EchoVariant(Variants.Null,...)',Variants.Null,v);
|
||||
v:=Bird.EchoVariant(Variants.Null,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(Variants.Null,...) VarType',varNull,VarType(v));
|
||||
end;
|
||||
|
||||
procedure TWasmApp.TestFuncArgMethod_VariantNumber;
|
||||
var
|
||||
v: Variant;
|
||||
begin
|
||||
Prefix:='TWasmApp.TestFuncArgMethod_VariantNumber';
|
||||
Bird.Name:='TestFuncArgMethod_VariantNumber';
|
||||
|
||||
v:=Bird.EchoVariant(0.5,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(0.5,...) VarType',varDouble,VarType(v));
|
||||
AssertEqual('Bird.EchoVariant(0.5,...)',0.5,v);
|
||||
|
||||
v:=Bird.EchoVariant(NaN,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(NaN,...) VarType',varDouble,VarType(v));
|
||||
if not IsNan(v) then
|
||||
Fail('Bird.EchoVariant(NaN,...)');
|
||||
|
||||
v:=Bird.EchoVariant(Infinity,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(Infinity,...) VarType',varDouble,VarType(v));
|
||||
AssertEqual('Bird.EchoVariant(Infinity,...)',Infinity,v);
|
||||
|
||||
v:=Bird.EchoVariant(NegInfinity,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(NegInfinity,...) VarType',varDouble,VarType(v));
|
||||
AssertEqual('Bird.EchoVariant(NegInfinity,...)',NegInfinity,v);
|
||||
end;
|
||||
|
||||
procedure TWasmApp.TestFuncArgMethod_VariantString;
|
||||
var
|
||||
Value: Variant;
|
||||
us: UnicodeString;
|
||||
s, h: AnsiString;
|
||||
begin
|
||||
Prefix:='TWasmApp.TestFuncArgMethod_VariantString';
|
||||
Bird.Name:='TestFuncArgMethod_VariantString';
|
||||
|
||||
// literals
|
||||
Value:=Bird.EchoVariant('',@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant('''') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant('''')','',Value);
|
||||
|
||||
Value:=Bird.EchoVariant('a',@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(''a'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(''a'')','a',Value);
|
||||
|
||||
Value:=Bird.EchoVariant('abc',@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(''abc'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(''abc'')','abc',Value);
|
||||
|
||||
Value:=Bird.EchoVariant(#13,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(#13) VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(#13)',#13,Value);
|
||||
|
||||
Value:=Bird.EchoVariant('ä',@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(''ä'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(''ä'')','ä',Value);
|
||||
|
||||
Value:=Bird.EchoVariant('🎉',@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(''🎉'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(''🎉'')','🎉',Value);
|
||||
|
||||
// unicodestring
|
||||
us:='';
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:='''') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:='''')','',Value);
|
||||
|
||||
us:='a';
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:=''a'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:=''a'')','a',Value);
|
||||
|
||||
us:='abc';
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:=''abc'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:=''abc'')','abc',Value);
|
||||
|
||||
us:=#13;
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:=#13) VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:=#13)',#13,Value);
|
||||
|
||||
us:='ä';
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:=''ä'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:=''ä'')','ä',Value);
|
||||
|
||||
us:='🤯';
|
||||
Value:=Bird.EchoVariant(us,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(us:=''🤯'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqualUS('Bird.EchoVariant(us:=''🤯'')','🤯',Value);
|
||||
|
||||
// ansistring
|
||||
s:='';
|
||||
Value:=Bird.EchoVariant(s,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:='''') VarType',varOleStr,VarType(Value));
|
||||
AssertEqual('Bird.EchoVariant(s:='''')','',Value);
|
||||
|
||||
s:='a';
|
||||
Value:=Bird.EchoVariant(s,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:=''a'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqual('Bird.EchoVariant(s:=''a'')','a',Value);
|
||||
|
||||
s:='abc';
|
||||
Value:=Bird.EchoVariant(s,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:=''abc'') VarType',varOleStr,VarType(Value));
|
||||
AssertEqual('Bird.EchoVariant(s:=''abc'')','abc',Value);
|
||||
|
||||
s:=#13;
|
||||
Value:=Bird.EchoVariant(s,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:=#13) VarType',varOleStr,VarType(Value));
|
||||
AssertEqual('Bird.EchoVariant(s:=#13)',#13,Value);
|
||||
|
||||
s:='ä';
|
||||
Value:=Bird.EchoVariant(UTF8Decode(s),@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:=''ä'') VarType',varOleStr,VarType(Value));
|
||||
h:=UTF8Encode(Value);
|
||||
AssertEqual('Bird.EchoVariant(s:=''ä'')',s,h);
|
||||
|
||||
s:='🤯';
|
||||
Value:=Bird.EchoVariant(UTF8Decode(s),@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(s:=''🤯'') VarType',varOleStr,VarType(Value));
|
||||
h:=UTF8Encode(Value);
|
||||
AssertEqual('Bird.EchoVariant(s:=''🤯'')',s,h);
|
||||
end;
|
||||
|
||||
procedure TWasmApp.TestFuncArgMethod_VariantObject;
|
||||
var
|
||||
v: Variant;
|
||||
Bart: IJSBird;
|
||||
begin
|
||||
Prefix:='TWasmApp.TestFuncArgMethod_VariantObject';
|
||||
Bird.Name:='TestFuncArgMethod_VariantObject';
|
||||
|
||||
v:=Bird.EchoVariant(Bird,@OnBirdCallVariant);
|
||||
AssertEqual('Bird.EchoVariant(Bird,...) VarType',varUnknown,VarType(v));
|
||||
|
||||
Bart:=TJSBird.Cast(v);
|
||||
AssertEqual('Bird.EchoVariant(Bird)',Bird,Bart);
|
||||
end;
|
||||
|
||||
procedure TWasmApp.Fail(const Msg: string);
|
||||
|
@ -2593,6 +2593,7 @@ var
|
||||
us: UnicodeString;
|
||||
l: SizeInt;
|
||||
begin
|
||||
//writeln('AddUTF8String s="',s,'"');
|
||||
if s='' then
|
||||
begin
|
||||
AddUnicodeString(nil,0);
|
||||
@ -2705,6 +2706,7 @@ var
|
||||
begin
|
||||
v:=Args[Index].VVariant^;
|
||||
t:=VarType(v);
|
||||
writeln('AddVariant Index=',Index,' VarType=',t);
|
||||
case t of
|
||||
varEmpty:
|
||||
Prep(1,JOBArgUndefined);
|
||||
@ -3040,13 +3042,13 @@ function TJSObject.InvokeJSVariantResult(const aName: string;
|
||||
var
|
||||
Buf: array[0..7] of byte;
|
||||
p: PByte;
|
||||
aError: TJOBResult;
|
||||
r: TJOBResult;
|
||||
Obj: TJSObject;
|
||||
begin
|
||||
FillByte(Buf[0],length(Buf),0);
|
||||
p:=@Buf[0];
|
||||
aError:=InvokeJSOneResult(aName,Args,@__job_invoke_jsvalueresult,p,Invoke);
|
||||
case aError of
|
||||
r:=InvokeJSOneResult(aName,Args,@__job_invoke_jsvalueresult,p,Invoke);
|
||||
case r of
|
||||
JOBResult_Undefined:
|
||||
Result:=Variants.Unassigned;
|
||||
JOBResult_Null:
|
||||
@ -3065,7 +3067,7 @@ begin
|
||||
end;
|
||||
else
|
||||
VarClear(Result);
|
||||
InvokeJS_RaiseResultMismatchStr(aName,'jsvalue',JOBResult_Names[aError]);
|
||||
InvokeJS_RaiseResultMismatchStr(aName,'jsvalue',JOBResult_Names[r]);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -412,7 +412,7 @@ begin
|
||||
getModuleMemoryDataView().setFloat64(ResultP, double(JSResult), env.IsLittleEndian);
|
||||
JOBResult_String:
|
||||
begin
|
||||
FStringResult:=String(JSResult);
|
||||
FStringResult:=String(JSResult);
|
||||
getModuleMemoryDataView().setInt32(ResultP, length(FStringResult), env.IsLittleEndian);
|
||||
end;
|
||||
JOBResult_Function,
|
||||
@ -528,6 +528,7 @@ var
|
||||
begin
|
||||
Len:=ReadWasmNativeInt;
|
||||
aWords:=TJSUint16Array.New(View.buffer, p,Len);
|
||||
inc(p,Len*2);
|
||||
Result:=TypedArrayToString(aWords);
|
||||
end;
|
||||
|
||||
@ -558,7 +559,7 @@ var
|
||||
aType:=View.getUInt8(p);
|
||||
inc(p);
|
||||
if aType<>JOBArgUnicodeString then
|
||||
raise EJOBBridge.Create('dictionary name must be unicodestring, but was '+IntToStr(aType));
|
||||
raise EJOBBridge.Create('20220825000909: dictionary name must be unicodestring, but was '+IntToStr(aType));
|
||||
CurName:=ReadUnicodeString;
|
||||
TJSObject(Result)[CurName]:=ReadValue;
|
||||
end;
|
||||
@ -594,6 +595,7 @@ var
|
||||
Obj: TJSObject;
|
||||
begin
|
||||
aType:=View.getUInt8(p);
|
||||
//writeln('TJSObjectBridge.GetInvokeArguments.ReadValue aType=',aType,' p=',p);
|
||||
inc(p);
|
||||
case aType of
|
||||
JOBArgUndefined:
|
||||
@ -630,7 +632,7 @@ var
|
||||
ObjID:=ReadWasmNativeInt;
|
||||
Obj:=FindObject(ObjID);
|
||||
if Obj=nil then
|
||||
raise EJOBBridge.Create('invalid JSObject '+IntToStr(ObjID));
|
||||
raise EJOBBridge.Create('20220825000904: invalid JSObject '+IntToStr(ObjID));
|
||||
Result:=Obj;
|
||||
end;
|
||||
JOBArgMethod:
|
||||
@ -642,7 +644,7 @@ var
|
||||
JOBArgArrayOfDouble:
|
||||
Result:=ReadArgArrayOfDouble;
|
||||
else
|
||||
raise EJOBBridge.Create('unknown arg type '+IntToStr(aType));
|
||||
raise EJOBBridge.Create('20220825000852: unknown arg type '+IntToStr(aType));
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -652,6 +654,7 @@ var
|
||||
begin
|
||||
p:=ArgsP;
|
||||
Cnt:=View.getUInt8(p);
|
||||
//writeln('TJSObjectBridge.GetInvokeArguments Cnt=',Cnt);
|
||||
inc(p);
|
||||
for i:=0 to Cnt-1 do
|
||||
begin
|
||||
|
Loading…
Reference in New Issue
Block a user