Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: test/cctest/test-api.cc

Issue 155723005: A64: Synchronize with r19001. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/cctest.status ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
455 static uint16_t* AsciiToTwoByteString(const char* source) { 455 static uint16_t* AsciiToTwoByteString(const char* source) {
456 int array_length = i::StrLength(source) + 1; 456 int array_length = i::StrLength(source) + 1;
457 uint16_t* converted = i::NewArray<uint16_t>(array_length); 457 uint16_t* converted = i::NewArray<uint16_t>(array_length);
458 for (int i = 0; i < array_length; i++) converted[i] = source[i]; 458 for (int i = 0; i < array_length; i++) converted[i] = source[i];
459 return converted; 459 return converted;
460 } 460 }
461 461
462 462
463 class TestResource: public String::ExternalStringResource { 463 class TestResource: public String::ExternalStringResource {
464 public: 464 public:
465 explicit TestResource(uint16_t* data, int* counter = NULL) 465 TestResource(uint16_t* data, int* counter = NULL, bool owning_data = true)
466 : data_(data), length_(0), counter_(counter) { 466 : data_(data), length_(0), counter_(counter), owning_data_(owning_data) {
467 while (data[length_]) ++length_; 467 while (data[length_]) ++length_;
468 } 468 }
469 469
470 ~TestResource() { 470 ~TestResource() {
471 i::DeleteArray(data_); 471 if (owning_data_) i::DeleteArray(data_);
472 if (counter_ != NULL) ++*counter_; 472 if (counter_ != NULL) ++*counter_;
473 } 473 }
474 474
475 const uint16_t* data() const { 475 const uint16_t* data() const {
476 return data_; 476 return data_;
477 } 477 }
478 478
479 size_t length() const { 479 size_t length() const {
480 return length_; 480 return length_;
481 } 481 }
482
482 private: 483 private:
483 uint16_t* data_; 484 uint16_t* data_;
484 size_t length_; 485 size_t length_;
485 int* counter_; 486 int* counter_;
487 bool owning_data_;
486 }; 488 };
487 489
488 490
489 class TestAsciiResource: public String::ExternalAsciiStringResource { 491 class TestAsciiResource: public String::ExternalAsciiStringResource {
490 public: 492 public:
491 explicit TestAsciiResource(const char* data, int* counter = NULL) 493 TestAsciiResource(const char* data, int* counter = NULL, size_t offset = 0)
492 : data_(data), length_(strlen(data)), counter_(counter) { } 494 : orig_data_(data),
495 data_(data + offset),
496 length_(strlen(data) - offset),
497 counter_(counter) { }
493 498
494 ~TestAsciiResource() { 499 ~TestAsciiResource() {
495 i::DeleteArray(data_); 500 i::DeleteArray(orig_data_);
496 if (counter_ != NULL) ++*counter_; 501 if (counter_ != NULL) ++*counter_;
497 } 502 }
498 503
499 const char* data() const { 504 const char* data() const {
500 return data_; 505 return data_;
501 } 506 }
502 507
503 size_t length() const { 508 size_t length() const {
504 return length_; 509 return length_;
505 } 510 }
511
506 private: 512 private:
513 const char* orig_data_;
507 const char* data_; 514 const char* data_;
508 size_t length_; 515 size_t length_;
509 int* counter_; 516 int* counter_;
510 }; 517 };
511 518
512 519
513 THREADED_TEST(ScriptUsingStringResource) { 520 THREADED_TEST(ScriptUsingStringResource) {
514 int dispose_count = 0; 521 int dispose_count = 0;
515 const char* c_source = "1 + 2 * 3"; 522 const char* c_source = "1 + 2 * 3";
516 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); 523 uint16_t* two_byte_source = AsciiToTwoByteString(c_source);
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 733
727 // Trigger GCs so that the newly allocated string moves to old gen. 734 // Trigger GCs so that the newly allocated string moves to old gen.
728 SimulateFullSpace(CcTest::heap()->old_pointer_space()); 735 SimulateFullSpace(CcTest::heap()->old_pointer_space());
729 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 736 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
730 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 737 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
731 738
732 // Turn into external string with unaligned resource data. 739 // Turn into external string with unaligned resource data.
733 int dispose_count = 0; 740 int dispose_count = 0;
734 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz"; 741 const char* c_cons = "_abcdefghijklmnopqrstuvwxyz";
735 bool success = cons->MakeExternal( 742 bool success = cons->MakeExternal(
736 new TestAsciiResource(i::StrDup(c_cons) + 1, &dispose_count)); 743 new TestAsciiResource(i::StrDup(c_cons), &dispose_count, 1));
737 CHECK(success); 744 CHECK(success);
738 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz"; 745 const char* c_slice = "_bcdefghijklmnopqrstuvwxyz";
739 success = slice->MakeExternal( 746 success = slice->MakeExternal(
740 new TestAsciiResource(i::StrDup(c_slice) + 1, &dispose_count)); 747 new TestAsciiResource(i::StrDup(c_slice), &dispose_count, 1));
741 CHECK(success); 748 CHECK(success);
742 749
743 // Trigger GCs and force evacuation. 750 // Trigger GCs and force evacuation.
744 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); 751 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags);
745 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); 752 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask);
746 } 753 }
747 754
748 755
749 THREADED_TEST(UsingExternalString) { 756 THREADED_TEST(UsingExternalString) {
750 i::Factory* factory = CcTest::i_isolate()->factory(); 757 i::Factory* factory = CcTest::i_isolate()->factory();
(...skipping 5855 matching lines...) Expand 10 before | Expand all | Expand 10 after
6606 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); 6613 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run();
6607 } 6614 }
6608 6615
6609 6616
6610 static const char* kSimpleExtensionSource = 6617 static const char* kSimpleExtensionSource =
6611 "function Foo() {" 6618 "function Foo() {"
6612 " return 4;" 6619 " return 4;"
6613 "}"; 6620 "}";
6614 6621
6615 6622
6616 THREADED_TEST(SimpleExtensions) { 6623 TEST(SimpleExtensions) {
6617 v8::HandleScope handle_scope(CcTest::isolate()); 6624 v8::HandleScope handle_scope(CcTest::isolate());
6618 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); 6625 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource));
6619 const char* extension_names[] = { "simpletest" }; 6626 const char* extension_names[] = { "simpletest" };
6620 v8::ExtensionConfiguration extensions(1, extension_names); 6627 v8::ExtensionConfiguration extensions(1, extension_names);
6621 v8::Handle<Context> context = 6628 v8::Handle<Context> context =
6622 Context::New(CcTest::isolate(), &extensions); 6629 Context::New(CcTest::isolate(), &extensions);
6623 Context::Scope lock(context); 6630 Context::Scope lock(context);
6624 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 6631 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
6625 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); 6632 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4));
6626 } 6633 }
6627 6634
6628 6635
6629 THREADED_TEST(NullExtensions) { 6636 TEST(NullExtensions) {
6630 v8::HandleScope handle_scope(CcTest::isolate()); 6637 v8::HandleScope handle_scope(CcTest::isolate());
6631 v8::RegisterExtension(new Extension("nulltest", NULL)); 6638 v8::RegisterExtension(new Extension("nulltest", NULL));
6632 const char* extension_names[] = { "nulltest" }; 6639 const char* extension_names[] = { "nulltest" };
6633 v8::ExtensionConfiguration extensions(1, extension_names); 6640 v8::ExtensionConfiguration extensions(1, extension_names);
6634 v8::Handle<Context> context = 6641 v8::Handle<Context> context =
6635 Context::New(CcTest::isolate(), &extensions); 6642 Context::New(CcTest::isolate(), &extensions);
6636 Context::Scope lock(context); 6643 Context::Scope lock(context);
6637 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run(); 6644 v8::Handle<Value> result = Script::Compile(v8_str("1+3"))->Run();
6638 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); 6645 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4));
6639 } 6646 }
6640 6647
6641 6648
6642 static const char* kEmbeddedExtensionSource = 6649 static const char* kEmbeddedExtensionSource =
6643 "function Ret54321(){return 54321;}~~@@$" 6650 "function Ret54321(){return 54321;}~~@@$"
6644 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; 6651 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS.";
6645 static const int kEmbeddedExtensionSourceValidLen = 34; 6652 static const int kEmbeddedExtensionSourceValidLen = 34;
6646 6653
6647 6654
6648 THREADED_TEST(ExtensionMissingSourceLength) { 6655 TEST(ExtensionMissingSourceLength) {
6649 v8::HandleScope handle_scope(CcTest::isolate()); 6656 v8::HandleScope handle_scope(CcTest::isolate());
6650 v8::RegisterExtension(new Extension("srclentest_fail", 6657 v8::RegisterExtension(new Extension("srclentest_fail",
6651 kEmbeddedExtensionSource)); 6658 kEmbeddedExtensionSource));
6652 const char* extension_names[] = { "srclentest_fail" }; 6659 const char* extension_names[] = { "srclentest_fail" };
6653 v8::ExtensionConfiguration extensions(1, extension_names); 6660 v8::ExtensionConfiguration extensions(1, extension_names);
6654 v8::Handle<Context> context = 6661 v8::Handle<Context> context =
6655 Context::New(CcTest::isolate(), &extensions); 6662 Context::New(CcTest::isolate(), &extensions);
6656 CHECK_EQ(0, *context); 6663 CHECK_EQ(0, *context);
6657 } 6664 }
6658 6665
6659 6666
6660 THREADED_TEST(ExtensionWithSourceLength) { 6667 TEST(ExtensionWithSourceLength) {
6661 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; 6668 for (int source_len = kEmbeddedExtensionSourceValidLen - 1;
6662 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { 6669 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) {
6663 v8::HandleScope handle_scope(CcTest::isolate()); 6670 v8::HandleScope handle_scope(CcTest::isolate());
6664 i::ScopedVector<char> extension_name(32); 6671 i::ScopedVector<char> extension_name(32);
6665 i::OS::SNPrintF(extension_name, "ext #%d", source_len); 6672 i::OS::SNPrintF(extension_name, "ext #%d", source_len);
6666 v8::RegisterExtension(new Extension(extension_name.start(), 6673 v8::RegisterExtension(new Extension(extension_name.start(),
6667 kEmbeddedExtensionSource, 0, 0, 6674 kEmbeddedExtensionSource, 0, 0,
6668 source_len)); 6675 source_len));
6669 const char* extension_names[1] = { extension_name.start() }; 6676 const char* extension_names[1] = { extension_name.start() };
6670 v8::ExtensionConfiguration extensions(1, extension_names); 6677 v8::ExtensionConfiguration extensions(1, extension_names);
(...skipping 21 matching lines...) Expand all
6692 static const char* kEvalExtensionSource2 = 6699 static const char* kEvalExtensionSource2 =
6693 "(function() {" 6700 "(function() {"
6694 " var x = 42;" 6701 " var x = 42;"
6695 " function e() {" 6702 " function e() {"
6696 " return eval('x');" 6703 " return eval('x');"
6697 " }" 6704 " }"
6698 " this.UseEval2 = e;" 6705 " this.UseEval2 = e;"
6699 "})()"; 6706 "})()";
6700 6707
6701 6708
6702 THREADED_TEST(UseEvalFromExtension) { 6709 TEST(UseEvalFromExtension) {
6703 v8::HandleScope handle_scope(CcTest::isolate()); 6710 v8::HandleScope handle_scope(CcTest::isolate());
6704 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); 6711 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1));
6705 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); 6712 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2));
6706 const char* extension_names[] = { "evaltest1", "evaltest2" }; 6713 const char* extension_names[] = { "evaltest1", "evaltest2" };
6707 v8::ExtensionConfiguration extensions(2, extension_names); 6714 v8::ExtensionConfiguration extensions(2, extension_names);
6708 v8::Handle<Context> context = 6715 v8::Handle<Context> context =
6709 Context::New(CcTest::isolate(), &extensions); 6716 Context::New(CcTest::isolate(), &extensions);
6710 Context::Scope lock(context); 6717 Context::Scope lock(context);
6711 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run(); 6718 v8::Handle<Value> result = Script::Compile(v8_str("UseEval1()"))->Run();
6712 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); 6719 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42));
(...skipping 13 matching lines...) Expand all
6726 static const char* kWithExtensionSource2 = 6733 static const char* kWithExtensionSource2 =
6727 "(function() {" 6734 "(function() {"
6728 " var x = 42;" 6735 " var x = 42;"
6729 " function e() {" 6736 " function e() {"
6730 " with ({x:87}) { return x; }" 6737 " with ({x:87}) { return x; }"
6731 " }" 6738 " }"
6732 " this.UseWith2 = e;" 6739 " this.UseWith2 = e;"
6733 "})()"; 6740 "})()";
6734 6741
6735 6742
6736 THREADED_TEST(UseWithFromExtension) { 6743 TEST(UseWithFromExtension) {
6737 v8::HandleScope handle_scope(CcTest::isolate()); 6744 v8::HandleScope handle_scope(CcTest::isolate());
6738 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); 6745 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1));
6739 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); 6746 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2));
6740 const char* extension_names[] = { "withtest1", "withtest2" }; 6747 const char* extension_names[] = { "withtest1", "withtest2" };
6741 v8::ExtensionConfiguration extensions(2, extension_names); 6748 v8::ExtensionConfiguration extensions(2, extension_names);
6742 v8::Handle<Context> context = 6749 v8::Handle<Context> context =
6743 Context::New(CcTest::isolate(), &extensions); 6750 Context::New(CcTest::isolate(), &extensions);
6744 Context::Scope lock(context); 6751 Context::Scope lock(context);
6745 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run(); 6752 v8::Handle<Value> result = Script::Compile(v8_str("UseWith1()"))->Run();
6746 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); 6753 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87));
6747 result = Script::Compile(v8_str("UseWith2()"))->Run(); 6754 result = Script::Compile(v8_str("UseWith2()"))->Run();
6748 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87)); 6755 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 87));
6749 } 6756 }
6750 6757
6751 6758
6752 THREADED_TEST(AutoExtensions) { 6759 TEST(AutoExtensions) {
6753 v8::HandleScope handle_scope(CcTest::isolate()); 6760 v8::HandleScope handle_scope(CcTest::isolate());
6754 Extension* extension = new Extension("autotest", kSimpleExtensionSource); 6761 Extension* extension = new Extension("autotest", kSimpleExtensionSource);
6755 extension->set_auto_enable(true); 6762 extension->set_auto_enable(true);
6756 v8::RegisterExtension(extension); 6763 v8::RegisterExtension(extension);
6757 v8::Handle<Context> context = 6764 v8::Handle<Context> context =
6758 Context::New(CcTest::isolate()); 6765 Context::New(CcTest::isolate());
6759 Context::Scope lock(context); 6766 Context::Scope lock(context);
6760 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); 6767 v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run();
6761 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4)); 6768 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 4));
6762 } 6769 }
6763 6770
6764 6771
6765 static const char* kSyntaxErrorInExtensionSource = 6772 static const char* kSyntaxErrorInExtensionSource =
6766 "["; 6773 "[";
6767 6774
6768 6775
6769 // Test that a syntax error in an extension does not cause a fatal 6776 // Test that a syntax error in an extension does not cause a fatal
6770 // error but results in an empty context. 6777 // error but results in an empty context.
6771 THREADED_TEST(SyntaxErrorExtensions) { 6778 TEST(SyntaxErrorExtensions) {
6772 v8::HandleScope handle_scope(CcTest::isolate()); 6779 v8::HandleScope handle_scope(CcTest::isolate());
6773 v8::RegisterExtension(new Extension("syntaxerror", 6780 v8::RegisterExtension(new Extension("syntaxerror",
6774 kSyntaxErrorInExtensionSource)); 6781 kSyntaxErrorInExtensionSource));
6775 const char* extension_names[] = { "syntaxerror" }; 6782 const char* extension_names[] = { "syntaxerror" };
6776 v8::ExtensionConfiguration extensions(1, extension_names); 6783 v8::ExtensionConfiguration extensions(1, extension_names);
6777 v8::Handle<Context> context = 6784 v8::Handle<Context> context =
6778 Context::New(CcTest::isolate(), &extensions); 6785 Context::New(CcTest::isolate(), &extensions);
6779 CHECK(context.IsEmpty()); 6786 CHECK(context.IsEmpty());
6780 } 6787 }
6781 6788
6782 6789
6783 static const char* kExceptionInExtensionSource = 6790 static const char* kExceptionInExtensionSource =
6784 "throw 42"; 6791 "throw 42";
6785 6792
6786 6793
6787 // Test that an exception when installing an extension does not cause 6794 // Test that an exception when installing an extension does not cause
6788 // a fatal error but results in an empty context. 6795 // a fatal error but results in an empty context.
6789 THREADED_TEST(ExceptionExtensions) { 6796 TEST(ExceptionExtensions) {
6790 v8::HandleScope handle_scope(CcTest::isolate()); 6797 v8::HandleScope handle_scope(CcTest::isolate());
6791 v8::RegisterExtension(new Extension("exception", 6798 v8::RegisterExtension(new Extension("exception",
6792 kExceptionInExtensionSource)); 6799 kExceptionInExtensionSource));
6793 const char* extension_names[] = { "exception" }; 6800 const char* extension_names[] = { "exception" };
6794 v8::ExtensionConfiguration extensions(1, extension_names); 6801 v8::ExtensionConfiguration extensions(1, extension_names);
6795 v8::Handle<Context> context = 6802 v8::Handle<Context> context =
6796 Context::New(CcTest::isolate(), &extensions); 6803 Context::New(CcTest::isolate(), &extensions);
6797 CHECK(context.IsEmpty()); 6804 CHECK(context.IsEmpty());
6798 } 6805 }
6799 6806
6800 6807
6801 static const char* kNativeCallInExtensionSource = 6808 static const char* kNativeCallInExtensionSource =
6802 "function call_runtime_last_index_of(x) {" 6809 "function call_runtime_last_index_of(x) {"
6803 " return %StringLastIndexOf(x, 'bob', 10);" 6810 " return %StringLastIndexOf(x, 'bob', 10);"
6804 "}"; 6811 "}";
6805 6812
6806 6813
6807 static const char* kNativeCallTest = 6814 static const char* kNativeCallTest =
6808 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; 6815 "call_runtime_last_index_of('bobbobboellebobboellebobbob');";
6809 6816
6810 // Test that a native runtime calls are supported in extensions. 6817 // Test that a native runtime calls are supported in extensions.
6811 THREADED_TEST(NativeCallInExtensions) { 6818 TEST(NativeCallInExtensions) {
6812 v8::HandleScope handle_scope(CcTest::isolate()); 6819 v8::HandleScope handle_scope(CcTest::isolate());
6813 v8::RegisterExtension(new Extension("nativecall", 6820 v8::RegisterExtension(new Extension("nativecall",
6814 kNativeCallInExtensionSource)); 6821 kNativeCallInExtensionSource));
6815 const char* extension_names[] = { "nativecall" }; 6822 const char* extension_names[] = { "nativecall" };
6816 v8::ExtensionConfiguration extensions(1, extension_names); 6823 v8::ExtensionConfiguration extensions(1, extension_names);
6817 v8::Handle<Context> context = 6824 v8::Handle<Context> context =
6818 Context::New(CcTest::isolate(), &extensions); 6825 Context::New(CcTest::isolate(), &extensions);
6819 Context::Scope lock(context); 6826 Context::Scope lock(context);
6820 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run(); 6827 v8::Handle<Value> result = Script::Compile(v8_str(kNativeCallTest))->Run();
6821 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 3)); 6828 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 3));
(...skipping 15 matching lines...) Expand all
6837 } 6844 }
6838 6845
6839 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { 6846 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) {
6840 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); 6847 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]);
6841 } 6848 }
6842 private: 6849 private:
6843 v8::FunctionCallback function_; 6850 v8::FunctionCallback function_;
6844 }; 6851 };
6845 6852
6846 6853
6847 THREADED_TEST(NativeFunctionDeclaration) { 6854 TEST(NativeFunctionDeclaration) {
6848 v8::HandleScope handle_scope(CcTest::isolate()); 6855 v8::HandleScope handle_scope(CcTest::isolate());
6849 const char* name = "nativedecl"; 6856 const char* name = "nativedecl";
6850 v8::RegisterExtension(new NativeFunctionExtension(name, 6857 v8::RegisterExtension(new NativeFunctionExtension(name,
6851 "native function foo();")); 6858 "native function foo();"));
6852 const char* extension_names[] = { name }; 6859 const char* extension_names[] = { name };
6853 v8::ExtensionConfiguration extensions(1, extension_names); 6860 v8::ExtensionConfiguration extensions(1, extension_names);
6854 v8::Handle<Context> context = 6861 v8::Handle<Context> context =
6855 Context::New(CcTest::isolate(), &extensions); 6862 Context::New(CcTest::isolate(), &extensions);
6856 Context::Scope lock(context); 6863 Context::Scope lock(context);
6857 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run(); 6864 v8::Handle<Value> result = Script::Compile(v8_str("foo(42);"))->Run();
6858 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42)); 6865 CHECK_EQ(result, v8::Integer::New(CcTest::isolate(), 42));
6859 } 6866 }
6860 6867
6861 6868
6862 THREADED_TEST(NativeFunctionDeclarationError) { 6869 TEST(NativeFunctionDeclarationError) {
6863 v8::HandleScope handle_scope(CcTest::isolate()); 6870 v8::HandleScope handle_scope(CcTest::isolate());
6864 const char* name = "nativedeclerr"; 6871 const char* name = "nativedeclerr";
6865 // Syntax error in extension code. 6872 // Syntax error in extension code.
6866 v8::RegisterExtension(new NativeFunctionExtension(name, 6873 v8::RegisterExtension(new NativeFunctionExtension(name,
6867 "native\nfunction foo();")); 6874 "native\nfunction foo();"));
6868 const char* extension_names[] = { name }; 6875 const char* extension_names[] = { name };
6869 v8::ExtensionConfiguration extensions(1, extension_names); 6876 v8::ExtensionConfiguration extensions(1, extension_names);
6870 v8::Handle<Context> context = 6877 v8::Handle<Context> context =
6871 Context::New(CcTest::isolate(), &extensions); 6878 Context::New(CcTest::isolate(), &extensions);
6872 CHECK(context.IsEmpty()); 6879 CHECK(context.IsEmpty());
6873 } 6880 }
6874 6881
6875 6882
6876 THREADED_TEST(NativeFunctionDeclarationErrorEscape) { 6883 TEST(NativeFunctionDeclarationErrorEscape) {
6877 v8::HandleScope handle_scope(CcTest::isolate()); 6884 v8::HandleScope handle_scope(CcTest::isolate());
6878 const char* name = "nativedeclerresc"; 6885 const char* name = "nativedeclerresc";
6879 // Syntax error in extension code - escape code in "native" means that 6886 // Syntax error in extension code - escape code in "native" means that
6880 // it's not treated as a keyword. 6887 // it's not treated as a keyword.
6881 v8::RegisterExtension(new NativeFunctionExtension( 6888 v8::RegisterExtension(new NativeFunctionExtension(
6882 name, 6889 name,
6883 "nativ\\u0065 function foo();")); 6890 "nativ\\u0065 function foo();"));
6884 const char* extension_names[] = { name }; 6891 const char* extension_names[] = { name };
6885 v8::ExtensionConfiguration extensions(1, extension_names); 6892 v8::ExtensionConfiguration extensions(1, extension_names);
6886 v8::Handle<Context> context = 6893 v8::Handle<Context> context =
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
7128 ->Set(v8_str("next"), obj); 7135 ->Set(v8_str("next"), obj);
7129 prev.SetWeak<Value, Snorkel<Value> >(new Snorkel<Value>(&prev.As<Value>()), 7136 prev.SetWeak<Value, Snorkel<Value> >(new Snorkel<Value>(&prev.As<Value>()),
7130 &HandleWeakReference); 7137 &HandleWeakReference);
7131 } 7138 }
7132 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj); 7139 whammy->objects_[whammy->cursor_].Reset(info.GetIsolate(), obj);
7133 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount; 7140 whammy->cursor_ = (whammy->cursor_ + 1) % Whammy::kObjectCount;
7134 info.GetReturnValue().Set(whammy->getScript()->Run()); 7141 info.GetReturnValue().Set(whammy->getScript()->Run());
7135 } 7142 }
7136 7143
7137 7144
7138 THREADED_TEST(WeakReference) { 7145 TEST(WeakReference) {
7139 i::FLAG_expose_gc = true; 7146 i::FLAG_expose_gc = true;
7140 v8::Isolate* isolate = CcTest::isolate(); 7147 v8::Isolate* isolate = CcTest::isolate();
7141 v8::HandleScope handle_scope(isolate); 7148 v8::HandleScope handle_scope(isolate);
7142 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(isolate); 7149 v8::Handle<v8::ObjectTemplate> templ= v8::ObjectTemplate::New(isolate);
7143 Whammy* whammy = new Whammy(CcTest::isolate()); 7150 Whammy* whammy = new Whammy(CcTest::isolate());
7144 templ->SetNamedPropertyHandler(WhammyPropertyGetter, 7151 templ->SetNamedPropertyHandler(WhammyPropertyGetter,
7145 0, 0, 0, 0, 7152 0, 0, 0, 0,
7146 v8::External::New(CcTest::isolate(), whammy)); 7153 v8::External::New(CcTest::isolate(), whammy));
7147 const char* extension_list[] = { "v8/gc" }; 7154 const char* extension_list[] = { "v8/gc" };
7148 v8::ExtensionConfiguration extensions(1, extension_list); 7155 v8::ExtensionConfiguration extensions(1, extension_list);
(...skipping 3512 matching lines...) Expand 10 before | Expand all | Expand 10 after
10661 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 10668 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
10662 templ->SetClassName(v8_str("Fun")); 10669 templ->SetClassName(v8_str("Fun"));
10663 Local<Function> cons = templ->GetFunction(); 10670 Local<Function> cons = templ->GetFunction();
10664 context->Global()->Set(v8_str("Fun"), cons); 10671 context->Global()->Set(v8_str("Fun"), cons);
10665 Local<Value> value = CompileRun( 10672 Local<Value> value = CompileRun(
10666 "function test() {" 10673 "function test() {"
10667 " try {" 10674 " try {"
10668 " (new Fun()).blah()" 10675 " (new Fun()).blah()"
10669 " } catch (e) {" 10676 " } catch (e) {"
10670 " var str = String(e);" 10677 " var str = String(e);"
10671 " if (str.indexOf('TypeError') == -1) return 1;" 10678 // " if (str.indexOf('TypeError') == -1) return 1;"
10672 " if (str.indexOf('[object Fun]') != -1) return 2;" 10679 // " if (str.indexOf('[object Fun]') != -1) return 2;"
10673 " if (str.indexOf('#<Fun>') == -1) return 3;" 10680 // " if (str.indexOf('#<Fun>') == -1) return 3;"
10674 " return 0;" 10681 " return 0;"
10675 " }" 10682 " }"
10676 " return 4;" 10683 " return 4;"
10677 "}" 10684 "}"
10678 "test();"); 10685 "test();");
10679 CHECK_EQ(0, value->Int32Value()); 10686 CHECK_EQ(0, value->Int32Value());
10680 } 10687 }
10681 10688
10682 10689
10683 THREADED_TEST(EvalAliasedDynamic) { 10690 THREADED_TEST(EvalAliasedDynamic) {
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
10938 context->Global()->Set(v8_str("obj2"), instance); 10945 context->Global()->Set(v8_str("obj2"), instance);
10939 v8::TryCatch try_catch; 10946 v8::TryCatch try_catch;
10940 Local<Value> value; 10947 Local<Value> value;
10941 CHECK(!try_catch.HasCaught()); 10948 CHECK(!try_catch.HasCaught());
10942 10949
10943 // Call an object without call-as-function handler through the JS 10950 // Call an object without call-as-function handler through the JS
10944 value = CompileRun("obj2(28)"); 10951 value = CompileRun("obj2(28)");
10945 CHECK(value.IsEmpty()); 10952 CHECK(value.IsEmpty());
10946 CHECK(try_catch.HasCaught()); 10953 CHECK(try_catch.HasCaught());
10947 String::Utf8Value exception_value1(try_catch.Exception()); 10954 String::Utf8Value exception_value1(try_catch.Exception());
10948 CHECK_EQ("TypeError: Property 'obj2' of object #<Object> is not a function", 10955 // TODO(verwaest): Better message
10956 CHECK_EQ("TypeError: object is not a function",
10949 *exception_value1); 10957 *exception_value1);
10950 try_catch.Reset(); 10958 try_catch.Reset();
10951 10959
10952 // Call an object without call-as-function handler through the API 10960 // Call an object without call-as-function handler through the API
10953 value = CompileRun("obj2(28)"); 10961 value = CompileRun("obj2(28)");
10954 v8::Handle<Value> args[] = { v8_num(28) }; 10962 v8::Handle<Value> args[] = { v8_num(28) };
10955 value = instance->CallAsFunction(instance, 1, args); 10963 value = instance->CallAsFunction(instance, 1, args);
10956 CHECK(value.IsEmpty()); 10964 CHECK(value.IsEmpty());
10957 CHECK(try_catch.HasCaught()); 10965 CHECK(try_catch.HasCaught());
10958 String::Utf8Value exception_value2(try_catch.Exception()); 10966 String::Utf8Value exception_value2(try_catch.Exception());
(...skipping 1362 matching lines...) Expand 10 before | Expand all | Expand 10 after
12321 "var result = 0;" 12329 "var result = 0;"
12322 "var saved_result = 0;" 12330 "var saved_result = 0;"
12323 "for (var i = 0; i < 100; i++) {" 12331 "for (var i = 0; i < 100; i++) {"
12324 " result = receiver.method(41);" 12332 " result = receiver.method(41);"
12325 " if (i == 50) {" 12333 " if (i == 50) {"
12326 " saved_result = result;" 12334 " saved_result = result;"
12327 " receiver = 333;" 12335 " receiver = 333;"
12328 " }" 12336 " }"
12329 "}"); 12337 "}");
12330 CHECK(try_catch.HasCaught()); 12338 CHECK(try_catch.HasCaught());
12331 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 12339 // TODO(verwaest): Adjust message.
12340 CHECK_EQ(v8_str("TypeError: undefined is not a function"),
12332 try_catch.Exception()->ToString()); 12341 try_catch.Exception()->ToString());
12333 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12342 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
12334 CHECK_GE(interceptor_call_count, 50); 12343 CHECK_GE(interceptor_call_count, 50);
12335 } 12344 }
12336 12345
12337 12346
12338 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { 12347 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) {
12339 int interceptor_call_count = 0; 12348 int interceptor_call_count = 0;
12340 v8::Isolate* isolate = CcTest::isolate(); 12349 v8::Isolate* isolate = CcTest::isolate();
12341 v8::HandleScope scope(isolate); 12350 v8::HandleScope scope(isolate);
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
12495 "var result = 0;" 12504 "var result = 0;"
12496 "var saved_result = 0;" 12505 "var saved_result = 0;"
12497 "for (var i = 0; i < 100; i++) {" 12506 "for (var i = 0; i < 100; i++) {"
12498 " result = receiver.method(41);" 12507 " result = receiver.method(41);"
12499 " if (i == 50) {" 12508 " if (i == 50) {"
12500 " saved_result = result;" 12509 " saved_result = result;"
12501 " receiver = 333;" 12510 " receiver = 333;"
12502 " }" 12511 " }"
12503 "}"); 12512 "}");
12504 CHECK(try_catch.HasCaught()); 12513 CHECK(try_catch.HasCaught());
12505 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), 12514 // TODO(verwaest): Adjust message.
12515 CHECK_EQ(v8_str("TypeError: undefined is not a function"),
12506 try_catch.Exception()->ToString()); 12516 try_catch.Exception()->ToString());
12507 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12517 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value());
12508 } 12518 }
12509 12519
12510 12520
12511 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { 12521 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) {
12512 v8::Isolate* isolate = CcTest::isolate(); 12522 v8::Isolate* isolate = CcTest::isolate();
12513 v8::HandleScope scope(isolate); 12523 v8::HandleScope scope(isolate);
12514 v8::Handle<v8::FunctionTemplate> fun_templ = 12524 v8::Handle<v8::FunctionTemplate> fun_templ =
12515 v8::FunctionTemplate::New(isolate); 12525 v8::FunctionTemplate::New(isolate);
(...skipping 2690 matching lines...) Expand 10 before | Expand all | Expand 10 after
15206 const char* ascii_sources[] = { 15216 const char* ascii_sources[] = {
15207 "0.5", 15217 "0.5",
15208 "-0.5", // This mainly testes PushBack in the Scanner. 15218 "-0.5", // This mainly testes PushBack in the Scanner.
15209 "--0.5", // This mainly testes PushBack in the Scanner. 15219 "--0.5", // This mainly testes PushBack in the Scanner.
15210 NULL 15220 NULL
15211 }; 15221 };
15212 15222
15213 // Compile the sources as external two byte strings. 15223 // Compile the sources as external two byte strings.
15214 for (int i = 0; ascii_sources[i] != NULL; i++) { 15224 for (int i = 0; ascii_sources[i] != NULL; i++) {
15215 uint16_t* two_byte_string = AsciiToTwoByteString(ascii_sources[i]); 15225 uint16_t* two_byte_string = AsciiToTwoByteString(ascii_sources[i]);
15216 UC16VectorResource uc16_resource( 15226 TestResource* uc16_resource = new TestResource(two_byte_string);
15217 i::Vector<const uint16_t>(two_byte_string,
15218 i::StrLength(ascii_sources[i])));
15219 v8::Local<v8::String> source = 15227 v8::Local<v8::String> source =
15220 v8::String::NewExternal(context->GetIsolate(), &uc16_resource); 15228 v8::String::NewExternal(context->GetIsolate(), uc16_resource);
15221 v8::Script::Compile(source); 15229 v8::Script::Compile(source);
15222 i::DeleteArray(two_byte_string);
15223 } 15230 }
15224 } 15231 }
15225 15232
15226 15233
15227 #ifndef V8_INTERPRETED_REGEXP 15234 #ifndef V8_INTERPRETED_REGEXP
15228 15235
15229 struct RegExpInterruptionData { 15236 struct RegExpInterruptionData {
15230 int loop_count; 15237 int loop_count;
15231 UC16VectorResource* string_resource; 15238 UC16VectorResource* string_resource;
15232 v8::Persistent<v8::String> string; 15239 v8::Persistent<v8::String> string;
(...skipping 2626 matching lines...) Expand 10 before | Expand all | Expand 10 after
17859 17866
17860 TEST(VisitExternalStrings) { 17867 TEST(VisitExternalStrings) {
17861 LocalContext env; 17868 LocalContext env;
17862 v8::HandleScope scope(env->GetIsolate()); 17869 v8::HandleScope scope(env->GetIsolate());
17863 const char* string = "Some string"; 17870 const char* string = "Some string";
17864 uint16_t* two_byte_string = AsciiToTwoByteString(string); 17871 uint16_t* two_byte_string = AsciiToTwoByteString(string);
17865 TestResource* resource[4]; 17872 TestResource* resource[4];
17866 resource[0] = new TestResource(two_byte_string); 17873 resource[0] = new TestResource(two_byte_string);
17867 v8::Local<v8::String> string0 = 17874 v8::Local<v8::String> string0 =
17868 v8::String::NewExternal(env->GetIsolate(), resource[0]); 17875 v8::String::NewExternal(env->GetIsolate(), resource[0]);
17869 resource[1] = new TestResource(two_byte_string); 17876 resource[1] = new TestResource(two_byte_string, NULL, false);
17870 v8::Local<v8::String> string1 = 17877 v8::Local<v8::String> string1 =
17871 v8::String::NewExternal(env->GetIsolate(), resource[1]); 17878 v8::String::NewExternal(env->GetIsolate(), resource[1]);
17872 17879
17873 // Externalized symbol. 17880 // Externalized symbol.
17874 resource[2] = new TestResource(two_byte_string); 17881 resource[2] = new TestResource(two_byte_string, NULL, false);
17875 v8::Local<v8::String> string2 = v8::String::NewFromUtf8( 17882 v8::Local<v8::String> string2 = v8::String::NewFromUtf8(
17876 env->GetIsolate(), string, v8::String::kInternalizedString); 17883 env->GetIsolate(), string, v8::String::kInternalizedString);
17877 CHECK(string2->MakeExternal(resource[2])); 17884 CHECK(string2->MakeExternal(resource[2]));
17878 17885
17879 // Symbolized External. 17886 // Symbolized External.
17880 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); 17887 resource[3] = new TestResource(AsciiToTwoByteString("Some other string"));
17881 v8::Local<v8::String> string3 = 17888 v8::Local<v8::String> string3 =
17882 v8::String::NewExternal(env->GetIsolate(), resource[3]); 17889 v8::String::NewExternal(env->GetIsolate(), resource[3]);
17883 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. 17890 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string.
17884 // Turn into a symbol. 17891 // Turn into a symbol.
(...skipping 1055 matching lines...) Expand 10 before | Expand all | Expand 10 after
18940 i::SmartArrayPointer<uintptr_t> 18947 i::SmartArrayPointer<uintptr_t>
18941 aligned_contents(new uintptr_t[aligned_length]); 18948 aligned_contents(new uintptr_t[aligned_length]);
18942 uint16_t* string_contents = 18949 uint16_t* string_contents =
18943 reinterpret_cast<uint16_t*>(aligned_contents.get()); 18950 reinterpret_cast<uint16_t*>(aligned_contents.get());
18944 // Set to contain only one byte. 18951 // Set to contain only one byte.
18945 for (int i = 0; i < length-1; i++) { 18952 for (int i = 0; i < length-1; i++) {
18946 string_contents[i] = 0x41; 18953 string_contents[i] = 0x41;
18947 } 18954 }
18948 string_contents[length-1] = 0; 18955 string_contents[length-1] = 0;
18949 // Simple case. 18956 // Simple case.
18950 Handle<String> string; 18957 Handle<String> string =
18951 string = String::NewExternal(isolate, new TestResource(string_contents)); 18958 String::NewExternal(isolate,
18959 new TestResource(string_contents, NULL, false));
18952 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18960 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18953 // Counter example. 18961 // Counter example.
18954 string = String::NewFromTwoByte(isolate, string_contents); 18962 string = String::NewFromTwoByte(isolate, string_contents);
18955 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18963 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
18956 // Test left right and balanced cons strings. 18964 // Test left right and balanced cons strings.
18957 Handle<String> base = String::NewFromUtf8(isolate, "a"); 18965 Handle<String> base = String::NewFromUtf8(isolate, "a");
18958 Handle<String> left = base; 18966 Handle<String> left = base;
18959 Handle<String> right = base; 18967 Handle<String> right = base;
18960 for (int i = 0; i < 1000; i++) { 18968 for (int i = 0; i < 1000; i++) {
18961 left = String::Concat(base, left); 18969 left = String::Concat(base, left);
18962 right = String::Concat(right, base); 18970 right = String::Concat(right, base);
18963 } 18971 }
18964 Handle<String> balanced = String::Concat(left, base); 18972 Handle<String> balanced = String::Concat(left, base);
18965 balanced = String::Concat(balanced, right); 18973 balanced = String::Concat(balanced, right);
18966 Handle<String> cons_strings[] = {left, balanced, right}; 18974 Handle<String> cons_strings[] = {left, balanced, right};
18967 Handle<String> two_byte = 18975 Handle<String> two_byte =
18968 String::NewExternal(isolate, new TestResource(string_contents)); 18976 String::NewExternal(isolate,
18977 new TestResource(string_contents, NULL, false));
18978 USE(two_byte); USE(cons_strings);
18969 for (size_t i = 0; i < ARRAY_SIZE(cons_strings); i++) { 18979 for (size_t i = 0; i < ARRAY_SIZE(cons_strings); i++) {
18970 // Base assumptions. 18980 // Base assumptions.
18971 string = cons_strings[i]; 18981 string = cons_strings[i];
18972 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18982 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
18973 // Test left and right concatentation. 18983 // Test left and right concatentation.
18974 string = String::Concat(two_byte, cons_strings[i]); 18984 string = String::Concat(two_byte, cons_strings[i]);
18975 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18985 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18976 string = String::Concat(cons_strings[i], two_byte); 18986 string = String::Concat(cons_strings[i], two_byte);
18977 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18987 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18978 } 18988 }
18979 // Set bits in different positions 18989 // Set bits in different positions
18980 // for strings of different lengths and alignments. 18990 // for strings of different lengths and alignments.
18981 for (int alignment = 0; alignment < 7; alignment++) { 18991 for (int alignment = 0; alignment < 7; alignment++) {
18982 for (int size = 2; alignment + size < length; size *= 2) { 18992 for (int size = 2; alignment + size < length; size *= 2) {
18983 int zero_offset = size + alignment; 18993 int zero_offset = size + alignment;
18984 string_contents[zero_offset] = 0; 18994 string_contents[zero_offset] = 0;
18985 for (int i = 0; i < size; i++) { 18995 for (int i = 0; i < size; i++) {
18986 int shift = 8 + (i % 7); 18996 int shift = 8 + (i % 7);
18987 string_contents[alignment + i] = 1 << shift; 18997 string_contents[alignment + i] = 1 << shift;
18988 string = String::NewExternal( 18998 string = String::NewExternal(
18989 isolate, new TestResource(string_contents + alignment)); 18999 isolate,
19000 new TestResource(string_contents + alignment, NULL, false));
18990 CHECK_EQ(size, string->Length()); 19001 CHECK_EQ(size, string->Length());
18991 CHECK(!string->ContainsOnlyOneByte()); 19002 CHECK(!string->ContainsOnlyOneByte());
18992 string_contents[alignment + i] = 0x41; 19003 string_contents[alignment + i] = 0x41;
18993 } 19004 }
18994 string_contents[zero_offset] = 0x41; 19005 string_contents[zero_offset] = 0x41;
18995 } 19006 }
18996 } 19007 }
18997 } 19008 }
18998 19009
18999 19010
(...skipping 1587 matching lines...) Expand 10 before | Expand all | Expand 10 after
20587 v8::HandleScope scope(env->GetIsolate()); 20598 v8::HandleScope scope(env->GetIsolate());
20588 int initial_probes = probes_counter; 20599 int initial_probes = probes_counter;
20589 int initial_misses = misses_counter; 20600 int initial_misses = misses_counter;
20590 int initial_updates = updates_counter; 20601 int initial_updates = updates_counter;
20591 CompileRun(kMegamorphicTestProgram); 20602 CompileRun(kMegamorphicTestProgram);
20592 int probes = probes_counter - initial_probes; 20603 int probes = probes_counter - initial_probes;
20593 int misses = misses_counter - initial_misses; 20604 int misses = misses_counter - initial_misses;
20594 int updates = updates_counter - initial_updates; 20605 int updates = updates_counter - initial_updates;
20595 CHECK_LT(updates, 10); 20606 CHECK_LT(updates, 10);
20596 CHECK_LT(misses, 10); 20607 CHECK_LT(misses, 10);
20597 CHECK_GE(probes, 10000); 20608 // TODO(verwaest): Update this test to overflow the degree of polymorphism
20609 // before megamorphism. The number of probes will only work once we teach the
20610 // serializer to embed references to counters in the stubs, given that the
20611 // megamorphic_stub_cache_probes is updated in a snapshot-generated stub.
20612 CHECK_GE(probes, 0);
20598 #endif 20613 #endif
20599 } 20614 }
20600 20615
20601 20616
20602 TEST(SecondaryStubCache) { 20617 TEST(SecondaryStubCache) {
20603 StubCacheHelper(true); 20618 StubCacheHelper(true);
20604 } 20619 }
20605 20620
20606 20621
20607 TEST(PrimaryStubCache) { 20622 TEST(PrimaryStubCache) {
(...skipping 1225 matching lines...) Expand 10 before | Expand all | Expand 10 after
21833 context->Global()->Set(v8_str("P"), templ->NewInstance()); 21848 context->Global()->Set(v8_str("P"), templ->NewInstance());
21834 CompileRun( 21849 CompileRun(
21835 "function C1() {" 21850 "function C1() {"
21836 " this.x = 23;" 21851 " this.x = 23;"
21837 "};" 21852 "};"
21838 "C1.prototype = P;" 21853 "C1.prototype = P;"
21839 "for (var i = 0; i < 4; i++ ) {" 21854 "for (var i = 0; i < 4; i++ ) {"
21840 " new C1();" 21855 " new C1();"
21841 "}"); 21856 "}");
21842 } 21857 }
21858
21859
21860 class ApiCallOptimizationChecker {
21861 private:
21862 static Local<Object> data;
21863 static Local<Object> receiver;
21864 static Local<Object> holder;
21865 static Local<Object> callee;
21866 static int count;
21867
21868 static void OptimizationCallback(
21869 const v8::FunctionCallbackInfo<v8::Value>& info) {
21870 CHECK(callee == info.Callee());
21871 CHECK(data == info.Data());
21872 CHECK(receiver == info.This());
21873 CHECK(holder == info.Holder());
21874 count++;
21875 }
21876
21877 public:
21878 void Run(bool use_signature, bool global) {
21879 v8::Isolate* isolate = CcTest::isolate();
21880 v8::HandleScope scope(isolate);
21881 // Build a template for signature checks.
21882 Local<v8::ObjectTemplate> signature_template;
21883 Local<v8::Signature> signature;
21884 {
21885 Local<v8::FunctionTemplate> parent_template =
21886 FunctionTemplate::New(isolate);
21887 parent_template->SetHiddenPrototype(true);
21888 Local<v8::FunctionTemplate> function_template
21889 = FunctionTemplate::New(isolate);
21890 function_template->Inherit(parent_template);
21891 if (use_signature) {
21892 signature = v8::Signature::New(isolate, parent_template);
21893 }
21894 signature_template = function_template->InstanceTemplate();
21895 }
21896 // Global object must pass checks.
21897 Local<v8::Context> context =
21898 v8::Context::New(isolate, NULL, signature_template);
21899 v8::Context::Scope context_scope(context);
21900 // Install regular object that can pass signature checks.
21901 Local<Object> function_receiver = signature_template->NewInstance();
21902 context->Global()->Set(v8_str("function_receiver"), function_receiver);
21903 // Get the holder objects.
21904 Local<Object> inner_global =
21905 Local<Object>::Cast(context->Global()->GetPrototype());
21906 Local<Object> function_holder =
21907 Local<Object>::Cast(function_receiver->GetPrototype());
21908 // Install function on hidden prototype object.
21909 data = Object::New(isolate);
21910 Local<FunctionTemplate> function_template = FunctionTemplate::New(
21911 isolate, OptimizationCallback, data, signature);
21912 Local<Function> function = function_template->GetFunction();
21913 Local<Object>::Cast(
21914 inner_global->GetPrototype())->Set(v8_str("global_f"), function);
21915 function_holder->Set(v8_str("f"), function);
21916 // Initialize expected values.
21917 callee = function;
21918 count = 0;
21919 if (global) {
21920 receiver = context->Global();
21921 holder = inner_global;
21922 } else {
21923 holder = function_receiver;
21924 // If not using a signature, add something else to the prototype chain
21925 // to test the case that holder != receiver
21926 if (!use_signature) {
21927 receiver = Local<Object>::Cast(CompileRun(
21928 "var receiver_subclass = {};\n"
21929 "receiver_subclass.__proto__ = function_receiver;\n"
21930 "receiver_subclass"));
21931 } else {
21932 receiver = Local<Object>::Cast(CompileRun(
21933 "var receiver_subclass = function_receiver;\n"
21934 "receiver_subclass"));
21935 }
21936 }
21937 // With no signature, the holder is not set.
21938 if (!use_signature) holder = receiver;
21939 // build wrap_function
21940 int key = (use_signature ? 1 : 0) + 2 * (global ? 1 : 0);
21941 i::ScopedVector<char> wrap_function(100);
21942 if (global) {
21943 i::OS::SNPrintF(
21944 wrap_function,
21945 "function wrap_%d() { var f = global_f; return f(); }\n",
21946 key);
21947 } else {
21948 i::OS::SNPrintF(
21949 wrap_function,
21950 "function wrap_%d() { return receiver_subclass.f(); }\n",
21951 key);
21952 }
21953 // build source string
21954 i::ScopedVector<char> source(500);
21955 i::OS::SNPrintF(
21956 source,
21957 "%s\n" // wrap_function
21958 "function wrap2() { wrap_%d(); }\n"
21959 "wrap2();\n"
21960 "wrap2();\n"
21961 "%%OptimizeFunctionOnNextCall(wrap_%d);\n"
21962 "wrap2();\n",
21963 wrap_function.start(), key, key);
21964 v8::TryCatch try_catch;
21965 CompileRun(source.start());
21966 ASSERT(!try_catch.HasCaught());
21967 CHECK_EQ(3, count);
21968 }
21969 };
21970
21971
21972 Local<Object> ApiCallOptimizationChecker::data;
21973 Local<Object> ApiCallOptimizationChecker::receiver;
21974 Local<Object> ApiCallOptimizationChecker::holder;
21975 Local<Object> ApiCallOptimizationChecker::callee;
21976 int ApiCallOptimizationChecker::count = 0;
21977
21978
21979 TEST(TestFunctionCallOptimization) {
21980 i::FLAG_allow_natives_syntax = true;
21981 ApiCallOptimizationChecker checker;
21982 checker.Run(true, true);
21983 checker.Run(false, true);
21984 checker.Run(true, false);
21985 checker.Run(false, false);
21986 }
OLDNEW
« no previous file with comments | « test/cctest/cctest.status ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698