From 83be8b0e13866cab1777ef1882d42c405d313dd0 Mon Sep 17 00:00:00 2001
From: Michael Van Canneyt <michael@freepascal.org>
Date: Thu, 13 Feb 2025 16:05:50 +0100
Subject: [PATCH] * IDs now generated by wasm

---
 packages/job/src/job_browser.pp | 52 +++++++++++++++++++++++++++++++--
 packages/job/src/job_shared.pp  |  1 +
 2 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/packages/job/src/job_browser.pp b/packages/job/src/job_browser.pp
index d31f128..ed6789b 100644
--- a/packages/job/src/job_browser.pp
+++ b/packages/job/src/job_browser.pp
@@ -87,6 +87,9 @@ Type
   Protected
     procedure RegisterGlobalObjects; virtual;
     procedure SetInstanceExports(const AValue: TWasiExports); override;
+    // IDs
+    function GetObjectID: TJOBObjectID;
+    procedure ReleaseJobID(aID: TJOBObjectID);
     function DecodeUTF16Buffer(Arr : TJSUint16Array) : String;
     function DecodeUTF8Buffer(Arr : TJSUint8Array) : String;
     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_ObjectResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; 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_ArrayStringResult(ObjId: TJOBObjectID; NameP, NameLen, Invoke, ArgsP, ResultP: NativeInt): TJOBResult; virtual;
     function ReleaseObject(ObjId: TJOBObjectID): TJOBResult; virtual;
@@ -296,6 +300,7 @@ begin
   aObject[JOBFn_InvokeJSValueResult]:=@Invoke_JSValueResult;
   aObject[JOBFn_InvokeArrayStringResult]:=@Invoke_ArrayStringResult;
   aObject[JOBFn_CreateObject]:=@Create_JSObject;
+  aObject[JOBFn_CreateObjectAt]:=@Create_JSObjectAt;
   aObject[JOBFn_SetMemFromArray]:=@SetMemFromArray;
   aObject[JOBFn_SetArrayFromMem]:=@SetArrayFromMem;
   aObject[JOBFn_DebugObject]:=@DebugObject;
@@ -645,8 +650,46 @@ begin
   Result:=TJSFunction(fn);
 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;
 
+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
   ObjName : String;
   Args: TJSValueDynArray;
@@ -672,7 +715,7 @@ begin
     begin
     fn:=GetObjectConstructor(ObjName);
     if not Assigned(fn) then
-      exit(0);
+      exit(JOBResult_None);
     if ArgsP=0 then
       JSResult:=NewObj(fn,nil)
     else
@@ -682,9 +725,12 @@ begin
       end;
     end;
   if not (jsTypeOf(JSResult)='object') then
-    Result:=0
+    Result:=JOBResult_None
   else
-    Result:=RegisterLocalObject(TJSObject(JSResult));
+    begin
+    RegisterLocalObjectAt(TJSObject(JSResult),aObjID);
+    Result:=JOBResult_Success;
+    end;
   {$IFDEF VerboseJOB}
   writeln('Create_JSObject ObjName="',ObjName,'" result: ',Result);
   {$ENDIF}
diff --git a/packages/job/src/job_shared.pp b/packages/job/src/job_shared.pp
index 3f6aa17..e5602cd 100644
--- a/packages/job/src/job_shared.pp
+++ b/packages/job/src/job_shared.pp
@@ -66,6 +66,7 @@ const
   JOBFn_ReleaseStringResult = 'release_stringresult';
   JOBFn_InvokeObjectResult = 'invoke_objectresult';
   JOBFn_CreateObject = 'create_object';
+  JOBFn_CreateObjectAt = 'create_object_at';
   JOBFn_ReleaseObject = 'release_object';
   JOBFn_InvokeJSValueResult = 'invoke_jsvalueresult';
   JOBFn_CallbackHandler = 'JOBCallback';