Permalink
Browse files

updated my modified v8 shell

  • Loading branch information...
alexwarth committed Jul 15, 2009
1 parent 483d097 commit 6c0a3abecf403120bc51c2cdaf83be593f28f1a7
Showing with 93 additions and 43 deletions.
  1. +93 −43 v8-shell.cc
View
@@ -1,6 +1,6 @@
-// Support for translateCode added by Alex Warth <awarth@cs.ucla.edu>
+// Support for translateCode added by Alex Warth <alex@vpri.org>
-// Copyright 2008 the V8 project authors. All rights reserved.
+// Copyright 2009 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
@@ -28,37 +28,36 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <v8.h>
-#include <cstring>
-#include <cstdio>
-#include <cstdlib>
-
+#include <fcntl.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
v8::Handle<v8::Context> context;
-void RunShell(void);
-bool ExecuteString(v8::Handle<v8::String> source,
- v8::Handle<v8::Value> name,
- bool print_result,
- bool report_exceptions);
-bool iExecuteString(v8::Handle<v8::String> source,
- v8::Handle<v8::Value> name,
- v8::Handle<v8::Value> &result,
- bool report_exceptions);
+void RunShell(v8::Handle<v8::Context> context);
+bool ExecuteString(v8::Handle<v8::String> source,
+ v8::Handle<v8::Value> name,
+ bool print_result,
+ bool report_exceptions);
v8::Handle<v8::Value> Print(const v8::Arguments& args);
+v8::Handle<v8::Value> Read(const v8::Arguments& args);
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[]) {
+int RunMain(int argc, char* argv[]) {
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
v8::HandleScope handle_scope;
// Create a template for the global object.
v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
// Bind the global 'print' function to the C++ Print callback.
global->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print));
+ // Bind the global 'read' function to the C++ Read callback.
+ global->Set(v8::String::New("read"), v8::FunctionTemplate::New(Read));
// Bind the global 'load' function to the C++ Load callback.
global->Set(v8::String::New("load"), v8::FunctionTemplate::New(Load));
// Bind the 'quit' function
@@ -80,7 +79,15 @@ int main(int argc, char* argv[]) {
// alone JavaScript engines.
continue;
} else if (strncmp(str, "--", 2) == 0) {
- printf("Warning: unknown flag %s.\n", str);
+ printf("Warning: unknown flag %s.\nTry --help for options\n", str);
+ } else if (strcmp(str, "-e") == 0 && i + 1 < argc) {
+ // Execute argument given to -e option directly
+ v8::HandleScope handle_scope;
+ v8::Handle<v8::String> file_name = v8::String::New("unnamed");
+ v8::Handle<v8::String> source = v8::String::New(argv[i + 1]);
+ if (!ExecuteString(source, file_name, false, true))
+ return 1;
+ i++;
} else {
// Use all other arguments as names of files to load and run.
v8::HandleScope handle_scope;
@@ -94,11 +101,24 @@ int main(int argc, char* argv[]) {
return 1;
}
}
- if (run_shell) RunShell();
+ if (run_shell) RunShell(context);
return 0;
}
+int main(int argc, char* argv[]) {
+ int result = RunMain(argc, argv);
+ v8::V8::Dispose();
+ return result;
+}
+
+
+// Extracts a C string from a V8 Utf8Value.
+const char* ToCString(const v8::String::Utf8Value& value) {
+ return *value ? *value : "<string conversion failed>";
+}
+
+
// The callback that is invoked by v8 whenever the JavaScript 'print'
// function is called. Prints its arguments on stdout separated by
// spaces and ending with a newline.
@@ -112,26 +132,50 @@ v8::Handle<v8::Value> Print(const v8::Arguments& args) {
printf(" ");
}
v8::String::Utf8Value str(args[i]);
- printf("%s", *str);
+ const char* cstr = ToCString(str);
+ printf("%s", cstr);
}
printf("\n");
+ fflush(stdout);
return v8::Undefined();
}
+// The callback that is invoked by v8 whenever the JavaScript 'read'
+// function is called. This function loads the content of the file named in
+// the argument into a JavaScript string.
+v8::Handle<v8::Value> Read(const v8::Arguments& args) {
+ if (args.Length() != 1) {
+ return v8::ThrowException(v8::String::New("Bad parameters"));
+ }
+ v8::String::Utf8Value file(args[0]);
+ if (*file == NULL) {
+ return v8::ThrowException(v8::String::New("Error loading file"));
+ }
+ v8::Handle<v8::String> source = ReadFile(*file);
+ if (source.IsEmpty()) {
+ return v8::ThrowException(v8::String::New("Error loading file"));
+ }
+ return source;
+}
+
+
// The callback that is invoked by v8 whenever the JavaScript 'load'
// function is called. Loads, compiles and executes its argument
// JavaScript file.
v8::Handle<v8::Value> Load(const v8::Arguments& args) {
for (int i = 0; i < args.Length(); i++) {
v8::HandleScope handle_scope;
v8::String::Utf8Value file(args[i]);
+ if (*file == NULL) {
+ return v8::ThrowException(v8::String::New("Error loading file"));
+ }
v8::Handle<v8::String> source = ReadFile(*file);
if (source.IsEmpty()) {
return v8::ThrowException(v8::String::New("Error loading file"));
}
if (!ExecuteString(source, v8::String::New(*file), false, false)) {
- return v8::ThrowException(v8::String::New("Error executing file"));
+ return v8::ThrowException(v8::String::New("Error executing file"));
}
}
return v8::Undefined();
@@ -177,7 +221,7 @@ v8::Handle<v8::String> ReadFile(const char* name) {
// The read-eval-execute loop of the shell.
-void RunShell() {
+void RunShell(v8::Handle<v8::Context> context) {
printf("V8 version %s\n", v8::V8::GetVersion());
static const int kBufferSize = 256;
while (true) {
@@ -194,25 +238,6 @@ void RunShell() {
printf("\n");
}
-// Executes a string within the current v8 context.
-bool ExecuteString(v8::Handle<v8::String> source,
- v8::Handle<v8::Value> name,
- bool print_result,
- bool report_exceptions) {
- v8::Handle<v8::Value> result;
- context->Global()->Set(v8::String::New("__xy7z"), source);
- bool ok = true;
- ok = iExecuteString(v8::String::New("if ((function() { return this.translateCode })()) __xy7z = translateCode(__xy7z)"),
- name, result, false);
- if (!ok)
- printf("error: translateCode failed\n");
- if (ok)
- ok = iExecuteString(v8::String::New("__xy7z = eval(__xy7z)"), name, result, report_exceptions);
- if (ok && print_result && !result->IsUndefined())
- iExecuteString(v8::String::New("print(__xy7z)"), name, result, report_exceptions);
- return ok;
-}
-
bool iExecuteString(v8::Handle<v8::String> source,
v8::Handle<v8::Value> name,
@@ -240,22 +265,47 @@ bool iExecuteString(v8::Handle<v8::String> source,
}
+// Executes a string within the current v8 context.
+bool ExecuteString(v8::Handle<v8::String> source,
+ v8::Handle<v8::Value> name,
+ bool print_result,
+ bool report_exceptions) {
+ v8::Handle<v8::Value> result;
+ context->Global()->Set(v8::String::New("__xy7z"), source);
+ bool ok = true;
+ ok = iExecuteString(v8::String::New("if ((function() { return this.translateCode })()) __xy7z = translateCode(__xy7z)"),
+ name, result, false);
+ if (ok)
+ ok = iExecuteString(v8::String::New("__xy7z = eval(__xy7z)"), name, result, report_exceptions);
+ else {
+ iExecuteString(v8::String::New("translateCode = undefined"), name, result, report_exceptions);
+ printf("error: translateCode failed and has been set to undefined in order to make the shell operational again\n");
+ }
+ if (ok && print_result && !result->IsUndefined())
+ iExecuteString(v8::String::New("print(__xy7z)"), name, result, report_exceptions);
+ return ok;
+}
+
+
void ReportException(v8::TryCatch* try_catch) {
v8::HandleScope handle_scope;
v8::String::Utf8Value exception(try_catch->Exception());
+ const char* exception_string = ToCString(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);
+ printf("%s\n", exception_string);
} else {
// Print (filename):(line number): (message).
v8::String::Utf8Value filename(message->GetScriptResourceName());
+ const char* filename_string = ToCString(filename);
int linenum = message->GetLineNumber();
- printf("%s:%i: %s\n", *filename, linenum, *exception);
+ printf("%s:%i: %s\n", filename_string, linenum, exception_string);
// Print line of source code.
v8::String::Utf8Value sourceline(message->GetSourceLine());
- printf("%s\n", *sourceline);
+ const char* sourceline_string = ToCString(sourceline);
+ printf("%s\n", sourceline_string);
// Print wavy underline (GetUnderline is deprecated).
int start = message->GetStartColumn();
for (int i = 0; i < start; i++) {

0 comments on commit 6c0a3ab

Please sign in to comment.