| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index 35732b1cc7b9d2fb3554f5892939cde7f86a0a89..9d810d80be3cdac73600459fd38798450f72d31b 100644
|
| --- a/src/d8.cc
|
| +++ b/src/d8.cc
|
| @@ -170,6 +170,36 @@ const char* Shell::ToCString(const v8::String::Utf8Value& value) {
|
| }
|
|
|
|
|
| +// Compile a string within the current v8 context.
|
| +Local<UnboundScript> Shell::CompileString(
|
| + Isolate* isolate, Local<String> source, Local<Value> name,
|
| + v8::ScriptCompiler::CompileOptions compile_options) {
|
| + ScriptOrigin origin(name);
|
| + ScriptCompiler::Source script_source(source, origin);
|
| + Local<UnboundScript> script =
|
| + ScriptCompiler::CompileUnbound(isolate, &script_source, compile_options);
|
| +
|
| + // Was caching requested & successful? Then compile again, now with cache.
|
| + if (script_source.GetCachedData()) {
|
| + if (compile_options == ScriptCompiler::kProduceCodeCache) {
|
| + compile_options = ScriptCompiler::kConsumeCodeCache;
|
| + } else if (compile_options == ScriptCompiler::kProduceParserCache) {
|
| + compile_options = ScriptCompiler::kConsumeParserCache;
|
| + } else {
|
| + ASSERT(false); // A new compile option?
|
| + }
|
| + ScriptCompiler::Source cached_source(
|
| + source, origin, new v8::ScriptCompiler::CachedData(
|
| + script_source.GetCachedData()->data,
|
| + script_source.GetCachedData()->length,
|
| + v8::ScriptCompiler::CachedData::BufferNotOwned));
|
| + script = ScriptCompiler::CompileUnbound(isolate, &cached_source,
|
| + compile_options);
|
| + }
|
| + return script;
|
| +}
|
| +
|
| +
|
| // Executes a string within the current v8 context.
|
| bool Shell::ExecuteString(Isolate* isolate,
|
| Handle<String> source,
|
| @@ -188,10 +218,9 @@ bool Shell::ExecuteString(Isolate* isolate,
|
| // When debugging make exceptions appear to be uncaught.
|
| try_catch.SetVerbose(true);
|
| }
|
| - ScriptOrigin origin(name);
|
| - ScriptCompiler::Source script_source(source, origin);
|
| +
|
| Handle<UnboundScript> script =
|
| - ScriptCompiler::CompileUnbound(isolate, &script_source);
|
| + Shell::CompileString(isolate, source, name, options.compile_options);
|
| if (script.IsEmpty()) {
|
| // Print errors that happened during compilation.
|
| if (report_exceptions && !FLAG_debugger)
|
| @@ -1340,6 +1369,20 @@ bool Shell::SetOptions(int argc, char* argv[]) {
|
| options.snapshot_blob = argv[i] + 16;
|
| argv[i] = NULL;
|
| #endif // V8_USE_EXTERNAL_STARTUP_DATA
|
| + } else if (strcmp(argv[i], "--cache") == 0 ||
|
| + strncmp(argv[i], "--cache=", 8) == 0) {
|
| + const char* value = argv[i] + 7;
|
| + if (!*value || strncmp(value, "=code", 6) == 0) {
|
| + options.compile_options = v8::ScriptCompiler::kProduceCodeCache;
|
| + } else if (strncmp(value, "=parse", 7) == 0) {
|
| + options.compile_options = v8::ScriptCompiler::kProduceParserCache;
|
| + } else if (strncmp(value, "=none", 6) == 0) {
|
| + options.compile_options = v8::ScriptCompiler::kNoCompileOptions;
|
| + } else {
|
| + printf("Unknown option to --cache.\n");
|
| + return false;
|
| + }
|
| + argv[i] = NULL;
|
| }
|
| }
|
|
|
|
|