Changed the shell to print source position with error messages.

Added debug flags to gcc when compiling samples in debug mode.



git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@237 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
christian.plesner.hansen@gmail.com 2008-09-09 19:08:40 +00:00
parent de607bd33e
commit 28133bc761
2 changed files with 37 additions and 5 deletions

View File

@ -190,6 +190,9 @@ SAMPLE_FLAGS = {
'CCFLAGS': ['-m32'],
'LINKFLAGS': ['-m32']
},
'mode:debug': {
'CCFLAGS': ['-g', '-O0']
}
},
'msvc': {
'all': {

View File

@ -40,6 +40,7 @@ v8::Handle<v8::Value> Load(const v8::Arguments& args);
v8::Handle<v8::Value> Quit(const v8::Arguments& args);
v8::Handle<v8::Value> Version(const v8::Arguments& args);
v8::Handle<v8::String> ReadFile(const char* name);
void ReportException(v8::TryCatch* handler);
int main(int argc, char* argv[]) {
@ -174,7 +175,7 @@ void RunShell(v8::Handle<v8::Context> context) {
char* str = fgets(buffer, kBufferSize, stdin);
if (str == NULL) break;
v8::HandleScope handle_scope;
ExecuteString(v8::String::New(str), v8::Undefined(), true);
ExecuteString(v8::String::New(str), v8::String::New("(shell)"), true);
}
printf("\n");
}
@ -189,15 +190,13 @@ bool ExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Script> script = v8::Script::Compile(source, name);
if (script.IsEmpty()) {
// Print errors that happened during compilation.
v8::String::AsciiValue error(try_catch.Exception());
printf("%s\n", *error);
ReportException(&try_catch);
return false;
} else {
v8::Handle<v8::Value> result = script->Run();
if (result.IsEmpty()) {
// Print errors that happened during execution.
v8::String::AsciiValue error(try_catch.Exception());
printf("%s\n", *error);
ReportException(&try_catch);
return false;
} else {
if (print_result && !result->IsUndefined()) {
@ -210,3 +209,33 @@ bool ExecuteString(v8::Handle<v8::String> source,
}
}
}
void ReportException(v8::TryCatch* try_catch) {
v8::HandleScope handle_scope;
v8::String::AsciiValue exception(try_catch->Exception());
v8::Handle<v8::Message> message = try_catch->Message();
if (message.IsEmpty()) {
// V8 didn't provide any extra information about this error; just
// print the exception.
printf("%s\n", *exception);
} else {
// Print (filename):(line number): (message).
v8::String::AsciiValue filename(message->GetScriptResourceName());
int linenum = message->GetLineNumber();
printf("%s:%i: %s\n", *filename, linenum, *exception);
// Print line of source code.
v8::String::AsciiValue sourceline(message->GetSourceLine());
printf("%s\n", *sourceline);
// Print wavy underline (GetUnderline is deprecated).
int start = message->GetStartColumn();
for (int i = 0; i < start; i++) {
printf(" ");
}
int end = message->GetEndColumn();
for (int i = start; i < end; i++) {
printf("^");
}
printf("\n");
}
}