Changed the shell to print source position with error messages.
authorchristian.plesner.hansen@gmail.com <christian.plesner.hansen@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 9 Sep 2008 19:08:40 +0000 (19:08 +0000)
committerchristian.plesner.hansen@gmail.com <christian.plesner.hansen@gmail.com@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 9 Sep 2008 19:08:40 +0000 (19:08 +0000)
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

SConstruct
samples/shell.cc

index 8df4dab0332d67fab5cf72b7725c33989e5b6cfb..bdd0ab44d23004c97b29d47fb21ff1180daeb989 100644 (file)
@@ -190,6 +190,9 @@ SAMPLE_FLAGS = {
       'CCFLAGS':      ['-m32'],
       'LINKFLAGS':    ['-m32']
     },
+    'mode:debug': {
+      'CCFLAGS':      ['-g', '-O0']
+    }
   },
   'msvc': {
     'all': {
index 17adbdf525957ef724adcc3adc6fbcc3a8ee3270..643eeb46bebd165115f8a6d66abc457fe79e2516 100644 (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");
+  }
+}