| 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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 } | 197 } |
| 198 | 198 |
| 199 // Local context should still be live. | 199 // Local context should still be live. |
| 200 CHECK(!local_env.IsEmpty()); | 200 CHECK(!local_env.IsEmpty()); |
| 201 local_env->Enter(); | 201 local_env->Enter(); |
| 202 | 202 |
| 203 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); | 203 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); |
| 204 CHECK(!undef.IsEmpty()); | 204 CHECK(!undef.IsEmpty()); |
| 205 CHECK(undef->IsUndefined()); | 205 CHECK(undef->IsUndefined()); |
| 206 | 206 |
| 207 const char* c_source = "1 + 2 + 3"; | 207 const char* source = "1 + 2 + 3"; |
| 208 Local<String> source = String::NewFromUtf8(CcTest::isolate(), c_source); | 208 Local<Script> script = v8_compile(source); |
| 209 Local<Script> script = Script::Compile(source); | |
| 210 CHECK_EQ(6, script->Run()->Int32Value()); | 209 CHECK_EQ(6, script->Run()->Int32Value()); |
| 211 | 210 |
| 212 local_env->Exit(); | 211 local_env->Exit(); |
| 213 } | 212 } |
| 214 | 213 |
| 215 | 214 |
| 216 THREADED_TEST(IsolateOfContext) { | 215 THREADED_TEST(IsolateOfContext) { |
| 217 v8::HandleScope scope(CcTest::isolate()); | 216 v8::HandleScope scope(CcTest::isolate()); |
| 218 v8::Handle<Context> env = Context::New(CcTest::isolate()); | 217 v8::Handle<Context> env = Context::New(CcTest::isolate()); |
| 219 | 218 |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 | 437 |
| 439 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); | 438 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); |
| 440 CHECK_EQ(v8_str("a"), value->Get(0)); | 439 CHECK_EQ(v8_str("a"), value->Get(0)); |
| 441 CHECK_EQ(v8_str("b"), value->Get(1)); | 440 CHECK_EQ(v8_str("b"), value->Get(1)); |
| 442 } | 441 } |
| 443 | 442 |
| 444 | 443 |
| 445 THREADED_TEST(Script) { | 444 THREADED_TEST(Script) { |
| 446 LocalContext env; | 445 LocalContext env; |
| 447 v8::HandleScope scope(env->GetIsolate()); | 446 v8::HandleScope scope(env->GetIsolate()); |
| 448 const char* c_source = "1 + 2 + 3"; | 447 const char* source = "1 + 2 + 3"; |
| 449 Local<String> source = String::NewFromUtf8(env->GetIsolate(), c_source); | 448 Local<Script> script = v8_compile(source); |
| 450 Local<Script> script = Script::Compile(source); | |
| 451 CHECK_EQ(6, script->Run()->Int32Value()); | 449 CHECK_EQ(6, script->Run()->Int32Value()); |
| 452 } | 450 } |
| 453 | 451 |
| 454 | 452 |
| 455 static uint16_t* AsciiToTwoByteString(const char* source) { | 453 static uint16_t* AsciiToTwoByteString(const char* source) { |
| 456 int array_length = i::StrLength(source) + 1; | 454 int array_length = i::StrLength(source) + 1; |
| 457 uint16_t* converted = i::NewArray<uint16_t>(array_length); | 455 uint16_t* converted = i::NewArray<uint16_t>(array_length); |
| 458 for (int i = 0; i < array_length; i++) converted[i] = source[i]; | 456 for (int i = 0; i < array_length; i++) converted[i] = source[i]; |
| 459 return converted; | 457 return converted; |
| 460 } | 458 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 519 | 517 |
| 520 THREADED_TEST(ScriptUsingStringResource) { | 518 THREADED_TEST(ScriptUsingStringResource) { |
| 521 int dispose_count = 0; | 519 int dispose_count = 0; |
| 522 const char* c_source = "1 + 2 * 3"; | 520 const char* c_source = "1 + 2 * 3"; |
| 523 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); | 521 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); |
| 524 { | 522 { |
| 525 LocalContext env; | 523 LocalContext env; |
| 526 v8::HandleScope scope(env->GetIsolate()); | 524 v8::HandleScope scope(env->GetIsolate()); |
| 527 TestResource* resource = new TestResource(two_byte_source, &dispose_count); | 525 TestResource* resource = new TestResource(two_byte_source, &dispose_count); |
| 528 Local<String> source = String::NewExternal(env->GetIsolate(), resource); | 526 Local<String> source = String::NewExternal(env->GetIsolate(), resource); |
| 529 Local<Script> script = Script::Compile(source); | 527 Local<Script> script = v8_compile(source); |
| 530 Local<Value> value = script->Run(); | 528 Local<Value> value = script->Run(); |
| 531 CHECK(value->IsNumber()); | 529 CHECK(value->IsNumber()); |
| 532 CHECK_EQ(7, value->Int32Value()); | 530 CHECK_EQ(7, value->Int32Value()); |
| 533 CHECK(source->IsExternal()); | 531 CHECK(source->IsExternal()); |
| 534 CHECK_EQ(resource, | 532 CHECK_EQ(resource, |
| 535 static_cast<TestResource*>(source->GetExternalStringResource())); | 533 static_cast<TestResource*>(source->GetExternalStringResource())); |
| 536 String::Encoding encoding = String::UNKNOWN_ENCODING; | 534 String::Encoding encoding = String::UNKNOWN_ENCODING; |
| 537 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 535 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
| 538 source->GetExternalStringResourceBase(&encoding)); | 536 source->GetExternalStringResourceBase(&encoding)); |
| 539 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); | 537 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 555 TestAsciiResource* resource = new TestAsciiResource(i::StrDup(c_source), | 553 TestAsciiResource* resource = new TestAsciiResource(i::StrDup(c_source), |
| 556 &dispose_count); | 554 &dispose_count); |
| 557 Local<String> source = String::NewExternal(env->GetIsolate(), resource); | 555 Local<String> source = String::NewExternal(env->GetIsolate(), resource); |
| 558 CHECK(source->IsExternalAscii()); | 556 CHECK(source->IsExternalAscii()); |
| 559 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 557 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
| 560 source->GetExternalAsciiStringResource()); | 558 source->GetExternalAsciiStringResource()); |
| 561 String::Encoding encoding = String::UNKNOWN_ENCODING; | 559 String::Encoding encoding = String::UNKNOWN_ENCODING; |
| 562 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 560 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
| 563 source->GetExternalStringResourceBase(&encoding)); | 561 source->GetExternalStringResourceBase(&encoding)); |
| 564 CHECK_EQ(String::ASCII_ENCODING, encoding); | 562 CHECK_EQ(String::ASCII_ENCODING, encoding); |
| 565 Local<Script> script = Script::Compile(source); | 563 Local<Script> script = v8_compile(source); |
| 566 Local<Value> value = script->Run(); | 564 Local<Value> value = script->Run(); |
| 567 CHECK(value->IsNumber()); | 565 CHECK(value->IsNumber()); |
| 568 CHECK_EQ(7, value->Int32Value()); | 566 CHECK_EQ(7, value->Int32Value()); |
| 569 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 567 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 570 CHECK_EQ(0, dispose_count); | 568 CHECK_EQ(0, dispose_count); |
| 571 } | 569 } |
| 572 CcTest::i_isolate()->compilation_cache()->Clear(); | 570 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 573 CcTest::heap()->CollectAllAvailableGarbage(); | 571 CcTest::heap()->CollectAllAvailableGarbage(); |
| 574 CHECK_EQ(1, dispose_count); | 572 CHECK_EQ(1, dispose_count); |
| 575 } | 573 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 587 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 585 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 588 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 586 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 589 CHECK_EQ(source->IsExternal(), false); | 587 CHECK_EQ(source->IsExternal(), false); |
| 590 CHECK_EQ(source->IsExternalAscii(), false); | 588 CHECK_EQ(source->IsExternalAscii(), false); |
| 591 String::Encoding encoding = String::UNKNOWN_ENCODING; | 589 String::Encoding encoding = String::UNKNOWN_ENCODING; |
| 592 CHECK_EQ(NULL, source->GetExternalStringResourceBase(&encoding)); | 590 CHECK_EQ(NULL, source->GetExternalStringResourceBase(&encoding)); |
| 593 CHECK_EQ(String::ASCII_ENCODING, encoding); | 591 CHECK_EQ(String::ASCII_ENCODING, encoding); |
| 594 bool success = source->MakeExternal(new TestResource(two_byte_source, | 592 bool success = source->MakeExternal(new TestResource(two_byte_source, |
| 595 &dispose_count)); | 593 &dispose_count)); |
| 596 CHECK(success); | 594 CHECK(success); |
| 597 Local<Script> script = Script::Compile(source); | 595 Local<Script> script = v8_compile(source); |
| 598 Local<Value> value = script->Run(); | 596 Local<Value> value = script->Run(); |
| 599 CHECK(value->IsNumber()); | 597 CHECK(value->IsNumber()); |
| 600 CHECK_EQ(7, value->Int32Value()); | 598 CHECK_EQ(7, value->Int32Value()); |
| 601 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 599 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 602 CHECK_EQ(0, dispose_count); | 600 CHECK_EQ(0, dispose_count); |
| 603 } | 601 } |
| 604 CcTest::i_isolate()->compilation_cache()->Clear(); | 602 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 605 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 603 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 606 CHECK_EQ(1, dispose_count); | 604 CHECK_EQ(1, dispose_count); |
| 607 } | 605 } |
| 608 | 606 |
| 609 | 607 |
| 610 THREADED_TEST(ScriptMakingExternalAsciiString) { | 608 THREADED_TEST(ScriptMakingExternalAsciiString) { |
| 611 int dispose_count = 0; | 609 int dispose_count = 0; |
| 612 const char* c_source = "1 + 2 * 3"; | 610 const char* c_source = "1 + 2 * 3"; |
| 613 { | 611 { |
| 614 LocalContext env; | 612 LocalContext env; |
| 615 v8::HandleScope scope(env->GetIsolate()); | 613 v8::HandleScope scope(env->GetIsolate()); |
| 616 Local<String> source = v8_str(c_source); | 614 Local<String> source = v8_str(c_source); |
| 617 // Trigger GCs so that the newly allocated string moves to old gen. | 615 // Trigger GCs so that the newly allocated string moves to old gen. |
| 618 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 616 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
| 619 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 617 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
| 620 bool success = source->MakeExternal( | 618 bool success = source->MakeExternal( |
| 621 new TestAsciiResource(i::StrDup(c_source), &dispose_count)); | 619 new TestAsciiResource(i::StrDup(c_source), &dispose_count)); |
| 622 CHECK(success); | 620 CHECK(success); |
| 623 Local<Script> script = Script::Compile(source); | 621 Local<Script> script = v8_compile(source); |
| 624 Local<Value> value = script->Run(); | 622 Local<Value> value = script->Run(); |
| 625 CHECK(value->IsNumber()); | 623 CHECK(value->IsNumber()); |
| 626 CHECK_EQ(7, value->Int32Value()); | 624 CHECK_EQ(7, value->Int32Value()); |
| 627 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 625 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 628 CHECK_EQ(0, dispose_count); | 626 CHECK_EQ(0, dispose_count); |
| 629 } | 627 } |
| 630 CcTest::i_isolate()->compilation_cache()->Clear(); | 628 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 631 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 629 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 632 CHECK_EQ(1, dispose_count); | 630 CHECK_EQ(1, dispose_count); |
| 633 } | 631 } |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 const char* c_source = "1 + 2 * 3"; | 862 const char* c_source = "1 + 2 * 3"; |
| 865 | 863 |
| 866 // Use a stack allocated external string resource allocated object. | 864 // Use a stack allocated external string resource allocated object. |
| 867 TestAsciiResourceWithDisposeControl::dispose_count = 0; | 865 TestAsciiResourceWithDisposeControl::dispose_count = 0; |
| 868 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 866 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
| 869 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); | 867 TestAsciiResourceWithDisposeControl res_stack(i::StrDup(c_source), false); |
| 870 { | 868 { |
| 871 LocalContext env; | 869 LocalContext env; |
| 872 v8::HandleScope scope(env->GetIsolate()); | 870 v8::HandleScope scope(env->GetIsolate()); |
| 873 Local<String> source = String::NewExternal(env->GetIsolate(), &res_stack); | 871 Local<String> source = String::NewExternal(env->GetIsolate(), &res_stack); |
| 874 Local<Script> script = Script::Compile(source); | 872 Local<Script> script = v8_compile(source); |
| 875 Local<Value> value = script->Run(); | 873 Local<Value> value = script->Run(); |
| 876 CHECK(value->IsNumber()); | 874 CHECK(value->IsNumber()); |
| 877 CHECK_EQ(7, value->Int32Value()); | 875 CHECK_EQ(7, value->Int32Value()); |
| 878 CcTest::heap()->CollectAllAvailableGarbage(); | 876 CcTest::heap()->CollectAllAvailableGarbage(); |
| 879 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); | 877 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 880 } | 878 } |
| 881 CcTest::i_isolate()->compilation_cache()->Clear(); | 879 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 882 CcTest::heap()->CollectAllAvailableGarbage(); | 880 CcTest::heap()->CollectAllAvailableGarbage(); |
| 883 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 881 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
| 884 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); | 882 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 885 | 883 |
| 886 // Use a heap allocated external string resource allocated object. | 884 // Use a heap allocated external string resource allocated object. |
| 887 TestAsciiResourceWithDisposeControl::dispose_count = 0; | 885 TestAsciiResourceWithDisposeControl::dispose_count = 0; |
| 888 TestAsciiResourceWithDisposeControl::dispose_calls = 0; | 886 TestAsciiResourceWithDisposeControl::dispose_calls = 0; |
| 889 TestAsciiResource* res_heap = | 887 TestAsciiResource* res_heap = |
| 890 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); | 888 new TestAsciiResourceWithDisposeControl(i::StrDup(c_source), true); |
| 891 { | 889 { |
| 892 LocalContext env; | 890 LocalContext env; |
| 893 v8::HandleScope scope(env->GetIsolate()); | 891 v8::HandleScope scope(env->GetIsolate()); |
| 894 Local<String> source = String::NewExternal(env->GetIsolate(), res_heap); | 892 Local<String> source = String::NewExternal(env->GetIsolate(), res_heap); |
| 895 Local<Script> script = Script::Compile(source); | 893 Local<Script> script = v8_compile(source); |
| 896 Local<Value> value = script->Run(); | 894 Local<Value> value = script->Run(); |
| 897 CHECK(value->IsNumber()); | 895 CHECK(value->IsNumber()); |
| 898 CHECK_EQ(7, value->Int32Value()); | 896 CHECK_EQ(7, value->Int32Value()); |
| 899 CcTest::heap()->CollectAllAvailableGarbage(); | 897 CcTest::heap()->CollectAllAvailableGarbage(); |
| 900 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); | 898 CHECK_EQ(0, TestAsciiResourceWithDisposeControl::dispose_count); |
| 901 } | 899 } |
| 902 CcTest::i_isolate()->compilation_cache()->Clear(); | 900 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 903 CcTest::heap()->CollectAllAvailableGarbage(); | 901 CcTest::heap()->CollectAllAvailableGarbage(); |
| 904 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); | 902 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_calls); |
| 905 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_count); | 903 CHECK_EQ(1, TestAsciiResourceWithDisposeControl::dispose_count); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 937 | 935 |
| 938 two_byte_source = AsciiToTwoByteString(two_byte_string_2); | 936 two_byte_source = AsciiToTwoByteString(two_byte_string_2); |
| 939 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source); | 937 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source); |
| 940 i::DeleteArray(two_byte_source); | 938 i::DeleteArray(two_byte_source); |
| 941 | 939 |
| 942 source = String::Concat(source, right); | 940 source = String::Concat(source, right); |
| 943 right = String::NewExternal( | 941 right = String::NewExternal( |
| 944 env->GetIsolate(), | 942 env->GetIsolate(), |
| 945 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); | 943 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); |
| 946 source = String::Concat(source, right); | 944 source = String::Concat(source, right); |
| 947 Local<Script> script = Script::Compile(source); | 945 Local<Script> script = v8_compile(source); |
| 948 Local<Value> value = script->Run(); | 946 Local<Value> value = script->Run(); |
| 949 CHECK(value->IsNumber()); | 947 CHECK(value->IsNumber()); |
| 950 CHECK_EQ(68, value->Int32Value()); | 948 CHECK_EQ(68, value->Int32Value()); |
| 951 } | 949 } |
| 952 CcTest::i_isolate()->compilation_cache()->Clear(); | 950 CcTest::i_isolate()->compilation_cache()->Clear(); |
| 953 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 951 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 954 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 952 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
| 955 } | 953 } |
| 956 | 954 |
| 957 | 955 |
| (...skipping 1432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2390 | 2388 |
| 2391 bottom = templ->GetFunction()->NewInstance(); | 2389 bottom = templ->GetFunction()->NewInstance(); |
| 2392 Local<v8::Object> top = templ->GetFunction()->NewInstance(); | 2390 Local<v8::Object> top = templ->GetFunction()->NewInstance(); |
| 2393 Local<v8::Object> middle = templ->GetFunction()->NewInstance(); | 2391 Local<v8::Object> middle = templ->GetFunction()->NewInstance(); |
| 2394 | 2392 |
| 2395 bottom->SetPrototype(middle); | 2393 bottom->SetPrototype(middle); |
| 2396 middle->SetPrototype(top); | 2394 middle->SetPrototype(top); |
| 2397 env->Global()->Set(v8_str("obj"), bottom); | 2395 env->Global()->Set(v8_str("obj"), bottom); |
| 2398 | 2396 |
| 2399 // Indexed and named get. | 2397 // Indexed and named get. |
| 2400 Script::Compile(v8_str("obj[0]"))->Run(); | 2398 CompileRun("obj[0]"); |
| 2401 Script::Compile(v8_str("obj.x"))->Run(); | 2399 CompileRun("obj.x"); |
| 2402 | 2400 |
| 2403 // Indexed and named set. | 2401 // Indexed and named set. |
| 2404 Script::Compile(v8_str("obj[1] = 42"))->Run(); | 2402 CompileRun("obj[1] = 42"); |
| 2405 Script::Compile(v8_str("obj.y = 42"))->Run(); | 2403 CompileRun("obj.y = 42"); |
| 2406 | 2404 |
| 2407 // Indexed and named query. | 2405 // Indexed and named query. |
| 2408 Script::Compile(v8_str("0 in obj"))->Run(); | 2406 CompileRun("0 in obj"); |
| 2409 Script::Compile(v8_str("'x' in obj"))->Run(); | 2407 CompileRun("'x' in obj"); |
| 2410 | 2408 |
| 2411 // Indexed and named deleter. | 2409 // Indexed and named deleter. |
| 2412 Script::Compile(v8_str("delete obj[0]"))->Run(); | 2410 CompileRun("delete obj[0]"); |
| 2413 Script::Compile(v8_str("delete obj.x"))->Run(); | 2411 CompileRun("delete obj.x"); |
| 2414 | 2412 |
| 2415 // Enumerators. | 2413 // Enumerators. |
| 2416 Script::Compile(v8_str("for (var p in obj) ;"))->Run(); | 2414 CompileRun("for (var p in obj) ;"); |
| 2417 } | 2415 } |
| 2418 | 2416 |
| 2419 | 2417 |
| 2420 static void PrePropertyHandlerGet( | 2418 static void PrePropertyHandlerGet( |
| 2421 Local<String> key, | 2419 Local<String> key, |
| 2422 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2420 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2423 ApiTestFuzzer::Fuzz(); | 2421 ApiTestFuzzer::Fuzz(); |
| 2424 if (v8_str("pre")->Equals(key)) { | 2422 if (v8_str("pre")->Equals(key)) { |
| 2425 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); | 2423 info.GetReturnValue().Set(v8_str("PrePropertyHandler: pre")); |
| 2426 } | 2424 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2437 | 2435 |
| 2438 | 2436 |
| 2439 THREADED_TEST(PrePropertyHandler) { | 2437 THREADED_TEST(PrePropertyHandler) { |
| 2440 v8::Isolate* isolate = CcTest::isolate(); | 2438 v8::Isolate* isolate = CcTest::isolate(); |
| 2441 v8::HandleScope scope(isolate); | 2439 v8::HandleScope scope(isolate); |
| 2442 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); | 2440 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
| 2443 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet, | 2441 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet, |
| 2444 0, | 2442 0, |
| 2445 PrePropertyHandlerQuery); | 2443 PrePropertyHandlerQuery); |
| 2446 LocalContext env(NULL, desc->InstanceTemplate()); | 2444 LocalContext env(NULL, desc->InstanceTemplate()); |
| 2447 Script::Compile(v8_str( | 2445 CompileRun("var pre = 'Object: pre'; var on = 'Object: on';"); |
| 2448 "var pre = 'Object: pre'; var on = 'Object: on';"))->Run(); | 2446 v8::Handle<Value> result_pre = CompileRun("pre"); |
| 2449 v8::Handle<Value> result_pre = Script::Compile(v8_str("pre"))->Run(); | |
| 2450 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre); | 2447 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre); |
| 2451 v8::Handle<Value> result_on = Script::Compile(v8_str("on"))->Run(); | 2448 v8::Handle<Value> result_on = CompileRun("on"); |
| 2452 CHECK_EQ(v8_str("Object: on"), result_on); | 2449 CHECK_EQ(v8_str("Object: on"), result_on); |
| 2453 v8::Handle<Value> result_post = Script::Compile(v8_str("post"))->Run(); | 2450 v8::Handle<Value> result_post = CompileRun("post"); |
| 2454 CHECK(result_post.IsEmpty()); | 2451 CHECK(result_post.IsEmpty()); |
| 2455 } | 2452 } |
| 2456 | 2453 |
| 2457 | 2454 |
| 2458 THREADED_TEST(UndefinedIsNotEnumerable) { | 2455 THREADED_TEST(UndefinedIsNotEnumerable) { |
| 2459 LocalContext env; | 2456 LocalContext env; |
| 2460 v8::HandleScope scope(env->GetIsolate()); | 2457 v8::HandleScope scope(env->GetIsolate()); |
| 2461 v8::Handle<Value> result = Script::Compile(v8_str( | 2458 v8::Handle<Value> result = CompileRun("this.propertyIsEnumerable(undefined)"); |
| 2462 "this.propertyIsEnumerable(undefined)"))->Run(); | |
| 2463 CHECK(result->IsFalse()); | 2459 CHECK(result->IsFalse()); |
| 2464 } | 2460 } |
| 2465 | 2461 |
| 2466 | 2462 |
| 2467 v8::Handle<Script> call_recursively_script; | 2463 v8::Handle<Script> call_recursively_script; |
| 2468 static const int kTargetRecursionDepth = 200; // near maximum | 2464 static const int kTargetRecursionDepth = 200; // near maximum |
| 2469 | 2465 |
| 2470 | 2466 |
| 2471 static void CallScriptRecursivelyCall( | 2467 static void CallScriptRecursivelyCall( |
| 2472 const v8::FunctionCallbackInfo<v8::Value>& args) { | 2468 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2505 global->Set(v8_str("callFunctionRecursively"), | 2501 global->Set(v8_str("callFunctionRecursively"), |
| 2506 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); | 2502 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); |
| 2507 LocalContext env(NULL, global); | 2503 LocalContext env(NULL, global); |
| 2508 | 2504 |
| 2509 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); | 2505 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); |
| 2510 call_recursively_script = v8_compile("callScriptRecursively()"); | 2506 call_recursively_script = v8_compile("callScriptRecursively()"); |
| 2511 call_recursively_script->Run(); | 2507 call_recursively_script->Run(); |
| 2512 call_recursively_script = v8::Handle<Script>(); | 2508 call_recursively_script = v8::Handle<Script>(); |
| 2513 | 2509 |
| 2514 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); | 2510 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); |
| 2515 Script::Compile(v8_str("callFunctionRecursively()"))->Run(); | 2511 CompileRun("callFunctionRecursively()"); |
| 2516 } | 2512 } |
| 2517 | 2513 |
| 2518 | 2514 |
| 2519 static void ThrowingPropertyHandlerGet( | 2515 static void ThrowingPropertyHandlerGet( |
| 2520 Local<String> key, | 2516 Local<String> key, |
| 2521 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2517 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2522 ApiTestFuzzer::Fuzz(); | 2518 ApiTestFuzzer::Fuzz(); |
| 2523 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); | 2519 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); |
| 2524 } | 2520 } |
| 2525 | 2521 |
| 2526 | 2522 |
| 2527 static void ThrowingPropertyHandlerSet( | 2523 static void ThrowingPropertyHandlerSet( |
| 2528 Local<String> key, | 2524 Local<String> key, |
| 2529 Local<Value>, | 2525 Local<Value>, |
| 2530 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2526 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 2531 info.GetIsolate()->ThrowException(key); | 2527 info.GetIsolate()->ThrowException(key); |
| 2532 info.GetReturnValue().SetUndefined(); // not the same as empty handle | 2528 info.GetReturnValue().SetUndefined(); // not the same as empty handle |
| 2533 } | 2529 } |
| 2534 | 2530 |
| 2535 | 2531 |
| 2536 THREADED_TEST(CallbackExceptionRegression) { | 2532 THREADED_TEST(CallbackExceptionRegression) { |
| 2537 v8::Isolate* isolate = CcTest::isolate(); | 2533 v8::Isolate* isolate = CcTest::isolate(); |
| 2538 v8::HandleScope scope(isolate); | 2534 v8::HandleScope scope(isolate); |
| 2539 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); | 2535 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); |
| 2540 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet, | 2536 obj->SetNamedPropertyHandler(ThrowingPropertyHandlerGet, |
| 2541 ThrowingPropertyHandlerSet); | 2537 ThrowingPropertyHandlerSet); |
| 2542 LocalContext env; | 2538 LocalContext env; |
| 2543 env->Global()->Set(v8_str("obj"), obj->NewInstance()); | 2539 env->Global()->Set(v8_str("obj"), obj->NewInstance()); |
| 2544 v8::Handle<Value> otto = Script::Compile(v8_str( | 2540 v8::Handle<Value> otto = CompileRun( |
| 2545 "try { with (obj) { otto; } } catch (e) { e; }"))->Run(); | 2541 "try { with (obj) { otto; } } catch (e) { e; }"); |
| 2546 CHECK_EQ(v8_str("otto"), otto); | 2542 CHECK_EQ(v8_str("otto"), otto); |
| 2547 v8::Handle<Value> netto = Script::Compile(v8_str( | 2543 v8::Handle<Value> netto = CompileRun( |
| 2548 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run(); | 2544 "try { with (obj) { netto = 4; } } catch (e) { e; }"); |
| 2549 CHECK_EQ(v8_str("netto"), netto); | 2545 CHECK_EQ(v8_str("netto"), netto); |
| 2550 } | 2546 } |
| 2551 | 2547 |
| 2552 | 2548 |
| 2553 THREADED_TEST(FunctionPrototype) { | 2549 THREADED_TEST(FunctionPrototype) { |
| 2554 v8::Isolate* isolate = CcTest::isolate(); | 2550 v8::Isolate* isolate = CcTest::isolate(); |
| 2555 v8::HandleScope scope(isolate); | 2551 v8::HandleScope scope(isolate); |
| 2556 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); | 2552 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); |
| 2557 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); | 2553 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); |
| 2558 LocalContext env; | 2554 LocalContext env; |
| 2559 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); | 2555 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); |
| 2560 Local<Script> script = Script::Compile(v8_str("Foo.prototype.plak")); | 2556 Local<Script> script = v8_compile("Foo.prototype.plak"); |
| 2561 CHECK_EQ(script->Run()->Int32Value(), 321); | 2557 CHECK_EQ(script->Run()->Int32Value(), 321); |
| 2562 } | 2558 } |
| 2563 | 2559 |
| 2564 | 2560 |
| 2565 THREADED_TEST(InternalFields) { | 2561 THREADED_TEST(InternalFields) { |
| 2566 LocalContext env; | 2562 LocalContext env; |
| 2567 v8::Isolate* isolate = env->GetIsolate(); | 2563 v8::Isolate* isolate = env->GetIsolate(); |
| 2568 v8::HandleScope scope(isolate); | 2564 v8::HandleScope scope(isolate); |
| 2569 | 2565 |
| 2570 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 2566 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3272 CHECK(!interceptor_for_hidden_properties_called); | 3268 CHECK(!interceptor_for_hidden_properties_called); |
| 3273 } | 3269 } |
| 3274 | 3270 |
| 3275 | 3271 |
| 3276 THREADED_TEST(External) { | 3272 THREADED_TEST(External) { |
| 3277 v8::HandleScope scope(CcTest::isolate()); | 3273 v8::HandleScope scope(CcTest::isolate()); |
| 3278 int x = 3; | 3274 int x = 3; |
| 3279 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); | 3275 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); |
| 3280 LocalContext env; | 3276 LocalContext env; |
| 3281 env->Global()->Set(v8_str("ext"), ext); | 3277 env->Global()->Set(v8_str("ext"), ext); |
| 3282 Local<Value> reext_obj = Script::Compile(v8_str("this.ext"))->Run(); | 3278 Local<Value> reext_obj = CompileRun("this.ext"); |
| 3283 v8::Handle<v8::External> reext = reext_obj.As<v8::External>(); | 3279 v8::Handle<v8::External> reext = reext_obj.As<v8::External>(); |
| 3284 int* ptr = static_cast<int*>(reext->Value()); | 3280 int* ptr = static_cast<int*>(reext->Value()); |
| 3285 CHECK_EQ(x, 3); | 3281 CHECK_EQ(x, 3); |
| 3286 *ptr = 10; | 3282 *ptr = 10; |
| 3287 CHECK_EQ(x, 10); | 3283 CHECK_EQ(x, 10); |
| 3288 | 3284 |
| 3289 // Make sure unaligned pointers are wrapped properly. | 3285 // Make sure unaligned pointers are wrapped properly. |
| 3290 char* data = i::StrDup("0123456789"); | 3286 char* data = i::StrDup("0123456789"); |
| 3291 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]); | 3287 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]); |
| 3292 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]); | 3288 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]); |
| (...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3943 heap->CollectGarbage(i::NEW_SPACE); | 3939 heap->CollectGarbage(i::NEW_SPACE); |
| 3944 | 3940 |
| 3945 // All objects should be gone. 7 global handles in total. | 3941 // All objects should be gone. 7 global handles in total. |
| 3946 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 3942 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
| 3947 } | 3943 } |
| 3948 | 3944 |
| 3949 | 3945 |
| 3950 THREADED_TEST(ScriptException) { | 3946 THREADED_TEST(ScriptException) { |
| 3951 LocalContext env; | 3947 LocalContext env; |
| 3952 v8::HandleScope scope(env->GetIsolate()); | 3948 v8::HandleScope scope(env->GetIsolate()); |
| 3953 Local<Script> script = Script::Compile(v8_str("throw 'panama!';")); | 3949 Local<Script> script = v8_compile("throw 'panama!';"); |
| 3954 v8::TryCatch try_catch; | 3950 v8::TryCatch try_catch; |
| 3955 Local<Value> result = script->Run(); | 3951 Local<Value> result = script->Run(); |
| 3956 CHECK(result.IsEmpty()); | 3952 CHECK(result.IsEmpty()); |
| 3957 CHECK(try_catch.HasCaught()); | 3953 CHECK(try_catch.HasCaught()); |
| 3958 String::Utf8Value exception_value(try_catch.Exception()); | 3954 String::Utf8Value exception_value(try_catch.Exception()); |
| 3959 CHECK_EQ(*exception_value, "panama!"); | 3955 CHECK_EQ(*exception_value, "panama!"); |
| 3960 } | 3956 } |
| 3961 | 3957 |
| 3962 | 3958 |
| 3963 TEST(TryCatchCustomException) { | 3959 TEST(TryCatchCustomException) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 3983 message_received = true; | 3979 message_received = true; |
| 3984 } | 3980 } |
| 3985 | 3981 |
| 3986 | 3982 |
| 3987 THREADED_TEST(MessageHandler0) { | 3983 THREADED_TEST(MessageHandler0) { |
| 3988 message_received = false; | 3984 message_received = false; |
| 3989 v8::HandleScope scope(CcTest::isolate()); | 3985 v8::HandleScope scope(CcTest::isolate()); |
| 3990 CHECK(!message_received); | 3986 CHECK(!message_received); |
| 3991 LocalContext context; | 3987 LocalContext context; |
| 3992 v8::V8::AddMessageListener(check_message_0, v8_num(5.76)); | 3988 v8::V8::AddMessageListener(check_message_0, v8_num(5.76)); |
| 3993 v8::ScriptOrigin origin = | 3989 v8::Handle<v8::Script> script = CompileWithOrigin("throw 'error'", "6.75"); |
| 3994 v8::ScriptOrigin(v8_str("6.75")); | |
| 3995 v8::Handle<v8::Script> script = Script::Compile(v8_str("throw 'error'"), | |
| 3996 &origin); | |
| 3997 script->Run(); | 3990 script->Run(); |
| 3998 CHECK(message_received); | 3991 CHECK(message_received); |
| 3999 // clear out the message listener | 3992 // clear out the message listener |
| 4000 v8::V8::RemoveMessageListeners(check_message_0); | 3993 v8::V8::RemoveMessageListeners(check_message_0); |
| 4001 } | 3994 } |
| 4002 | 3995 |
| 4003 | 3996 |
| 4004 static void check_message_1(v8::Handle<v8::Message> message, | 3997 static void check_message_1(v8::Handle<v8::Message> message, |
| 4005 v8::Handle<Value> data) { | 3998 v8::Handle<Value> data) { |
| 4006 CHECK(data->IsNumber()); | 3999 CHECK(data->IsNumber()); |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4162 | 4155 |
| 4163 | 4156 |
| 4164 THREADED_TEST(GetSetProperty) { | 4157 THREADED_TEST(GetSetProperty) { |
| 4165 LocalContext context; | 4158 LocalContext context; |
| 4166 v8::Isolate* isolate = context->GetIsolate(); | 4159 v8::Isolate* isolate = context->GetIsolate(); |
| 4167 v8::HandleScope scope(isolate); | 4160 v8::HandleScope scope(isolate); |
| 4168 context->Global()->Set(v8_str("foo"), v8_num(14)); | 4161 context->Global()->Set(v8_str("foo"), v8_num(14)); |
| 4169 context->Global()->Set(v8_str("12"), v8_num(92)); | 4162 context->Global()->Set(v8_str("12"), v8_num(92)); |
| 4170 context->Global()->Set(v8::Integer::New(isolate, 16), v8_num(32)); | 4163 context->Global()->Set(v8::Integer::New(isolate, 16), v8_num(32)); |
| 4171 context->Global()->Set(v8_num(13), v8_num(56)); | 4164 context->Global()->Set(v8_num(13), v8_num(56)); |
| 4172 Local<Value> foo = Script::Compile(v8_str("this.foo"))->Run(); | 4165 Local<Value> foo = CompileRun("this.foo"); |
| 4173 CHECK_EQ(14, foo->Int32Value()); | 4166 CHECK_EQ(14, foo->Int32Value()); |
| 4174 Local<Value> twelve = Script::Compile(v8_str("this[12]"))->Run(); | 4167 Local<Value> twelve = CompileRun("this[12]"); |
| 4175 CHECK_EQ(92, twelve->Int32Value()); | 4168 CHECK_EQ(92, twelve->Int32Value()); |
| 4176 Local<Value> sixteen = Script::Compile(v8_str("this[16]"))->Run(); | 4169 Local<Value> sixteen = CompileRun("this[16]"); |
| 4177 CHECK_EQ(32, sixteen->Int32Value()); | 4170 CHECK_EQ(32, sixteen->Int32Value()); |
| 4178 Local<Value> thirteen = Script::Compile(v8_str("this[13]"))->Run(); | 4171 Local<Value> thirteen = CompileRun("this[13]"); |
| 4179 CHECK_EQ(56, thirteen->Int32Value()); | 4172 CHECK_EQ(56, thirteen->Int32Value()); |
| 4180 CHECK_EQ(92, | 4173 CHECK_EQ(92, |
| 4181 context->Global()->Get(v8::Integer::New(isolate, 12))->Int32Value()); | 4174 context->Global()->Get(v8::Integer::New(isolate, 12))->Int32Value()); |
| 4182 CHECK_EQ(92, context->Global()->Get(v8_str("12"))->Int32Value()); | 4175 CHECK_EQ(92, context->Global()->Get(v8_str("12"))->Int32Value()); |
| 4183 CHECK_EQ(92, context->Global()->Get(v8_num(12))->Int32Value()); | 4176 CHECK_EQ(92, context->Global()->Get(v8_num(12))->Int32Value()); |
| 4184 CHECK_EQ(32, | 4177 CHECK_EQ(32, |
| 4185 context->Global()->Get(v8::Integer::New(isolate, 16))->Int32Value()); | 4178 context->Global()->Get(v8::Integer::New(isolate, 16))->Int32Value()); |
| 4186 CHECK_EQ(32, context->Global()->Get(v8_str("16"))->Int32Value()); | 4179 CHECK_EQ(32, context->Global()->Get(v8_str("16"))->Int32Value()); |
| 4187 CHECK_EQ(32, context->Global()->Get(v8_num(16))->Int32Value()); | 4180 CHECK_EQ(32, context->Global()->Get(v8_num(16))->Int32Value()); |
| 4188 CHECK_EQ(56, | 4181 CHECK_EQ(56, |
| 4189 context->Global()->Get(v8::Integer::New(isolate, 13))->Int32Value()); | 4182 context->Global()->Get(v8::Integer::New(isolate, 13))->Int32Value()); |
| 4190 CHECK_EQ(56, context->Global()->Get(v8_str("13"))->Int32Value()); | 4183 CHECK_EQ(56, context->Global()->Get(v8_str("13"))->Int32Value()); |
| 4191 CHECK_EQ(56, context->Global()->Get(v8_num(13))->Int32Value()); | 4184 CHECK_EQ(56, context->Global()->Get(v8_num(13))->Int32Value()); |
| 4192 } | 4185 } |
| 4193 | 4186 |
| 4194 | 4187 |
| 4195 THREADED_TEST(PropertyAttributes) { | 4188 THREADED_TEST(PropertyAttributes) { |
| 4196 LocalContext context; | 4189 LocalContext context; |
| 4197 v8::HandleScope scope(context->GetIsolate()); | 4190 v8::HandleScope scope(context->GetIsolate()); |
| 4198 // none | 4191 // none |
| 4199 Local<String> prop = v8_str("none"); | 4192 Local<String> prop = v8_str("none"); |
| 4200 context->Global()->Set(prop, v8_num(7)); | 4193 context->Global()->Set(prop, v8_num(7)); |
| 4201 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4194 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); |
| 4202 // read-only | 4195 // read-only |
| 4203 prop = v8_str("read_only"); | 4196 prop = v8_str("read_only"); |
| 4204 context->Global()->Set(prop, v8_num(7), v8::ReadOnly); | 4197 context->Global()->Set(prop, v8_num(7), v8::ReadOnly); |
| 4205 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4198 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4206 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); | 4199 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); |
| 4207 Script::Compile(v8_str("read_only = 9"))->Run(); | 4200 CompileRun("read_only = 9"); |
| 4208 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4201 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4209 context->Global()->Set(prop, v8_num(10)); | 4202 context->Global()->Set(prop, v8_num(10)); |
| 4210 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4203 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); |
| 4211 // dont-delete | 4204 // dont-delete |
| 4212 prop = v8_str("dont_delete"); | 4205 prop = v8_str("dont_delete"); |
| 4213 context->Global()->Set(prop, v8_num(13), v8::DontDelete); | 4206 context->Global()->Set(prop, v8_num(13), v8::DontDelete); |
| 4214 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4207 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); |
| 4215 Script::Compile(v8_str("delete dont_delete"))->Run(); | 4208 CompileRun("delete dont_delete"); |
| 4216 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4209 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); |
| 4217 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); | 4210 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); |
| 4218 // dont-enum | 4211 // dont-enum |
| 4219 prop = v8_str("dont_enum"); | 4212 prop = v8_str("dont_enum"); |
| 4220 context->Global()->Set(prop, v8_num(28), v8::DontEnum); | 4213 context->Global()->Set(prop, v8_num(28), v8::DontEnum); |
| 4221 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); | 4214 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); |
| 4222 // absent | 4215 // absent |
| 4223 prop = v8_str("absent"); | 4216 prop = v8_str("absent"); |
| 4224 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4217 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); |
| 4225 Local<Value> fake_prop = v8_num(1); | 4218 Local<Value> fake_prop = v8_num(1); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4244 CHECK(array->Get(0)->IsUndefined()); | 4237 CHECK(array->Get(0)->IsUndefined()); |
| 4245 CHECK(!array->Has(0)); | 4238 CHECK(!array->Has(0)); |
| 4246 CHECK(array->Get(100)->IsUndefined()); | 4239 CHECK(array->Get(100)->IsUndefined()); |
| 4247 CHECK(!array->Has(100)); | 4240 CHECK(!array->Has(100)); |
| 4248 array->Set(2, v8_num(7)); | 4241 array->Set(2, v8_num(7)); |
| 4249 CHECK_EQ(3, array->Length()); | 4242 CHECK_EQ(3, array->Length()); |
| 4250 CHECK(!array->Has(0)); | 4243 CHECK(!array->Has(0)); |
| 4251 CHECK(!array->Has(1)); | 4244 CHECK(!array->Has(1)); |
| 4252 CHECK(array->Has(2)); | 4245 CHECK(array->Has(2)); |
| 4253 CHECK_EQ(7, array->Get(2)->Int32Value()); | 4246 CHECK_EQ(7, array->Get(2)->Int32Value()); |
| 4254 Local<Value> obj = Script::Compile(v8_str("[1, 2, 3]"))->Run(); | 4247 Local<Value> obj = CompileRun("[1, 2, 3]"); |
| 4255 Local<v8::Array> arr = obj.As<v8::Array>(); | 4248 Local<v8::Array> arr = obj.As<v8::Array>(); |
| 4256 CHECK_EQ(3, arr->Length()); | 4249 CHECK_EQ(3, arr->Length()); |
| 4257 CHECK_EQ(1, arr->Get(0)->Int32Value()); | 4250 CHECK_EQ(1, arr->Get(0)->Int32Value()); |
| 4258 CHECK_EQ(2, arr->Get(1)->Int32Value()); | 4251 CHECK_EQ(2, arr->Get(1)->Int32Value()); |
| 4259 CHECK_EQ(3, arr->Get(2)->Int32Value()); | 4252 CHECK_EQ(3, arr->Get(2)->Int32Value()); |
| 4260 array = v8::Array::New(context->GetIsolate(), 27); | 4253 array = v8::Array::New(context->GetIsolate(), 27); |
| 4261 CHECK_EQ(27, array->Length()); | 4254 CHECK_EQ(27, array->Length()); |
| 4262 array = v8::Array::New(context->GetIsolate(), -27); | 4255 array = v8::Array::New(context->GetIsolate(), -27); |
| 4263 CHECK_EQ(0, array->Length()); | 4256 CHECK_EQ(0, array->Length()); |
| 4264 } | 4257 } |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4415 static const int K = 1024; | 4408 static const int K = 1024; |
| 4416 v8::ResourceConstraints constraints; | 4409 v8::ResourceConstraints constraints; |
| 4417 constraints.set_max_young_space_size(256 * K); | 4410 constraints.set_max_young_space_size(256 * K); |
| 4418 constraints.set_max_old_space_size(5 * K * K); | 4411 constraints.set_max_old_space_size(5 * K * K); |
| 4419 v8::SetResourceConstraints(CcTest::isolate(), &constraints); | 4412 v8::SetResourceConstraints(CcTest::isolate(), &constraints); |
| 4420 | 4413 |
| 4421 // Execute a script that causes out of memory. | 4414 // Execute a script that causes out of memory. |
| 4422 LocalContext context; | 4415 LocalContext context; |
| 4423 v8::HandleScope scope(context->GetIsolate()); | 4416 v8::HandleScope scope(context->GetIsolate()); |
| 4424 v8::V8::IgnoreOutOfMemoryException(); | 4417 v8::V8::IgnoreOutOfMemoryException(); |
| 4425 Local<Script> script = Script::Compile(String::NewFromUtf8( | 4418 Local<Value> result = CompileRun(js_code_causing_out_of_memory); |
| 4426 context->GetIsolate(), js_code_causing_out_of_memory)); | |
| 4427 Local<Value> result = script->Run(); | |
| 4428 | 4419 |
| 4429 // Check for out of memory state. | 4420 // Check for out of memory state. |
| 4430 CHECK(result.IsEmpty()); | 4421 CHECK(result.IsEmpty()); |
| 4431 CHECK(context->HasOutOfMemoryException()); | 4422 CHECK(context->HasOutOfMemoryException()); |
| 4432 } | 4423 } |
| 4433 | 4424 |
| 4434 | 4425 |
| 4435 void ProvokeOutOfMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4426 void ProvokeOutOfMemory(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 4436 ApiTestFuzzer::Fuzz(); | 4427 ApiTestFuzzer::Fuzz(); |
| 4437 | 4428 |
| 4438 LocalContext context; | 4429 LocalContext context; |
| 4439 v8::HandleScope scope(context->GetIsolate()); | 4430 v8::HandleScope scope(context->GetIsolate()); |
| 4440 Local<Script> script = Script::Compile(String::NewFromUtf8( | 4431 Local<Value> result = CompileRun(js_code_causing_out_of_memory); |
| 4441 context->GetIsolate(), js_code_causing_out_of_memory)); | |
| 4442 Local<Value> result = script->Run(); | |
| 4443 | 4432 |
| 4444 // Check for out of memory state. | 4433 // Check for out of memory state. |
| 4445 CHECK(result.IsEmpty()); | 4434 CHECK(result.IsEmpty()); |
| 4446 CHECK(context->HasOutOfMemoryException()); | 4435 CHECK(context->HasOutOfMemoryException()); |
| 4447 | 4436 |
| 4448 args.GetReturnValue().Set(result); | 4437 args.GetReturnValue().Set(result); |
| 4449 } | 4438 } |
| 4450 | 4439 |
| 4451 | 4440 |
| 4452 TEST(OutOfMemoryNested) { | 4441 TEST(OutOfMemoryNested) { |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4730 } | 4719 } |
| 4731 | 4720 |
| 4732 | 4721 |
| 4733 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4722 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 4734 if (args.Length() < 1) { | 4723 if (args.Length() < 1) { |
| 4735 args.GetReturnValue().Set(false); | 4724 args.GetReturnValue().Set(false); |
| 4736 return; | 4725 return; |
| 4737 } | 4726 } |
| 4738 v8::HandleScope scope(args.GetIsolate()); | 4727 v8::HandleScope scope(args.GetIsolate()); |
| 4739 v8::TryCatch try_catch; | 4728 v8::TryCatch try_catch; |
| 4740 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run(); | 4729 Local<Value> result = CompileRun(args[0]->ToString()); |
| 4741 CHECK(!try_catch.HasCaught() || result.IsEmpty()); | 4730 CHECK(!try_catch.HasCaught() || result.IsEmpty()); |
| 4742 args.GetReturnValue().Set(try_catch.HasCaught()); | 4731 args.GetReturnValue().Set(try_catch.HasCaught()); |
| 4743 } | 4732 } |
| 4744 | 4733 |
| 4745 | 4734 |
| 4746 THREADED_TEST(APICatch) { | 4735 THREADED_TEST(APICatch) { |
| 4747 v8::Isolate* isolate = CcTest::isolate(); | 4736 v8::Isolate* isolate = CcTest::isolate(); |
| 4748 v8::HandleScope scope(isolate); | 4737 v8::HandleScope scope(isolate); |
| 4749 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 4738 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 4750 templ->Set(v8_str("ThrowFromC"), | 4739 templ->Set(v8_str("ThrowFromC"), |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4992 | 4981 |
| 4993 THREADED_TEST(ExternalScriptException) { | 4982 THREADED_TEST(ExternalScriptException) { |
| 4994 v8::Isolate* isolate = CcTest::isolate(); | 4983 v8::Isolate* isolate = CcTest::isolate(); |
| 4995 v8::HandleScope scope(isolate); | 4984 v8::HandleScope scope(isolate); |
| 4996 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 4985 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 4997 templ->Set(v8_str("ThrowFromC"), | 4986 templ->Set(v8_str("ThrowFromC"), |
| 4998 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 4987 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
| 4999 LocalContext context(0, templ); | 4988 LocalContext context(0, templ); |
| 5000 | 4989 |
| 5001 v8::TryCatch try_catch; | 4990 v8::TryCatch try_catch; |
| 5002 Local<Script> script | 4991 Local<Value> result = CompileRun("ThrowFromC(); throw 'panama';"); |
| 5003 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';")); | |
| 5004 Local<Value> result = script->Run(); | |
| 5005 CHECK(result.IsEmpty()); | 4992 CHECK(result.IsEmpty()); |
| 5006 CHECK(try_catch.HasCaught()); | 4993 CHECK(try_catch.HasCaught()); |
| 5007 String::Utf8Value exception_value(try_catch.Exception()); | 4994 String::Utf8Value exception_value(try_catch.Exception()); |
| 5008 CHECK_EQ("konto", *exception_value); | 4995 CHECK_EQ("konto", *exception_value); |
| 5009 } | 4996 } |
| 5010 | 4997 |
| 5011 | 4998 |
| 5012 | 4999 |
| 5013 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5000 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 5014 ApiTestFuzzer::Fuzz(); | 5001 ApiTestFuzzer::Fuzz(); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5186 CHECK(result->Get(v8::Integer::New(isolate, 3))->IsNull()); | 5173 CHECK(result->Get(v8::Integer::New(isolate, 3))->IsNull()); |
| 5187 CHECK(result->Get(v8::Integer::New(isolate, 4))->IsUndefined()); | 5174 CHECK(result->Get(v8::Integer::New(isolate, 4))->IsUndefined()); |
| 5188 } | 5175 } |
| 5189 | 5176 |
| 5190 | 5177 |
| 5191 THREADED_TEST(CatchZero) { | 5178 THREADED_TEST(CatchZero) { |
| 5192 LocalContext context; | 5179 LocalContext context; |
| 5193 v8::HandleScope scope(context->GetIsolate()); | 5180 v8::HandleScope scope(context->GetIsolate()); |
| 5194 v8::TryCatch try_catch; | 5181 v8::TryCatch try_catch; |
| 5195 CHECK(!try_catch.HasCaught()); | 5182 CHECK(!try_catch.HasCaught()); |
| 5196 Script::Compile(v8_str("throw 10"))->Run(); | 5183 CompileRun("throw 10"); |
| 5197 CHECK(try_catch.HasCaught()); | 5184 CHECK(try_catch.HasCaught()); |
| 5198 CHECK_EQ(10, try_catch.Exception()->Int32Value()); | 5185 CHECK_EQ(10, try_catch.Exception()->Int32Value()); |
| 5199 try_catch.Reset(); | 5186 try_catch.Reset(); |
| 5200 CHECK(!try_catch.HasCaught()); | 5187 CHECK(!try_catch.HasCaught()); |
| 5201 Script::Compile(v8_str("throw 0"))->Run(); | 5188 CompileRun("throw 0"); |
| 5202 CHECK(try_catch.HasCaught()); | 5189 CHECK(try_catch.HasCaught()); |
| 5203 CHECK_EQ(0, try_catch.Exception()->Int32Value()); | 5190 CHECK_EQ(0, try_catch.Exception()->Int32Value()); |
| 5204 } | 5191 } |
| 5205 | 5192 |
| 5206 | 5193 |
| 5207 THREADED_TEST(CatchExceptionFromWith) { | 5194 THREADED_TEST(CatchExceptionFromWith) { |
| 5208 LocalContext context; | 5195 LocalContext context; |
| 5209 v8::HandleScope scope(context->GetIsolate()); | 5196 v8::HandleScope scope(context->GetIsolate()); |
| 5210 v8::TryCatch try_catch; | 5197 v8::TryCatch try_catch; |
| 5211 CHECK(!try_catch.HasCaught()); | 5198 CHECK(!try_catch.HasCaught()); |
| 5212 Script::Compile(v8_str("var o = {}; with (o) { throw 42; }"))->Run(); | 5199 CompileRun("var o = {}; with (o) { throw 42; }"); |
| 5213 CHECK(try_catch.HasCaught()); | 5200 CHECK(try_catch.HasCaught()); |
| 5214 } | 5201 } |
| 5215 | 5202 |
| 5216 | 5203 |
| 5217 THREADED_TEST(TryCatchAndFinallyHidingException) { | 5204 THREADED_TEST(TryCatchAndFinallyHidingException) { |
| 5218 LocalContext context; | 5205 LocalContext context; |
| 5219 v8::HandleScope scope(context->GetIsolate()); | 5206 v8::HandleScope scope(context->GetIsolate()); |
| 5220 v8::TryCatch try_catch; | 5207 v8::TryCatch try_catch; |
| 5221 CHECK(!try_catch.HasCaught()); | 5208 CHECK(!try_catch.HasCaught()); |
| 5222 CompileRun("function f(k) { try { this[k]; } finally { return 0; } };"); | 5209 CompileRun("function f(k) { try { this[k]; } finally { return 0; } };"); |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5354 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); | 5341 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); |
| 5355 CHECK(not_a_number->SameValue(not_a_number)); | 5342 CHECK(not_a_number->SameValue(not_a_number)); |
| 5356 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); | 5343 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); |
| 5357 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); | 5344 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); |
| 5358 } | 5345 } |
| 5359 | 5346 |
| 5360 | 5347 |
| 5361 THREADED_TEST(MultiRun) { | 5348 THREADED_TEST(MultiRun) { |
| 5362 LocalContext context; | 5349 LocalContext context; |
| 5363 v8::HandleScope scope(context->GetIsolate()); | 5350 v8::HandleScope scope(context->GetIsolate()); |
| 5364 Local<Script> script = Script::Compile(v8_str("x")); | 5351 Local<Script> script = v8_compile("x"); |
| 5365 for (int i = 0; i < 10; i++) | 5352 for (int i = 0; i < 10; i++) |
| 5366 script->Run(); | 5353 script->Run(); |
| 5367 } | 5354 } |
| 5368 | 5355 |
| 5369 | 5356 |
| 5370 static void GetXValue(Local<String> name, | 5357 static void GetXValue(Local<String> name, |
| 5371 const v8::PropertyCallbackInfo<v8::Value>& info) { | 5358 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 5372 ApiTestFuzzer::Fuzz(); | 5359 ApiTestFuzzer::Fuzz(); |
| 5373 CHECK_EQ(info.Data(), v8_str("donut")); | 5360 CHECK_EQ(info.Data(), v8_str("donut")); |
| 5374 CHECK_EQ(name, v8_str("x")); | 5361 CHECK_EQ(name, v8_str("x")); |
| 5375 info.GetReturnValue().Set(name); | 5362 info.GetReturnValue().Set(name); |
| 5376 } | 5363 } |
| 5377 | 5364 |
| 5378 | 5365 |
| 5379 THREADED_TEST(SimplePropertyRead) { | 5366 THREADED_TEST(SimplePropertyRead) { |
| 5380 LocalContext context; | 5367 LocalContext context; |
| 5381 v8::Isolate* isolate = context->GetIsolate(); | 5368 v8::Isolate* isolate = context->GetIsolate(); |
| 5382 v8::HandleScope scope(isolate); | 5369 v8::HandleScope scope(isolate); |
| 5383 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5370 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5384 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 5371 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
| 5385 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5372 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5386 Local<Script> script = Script::Compile(v8_str("obj.x")); | 5373 Local<Script> script = v8_compile("obj.x"); |
| 5387 for (int i = 0; i < 10; i++) { | 5374 for (int i = 0; i < 10; i++) { |
| 5388 Local<Value> result = script->Run(); | 5375 Local<Value> result = script->Run(); |
| 5389 CHECK_EQ(result, v8_str("x")); | 5376 CHECK_EQ(result, v8_str("x")); |
| 5390 } | 5377 } |
| 5391 } | 5378 } |
| 5392 | 5379 |
| 5393 | 5380 |
| 5394 THREADED_TEST(DefinePropertyOnAPIAccessor) { | 5381 THREADED_TEST(DefinePropertyOnAPIAccessor) { |
| 5395 LocalContext context; | 5382 LocalContext context; |
| 5396 v8::Isolate* isolate = context->GetIsolate(); | 5383 v8::Isolate* isolate = context->GetIsolate(); |
| 5397 v8::HandleScope scope(isolate); | 5384 v8::HandleScope scope(isolate); |
| 5398 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5385 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5399 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 5386 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
| 5400 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5387 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5401 | 5388 |
| 5402 // Uses getOwnPropertyDescriptor to check the configurable status | 5389 // Uses getOwnPropertyDescriptor to check the configurable status |
| 5403 Local<Script> script_desc | 5390 Local<Script> script_desc = v8_compile( |
| 5404 = Script::Compile(v8_str("var prop = Object.getOwnPropertyDescriptor( " | 5391 "var prop = Object.getOwnPropertyDescriptor( " |
| 5405 "obj, 'x');" | 5392 "obj, 'x');" |
| 5406 "prop.configurable;")); | 5393 "prop.configurable;"); |
| 5407 Local<Value> result = script_desc->Run(); | 5394 Local<Value> result = script_desc->Run(); |
| 5408 CHECK_EQ(result->BooleanValue(), true); | 5395 CHECK_EQ(result->BooleanValue(), true); |
| 5409 | 5396 |
| 5410 // Redefine get - but still configurable | 5397 // Redefine get - but still configurable |
| 5411 Local<Script> script_define | 5398 Local<Script> script_define = v8_compile( |
| 5412 = Script::Compile(v8_str("var desc = { get: function(){return 42; }," | 5399 "var desc = { get: function(){return 42; }," |
| 5413 " configurable: true };" | 5400 " configurable: true };" |
| 5414 "Object.defineProperty(obj, 'x', desc);" | 5401 "Object.defineProperty(obj, 'x', desc);" |
| 5415 "obj.x")); | 5402 "obj.x"); |
| 5416 result = script_define->Run(); | 5403 result = script_define->Run(); |
| 5417 CHECK_EQ(result, v8_num(42)); | 5404 CHECK_EQ(result, v8_num(42)); |
| 5418 | 5405 |
| 5419 // Check that the accessor is still configurable | 5406 // Check that the accessor is still configurable |
| 5420 result = script_desc->Run(); | 5407 result = script_desc->Run(); |
| 5421 CHECK_EQ(result->BooleanValue(), true); | 5408 CHECK_EQ(result->BooleanValue(), true); |
| 5422 | 5409 |
| 5423 // Redefine to a non-configurable | 5410 // Redefine to a non-configurable |
| 5424 script_define | 5411 script_define = v8_compile( |
| 5425 = Script::Compile(v8_str("var desc = { get: function(){return 43; }," | 5412 "var desc = { get: function(){return 43; }," |
| 5426 " configurable: false };" | 5413 " configurable: false };" |
| 5427 "Object.defineProperty(obj, 'x', desc);" | 5414 "Object.defineProperty(obj, 'x', desc);" |
| 5428 "obj.x")); | 5415 "obj.x"); |
| 5429 result = script_define->Run(); | 5416 result = script_define->Run(); |
| 5430 CHECK_EQ(result, v8_num(43)); | 5417 CHECK_EQ(result, v8_num(43)); |
| 5431 result = script_desc->Run(); | 5418 result = script_desc->Run(); |
| 5432 CHECK_EQ(result->BooleanValue(), false); | 5419 CHECK_EQ(result->BooleanValue(), false); |
| 5433 | 5420 |
| 5434 // Make sure that it is not possible to redefine again | 5421 // Make sure that it is not possible to redefine again |
| 5435 v8::TryCatch try_catch; | 5422 v8::TryCatch try_catch; |
| 5436 result = script_define->Run(); | 5423 result = script_define->Run(); |
| 5437 CHECK(try_catch.HasCaught()); | 5424 CHECK(try_catch.HasCaught()); |
| 5438 String::Utf8Value exception_value(try_catch.Exception()); | 5425 String::Utf8Value exception_value(try_catch.Exception()); |
| 5439 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x"); | 5426 CHECK_EQ(*exception_value, "TypeError: Cannot redefine property: x"); |
| 5440 } | 5427 } |
| 5441 | 5428 |
| 5442 | 5429 |
| 5443 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { | 5430 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { |
| 5444 v8::Isolate* isolate = CcTest::isolate(); | 5431 v8::Isolate* isolate = CcTest::isolate(); |
| 5445 v8::HandleScope scope(isolate); | 5432 v8::HandleScope scope(isolate); |
| 5446 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5433 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5447 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 5434 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
| 5448 LocalContext context; | 5435 LocalContext context; |
| 5449 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5436 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5450 | 5437 |
| 5451 Local<Script> script_desc = Script::Compile(v8_str("var prop =" | 5438 Local<Script> script_desc = v8_compile( |
| 5452 "Object.getOwnPropertyDescriptor( " | 5439 "var prop =" |
| 5453 "obj, 'x');" | 5440 "Object.getOwnPropertyDescriptor( " |
| 5454 "prop.configurable;")); | 5441 "obj, 'x');" |
| 5442 "prop.configurable;"); |
| 5455 Local<Value> result = script_desc->Run(); | 5443 Local<Value> result = script_desc->Run(); |
| 5456 CHECK_EQ(result->BooleanValue(), true); | 5444 CHECK_EQ(result->BooleanValue(), true); |
| 5457 | 5445 |
| 5458 Local<Script> script_define = | 5446 Local<Script> script_define = v8_compile( |
| 5459 Script::Compile(v8_str("var desc = {get: function(){return 42; }," | 5447 "var desc = {get: function(){return 42; }," |
| 5460 " configurable: true };" | 5448 " configurable: true };" |
| 5461 "Object.defineProperty(obj, 'x', desc);" | 5449 "Object.defineProperty(obj, 'x', desc);" |
| 5462 "obj.x")); | 5450 "obj.x"); |
| 5463 result = script_define->Run(); | 5451 result = script_define->Run(); |
| 5464 CHECK_EQ(result, v8_num(42)); | 5452 CHECK_EQ(result, v8_num(42)); |
| 5465 | 5453 |
| 5466 | 5454 |
| 5467 result = script_desc->Run(); | 5455 result = script_desc->Run(); |
| 5468 CHECK_EQ(result->BooleanValue(), true); | 5456 CHECK_EQ(result->BooleanValue(), true); |
| 5469 | 5457 |
| 5470 | 5458 |
| 5471 script_define = | 5459 script_define = v8_compile( |
| 5472 Script::Compile(v8_str("var desc = {get: function(){return 43; }," | 5460 "var desc = {get: function(){return 43; }," |
| 5473 " configurable: false };" | 5461 " configurable: false };" |
| 5474 "Object.defineProperty(obj, 'x', desc);" | 5462 "Object.defineProperty(obj, 'x', desc);" |
| 5475 "obj.x")); | 5463 "obj.x"); |
| 5476 result = script_define->Run(); | 5464 result = script_define->Run(); |
| 5477 CHECK_EQ(result, v8_num(43)); | 5465 CHECK_EQ(result, v8_num(43)); |
| 5478 result = script_desc->Run(); | 5466 result = script_desc->Run(); |
| 5479 | 5467 |
| 5480 CHECK_EQ(result->BooleanValue(), false); | 5468 CHECK_EQ(result->BooleanValue(), false); |
| 5481 | 5469 |
| 5482 v8::TryCatch try_catch; | 5470 v8::TryCatch try_catch; |
| 5483 result = script_define->Run(); | 5471 result = script_define->Run(); |
| 5484 CHECK(try_catch.HasCaught()); | 5472 CHECK(try_catch.HasCaught()); |
| 5485 String::Utf8Value exception_value(try_catch.Exception()); | 5473 String::Utf8Value exception_value(try_catch.Exception()); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5664 } | 5652 } |
| 5665 | 5653 |
| 5666 | 5654 |
| 5667 THREADED_TEST(SimplePropertyWrite) { | 5655 THREADED_TEST(SimplePropertyWrite) { |
| 5668 v8::Isolate* isolate = CcTest::isolate(); | 5656 v8::Isolate* isolate = CcTest::isolate(); |
| 5669 v8::HandleScope scope(isolate); | 5657 v8::HandleScope scope(isolate); |
| 5670 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5658 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5671 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); | 5659 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); |
| 5672 LocalContext context; | 5660 LocalContext context; |
| 5673 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5661 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5674 Local<Script> script = Script::Compile(v8_str("obj.x = 4")); | 5662 Local<Script> script = v8_compile("obj.x = 4"); |
| 5675 for (int i = 0; i < 10; i++) { | 5663 for (int i = 0; i < 10; i++) { |
| 5676 CHECK(xValue.IsEmpty()); | 5664 CHECK(xValue.IsEmpty()); |
| 5677 script->Run(); | 5665 script->Run(); |
| 5678 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); | 5666 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); |
| 5679 xValue.Reset(); | 5667 xValue.Reset(); |
| 5680 } | 5668 } |
| 5681 } | 5669 } |
| 5682 | 5670 |
| 5683 | 5671 |
| 5684 THREADED_TEST(SetterOnly) { | 5672 THREADED_TEST(SetterOnly) { |
| 5685 v8::Isolate* isolate = CcTest::isolate(); | 5673 v8::Isolate* isolate = CcTest::isolate(); |
| 5686 v8::HandleScope scope(isolate); | 5674 v8::HandleScope scope(isolate); |
| 5687 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5675 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5688 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); | 5676 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); |
| 5689 LocalContext context; | 5677 LocalContext context; |
| 5690 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5678 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5691 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); | 5679 Local<Script> script = v8_compile("obj.x = 4; obj.x"); |
| 5692 for (int i = 0; i < 10; i++) { | 5680 for (int i = 0; i < 10; i++) { |
| 5693 CHECK(xValue.IsEmpty()); | 5681 CHECK(xValue.IsEmpty()); |
| 5694 script->Run(); | 5682 script->Run(); |
| 5695 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); | 5683 CHECK_EQ(v8_num(4), Local<Value>::New(CcTest::isolate(), xValue)); |
| 5696 xValue.Reset(); | 5684 xValue.Reset(); |
| 5697 } | 5685 } |
| 5698 } | 5686 } |
| 5699 | 5687 |
| 5700 | 5688 |
| 5701 THREADED_TEST(NoAccessors) { | 5689 THREADED_TEST(NoAccessors) { |
| 5702 v8::Isolate* isolate = CcTest::isolate(); | 5690 v8::Isolate* isolate = CcTest::isolate(); |
| 5703 v8::HandleScope scope(isolate); | 5691 v8::HandleScope scope(isolate); |
| 5704 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5692 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5705 templ->SetAccessor(v8_str("x"), | 5693 templ->SetAccessor(v8_str("x"), |
| 5706 static_cast<v8::AccessorGetterCallback>(NULL), | 5694 static_cast<v8::AccessorGetterCallback>(NULL), |
| 5707 NULL, | 5695 NULL, |
| 5708 v8_str("donut")); | 5696 v8_str("donut")); |
| 5709 LocalContext context; | 5697 LocalContext context; |
| 5710 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5698 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5711 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); | 5699 Local<Script> script = v8_compile("obj.x = 4; obj.x"); |
| 5712 for (int i = 0; i < 10; i++) { | 5700 for (int i = 0; i < 10; i++) { |
| 5713 script->Run(); | 5701 script->Run(); |
| 5714 } | 5702 } |
| 5715 } | 5703 } |
| 5716 | 5704 |
| 5717 | 5705 |
| 5718 static void XPropertyGetter(Local<String> property, | 5706 static void XPropertyGetter(Local<String> property, |
| 5719 const v8::PropertyCallbackInfo<v8::Value>& info) { | 5707 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 5720 ApiTestFuzzer::Fuzz(); | 5708 ApiTestFuzzer::Fuzz(); |
| 5721 CHECK(info.Data()->IsUndefined()); | 5709 CHECK(info.Data()->IsUndefined()); |
| 5722 info.GetReturnValue().Set(property); | 5710 info.GetReturnValue().Set(property); |
| 5723 } | 5711 } |
| 5724 | 5712 |
| 5725 | 5713 |
| 5726 THREADED_TEST(NamedInterceptorPropertyRead) { | 5714 THREADED_TEST(NamedInterceptorPropertyRead) { |
| 5727 v8::Isolate* isolate = CcTest::isolate(); | 5715 v8::Isolate* isolate = CcTest::isolate(); |
| 5728 v8::HandleScope scope(isolate); | 5716 v8::HandleScope scope(isolate); |
| 5729 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5717 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5730 templ->SetNamedPropertyHandler(XPropertyGetter); | 5718 templ->SetNamedPropertyHandler(XPropertyGetter); |
| 5731 LocalContext context; | 5719 LocalContext context; |
| 5732 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5720 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5733 Local<Script> script = Script::Compile(v8_str("obj.x")); | 5721 Local<Script> script = v8_compile("obj.x"); |
| 5734 for (int i = 0; i < 10; i++) { | 5722 for (int i = 0; i < 10; i++) { |
| 5735 Local<Value> result = script->Run(); | 5723 Local<Value> result = script->Run(); |
| 5736 CHECK_EQ(result, v8_str("x")); | 5724 CHECK_EQ(result, v8_str("x")); |
| 5737 } | 5725 } |
| 5738 } | 5726 } |
| 5739 | 5727 |
| 5740 | 5728 |
| 5741 THREADED_TEST(NamedInterceptorDictionaryIC) { | 5729 THREADED_TEST(NamedInterceptorDictionaryIC) { |
| 5742 v8::Isolate* isolate = CcTest::isolate(); | 5730 v8::Isolate* isolate = CcTest::isolate(); |
| 5743 v8::HandleScope scope(isolate); | 5731 v8::HandleScope scope(isolate); |
| 5744 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5732 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5745 templ->SetNamedPropertyHandler(XPropertyGetter); | 5733 templ->SetNamedPropertyHandler(XPropertyGetter); |
| 5746 LocalContext context; | 5734 LocalContext context; |
| 5747 // Create an object with a named interceptor. | 5735 // Create an object with a named interceptor. |
| 5748 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance()); | 5736 context->Global()->Set(v8_str("interceptor_obj"), templ->NewInstance()); |
| 5749 Local<Script> script = Script::Compile(v8_str("interceptor_obj.x")); | 5737 Local<Script> script = v8_compile("interceptor_obj.x"); |
| 5750 for (int i = 0; i < 10; i++) { | 5738 for (int i = 0; i < 10; i++) { |
| 5751 Local<Value> result = script->Run(); | 5739 Local<Value> result = script->Run(); |
| 5752 CHECK_EQ(result, v8_str("x")); | 5740 CHECK_EQ(result, v8_str("x")); |
| 5753 } | 5741 } |
| 5754 // Create a slow case object and a function accessing a property in | 5742 // Create a slow case object and a function accessing a property in |
| 5755 // that slow case object (with dictionary probing in generated | 5743 // that slow case object (with dictionary probing in generated |
| 5756 // code). Then force object with a named interceptor into slow-case, | 5744 // code). Then force object with a named interceptor into slow-case, |
| 5757 // pass it to the function, and check that the interceptor is called | 5745 // pass it to the function, and check that the interceptor is called |
| 5758 // instead of accessing the local property. | 5746 // instead of accessing the local property. |
| 5759 Local<Value> result = | 5747 Local<Value> result = |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5862 | 5850 |
| 5863 | 5851 |
| 5864 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) { | 5852 THREADED_TEST(IndexedInterceptorWithIndexedAccessor) { |
| 5865 v8::Isolate* isolate = CcTest::isolate(); | 5853 v8::Isolate* isolate = CcTest::isolate(); |
| 5866 v8::HandleScope scope(isolate); | 5854 v8::HandleScope scope(isolate); |
| 5867 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5855 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5868 templ->SetIndexedPropertyHandler(IndexedPropertyGetter, | 5856 templ->SetIndexedPropertyHandler(IndexedPropertyGetter, |
| 5869 IndexedPropertySetter); | 5857 IndexedPropertySetter); |
| 5870 LocalContext context; | 5858 LocalContext context; |
| 5871 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5859 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5872 Local<Script> getter_script = Script::Compile(v8_str( | 5860 Local<Script> getter_script = v8_compile( |
| 5873 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];")); | 5861 "obj.__defineGetter__(\"3\", function(){return 5;});obj[3];"); |
| 5874 Local<Script> setter_script = Script::Compile(v8_str( | 5862 Local<Script> setter_script = v8_compile( |
| 5875 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});" | 5863 "obj.__defineSetter__(\"17\", function(val){this.foo = val;});" |
| 5876 "obj[17] = 23;" | 5864 "obj[17] = 23;" |
| 5877 "obj.foo;")); | 5865 "obj.foo;"); |
| 5878 Local<Script> interceptor_setter_script = Script::Compile(v8_str( | 5866 Local<Script> interceptor_setter_script = v8_compile( |
| 5879 "obj.__defineSetter__(\"39\", function(val){this.foo = \"hit\";});" | 5867 "obj.__defineSetter__(\"39\", function(val){this.foo = \"hit\";});" |
| 5880 "obj[39] = 47;" | 5868 "obj[39] = 47;" |
| 5881 "obj.foo;")); // This setter should not run, due to the interceptor. | 5869 "obj.foo;"); // This setter should not run, due to the interceptor. |
| 5882 Local<Script> interceptor_getter_script = Script::Compile(v8_str( | 5870 Local<Script> interceptor_getter_script = v8_compile( |
| 5883 "obj[37];")); | 5871 "obj[37];"); |
| 5884 Local<Value> result = getter_script->Run(); | 5872 Local<Value> result = getter_script->Run(); |
| 5885 CHECK_EQ(v8_num(5), result); | 5873 CHECK_EQ(v8_num(5), result); |
| 5886 result = setter_script->Run(); | 5874 result = setter_script->Run(); |
| 5887 CHECK_EQ(v8_num(23), result); | 5875 CHECK_EQ(v8_num(23), result); |
| 5888 result = interceptor_setter_script->Run(); | 5876 result = interceptor_setter_script->Run(); |
| 5889 CHECK_EQ(v8_num(23), result); | 5877 CHECK_EQ(v8_num(23), result); |
| 5890 result = interceptor_getter_script->Run(); | 5878 result = interceptor_getter_script->Run(); |
| 5891 CHECK_EQ(v8_num(625), result); | 5879 CHECK_EQ(v8_num(625), result); |
| 5892 } | 5880 } |
| 5893 | 5881 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 5909 ApiTestFuzzer::Fuzz(); | 5897 ApiTestFuzzer::Fuzz(); |
| 5910 if (index < 25) { | 5898 if (index < 25) { |
| 5911 info.GetReturnValue().Set(v8_num(index)); | 5899 info.GetReturnValue().Set(v8_num(index)); |
| 5912 } | 5900 } |
| 5913 } | 5901 } |
| 5914 | 5902 |
| 5915 | 5903 |
| 5916 void UnboxedDoubleIndexedPropertyEnumerator( | 5904 void UnboxedDoubleIndexedPropertyEnumerator( |
| 5917 const v8::PropertyCallbackInfo<v8::Array>& info) { | 5905 const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 5918 // Force the list of returned keys to be stored in a FastDoubleArray. | 5906 // Force the list of returned keys to be stored in a FastDoubleArray. |
| 5919 Local<Script> indexed_property_names_script = Script::Compile(v8_str( | 5907 Local<Script> indexed_property_names_script = v8_compile( |
| 5920 "keys = new Array(); keys[125000] = 1;" | 5908 "keys = new Array(); keys[125000] = 1;" |
| 5921 "for(i = 0; i < 80000; i++) { keys[i] = i; };" | 5909 "for(i = 0; i < 80000; i++) { keys[i] = i; };" |
| 5922 "keys.length = 25; keys;")); | 5910 "keys.length = 25; keys;"); |
| 5923 Local<Value> result = indexed_property_names_script->Run(); | 5911 Local<Value> result = indexed_property_names_script->Run(); |
| 5924 info.GetReturnValue().Set(Local<v8::Array>::Cast(result)); | 5912 info.GetReturnValue().Set(Local<v8::Array>::Cast(result)); |
| 5925 } | 5913 } |
| 5926 | 5914 |
| 5927 | 5915 |
| 5928 // Make sure that the the interceptor code in the runtime properly handles | 5916 // Make sure that the the interceptor code in the runtime properly handles |
| 5929 // merging property name lists for double-array-backed arrays. | 5917 // merging property name lists for double-array-backed arrays. |
| 5930 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) { | 5918 THREADED_TEST(IndexedInterceptorUnboxedDoubleWithIndexedAccessor) { |
| 5931 v8::Isolate* isolate = CcTest::isolate(); | 5919 v8::Isolate* isolate = CcTest::isolate(); |
| 5932 v8::HandleScope scope(isolate); | 5920 v8::HandleScope scope(isolate); |
| 5933 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5921 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5934 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter, | 5922 templ->SetIndexedPropertyHandler(UnboxedDoubleIndexedPropertyGetter, |
| 5935 UnboxedDoubleIndexedPropertySetter, | 5923 UnboxedDoubleIndexedPropertySetter, |
| 5936 0, | 5924 0, |
| 5937 0, | 5925 0, |
| 5938 UnboxedDoubleIndexedPropertyEnumerator); | 5926 UnboxedDoubleIndexedPropertyEnumerator); |
| 5939 LocalContext context; | 5927 LocalContext context; |
| 5940 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5928 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5941 // When obj is created, force it to be Stored in a FastDoubleArray. | 5929 // When obj is created, force it to be Stored in a FastDoubleArray. |
| 5942 Local<Script> create_unboxed_double_script = Script::Compile(v8_str( | 5930 Local<Script> create_unboxed_double_script = v8_compile( |
| 5943 "obj[125000] = 1; for(i = 0; i < 80000; i+=2) { obj[i] = i; } " | 5931 "obj[125000] = 1; for(i = 0; i < 80000; i+=2) { obj[i] = i; } " |
| 5944 "key_count = 0; " | 5932 "key_count = 0; " |
| 5945 "for (x in obj) {key_count++;};" | 5933 "for (x in obj) {key_count++;};" |
| 5946 "obj;")); | 5934 "obj;"); |
| 5947 Local<Value> result = create_unboxed_double_script->Run(); | 5935 Local<Value> result = create_unboxed_double_script->Run(); |
| 5948 CHECK(result->ToObject()->HasRealIndexedProperty(2000)); | 5936 CHECK(result->ToObject()->HasRealIndexedProperty(2000)); |
| 5949 Local<Script> key_count_check = Script::Compile(v8_str( | 5937 Local<Script> key_count_check = v8_compile("key_count;"); |
| 5950 "key_count;")); | |
| 5951 result = key_count_check->Run(); | 5938 result = key_count_check->Run(); |
| 5952 CHECK_EQ(v8_num(40013), result); | 5939 CHECK_EQ(v8_num(40013), result); |
| 5953 } | 5940 } |
| 5954 | 5941 |
| 5955 | 5942 |
| 5956 void NonStrictArgsIndexedPropertyEnumerator( | 5943 void NonStrictArgsIndexedPropertyEnumerator( |
| 5957 const v8::PropertyCallbackInfo<v8::Array>& info) { | 5944 const v8::PropertyCallbackInfo<v8::Array>& info) { |
| 5958 // Force the list of returned keys to be stored in a Arguments object. | 5945 // Force the list of returned keys to be stored in a Arguments object. |
| 5959 Local<Script> indexed_property_names_script = Script::Compile(v8_str( | 5946 Local<Script> indexed_property_names_script = v8_compile( |
| 5960 "function f(w,x) {" | 5947 "function f(w,x) {" |
| 5961 " return arguments;" | 5948 " return arguments;" |
| 5962 "}" | 5949 "}" |
| 5963 "keys = f(0, 1, 2, 3);" | 5950 "keys = f(0, 1, 2, 3);" |
| 5964 "keys;")); | 5951 "keys;"); |
| 5965 Local<Object> result = | 5952 Local<Object> result = |
| 5966 Local<Object>::Cast(indexed_property_names_script->Run()); | 5953 Local<Object>::Cast(indexed_property_names_script->Run()); |
| 5967 // Have to populate the handle manually, as it's not Cast-able. | 5954 // Have to populate the handle manually, as it's not Cast-able. |
| 5968 i::Handle<i::JSObject> o = | 5955 i::Handle<i::JSObject> o = |
| 5969 v8::Utils::OpenHandle<Object, i::JSObject>(result); | 5956 v8::Utils::OpenHandle<Object, i::JSObject>(result); |
| 5970 i::Handle<i::JSArray> array(reinterpret_cast<i::JSArray*>(*o)); | 5957 i::Handle<i::JSArray> array(reinterpret_cast<i::JSArray*>(*o)); |
| 5971 info.GetReturnValue().Set(v8::Utils::ToLocal(array)); | 5958 info.GetReturnValue().Set(v8::Utils::ToLocal(array)); |
| 5972 } | 5959 } |
| 5973 | 5960 |
| 5974 | 5961 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 5988 v8::Isolate* isolate = CcTest::isolate(); | 5975 v8::Isolate* isolate = CcTest::isolate(); |
| 5989 v8::HandleScope scope(isolate); | 5976 v8::HandleScope scope(isolate); |
| 5990 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5977 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 5991 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter, | 5978 templ->SetIndexedPropertyHandler(NonStrictIndexedPropertyGetter, |
| 5992 0, | 5979 0, |
| 5993 0, | 5980 0, |
| 5994 0, | 5981 0, |
| 5995 NonStrictArgsIndexedPropertyEnumerator); | 5982 NonStrictArgsIndexedPropertyEnumerator); |
| 5996 LocalContext context; | 5983 LocalContext context; |
| 5997 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 5984 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 5998 Local<Script> create_args_script = | 5985 Local<Script> create_args_script = v8_compile( |
| 5999 Script::Compile(v8_str( | 5986 "var key_count = 0;" |
| 6000 "var key_count = 0;" | 5987 "for (x in obj) {key_count++;} key_count;"); |
| 6001 "for (x in obj) {key_count++;} key_count;")); | |
| 6002 Local<Value> result = create_args_script->Run(); | 5988 Local<Value> result = create_args_script->Run(); |
| 6003 CHECK_EQ(v8_num(4), result); | 5989 CHECK_EQ(v8_num(4), result); |
| 6004 } | 5990 } |
| 6005 | 5991 |
| 6006 | 5992 |
| 6007 static void IdentityIndexedPropertyGetter( | 5993 static void IdentityIndexedPropertyGetter( |
| 6008 uint32_t index, | 5994 uint32_t index, |
| 6009 const v8::PropertyCallbackInfo<v8::Value>& info) { | 5995 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 6010 info.GetReturnValue().Set(index); | 5996 info.GetReturnValue().Set(index); |
| 6011 } | 5997 } |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6366 // to Object.prototype and Array.prototype and create a new | 6352 // to Object.prototype and Array.prototype and create a new |
| 6367 // environment. This should succeed. | 6353 // environment. This should succeed. |
| 6368 | 6354 |
| 6369 v8::HandleScope scope(CcTest::isolate()); | 6355 v8::HandleScope scope(CcTest::isolate()); |
| 6370 | 6356 |
| 6371 Local<String> source = v8_str("Object.prototype.obj = 1234;" | 6357 Local<String> source = v8_str("Object.prototype.obj = 1234;" |
| 6372 "Array.prototype.arr = 4567;" | 6358 "Array.prototype.arr = 4567;" |
| 6373 "8901"); | 6359 "8901"); |
| 6374 | 6360 |
| 6375 LocalContext env0; | 6361 LocalContext env0; |
| 6376 Local<Script> script0 = Script::Compile(source); | 6362 Local<Script> script0 = v8_compile(source); |
| 6377 CHECK_EQ(8901.0, script0->Run()->NumberValue()); | 6363 CHECK_EQ(8901.0, script0->Run()->NumberValue()); |
| 6378 | 6364 |
| 6379 LocalContext env1; | 6365 LocalContext env1; |
| 6380 Local<Script> script1 = Script::Compile(source); | 6366 Local<Script> script1 = v8_compile(source); |
| 6381 CHECK_EQ(8901.0, script1->Run()->NumberValue()); | 6367 CHECK_EQ(8901.0, script1->Run()->NumberValue()); |
| 6382 } | 6368 } |
| 6383 | 6369 |
| 6384 | 6370 |
| 6385 THREADED_TEST(UndetectableObject) { | 6371 THREADED_TEST(UndetectableObject) { |
| 6386 LocalContext env; | 6372 LocalContext env; |
| 6387 v8::HandleScope scope(env->GetIsolate()); | 6373 v8::HandleScope scope(env->GetIsolate()); |
| 6388 | 6374 |
| 6389 Local<v8::FunctionTemplate> desc = | 6375 Local<v8::FunctionTemplate> desc = |
| 6390 v8::FunctionTemplate::New(env->GetIsolate()); | 6376 v8::FunctionTemplate::New(env->GetIsolate()); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6477 | 6463 |
| 6478 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); | 6464 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
| 6479 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6465 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
| 6480 | 6466 |
| 6481 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6467 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
| 6482 env->Global()->Set(v8_str("undetectable"), obj); | 6468 env->Global()->Set(v8_str("undetectable"), obj); |
| 6483 | 6469 |
| 6484 Local<String> source = v8_str("undetectable.x = 42;" | 6470 Local<String> source = v8_str("undetectable.x = 42;" |
| 6485 "undetectable.x"); | 6471 "undetectable.x"); |
| 6486 | 6472 |
| 6487 Local<Script> script = Script::Compile(source); | 6473 Local<Script> script = v8_compile(source); |
| 6488 | 6474 |
| 6489 CHECK_EQ(v8::Integer::New(isolate, 42), script->Run()); | 6475 CHECK_EQ(v8::Integer::New(isolate, 42), script->Run()); |
| 6490 | 6476 |
| 6491 ExpectBoolean("Object.isExtensible(undetectable)", true); | 6477 ExpectBoolean("Object.isExtensible(undetectable)", true); |
| 6492 | 6478 |
| 6493 source = v8_str("Object.preventExtensions(undetectable);"); | 6479 source = v8_str("Object.preventExtensions(undetectable);"); |
| 6494 script = Script::Compile(source); | 6480 script = v8_compile(source); |
| 6495 script->Run(); | 6481 script->Run(); |
| 6496 ExpectBoolean("Object.isExtensible(undetectable)", false); | 6482 ExpectBoolean("Object.isExtensible(undetectable)", false); |
| 6497 | 6483 |
| 6498 source = v8_str("undetectable.y = 2000;"); | 6484 source = v8_str("undetectable.y = 2000;"); |
| 6499 script = Script::Compile(source); | 6485 script = v8_compile(source); |
| 6500 script->Run(); | 6486 script->Run(); |
| 6501 ExpectBoolean("undetectable.y == undefined", true); | 6487 ExpectBoolean("undetectable.y == undefined", true); |
| 6502 } | 6488 } |
| 6503 | 6489 |
| 6504 | 6490 |
| 6505 | 6491 |
| 6506 THREADED_TEST(UndetectableString) { | 6492 THREADED_TEST(UndetectableString) { |
| 6507 LocalContext env; | 6493 LocalContext env; |
| 6508 v8::HandleScope scope(env->GetIsolate()); | 6494 v8::HandleScope scope(env->GetIsolate()); |
| 6509 | 6495 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6582 | 6568 |
| 6583 // The point of this test is type checking. We run it only so compilers | 6569 // The point of this test is type checking. We run it only so compilers |
| 6584 // don't complain about an unused function. | 6570 // don't complain about an unused function. |
| 6585 TEST(PersistentHandles) { | 6571 TEST(PersistentHandles) { |
| 6586 LocalContext env; | 6572 LocalContext env; |
| 6587 v8::Isolate* isolate = CcTest::isolate(); | 6573 v8::Isolate* isolate = CcTest::isolate(); |
| 6588 v8::HandleScope scope(isolate); | 6574 v8::HandleScope scope(isolate); |
| 6589 Local<String> str = v8_str("foo"); | 6575 Local<String> str = v8_str("foo"); |
| 6590 v8::Persistent<String> p_str(isolate, str); | 6576 v8::Persistent<String> p_str(isolate, str); |
| 6591 p_str.Reset(); | 6577 p_str.Reset(); |
| 6592 Local<Script> scr = Script::Compile(v8_str("")); | 6578 Local<Script> scr = v8_compile(""); |
| 6593 v8::Persistent<Script> p_scr(isolate, scr); | 6579 v8::Persistent<Script> p_scr(isolate, scr); |
| 6594 p_scr.Reset(); | 6580 p_scr.Reset(); |
| 6595 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6581 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 6596 v8::Persistent<ObjectTemplate> p_templ(isolate, templ); | 6582 v8::Persistent<ObjectTemplate> p_templ(isolate, templ); |
| 6597 p_templ.Reset(); | 6583 p_templ.Reset(); |
| 6598 } | 6584 } |
| 6599 | 6585 |
| 6600 | 6586 |
| 6601 static void HandleLogDelegator( | 6587 static void HandleLogDelegator( |
| 6602 const v8::FunctionCallbackInfo<v8::Value>& args) { | 6588 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 6603 ApiTestFuzzer::Fuzz(); | 6589 ApiTestFuzzer::Fuzz(); |
| 6604 } | 6590 } |
| 6605 | 6591 |
| 6606 | 6592 |
| 6607 THREADED_TEST(GlobalObjectTemplate) { | 6593 THREADED_TEST(GlobalObjectTemplate) { |
| 6608 v8::Isolate* isolate = CcTest::isolate(); | 6594 v8::Isolate* isolate = CcTest::isolate(); |
| 6609 v8::HandleScope handle_scope(isolate); | 6595 v8::HandleScope handle_scope(isolate); |
| 6610 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); | 6596 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); |
| 6611 global_template->Set(v8_str("JSNI_Log"), | 6597 global_template->Set(v8_str("JSNI_Log"), |
| 6612 v8::FunctionTemplate::New(isolate, HandleLogDelegator)); | 6598 v8::FunctionTemplate::New(isolate, HandleLogDelegator)); |
| 6613 v8::Local<Context> context = Context::New(isolate, 0, global_template); | 6599 v8::Local<Context> context = Context::New(isolate, 0, global_template); |
| 6614 Context::Scope context_scope(context); | 6600 Context::Scope context_scope(context); |
| 6615 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); | 6601 CompileRun("JSNI_Log('LOG')"); |
| 6616 } | 6602 } |
| 6617 | 6603 |
| 6618 | 6604 |
| 6619 static const char* kSimpleExtensionSource = | 6605 static const char* kSimpleExtensionSource = |
| 6620 "function Foo() {" | 6606 "function Foo() {" |
| 6621 " return 4;" | 6607 " return 4;" |
| 6622 "}"; | 6608 "}"; |
| 6623 | 6609 |
| 6624 | 6610 |
| 6625 TEST(SimpleExtensions) { | 6611 TEST(SimpleExtensions) { |
| 6626 v8::HandleScope handle_scope(CcTest::isolate()); | 6612 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6627 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); | 6613 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); |
| 6628 const char* extension_names[] = { "simpletest" }; | 6614 const char* extension_names[] = { "simpletest" }; |
| 6629 v8::ExtensionConfiguration extensions(1, extension_names); | 6615 v8::ExtensionConfiguration extensions(1, extension_names); |
| 6630 v8::Handle<Context> context = | 6616 v8::Handle<Context> context = |
| 6631 Context::New(CcTest::isolate(), &extensions); | 6617 Context::New(CcTest::isolate(), &extensions); |
| 6632 Context::Scope lock(context); | 6618 Context::Scope lock(context); |
| 6633 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); | 6619 v8::Handle<Value> result = CompileRun("Foo()"); |
| 6634 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); | 6620 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); |
| 6635 } | 6621 } |
| 6636 | 6622 |
| 6637 | 6623 |
| 6638 TEST(NullExtensions) { | 6624 TEST(NullExtensions) { |
| 6639 v8::HandleScope handle_scope(CcTest::isolate()); | 6625 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6640 v8::RegisterExtension(new Extension("nulltest", NULL)); | 6626 v8::RegisterExtension(new Extension("nulltest", NULL)); |
| 6641 const char* extension_names[] = { "nulltest" }; | 6627 const char* extension_names[] = { "nulltest" }; |
| 6642 v8::ExtensionConfiguration extensions(1, extension_names); | 6628 v8::ExtensionConfiguration extensions(1, extension_names); |
| 6643 v8::Handle<Context> context = | 6629 v8::Handle<Context> context = |
| 6644 Context::New(CcTest::isolate(), &extensions); | 6630 Context::New(CcTest::isolate(), &extensions); |
| 6645 Context::Scope lock(context); | 6631 Context::Scope lock(context); |
| 6646 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run(); | 6632 v8::Handle<Value> result = CompileRun("1+3"); |
| 6647 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); | 6633 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); |
| 6648 } | 6634 } |
| 6649 | 6635 |
| 6650 | 6636 |
| 6651 static const char* kEmbeddedExtensionSource = | 6637 static const char* kEmbeddedExtensionSource = |
| 6652 "function Ret54321(){return 54321;}~~@@$" | 6638 "function Ret54321(){return 54321;}~~@@$" |
| 6653 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; | 6639 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; |
| 6654 static const int kEmbeddedExtensionSourceValidLen = 34; | 6640 static const int kEmbeddedExtensionSourceValidLen = 34; |
| 6655 | 6641 |
| 6656 | 6642 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 6674 i::OS::SNPrintF(extension_name, "ext #%d", source_len); | 6660 i::OS::SNPrintF(extension_name, "ext #%d", source_len); |
| 6675 v8::RegisterExtension(new Extension(extension_name.start(), | 6661 v8::RegisterExtension(new Extension(extension_name.start(), |
| 6676 kEmbeddedExtensionSource, 0, 0, | 6662 kEmbeddedExtensionSource, 0, 0, |
| 6677 source_len)); | 6663 source_len)); |
| 6678 const char* extension_names[1] = { extension_name.start() }; | 6664 const char* extension_names[1] = { extension_name.start() }; |
| 6679 v8::ExtensionConfiguration extensions(1, extension_names); | 6665 v8::ExtensionConfiguration extensions(1, extension_names); |
| 6680 v8::Handle<Context> context = | 6666 v8::Handle<Context> context = |
| 6681 Context::New(CcTest::isolate(), &extensions); | 6667 Context::New(CcTest::isolate(), &extensions); |
| 6682 if (source_len == kEmbeddedExtensionSourceValidLen) { | 6668 if (source_len == kEmbeddedExtensionSourceValidLen) { |
| 6683 Context::Scope lock(context); | 6669 Context::Scope lock(context); |
| 6684 v8::Handle<Value> result = Script::Compile(v8_str("Ret54321()"))->Run(); | 6670 v8::Handle<Value> result = CompileRun("Ret54321()"); |
| 6685 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 54321), result); | 6671 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 54321), result); |
| 6686 } else { | 6672 } else { |
| 6687 // Anything but exactly the right length should fail to compile. | 6673 // Anything but exactly the right length should fail to compile. |
| 6688 CHECK_EQ(0, *context); | 6674 CHECK_EQ(0, *context); |
| 6689 } | 6675 } |
| 6690 } | 6676 } |
| 6691 } | 6677 } |
| 6692 | 6678 |
| 6693 | 6679 |
| 6694 static const char* kEvalExtensionSource1 = | 6680 static const char* kEvalExtensionSource1 = |
| (...skipping 15 matching lines...) Expand all Loading... |
| 6710 | 6696 |
| 6711 TEST(UseEvalFromExtension) { | 6697 TEST(UseEvalFromExtension) { |
| 6712 v8::HandleScope handle_scope(CcTest::isolate()); | 6698 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6713 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); | 6699 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); |
| 6714 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); | 6700 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); |
| 6715 const char* extension_names[] = { "evaltest1", "evaltest2" }; | 6701 const char* extension_names[] = { "evaltest1", "evaltest2" }; |
| 6716 v8::ExtensionConfiguration extensions(2, extension_names); | 6702 v8::ExtensionConfiguration extensions(2, extension_names); |
| 6717 v8::Handle<Context> context = | 6703 v8::Handle<Context> context = |
| 6718 Context::New(CcTest::isolate(), &extensions); | 6704 Context::New(CcTest::isolate(), &extensions); |
| 6719 Context::Scope lock(context); | 6705 Context::Scope lock(context); |
| 6720 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run(); | 6706 v8::Handle<Value> result = CompileRun("UseEval1()"); |
| 6721 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); | 6707 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); |
| 6722 result = Script::Compile(v8_str("UseEval2()"))->Run(); | 6708 result = CompileRun("UseEval2()"); |
| 6723 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); | 6709 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); |
| 6724 } | 6710 } |
| 6725 | 6711 |
| 6726 | 6712 |
| 6727 static const char* kWithExtensionSource1 = | 6713 static const char* kWithExtensionSource1 = |
| 6728 "function UseWith1() {" | 6714 "function UseWith1() {" |
| 6729 " var x = 42;" | 6715 " var x = 42;" |
| 6730 " with({x:87}) { return x; }" | 6716 " with({x:87}) { return x; }" |
| 6731 "}"; | 6717 "}"; |
| 6732 | 6718 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 6744 | 6730 |
| 6745 TEST(UseWithFromExtension) { | 6731 TEST(UseWithFromExtension) { |
| 6746 v8::HandleScope handle_scope(CcTest::isolate()); | 6732 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6747 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); | 6733 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); |
| 6748 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); | 6734 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); |
| 6749 const char* extension_names[] = { "withtest1", "withtest2" }; | 6735 const char* extension_names[] = { "withtest1", "withtest2" }; |
| 6750 v8::ExtensionConfiguration extensions(2, extension_names); | 6736 v8::ExtensionConfiguration extensions(2, extension_names); |
| 6751 v8::Handle<Context> context = | 6737 v8::Handle<Context> context = |
| 6752 Context::New(CcTest::isolate(), &extensions); | 6738 Context::New(CcTest::isolate(), &extensions); |
| 6753 Context::Scope lock(context); | 6739 Context::Scope lock(context); |
| 6754 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run(); | 6740 v8::Handle<Value> result = CompileRun("UseWith1()"); |
| 6755 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); | 6741 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); |
| 6756 result = Script::Compile(v8_str("UseWith2()"))->Run(); | 6742 result = CompileRun("UseWith2()"); |
| 6757 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); | 6743 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); |
| 6758 } | 6744 } |
| 6759 | 6745 |
| 6760 | 6746 |
| 6761 TEST(AutoExtensions) { | 6747 TEST(AutoExtensions) { |
| 6762 v8::HandleScope handle_scope(CcTest::isolate()); | 6748 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6763 Extension* extension = new Extension("autotest", kSimpleExtensionSource); | 6749 Extension* extension = new Extension("autotest", kSimpleExtensionSource); |
| 6764 extension->set_auto_enable(true); | 6750 extension->set_auto_enable(true); |
| 6765 v8::RegisterExtension(extension); | 6751 v8::RegisterExtension(extension); |
| 6766 v8::Handle<Context> context = | 6752 v8::Handle<Context> context = |
| 6767 Context::New(CcTest::isolate()); | 6753 Context::New(CcTest::isolate()); |
| 6768 Context::Scope lock(context); | 6754 Context::Scope lock(context); |
| 6769 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); | 6755 v8::Handle<Value> result = CompileRun("Foo()"); |
| 6770 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); | 6756 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); |
| 6771 } | 6757 } |
| 6772 | 6758 |
| 6773 | 6759 |
| 6774 static const char* kSyntaxErrorInExtensionSource = | 6760 static const char* kSyntaxErrorInExtensionSource = |
| 6775 "["; | 6761 "["; |
| 6776 | 6762 |
| 6777 | 6763 |
| 6778 // Test that a syntax error in an extension does not cause a fatal | 6764 // Test that a syntax error in an extension does not cause a fatal |
| 6779 // error but results in an empty context. | 6765 // error but results in an empty context. |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6819 // Test that a native runtime calls are supported in extensions. | 6805 // Test that a native runtime calls are supported in extensions. |
| 6820 TEST(NativeCallInExtensions) { | 6806 TEST(NativeCallInExtensions) { |
| 6821 v8::HandleScope handle_scope(CcTest::isolate()); | 6807 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6822 v8::RegisterExtension(new Extension("nativecall", | 6808 v8::RegisterExtension(new Extension("nativecall", |
| 6823 kNativeCallInExtensionSource)); | 6809 kNativeCallInExtensionSource)); |
| 6824 const char* extension_names[] = { "nativecall" }; | 6810 const char* extension_names[] = { "nativecall" }; |
| 6825 v8::ExtensionConfiguration extensions(1, extension_names); | 6811 v8::ExtensionConfiguration extensions(1, extension_names); |
| 6826 v8::Handle<Context> context = | 6812 v8::Handle<Context> context = |
| 6827 Context::New(CcTest::isolate(), &extensions); | 6813 Context::New(CcTest::isolate(), &extensions); |
| 6828 Context::Scope lock(context); | 6814 Context::Scope lock(context); |
| 6829 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run(); | 6815 v8::Handle<Value> result = CompileRun(kNativeCallTest); |
| 6830 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 3)); | 6816 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 3)); |
| 6831 } | 6817 } |
| 6832 | 6818 |
| 6833 | 6819 |
| 6834 class NativeFunctionExtension : public Extension { | 6820 class NativeFunctionExtension : public Extension { |
| 6835 public: | 6821 public: |
| 6836 NativeFunctionExtension(const char* name, | 6822 NativeFunctionExtension(const char* name, |
| 6837 const char* source, | 6823 const char* source, |
| 6838 v8::FunctionCallback fun = &Echo) | 6824 v8::FunctionCallback fun = &Echo) |
| 6839 : Extension(name, source), | 6825 : Extension(name, source), |
| (...skipping 16 matching lines...) Expand all Loading... |
| 6856 TEST(NativeFunctionDeclaration) { | 6842 TEST(NativeFunctionDeclaration) { |
| 6857 v8::HandleScope handle_scope(CcTest::isolate()); | 6843 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6858 const char* name = "nativedecl"; | 6844 const char* name = "nativedecl"; |
| 6859 v8::RegisterExtension(new NativeFunctionExtension(name, | 6845 v8::RegisterExtension(new NativeFunctionExtension(name, |
| 6860 "native function foo();")); | 6846 "native function foo();")); |
| 6861 const char* extension_names[] = { name }; | 6847 const char* extension_names[] = { name }; |
| 6862 v8::ExtensionConfiguration extensions(1, extension_names); | 6848 v8::ExtensionConfiguration extensions(1, extension_names); |
| 6863 v8::Handle<Context> context = | 6849 v8::Handle<Context> context = |
| 6864 Context::New(CcTest::isolate(), &extensions); | 6850 Context::New(CcTest::isolate(), &extensions); |
| 6865 Context::Scope lock(context); | 6851 Context::Scope lock(context); |
| 6866 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run(); | 6852 v8::Handle<Value> result = CompileRun("foo(42);"); |
| 6867 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); | 6853 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); |
| 6868 } | 6854 } |
| 6869 | 6855 |
| 6870 | 6856 |
| 6871 TEST(NativeFunctionDeclarationError) { | 6857 TEST(NativeFunctionDeclarationError) { |
| 6872 v8::HandleScope handle_scope(CcTest::isolate()); | 6858 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6873 const char* name = "nativedeclerr"; | 6859 const char* name = "nativedeclerr"; |
| 6874 // Syntax error in extension code. | 6860 // Syntax error in extension code. |
| 6875 v8::RegisterExtension(new NativeFunctionExtension(name, | 6861 v8::RegisterExtension(new NativeFunctionExtension(name, |
| 6876 "native\nfunction foo();")); | 6862 "native\nfunction foo();")); |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6987 | 6973 |
| 6988 | 6974 |
| 6989 THREADED_TEST(FunctionLookup) { | 6975 THREADED_TEST(FunctionLookup) { |
| 6990 v8::RegisterExtension(new FunctionExtension()); | 6976 v8::RegisterExtension(new FunctionExtension()); |
| 6991 v8::HandleScope handle_scope(CcTest::isolate()); | 6977 v8::HandleScope handle_scope(CcTest::isolate()); |
| 6992 static const char* exts[1] = { "functiontest" }; | 6978 static const char* exts[1] = { "functiontest" }; |
| 6993 v8::ExtensionConfiguration config(1, exts); | 6979 v8::ExtensionConfiguration config(1, exts); |
| 6994 LocalContext context(&config); | 6980 LocalContext context(&config); |
| 6995 CHECK_EQ(3, lookup_count); | 6981 CHECK_EQ(3, lookup_count); |
| 6996 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 8), | 6982 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 8), |
| 6997 Script::Compile(v8_str("Foo(0)"))->Run()); | 6983 CompileRun("Foo(0)")); |
| 6998 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 7), | 6984 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 7), |
| 6999 Script::Compile(v8_str("Foo(1)"))->Run()); | 6985 CompileRun("Foo(1)")); |
| 7000 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 6), | 6986 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 6), |
| 7001 Script::Compile(v8_str("Foo(2)"))->Run()); | 6987 CompileRun("Foo(2)")); |
| 7002 } | 6988 } |
| 7003 | 6989 |
| 7004 | 6990 |
| 7005 THREADED_TEST(NativeFunctionConstructCall) { | 6991 THREADED_TEST(NativeFunctionConstructCall) { |
| 7006 v8::RegisterExtension(new FunctionExtension()); | 6992 v8::RegisterExtension(new FunctionExtension()); |
| 7007 v8::HandleScope handle_scope(CcTest::isolate()); | 6993 v8::HandleScope handle_scope(CcTest::isolate()); |
| 7008 static const char* exts[1] = { "functiontest" }; | 6994 static const char* exts[1] = { "functiontest" }; |
| 7009 v8::ExtensionConfiguration config(1, exts); | 6995 v8::ExtensionConfiguration config(1, exts); |
| 7010 LocalContext context(&config); | 6996 LocalContext context(&config); |
| 7011 for (int i = 0; i < 10; i++) { | 6997 for (int i = 0; i < 10; i++) { |
| 7012 // Run a few times to ensure that allocation of objects doesn't | 6998 // Run a few times to ensure that allocation of objects doesn't |
| 7013 // change behavior of a constructor function. | 6999 // change behavior of a constructor function. |
| 7014 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 8), | 7000 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 8), |
| 7015 Script::Compile(v8_str("(new A()).data"))->Run()); | 7001 CompileRun("(new A()).data")); |
| 7016 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 7), | 7002 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 7), |
| 7017 Script::Compile(v8_str("(new B()).data"))->Run()); | 7003 CompileRun("(new B()).data")); |
| 7018 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 6), | 7004 CHECK_EQ(v8::Integer::New(CcTest::isolate(), 6), |
| 7019 Script::Compile(v8_str("(new C()).data"))->Run()); | 7005 CompileRun("(new C()).data")); |
| 7020 } | 7006 } |
| 7021 } | 7007 } |
| 7022 | 7008 |
| 7023 | 7009 |
| 7024 static const char* last_location; | 7010 static const char* last_location; |
| 7025 static const char* last_message; | 7011 static const char* last_message; |
| 7026 void StoringErrorCallback(const char* location, const char* message) { | 7012 void StoringErrorCallback(const char* location, const char* message) { |
| 7027 if (last_location == NULL) { | 7013 if (last_location == NULL) { |
| 7028 last_location = location; | 7014 last_location = location; |
| 7029 last_message = message; | 7015 last_message = message; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 7055 CHECK_EQ(v8::Undefined(CcTest::isolate()), message->GetScriptResourceName()); | 7041 CHECK_EQ(v8::Undefined(CcTest::isolate()), message->GetScriptResourceName()); |
| 7056 message->GetLineNumber(); | 7042 message->GetLineNumber(); |
| 7057 message->GetSourceLine(); | 7043 message->GetSourceLine(); |
| 7058 } | 7044 } |
| 7059 | 7045 |
| 7060 | 7046 |
| 7061 THREADED_TEST(ErrorWithMissingScriptInfo) { | 7047 THREADED_TEST(ErrorWithMissingScriptInfo) { |
| 7062 LocalContext context; | 7048 LocalContext context; |
| 7063 v8::HandleScope scope(context->GetIsolate()); | 7049 v8::HandleScope scope(context->GetIsolate()); |
| 7064 v8::V8::AddMessageListener(MissingScriptInfoMessageListener); | 7050 v8::V8::AddMessageListener(MissingScriptInfoMessageListener); |
| 7065 Script::Compile(v8_str("throw Error()"))->Run(); | 7051 CompileRun("throw Error()"); |
| 7066 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); | 7052 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); |
| 7067 } | 7053 } |
| 7068 | 7054 |
| 7069 | 7055 |
| 7070 struct FlagAndPersistent { | 7056 struct FlagAndPersistent { |
| 7071 bool flag; | 7057 bool flag; |
| 7072 v8::Persistent<v8::Object> handle; | 7058 v8::Persistent<v8::Object> handle; |
| 7073 }; | 7059 }; |
| 7074 | 7060 |
| 7075 | 7061 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7476 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 7462 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 7477 templ->SetAccessor(v8_str("t"), PGetter2); | 7463 templ->SetAccessor(v8_str("t"), PGetter2); |
| 7478 LocalContext context; | 7464 LocalContext context; |
| 7479 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 7465 context->Global()->Set(v8_str("o"), templ->NewInstance()); |
| 7480 for (int i = 0; i < 100; i++) { | 7466 for (int i = 0; i < 100; i++) { |
| 7481 v8::HandleScope inner_scope(CcTest::isolate()); | 7467 v8::HandleScope inner_scope(CcTest::isolate()); |
| 7482 v8::Handle<v8::Object> obj = templ->NewInstance(); | 7468 v8::Handle<v8::Object> obj = templ->NewInstance(); |
| 7483 CHECK_NE(obj, context->Global()->Get(v8_str("o"))); | 7469 CHECK_NE(obj, context->Global()->Get(v8_str("o"))); |
| 7484 context->Global()->Set(v8_str("o2"), obj); | 7470 context->Global()->Set(v8_str("o2"), obj); |
| 7485 v8::Handle<Value> value = | 7471 v8::Handle<Value> value = |
| 7486 Script::Compile(v8_str("o.__proto__ === o2.__proto__"))->Run(); | 7472 CompileRun("o.__proto__ === o2.__proto__"); |
| 7487 CHECK_EQ(v8::True(isolate), value); | 7473 CHECK_EQ(v8::True(isolate), value); |
| 7488 context->Global()->Set(v8_str("o"), obj); | 7474 context->Global()->Set(v8_str("o"), obj); |
| 7489 } | 7475 } |
| 7490 } | 7476 } |
| 7491 | 7477 |
| 7492 | 7478 |
| 7493 static int StrCmp16(uint16_t* a, uint16_t* b) { | 7479 static int StrCmp16(uint16_t* a, uint16_t* b) { |
| 7494 while (true) { | 7480 while (true) { |
| 7495 if (*a == 0 && *b == 0) return 0; | 7481 if (*a == 0 && *b == 0) return 0; |
| 7496 if (*a != *b) return 0 + *a - *b; | 7482 if (*a != *b) return 0 + *a - *b; |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8237 LocalContext env; | 8223 LocalContext env; |
| 8238 v8::Isolate* isolate = env->GetIsolate(); | 8224 v8::Isolate* isolate = env->GetIsolate(); |
| 8239 v8::HandleScope scope(isolate); | 8225 v8::HandleScope scope(isolate); |
| 8240 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); | 8226 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); |
| 8241 | 8227 |
| 8242 Local<v8::FunctionTemplate> fun = | 8228 Local<v8::FunctionTemplate> fun = |
| 8243 v8::FunctionTemplate::New(isolate, TroubleCallback); | 8229 v8::FunctionTemplate::New(isolate, TroubleCallback); |
| 8244 v8::Local<v8::Object> global = env->Global(); | 8230 v8::Local<v8::Object> global = env->Global(); |
| 8245 global->Set(v8_str("trouble"), fun->GetFunction()); | 8231 global->Set(v8_str("trouble"), fun->GetFunction()); |
| 8246 | 8232 |
| 8247 Script::Compile(v8_str("function trouble_callee() {" | 8233 CompileRun( |
| 8248 " var x = null;" | 8234 "function trouble_callee() {" |
| 8249 " return x.foo;" | 8235 " var x = null;" |
| 8250 "};" | 8236 " return x.foo;" |
| 8251 "function trouble_caller() {" | 8237 "};" |
| 8252 " trouble();" | 8238 "function trouble_caller() {" |
| 8253 "};"))->Run(); | 8239 " trouble();" |
| 8240 "};"); |
| 8254 Local<Value> trouble = global->Get(v8_str("trouble")); | 8241 Local<Value> trouble = global->Get(v8_str("trouble")); |
| 8255 CHECK(trouble->IsFunction()); | 8242 CHECK(trouble->IsFunction()); |
| 8256 Local<Value> trouble_callee = global->Get(v8_str("trouble_callee")); | 8243 Local<Value> trouble_callee = global->Get(v8_str("trouble_callee")); |
| 8257 CHECK(trouble_callee->IsFunction()); | 8244 CHECK(trouble_callee->IsFunction()); |
| 8258 Local<Value> trouble_caller = global->Get(v8_str("trouble_caller")); | 8245 Local<Value> trouble_caller = global->Get(v8_str("trouble_caller")); |
| 8259 CHECK(trouble_caller->IsFunction()); | 8246 CHECK(trouble_caller->IsFunction()); |
| 8260 Function::Cast(*trouble_caller)->Call(global, 0, NULL); | 8247 Function::Cast(*trouble_caller)->Call(global, 0, NULL); |
| 8261 CHECK_EQ(1, report_count); | 8248 CHECK_EQ(1, report_count); |
| 8262 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); | 8249 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); |
| 8263 } | 8250 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 8279 LocalContext env; | 8266 LocalContext env; |
| 8280 v8::Isolate* isolate = env->GetIsolate(); | 8267 v8::Isolate* isolate = env->GetIsolate(); |
| 8281 v8::HandleScope scope(isolate); | 8268 v8::HandleScope scope(isolate); |
| 8282 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); | 8269 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); |
| 8283 | 8270 |
| 8284 Local<v8::FunctionTemplate> fun = | 8271 Local<v8::FunctionTemplate> fun = |
| 8285 v8::FunctionTemplate::New(isolate, TroubleCallback); | 8272 v8::FunctionTemplate::New(isolate, TroubleCallback); |
| 8286 v8::Local<v8::Object> global = env->Global(); | 8273 v8::Local<v8::Object> global = env->Global(); |
| 8287 global->Set(v8_str("trouble"), fun->GetFunction()); | 8274 global->Set(v8_str("trouble"), fun->GetFunction()); |
| 8288 | 8275 |
| 8289 Script::Compile( | 8276 CompileRunWithOrigin( |
| 8290 v8_str( | 8277 "function trouble() {\n" |
| 8291 "function trouble() {\n" | 8278 " var o = {};\n" |
| 8292 " var o = {};\n" | 8279 " new o.foo();\n" |
| 8293 " new o.foo();\n" | 8280 "};", |
| 8294 "};"), | 8281 script_resource_name); |
| 8295 v8::String::NewFromUtf8(isolate, script_resource_name))->Run(); | |
| 8296 Local<Value> trouble = global->Get(v8_str("trouble")); | 8282 Local<Value> trouble = global->Get(v8_str("trouble")); |
| 8297 CHECK(trouble->IsFunction()); | 8283 CHECK(trouble->IsFunction()); |
| 8298 Function::Cast(*trouble)->Call(global, 0, NULL); | 8284 Function::Cast(*trouble)->Call(global, 0, NULL); |
| 8299 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); | 8285 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); |
| 8300 } | 8286 } |
| 8301 | 8287 |
| 8302 | 8288 |
| 8303 TEST(CompilationErrorUsingTryCatchHandler) { | 8289 TEST(CompilationErrorUsingTryCatchHandler) { |
| 8304 LocalContext env; | 8290 LocalContext env; |
| 8305 v8::HandleScope scope(env->GetIsolate()); | 8291 v8::HandleScope scope(env->GetIsolate()); |
| 8306 v8::TryCatch try_catch; | 8292 v8::TryCatch try_catch; |
| 8307 Script::Compile(v8_str("This doesn't &*&@#$&*^ compile.")); | 8293 v8_compile("This doesn't &*&@#$&*^ compile."); |
| 8308 CHECK_NE(NULL, *try_catch.Exception()); | 8294 CHECK_NE(NULL, *try_catch.Exception()); |
| 8309 CHECK(try_catch.HasCaught()); | 8295 CHECK(try_catch.HasCaught()); |
| 8310 } | 8296 } |
| 8311 | 8297 |
| 8312 | 8298 |
| 8313 TEST(TryCatchFinallyUsingTryCatchHandler) { | 8299 TEST(TryCatchFinallyUsingTryCatchHandler) { |
| 8314 LocalContext env; | 8300 LocalContext env; |
| 8315 v8::HandleScope scope(env->GetIsolate()); | 8301 v8::HandleScope scope(env->GetIsolate()); |
| 8316 v8::TryCatch try_catch; | 8302 v8::TryCatch try_catch; |
| 8317 Script::Compile(v8_str("try { throw ''; } catch (e) {}"))->Run(); | 8303 CompileRun("try { throw ''; } catch (e) {}"); |
| 8318 CHECK(!try_catch.HasCaught()); | 8304 CHECK(!try_catch.HasCaught()); |
| 8319 Script::Compile(v8_str("try { throw ''; } finally {}"))->Run(); | 8305 CompileRun("try { throw ''; } finally {}"); |
| 8320 CHECK(try_catch.HasCaught()); | 8306 CHECK(try_catch.HasCaught()); |
| 8321 try_catch.Reset(); | 8307 try_catch.Reset(); |
| 8322 Script::Compile(v8_str("(function() {" | 8308 CompileRun( |
| 8323 "try { throw ''; } finally { return; }" | 8309 "(function() {" |
| 8324 "})()"))->Run(); | 8310 "try { throw ''; } finally { return; }" |
| 8311 "})()"); |
| 8325 CHECK(!try_catch.HasCaught()); | 8312 CHECK(!try_catch.HasCaught()); |
| 8326 Script::Compile(v8_str("(function()" | 8313 CompileRun( |
| 8327 " { try { throw ''; } finally { throw 0; }" | 8314 "(function()" |
| 8328 "})()"))->Run(); | 8315 " { try { throw ''; } finally { throw 0; }" |
| 8316 "})()"); |
| 8329 CHECK(try_catch.HasCaught()); | 8317 CHECK(try_catch.HasCaught()); |
| 8330 } | 8318 } |
| 8331 | 8319 |
| 8332 | 8320 |
| 8333 // SecurityHandler can't be run twice | 8321 // SecurityHandler can't be run twice |
| 8334 TEST(SecurityHandler) { | 8322 TEST(SecurityHandler) { |
| 8335 v8::Isolate* isolate = CcTest::isolate(); | 8323 v8::Isolate* isolate = CcTest::isolate(); |
| 8336 v8::HandleScope scope0(isolate); | 8324 v8::HandleScope scope0(isolate); |
| 8337 v8::Handle<v8::ObjectTemplate> global_template = | 8325 v8::Handle<v8::ObjectTemplate> global_template = |
| 8338 v8::ObjectTemplate::New(isolate); | 8326 v8::ObjectTemplate::New(isolate); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8396 v8::HandleScope handle_scope(env1->GetIsolate()); | 8384 v8::HandleScope handle_scope(env1->GetIsolate()); |
| 8397 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8385 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
| 8398 | 8386 |
| 8399 Local<Value> foo = v8_str("foo"); | 8387 Local<Value> foo = v8_str("foo"); |
| 8400 Local<Value> bar = v8_str("bar"); | 8388 Local<Value> bar = v8_str("bar"); |
| 8401 | 8389 |
| 8402 // Set to the same domain. | 8390 // Set to the same domain. |
| 8403 env1->SetSecurityToken(foo); | 8391 env1->SetSecurityToken(foo); |
| 8404 | 8392 |
| 8405 // Create a function in env1. | 8393 // Create a function in env1. |
| 8406 Script::Compile(v8_str("spy=function(){return spy;}"))->Run(); | 8394 CompileRun("spy=function(){return spy;}"); |
| 8407 Local<Value> spy = env1->Global()->Get(v8_str("spy")); | 8395 Local<Value> spy = env1->Global()->Get(v8_str("spy")); |
| 8408 CHECK(spy->IsFunction()); | 8396 CHECK(spy->IsFunction()); |
| 8409 | 8397 |
| 8410 // Create another function accessing global objects. | 8398 // Create another function accessing global objects. |
| 8411 Script::Compile(v8_str("spy2=function(){return new this.Array();}"))->Run(); | 8399 CompileRun("spy2=function(){return new this.Array();}"); |
| 8412 Local<Value> spy2 = env1->Global()->Get(v8_str("spy2")); | 8400 Local<Value> spy2 = env1->Global()->Get(v8_str("spy2")); |
| 8413 CHECK(spy2->IsFunction()); | 8401 CHECK(spy2->IsFunction()); |
| 8414 | 8402 |
| 8415 // Switch to env2 in the same domain and invoke spy on env2. | 8403 // Switch to env2 in the same domain and invoke spy on env2. |
| 8416 { | 8404 { |
| 8417 env2->SetSecurityToken(foo); | 8405 env2->SetSecurityToken(foo); |
| 8418 // Enter env2 | 8406 // Enter env2 |
| 8419 Context::Scope scope_env2(env2); | 8407 Context::Scope scope_env2(env2); |
| 8420 Local<Value> result = Function::Cast(*spy)->Call(env2->Global(), 0, NULL); | 8408 Local<Value> result = Function::Cast(*spy)->Call(env2->Global(), 0, NULL); |
| 8421 CHECK(result->IsFunction()); | 8409 CHECK(result->IsFunction()); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8514 env2->SetSecurityToken(foo); | 8502 env2->SetSecurityToken(foo); |
| 8515 | 8503 |
| 8516 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 8504 env1->Global()->Set(v8_str("prop"), v8_num(3)); |
| 8517 env2->Global()->Set(v8_str("env1"), env1->Global()); | 8505 env2->Global()->Set(v8_str("env1"), env1->Global()); |
| 8518 | 8506 |
| 8519 // Change env2 to a different domain and delete env1.prop. | 8507 // Change env2 to a different domain and delete env1.prop. |
| 8520 env2->SetSecurityToken(bar); | 8508 env2->SetSecurityToken(bar); |
| 8521 { | 8509 { |
| 8522 Context::Scope scope_env2(env2); | 8510 Context::Scope scope_env2(env2); |
| 8523 Local<Value> result = | 8511 Local<Value> result = |
| 8524 Script::Compile(v8_str("delete env1.prop"))->Run(); | 8512 CompileRun("delete env1.prop"); |
| 8525 CHECK(result->IsFalse()); | 8513 CHECK(result->IsFalse()); |
| 8526 } | 8514 } |
| 8527 | 8515 |
| 8528 // Check that env1.prop still exists. | 8516 // Check that env1.prop still exists. |
| 8529 Local<Value> v = env1->Global()->Get(v8_str("prop")); | 8517 Local<Value> v = env1->Global()->Get(v8_str("prop")); |
| 8530 CHECK(v->IsNumber()); | 8518 CHECK(v->IsNumber()); |
| 8531 CHECK_EQ(3, v->Int32Value()); | 8519 CHECK_EQ(3, v->Int32Value()); |
| 8532 } | 8520 } |
| 8533 | 8521 |
| 8534 | 8522 |
| 8535 THREADED_TEST(CrossDomainIsPropertyEnumerable) { | 8523 THREADED_TEST(CrossDomainIsPropertyEnumerable) { |
| 8536 LocalContext env1; | 8524 LocalContext env1; |
| 8537 v8::HandleScope handle_scope(env1->GetIsolate()); | 8525 v8::HandleScope handle_scope(env1->GetIsolate()); |
| 8538 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8526 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
| 8539 | 8527 |
| 8540 Local<Value> foo = v8_str("foo"); | 8528 Local<Value> foo = v8_str("foo"); |
| 8541 Local<Value> bar = v8_str("bar"); | 8529 Local<Value> bar = v8_str("bar"); |
| 8542 | 8530 |
| 8543 // Set to the same domain. | 8531 // Set to the same domain. |
| 8544 env1->SetSecurityToken(foo); | 8532 env1->SetSecurityToken(foo); |
| 8545 env2->SetSecurityToken(foo); | 8533 env2->SetSecurityToken(foo); |
| 8546 | 8534 |
| 8547 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 8535 env1->Global()->Set(v8_str("prop"), v8_num(3)); |
| 8548 env2->Global()->Set(v8_str("env1"), env1->Global()); | 8536 env2->Global()->Set(v8_str("env1"), env1->Global()); |
| 8549 | 8537 |
| 8550 // env1.prop is enumerable in env2. | 8538 // env1.prop is enumerable in env2. |
| 8551 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); | 8539 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); |
| 8552 { | 8540 { |
| 8553 Context::Scope scope_env2(env2); | 8541 Context::Scope scope_env2(env2); |
| 8554 Local<Value> result = Script::Compile(test)->Run(); | 8542 Local<Value> result = CompileRun(test); |
| 8555 CHECK(result->IsTrue()); | 8543 CHECK(result->IsTrue()); |
| 8556 } | 8544 } |
| 8557 | 8545 |
| 8558 // Change env2 to a different domain and test again. | 8546 // Change env2 to a different domain and test again. |
| 8559 env2->SetSecurityToken(bar); | 8547 env2->SetSecurityToken(bar); |
| 8560 { | 8548 { |
| 8561 Context::Scope scope_env2(env2); | 8549 Context::Scope scope_env2(env2); |
| 8562 Local<Value> result = Script::Compile(test)->Run(); | 8550 Local<Value> result = CompileRun(test); |
| 8563 CHECK(result->IsFalse()); | 8551 CHECK(result->IsFalse()); |
| 8564 } | 8552 } |
| 8565 } | 8553 } |
| 8566 | 8554 |
| 8567 | 8555 |
| 8568 THREADED_TEST(CrossDomainForIn) { | 8556 THREADED_TEST(CrossDomainForIn) { |
| 8569 LocalContext env1; | 8557 LocalContext env1; |
| 8570 v8::HandleScope handle_scope(env1->GetIsolate()); | 8558 v8::HandleScope handle_scope(env1->GetIsolate()); |
| 8571 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 8559 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); |
| 8572 | 8560 |
| (...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9764 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 9752 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
| 9765 Local<ObjectTemplate> instance = t->InstanceTemplate(); | 9753 Local<ObjectTemplate> instance = t->InstanceTemplate(); |
| 9766 | 9754 |
| 9767 instance->Set(v8_str("x"), v8_num(42)); | 9755 instance->Set(v8_str("x"), v8_num(42)); |
| 9768 instance->Set(v8_str("f"), | 9756 instance->Set(v8_str("f"), |
| 9769 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); | 9757 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); |
| 9770 | 9758 |
| 9771 Local<Value> o = t->GetFunction()->NewInstance(); | 9759 Local<Value> o = t->GetFunction()->NewInstance(); |
| 9772 | 9760 |
| 9773 context->Global()->Set(v8_str("i"), o); | 9761 context->Global()->Set(v8_str("i"), o); |
| 9774 Local<Value> value = Script::Compile(v8_str("i.x"))->Run(); | 9762 Local<Value> value = CompileRun("i.x"); |
| 9775 CHECK_EQ(42, value->Int32Value()); | 9763 CHECK_EQ(42, value->Int32Value()); |
| 9776 | 9764 |
| 9777 value = Script::Compile(v8_str("i.f()"))->Run(); | 9765 value = CompileRun("i.f()"); |
| 9778 CHECK_EQ(12, value->Int32Value()); | 9766 CHECK_EQ(12, value->Int32Value()); |
| 9779 } | 9767 } |
| 9780 | 9768 |
| 9781 | 9769 |
| 9782 static void GlobalObjectInstancePropertiesGet( | 9770 static void GlobalObjectInstancePropertiesGet( |
| 9783 Local<String> key, | 9771 Local<String> key, |
| 9784 const v8::PropertyCallbackInfo<v8::Value>&) { | 9772 const v8::PropertyCallbackInfo<v8::Value>&) { |
| 9785 ApiTestFuzzer::Fuzz(); | 9773 ApiTestFuzzer::Fuzz(); |
| 9786 } | 9774 } |
| 9787 | 9775 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 9816 "var thrown = 0;" | 9804 "var thrown = 0;" |
| 9817 "try { wrapper(true); } catch (e) { thrown = 1; };" | 9805 "try { wrapper(true); } catch (e) { thrown = 1; };" |
| 9818 "thrown"; | 9806 "thrown"; |
| 9819 | 9807 |
| 9820 { | 9808 { |
| 9821 LocalContext env(NULL, instance_template); | 9809 LocalContext env(NULL, instance_template); |
| 9822 // Hold on to the global object so it can be used again in another | 9810 // Hold on to the global object so it can be used again in another |
| 9823 // environment initialization. | 9811 // environment initialization. |
| 9824 global_object = env->Global(); | 9812 global_object = env->Global(); |
| 9825 | 9813 |
| 9826 Local<Value> value = Script::Compile(v8_str("x"))->Run(); | 9814 Local<Value> value = CompileRun("x"); |
| 9827 CHECK_EQ(42, value->Int32Value()); | 9815 CHECK_EQ(42, value->Int32Value()); |
| 9828 value = Script::Compile(v8_str("f()"))->Run(); | 9816 value = CompileRun("f()"); |
| 9829 CHECK_EQ(12, value->Int32Value()); | 9817 CHECK_EQ(12, value->Int32Value()); |
| 9830 value = Script::Compile(v8_str(script))->Run(); | 9818 value = CompileRun(script); |
| 9831 CHECK_EQ(1, value->Int32Value()); | 9819 CHECK_EQ(1, value->Int32Value()); |
| 9832 } | 9820 } |
| 9833 | 9821 |
| 9834 { | 9822 { |
| 9835 // Create new environment reusing the global object. | 9823 // Create new environment reusing the global object. |
| 9836 LocalContext env(NULL, instance_template, global_object); | 9824 LocalContext env(NULL, instance_template, global_object); |
| 9837 Local<Value> value = Script::Compile(v8_str("x"))->Run(); | 9825 Local<Value> value = CompileRun("x"); |
| 9838 CHECK_EQ(42, value->Int32Value()); | 9826 CHECK_EQ(42, value->Int32Value()); |
| 9839 value = Script::Compile(v8_str("f()"))->Run(); | 9827 value = CompileRun("f()"); |
| 9840 CHECK_EQ(12, value->Int32Value()); | 9828 CHECK_EQ(12, value->Int32Value()); |
| 9841 value = Script::Compile(v8_str(script))->Run(); | 9829 value = CompileRun(script); |
| 9842 CHECK_EQ(1, value->Int32Value()); | 9830 CHECK_EQ(1, value->Int32Value()); |
| 9843 } | 9831 } |
| 9844 } | 9832 } |
| 9845 | 9833 |
| 9846 | 9834 |
| 9847 THREADED_TEST(CallKnownGlobalReceiver) { | 9835 THREADED_TEST(CallKnownGlobalReceiver) { |
| 9848 v8::Isolate* isolate = CcTest::isolate(); | 9836 v8::Isolate* isolate = CcTest::isolate(); |
| 9849 v8::HandleScope handle_scope(isolate); | 9837 v8::HandleScope handle_scope(isolate); |
| 9850 | 9838 |
| 9851 Local<Value> global_object; | 9839 Local<Value> global_object; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 9866 "function foo(x) { bar([x], bom(2)); }" | 9854 "function foo(x) { bar([x], bom(2)); }" |
| 9867 "for (var i = 0; i < 10000; i++) foo(1);" | 9855 "for (var i = 0; i < 10000; i++) foo(1);" |
| 9868 "foo"; | 9856 "foo"; |
| 9869 | 9857 |
| 9870 Local<Value> foo; | 9858 Local<Value> foo; |
| 9871 { | 9859 { |
| 9872 LocalContext env(NULL, instance_template); | 9860 LocalContext env(NULL, instance_template); |
| 9873 // Hold on to the global object so it can be used again in another | 9861 // Hold on to the global object so it can be used again in another |
| 9874 // environment initialization. | 9862 // environment initialization. |
| 9875 global_object = env->Global(); | 9863 global_object = env->Global(); |
| 9876 foo = Script::Compile(v8_str(script))->Run(); | 9864 foo = CompileRun(script); |
| 9877 } | 9865 } |
| 9878 | 9866 |
| 9879 { | 9867 { |
| 9880 // Create new environment reusing the global object. | 9868 // Create new environment reusing the global object. |
| 9881 LocalContext env(NULL, instance_template, global_object); | 9869 LocalContext env(NULL, instance_template, global_object); |
| 9882 env->Global()->Set(v8_str("foo"), foo); | 9870 env->Global()->Set(v8_str("foo"), foo); |
| 9883 Script::Compile(v8_str("foo()"))->Run(); | 9871 CompileRun("foo()"); |
| 9884 } | 9872 } |
| 9885 } | 9873 } |
| 9886 | 9874 |
| 9887 | 9875 |
| 9888 static void ShadowFunctionCallback( | 9876 static void ShadowFunctionCallback( |
| 9889 const v8::FunctionCallbackInfo<v8::Value>& args) { | 9877 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 9890 ApiTestFuzzer::Fuzz(); | 9878 ApiTestFuzzer::Fuzz(); |
| 9891 args.GetReturnValue().Set(v8_num(42)); | 9879 args.GetReturnValue().Set(v8_num(42)); |
| 9892 } | 9880 } |
| 9893 | 9881 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9942 ShadowFunctionCallback, | 9930 ShadowFunctionCallback, |
| 9943 Local<Value>())); | 9931 Local<Value>())); |
| 9944 proto->Set(v8_str("x"), v8_num(12)); | 9932 proto->Set(v8_str("x"), v8_num(12)); |
| 9945 | 9933 |
| 9946 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); | 9934 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); |
| 9947 | 9935 |
| 9948 Local<Value> o = t->GetFunction()->NewInstance(); | 9936 Local<Value> o = t->GetFunction()->NewInstance(); |
| 9949 context->Global()->Set(v8_str("__proto__"), o); | 9937 context->Global()->Set(v8_str("__proto__"), o); |
| 9950 | 9938 |
| 9951 Local<Value> value = | 9939 Local<Value> value = |
| 9952 Script::Compile(v8_str("this.propertyIsEnumerable(0)"))->Run(); | 9940 CompileRun("this.propertyIsEnumerable(0)"); |
| 9953 CHECK(value->IsBoolean()); | 9941 CHECK(value->IsBoolean()); |
| 9954 CHECK(!value->BooleanValue()); | 9942 CHECK(!value->BooleanValue()); |
| 9955 | 9943 |
| 9956 value = Script::Compile(v8_str("x"))->Run(); | 9944 value = CompileRun("x"); |
| 9957 CHECK_EQ(12, value->Int32Value()); | 9945 CHECK_EQ(12, value->Int32Value()); |
| 9958 | 9946 |
| 9959 value = Script::Compile(v8_str("f()"))->Run(); | 9947 value = CompileRun("f()"); |
| 9960 CHECK_EQ(42, value->Int32Value()); | 9948 CHECK_EQ(42, value->Int32Value()); |
| 9961 | 9949 |
| 9962 Script::Compile(v8_str("y = 43"))->Run(); | 9950 CompileRun("y = 43"); |
| 9963 CHECK_EQ(1, shadow_y_setter_call_count); | 9951 CHECK_EQ(1, shadow_y_setter_call_count); |
| 9964 value = Script::Compile(v8_str("y"))->Run(); | 9952 value = CompileRun("y"); |
| 9965 CHECK_EQ(1, shadow_y_getter_call_count); | 9953 CHECK_EQ(1, shadow_y_getter_call_count); |
| 9966 CHECK_EQ(42, value->Int32Value()); | 9954 CHECK_EQ(42, value->Int32Value()); |
| 9967 } | 9955 } |
| 9968 | 9956 |
| 9969 | 9957 |
| 9970 THREADED_TEST(HiddenPrototype) { | 9958 THREADED_TEST(HiddenPrototype) { |
| 9971 LocalContext context; | 9959 LocalContext context; |
| 9972 v8::Isolate* isolate = context->GetIsolate(); | 9960 v8::Isolate* isolate = context->GetIsolate(); |
| 9973 v8::HandleScope handle_scope(isolate); | 9961 v8::HandleScope handle_scope(isolate); |
| 9974 | 9962 |
| (...skipping 603 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10578 "test();"); | 10566 "test();"); |
| 10579 CHECK_EQ(0, value->Int32Value()); | 10567 CHECK_EQ(0, value->Int32Value()); |
| 10580 } | 10568 } |
| 10581 | 10569 |
| 10582 | 10570 |
| 10583 THREADED_TEST(EvalAliasedDynamic) { | 10571 THREADED_TEST(EvalAliasedDynamic) { |
| 10584 LocalContext current; | 10572 LocalContext current; |
| 10585 v8::HandleScope scope(current->GetIsolate()); | 10573 v8::HandleScope scope(current->GetIsolate()); |
| 10586 | 10574 |
| 10587 // Tests where aliased eval can only be resolved dynamically. | 10575 // Tests where aliased eval can only be resolved dynamically. |
| 10588 Local<Script> script = | 10576 Local<Script> script = v8_compile( |
| 10589 Script::Compile(v8_str("function f(x) { " | 10577 "function f(x) { " |
| 10590 " var foo = 2;" | 10578 " var foo = 2;" |
| 10591 " with (x) { return eval('foo'); }" | 10579 " with (x) { return eval('foo'); }" |
| 10592 "}" | 10580 "}" |
| 10593 "foo = 0;" | 10581 "foo = 0;" |
| 10594 "result1 = f(new Object());" | 10582 "result1 = f(new Object());" |
| 10595 "result2 = f(this);" | 10583 "result2 = f(this);" |
| 10596 "var x = new Object();" | 10584 "var x = new Object();" |
| 10597 "x.eval = function(x) { return 1; };" | 10585 "x.eval = function(x) { return 1; };" |
| 10598 "result3 = f(x);")); | 10586 "result3 = f(x);"); |
| 10599 script->Run(); | 10587 script->Run(); |
| 10600 CHECK_EQ(2, current->Global()->Get(v8_str("result1"))->Int32Value()); | 10588 CHECK_EQ(2, current->Global()->Get(v8_str("result1"))->Int32Value()); |
| 10601 CHECK_EQ(0, current->Global()->Get(v8_str("result2"))->Int32Value()); | 10589 CHECK_EQ(0, current->Global()->Get(v8_str("result2"))->Int32Value()); |
| 10602 CHECK_EQ(1, current->Global()->Get(v8_str("result3"))->Int32Value()); | 10590 CHECK_EQ(1, current->Global()->Get(v8_str("result3"))->Int32Value()); |
| 10603 | 10591 |
| 10604 v8::TryCatch try_catch; | 10592 v8::TryCatch try_catch; |
| 10605 script = | 10593 script = v8_compile( |
| 10606 Script::Compile(v8_str("function f(x) { " | 10594 "function f(x) { " |
| 10607 " var bar = 2;" | 10595 " var bar = 2;" |
| 10608 " with (x) { return eval('bar'); }" | 10596 " with (x) { return eval('bar'); }" |
| 10609 "}" | 10597 "}" |
| 10610 "result4 = f(this)")); | 10598 "result4 = f(this)"); |
| 10611 script->Run(); | 10599 script->Run(); |
| 10612 CHECK(!try_catch.HasCaught()); | 10600 CHECK(!try_catch.HasCaught()); |
| 10613 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value()); | 10601 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value()); |
| 10614 | 10602 |
| 10615 try_catch.Reset(); | 10603 try_catch.Reset(); |
| 10616 } | 10604 } |
| 10617 | 10605 |
| 10618 | 10606 |
| 10619 THREADED_TEST(CrossEval) { | 10607 THREADED_TEST(CrossEval) { |
| 10620 v8::HandleScope scope(CcTest::isolate()); | 10608 v8::HandleScope scope(CcTest::isolate()); |
| 10621 LocalContext other; | 10609 LocalContext other; |
| 10622 LocalContext current; | 10610 LocalContext current; |
| 10623 | 10611 |
| 10624 Local<String> token = v8_str("<security token>"); | 10612 Local<String> token = v8_str("<security token>"); |
| 10625 other->SetSecurityToken(token); | 10613 other->SetSecurityToken(token); |
| 10626 current->SetSecurityToken(token); | 10614 current->SetSecurityToken(token); |
| 10627 | 10615 |
| 10628 // Set up reference from current to other. | 10616 // Set up reference from current to other. |
| 10629 current->Global()->Set(v8_str("other"), other->Global()); | 10617 current->Global()->Set(v8_str("other"), other->Global()); |
| 10630 | 10618 |
| 10631 // Check that new variables are introduced in other context. | 10619 // Check that new variables are introduced in other context. |
| 10632 Local<Script> script = | 10620 Local<Script> script = v8_compile("other.eval('var foo = 1234')"); |
| 10633 Script::Compile(v8_str("other.eval('var foo = 1234')")); | |
| 10634 script->Run(); | 10621 script->Run(); |
| 10635 Local<Value> foo = other->Global()->Get(v8_str("foo")); | 10622 Local<Value> foo = other->Global()->Get(v8_str("foo")); |
| 10636 CHECK_EQ(1234, foo->Int32Value()); | 10623 CHECK_EQ(1234, foo->Int32Value()); |
| 10637 CHECK(!current->Global()->Has(v8_str("foo"))); | 10624 CHECK(!current->Global()->Has(v8_str("foo"))); |
| 10638 | 10625 |
| 10639 // Check that writing to non-existing properties introduces them in | 10626 // Check that writing to non-existing properties introduces them in |
| 10640 // the other context. | 10627 // the other context. |
| 10641 script = | 10628 script = v8_compile("other.eval('na = 1234')"); |
| 10642 Script::Compile(v8_str("other.eval('na = 1234')")); | |
| 10643 script->Run(); | 10629 script->Run(); |
| 10644 CHECK_EQ(1234, other->Global()->Get(v8_str("na"))->Int32Value()); | 10630 CHECK_EQ(1234, other->Global()->Get(v8_str("na"))->Int32Value()); |
| 10645 CHECK(!current->Global()->Has(v8_str("na"))); | 10631 CHECK(!current->Global()->Has(v8_str("na"))); |
| 10646 | 10632 |
| 10647 // Check that global variables in current context are not visible in other | 10633 // Check that global variables in current context are not visible in other |
| 10648 // context. | 10634 // context. |
| 10649 v8::TryCatch try_catch; | 10635 v8::TryCatch try_catch; |
| 10650 script = | 10636 script = v8_compile("var bar = 42; other.eval('bar');"); |
| 10651 Script::Compile(v8_str("var bar = 42; other.eval('bar');")); | |
| 10652 Local<Value> result = script->Run(); | 10637 Local<Value> result = script->Run(); |
| 10653 CHECK(try_catch.HasCaught()); | 10638 CHECK(try_catch.HasCaught()); |
| 10654 try_catch.Reset(); | 10639 try_catch.Reset(); |
| 10655 | 10640 |
| 10656 // Check that local variables in current context are not visible in other | 10641 // Check that local variables in current context are not visible in other |
| 10657 // context. | 10642 // context. |
| 10658 script = | 10643 script = v8_compile( |
| 10659 Script::Compile(v8_str("(function() { " | 10644 "(function() { " |
| 10660 " var baz = 87;" | 10645 " var baz = 87;" |
| 10661 " return other.eval('baz');" | 10646 " return other.eval('baz');" |
| 10662 "})();")); | 10647 "})();"); |
| 10663 result = script->Run(); | 10648 result = script->Run(); |
| 10664 CHECK(try_catch.HasCaught()); | 10649 CHECK(try_catch.HasCaught()); |
| 10665 try_catch.Reset(); | 10650 try_catch.Reset(); |
| 10666 | 10651 |
| 10667 // Check that global variables in the other environment are visible | 10652 // Check that global variables in the other environment are visible |
| 10668 // when evaluting code. | 10653 // when evaluting code. |
| 10669 other->Global()->Set(v8_str("bis"), v8_num(1234)); | 10654 other->Global()->Set(v8_str("bis"), v8_num(1234)); |
| 10670 script = Script::Compile(v8_str("other.eval('bis')")); | 10655 script = v8_compile("other.eval('bis')"); |
| 10671 CHECK_EQ(1234, script->Run()->Int32Value()); | 10656 CHECK_EQ(1234, script->Run()->Int32Value()); |
| 10672 CHECK(!try_catch.HasCaught()); | 10657 CHECK(!try_catch.HasCaught()); |
| 10673 | 10658 |
| 10674 // Check that the 'this' pointer points to the global object evaluating | 10659 // Check that the 'this' pointer points to the global object evaluating |
| 10675 // code. | 10660 // code. |
| 10676 other->Global()->Set(v8_str("t"), other->Global()); | 10661 other->Global()->Set(v8_str("t"), other->Global()); |
| 10677 script = Script::Compile(v8_str("other.eval('this == t')")); | 10662 script = v8_compile("other.eval('this == t')"); |
| 10678 result = script->Run(); | 10663 result = script->Run(); |
| 10679 CHECK(result->IsTrue()); | 10664 CHECK(result->IsTrue()); |
| 10680 CHECK(!try_catch.HasCaught()); | 10665 CHECK(!try_catch.HasCaught()); |
| 10681 | 10666 |
| 10682 // Check that variables introduced in with-statement are not visible in | 10667 // Check that variables introduced in with-statement are not visible in |
| 10683 // other context. | 10668 // other context. |
| 10684 script = | 10669 script = v8_compile("with({x:2}){other.eval('x')}"); |
| 10685 Script::Compile(v8_str("with({x:2}){other.eval('x')}")); | |
| 10686 result = script->Run(); | 10670 result = script->Run(); |
| 10687 CHECK(try_catch.HasCaught()); | 10671 CHECK(try_catch.HasCaught()); |
| 10688 try_catch.Reset(); | 10672 try_catch.Reset(); |
| 10689 | 10673 |
| 10690 // Check that you cannot use 'eval.call' with another object than the | 10674 // Check that you cannot use 'eval.call' with another object than the |
| 10691 // current global object. | 10675 // current global object. |
| 10692 script = | 10676 script = v8_compile("other.y = 1; eval.call(other, 'y')"); |
| 10693 Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')")); | |
| 10694 result = script->Run(); | 10677 result = script->Run(); |
| 10695 CHECK(try_catch.HasCaught()); | 10678 CHECK(try_catch.HasCaught()); |
| 10696 } | 10679 } |
| 10697 | 10680 |
| 10698 | 10681 |
| 10699 // Test that calling eval in a context which has been detached from | 10682 // Test that calling eval in a context which has been detached from |
| 10700 // its global throws an exception. This behavior is consistent with | 10683 // its global throws an exception. This behavior is consistent with |
| 10701 // other JavaScript implementations. | 10684 // other JavaScript implementations. |
| 10702 THREADED_TEST(EvalInDetachedGlobal) { | 10685 THREADED_TEST(EvalInDetachedGlobal) { |
| 10703 v8::Isolate* isolate = CcTest::isolate(); | 10686 v8::Isolate* isolate = CcTest::isolate(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10738 LocalContext current; | 10721 LocalContext current; |
| 10739 | 10722 |
| 10740 Local<String> token = v8_str("<security token>"); | 10723 Local<String> token = v8_str("<security token>"); |
| 10741 other->SetSecurityToken(token); | 10724 other->SetSecurityToken(token); |
| 10742 current->SetSecurityToken(token); | 10725 current->SetSecurityToken(token); |
| 10743 | 10726 |
| 10744 // Set up reference from current to other. | 10727 // Set up reference from current to other. |
| 10745 current->Global()->Set(v8_str("other"), other->Global()); | 10728 current->Global()->Set(v8_str("other"), other->Global()); |
| 10746 | 10729 |
| 10747 // Trigger lazy loading in other context. | 10730 // Trigger lazy loading in other context. |
| 10748 Local<Script> script = | 10731 Local<Script> script = v8_compile("other.eval('new Date(42)')"); |
| 10749 Script::Compile(v8_str("other.eval('new Date(42)')")); | |
| 10750 Local<Value> value = script->Run(); | 10732 Local<Value> value = script->Run(); |
| 10751 CHECK_EQ(42.0, value->NumberValue()); | 10733 CHECK_EQ(42.0, value->NumberValue()); |
| 10752 } | 10734 } |
| 10753 | 10735 |
| 10754 | 10736 |
| 10755 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { | 10737 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 10756 ApiTestFuzzer::Fuzz(); | 10738 ApiTestFuzzer::Fuzz(); |
| 10757 if (args.IsConstructCall()) { | 10739 if (args.IsConstructCall()) { |
| 10758 if (args[0]->IsInt32()) { | 10740 if (args[0]->IsInt32()) { |
| 10759 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); | 10741 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); |
| (...skipping 3483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14243 CHECK_EQ(1, result->InternalFieldCount()); | 14225 CHECK_EQ(1, result->InternalFieldCount()); |
| 14244 } | 14226 } |
| 14245 | 14227 |
| 14246 | 14228 |
| 14247 // If part of the threaded tests, this test makes ThreadingTest fail | 14229 // If part of the threaded tests, this test makes ThreadingTest fail |
| 14248 // on mac. | 14230 // on mac. |
| 14249 TEST(CatchStackOverflow) { | 14231 TEST(CatchStackOverflow) { |
| 14250 LocalContext context; | 14232 LocalContext context; |
| 14251 v8::HandleScope scope(context->GetIsolate()); | 14233 v8::HandleScope scope(context->GetIsolate()); |
| 14252 v8::TryCatch try_catch; | 14234 v8::TryCatch try_catch; |
| 14253 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::NewFromUtf8( | 14235 v8::Handle<v8::Value> result = CompileRun( |
| 14254 context->GetIsolate(), | |
| 14255 "function f() {" | 14236 "function f() {" |
| 14256 " return f();" | 14237 " return f();" |
| 14257 "}" | 14238 "}" |
| 14258 "" | 14239 "" |
| 14259 "f();")); | 14240 "f();"); |
| 14260 v8::Handle<v8::Value> result = script->Run(); | |
| 14261 CHECK(result.IsEmpty()); | 14241 CHECK(result.IsEmpty()); |
| 14262 } | 14242 } |
| 14263 | 14243 |
| 14264 | 14244 |
| 14265 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, | 14245 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, |
| 14266 const char* resource_name, | 14246 const char* resource_name, |
| 14267 int line_offset) { | 14247 int line_offset) { |
| 14268 v8::HandleScope scope(CcTest::isolate()); | 14248 v8::HandleScope scope(CcTest::isolate()); |
| 14269 v8::TryCatch try_catch; | 14249 v8::TryCatch try_catch; |
| 14270 v8::Handle<v8::Value> result = script->Run(); | 14250 v8::Handle<v8::Value> result = script->Run(); |
| 14271 CHECK(result.IsEmpty()); | 14251 CHECK(result.IsEmpty()); |
| 14272 CHECK(try_catch.HasCaught()); | 14252 CHECK(try_catch.HasCaught()); |
| 14273 v8::Handle<v8::Message> message = try_catch.Message(); | 14253 v8::Handle<v8::Message> message = try_catch.Message(); |
| 14274 CHECK(!message.IsEmpty()); | 14254 CHECK(!message.IsEmpty()); |
| 14275 CHECK_EQ(10 + line_offset, message->GetLineNumber()); | 14255 CHECK_EQ(10 + line_offset, message->GetLineNumber()); |
| 14276 CHECK_EQ(91, message->GetStartPosition()); | 14256 CHECK_EQ(91, message->GetStartPosition()); |
| 14277 CHECK_EQ(92, message->GetEndPosition()); | 14257 CHECK_EQ(92, message->GetEndPosition()); |
| 14278 CHECK_EQ(2, message->GetStartColumn()); | 14258 CHECK_EQ(2, message->GetStartColumn()); |
| 14279 CHECK_EQ(3, message->GetEndColumn()); | 14259 CHECK_EQ(3, message->GetEndColumn()); |
| 14280 v8::String::Utf8Value line(message->GetSourceLine()); | 14260 v8::String::Utf8Value line(message->GetSourceLine()); |
| 14281 CHECK_EQ(" throw 'nirk';", *line); | 14261 CHECK_EQ(" throw 'nirk';", *line); |
| 14282 v8::String::Utf8Value name(message->GetScriptResourceName()); | 14262 v8::String::Utf8Value name(message->GetScriptResourceName()); |
| 14283 CHECK_EQ(resource_name, *name); | 14263 CHECK_EQ(resource_name, *name); |
| 14284 } | 14264 } |
| 14285 | 14265 |
| 14286 | 14266 |
| 14287 THREADED_TEST(TryCatchSourceInfo) { | 14267 THREADED_TEST(TryCatchSourceInfo) { |
| 14288 LocalContext context; | 14268 LocalContext context; |
| 14289 v8::HandleScope scope(context->GetIsolate()); | 14269 v8::HandleScope scope(context->GetIsolate()); |
| 14290 v8::Handle<v8::String> source = v8::String::NewFromUtf8( | 14270 v8::Local<v8::String> source = v8_str( |
| 14291 context->GetIsolate(), | |
| 14292 "function Foo() {\n" | 14271 "function Foo() {\n" |
| 14293 " return Bar();\n" | 14272 " return Bar();\n" |
| 14294 "}\n" | 14273 "}\n" |
| 14295 "\n" | 14274 "\n" |
| 14296 "function Bar() {\n" | 14275 "function Bar() {\n" |
| 14297 " return Baz();\n" | 14276 " return Baz();\n" |
| 14298 "}\n" | 14277 "}\n" |
| 14299 "\n" | 14278 "\n" |
| 14300 "function Baz() {\n" | 14279 "function Baz() {\n" |
| 14301 " throw 'nirk';\n" | 14280 " throw 'nirk';\n" |
| 14302 "}\n" | 14281 "}\n" |
| 14303 "\n" | 14282 "\n" |
| 14304 "Foo();\n"); | 14283 "Foo();\n"); |
| 14305 | 14284 |
| 14306 const char* resource_name; | 14285 const char* resource_name; |
| 14307 v8::Handle<v8::Script> script; | 14286 v8::Handle<v8::Script> script; |
| 14308 resource_name = "test.js"; | 14287 resource_name = "test.js"; |
| 14309 script = v8::Script::Compile( | 14288 script = CompileWithOrigin(source, resource_name); |
| 14310 source, v8::String::NewFromUtf8(context->GetIsolate(), resource_name)); | |
| 14311 CheckTryCatchSourceInfo(script, resource_name, 0); | 14289 CheckTryCatchSourceInfo(script, resource_name, 0); |
| 14312 | 14290 |
| 14313 resource_name = "test1.js"; | 14291 resource_name = "test1.js"; |
| 14314 v8::ScriptOrigin origin1( | 14292 v8::ScriptOrigin origin1( |
| 14315 v8::String::NewFromUtf8(context->GetIsolate(), resource_name)); | 14293 v8::String::NewFromUtf8(context->GetIsolate(), resource_name)); |
| 14316 script = v8::Script::Compile(source, &origin1); | 14294 script = v8::Script::Compile(source, &origin1); |
| 14317 CheckTryCatchSourceInfo(script, resource_name, 0); | 14295 CheckTryCatchSourceInfo(script, resource_name, 0); |
| 14318 | 14296 |
| 14319 resource_name = "test2.js"; | 14297 resource_name = "test2.js"; |
| 14320 v8::ScriptOrigin origin2( | 14298 v8::ScriptOrigin origin2( |
| 14321 v8::String::NewFromUtf8(context->GetIsolate(), resource_name), | 14299 v8::String::NewFromUtf8(context->GetIsolate(), resource_name), |
| 14322 v8::Integer::New(context->GetIsolate(), 7)); | 14300 v8::Integer::New(context->GetIsolate(), 7)); |
| 14323 script = v8::Script::Compile(source, &origin2); | 14301 script = v8::Script::Compile(source, &origin2); |
| 14324 CheckTryCatchSourceInfo(script, resource_name, 7); | 14302 CheckTryCatchSourceInfo(script, resource_name, 7); |
| 14325 } | 14303 } |
| 14326 | 14304 |
| 14327 | 14305 |
| 14328 THREADED_TEST(CompilationCache) { | 14306 THREADED_TEST(CompilationCache) { |
| 14329 LocalContext context; | 14307 LocalContext context; |
| 14330 v8::HandleScope scope(context->GetIsolate()); | 14308 v8::HandleScope scope(context->GetIsolate()); |
| 14331 v8::Handle<v8::String> source0 = | 14309 v8::Handle<v8::String> source0 = |
| 14332 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); | 14310 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); |
| 14333 v8::Handle<v8::String> source1 = | 14311 v8::Handle<v8::String> source1 = |
| 14334 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); | 14312 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); |
| 14335 v8::Handle<v8::Script> script0 = v8::Script::Compile( | 14313 v8::Handle<v8::Script> script0 = CompileWithOrigin(source0, "test.js"); |
| 14336 source0, v8::String::NewFromUtf8(context->GetIsolate(), "test.js")); | 14314 v8::Handle<v8::Script> script1 = CompileWithOrigin(source1, "test.js"); |
| 14337 v8::Handle<v8::Script> script1 = v8::Script::Compile( | |
| 14338 source1, v8::String::NewFromUtf8(context->GetIsolate(), "test.js")); | |
| 14339 v8::Handle<v8::Script> script2 = | 14315 v8::Handle<v8::Script> script2 = |
| 14340 v8::Script::Compile(source0); // different origin | 14316 v8::Script::Compile(source0); // different origin |
| 14341 CHECK_EQ(1234, script0->Run()->Int32Value()); | 14317 CHECK_EQ(1234, script0->Run()->Int32Value()); |
| 14342 CHECK_EQ(1234, script1->Run()->Int32Value()); | 14318 CHECK_EQ(1234, script1->Run()->Int32Value()); |
| 14343 CHECK_EQ(1234, script2->Run()->Int32Value()); | 14319 CHECK_EQ(1234, script2->Run()->Int32Value()); |
| 14344 } | 14320 } |
| 14345 | 14321 |
| 14346 | 14322 |
| 14347 static void FunctionNameCallback( | 14323 static void FunctionNameCallback( |
| 14348 const v8::FunctionCallbackInfo<v8::Value>& args) { | 14324 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14401 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); | 14377 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); |
| 14402 CHECK_EQ(elmv[i], *elm); | 14378 CHECK_EQ(elmv[i], *elm); |
| 14403 } | 14379 } |
| 14404 } | 14380 } |
| 14405 | 14381 |
| 14406 | 14382 |
| 14407 THREADED_TEST(PropertyEnumeration) { | 14383 THREADED_TEST(PropertyEnumeration) { |
| 14408 LocalContext context; | 14384 LocalContext context; |
| 14409 v8::Isolate* isolate = context->GetIsolate(); | 14385 v8::Isolate* isolate = context->GetIsolate(); |
| 14410 v8::HandleScope scope(isolate); | 14386 v8::HandleScope scope(isolate); |
| 14411 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::NewFromUtf8( | 14387 v8::Handle<v8::Value> obj = CompileRun( |
| 14412 context->GetIsolate(), | |
| 14413 "var result = [];" | 14388 "var result = [];" |
| 14414 "result[0] = {};" | 14389 "result[0] = {};" |
| 14415 "result[1] = {a: 1, b: 2};" | 14390 "result[1] = {a: 1, b: 2};" |
| 14416 "result[2] = [1, 2, 3];" | 14391 "result[2] = [1, 2, 3];" |
| 14417 "var proto = {x: 1, y: 2, z: 3};" | 14392 "var proto = {x: 1, y: 2, z: 3};" |
| 14418 "var x = { __proto__: proto, w: 0, z: 1 };" | 14393 "var x = { __proto__: proto, w: 0, z: 1 };" |
| 14419 "result[3] = x;" | 14394 "result[3] = x;" |
| 14420 "result;"))->Run(); | 14395 "result;"); |
| 14421 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); | 14396 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); |
| 14422 CHECK_EQ(4, elms->Length()); | 14397 CHECK_EQ(4, elms->Length()); |
| 14423 int elmc0 = 0; | 14398 int elmc0 = 0; |
| 14424 const char** elmv0 = NULL; | 14399 const char** elmv0 = NULL; |
| 14425 CheckProperties( | 14400 CheckProperties( |
| 14426 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14401 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
| 14427 CheckOwnProperties( | 14402 CheckOwnProperties( |
| 14428 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14403 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
| 14429 int elmc1 = 2; | 14404 int elmc1 = 2; |
| 14430 const char* elmv1[] = {"a", "b"}; | 14405 const char* elmv1[] = {"a", "b"}; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 14446 const char* elmv4[] = {"w", "z"}; | 14421 const char* elmv4[] = {"w", "z"}; |
| 14447 CheckOwnProperties( | 14422 CheckOwnProperties( |
| 14448 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4); | 14423 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4); |
| 14449 } | 14424 } |
| 14450 | 14425 |
| 14451 | 14426 |
| 14452 THREADED_TEST(PropertyEnumeration2) { | 14427 THREADED_TEST(PropertyEnumeration2) { |
| 14453 LocalContext context; | 14428 LocalContext context; |
| 14454 v8::Isolate* isolate = context->GetIsolate(); | 14429 v8::Isolate* isolate = context->GetIsolate(); |
| 14455 v8::HandleScope scope(isolate); | 14430 v8::HandleScope scope(isolate); |
| 14456 v8::Handle<v8::Value> obj = v8::Script::Compile(v8::String::NewFromUtf8( | 14431 v8::Handle<v8::Value> obj = CompileRun( |
| 14457 context->GetIsolate(), | |
| 14458 "var result = [];" | 14432 "var result = [];" |
| 14459 "result[0] = {};" | 14433 "result[0] = {};" |
| 14460 "result[1] = {a: 1, b: 2};" | 14434 "result[1] = {a: 1, b: 2};" |
| 14461 "result[2] = [1, 2, 3];" | 14435 "result[2] = [1, 2, 3];" |
| 14462 "var proto = {x: 1, y: 2, z: 3};" | 14436 "var proto = {x: 1, y: 2, z: 3};" |
| 14463 "var x = { __proto__: proto, w: 0, z: 1 };" | 14437 "var x = { __proto__: proto, w: 0, z: 1 };" |
| 14464 "result[3] = x;" | 14438 "result[3] = x;" |
| 14465 "result;"))->Run(); | 14439 "result;"); |
| 14466 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); | 14440 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); |
| 14467 CHECK_EQ(4, elms->Length()); | 14441 CHECK_EQ(4, elms->Length()); |
| 14468 int elmc0 = 0; | 14442 int elmc0 = 0; |
| 14469 const char** elmv0 = NULL; | 14443 const char** elmv0 = NULL; |
| 14470 CheckProperties(isolate, | 14444 CheckProperties(isolate, |
| 14471 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14445 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
| 14472 | 14446 |
| 14473 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); | 14447 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); |
| 14474 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); | 14448 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); |
| 14475 CHECK_EQ(0, props->Length()); | 14449 CHECK_EQ(0, props->Length()); |
| (...skipping 2516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16992 | 16966 |
| 16993 #undef IS_ARRAY_BUFFER_VIEW_TEST | 16967 #undef IS_ARRAY_BUFFER_VIEW_TEST |
| 16994 | 16968 |
| 16995 | 16969 |
| 16996 | 16970 |
| 16997 THREADED_TEST(ScriptContextDependence) { | 16971 THREADED_TEST(ScriptContextDependence) { |
| 16998 LocalContext c1; | 16972 LocalContext c1; |
| 16999 v8::HandleScope scope(c1->GetIsolate()); | 16973 v8::HandleScope scope(c1->GetIsolate()); |
| 17000 const char *source = "foo"; | 16974 const char *source = "foo"; |
| 17001 v8::Handle<v8::Script> dep = | 16975 v8::Handle<v8::Script> dep = |
| 17002 v8::Script::Compile(v8::String::NewFromUtf8(c1->GetIsolate(), source)); | 16976 v8_compile(source); |
| 17003 v8::Handle<v8::Script> indep = | 16977 v8::Handle<v8::Script> indep = |
| 17004 v8::Script::New(v8::String::NewFromUtf8(c1->GetIsolate(), source)); | 16978 v8::Script::New(v8::String::NewFromUtf8(c1->GetIsolate(), source)); |
| 17005 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo"), | 16979 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo"), |
| 17006 v8::Integer::New(c1->GetIsolate(), 100)); | 16980 v8::Integer::New(c1->GetIsolate(), 100)); |
| 17007 CHECK_EQ(dep->Run()->Int32Value(), 100); | 16981 CHECK_EQ(dep->Run()->Int32Value(), 100); |
| 17008 CHECK_EQ(indep->Run()->Int32Value(), 100); | 16982 CHECK_EQ(indep->Run()->Int32Value(), 100); |
| 17009 LocalContext c2; | 16983 LocalContext c2; |
| 17010 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo"), | 16984 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo"), |
| 17011 v8::Integer::New(c2->GetIsolate(), 101)); | 16985 v8::Integer::New(c2->GetIsolate(), 101)); |
| 17012 CHECK_EQ(dep->Run()->Int32Value(), 100); | 16986 CHECK_EQ(dep->Run()->Int32Value(), 100); |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17169 } | 17143 } |
| 17170 | 17144 |
| 17171 | 17145 |
| 17172 TEST(CaptureStackTraceForUncaughtException) { | 17146 TEST(CaptureStackTraceForUncaughtException) { |
| 17173 report_count = 0; | 17147 report_count = 0; |
| 17174 LocalContext env; | 17148 LocalContext env; |
| 17175 v8::HandleScope scope(env->GetIsolate()); | 17149 v8::HandleScope scope(env->GetIsolate()); |
| 17176 v8::V8::AddMessageListener(StackTraceForUncaughtExceptionListener); | 17150 v8::V8::AddMessageListener(StackTraceForUncaughtExceptionListener); |
| 17177 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 17151 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
| 17178 | 17152 |
| 17179 Script::Compile(v8_str("function foo() {\n" | 17153 CompileRunWithOrigin( |
| 17180 " throw 1;\n" | 17154 "function foo() {\n" |
| 17181 "};\n" | 17155 " throw 1;\n" |
| 17182 "function bar() {\n" | 17156 "};\n" |
| 17183 " foo();\n" | 17157 "function bar() {\n" |
| 17184 "};"), | 17158 " foo();\n" |
| 17185 v8_str("origin"))->Run(); | 17159 "};", |
| 17160 "origin"); |
| 17186 v8::Local<v8::Object> global = env->Global(); | 17161 v8::Local<v8::Object> global = env->Global(); |
| 17187 Local<Value> trouble = global->Get(v8_str("bar")); | 17162 Local<Value> trouble = global->Get(v8_str("bar")); |
| 17188 CHECK(trouble->IsFunction()); | 17163 CHECK(trouble->IsFunction()); |
| 17189 Function::Cast(*trouble)->Call(global, 0, NULL); | 17164 Function::Cast(*trouble)->Call(global, 0, NULL); |
| 17190 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 17165 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
| 17191 v8::V8::RemoveMessageListeners(StackTraceForUncaughtExceptionListener); | 17166 v8::V8::RemoveMessageListeners(StackTraceForUncaughtExceptionListener); |
| 17192 } | 17167 } |
| 17193 | 17168 |
| 17194 | 17169 |
| 17195 TEST(CaptureStackTraceForUncaughtExceptionAndSetters) { | 17170 TEST(CaptureStackTraceForUncaughtExceptionAndSetters) { |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 17410 templ->Set(v8_str("AnalyzeScriptIdInStack"), | 17385 templ->Set(v8_str("AnalyzeScriptIdInStack"), |
| 17411 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); | 17386 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); |
| 17412 LocalContext context(0, templ); | 17387 LocalContext context(0, templ); |
| 17413 | 17388 |
| 17414 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( | 17389 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( |
| 17415 isolate, | 17390 isolate, |
| 17416 "function foo() {\n" | 17391 "function foo() {\n" |
| 17417 " AnalyzeScriptIdInStack();" | 17392 " AnalyzeScriptIdInStack();" |
| 17418 "}\n" | 17393 "}\n" |
| 17419 "foo();\n"); | 17394 "foo();\n"); |
| 17420 v8::ScriptOrigin origin = | 17395 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test"); |
| 17421 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test")); | |
| 17422 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); | |
| 17423 script->Run(); | 17396 script->Run(); |
| 17424 for (int i = 0; i < 2; i++) { | 17397 for (int i = 0; i < 2; i++) { |
| 17425 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); | 17398 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); |
| 17426 CHECK_EQ(scriptIdInStack[i], script->GetId()); | 17399 CHECK_EQ(scriptIdInStack[i], script->GetId()); |
| 17427 } | 17400 } |
| 17428 } | 17401 } |
| 17429 | 17402 |
| 17430 | 17403 |
| 17431 void AnalyzeStackOfInlineScriptWithSourceURL( | 17404 void AnalyzeStackOfInlineScriptWithSourceURL( |
| 17432 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17405 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| (...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18437 " this.x = 23;" | 18410 " this.x = 23;" |
| 18438 "};" | 18411 "};" |
| 18439 "C1.prototype = P;" | 18412 "C1.prototype = P;" |
| 18440 "function C2() {" | 18413 "function C2() {" |
| 18441 " this.x = 23" | 18414 " this.x = 23" |
| 18442 "};" | 18415 "};" |
| 18443 "C2.prototype = { };" | 18416 "C2.prototype = { };" |
| 18444 "C2.prototype.__proto__ = P;"); | 18417 "C2.prototype.__proto__ = P;"); |
| 18445 | 18418 |
| 18446 v8::Local<v8::Script> script; | 18419 v8::Local<v8::Script> script; |
| 18447 script = v8::Script::Compile(v8_str("new C1();")); | 18420 script = v8_compile("new C1();"); |
| 18448 for (int i = 0; i < 10; i++) { | 18421 for (int i = 0; i < 10; i++) { |
| 18449 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18422 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18450 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); | 18423 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); |
| 18451 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); | 18424 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); |
| 18452 } | 18425 } |
| 18453 | 18426 |
| 18454 script = v8::Script::Compile(v8_str("new C2();")); | 18427 script = v8_compile("new C2();"); |
| 18455 for (int i = 0; i < 10; i++) { | 18428 for (int i = 0; i < 10; i++) { |
| 18456 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); | 18429 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18457 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); | 18430 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); |
| 18458 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); | 18431 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); |
| 18459 } | 18432 } |
| 18460 } | 18433 } |
| 18461 | 18434 |
| 18462 | 18435 |
| 18463 static void NamedPropertyGetterWhichReturns42( | 18436 static void NamedPropertyGetterWhichReturns42( |
| 18464 Local<String> name, | 18437 Local<String> name, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 18489 " this.x = 23;" | 18462 " this.x = 23;" |
| 18490 "};" | 18463 "};" |
| 18491 "C1.prototype = P;" | 18464 "C1.prototype = P;" |
| 18492 "function C2() {" | 18465 "function C2() {" |
| 18493 " this.x = 23" | 18466 " this.x = 23" |
| 18494 "};" | 18467 "};" |
| 18495 "C2.prototype = { };" | 18468 "C2.prototype = { };" |
| 18496 "C2.prototype.__proto__ = P;"); | 18469 "C2.prototype.__proto__ = P;"); |
| 18497 | 18470 |
| 18498 v8::Local<v8::Script> script; | 18471 v8::Local<v8::Script> script; |
| 18499 script = v8::Script::Compile(v8_str("new C1();")); | 18472 script = v8_compile("new C1();"); |
| 18500 for (int i = 0; i < 10; i++) { | 18473 for (int i = 0; i < 10; i++) { |
| 18501 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18474 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18502 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); | 18475 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); |
| 18503 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); | 18476 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); |
| 18504 } | 18477 } |
| 18505 | 18478 |
| 18506 script = v8::Script::Compile(v8_str("new C2();")); | 18479 script = v8_compile("new C2();"); |
| 18507 for (int i = 0; i < 10; i++) { | 18480 for (int i = 0; i < 10; i++) { |
| 18508 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); | 18481 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18509 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value()); | 18482 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value()); |
| 18510 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value()); | 18483 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value()); |
| 18511 } | 18484 } |
| 18512 } | 18485 } |
| 18513 | 18486 |
| 18514 | 18487 |
| 18515 TEST(Regress618) { | 18488 TEST(Regress618) { |
| 18516 const char* source = "function C1() {" | 18489 const char* source = "function C1() {" |
| 18517 " this.x = 23;" | 18490 " this.x = 23;" |
| 18518 "};" | 18491 "};" |
| 18519 "C1.prototype = P;"; | 18492 "C1.prototype = P;"; |
| 18520 | 18493 |
| 18521 LocalContext context; | 18494 LocalContext context; |
| 18522 v8::Isolate* isolate = context->GetIsolate(); | 18495 v8::Isolate* isolate = context->GetIsolate(); |
| 18523 v8::HandleScope scope(isolate); | 18496 v8::HandleScope scope(isolate); |
| 18524 v8::Local<v8::Script> script; | 18497 v8::Local<v8::Script> script; |
| 18525 | 18498 |
| 18526 // Use a simple object as prototype. | 18499 // Use a simple object as prototype. |
| 18527 v8::Local<v8::Object> prototype = v8::Object::New(isolate); | 18500 v8::Local<v8::Object> prototype = v8::Object::New(isolate); |
| 18528 prototype->Set(v8_str("y"), v8_num(42)); | 18501 prototype->Set(v8_str("y"), v8_num(42)); |
| 18529 context->Global()->Set(v8_str("P"), prototype); | 18502 context->Global()->Set(v8_str("P"), prototype); |
| 18530 | 18503 |
| 18531 // This compile will add the code to the compilation cache. | 18504 // This compile will add the code to the compilation cache. |
| 18532 CompileRun(source); | 18505 CompileRun(source); |
| 18533 | 18506 |
| 18534 script = v8::Script::Compile(v8_str("new C1();")); | 18507 script = v8_compile("new C1();"); |
| 18535 // Allow enough iterations for the inobject slack tracking logic | 18508 // Allow enough iterations for the inobject slack tracking logic |
| 18536 // to finalize instance size and install the fast construct stub. | 18509 // to finalize instance size and install the fast construct stub. |
| 18537 for (int i = 0; i < 256; i++) { | 18510 for (int i = 0; i < 256; i++) { |
| 18538 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18511 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18539 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); | 18512 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); |
| 18540 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); | 18513 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); |
| 18541 } | 18514 } |
| 18542 | 18515 |
| 18543 // Use an API object with accessors as prototype. | 18516 // Use an API object with accessors as prototype. |
| 18544 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 18517 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 18545 templ->SetAccessor(v8_str("x"), | 18518 templ->SetAccessor(v8_str("x"), |
| 18546 GetterWhichReturns42, | 18519 GetterWhichReturns42, |
| 18547 SetterWhichSetsYOnThisTo23); | 18520 SetterWhichSetsYOnThisTo23); |
| 18548 context->Global()->Set(v8_str("P"), templ->NewInstance()); | 18521 context->Global()->Set(v8_str("P"), templ->NewInstance()); |
| 18549 | 18522 |
| 18550 // This compile will get the code from the compilation cache. | 18523 // This compile will get the code from the compilation cache. |
| 18551 CompileRun(source); | 18524 CompileRun(source); |
| 18552 | 18525 |
| 18553 script = v8::Script::Compile(v8_str("new C1();")); | 18526 script = v8_compile("new C1();"); |
| 18554 for (int i = 0; i < 10; i++) { | 18527 for (int i = 0; i < 10; i++) { |
| 18555 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18528 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); |
| 18556 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); | 18529 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); |
| 18557 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); | 18530 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); |
| 18558 } | 18531 } |
| 18559 } | 18532 } |
| 18560 | 18533 |
| 18561 v8::Isolate* gc_callbacks_isolate = NULL; | 18534 v8::Isolate* gc_callbacks_isolate = NULL; |
| 18562 int prologue_call_count = 0; | 18535 int prologue_call_count = 0; |
| 18563 int epilogue_call_count = 0; | 18536 int epilogue_call_count = 0; |
| (...skipping 3569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22133 new v8::internal::HistogramTimer( | 22106 new v8::internal::HistogramTimer( |
| 22134 "V8.Test", 0, 10000, 50, | 22107 "V8.Test", 0, 10000, 50, |
| 22135 reinterpret_cast<v8::internal::Isolate*>(isolate)); | 22108 reinterpret_cast<v8::internal::Isolate*>(isolate)); |
| 22136 histogramTimer->Start(); | 22109 histogramTimer->Start(); |
| 22137 CHECK_EQ("V8.Test", last_event_message); | 22110 CHECK_EQ("V8.Test", last_event_message); |
| 22138 CHECK_EQ(0, last_event_status); | 22111 CHECK_EQ(0, last_event_status); |
| 22139 histogramTimer->Stop(); | 22112 histogramTimer->Stop(); |
| 22140 CHECK_EQ("V8.Test", last_event_message); | 22113 CHECK_EQ("V8.Test", last_event_message); |
| 22141 CHECK_EQ(1, last_event_status); | 22114 CHECK_EQ(1, last_event_status); |
| 22142 } | 22115 } |
| OLD | NEW |