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(); |
} |