101 lines
2.7 KiB
ObjectPascal
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.
|