* IDs now generated by wasm

This commit is contained in:
Michael Van Canneyt 2025-02-13 16:05:50 +01:00
parent b2fd1f356f
commit 83be8b0e13
2 changed files with 50 additions and 3 deletions

View File

@ -87,6 +87,9 @@ Type
Protected Protected
procedure RegisterGlobalObjects; virtual; procedure RegisterGlobalObjects; virtual;
procedure SetInstanceExports(const AValue: TWasiExports); override; procedure SetInstanceExports(const AValue: TWasiExports); override;
// IDs
function GetObjectID: TJOBObjectID;
procedure ReleaseJobID(aID: TJOBObjectID);
function DecodeUTF16Buffer(Arr : TJSUint16Array) : String; function DecodeUTF16Buffer(Arr : TJSUint16Array) : String;
function DecodeUTF8Buffer(Arr : TJSUint8Array) : String; function DecodeUTF8Buffer(Arr : TJSUint8Array) : String;
function Invoke_JSResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP: NativeInt; out JSResult: JSValue): TJOBResult; virtual; function Invoke_JSResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP: NativeInt; out JSResult: JSValue): TJOBResult; virtual;
@ -101,6 +104,7 @@ Type
function Invoke_StringResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual; function Invoke_StringResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual;
function Invoke_ObjectResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual; function Invoke_ObjectResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual;
function Create_JSObject(NameP, NameLen,ArgsP : NativeInt): TJOBObjectID; virtual; function Create_JSObject(NameP, NameLen,ArgsP : NativeInt): TJOBObjectID; virtual;
function Create_JSObjectAt(NameP, NameLen,ArgsP : NativeInt; aObjID : TJOBObjectID): Longint; virtual;
function Invoke_JSValueResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual; function Invoke_JSValueResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual;
function Invoke_ArrayStringResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual; function Invoke_ArrayStringResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual;
function ReleaseObject(ObjId: TJOBObjectID): TJOBResult; virtual; function ReleaseObject(ObjId: TJOBObjectID): TJOBResult; virtual;
@ -296,6 +300,7 @@ begin
aObject[JOBFn_InvokeJSValueResult]:=@Invoke_JSValueResult; aObject[JOBFn_InvokeJSValueResult]:=@Invoke_JSValueResult;
aObject[JOBFn_InvokeArrayStringResult]:=@Invoke_ArrayStringResult; aObject[JOBFn_InvokeArrayStringResult]:=@Invoke_ArrayStringResult;
aObject[JOBFn_CreateObject]:=@Create_JSObject; aObject[JOBFn_CreateObject]:=@Create_JSObject;
aObject[JOBFn_CreateObjectAt]:=@Create_JSObjectAt;
aObject[JOBFn_SetMemFromArray]:=@SetMemFromArray; aObject[JOBFn_SetMemFromArray]:=@SetMemFromArray;
aObject[JOBFn_SetArrayFromMem]:=@SetArrayFromMem; aObject[JOBFn_SetArrayFromMem]:=@SetArrayFromMem;
aObject[JOBFn_DebugObject]:=@DebugObject; aObject[JOBFn_DebugObject]:=@DebugObject;
@ -645,8 +650,46 @@ begin
Result:=TJSFunction(fn); Result:=TJSFunction(fn);
end; end;
procedure TJSObjectBridge.ReleaseJobID(aID : TJOBObjectID);
Type
TReleaseObjectIDProc = procedure(aID : TJOBObjectID);
var
lProc : TReleaseObjectIDProc;
begin
lProc:=TReleaseObjectIDProc(InstanceExports.functions['AllocateJobObjectID']);
if Not assigned(lProc) then
Raise EJOBBridge.Create('No function to release job ID');
lProc(aID);
end;
function TJSObjectBridge.GetObjectID : TJOBObjectID;
Type
TAllocateObjectIDFunc = Function : TJOBObjectID;
var
lFunc : TAllocateObjectIDFunc;
begin
lFunc:=TAllocateObjectIDFunc(InstanceExports.functions['AllocateJobObjectID']);
if Not assigned(lFunc) then
Raise EJOBBridge.Create('No function to allocate job ID');
Result:=lFunc();
end;
function TJSObjectBridge.Create_JSObject(NameP, NameLen, ArgsP: NativeInt): TJOBObjectID; function TJSObjectBridge.Create_JSObject(NameP, NameLen, ArgsP: NativeInt): TJOBObjectID;
begin
Result:=GetObjectID;
if Create_JSObjectAt(NameP,NameLen,ArgsP,Result)<>JOBResult_Success then
Result:=0;
end;
function TJSObjectBridge.Create_JSObjectAt(NameP, NameLen, ArgsP: NativeInt; aObjID: TJOBObjectID): Longint;
var var
ObjName : String; ObjName : String;
Args: TJSValueDynArray; Args: TJSValueDynArray;
@ -672,7 +715,7 @@ begin
begin begin
fn:=GetObjectConstructor(ObjName); fn:=GetObjectConstructor(ObjName);
if not Assigned(fn) then if not Assigned(fn) then
exit(0); exit(JOBResult_None);
if ArgsP=0 then if ArgsP=0 then
JSResult:=NewObj(fn,nil) JSResult:=NewObj(fn,nil)
else else
@ -682,9 +725,12 @@ begin
end; end;
end; end;
if not (jsTypeOf(JSResult)='object') then if not (jsTypeOf(JSResult)='object') then
Result:=0 Result:=JOBResult_None
else else
Result:=RegisterLocalObject(TJSObject(JSResult)); begin
RegisterLocalObjectAt(TJSObject(JSResult),aObjID);
Result:=JOBResult_Success;
end;
{$IFDEF VerboseJOB} {$IFDEF VerboseJOB}
writeln('Create_JSObject ObjName="',ObjName,'" result: ',Result); writeln('Create_JSObject ObjName="',ObjName,'" result: ',Result);
{$ENDIF} {$ENDIF}

View File

@ -66,6 +66,7 @@ const
JOBFn_ReleaseStringResult = 'release_stringresult'; JOBFn_ReleaseStringResult = 'release_stringresult';
JOBFn_InvokeObjectResult = 'invoke_objectresult'; JOBFn_InvokeObjectResult = 'invoke_objectresult';
JOBFn_CreateObject = 'create_object'; JOBFn_CreateObject = 'create_object';
JOBFn_CreateObjectAt = 'create_object_at';
JOBFn_ReleaseObject = 'release_object'; JOBFn_ReleaseObject = 'release_object';
JOBFn_InvokeJSValueResult = 'invoke_jsvalueresult'; JOBFn_InvokeJSValueResult = 'invoke_jsvalueresult';
JOBFn_CallbackHandler = 'JOBCallback'; JOBFn_CallbackHandler = 'JOBCallback';