From 7ca571148b1b8adb3d2b7aff4588c07c4d4ab1d3 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Thu, 17 May 2012 11:11:53 -0700 Subject: [PATCH] wip: integrate js --- src/servo/content.rs | 14 +++++++++-- src/servo/content/js.rs | 55 ++++++++++++++++++++++++++++++++++++----- test.js | 1 + 3 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 test.js diff --git a/src/servo/content.rs b/src/servo/content.rs index 5197dc6d3f5..65fcc45870f 100644 --- a/src/servo/content.rs +++ b/src/servo/content.rs @@ -1,6 +1,7 @@ export msg, ping; export content; +import result::extensions; import dom::rcu::writer_methods; import dom=dom::base; import layout::layout; @@ -56,8 +57,17 @@ fn content(to_layout: chan) -> chan { execute(filename) { #debug["content: Received filename `%s` to execute", filename]; - let cx = rt.cx(); - let _glob = cx.new_global(jsglobal::global_class()); + alt io::read_whole_file(filename) { + result::err(msg) { + io::println(#fmt["Error opening %s: %s", filename, msg]); + } + result::ok(bytes) { + let cx = rt.cx(); + cx.new_global(jsglobal::global_class()).chain { |glob| + cx.evaluate_script(glob, bytes, filename, 1u) + }; + } + } } exit { to_layout.send(layout::exit); diff --git a/src/servo/content/js.rs b/src/servo/content/js.rs index b76fd92683a..05f65249d09 100644 --- a/src/servo/content/js.rs +++ b/src/servo/content/js.rs @@ -2,6 +2,7 @@ import jsapi::*; import jsapi::bindgen::*; import ptr::{null, addr_of}; import result::{result, ok, err, extensions}; +import libc::c_char; export rt; export methods; @@ -37,7 +38,8 @@ fn rt() -> rt { impl methods for rt { fn cx() -> cx { - @cx_rsrc({ptr: JS_NewContext(self.ptr, default_stacksize)}) + @cx_rsrc({ptr: JS_NewContext(self.ptr, default_stacksize), + rt: self}) } } @@ -45,14 +47,14 @@ impl methods for rt { // contexts type cx = @cx_rsrc; -resource cx_rsrc(self: {ptr: *JSContext}) { +resource cx_rsrc(self: {ptr: *JSContext, rt: rt}) { JS_DestroyContext(self.ptr); } impl methods for cx { fn rooted_obj(obj: *JSObject) -> jsobj { - let jsobj = @jsobj_rsrc({cx: self.ptr, obj: obj}); - JS_AddObjectRoot(self.ptr, ptr::addr_of(jsobj.obj)); + let jsobj = @jsobj_rsrc({cx: self, cxptr: self.ptr, ptr: obj}); + JS_AddObjectRoot(self.ptr, ptr::addr_of(jsobj.ptr)); jsobj } @@ -66,6 +68,29 @@ impl methods for cx { ok(self.rooted_obj(globobj)) } } + + fn evaluate_script(glob: jsobj, bytes: [u8], filename: str, + line_num: uint) -> result<(),()> { + vec::as_buf(bytes) { |bytes_ptr| + str::as_c_str(filename) { |filename_cstr| + let bytes_ptr = bytes_ptr as *c_char; + let v: jsval = 0_u64; + #debug["Evaluating script from %s", filename]; + if JS_EvaluateScript(self.ptr, glob.ptr, + bytes_ptr, bytes.len() as uintN, + filename_cstr, line_num as uintN, + ptr::addr_of(v)) == ERR { + #debug["...err!"]; + err(()) + } else { + // we could return the script result but then we'd have + // to root it and so forth and, really, who cares? + #debug["...ok!"]; + ok(()) + } + } + } + } } // ___________________________________________________________________________ @@ -73,7 +98,25 @@ impl methods for cx { type jsobj = @jsobj_rsrc; -resource jsobj_rsrc(self: {cx: *JSContext, obj: *JSObject}) { - JS_RemoveObjectRoot(self.cx, ptr::addr_of(self.obj)); +resource jsobj_rsrc(self: {cx: cx, cxptr: *JSContext, ptr: *JSObject}) { + JS_RemoveObjectRoot(self.cxptr, ptr::addr_of(self.ptr)); } +#[cfg(test)] +mod test { + + #[test] + fn dummy() { + let rt = rt(); + let cx = rt.cx(); + let gc = jsglobal::global_class(); + cx.new_global(gc).chain { + |glob| + str::bytes("x = 1;") { + |bytes| + cx.evaluate_script(glob, bytes, "test", 1u); + } + }; + } + +} \ No newline at end of file diff --git a/test.js b/test.js new file mode 100644 index 00000000000..b64f29bc580 --- /dev/null +++ b/test.js @@ -0,0 +1 @@ +print("Hello, world!");