1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00
therubyracer/lib/v8/portal/caller.rb
2011-06-06 08:11:19 -05:00

38 lines
No EOL
873 B
Ruby

module V8
class Portal
class Caller
def initialize(portal)
@portal = portal
end
def raw
begin
yield
rescue Exception => e
case e
when SystemExit, NoMemoryError
raise e
else
error = V8::C::Exception::Error(V8::C::String::New(e.message))
#TODO: This is almost certainly a crash here.
#we need to hold onto `error` while it bubbles up the javascript stack.
error.SetHiddenValue("TheRubyRacer::Cause", C::External::New(e))
V8::C::ThrowException(error)
end
end
end
def protect(*args, &block)
@portal.v8 raw(*args, &block)
end
def invoke(code, *args, &block)
protect do
code.call(*args, &block)
end
end
end
end
end