Commit 3f80bacf authored by yangguo@chromium.org's avatar yangguo@chromium.org

added --stress-opt option to d8

Review URL: http://codereview.chromium.org/7134040

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8241 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 03a6c2b6
...@@ -268,6 +268,7 @@ Handle<Value> Shell::Uint16Array(const Arguments& args) { ...@@ -268,6 +268,7 @@ Handle<Value> Shell::Uint16Array(const Arguments& args) {
sizeof(uint16_t)); sizeof(uint16_t));
} }
Handle<Value> Shell::Int32Array(const Arguments& args) { Handle<Value> Shell::Int32Array(const Arguments& args) {
return CreateExternalArray(args, kExternalIntArray, sizeof(int32_t)); return CreateExternalArray(args, kExternalIntArray, sizeof(int32_t));
} }
...@@ -485,6 +486,33 @@ void Shell::AddHistogramSample(void* histogram, int sample) { ...@@ -485,6 +486,33 @@ void Shell::AddHistogramSample(void* histogram, int sample) {
counter->AddSample(sample); counter->AddSample(sample);
} }
void Shell::InstallUtilityScript() {
Locker lock;
HandleScope scope;
Context::Scope utility_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>::GetRawScriptSource(source_index);
i::Vector<const char> shell_source_name =
i::NativesCollection<i::D8>::GetScriptName(source_index);
Handle<String> source = String::New(shell_source.start(),
shell_source.length());
Handle<String> name = String::New(shell_source_name.start(),
shell_source_name.length());
Handle<Script> script = Script::Compile(source, name);
script->Run();
// 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::Smi::FromInt(i::Script::TYPE_NATIVE));
}
#ifdef COMPRESS_STARTUP_DATA_BZ2 #ifdef COMPRESS_STARTUP_DATA_BZ2
class BZip2Decompressor : public v8::StartupDataDecompressor { class BZip2Decompressor : public v8::StartupDataDecompressor {
...@@ -513,29 +541,7 @@ class BZip2Decompressor : public v8::StartupDataDecompressor { ...@@ -513,29 +541,7 @@ class BZip2Decompressor : public v8::StartupDataDecompressor {
}; };
#endif #endif
Handle<ObjectTemplate> Shell::CreateGlobalTemplate() {
void Shell::Initialize() {
#ifdef COMPRESS_STARTUP_DATA_BZ2
BZip2Decompressor startup_data_decompressor;
int bz2_result = startup_data_decompressor.Decompress();
if (bz2_result != BZ_OK) {
fprintf(stderr, "bzip error code: %d\n", bz2_result);
exit(1);
}
#endif
Shell::counter_map_ = new CounterMap();
// Set up counters
if (i::StrLength(i::FLAG_map_counters) != 0)
MapCounters(i::FLAG_map_counters);
if (i::FLAG_dump_counters) {
V8::SetCounterFunction(LookupCounter);
V8::SetCreateHistogramFunction(CreateHistogram);
V8::SetAddHistogramSampleFunction(AddHistogramSample);
}
// Initialize the global objects
HandleScope scope;
Handle<ObjectTemplate> global_template = ObjectTemplate::New(); Handle<ObjectTemplate> global_template = ObjectTemplate::New();
global_template->Set(String::New("print"), FunctionTemplate::New(Print)); global_template->Set(String::New("print"), FunctionTemplate::New(Print));
global_template->Set(String::New("write"), FunctionTemplate::New(Write)); global_template->Set(String::New("write"), FunctionTemplate::New(Write));
...@@ -576,6 +582,33 @@ void Shell::Initialize() { ...@@ -576,6 +582,33 @@ void Shell::Initialize() {
AddOSMethods(os_templ); AddOSMethods(os_templ);
global_template->Set(String::New("os"), os_templ); global_template->Set(String::New("os"), os_templ);
return global_template;
}
void Shell::Initialize() {
#ifdef COMPRESS_STARTUP_DATA_BZ2
BZip2Decompressor startup_data_decompressor;
int bz2_result = startup_data_decompressor.Decompress();
if (bz2_result != BZ_OK) {
fprintf(stderr, "bzip error code: %d\n", bz2_result);
exit(1);
}
#endif
Shell::counter_map_ = new CounterMap();
// Set up counters
if (i::StrLength(i::FLAG_map_counters) != 0)
MapCounters(i::FLAG_map_counters);
if (i::FLAG_dump_counters) {
V8::SetCounterFunction(LookupCounter);
V8::SetCreateHistogramFunction(CreateHistogram);
V8::SetAddHistogramSampleFunction(AddHistogramSample);
}
// Initialize the global objects
HandleScope scope;
Handle<ObjectTemplate> global_template = CreateGlobalTemplate();
utility_context_ = Context::New(NULL, global_template); utility_context_ = Context::New(NULL, global_template);
utility_context_->SetSecurityToken(Undefined()); utility_context_->SetSecurityToken(Undefined());
Context::Scope utility_scope(utility_context_); Context::Scope utility_scope(utility_context_);
...@@ -602,35 +635,25 @@ void Shell::Initialize() { ...@@ -602,35 +635,25 @@ void Shell::Initialize() {
utility_context_->Global()->Set(String::New("$debug"), utility_context_->Global()->Set(String::New("$debug"),
Utils::ToLocal(js_debug)); Utils::ToLocal(js_debug));
#endif #endif
}
// 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>::GetRawScriptSource(source_index);
i::Vector<const char> shell_source_name
= i::NativesCollection<i::D8>::GetScriptName(source_index);
Handle<String> source = String::New(shell_source.start(),
shell_source.length());
Handle<String> name = String::New(shell_source_name.start(),
shell_source_name.length());
Handle<Script> script = Script::Compile(source, name);
script->Run();
// Mark the d8 shell script as native to avoid it showing up as normal source void Shell::RenewEvaluationContext() {
// in the debugger. // Initialize the global objects
i::Handle<i::Object> compiled_script = Utils::OpenHandle(*script); HandleScope scope;
i::Handle<i::Script> script_object = compiled_script->IsJSFunction() Handle<ObjectTemplate> global_template = CreateGlobalTemplate();
? 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::Smi::FromInt(i::Script::TYPE_NATIVE));
// Create the evaluation context // (Re-)create the evaluation context
if (!evaluation_context_.IsEmpty()) {
evaluation_context_.Dispose();
}
evaluation_context_ = Context::New(NULL, global_template); evaluation_context_ = Context::New(NULL, global_template);
evaluation_context_->SetSecurityToken(Undefined()); evaluation_context_->SetSecurityToken(Undefined());
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
i::Debug* debug = i::Isolate::Current()->debug();
debug->Load();
// Set the security token of the debug context to allow access. // Set the security token of the debug context to allow access.
debug->debug_context()->set_security_token(HEAP->undefined_value()); debug->debug_context()->set_security_token(HEAP->undefined_value());
...@@ -762,21 +785,7 @@ void ShellThread::Run() { ...@@ -762,21 +785,7 @@ void ShellThread::Run() {
// Prepare the context for this thread. // Prepare the context for this thread.
Locker locker; Locker locker;
HandleScope scope; HandleScope scope;
Handle<ObjectTemplate> global_template = ObjectTemplate::New(); Handle<ObjectTemplate> global_template = Shell::CreateGlobalTemplate();
global_template->Set(String::New("print"),
FunctionTemplate::New(Shell::Print));
global_template->Set(String::New("write"),
FunctionTemplate::New(Shell::Write));
global_template->Set(String::New("read"),
FunctionTemplate::New(Shell::Read));
global_template->Set(String::New("readline"),
FunctionTemplate::New(Shell::ReadLine));
global_template->Set(String::New("load"),
FunctionTemplate::New(Shell::Load));
global_template->Set(String::New("yield"),
FunctionTemplate::New(Shell::Yield));
global_template->Set(String::New("version"),
FunctionTemplate::New(Shell::Version));
char* ptr = const_cast<char*>(files_.start()); char* ptr = const_cast<char*>(files_.start());
while ((ptr != NULL) && (*ptr != '\0')) { while ((ptr != NULL) && (*ptr != '\0')) {
...@@ -816,15 +825,7 @@ void ShellThread::Run() { ...@@ -816,15 +825,7 @@ void ShellThread::Run() {
} }
} }
int Shell::RunMain(int argc, char* argv[]) {
int Shell::Main(int argc, char* argv[]) {
i::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
if (i::FLAG_help) {
return 1;
}
Initialize();
bool run_shell = (argc == 1);
// Default use preemption if threads are created. // Default use preemption if threads are created.
bool use_preemption = true; bool use_preemption = true;
...@@ -835,16 +836,14 @@ int Shell::Main(int argc, char* argv[]) { ...@@ -835,16 +836,14 @@ int Shell::Main(int argc, char* argv[]) {
i::List<i::Thread*> threads(1); i::List<i::Thread*> threads(1);
{ {
// Acquire the V8 lock once initialization has finished. Since the thread // Since the thread below may spawn new threads accessing V8 holding the
// below may spawn new threads accessing V8 holding the V8 lock here is // V8 lock here is mandatory.
// mandatory.
Locker locker; Locker locker;
RenewEvaluationContext();
Context::Scope context_scope(evaluation_context_); Context::Scope context_scope(evaluation_context_);
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
char* str = argv[i]; char* str = argv[i];
if (strcmp(str, "--shell") == 0) { if (strcmp(str, "--preemption") == 0) {
run_shell = true;
} else if (strcmp(str, "--preemption") == 0) {
use_preemption = true; use_preemption = true;
} else if (strcmp(str, "--no-preemption") == 0) { } else if (strcmp(str, "--no-preemption") == 0) {
use_preemption = false; use_preemption = false;
...@@ -870,12 +869,11 @@ int Shell::Main(int argc, char* argv[]) { ...@@ -870,12 +869,11 @@ int Shell::Main(int argc, char* argv[]) {
// Execute argument given to -e option directly. // Execute argument given to -e option directly.
v8::HandleScope handle_scope; v8::HandleScope handle_scope;
v8::Handle<v8::String> file_name = v8::String::New("unnamed"); v8::Handle<v8::String> file_name = v8::String::New("unnamed");
v8::Handle<v8::String> source = v8::String::New(argv[i + 1]); v8::Handle<v8::String> source = v8::String::New(argv[++i]);
if (!ExecuteString(source, file_name, false, true)) { if (!ExecuteString(source, file_name, false, true)) {
OnExit(); OnExit();
return 1; return 1;
} }
i++;
} else if (strcmp(str, "-p") == 0 && i + 1 < argc) { } else if (strcmp(str, "-p") == 0 && i + 1 < argc) {
int size = 0; int size = 0;
const char* files = ReadChars(argv[++i], &size); const char* files = ReadChars(argv[++i], &size);
...@@ -907,16 +905,8 @@ int Shell::Main(int argc, char* argv[]) { ...@@ -907,16 +905,8 @@ int Shell::Main(int argc, char* argv[]) {
Locker::StartPreemption(preemption_interval); Locker::StartPreemption(preemption_interval);
} }
#ifdef ENABLE_DEBUGGER_SUPPORT
// Run the remote debugger if requested.
if (i::FLAG_remote_debugger) {
RunRemoteDebugger(i::FLAG_debugger_port);
return 0;
}
#endif
} }
if (run_shell)
RunShell();
for (int i = 0; i < threads.length(); i++) { for (int i = 0; i < threads.length(); i++) {
i::Thread* thread = threads[i]; i::Thread* thread = threads[i];
thread->Join(); thread->Join();
...@@ -927,6 +917,69 @@ int Shell::Main(int argc, char* argv[]) { ...@@ -927,6 +917,69 @@ int Shell::Main(int argc, char* argv[]) {
} }
int Shell::Main(int argc, char* argv[]) {
// Figure out if we're requested to stress the optimization
// infrastructure by running tests multiple times and forcing
// optimization in the last run.
bool FLAG_stress_opt = false;
bool FLAG_stress_deopt = false;
bool run_shell = (argc == 1);
for (int i = 0; i < argc; i++) {
if (strcmp(argv[i], "--stress-opt") == 0) {
FLAG_stress_opt = true;
argv[i] = NULL;
} else if (strcmp(argv[i], "--stress-deopt") == 0) {
FLAG_stress_deopt = true;
argv[i] = NULL;
} else if (strcmp(argv[i], "--noalways-opt") == 0) {
// No support for stressing if we can't use --always-opt.
FLAG_stress_opt = false;
FLAG_stress_deopt = false;
} else if (strcmp(argv[i], "--shell") == 0) {
run_shell = true;
argv[i] = NULL;
}
}
v8::V8::SetFlagsFromCommandLine(&argc, argv, true);
Initialize();
int result = 0;
if (FLAG_stress_opt || FLAG_stress_deopt) {
v8::Testing::SetStressRunType(
FLAG_stress_opt ? v8::Testing::kStressTypeOpt
: v8::Testing::kStressTypeDeopt);
int stress_runs = v8::Testing::GetStressRuns();
for (int i = 0; i < stress_runs && result == 0; i++) {
printf("============ Stress %d/%d ============\n", i + 1, stress_runs);
v8::Testing::PrepareStressRun(i);
result = RunMain(argc, argv);
}
printf("======== Full Deoptimization =======\n");
v8::Testing::DeoptimizeAll();
} else {
result = RunMain(argc, argv);
}
#ifdef ENABLE_DEBUGGER_SUPPORT
if (i::FLAG_remote_debugger) {
RunRemoteDebugger(i::FLAG_debugger_port);
return 0;
}
#endif
if (run_shell) {
InstallUtilityScript();
RunShell();
}
v8::V8::Dispose();
return result;
}
} // namespace v8 } // namespace v8
......
...@@ -120,7 +120,6 @@ class Shell: public i::AllStatic { ...@@ -120,7 +120,6 @@ class Shell: public i::AllStatic {
bool report_exceptions); bool report_exceptions);
static const char* ToCString(const v8::String::Utf8Value& value); static const char* ToCString(const v8::String::Utf8Value& value);
static void ReportException(TryCatch* try_catch); static void ReportException(TryCatch* try_catch);
static void Initialize();
static void OnExit(); static void OnExit();
static int* LookupCounter(const char* name); static int* LookupCounter(const char* name);
static void* CreateHistogram(const char* name, static void* CreateHistogram(const char* name,
...@@ -130,8 +129,14 @@ class Shell: public i::AllStatic { ...@@ -130,8 +129,14 @@ class Shell: public i::AllStatic {
static void AddHistogramSample(void* histogram, int sample); static void AddHistogramSample(void* histogram, int sample);
static void MapCounters(const char* name); static void MapCounters(const char* name);
static Handle<String> ReadFile(const char* name); static Handle<String> ReadFile(const char* name);
static void Initialize();
static void RenewEvaluationContext();
static void InstallUtilityScript();
static void RunShell(); static void RunShell();
static int RunScript(char* filename);
static int RunMain(int argc, char* argv[]);
static int Main(int argc, char* argv[]); static int Main(int argc, char* argv[]);
static Handle<ObjectTemplate> CreateGlobalTemplate();
static Handle<Array> GetCompletions(Handle<String> text, static Handle<Array> GetCompletions(Handle<String> text,
Handle<String> full); Handle<String> full);
#ifdef ENABLE_DEBUGGER_SUPPORT #ifdef ENABLE_DEBUGGER_SUPPORT
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment