Skip to content

Commit

Permalink
wip: integrate js
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed May 17, 2012
1 parent 6d27ee5 commit 7ca5711
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 8 deletions.
14 changes: 12 additions & 2 deletions 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;
Expand Down Expand Up @@ -56,8 +57,17 @@ fn content(to_layout: chan<layout::msg>) -> chan<msg> {
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);
Expand Down
55 changes: 49 additions & 6 deletions src/servo/content/js.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -37,22 +38,23 @@ 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})
}
}

// ___________________________________________________________________________
// 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
}

Expand All @@ -66,14 +68,55 @@ 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(())
}
}
}
}
}

// ___________________________________________________________________________
// objects

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);
}
};
}

}
1 change: 1 addition & 0 deletions test.js
@@ -0,0 +1 @@
print("Hello, world!");

0 comments on commit 7ca5711

Please sign in to comment.