From adc6d3701d36c8ffcff0ac2bc3d8b3a310143b5f Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Thu, 24 May 2012 10:51:29 -0700 Subject: [PATCH] refactor to have some global fns in JS --- src/etc/jsdefine | 6 ++- src/servo/content.rs | 4 +- src/servo/content/js.rs | 29 ++++++++---- src/servo/content/jsglobal.rs | 83 ++++++++++++++++++++++------------- src/servo/servo.rc | 2 + 5 files changed, 82 insertions(+), 42 deletions(-) diff --git a/src/etc/jsdefine b/src/etc/jsdefine index c16febf9706..67419fc7653 100755 --- a/src/etc/jsdefine +++ b/src/etc/jsdefine @@ -6,7 +6,9 @@ # 48000 ETCDIR=$(dirname $0) -INCDIR=${ETCDIR}/../mozjs/dist/include +JSDIR=${ETCDIR}/../../build/src/mozjs/dist/ +INCDIR=${JSDIR}/include +LIBDIR=${JSDIR}/lib echo > jsdefine.c echo '#include "jsapi.h"' >> jsdefine.c @@ -17,5 +19,5 @@ echo ' "'"$1"'\n"', >> jsdefine.c echo " $2);" >> jsdefine.c echo '}' >> jsdefine.c -gcc -I ${INCDIR} jsdefine.c -o jsdefine.exe +g++ -I ${INCDIR} jsdefine.c -o jsdefine.exe ./jsdefine.exe diff --git a/src/servo/content.rs b/src/servo/content.rs index 65fcc45870f..4f69ee499fd 100644 --- a/src/servo/content.rs +++ b/src/servo/content.rs @@ -63,8 +63,8 @@ fn content(to_layout: chan) -> chan { } result::ok(bytes) { let cx = rt.cx(); - cx.new_global(jsglobal::global_class()).chain { |glob| - cx.evaluate_script(glob, bytes, filename, 1u) + cx.new_compartment(jsglobal::global_class).chain { |comp| + cx.evaluate_script(comp.global_obj, bytes, filename, 1u) }; } } diff --git a/src/servo/content/js.rs b/src/servo/content/js.rs index 250d2cb830b..55702c5769d 100644 --- a/src/servo/content/js.rs +++ b/src/servo/content/js.rs @@ -3,11 +3,11 @@ import jsapi::bindgen::*; import ptr::{null, addr_of}; import result::{result, ok, err, extensions}; import libc::c_char; +import name_pool::{name_pool, methods}; export rt; export methods; export cx; -export named_class; export jsobj; 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(())} } -type named_class = @{ - name: str, - jsclass: JSClass +type named_functions = @{ + names: [str], + funcs: [JSFunctionSpec] }; // ___________________________________________________________________________ @@ -58,14 +58,18 @@ impl methods for cx { jsobj } - fn new_global(globcls: named_class) -> result { + fn new_compartment(globclsfn: fn(name_pool) -> JSClass) -> result { + let np = name_pool(); + let globcls = @globclsfn(np); let globobj = JS_NewCompartmentAndGlobalObject( self.ptr, - addr_of(globcls.jsclass), + &*globcls as *JSClass, null()); 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 @@ -112,7 +125,7 @@ mod test { let gc = jsglobal::global_class(); cx.new_global(gc).chain { |glob| - str::as_bytes("x = 1;") { + str::as_bytes("print(\"1\");") { |bytes| cx.evaluate_script(glob, bytes, "test", 1u) }; diff --git a/src/servo/content/jsglobal.rs b/src/servo/content/jsglobal.rs index ac48e9bc513..04de837b7b2 100644 --- a/src/servo/content/jsglobal.rs +++ b/src/servo/content/jsglobal.rs @@ -3,6 +3,8 @@ import jsapi::*; import jsapi::bindgen::*; import ptr::null; +import jsutil::*; +import name_pool::{name_pool, methods}; crust fn PropertyStub(++arg0: *JSContext, ++arg1: *JSObject, @@ -36,34 +38,55 @@ crust fn ConvertStub(++arg0: *JSContext, JS_ConvertStub(arg0, arg1, arg2, arg3) } -fn global_class() -> js::named_class { - let name = "global"; - let c_str = str::as_c_str(name) { |bytes| bytes }; - @{name: name, // in theory, this should *move* the str in here.. - jsclass: {name: c_str, // ...and so this ptr ought to be valid. - flags: 0x48000_u32, - addProperty: PropertyStub, - delProperty: PropertyStub, - getProperty: PropertyStub, - setProperty: StrictPropertyStub, - enumerate: EnumerateStub, - resolve: ResolveStub, - convert: ConvertStub, - finalize: null(), - reserved0: null(), - checkAccess: null(), - call: null(), - construct: null(), - xdrObject: null(), - hasInstance: null(), - trace: null(), - reserved1: null(), - reserved: (null(), null(), null(), null(), null(), // 05 - null(), null(), null(), null(), null(), // 10 - null(), null(), null(), null(), null(), // 15 - null(), null(), null(), null(), null(), // 20 - null(), null(), null(), null(), null(), // 25 - null(), null(), null(), null(), null(), // 30 - null(), null(), null(), null(), null(), // 35 - null(), null(), null(), null(), null())}} // 40 +fn global_class(np: name_pool) -> JSClass { + {name: np.add("global"), + flags: 0x48000_u32, + addProperty: PropertyStub, + delProperty: PropertyStub, + getProperty: PropertyStub, + setProperty: StrictPropertyStub, + enumerate: EnumerateStub, + resolve: ResolveStub, + convert: ConvertStub, + finalize: null(), + reserved0: null(), + checkAccess: null(), + call: null(), + construct: null(), + xdrObject: null(), + hasInstance: null(), + trace: null(), + reserved1: null(), + reserved: (null(), null(), null(), null(), null(), // 05 + null(), null(), null(), null(), null(), // 10 + null(), null(), null(), null(), null(), // 15 + null(), null(), null(), null(), null(), // 20 + null(), null(), null(), null(), null(), // 25 + 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}] } \ No newline at end of file diff --git a/src/servo/servo.rc b/src/servo/servo.rc index 64b32d505c3..c5ab1d2f590 100755 --- a/src/servo/servo.rc +++ b/src/servo/servo.rc @@ -68,6 +68,8 @@ mod util { mod content { mod js; mod jsglobal; + mod jsutil; + mod name_pool; } mod opts;