| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 12426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12437 void ApiTestFuzzer::TearDown() { | 12437 void ApiTestFuzzer::TearDown() { |
| 12438 fuzzing_ = false; | 12438 fuzzing_ = false; |
| 12439 for (int i = 0; i < RegisterThreadedTest::count(); i++) { | 12439 for (int i = 0; i < RegisterThreadedTest::count(); i++) { |
| 12440 ApiTestFuzzer *fuzzer = RegisterThreadedTest::nth(i)->fuzzer_; | 12440 ApiTestFuzzer *fuzzer = RegisterThreadedTest::nth(i)->fuzzer_; |
| 12441 if (fuzzer != NULL) fuzzer->Join(); | 12441 if (fuzzer != NULL) fuzzer->Join(); |
| 12442 } | 12442 } |
| 12443 } | 12443 } |
| 12444 | 12444 |
| 12445 | 12445 |
| 12446 // Lets not be needlessly self-referential. | 12446 // Lets not be needlessly self-referential. |
| 12447 TEST(Threading1) { | 12447 UNINITIALIZED_TEST(Threading1) { |
| 12448 ApiTestFuzzer::SetUp(ApiTestFuzzer::FIRST_PART); | 12448 ApiTestFuzzer::SetUp(ApiTestFuzzer::FIRST_PART); |
| 12449 ApiTestFuzzer::RunAllTests(); | 12449 ApiTestFuzzer::RunAllTests(); |
| 12450 ApiTestFuzzer::TearDown(); | 12450 ApiTestFuzzer::TearDown(); |
| 12451 } | 12451 } |
| 12452 | 12452 |
| 12453 | 12453 |
| 12454 TEST(Threading2) { | 12454 UNINITIALIZED_TEST(Threading2) { |
| 12455 ApiTestFuzzer::SetUp(ApiTestFuzzer::SECOND_PART); | 12455 ApiTestFuzzer::SetUp(ApiTestFuzzer::SECOND_PART); |
| 12456 ApiTestFuzzer::RunAllTests(); | 12456 ApiTestFuzzer::RunAllTests(); |
| 12457 ApiTestFuzzer::TearDown(); | 12457 ApiTestFuzzer::TearDown(); |
| 12458 } | 12458 } |
| 12459 | 12459 |
| 12460 | 12460 |
| 12461 TEST(Threading3) { | 12461 UNINITIALIZED_TEST(Threading3) { |
| 12462 ApiTestFuzzer::SetUp(ApiTestFuzzer::THIRD_PART); | 12462 ApiTestFuzzer::SetUp(ApiTestFuzzer::THIRD_PART); |
| 12463 ApiTestFuzzer::RunAllTests(); | 12463 ApiTestFuzzer::RunAllTests(); |
| 12464 ApiTestFuzzer::TearDown(); | 12464 ApiTestFuzzer::TearDown(); |
| 12465 } | 12465 } |
| 12466 | 12466 |
| 12467 | 12467 |
| 12468 TEST(Threading4) { | 12468 UNINITIALIZED_TEST(Threading4) { |
| 12469 ApiTestFuzzer::SetUp(ApiTestFuzzer::FOURTH_PART); | 12469 ApiTestFuzzer::SetUp(ApiTestFuzzer::FOURTH_PART); |
| 12470 ApiTestFuzzer::RunAllTests(); | 12470 ApiTestFuzzer::RunAllTests(); |
| 12471 ApiTestFuzzer::TearDown(); | 12471 ApiTestFuzzer::TearDown(); |
| 12472 } | 12472 } |
| 12473 | 12473 |
| 12474 | 12474 |
| 12475 void ApiTestFuzzer::CallTest() { | 12475 void ApiTestFuzzer::CallTest() { |
| 12476 if (kLogThreading) | 12476 if (kLogThreading) |
| 12477 printf("Start test %d\n", test_number_); | 12477 printf("Start test %d\n", test_number_); |
| 12478 CallTestNumber(test_number_); | 12478 CallTestNumber(test_number_); |
| (...skipping 1826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14305 i::Semaphore block_; | 14305 i::Semaphore block_; |
| 14306 int gc_count_; | 14306 int gc_count_; |
| 14307 int gc_during_regexp_; | 14307 int gc_during_regexp_; |
| 14308 bool regexp_success_; | 14308 bool regexp_success_; |
| 14309 bool gc_success_; | 14309 bool gc_success_; |
| 14310 }; | 14310 }; |
| 14311 | 14311 |
| 14312 | 14312 |
| 14313 // Test that a regular expression execution can be interrupted and | 14313 // Test that a regular expression execution can be interrupted and |
| 14314 // survive a garbage collection. | 14314 // survive a garbage collection. |
| 14315 TEST(RegExpInterruption) { | 14315 UNINITIALIZED_TEST(RegExpInterruption) { |
| 14316 v8::Locker lock(CcTest::default_isolate()); | 14316 v8::Locker lock(CcTest::default_isolate()); |
| 14317 v8::V8::Initialize(); | 14317 v8::V8::Initialize(); |
| 14318 v8::HandleScope scope(CcTest::default_isolate()); | 14318 v8::HandleScope scope(CcTest::default_isolate()); |
| 14319 Local<Context> local_env; | 14319 Local<Context> local_env; |
| 14320 { | 14320 { |
| 14321 LocalContext env; | 14321 LocalContext env; |
| 14322 local_env = env.local(); | 14322 local_env = env.local(); |
| 14323 } | 14323 } |
| 14324 | 14324 |
| 14325 // Local context should still be live. | 14325 // Local context should still be live. |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14413 i::Semaphore block_; | 14413 i::Semaphore block_; |
| 14414 int gc_count_; | 14414 int gc_count_; |
| 14415 int gc_during_apply_; | 14415 int gc_during_apply_; |
| 14416 bool apply_success_; | 14416 bool apply_success_; |
| 14417 bool gc_success_; | 14417 bool gc_success_; |
| 14418 }; | 14418 }; |
| 14419 | 14419 |
| 14420 | 14420 |
| 14421 // Test that nothing bad happens if we get a preemption just when we were | 14421 // Test that nothing bad happens if we get a preemption just when we were |
| 14422 // about to do an apply(). | 14422 // about to do an apply(). |
| 14423 TEST(ApplyInterruption) { | 14423 UNINITIALIZED_TEST(ApplyInterruption) { |
| 14424 v8::Locker lock(CcTest::default_isolate()); | 14424 v8::Locker lock(CcTest::default_isolate()); |
| 14425 v8::V8::Initialize(); | 14425 v8::V8::Initialize(); |
| 14426 v8::HandleScope scope(CcTest::default_isolate()); | 14426 v8::HandleScope scope(CcTest::default_isolate()); |
| 14427 Local<Context> local_env; | 14427 Local<Context> local_env; |
| 14428 { | 14428 { |
| 14429 LocalContext env; | 14429 LocalContext env; |
| 14430 local_env = env.local(); | 14430 local_env = env.local(); |
| 14431 } | 14431 } |
| 14432 | 14432 |
| 14433 // Local context should still be live. | 14433 // Local context should still be live. |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14730 bool regexp_success_; | 14730 bool regexp_success_; |
| 14731 bool morph_success_; | 14731 bool morph_success_; |
| 14732 i::Handle<i::String> input_; | 14732 i::Handle<i::String> input_; |
| 14733 AsciiVectorResource ascii_resource_; | 14733 AsciiVectorResource ascii_resource_; |
| 14734 UC16VectorResource uc16_resource_; | 14734 UC16VectorResource uc16_resource_; |
| 14735 }; | 14735 }; |
| 14736 | 14736 |
| 14737 | 14737 |
| 14738 // Test that a regular expression execution can be interrupted and | 14738 // Test that a regular expression execution can be interrupted and |
| 14739 // the string changed without failing. | 14739 // the string changed without failing. |
| 14740 TEST(RegExpStringModification) { | 14740 UNINITIALIZED_TEST(RegExpStringModification) { |
| 14741 v8::Locker lock(CcTest::default_isolate()); | 14741 v8::Locker lock(CcTest::default_isolate()); |
| 14742 v8::V8::Initialize(); | 14742 v8::V8::Initialize(); |
| 14743 v8::HandleScope scope(CcTest::default_isolate()); | 14743 v8::HandleScope scope(CcTest::default_isolate()); |
| 14744 Local<Context> local_env; | 14744 Local<Context> local_env; |
| 14745 { | 14745 { |
| 14746 LocalContext env; | 14746 LocalContext env; |
| 14747 local_env = env.local(); | 14747 local_env = env.local(); |
| 14748 } | 14748 } |
| 14749 | 14749 |
| 14750 // Local context should still be live. | 14750 // Local context should still be live. |
| (...skipping 3439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18190 CHECK_EQ(false, global0->HasRealIndexedProperty(0)); | 18190 CHECK_EQ(false, global0->HasRealIndexedProperty(0)); |
| 18191 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); | 18191 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); |
| 18192 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); | 18192 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); |
| 18193 | 18193 |
| 18194 // Reset the failed access check callback so it does not influence | 18194 // Reset the failed access check callback so it does not influence |
| 18195 // the other tests. | 18195 // the other tests. |
| 18196 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); | 18196 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); |
| 18197 } | 18197 } |
| 18198 | 18198 |
| 18199 | 18199 |
| 18200 TEST(DefaultIsolateGetCurrent) { | |
| 18201 CHECK(v8::Isolate::GetCurrent() != NULL); | |
| 18202 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
| 18203 CHECK(reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate()); | |
| 18204 printf("*** %s\n", "DefaultIsolateGetCurrent success"); | |
| 18205 } | |
| 18206 | |
| 18207 | |
| 18208 TEST(IsolateNewDispose) { | 18200 TEST(IsolateNewDispose) { |
| 18209 v8::Isolate* current_isolate = v8::Isolate::GetCurrent(); | 18201 v8::Isolate* current_isolate = v8::Isolate::GetCurrent(); |
| 18210 v8::Isolate* isolate = v8::Isolate::New(); | 18202 v8::Isolate* isolate = v8::Isolate::New(); |
| 18211 CHECK(isolate != NULL); | 18203 CHECK(isolate != NULL); |
| 18212 CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate()); | 18204 CHECK(!reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate()); |
| 18213 CHECK(current_isolate != isolate); | 18205 CHECK(current_isolate != isolate); |
| 18214 CHECK(current_isolate == v8::Isolate::GetCurrent()); | 18206 CHECK(current_isolate == v8::Isolate::GetCurrent()); |
| 18215 | 18207 |
| 18216 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | 18208 v8::V8::SetFatalErrorHandler(StoringErrorCallback); |
| 18217 last_location = last_message = NULL; | 18209 last_location = last_message = NULL; |
| 18218 isolate->Dispose(); | 18210 isolate->Dispose(); |
| 18219 CHECK_EQ(last_location, NULL); | 18211 CHECK_EQ(last_location, NULL); |
| 18220 CHECK_EQ(last_message, NULL); | 18212 CHECK_EQ(last_message, NULL); |
| 18221 } | 18213 } |
| 18222 | 18214 |
| 18223 | 18215 |
| 18224 TEST(IsolateEnterExitDefault) { | 18216 UNINITIALIZED_TEST(DisposeIsolateWhenInUse) { |
| 18225 v8::Isolate* current_isolate = v8::Isolate::GetCurrent(); | |
| 18226 CHECK(current_isolate != NULL); // Default isolate. | |
| 18227 v8::HandleScope scope(current_isolate); | |
| 18228 LocalContext context; | |
| 18229 ExpectString("'hello'", "hello"); | |
| 18230 current_isolate->Enter(); | |
| 18231 ExpectString("'still working'", "still working"); | |
| 18232 current_isolate->Exit(); | |
| 18233 ExpectString("'still working 2'", "still working 2"); | |
| 18234 current_isolate->Exit(); | |
| 18235 // Default isolate is always, well, 'default current'. | |
| 18236 CHECK_EQ(v8::Isolate::GetCurrent(), current_isolate); | |
| 18237 // Still working since default isolate is auto-entering any thread | |
| 18238 // that has no isolate and attempts to execute V8 APIs. | |
| 18239 ExpectString("'still working 3'", "still working 3"); | |
| 18240 } | |
| 18241 | |
| 18242 | |
| 18243 TEST(DisposeDefaultIsolate) { | |
| 18244 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | |
| 18245 | |
| 18246 // Run some V8 code to trigger default isolate to become 'current'. | |
| 18247 v8::HandleScope scope(v8::Isolate::GetCurrent()); | |
| 18248 LocalContext context; | |
| 18249 ExpectString("'run some V8'", "run some V8"); | |
| 18250 | |
| 18251 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
| 18252 CHECK(reinterpret_cast<i::Isolate*>(isolate)->IsDefaultIsolate()); | |
| 18253 last_location = last_message = NULL; | |
| 18254 isolate->Dispose(); | |
| 18255 // It is not possible to dispose default isolate via Isolate API. | |
| 18256 CHECK_NE(last_location, NULL); | |
| 18257 CHECK_NE(last_message, NULL); | |
| 18258 } | |
| 18259 | |
| 18260 | |
| 18261 TEST(RunDefaultAndAnotherIsolate) { | |
| 18262 v8::HandleScope scope(v8::Isolate::GetCurrent()); | |
| 18263 LocalContext context; | |
| 18264 | |
| 18265 // Enter new isolate. | |
| 18266 v8::Isolate* isolate = v8::Isolate::New(); | 18217 v8::Isolate* isolate = v8::Isolate::New(); |
| 18267 CHECK(isolate); | 18218 CHECK(isolate); |
| 18268 isolate->Enter(); | 18219 isolate->Enter(); |
| 18269 { // Need this block because subsequent Exit() will deallocate Heap, | |
| 18270 // so we need all scope objects to be deconstructed when it happens. | |
| 18271 v8::HandleScope scope_new(isolate); | |
| 18272 LocalContext context_new; | |
| 18273 | |
| 18274 // Run something in new isolate. | |
| 18275 CompileRun("var foo = 153;"); | |
| 18276 ExpectTrue("function f() { return foo == 153; }; f()"); | |
| 18277 } | |
| 18278 isolate->Exit(); | |
| 18279 | |
| 18280 // This runs automatically in default isolate. | |
| 18281 // Variables in another isolate should be not available. | |
| 18282 ExpectTrue("function f() {" | |
| 18283 " try {" | |
| 18284 " foo;" | |
| 18285 " return false;" | |
| 18286 " } catch(e) {" | |
| 18287 " return true;" | |
| 18288 " }" | |
| 18289 "};" | |
| 18290 "var bar = 371;" | |
| 18291 "f()"); | |
| 18292 | |
| 18293 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | |
| 18294 last_location = last_message = NULL; | |
| 18295 isolate->Dispose(); | |
| 18296 CHECK_EQ(last_location, NULL); | |
| 18297 CHECK_EQ(last_message, NULL); | |
| 18298 | |
| 18299 // Check that default isolate still runs. | |
| 18300 ExpectTrue("function f() { return bar == 371; }; f()"); | |
| 18301 } | |
| 18302 | |
| 18303 | |
| 18304 TEST(DisposeIsolateWhenInUse) { | |
| 18305 v8::Isolate* isolate = v8::Isolate::New(); | |
| 18306 CHECK(isolate); | |
| 18307 isolate->Enter(); | |
| 18308 v8::HandleScope scope(isolate); | 18220 v8::HandleScope scope(isolate); |
| 18309 LocalContext context; | 18221 LocalContext context; |
| 18310 // Run something in this isolate. | 18222 // Run something in this isolate. |
| 18311 ExpectTrue("true"); | 18223 ExpectTrue("true"); |
| 18312 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | 18224 v8::V8::SetFatalErrorHandler(StoringErrorCallback); |
| 18313 last_location = last_message = NULL; | 18225 last_location = last_message = NULL; |
| 18314 // Still entered, should fail. | 18226 // Still entered, should fail. |
| 18315 isolate->Dispose(); | 18227 isolate->Dispose(); |
| 18316 CHECK_NE(last_location, NULL); | 18228 CHECK_NE(last_location, NULL); |
| 18317 CHECK_NE(last_message, NULL); | 18229 CHECK_NE(last_message, NULL); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18541 SetCreateHistogramFunction, | 18453 SetCreateHistogramFunction, |
| 18542 SetAddHistogramSampleFunction | 18454 SetAddHistogramSampleFunction |
| 18543 }; | 18455 }; |
| 18544 | 18456 |
| 18545 explicit InitDefaultIsolateThread(TestCase testCase) | 18457 explicit InitDefaultIsolateThread(TestCase testCase) |
| 18546 : Thread("InitDefaultIsolateThread"), | 18458 : Thread("InitDefaultIsolateThread"), |
| 18547 testCase_(testCase), | 18459 testCase_(testCase), |
| 18548 result_(false) { } | 18460 result_(false) { } |
| 18549 | 18461 |
| 18550 void Run() { | 18462 void Run() { |
| 18463 v8::Isolate* isolate = v8::Isolate::New(); |
| 18464 isolate->Enter(); |
| 18551 switch (testCase_) { | 18465 switch (testCase_) { |
| 18552 case IgnoreOOM: | 18466 case IgnoreOOM: |
| 18553 v8::V8::IgnoreOutOfMemoryException(); | 18467 v8::V8::IgnoreOutOfMemoryException(); |
| 18554 break; | 18468 break; |
| 18555 | 18469 |
| 18556 case SetResourceConstraints: { | 18470 case SetResourceConstraints: { |
| 18557 static const int K = 1024; | 18471 static const int K = 1024; |
| 18558 v8::ResourceConstraints constraints; | 18472 v8::ResourceConstraints constraints; |
| 18559 constraints.set_max_young_space_size(256 * K); | 18473 constraints.set_max_young_space_size(256 * K); |
| 18560 constraints.set_max_old_space_size(4 * K * K); | 18474 constraints.set_max_old_space_size(4 * K * K); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 18571 break; | 18485 break; |
| 18572 | 18486 |
| 18573 case SetCreateHistogramFunction: | 18487 case SetCreateHistogramFunction: |
| 18574 v8::V8::SetCreateHistogramFunction(NULL); | 18488 v8::V8::SetCreateHistogramFunction(NULL); |
| 18575 break; | 18489 break; |
| 18576 | 18490 |
| 18577 case SetAddHistogramSampleFunction: | 18491 case SetAddHistogramSampleFunction: |
| 18578 v8::V8::SetAddHistogramSampleFunction(NULL); | 18492 v8::V8::SetAddHistogramSampleFunction(NULL); |
| 18579 break; | 18493 break; |
| 18580 } | 18494 } |
| 18495 isolate->Exit(); |
| 18496 isolate->Dispose(); |
| 18581 result_ = true; | 18497 result_ = true; |
| 18582 } | 18498 } |
| 18583 | 18499 |
| 18584 bool result() { return result_; } | 18500 bool result() { return result_; } |
| 18585 | 18501 |
| 18586 private: | 18502 private: |
| 18587 TestCase testCase_; | 18503 TestCase testCase_; |
| 18588 bool result_; | 18504 bool result_; |
| 18589 }; | 18505 }; |
| 18590 | 18506 |
| (...skipping 1220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19811 CHECK(*v8::Utils::OpenHandle(*v8::Null(isolate)) == *null_value); | 19727 CHECK(*v8::Utils::OpenHandle(*v8::Null(isolate)) == *null_value); |
| 19812 i::Handle<i::Object> true_value = factory->true_value(); | 19728 i::Handle<i::Object> true_value = factory->true_value(); |
| 19813 CHECK(*v8::Utils::OpenHandle(*v8::True()) == *true_value); | 19729 CHECK(*v8::Utils::OpenHandle(*v8::True()) == *true_value); |
| 19814 CHECK(*v8::Utils::OpenHandle(*v8::True(isolate)) == *true_value); | 19730 CHECK(*v8::Utils::OpenHandle(*v8::True(isolate)) == *true_value); |
| 19815 i::Handle<i::Object> false_value = factory->false_value(); | 19731 i::Handle<i::Object> false_value = factory->false_value(); |
| 19816 CHECK(*v8::Utils::OpenHandle(*v8::False()) == *false_value); | 19732 CHECK(*v8::Utils::OpenHandle(*v8::False()) == *false_value); |
| 19817 CHECK(*v8::Utils::OpenHandle(*v8::False(isolate)) == *false_value); | 19733 CHECK(*v8::Utils::OpenHandle(*v8::False(isolate)) == *false_value); |
| 19818 } | 19734 } |
| 19819 | 19735 |
| 19820 | 19736 |
| 19821 TEST(IsolateEmbedderData) { | 19737 UNINITIALIZED_TEST(IsolateEmbedderData) { |
| 19822 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 19738 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 19823 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 19739 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 19824 CHECK_EQ(NULL, isolate->GetData()); | 19740 CHECK_EQ(NULL, isolate->GetData()); |
| 19825 CHECK_EQ(NULL, i_isolate->GetData()); | 19741 CHECK_EQ(NULL, i_isolate->GetData()); |
| 19826 static void* data1 = reinterpret_cast<void*>(0xacce55ed); | 19742 static void* data1 = reinterpret_cast<void*>(0xacce55ed); |
| 19827 isolate->SetData(data1); | 19743 isolate->SetData(data1); |
| 19828 CHECK_EQ(data1, isolate->GetData()); | 19744 CHECK_EQ(data1, isolate->GetData()); |
| 19829 CHECK_EQ(data1, i_isolate->GetData()); | 19745 CHECK_EQ(data1, i_isolate->GetData()); |
| 19830 static void* data2 = reinterpret_cast<void*>(0xdecea5ed); | 19746 static void* data2 = reinterpret_cast<void*>(0xdecea5ed); |
| 19831 i_isolate->SetData(data2); | 19747 i_isolate->SetData(data2); |
| (...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 20674 Local<Object> data2 = v8::Object::New(); | 20590 Local<Object> data2 = v8::Object::New(); |
| 20675 function_new_expected_env = data2; | 20591 function_new_expected_env = data2; |
| 20676 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); | 20592 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); |
| 20677 CHECK(!func2->IsNull()); | 20593 CHECK(!func2->IsNull()); |
| 20678 CHECK_NE(func, func2); | 20594 CHECK_NE(func, func2); |
| 20679 env->Global()->Set(v8_str("func2"), func2); | 20595 env->Global()->Set(v8_str("func2"), func2); |
| 20680 Local<Value> result2 = CompileRun("func2();"); | 20596 Local<Value> result2 = CompileRun("func2();"); |
| 20681 CHECK_EQ(v8::Integer::New(17, isolate), result2); | 20597 CHECK_EQ(v8::Integer::New(17, isolate), result2); |
| 20682 } | 20598 } |
| 20683 | 20599 |
| OLD | NEW |