| Index: test/cctest/test-deoptimization.cc
|
| diff --git a/test/cctest/test-deoptimization.cc b/test/cctest/test-deoptimization.cc
|
| index 262ffc1c3036eea8359ebea1cbd973df6dfd91c4..a201ccd7e47d1b1725b2c99fd6e783e300991dcf 100644
|
| --- a/test/cctest/test-deoptimization.cc
|
| +++ b/test/cctest/test-deoptimization.cc
|
| @@ -98,8 +98,8 @@ class AllowNativesSyntaxNoInlining {
|
|
|
| // Abort any ongoing incremental marking to make sure that all weak global
|
| // handle callbacks are processed.
|
| -static void NonIncrementalGC() {
|
| - CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
|
| +static void NonIncrementalGC(i::Isolate* isolate) {
|
| + isolate->heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask);
|
| }
|
|
|
|
|
| @@ -127,7 +127,7 @@ TEST(DeoptimizeSimple) {
|
| "function f() { g(); };"
|
| "f();");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| @@ -143,7 +143,7 @@ TEST(DeoptimizeSimple) {
|
| "function f(x) { if (x) { g(); } else { return } };"
|
| "f(true);");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| @@ -167,7 +167,7 @@ TEST(DeoptimizeSimpleWithArguments) {
|
| "function f(x, y, z) { g(1,x); y+z; };"
|
| "f(1, \"2\", false);");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| @@ -184,7 +184,7 @@ TEST(DeoptimizeSimpleWithArguments) {
|
| "function f(x, y, z) { if (x) { g(x, y); } else { return y + z; } };"
|
| "f(true, 1, \"2\");");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| @@ -209,7 +209,7 @@ TEST(DeoptimizeSimpleNested) {
|
| "function g(z) { count++; %DeoptimizeFunction(f); return z;}"
|
| "function f(x,y,z) { return h(x, y, g(z)); };"
|
| "result = f(1, 2, 3);");
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK_EQ(6, env->Global()->Get(v8_str("result"))->Int32Value());
|
| @@ -235,7 +235,7 @@ TEST(DeoptimizeRecursive) {
|
| "function f(x) { calls++; if (x > 0) { f(x - 1); } else { g(); } };"
|
| "f(10);");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK_EQ(11, env->Global()->Get(v8_str("calls"))->Int32Value());
|
| @@ -268,7 +268,7 @@ TEST(DeoptimizeMultiple) {
|
| "function f1(x) { return f2(x + 1, x + 1) + x; };"
|
| "result = f1(1);");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK_EQ(14, env->Global()->Get(v8_str("result"))->Int32Value());
|
| @@ -290,7 +290,7 @@ TEST(DeoptimizeConstructor) {
|
| "function f() { g(); };"
|
| "result = new f() instanceof f;");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK(env->Global()->Get(v8_str("result"))->IsTrue());
|
| @@ -307,7 +307,7 @@ TEST(DeoptimizeConstructor) {
|
| "result = new f(1, 2);"
|
| "result = result.x + result.y;");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK_EQ(3, env->Global()->Get(v8_str("result"))->Int32Value());
|
| @@ -337,7 +337,7 @@ TEST(DeoptimizeConstructorMultiple) {
|
| "function f1(x) { this.result = new f2(x + 1, x + 1).result + x; };"
|
| "result = new f1(1).result;");
|
| }
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(CcTest::i_isolate());
|
|
|
| CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| CHECK_EQ(14, env->Global()->Get(v8_str("result"))->Int32Value());
|
| @@ -345,51 +345,61 @@ TEST(DeoptimizeConstructorMultiple) {
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationADDString) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationADDString) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| AllowNativesSyntaxNoInlining options;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| -
|
| - const char* f_source = "function f(x, y) { return x + y; };";
|
| -
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| {
|
| - // Compile function f and collect to type feedback to insert binary op stub
|
| - // call in the optimized code.
|
| - i::FLAG_prepare_always_opt = true;
|
| - CompileRun("var count = 0;"
|
| - "var result = 0;"
|
| - "var deopt = false;"
|
| - "function X() { };"
|
| - "X.prototype.toString = function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(f); } return 'an X'"
|
| - "};");
|
| - CompileRun(f_source);
|
| - CompileRun("for (var i = 0; i < 5; i++) {"
|
| - " f('a+', new X());"
|
| - "};");
|
| -
|
| - // Compile an optimized version of f.
|
| - i::FLAG_always_opt = true;
|
| - CompileRun(f_source);
|
| - CompileRun("f('a+', new X());");
|
| - CHECK(!CcTest::i_isolate()->use_crankshaft() ||
|
| - GetJSFunction(env->Global(), "f")->IsOptimized());
|
| -
|
| - // Call f and force deoptimization while processing the binary operation.
|
| - CompileRun("deopt = true;"
|
| - "var result = f('a+', new X());");
|
| - }
|
| - NonIncrementalGC();
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + const char* f_source = "function f(x, y) { return x + y; };";
|
| +
|
| + {
|
| + // Compile function f and collect to type feedback to insert binary op
|
| + // stub call in the optimized code.
|
| + i::FLAG_prepare_always_opt = true;
|
| + CompileRun(
|
| + "var count = 0;"
|
| + "var result = 0;"
|
| + "var deopt = false;"
|
| + "function X() { };"
|
| + "X.prototype.toString = function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(f); } return 'an X'"
|
| + "};");
|
| + CompileRun(f_source);
|
| + CompileRun(
|
| + "for (var i = 0; i < 5; i++) {"
|
| + " f('a+', new X());"
|
| + "};");
|
| +
|
| + // Compile an optimized version of f.
|
| + i::FLAG_always_opt = true;
|
| + CompileRun(f_source);
|
| + CompileRun("f('a+', new X());");
|
| + CHECK(!i_isolate->use_crankshaft() ||
|
| + GetJSFunction(env->Global(), "f")->IsOptimized());
|
| +
|
| + // Call f and force deoptimization while processing the binary operation.
|
| + CompileRun(
|
| + "deopt = true;"
|
| + "var result = f('a+', new X());");
|
| + }
|
| + NonIncrementalGC(i_isolate);
|
|
|
| - CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - v8::Handle<v8::Value> result = env->Global()->Get(v8_str("result"));
|
| - CHECK(result->IsString());
|
| - v8::String::Utf8Value utf8(result);
|
| - CHECK_EQ("a+an X", *utf8);
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + v8::Handle<v8::Value> result = env->Global()->Get(v8_str("result"));
|
| + CHECK(result->IsString());
|
| + v8::String::Utf8Value utf8(result);
|
| + CHECK_EQ("a+an X", *utf8);
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| @@ -406,6 +416,7 @@ static void CompileConstructorWithDeoptimizingValueOf() {
|
|
|
| static void TestDeoptimizeBinaryOpHelper(LocalContext* env,
|
| const char* binary_op) {
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>((*env)->GetIsolate());
|
| EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> f_source_buffer;
|
| SNPrintF(f_source_buffer,
|
| "function f(x, y) { return x %s y; };",
|
| @@ -426,290 +437,355 @@ static void TestDeoptimizeBinaryOpHelper(LocalContext* env,
|
| i::FLAG_always_opt = true;
|
| CompileRun(f_source);
|
| CompileRun("f(7, new X());");
|
| - CHECK(!CcTest::i_isolate()->use_crankshaft() ||
|
| + CHECK(!i_isolate->use_crankshaft() ||
|
| GetJSFunction((*env)->Global(), "f")->IsOptimized());
|
|
|
| // Call f and force deoptimization while processing the binary operation.
|
| CompileRun("deopt = true;"
|
| "var result = f(7, new X());");
|
| - NonIncrementalGC();
|
| + NonIncrementalGC(i_isolate);
|
| CHECK(!GetJSFunction((*env)->Global(), "f")->IsOptimized());
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationADD) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationADD) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| + {
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
|
|
| - TestDeoptimizeBinaryOpHelper(&env, "+");
|
| + TestDeoptimizeBinaryOpHelper(&env, "+");
|
|
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(15, env->Global()->Get(v8_str("result"))->Int32Value());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(15, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationSUB) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationSUB) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| + {
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
|
|
| - TestDeoptimizeBinaryOpHelper(&env, "-");
|
| + TestDeoptimizeBinaryOpHelper(&env, "-");
|
|
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(-1, env->Global()->Get(v8_str("result"))->Int32Value());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(-1, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationMUL) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationMUL) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| + {
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
|
|
| - TestDeoptimizeBinaryOpHelper(&env, "*");
|
| + TestDeoptimizeBinaryOpHelper(&env, "*");
|
|
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(56, env->Global()->Get(v8_str("result"))->Int32Value());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(56, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationDIV) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationDIV) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| + {
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
|
|
| - TestDeoptimizeBinaryOpHelper(&env, "/");
|
| + TestDeoptimizeBinaryOpHelper(&env, "/");
|
|
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(0, env->Global()->Get(v8_str("result"))->Int32Value());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(0, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeBinaryOperationMOD) {
|
| +UNINITIALIZED_TEST(DeoptimizeBinaryOperationMOD) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| + {
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
|
|
| - TestDeoptimizeBinaryOpHelper(&env, "%");
|
| + TestDeoptimizeBinaryOpHelper(&env, "%");
|
|
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(7, env->Global()->Get(v8_str("result"))->Int32Value());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(7, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeCompare) {
|
| +UNINITIALIZED_TEST(DeoptimizeCompare) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| -
|
| - const char* f_source = "function f(x, y) { return x < y; };";
|
| -
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| {
|
| - AllowNativesSyntaxNoInlining options;
|
| - // Compile function f and collect to type feedback to insert compare ic
|
| - // call in the optimized code.
|
| - i::FLAG_prepare_always_opt = true;
|
| - CompileRun("var count = 0;"
|
| - "var result = 0;"
|
| - "var deopt = false;"
|
| - "function X() { };"
|
| - "X.prototype.toString = function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(f); } return 'b'"
|
| - "};");
|
| - CompileRun(f_source);
|
| - CompileRun("for (var i = 0; i < 5; i++) {"
|
| - " f('a', new X());"
|
| - "};");
|
| -
|
| - // Compile an optimized version of f.
|
| - i::FLAG_always_opt = true;
|
| - CompileRun(f_source);
|
| - CompileRun("f('a', new X());");
|
| - CHECK(!CcTest::i_isolate()->use_crankshaft() ||
|
| - GetJSFunction(env->Global(), "f")->IsOptimized());
|
| -
|
| - // Call f and force deoptimization while processing the comparison.
|
| - CompileRun("deopt = true;"
|
| - "var result = f('a', new X());");
|
| - }
|
| - NonIncrementalGC();
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + const char* f_source = "function f(x, y) { return x < y; };";
|
| +
|
| + {
|
| + AllowNativesSyntaxNoInlining options;
|
| + // Compile function f and collect to type feedback to insert compare ic
|
| + // call in the optimized code.
|
| + i::FLAG_prepare_always_opt = true;
|
| + CompileRun(
|
| + "var count = 0;"
|
| + "var result = 0;"
|
| + "var deopt = false;"
|
| + "function X() { };"
|
| + "X.prototype.toString = function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(f); } return 'b'"
|
| + "};");
|
| + CompileRun(f_source);
|
| + CompileRun(
|
| + "for (var i = 0; i < 5; i++) {"
|
| + " f('a', new X());"
|
| + "};");
|
| +
|
| + // Compile an optimized version of f.
|
| + i::FLAG_always_opt = true;
|
| + CompileRun(f_source);
|
| + CompileRun("f('a', new X());");
|
| + CHECK(!i_isolate->use_crankshaft() ||
|
| + GetJSFunction(env->Global(), "f")->IsOptimized());
|
| +
|
| + // Call f and force deoptimization while processing the comparison.
|
| + CompileRun(
|
| + "deopt = true;"
|
| + "var result = f('a', new X());");
|
| + }
|
| + NonIncrementalGC(i_isolate);
|
|
|
| - CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(true, env->Global()->Get(v8_str("result"))->BooleanValue());
|
| - CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(CcTest::i_isolate()));
|
| + CHECK(!GetJSFunction(env->Global(), "f")->IsOptimized());
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(true, env->Global()->Get(v8_str("result"))->BooleanValue());
|
| + CHECK_EQ(0, Deoptimizer::GetDeoptimizedCodeCount(i_isolate));
|
| + }
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeLoadICStoreIC) {
|
| +UNINITIALIZED_TEST(DeoptimizeLoadICStoreIC) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| -
|
| - // Functions to generate load/store/keyed load/keyed store IC calls.
|
| - const char* f1_source = "function f1(x) { return x.y; };";
|
| - const char* g1_source = "function g1(x) { x.y = 1; };";
|
| - const char* f2_source = "function f2(x, y) { return x[y]; };";
|
| - const char* g2_source = "function g2(x, y) { x[y] = 1; };";
|
| -
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| {
|
| - AllowNativesSyntaxNoInlining options;
|
| - // Compile functions and collect to type feedback to insert ic
|
| - // calls in the optimized code.
|
| - i::FLAG_prepare_always_opt = true;
|
| - CompileRun("var count = 0;"
|
| - "var result = 0;"
|
| - "var deopt = false;"
|
| - "function X() { };"
|
| - "X.prototype.__defineGetter__('y', function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(f1); };"
|
| - " return 13;"
|
| - "});"
|
| - "X.prototype.__defineSetter__('y', function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(g1); };"
|
| - "});"
|
| - "X.prototype.__defineGetter__('z', function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(f2); };"
|
| - " return 13;"
|
| - "});"
|
| - "X.prototype.__defineSetter__('z', function () {"
|
| - " if (deopt) { count++; %DeoptimizeFunction(g2); };"
|
| - "});");
|
| - CompileRun(f1_source);
|
| - CompileRun(g1_source);
|
| - CompileRun(f2_source);
|
| - CompileRun(g2_source);
|
| - CompileRun("for (var i = 0; i < 5; i++) {"
|
| - " f1(new X());"
|
| - " g1(new X());"
|
| - " f2(new X(), 'z');"
|
| - " g2(new X(), 'z');"
|
| - "};");
|
| -
|
| - // Compile an optimized version of the functions.
|
| - i::FLAG_always_opt = true;
|
| - CompileRun(f1_source);
|
| - CompileRun(g1_source);
|
| - CompileRun(f2_source);
|
| - CompileRun(g2_source);
|
| - CompileRun("f1(new X());");
|
| - CompileRun("g1(new X());");
|
| - CompileRun("f2(new X(), 'z');");
|
| - CompileRun("g2(new X(), 'z');");
|
| - if (CcTest::i_isolate()->use_crankshaft()) {
|
| - CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + // Functions to generate load/store/keyed load/keyed store IC calls.
|
| + const char* f1_source = "function f1(x) { return x.y; };";
|
| + const char* g1_source = "function g1(x) { x.y = 1; };";
|
| + const char* f2_source = "function f2(x, y) { return x[y]; };";
|
| + const char* g2_source = "function g2(x, y) { x[y] = 1; };";
|
| +
|
| + {
|
| + AllowNativesSyntaxNoInlining options;
|
| + // Compile functions and collect to type feedback to insert ic
|
| + // calls in the optimized code.
|
| + i::FLAG_prepare_always_opt = true;
|
| + CompileRun(
|
| + "var count = 0;"
|
| + "var result = 0;"
|
| + "var deopt = false;"
|
| + "function X() { };"
|
| + "X.prototype.__defineGetter__('y', function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(f1); };"
|
| + " return 13;"
|
| + "});"
|
| + "X.prototype.__defineSetter__('y', function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(g1); };"
|
| + "});"
|
| + "X.prototype.__defineGetter__('z', function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(f2); };"
|
| + " return 13;"
|
| + "});"
|
| + "X.prototype.__defineSetter__('z', function () {"
|
| + " if (deopt) { count++; %DeoptimizeFunction(g2); };"
|
| + "});");
|
| + CompileRun(f1_source);
|
| + CompileRun(g1_source);
|
| + CompileRun(f2_source);
|
| + CompileRun(g2_source);
|
| + CompileRun(
|
| + "for (var i = 0; i < 5; i++) {"
|
| + " f1(new X());"
|
| + " g1(new X());"
|
| + " f2(new X(), 'z');"
|
| + " g2(new X(), 'z');"
|
| + "};");
|
| +
|
| + // Compile an optimized version of the functions.
|
| + i::FLAG_always_opt = true;
|
| + CompileRun(f1_source);
|
| + CompileRun(g1_source);
|
| + CompileRun(f2_source);
|
| + CompileRun(g2_source);
|
| + CompileRun("f1(new X());");
|
| + CompileRun("g1(new X());");
|
| + CompileRun("f2(new X(), 'z');");
|
| + CompileRun("g2(new X(), 'z');");
|
| + if (i_isolate->use_crankshaft()) {
|
| + CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + }
|
| +
|
| + // Call functions and force deoptimization while processing the ics.
|
| + CompileRun(
|
| + "deopt = true;"
|
| + "var result = f1(new X());"
|
| + "g1(new X());"
|
| + "f2(new X(), 'z');"
|
| + "g2(new X(), 'z');");
|
| }
|
| -
|
| - // Call functions and force deoptimization while processing the ics.
|
| - CompileRun("deopt = true;"
|
| - "var result = f1(new X());"
|
| - "g1(new X());"
|
| - "f2(new X(), 'z');"
|
| - "g2(new X(), 'z');");
|
| + NonIncrementalGC(i_isolate);
|
| +
|
| + CHECK(!GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + CHECK_EQ(4, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(13, env->Global()->Get(v8_str("result"))->Int32Value());
|
| }
|
| - NonIncrementalGC();
|
| -
|
| - CHECK(!GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| - CHECK_EQ(4, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(13, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|
|
|
| -TEST(DeoptimizeLoadICStoreICNested) {
|
| +UNINITIALIZED_TEST(DeoptimizeLoadICStoreICNested) {
|
| i::FLAG_turbo_deoptimization = true;
|
| i::FLAG_concurrent_recompilation = false;
|
| - LocalContext env;
|
| - v8::HandleScope scope(env->GetIsolate());
|
| -
|
| - // Functions to generate load/store/keyed load/keyed store IC calls.
|
| - const char* f1_source = "function f1(x) { return x.y; };";
|
| - const char* g1_source = "function g1(x) { x.y = 1; };";
|
| - const char* f2_source = "function f2(x, y) { return x[y]; };";
|
| - const char* g2_source = "function g2(x, y) { x[y] = 1; };";
|
| -
|
| + v8::Isolate* isolate = v8::Isolate::New();
|
| + i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
|
| + isolate->Enter();
|
| {
|
| - AllowNativesSyntaxNoInlining options;
|
| - // Compile functions and collect to type feedback to insert ic
|
| - // calls in the optimized code.
|
| - i::FLAG_prepare_always_opt = true;
|
| - CompileRun("var count = 0;"
|
| - "var result = 0;"
|
| - "var deopt = false;"
|
| - "function X() { };"
|
| - "X.prototype.__defineGetter__('y', function () {"
|
| - " g1(this);"
|
| - " return 13;"
|
| - "});"
|
| - "X.prototype.__defineSetter__('y', function () {"
|
| - " f2(this, 'z');"
|
| - "});"
|
| - "X.prototype.__defineGetter__('z', function () {"
|
| - " g2(this, 'z');"
|
| - "});"
|
| - "X.prototype.__defineSetter__('z', function () {"
|
| - " if (deopt) {"
|
| - " count++;"
|
| - " %DeoptimizeFunction(f1);"
|
| - " %DeoptimizeFunction(g1);"
|
| - " %DeoptimizeFunction(f2);"
|
| - " %DeoptimizeFunction(g2); };"
|
| - "});");
|
| - CompileRun(f1_source);
|
| - CompileRun(g1_source);
|
| - CompileRun(f2_source);
|
| - CompileRun(g2_source);
|
| - CompileRun("for (var i = 0; i < 5; i++) {"
|
| - " f1(new X());"
|
| - " g1(new X());"
|
| - " f2(new X(), 'z');"
|
| - " g2(new X(), 'z');"
|
| - "};");
|
| -
|
| - // Compile an optimized version of the functions.
|
| - i::FLAG_always_opt = true;
|
| - CompileRun(f1_source);
|
| - CompileRun(g1_source);
|
| - CompileRun(f2_source);
|
| - CompileRun(g2_source);
|
| - CompileRun("f1(new X());");
|
| - CompileRun("g1(new X());");
|
| - CompileRun("f2(new X(), 'z');");
|
| - CompileRun("g2(new X(), 'z');");
|
| - if (CcTest::i_isolate()->use_crankshaft()) {
|
| - CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| - CHECK(GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + LocalContext env(isolate);
|
| + v8::HandleScope scope(env->GetIsolate());
|
| +
|
| + // Functions to generate load/store/keyed load/keyed store IC calls.
|
| + const char* f1_source = "function f1(x) { return x.y; };";
|
| + const char* g1_source = "function g1(x) { x.y = 1; };";
|
| + const char* f2_source = "function f2(x, y) { return x[y]; };";
|
| + const char* g2_source = "function g2(x, y) { x[y] = 1; };";
|
| +
|
| + {
|
| + AllowNativesSyntaxNoInlining options;
|
| + // Compile functions and collect to type feedback to insert ic
|
| + // calls in the optimized code.
|
| + i::FLAG_prepare_always_opt = true;
|
| + CompileRun(
|
| + "var count = 0;"
|
| + "var result = 0;"
|
| + "var deopt = false;"
|
| + "function X() { };"
|
| + "X.prototype.__defineGetter__('y', function () {"
|
| + " g1(this);"
|
| + " return 13;"
|
| + "});"
|
| + "X.prototype.__defineSetter__('y', function () {"
|
| + " f2(this, 'z');"
|
| + "});"
|
| + "X.prototype.__defineGetter__('z', function () {"
|
| + " g2(this, 'z');"
|
| + "});"
|
| + "X.prototype.__defineSetter__('z', function () {"
|
| + " if (deopt) {"
|
| + " count++;"
|
| + " %DeoptimizeFunction(f1);"
|
| + " %DeoptimizeFunction(g1);"
|
| + " %DeoptimizeFunction(f2);"
|
| + " %DeoptimizeFunction(g2); };"
|
| + "});");
|
| + CompileRun(f1_source);
|
| + CompileRun(g1_source);
|
| + CompileRun(f2_source);
|
| + CompileRun(g2_source);
|
| + CompileRun(
|
| + "for (var i = 0; i < 5; i++) {"
|
| + " f1(new X());"
|
| + " g1(new X());"
|
| + " f2(new X(), 'z');"
|
| + " g2(new X(), 'z');"
|
| + "};");
|
| +
|
| + // Compile an optimized version of the functions.
|
| + i::FLAG_always_opt = true;
|
| + CompileRun(f1_source);
|
| + CompileRun(g1_source);
|
| + CompileRun(f2_source);
|
| + CompileRun(g2_source);
|
| + CompileRun("f1(new X());");
|
| + CompileRun("g1(new X());");
|
| + CompileRun("f2(new X(), 'z');");
|
| + CompileRun("g2(new X(), 'z');");
|
| + if (i_isolate->use_crankshaft()) {
|
| + CHECK(GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| + CHECK(GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + }
|
| +
|
| + // Call functions and force deoptimization while processing the ics.
|
| + CompileRun(
|
| + "deopt = true;"
|
| + "var result = f1(new X());");
|
| }
|
| + NonIncrementalGC(i_isolate);
|
|
|
| - // Call functions and force deoptimization while processing the ics.
|
| - CompileRun("deopt = true;"
|
| - "var result = f1(new X());");
|
| + CHECK(!GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| + CHECK(!GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| + CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| + CHECK_EQ(13, env->Global()->Get(v8_str("result"))->Int32Value());
|
| }
|
| - NonIncrementalGC();
|
| -
|
| - CHECK(!GetJSFunction(env->Global(), "f1")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "g1")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "f2")->IsOptimized());
|
| - CHECK(!GetJSFunction(env->Global(), "g2")->IsOptimized());
|
| - CHECK_EQ(1, env->Global()->Get(v8_str("count"))->Int32Value());
|
| - CHECK_EQ(13, env->Global()->Get(v8_str("result"))->Int32Value());
|
| + isolate->Exit();
|
| + isolate->Dispose();
|
| }
|
|
|