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_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);
|
||||
}
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -14,4 +14,41 @@ VALUE v8_Message_Get(VALUE self) {
|
|||
Local<Message> message = V8_Ref_Get<Message>(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());
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue