wasmjob: variant object

This commit is contained in:
mattias 2022-08-21 20:18:42 +02:00
parent adb0ba7ad7
commit c74fcb363a
3 changed files with 166 additions and 30 deletions

View File

@ -53,6 +53,7 @@ type
TJSBird = class(TJSObject,IJSBird) TJSBird = class(TJSObject,IJSBird)
private private
public public
class function Cast(Intf: IJSObject): IJSBird; overload;
// functions // functions
procedure IncSize; procedure IncSize;
function CreateBird(const aName: string): IJSBird; function CreateBird(const aName: string): IJSBird;
@ -121,22 +122,19 @@ type
procedure TestFuncResultUTF8String; procedure TestFuncResultUTF8String;
procedure TestFuncResultObject; procedure TestFuncResultObject;
procedure TestFuncResultVariant; procedure TestFuncResultVariant;
procedure TestFuncResultVariantNumbers; procedure TestFuncResultVariantNumber;
procedure TestFuncResultVariantStrings; procedure TestFuncResultVariantStrings;
procedure TestFuncResultVariantObject;
// function args // function args
// todo procedure TestFuncArgBoolean;
// todo procedure TestFuncArgInteger;
// todo procedure TestFuncArgDouble;
// todo procedure TestFuncArgUnicodeString;
// todo procedure TestFuncArgUTF8String;
// todo procedure TestFuncArgBird;
// todo procedure TestFuncArgMethod; // todo procedure TestFuncArgMethod;
// todo procedure TestFuncArgVariant;
// dictionaries // dictionaries
// arrays // arrays
// todo: TestFuncResultVariantArray
// todo: TestFuncResultDoubleArray
// todo: TestFuncResultUnicodeStringArray
end; end;
@ -160,6 +158,9 @@ var
begin begin
Bird:=TJSBird.JOBCreateGlobal('Bird') as IJSBird; Bird:=TJSBird.JOBCreateGlobal('Bird') as IJSBird;
TestFuncResultVariantObject;
exit;
TestBooleanProperty; TestBooleanProperty;
TestIntegerProperty; TestIntegerProperty;
TestDoubleProperty; TestDoubleProperty;
@ -175,8 +176,9 @@ begin
TestFuncResultUTF8String; TestFuncResultUTF8String;
TestFuncResultObject; TestFuncResultObject;
TestFuncResultVariant; TestFuncResultVariant;
TestFuncResultVariantNumbers; TestFuncResultVariantNumber;
TestFuncResultVariantStrings; TestFuncResultVariantStrings;
TestFuncResultVariantObject;
exit; exit;
@ -388,11 +390,10 @@ begin
Prefix:='TWasmApp.TestFuncResultVariant'; Prefix:='TWasmApp.TestFuncResultVariant';
Bird.Name:='TestFuncResultVariant'; Bird.Name:='TestFuncResultVariant';
Value:=Bird.Echo(nil); Value:=Bird.Echo(Variants.Null);
AssertEqual('Bird.Echo(nil) VarType',varOleStr,VarType(Value)); AssertEqual('Bird.Echo(Variant.Null) VarType',varNull,VarType(Value));
//ToDo: add a simple widestringmanager if Value<>Variants.Null then
//if Value<>nil then Fail('Bird.Echo(Variant.Null)');
// Fail('Bird.Echo(nil)');
Value:=Bird.Echo(true); Value:=Bird.Echo(true);
AssertEqual('Bird.Echo(true) VarType',varBoolean,VarType(Value)); AssertEqual('Bird.Echo(true) VarType',varBoolean,VarType(Value));
@ -403,12 +404,12 @@ begin
AssertEqual('Bird.Echo(false)',false,Value); AssertEqual('Bird.Echo(false)',false,Value);
end; end;
procedure TWasmApp.TestFuncResultVariantNumbers; procedure TWasmApp.TestFuncResultVariantNumber;
var var
Value: Variant; Value: Variant;
begin begin
Prefix:='TWasmApp.TestFuncResultVariantNumbers'; Prefix:='TWasmApp.TestFuncResultVariantNumber';
Bird.Name:='TestFuncResultVariantNumbers'; Bird.Name:='TestFuncResultVariantNumber';
Value:=Bird.Echo(0); Value:=Bird.Echo(0);
AssertEqual('Bird.Echo(0) VarType',varDouble,VarType(Value)); AssertEqual('Bird.Echo(0) VarType',varDouble,VarType(Value));
@ -458,24 +459,130 @@ begin
Value:=Bird.Echo(NegInfinity); Value:=Bird.Echo(NegInfinity);
AssertEqual('Bird.Echo(NegInfinity) VarType',varDouble,VarType(Value)); AssertEqual('Bird.Echo(NegInfinity) VarType',varDouble,VarType(Value));
AssertEqual('Bird.Echo(NegInfinity)',double(NegInfinity),Value); AssertEqual('Bird.Echo(NegInfinity)',double(NegInfinity),Value);
Value:=Bird.Echo(0.3);
AssertEqual('Bird.Echo(0.3) VarType',varDouble,VarType(Value));
AssertEqual('Bird.Echo(0.3)',double(0.3),Value);
end; end;
procedure TWasmApp.TestFuncResultVariantStrings; procedure TWasmApp.TestFuncResultVariantStrings;
var var
Value: Variant; Value: Variant;
us: UnicodeString;
s, h: string;
begin begin
Prefix:='TWasmApp.TestFuncResultVariantStrings'; Prefix:='TWasmApp.TestFuncResultVariantString';
Bird.Name:='TestFuncResultVariantStrings'; Bird.Name:='TestFuncResultVariantString';
// literals // literals
//Value:=Bird.Echo(''); Value:=Bird.Echo('');
//AssertEqual('Bird.Echo(0) VarType',varDouble,VarType(Value)); AssertEqual('Bird.Echo('''') VarType',varOleStr,VarType(Value));
//AssertEqual('Bird.Echo(0)',0,Value); AssertEqualUS('Bird.Echo('''')','',Value);
Value:=Bird.Echo('a');
AssertEqual('Bird.Echo(''a'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(''a'')','a',Value);
Value:=Bird.Echo('abc');
AssertEqual('Bird.Echo(''abc'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(''abc'')','abc',Value);
Value:=Bird.Echo(#13);
AssertEqual('Bird.Echo(#13) VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(#13)',#13,Value);
Value:=Bird.Echo('ä');
AssertEqual('Bird.Echo(''ä'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(''ä'')','ä',Value);
Value:=Bird.Echo('🎉');
AssertEqual('Bird.Echo(''🎉'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(''🎉'')','🎉',Value);
// unicodestring // unicodestring
us:='';
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:='''') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:='''')','',Value);
us:='a';
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:=''a'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:=''a'')','a',Value);
us:='abc';
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:=''abc'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:=''abc'')','abc',Value);
us:=#13;
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:=#13) VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:=#13)',#13,Value);
us:='ä';
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:=''ä'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:=''ä'')','ä',Value);
us:='🤯';
Value:=Bird.Echo(us);
AssertEqual('Bird.Echo(us:=''🤯'') VarType',varOleStr,VarType(Value));
AssertEqualUS('Bird.Echo(us:=''🤯'')','🤯',Value);
// ansistring // ansistring
s:='';
Value:=Bird.Echo(s);
AssertEqual('Bird.Echo(s:='''') VarType',varOleStr,VarType(Value));
AssertEqual('Bird.Echo(s:='''')','',Value);
s:='a';
Value:=Bird.Echo(s);
AssertEqual('Bird.Echo(s:=''a'') VarType',varOleStr,VarType(Value));
AssertEqual('Bird.Echo(s:=''a'')','a',Value);
s:='abc';
Value:=Bird.Echo(s);
AssertEqual('Bird.Echo(s:=''abc'') VarType',varOleStr,VarType(Value));
AssertEqual('Bird.Echo(s:=''abc'')','abc',Value);
s:=#13;
Value:=Bird.Echo(s);
AssertEqual('Bird.Echo(s:=#13) VarType',varOleStr,VarType(Value));
AssertEqual('Bird.Echo(s:=#13)',#13,Value);
s:='ä';
Value:=Bird.Echo(UTF8Decode(s));
AssertEqual('Bird.Echo(s:=''ä'') VarType',varOleStr,VarType(Value));
h:=UTF8Encode(Value);
AssertEqual('Bird.Echo(s:=''ä'')',s,h);
s:='🤯';
Value:=Bird.Echo(UTF8Decode(s));
AssertEqual('Bird.Echo(s:=''🤯'') VarType',varOleStr,VarType(Value));
h:=UTF8Encode(Value);
AssertEqual('Bird.Echo(s:=''🤯'')',s,h);
end;
procedure TWasmApp.TestFuncResultVariantObject;
var
Value: Variant;
Lisa, Bart: IJSBird;
begin
Prefix:='TWasmApp.TestFuncResultVariantObject';
Bird.Name:='TestFuncResultVariantObject';
Lisa:=nil;
Value:=Bird.Echo(Lisa);
AssertEqual('Bird.Echo(Lisa:=nil) VarType',varNull,VarType(Value));
Lisa:=Bird.CreateBird('Lisa');
AssertEqual('Lisa','TestFuncResultVariantObject.Lisa',Lisa.Name);
Value:=Bird.Echo(Lisa);
AssertEqual('Bird.Echo(Lisa) VarType',varUnknown,VarType(Value));
Bart:=TJSBird.Cast(Value);
AssertEqual('Bird.Echo(Lisa)',Lisa,Bart);
end; end;
procedure TWasmApp.Fail(const Msg: string); procedure TWasmApp.Fail(const Msg: string);
@ -544,6 +651,11 @@ end;
{ TBird } { TBird }
class function TJSBird.Cast(Intf: IJSObject): IJSBird;
begin
Result:=TJSBird.JOBCast(Intf);
end;
procedure TJSBird.IncSize; procedure TJSBird.IncSize;
begin begin
InvokeJSNoResult('IncSize',[]); InvokeJSNoResult('IncSize',[]);

View File

@ -323,6 +323,7 @@ type
function ReadJSPropertyLongInt(const aName: string): LongInt; virtual; function ReadJSPropertyLongInt(const aName: string): LongInt; virtual;
function ReadJSPropertyInt64(const aName: string): Int64; virtual; function ReadJSPropertyInt64(const aName: string): Int64; virtual;
function ReadJSPropertyValue(const aName: string): TJOB_JSValue; virtual; function ReadJSPropertyValue(const aName: string): TJOB_JSValue; virtual;
function ReadJSPropertyVariant(const aName: string): Variant; virtual;
// write a property // write a property
procedure WriteJSPropertyBoolean(const aName: string; Value: Boolean); virtual; procedure WriteJSPropertyBoolean(const aName: string; Value: Boolean); virtual;
procedure WriteJSPropertyDouble(const aName: string; Value: Double); virtual; procedure WriteJSPropertyDouble(const aName: string; Value: Double); virtual;
@ -332,6 +333,7 @@ type
procedure WriteJSPropertyLongInt(const aName: string; Value: LongInt); virtual; procedure WriteJSPropertyLongInt(const aName: string; Value: LongInt); virtual;
procedure WriteJSPropertyInt64(const aName: string; Value: Int64); virtual; procedure WriteJSPropertyInt64(const aName: string; Value: Int64); virtual;
procedure WriteJSPropertyValue(const aName: string; Value: TJOB_JSValue); virtual; procedure WriteJSPropertyValue(const aName: string; Value: TJOB_JSValue); virtual;
procedure WriteJSPropertyVariant(const aName: string; const Value: Variant); virtual;
// create a new object using the new-operator // create a new object using the new-operator
function NewJSObject(Const Args: Array of const; aResultClass: TJSObjectClass): TJSObject; virtual; function NewJSObject(Const Args: Array of const; aResultClass: TJSObjectClass): TJSObject; virtual;
// JS members // JS members
@ -2592,6 +2594,8 @@ var
var var
v: Variant; v: Variant;
t: tvartype; t: tvartype;
us: UnicodeString;
Intf: IJSObject;
begin begin
v:=Args[Index].VVariant^; v:=Args[Index].VVariant^;
t:=VarType(v); t:=VarType(v);
@ -2606,16 +2610,25 @@ var
AddDouble(v); AddDouble(v);
varOleStr: varOleStr:
begin begin
if tvardata(v).volestr=nil then us:=v;
Prep(1,JOBArgNil) AddUnicodeString(us);
else
raise EJSInvoke.Create('Invoke js: [20220820185118] unsupported variant: '+IntToStr(t));
end; end;
varBoolean: varBoolean:
if v then if v then
Prep(1,JOBArgTrue) Prep(1,JOBArgTrue)
else else
Prep(1,JOBArgFalse); Prep(1,JOBArgFalse);
varString:
AddUTF8String(v);
varUnknown:
begin
if tvardata(v).vunknown=nil then
Prep(1,JOBArgNil)
else if VarSupports(v,IJSObject,Intf) then
AddObjectID(Intf.GetJSObjectID)
else
raise EJSInvoke.Create('Invoke js: [20220820210022] unsupported variant: '+IntToStr(t));
end
else else
raise EJSInvoke.Create('Invoke js: [20220820185131] unsupported variant: '+IntToStr(t)); raise EJSInvoke.Create('Invoke js: [20220820185131] unsupported variant: '+IntToStr(t));
end; end;
@ -2929,7 +2942,7 @@ begin
JOBResult_Undefined: JOBResult_Undefined:
Result:=Variants.Unassigned; Result:=Variants.Unassigned;
JOBResult_Null: JOBResult_Null:
Result:=nil; Result:=Variants.Null;
JOBResult_Boolean: JOBResult_Boolean:
Result:=p^<>0; Result:=p^<>0;
JOBResult_Double: JOBResult_Double:
@ -3043,6 +3056,11 @@ begin
Result:=InvokeJSValueResult(aName,[],jiGet); Result:=InvokeJSValueResult(aName,[],jiGet);
end; end;
function TJSObject.ReadJSPropertyVariant(const aName: string): Variant;
begin
Result:=InvokeJSVariantResult(aName,[],jiGet);
end;
procedure TJSObject.WriteJSPropertyBoolean(const aName: string; Value: Boolean); procedure TJSObject.WriteJSPropertyBoolean(const aName: string; Value: Boolean);
begin begin
InvokeJSNoResult(aName,[Value],jiSet); InvokeJSNoResult(aName,[Value],jiSet);
@ -3087,6 +3105,12 @@ begin
InvokeJSNoResult(aName,[Value],jiSet); InvokeJSNoResult(aName,[Value],jiSet);
end; end;
procedure TJSObject.WriteJSPropertyVariant(const aName: string;
const Value: Variant);
begin
InvokeJSNoResult(aName,[Value],jiSet);
end;
function TJSObject.NewJSObject(const Args: array of const; function TJSObject.NewJSObject(const Args: array of const;
aResultClass: TJSObjectClass): TJSObject; aResultClass: TJSObjectClass): TJSObject;
begin begin

View File

@ -385,18 +385,18 @@ var
NewId: TJOBObjectID; NewId: TJOBObjectID;
begin begin
{$IFDEF VerboseJOB} {$IFDEF VerboseJOB}
writeln('TJOBBridge.Invoke_JSValueResult START'); writeln('TJSObjectBridge.Invoke_JSValueResult START');
{$ENDIF} {$ENDIF}
// invoke // invoke
Result:=Invoke_JSResult(ObjId,NameP,NameLen,Invoke,ArgsP,JSResult); Result:=Invoke_JSResult(ObjId,NameP,NameLen,Invoke,ArgsP,JSResult);
{$IFDEF VerboseJOB} {$IFDEF VerboseJOB}
writeln('TJOBBridge.Invoke_JSValueResult JSResult=',JSResult); writeln('TJSObjectBridge.Invoke_JSValueResult JSResult=',JSResult);
{$ENDIF} {$ENDIF}
if Result<>JOBResult_Success then if Result<>JOBResult_Success then
exit; exit;
Result:=GetJOBResult(JSResult); Result:=GetJOBResult(JSResult);
{$IFDEF VerboseJOB} {$IFDEF VerboseJOB}
writeln('TJOBBridge.Invoke_JSValueResult Type=',Result); writeln('TJSObjectBridge.Invoke_JSValueResult Type=',Result);
{$ENDIF} {$ENDIF}
// set result // set result
case Result of case Result of