Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Unified Diff: src/d8.cc

Issue 1845833002: [d8] remove utility context. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/d8.h ('k') | src/d8.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/d8.cc
diff --git a/src/d8.cc b/src/d8.cc
index d7e1b6ab06e6fa67638dd74f89434b5c78f6b404..c23c1a4a9c722f0839fd4ca4976c41e90b10cda0 100644
--- a/src/d8.cc
+++ b/src/d8.cc
@@ -251,7 +251,7 @@ CounterCollection* Shell::counters_ = &local_counters_;
base::LazyMutex Shell::context_mutex_;
const base::TimeTicks Shell::kInitialTicks =
base::TimeTicks::HighResolutionNow();
-Global<Context> Shell::utility_context_;
+Global<Function> Shell::stringify_function_;
base::LazyMutex Shell::workers_mutex_;
bool Shell::allow_new_workers_ = true;
i::List<Worker*> Shell::workers_;
@@ -412,24 +412,7 @@ bool Shell::ExecuteString(Isolate* isolate, Local<String> source,
}
#if !defined(V8_SHARED)
} else {
- v8::TryCatch try_catch(isolate);
- v8::Local<v8::Context> context =
- v8::Local<v8::Context>::New(isolate, utility_context_);
- v8::Context::Scope context_scope(context);
- Local<Object> global = context->Global();
- Local<Value> fun =
- global->Get(context, String::NewFromUtf8(isolate, "Stringify",
- v8::NewStringType::kNormal)
- .ToLocalChecked()).ToLocalChecked();
- Local<Value> argv[1] = {result};
- Local<Value> s;
- if (!Local<Function>::Cast(fun)
- ->Call(context, global, 1, argv)
- .ToLocal(&s)) {
- return true;
- }
- DCHECK(!try_catch.HasCaught());
- v8::String::Utf8Value str(s);
+ v8::String::Utf8Value str(Stringify(isolate, result));
fwrite(*str, sizeof(**str), str.length(), stdout);
printf("\n");
}
@@ -906,11 +889,11 @@ void Shell::Version(const v8::FunctionCallbackInfo<v8::Value>& args) {
void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) {
HandleScope handle_scope(isolate);
#ifndef V8_SHARED
- Local<Context> utility_context;
+ Local<Context> context;
bool enter_context = !isolate->InContext();
if (enter_context) {
- utility_context = Local<Context>::New(isolate, utility_context_);
- utility_context->Enter();
+ context = Local<Context>::New(isolate, evaluation_context_);
+ context->Enter();
}
#endif // !V8_SHARED
v8::String::Utf8Value exception(try_catch->Exception());
@@ -954,7 +937,7 @@ void Shell::ReportException(Isolate* isolate, v8::TryCatch* try_catch) {
}
printf("\n");
#ifndef V8_SHARED
- if (enter_context) utility_context->Exit();
+ if (enter_context) context->Exit();
#endif // !V8_SHARED
}
@@ -1057,47 +1040,37 @@ void Shell::AddHistogramSample(void* histogram, int sample) {
counter->AddSample(sample);
}
-
-void Shell::InstallUtilityScript(Isolate* isolate) {
- HandleScope scope(isolate);
- // If we use the utility context, we have to set the security tokens so that
- // utility, evaluation and debug context can all access each other.
- Local<ObjectTemplate> global_template = CreateGlobalTemplate(isolate);
- utility_context_.Reset(isolate, Context::New(isolate, NULL, global_template));
- v8::Local<v8::Context> utility_context =
- v8::Local<v8::Context>::New(isolate, utility_context_);
- v8::Local<v8::Context> evaluation_context =
+// Turn a value into a human-readable string.
+Local<String> Shell::Stringify(Isolate* isolate, Local<Value> value) {
+ v8::Local<v8::Context> context =
v8::Local<v8::Context>::New(isolate, evaluation_context_);
- utility_context->SetSecurityToken(Undefined(isolate));
- evaluation_context->SetSecurityToken(Undefined(isolate));
- v8::Context::Scope context_scope(utility_context);
-
- // Run the d8 shell utility script in the utility context
- int source_index = i::NativesCollection<i::D8>::GetIndex("d8");
- i::Vector<const char> shell_source =
- i::NativesCollection<i::D8>::GetScriptSource(source_index);
- i::Vector<const char> shell_source_name =
- i::NativesCollection<i::D8>::GetScriptName(source_index);
- Local<String> source =
- String::NewFromUtf8(isolate, shell_source.start(), NewStringType::kNormal,
- shell_source.length()).ToLocalChecked();
- Local<String> name =
- String::NewFromUtf8(isolate, shell_source_name.start(),
- NewStringType::kNormal,
- shell_source_name.length()).ToLocalChecked();
- ScriptOrigin origin(name);
- Local<Script> script =
- Script::Compile(utility_context, source, &origin).ToLocalChecked();
- script->Run(utility_context).ToLocalChecked();
- // Mark the d8 shell script as native to avoid it showing up as normal source
- // in the debugger.
- i::Handle<i::Object> compiled_script = Utils::OpenHandle(*script);
- i::Handle<i::Script> script_object = compiled_script->IsJSFunction()
- ? i::Handle<i::Script>(i::Script::cast(
- i::JSFunction::cast(*compiled_script)->shared()->script()))
- : i::Handle<i::Script>(i::Script::cast(
- i::SharedFunctionInfo::cast(*compiled_script)->script()));
- script_object->set_type(i::Script::TYPE_EXTENSION);
+ if (stringify_function_.IsEmpty()) {
+ int source_index = i::NativesCollection<i::D8>::GetIndex("d8");
+ i::Vector<const char> source_string =
+ i::NativesCollection<i::D8>::GetScriptSource(source_index);
+ i::Vector<const char> source_name =
+ i::NativesCollection<i::D8>::GetScriptName(source_index);
+ Local<String> source =
+ String::NewFromUtf8(isolate, source_string.start(),
+ NewStringType::kNormal, source_string.length())
+ .ToLocalChecked();
+ Local<String> name =
+ String::NewFromUtf8(isolate, source_name.start(),
+ NewStringType::kNormal, source_name.length())
+ .ToLocalChecked();
+ ScriptOrigin origin(name);
+ Local<Script> script =
+ Script::Compile(context, source, &origin).ToLocalChecked();
+ stringify_function_.Reset(
+ isolate, script->Run(context).ToLocalChecked().As<Function>());
+ }
+ Local<Function> fun = Local<Function>::New(isolate, stringify_function_);
+ Local<Value> argv[1] = {value};
+ v8::TryCatch try_catch(isolate);
+ MaybeLocal<Value> result =
+ fun->Call(context, Undefined(isolate), 1, argv).ToLocalChecked();
+ if (result.IsEmpty()) return String::Empty(isolate);
+ return result.ToLocalChecked().As<String>();
}
#endif // !V8_SHARED
@@ -2220,8 +2193,6 @@ MaybeLocal<Value> Shell::DeserializeValue(Isolate* isolate,
int* offset) {
DCHECK(offset);
EscapableHandleScope scope(isolate);
- // This function should not use utility_context_ because it is running on a
- // different thread.
Local<Value> result;
SerializationTag tag = data.ReadTag(offset);
@@ -2502,17 +2473,11 @@ int Shell::Main(int argc, char* argv[]) {
// Run interactive shell if explicitly requested or if no script has been
// executed, but never on --test
if (options.use_interactive_shell()) {
-#ifndef V8_SHARED
- InstallUtilityScript(isolate);
-#endif // !V8_SHARED
RunShell(isolate);
}
// Shut down contexts and collect garbage.
evaluation_context_.Reset();
-#ifndef V8_SHARED
- utility_context_.Reset();
-#endif // !V8_SHARED
CollectGarbage(isolate);
}
OnExit(isolate);
« no previous file with comments | « src/d8.h ('k') | src/d8.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698