xtool/contrib/mORMot/SyNode/Samples/03 - HelloSpiderMonkey52/HelloSpiderMonkey52.lpr

101 lines
2.7 KiB
ObjectPascal

program HelloSpiderMonkey52;
{
This example has translated from C++ hello world example taken on
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/How_to_embed_the_JavaScript_engine
}
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
SysUtils,
SpiderMonkey;
const
script = '''Hello '' + ''world, it is ''+new Date()';
filename = 'noname';
var
global_ops: JSClassOps = (
addProperty: nil;
delProperty: nil;
getProperty: nil;
setProperty: nil;
enumerate: nil;
resolve: nil;
mayResolve: nil;
finalize: nil;
call: nil;
hasInstance: nil;
construct: nil;
trace: nil;//@JS_GlobalObjectTraceHook;
);
// The class of the global object.
global_class: JSClass = (
name: 'global';
flags: JSCLASS_GLOBAL_FLAGS;
cOps: @global_ops;
);
cx: PJSContext;
options: JS_CompartmentOptions;
global: PJSRootedObject;
val: jsval;
rval: PJSRootedValue;
oldCprt: PJSCompartment;
lineno: Integer = 1;
opts: PJSCompileOptions;
ok: Boolean;
str: PJSString;
I: Integer;
Frames: PPointer;
begin
try
JS_Init();
cx := JSContext.CreateNew(8 * 1024 * 1024);
try
cx^.BeginRequest(); // In practice, you would want to exit this any
try // time you're spinning the event loop
// Scope for our various stack objects (JSAutoRequest, RootedObject), so they all go
// out of scope before we JS_DestroyContext.
global := cx^.NewRootedObject(cx^.NewGlobalObject(@global_class));
if (global = nil) then
Halt(1);
rval := cx^.NewRootedValue(val);
oldCprt := cx^.EnterCompartment(global^.ptr);
try // Scope for JSAutoCompartment
cx^.InitStandardClasses(global^.ptr);
opts := cx^.NewCompileOptions();
opts^.filename := filename;
//opts^.?? := lineno;
ok := cx^.EvaluateScript(opts, script, Length(script), rval^.ptr);
if (not ok) then
Halt(1);
finally
cx^.LeaveCompartment(oldCprt);
end;
str := rval^.ptr.asJSString;
WriteLn(str^.ToAnsi(cx));
finally
cx^.EndRequest();
end;
finally
cx^.Destroy();
JS_ShutDown();
end;
Halt(0);
except
on E: Exception do begin
Writeln(E.Message);
Writeln(BackTraceStrFunc(ExceptAddr));
Frames := ExceptFrames;
for I := 0 to ExceptFrameCount - 1 do
Writeln(BackTraceStrFunc(Frames[I]));
end;
end;
end.