refactor to have some global fns in JS

This commit is contained in:
Niko Matsakis 2012-05-24 10:51:29 -07:00
parent 6c5ed2e30d
commit adc6d3701d
5 changed files with 82 additions and 42 deletions

View file

@ -6,7 +6,9 @@
# 48000 # 48000
ETCDIR=$(dirname $0) ETCDIR=$(dirname $0)
INCDIR=${ETCDIR}/../mozjs/dist/include JSDIR=${ETCDIR}/../../build/src/mozjs/dist/
INCDIR=${JSDIR}/include
LIBDIR=${JSDIR}/lib
echo > jsdefine.c echo > jsdefine.c
echo '#include "jsapi.h"' >> jsdefine.c echo '#include "jsapi.h"' >> jsdefine.c
@ -17,5 +19,5 @@ echo ' "'"$1"'\n"', >> jsdefine.c
echo " $2);" >> jsdefine.c echo " $2);" >> jsdefine.c
echo '}' >> jsdefine.c echo '}' >> jsdefine.c
gcc -I ${INCDIR} jsdefine.c -o jsdefine.exe g++ -I ${INCDIR} jsdefine.c -o jsdefine.exe
./jsdefine.exe ./jsdefine.exe

View file

@ -63,8 +63,8 @@ fn content(to_layout: chan<layout::msg>) -> chan<msg> {
} }
result::ok(bytes) { result::ok(bytes) {
let cx = rt.cx(); let cx = rt.cx();
cx.new_global(jsglobal::global_class()).chain { |glob| cx.new_compartment(jsglobal::global_class).chain { |comp|
cx.evaluate_script(glob, bytes, filename, 1u) cx.evaluate_script(comp.global_obj, bytes, filename, 1u)
}; };
} }
} }

View file

@ -3,11 +3,11 @@ import jsapi::bindgen::*;
import ptr::{null, addr_of}; import ptr::{null, addr_of};
import result::{result, ok, err, extensions}; import result::{result, ok, err, extensions};
import libc::c_char; import libc::c_char;
import name_pool::{name_pool, methods};
export rt; export rt;
export methods; export methods;
export cx; export cx;
export named_class;
export jsobj; export jsobj;
const default_heapsize: u32 = 8_u32 * 1024_u32 * 1024_u32; const default_heapsize: u32 = 8_u32 * 1024_u32 * 1024_u32;
@ -18,9 +18,9 @@ fn result(n: JSBool) -> result<(),()> {
if n != ERR {ok(())} else {err(())} if n != ERR {ok(())} else {err(())}
} }
type named_class = @{ type named_functions = @{
name: str, names: [str],
jsclass: JSClass funcs: [JSFunctionSpec]
}; };
// ___________________________________________________________________________ // ___________________________________________________________________________
@ -58,14 +58,18 @@ impl methods for cx {
jsobj jsobj
} }
fn new_global(globcls: named_class) -> result<jsobj,()> { fn new_compartment(globclsfn: fn(name_pool) -> JSClass) -> result<compartment,()> {
let np = name_pool();
let globcls = @globclsfn(np);
let globobj = let globobj =
JS_NewCompartmentAndGlobalObject( JS_NewCompartmentAndGlobalObject(
self.ptr, self.ptr,
addr_of(globcls.jsclass), &*globcls as *JSClass,
null()); null());
result(JS_InitStandardClasses(self.ptr, globobj)).chain { |_ok| result(JS_InitStandardClasses(self.ptr, globobj)).chain { |_ok|
ok(self.rooted_obj(globobj)) ok({name_pool: np,
global_class: globcls,
global_obj: self.rooted_obj(globobj)})
} }
} }
@ -93,6 +97,15 @@ impl methods for cx {
} }
} }
// ___________________________________________________________________________
// compartment
type compartment = {
name_pool: name_pool,
global_class: @JSClass,
global_obj: jsobj
};
// ___________________________________________________________________________ // ___________________________________________________________________________
// objects // objects
@ -112,7 +125,7 @@ mod test {
let gc = jsglobal::global_class(); let gc = jsglobal::global_class();
cx.new_global(gc).chain { cx.new_global(gc).chain {
|glob| |glob|
str::as_bytes("x = 1;") { str::as_bytes("print(\"1\");") {
|bytes| |bytes|
cx.evaluate_script(glob, bytes, "test", 1u) cx.evaluate_script(glob, bytes, "test", 1u)
}; };

View file

@ -3,6 +3,8 @@
import jsapi::*; import jsapi::*;
import jsapi::bindgen::*; import jsapi::bindgen::*;
import ptr::null; import ptr::null;
import jsutil::*;
import name_pool::{name_pool, methods};
crust fn PropertyStub(++arg0: *JSContext, crust fn PropertyStub(++arg0: *JSContext,
++arg1: *JSObject, ++arg1: *JSObject,
@ -36,34 +38,55 @@ crust fn ConvertStub(++arg0: *JSContext,
JS_ConvertStub(arg0, arg1, arg2, arg3) JS_ConvertStub(arg0, arg1, arg2, arg3)
} }
fn global_class() -> js::named_class { fn global_class(np: name_pool) -> JSClass {
let name = "global"; {name: np.add("global"),
let c_str = str::as_c_str(name) { |bytes| bytes }; flags: 0x48000_u32,
@{name: name, // in theory, this should *move* the str in here.. addProperty: PropertyStub,
jsclass: {name: c_str, // ...and so this ptr ought to be valid. delProperty: PropertyStub,
flags: 0x48000_u32, getProperty: PropertyStub,
addProperty: PropertyStub, setProperty: StrictPropertyStub,
delProperty: PropertyStub, enumerate: EnumerateStub,
getProperty: PropertyStub, resolve: ResolveStub,
setProperty: StrictPropertyStub, convert: ConvertStub,
enumerate: EnumerateStub, finalize: null(),
resolve: ResolveStub, reserved0: null(),
convert: ConvertStub, checkAccess: null(),
finalize: null(), call: null(),
reserved0: null(), construct: null(),
checkAccess: null(), xdrObject: null(),
call: null(), hasInstance: null(),
construct: null(), trace: null(),
xdrObject: null(), reserved1: null(),
hasInstance: null(), reserved: (null(), null(), null(), null(), null(), // 05
trace: null(), null(), null(), null(), null(), null(), // 10
reserved1: null(), null(), null(), null(), null(), null(), // 15
reserved: (null(), null(), null(), null(), null(), // 05 null(), null(), null(), null(), null(), // 20
null(), null(), null(), null(), null(), // 10 null(), null(), null(), null(), null(), // 25
null(), null(), null(), null(), null(), // 15 null(), null(), null(), null(), null(), // 30
null(), null(), null(), null(), null(), // 20 null(), null(), null(), null(), null(), // 35
null(), null(), null(), null(), null(), // 25 null(), null(), null(), null(), null())} // 40
null(), null(), null(), null(), null(), // 30 }
null(), null(), null(), null(), null(), // 35
null(), null(), null(), null(), null())}} // 40 crust fn print(cx: *JSContext, argc: uintN, vp: *jsval) {
import io::writer_util;
unsafe {
let argv = JS_ARGV(cx, vp);
uint::range(0u, argc as uint) { |i|
let jsstr = JS_ValueToString(cx, argv[i]);
let bytes = JS_EncodeString(cx, jsstr);
let str = str::unsafe::from_c_str(bytes);
JS_free(cx, unsafe::reinterpret_cast(bytes));
io::stdout().write_str(str);
io::stdout().write_str("\n");
}
JS_SET_RVAL(cx, vp, JSVAL_NULL);
}
}
fn global_fns(np: name_pool) -> [JSFunctionSpec] {
[{name: np.add("print"),
call: print,
nargs: 0_u16,
flags: 0_u16}]
} }

View file

@ -68,6 +68,8 @@ mod util {
mod content { mod content {
mod js; mod js;
mod jsglobal; mod jsglobal;
mod jsutil;
mod name_pool;
} }
mod opts; mod opts;