1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00

Add methods to get detailed source and line data from error messages

This commit is contained in:
Charles Lowell 2010-02-08 10:53:20 -06:00
parent 205c52c5bf
commit a20279e897
6 changed files with 74 additions and 7 deletions

View file

@ -43,7 +43,7 @@ extern "C" {
rb_define_singleton_method(V8_C_Context, "GetCurrent", (VALUE(*)(...)) v8_Context_GetCurrent, 0);
rb_define_method(V8_C_Context, "Global", (VALUE(*)(...)) v8_cxt_Global, 0);
rb_define_method(V8_C_Context, "open", (VALUE(*)(...)) v8_cxt_open, 0);
rb_define_method(V8_C_Context, "eval", (VALUE(*)(...)) v8_cxt_eval, 1);
rb_define_method(V8_C_Context, "eval", (VALUE(*)(...)) v8_cxt_eval, 2);
rb_define_method(V8_C_Context, "eql?", (VALUE(*)(...)) v8_cxt_eql, 1);
rb_define_method(V8_C_Context, "==", (VALUE(*)(...)) v8_cxt_eql, 1);
@ -75,6 +75,14 @@ extern "C" {
V8_C_Message = rb_define_class_under(rb_mNative, "Message", rb_cObject);
rb_define_method(V8_C_Message, "Get", (VALUE(*)(...))v8_Message_Get, 0);
rb_define_method(V8_C_Message, "GetSourceLine", (VALUE(*)(...))v8_Message_GetSourceLine, 0);
rb_define_method(V8_C_Message, "GetScriptResourceName", (VALUE(*)(...))v8_Message_GetScriptResourceName, 0);
rb_define_method(V8_C_Message, "GetLineNumber", (VALUE(*)(...))v8_Message_GetLineNumber, 0);
rb_define_method(V8_C_Message, "GetStartPosition", (VALUE(*)(...))v8_Message_GetStartPosition, 0);
rb_define_method(V8_C_Message, "GetEndPosition", (VALUE(*)(...)) v8_Message_GetEndPosition, 0);
rb_define_method(V8_C_Message, "GetStartColumn", (VALUE(*)(...)) v8_Message_GetStartColumn, 0);
rb_define_method(V8_C_Message, "GetEndColumn", (VALUE(*)(...)) v8_Message_GetEndColumn, 0);
V8_C_Function = rb_define_class_under(rb_mNative, "Function", V8_C_Object);
}

View file

@ -20,7 +20,6 @@ VALUE v8_Context_New(int argc, VALUE *argv, VALUE self) {
Persistent<Context> context = Context::New(0, Racer_Create_V8_ObjectTemplate(scope));
Context::Scope enter(context);
context->Global()->SetHiddenValue(String::New("TheRubyRacer::RubyObject"), External::Wrap((void *)scope));
// context->Global()->SetPointerInInternalField(0, (void*)scope);
VALUE ref = V8_Ref_Create(self, context, scope);
context.Dispose();
return ref;
@ -59,13 +58,14 @@ VALUE v8_cxt_open(VALUE self) {
}
}
VALUE v8_cxt_eval(VALUE self, VALUE source) {
VALUE v8_cxt_eval(VALUE self, VALUE source, VALUE filename) {
HandleScope handles;
TryCatch exceptions;
Local<Context> cxt = V8_Ref_Get<Context>(self);
Context::Scope enter(cxt);
Local<Value> source_str = RB2V8(source);
Local<Script> script = Script::Compile(source_str->ToString());
Local<Value> source_name = RTEST(filename) ? RB2V8(filename) : *String::New("<eval>");
Local<Script> script = Script::Compile(source_str->ToString(), source_name);
if (exceptions.HasCaught()) {
return V8_Ref_Create(V8_C_Message, exceptions.Message());
}

View file

@ -14,7 +14,7 @@ VALUE v8_Context_InContext(VALUE self);
VALUE v8_Context_GetCurrent(VALUE self);
VALUE v8_cxt_Global(VALUE self);
VALUE v8_cxt_open(VALUE self);
VALUE v8_cxt_eval(VALUE self, VALUE source);
VALUE v8_cxt_eval(VALUE self, VALUE source, VALUE filename);
VALUE v8_cxt_eql(VALUE self, VALUE other);
#endif

View file

@ -15,3 +15,40 @@ VALUE v8_Message_Get(VALUE self) {
Local<Value> str = message->Get();
return V82RB(str);
}
VALUE v8_Message_GetSourceLine(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
Local<Value> line = message->GetSourceLine();
return V82RB(line);
}
VALUE v8_Message_GetScriptResourceName(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
Handle<Value> name = message->GetScriptResourceName();
return V82RB(name);
}
VALUE v8_Message_GetLineNumber(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
return INT2FIX(message->GetLineNumber());
}
VALUE v8_Message_GetStartPosition(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
return INT2FIX(message->GetStartPosition());
}
VALUE v8_Message_GetEndPosition(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
return INT2FIX(message->GetEndPosition());
}
VALUE v8_Message_GetStartColumn(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
return INT2FIX(message->GetStartColumn());
}
VALUE v8_Message_GetEndColumn(VALUE self) {
Local<Message> message = V8_Ref_Get<Message>(self);
return INT2FIX(message->GetEndColumn());
}

View file

@ -7,4 +7,12 @@
extern VALUE V8_C_Message;
VALUE V8_Wrap_Message(v8::Handle<v8::Message> msg);
VALUE v8_Message_Get(VALUE self);
VALUE v8_Message_GetSourceLine(VALUE self);
VALUE v8_Message_GetScriptResourceName(VALUE self);
VALUE v8_Message_GetLineNumber(VALUE self);
VALUE v8_Message_GetStartPosition(VALUE self);
VALUE v8_Message_GetEndPosition(VALUE self);
VALUE v8_Message_GetStartColumn(VALUE self);
VALUE v8_Message_GetEndColumn(VALUE self);
#endif

View file

@ -23,7 +23,7 @@ module V8
javascript = javascript.read()
end
@native.open do
@native.eval(javascript).tap do |result|
@native.eval(javascript, sourcename).tap do |result|
raise JavascriptError.new(result) if result.kind_of?(C::Message)
return To.ruby(result)
end
@ -80,7 +80,21 @@ module V8
class JavascriptError < StandardError
def initialize(v8_message)
super(v8_message.Get())
@native = v8_message
end
def source_name
@native.GetScriptResourceName()
end
def source_line
@native.GetSourceLine()
end
def line_number
@native.GetLineNumber()
end
end
class RunawayScriptError < ContextError
end