Browse Source

wasmjob: fixed pass literal string

mattias 3 years ago
parent
commit
04ae910f3b
3 changed files with 172 additions and 12 deletions
  1. 159 4
      demo/wasienv/dom/WasiDomTest1.lpr
  2. 6 4
      demo/wasienv/dom/job_js.pas
  3. 7 4
      packages/job/job_browser.pp

+ 159 - 4
demo/wasienv/dom/WasiDomTest1.lpr

@@ -164,6 +164,9 @@ type
     procedure TestFuncArgMethod_UnicodeString;
     procedure TestFuncArgMethod_UnicodeString;
     procedure TestFuncArgMethod_Object;
     procedure TestFuncArgMethod_Object;
     procedure TestFuncArgMethod_Variant;
     procedure TestFuncArgMethod_Variant;
+    procedure TestFuncArgMethod_VariantNumber;
+    procedure TestFuncArgMethod_VariantString;
+    procedure TestFuncArgMethod_VariantObject;
 
 
     // dictionaries
     // dictionaries
 
 
@@ -220,8 +223,10 @@ function JOBCallTBirdCallVariant(const aMethod: TMethod; var H: TJOBCallbackHelp
 var
 var
   v: Variant;
   v: Variant;
 begin
 begin
+  writeln('JOBCallTBirdCallVariant START');
   v:=H.GetVariant;
   v:=H.GetVariant;
   Result:=H.AllocVariant(TBirdCallVariant(aMethod)(v));
   Result:=H.AllocVariant(TBirdCallVariant(aMethod)(v));
+  writeln('JOBCallTBirdCallVariant END');
 end;
 end;
 
 
 { TApplication }
 { TApplication }
@@ -267,6 +272,15 @@ end;
 function TWasmApp.OnBirdCallVariant(const v: Variant): Variant;
 function TWasmApp.OnBirdCallVariant(const v: Variant): Variant;
 begin
 begin
   Result:=v;
   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;
 end;
 
 
 procedure TWasmApp.Run;
 procedure TWasmApp.Run;
@@ -298,6 +312,9 @@ begin
   TestFuncArgMethod_UnicodeString;
   TestFuncArgMethod_UnicodeString;
   TestFuncArgMethod_Object;
   TestFuncArgMethod_Object;
   TestFuncArgMethod_Variant;
   TestFuncArgMethod_Variant;
+  TestFuncArgMethod_VariantNumber;
+  TestFuncArgMethod_VariantString;
+  TestFuncArgMethod_VariantObject;
 end;
 end;
 
 
 procedure TWasmApp.TestBooleanProperty;
 procedure TWasmApp.TestBooleanProperty;
@@ -806,20 +823,158 @@ procedure TWasmApp.TestFuncArgMethod_Variant;
 var
 var
   v: Variant;
   v: Variant;
 begin
 begin
-  Prefix:='TWasmApp.TestFuncArgMethod_Variant;';
-  Bird.Name:='TestFuncArgMethod_Variant;';
+  Prefix:='TWasmApp.TestFuncArgMethod_Variant';
+  Bird.Name:='TestFuncArgMethod_Variant';
 
 
   v:=Bird.EchoVariant(true,@OnBirdCallVariant);
   v:=Bird.EchoVariant(true,@OnBirdCallVariant);
+  AssertEqual('Bird.EchoVariant(true,...) VarType',varBoolean,VarType(v));
   AssertEqual('Bird.EchoVariant(true,...)',true,v);
   AssertEqual('Bird.EchoVariant(true,...)',true,v);
 
 
   v:=Bird.EchoVariant(false,@OnBirdCallVariant);
   v:=Bird.EchoVariant(false,@OnBirdCallVariant);
+  AssertEqual('Bird.EchoVariant(false,...) VarType',varBoolean,VarType(v));
   AssertEqual('Bird.EchoVariant(false,...)',false,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);
   v:=Bird.EchoVariant(0.5,@OnBirdCallVariant);
+  AssertEqual('Bird.EchoVariant(0.5,...) VarType',varDouble,VarType(v));
   AssertEqual('Bird.EchoVariant(0.5,...)',0.5,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;
 end;
 
 
 procedure TWasmApp.Fail(const Msg: string);
 procedure TWasmApp.Fail(const Msg: string);

+ 6 - 4
demo/wasienv/dom/job_js.pas

@@ -2593,6 +2593,7 @@ var
     us: UnicodeString;
     us: UnicodeString;
     l: SizeInt;
     l: SizeInt;
   begin
   begin
+    //writeln('AddUTF8String s="',s,'"');
     if s='' then
     if s='' then
     begin
     begin
       AddUnicodeString(nil,0);
       AddUnicodeString(nil,0);
@@ -2705,6 +2706,7 @@ var
   begin
   begin
     v:=Args[Index].VVariant^;
     v:=Args[Index].VVariant^;
     t:=VarType(v);
     t:=VarType(v);
+    writeln('AddVariant Index=',Index,' VarType=',t);
     case t of
     case t of
     varEmpty:
     varEmpty:
       Prep(1,JOBArgUndefined);
       Prep(1,JOBArgUndefined);
@@ -3040,13 +3042,13 @@ function TJSObject.InvokeJSVariantResult(const aName: string;
 var
 var
   Buf: array[0..7] of byte;
   Buf: array[0..7] of byte;
   p: PByte;
   p: PByte;
-  aError: TJOBResult;
+  r: TJOBResult;
   Obj: TJSObject;
   Obj: TJSObject;
 begin
 begin
   FillByte(Buf[0],length(Buf),0);
   FillByte(Buf[0],length(Buf),0);
   p:=@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:
   JOBResult_Undefined:
     Result:=Variants.Unassigned;
     Result:=Variants.Unassigned;
   JOBResult_Null:
   JOBResult_Null:
@@ -3065,7 +3067,7 @@ begin
     end;
     end;
   else
   else
     VarClear(Result);
     VarClear(Result);
-    InvokeJS_RaiseResultMismatchStr(aName,'jsvalue',JOBResult_Names[aError]);
+    InvokeJS_RaiseResultMismatchStr(aName,'jsvalue',JOBResult_Names[r]);
   end;
   end;
 end;
 end;
 
 

+ 7 - 4
packages/job/job_browser.pp

@@ -412,7 +412,7 @@ begin
     getModuleMemoryDataView().setFloat64(ResultP, double(JSResult), env.IsLittleEndian);
     getModuleMemoryDataView().setFloat64(ResultP, double(JSResult), env.IsLittleEndian);
   JOBResult_String:
   JOBResult_String:
     begin
     begin
-      FStringResult:=String(JSResult);
+    FStringResult:=String(JSResult);
     getModuleMemoryDataView().setInt32(ResultP, length(FStringResult), env.IsLittleEndian);
     getModuleMemoryDataView().setInt32(ResultP, length(FStringResult), env.IsLittleEndian);
     end;
     end;
   JOBResult_Function,
   JOBResult_Function,
@@ -528,6 +528,7 @@ var
   begin
   begin
     Len:=ReadWasmNativeInt;
     Len:=ReadWasmNativeInt;
     aWords:=TJSUint16Array.New(View.buffer, p,Len);
     aWords:=TJSUint16Array.New(View.buffer, p,Len);
+    inc(p,Len*2);
     Result:=TypedArrayToString(aWords);
     Result:=TypedArrayToString(aWords);
   end;
   end;
 
 
@@ -558,7 +559,7 @@ var
       aType:=View.getUInt8(p);
       aType:=View.getUInt8(p);
       inc(p);
       inc(p);
       if aType<>JOBArgUnicodeString then
       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;
       CurName:=ReadUnicodeString;
       TJSObject(Result)[CurName]:=ReadValue;
       TJSObject(Result)[CurName]:=ReadValue;
     end;
     end;
@@ -594,6 +595,7 @@ var
     Obj: TJSObject;
     Obj: TJSObject;
   begin
   begin
     aType:=View.getUInt8(p);
     aType:=View.getUInt8(p);
+    //writeln('TJSObjectBridge.GetInvokeArguments.ReadValue aType=',aType,' p=',p);
     inc(p);
     inc(p);
     case aType of
     case aType of
     JOBArgUndefined:
     JOBArgUndefined:
@@ -630,7 +632,7 @@ var
         ObjID:=ReadWasmNativeInt;
         ObjID:=ReadWasmNativeInt;
         Obj:=FindObject(ObjID);
         Obj:=FindObject(ObjID);
         if Obj=nil then
         if Obj=nil then
-          raise EJOBBridge.Create('invalid JSObject '+IntToStr(ObjID));
+          raise EJOBBridge.Create('20220825000904: invalid JSObject '+IntToStr(ObjID));
         Result:=Obj;
         Result:=Obj;
       end;
       end;
     JOBArgMethod:
     JOBArgMethod:
@@ -642,7 +644,7 @@ var
     JOBArgArrayOfDouble:
     JOBArgArrayOfDouble:
       Result:=ReadArgArrayOfDouble;
       Result:=ReadArgArrayOfDouble;
     else
     else
-      raise EJOBBridge.Create('unknown arg type '+IntToStr(aType));
+      raise EJOBBridge.Create('20220825000852: unknown arg type '+IntToStr(aType));
     end;
     end;
   end;
   end;
 
 
@@ -652,6 +654,7 @@ var
 begin
 begin
   p:=ArgsP;
   p:=ArgsP;
   Cnt:=View.getUInt8(p);
   Cnt:=View.getUInt8(p);
+  //writeln('TJSObjectBridge.GetInvokeArguments Cnt=',Cnt);
   inc(p);
   inc(p);
   for i:=0 to Cnt-1 do
   for i:=0 to Cnt-1 do
   begin
   begin