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:
parent
205c52c5bf
commit
a20279e897
6 changed files with 74 additions and 7 deletions
|
@ -43,7 +43,7 @@ extern "C" {
|
||||||
rb_define_singleton_method(V8_C_Context, "GetCurrent", (VALUE(*)(...)) v8_Context_GetCurrent, 0);
|
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, "Global", (VALUE(*)(...)) v8_cxt_Global, 0);
|
||||||
rb_define_method(V8_C_Context, "open", (VALUE(*)(...)) v8_cxt_open, 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, "eql?", (VALUE(*)(...)) v8_cxt_eql, 1);
|
||||||
rb_define_method(V8_C_Context, "==", (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);
|
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, "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);
|
V8_C_Function = rb_define_class_under(rb_mNative, "Function", V8_C_Object);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
Persistent<Context> context = Context::New(0, Racer_Create_V8_ObjectTemplate(scope));
|
||||||
Context::Scope enter(context);
|
Context::Scope enter(context);
|
||||||
context->Global()->SetHiddenValue(String::New("TheRubyRacer::RubyObject"), External::Wrap((void *)scope));
|
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);
|
VALUE ref = V8_Ref_Create(self, context, scope);
|
||||||
context.Dispose();
|
context.Dispose();
|
||||||
return ref;
|
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;
|
HandleScope handles;
|
||||||
TryCatch exceptions;
|
TryCatch exceptions;
|
||||||
Local<Context> cxt = V8_Ref_Get<Context>(self);
|
Local<Context> cxt = V8_Ref_Get<Context>(self);
|
||||||
Context::Scope enter(cxt);
|
Context::Scope enter(cxt);
|
||||||
Local<Value> source_str = RB2V8(source);
|
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()) {
|
if (exceptions.HasCaught()) {
|
||||||
return V8_Ref_Create(V8_C_Message, exceptions.Message());
|
return V8_Ref_Create(V8_C_Message, exceptions.Message());
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ VALUE v8_Context_InContext(VALUE self);
|
||||||
VALUE v8_Context_GetCurrent(VALUE self);
|
VALUE v8_Context_GetCurrent(VALUE self);
|
||||||
VALUE v8_cxt_Global(VALUE self);
|
VALUE v8_cxt_Global(VALUE self);
|
||||||
VALUE v8_cxt_open(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);
|
VALUE v8_cxt_eql(VALUE self, VALUE other);
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -14,4 +14,41 @@ VALUE v8_Message_Get(VALUE self) {
|
||||||
Local<Message> message = V8_Ref_Get<Message>(self);
|
Local<Message> message = V8_Ref_Get<Message>(self);
|
||||||
Local<Value> str = message->Get();
|
Local<Value> str = message->Get();
|
||||||
return V82RB(str);
|
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());
|
||||||
|
}
|
||||||
|
|
|
@ -7,4 +7,12 @@
|
||||||
extern VALUE V8_C_Message;
|
extern VALUE V8_C_Message;
|
||||||
VALUE V8_Wrap_Message(v8::Handle<v8::Message> msg);
|
VALUE V8_Wrap_Message(v8::Handle<v8::Message> msg);
|
||||||
VALUE v8_Message_Get(VALUE self);
|
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
|
#endif
|
|
@ -23,7 +23,7 @@ module V8
|
||||||
javascript = javascript.read()
|
javascript = javascript.read()
|
||||||
end
|
end
|
||||||
@native.open do
|
@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)
|
raise JavascriptError.new(result) if result.kind_of?(C::Message)
|
||||||
return To.ruby(result)
|
return To.ruby(result)
|
||||||
end
|
end
|
||||||
|
@ -80,7 +80,21 @@ module V8
|
||||||
class JavascriptError < StandardError
|
class JavascriptError < StandardError
|
||||||
def initialize(v8_message)
|
def initialize(v8_message)
|
||||||
super(v8_message.Get())
|
super(v8_message.Get())
|
||||||
|
@native = v8_message
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def source_name
|
||||||
|
@native.GetScriptResourceName()
|
||||||
|
end
|
||||||
|
|
||||||
|
def source_line
|
||||||
|
@native.GetSourceLine()
|
||||||
|
end
|
||||||
|
|
||||||
|
def line_number
|
||||||
|
@native.GetLineNumber()
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
class RunawayScriptError < ContextError
|
class RunawayScriptError < ContextError
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue