Skip to content
This repository has been archived by the owner on Aug 18, 2018. It is now read-only.

Commit

Permalink
Breakpoint callbacks can raise exceptions.
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewd committed Sep 27, 2009
1 parent 90cb942 commit 6a687be
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
4 changes: 1 addition & 3 deletions ext/spidermonkey/conversions.c
Expand Up @@ -10,10 +10,8 @@ static VALUE convert_regexp_to_ruby(JohnsonRuntime* runtime, jsval regexp);
DECLARE_RUBY_WRAPPER(convert_regexp_to_ruby, JohnsonRuntime* runtime; jsval regexp)
DEFINE_RUBY_WRAPPER(convert_regexp_to_ruby, convert_regexp_to_ruby, ARGLIST2(runtime, regexp))

DECLARE_RUBY_WRAPPER(rb_funcall_0, VALUE obj; ID sym; int argc)
DEFINE_RUBY_WRAPPER(rb_funcall_0, rb_funcall, ARGLIST3(obj, sym, argc))

DECLARE_RUBY_WRAPPER(rb_funcall_2, VALUE obj; ID sym; int argc; VALUE a; VALUE b)
DEFINE_RUBY_WRAPPER(rb_funcall_1, rb_funcall, ARGLIST4(obj, sym, argc, a))
DEFINE_RUBY_WRAPPER(rb_funcall_2, rb_funcall, ARGLIST5(obj, sym, argc, a, b))

static JSBool convert_float_or_bignum_to_js(JohnsonRuntime* runtime, VALUE float_or_bignum, jsval* retval)
Expand Down
7 changes: 7 additions & 0 deletions ext/spidermonkey/conversions.h
Expand Up @@ -11,6 +11,13 @@ DECLARE_RUBY_WRAPPER(convert_to_ruby, JohnsonRuntime* runtime; jsval js_value)
DECLARE_RUBY_WRAPPER(convert_js_string_to_ruby, JohnsonRuntime* runtime; JSString* str)
#define CONVERT_JS_STRING_TO_RUBY(runtime, js) CALL_RUBY_WRAPPER(convert_js_string_to_ruby, runtime, js)

DECLARE_RUBY_WRAPPER(rb_funcall_0, VALUE obj; ID sym; int argc)
#define RB_FUNCALL_0(obj, sym) CALL_RUBY_WRAPPER(rb_funcall_0, obj, sym, 0)
DECLARE_RUBY_WRAPPER(rb_funcall_1, VALUE obj; ID sym; int argc; VALUE a)
#define RB_FUNCALL_1(obj, sym, a) CALL_RUBY_WRAPPER(rb_funcall_1, obj, sym, 1, a)
DECLARE_RUBY_WRAPPER(rb_funcall_2, VALUE obj; ID sym; int argc; VALUE a; VALUE b)
#define RB_FUNCALL_2(obj, sym, a, b) CALL_RUBY_WRAPPER(rb_funcall_2, obj, sym, 2, a, b)

JSBool convert_to_js(JohnsonRuntime* runtime, VALUE ruby, jsval* retval);
VALUE convert_to_ruby(JohnsonRuntime* runtime, jsval js);
VALUE convert_js_string_to_ruby(JohnsonRuntime* runtime, JSString* str);
Expand Down
5 changes: 3 additions & 2 deletions ext/spidermonkey/runtime.c
Expand Up @@ -19,14 +19,15 @@ static VALUE global(VALUE self)
return convert_to_ruby(runtime, OBJECT_TO_JSVAL(runtime->global));
}

static JSTrapStatus trap_handler( JSContext *UNUSED(context),
static JSTrapStatus trap_handler( JSContext *context,
JSScript *UNUSED(script),
jsbytecode *UNUSED(pc),
jsval *UNUSED(rval),
void *block_closure )
{
PREPARE_JROOTS(context, 0);
VALUE block = (VALUE)block_closure;
rb_funcall(block, rb_intern("call"), 0);
RB_FUNCALL_0(block, rb_intern("call"));
return JSTRAP_CONTINUE;
}

Expand Down
29 changes: 29 additions & 0 deletions test/johnson/runtime_test.rb
Expand Up @@ -50,6 +50,35 @@ def test_breakpoint_gets_called
assert_equal(2, @runtime['some_number'])
end

def test_breakpoint_can_raise
break_times = 0
@runtime['some_number'] = 0
@runtime['alert'] = lambda {|x,y| p [x, y] }
script = @runtime.compile("some_number++;
var x = 0;
try {
for(var i = 0; i < 10; i++) {
x++;
}
} catch(ex) {
note_error(ex);
}
some_number++;
")
script.break(5) do
break_times += 1
assert_equal(@runtime['i'], @runtime['x'])
assert_equal(1, @runtime['some_number'])
raise ArgumentError, "Test" if @runtime['i'] > 4
end
break_ex = nil
@runtime['note_error'] = lambda {|ex| break_ex = ex }
@runtime.evaluate_compiled_script(script)
assert_match(/ArgumentError: Test/, break_ex.message)
assert_equal(6, break_times)
assert_equal(2, @runtime['some_number'])
end

def test_try_to_gc
10.times {
thread = Thread.new do
Expand Down

0 comments on commit 6a687be

Please sign in to comment.