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

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

Issue 1521593002: Remove remaing deprecated API calls from cctest (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: updates Created 5 years 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
« no previous file with comments | « no previous file | no next file » | 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
11 // with the distribution. 11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its 12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived 13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission. 14 // from this software without specific prior written permission.
15 // 15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 // TODO(jochen/vogelheim): Remove this.
29 #undef V8_IMMINENT_DEPRECATION_WARNINGS
30
31 #include <climits> 28 #include <climits>
32 #include <csignal> 29 #include <csignal>
33 #include <map> 30 #include <map>
34 #include <string> 31 #include <string>
35 32
36 #include "test/cctest/test-api.h" 33 #include "test/cctest/test-api.h"
37 34
38 #if V8_OS_POSIX 35 #if V8_OS_POSIX
39 #include <unistd.h> // NOLINT 36 #include <unistd.h> // NOLINT
40 #endif 37 #endif
(...skipping 3773 matching lines...) Expand 10 before | Expand all | Expand 10 after
3814 HandleScope scope(isolate); 3811 HandleScope scope(isolate);
3815 Local<v8::Object> obj = map.Get(7); 3812 Local<v8::Object> obj = map.Get(7);
3816 CHECK(obj.IsEmpty()); 3813 CHECK(obj.IsEmpty());
3817 Local<v8::Object> expected = v8::Object::New(isolate); 3814 Local<v8::Object> expected = v8::Object::New(isolate);
3818 map.Set(7, expected); 3815 map.Set(7, expected);
3819 CHECK_EQ(1, static_cast<int>(map.Size())); 3816 CHECK_EQ(1, static_cast<int>(map.Size()));
3820 obj = map.Get(7); 3817 obj = map.Get(7);
3821 CHECK(expected->Equals(env.local(), obj).FromJust()); 3818 CHECK(expected->Equals(env.local(), obj).FromJust());
3822 { 3819 {
3823 typename Map::PersistentValueReference ref = map.GetReference(7); 3820 typename Map::PersistentValueReference ref = map.GetReference(7);
3824 CHECK(expected->Equals(ref.NewLocal(isolate))); 3821 CHECK(expected->Equals(env.local(), ref.NewLocal(isolate)).FromJust());
3825 } 3822 }
3826 v8::Global<v8::Object> removed = map.Remove(7); 3823 v8::Global<v8::Object> removed = map.Remove(7);
3827 CHECK_EQ(0, static_cast<int>(map.Size())); 3824 CHECK_EQ(0, static_cast<int>(map.Size()));
3828 CHECK(expected == removed); 3825 CHECK(expected == removed);
3829 removed = map.Remove(7); 3826 removed = map.Remove(7);
3830 CHECK(removed.IsEmpty()); 3827 CHECK(removed.IsEmpty());
3831 map.Set(8, expected); 3828 map.Set(8, expected);
3832 CHECK_EQ(1, static_cast<int>(map.Size())); 3829 CHECK_EQ(1, static_cast<int>(map.Size()));
3833 map.Set(8, expected); 3830 map.Set(8, expected);
3834 CHECK_EQ(1, static_cast<int>(map.Size())); 3831 CHECK_EQ(1, static_cast<int>(map.Size()));
3835 { 3832 {
3836 typename Map::PersistentValueReference ref; 3833 typename Map::PersistentValueReference ref;
3837 Local<v8::Object> expected2 = NewObjectForIntKey(isolate, templ, 8); 3834 Local<v8::Object> expected2 = NewObjectForIntKey(isolate, templ, 8);
3838 removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref); 3835 removed = map.Set(8, v8::Global<v8::Object>(isolate, expected2), &ref);
3839 CHECK_EQ(1, static_cast<int>(map.Size())); 3836 CHECK_EQ(1, static_cast<int>(map.Size()));
3840 CHECK(expected == removed); 3837 CHECK(expected == removed);
3841 CHECK(expected2->Equals(ref.NewLocal(isolate))); 3838 CHECK(expected2->Equals(env.local(), ref.NewLocal(isolate)).FromJust());
3842 } 3839 }
3843 } 3840 }
3844 CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count()); 3841 CHECK_EQ(initial_handle_count + 1, global_handles->global_handles_count());
3845 if (map.IsWeak()) { 3842 if (map.IsWeak()) {
3846 CcTest::i_isolate()->heap()->CollectAllGarbage( 3843 CcTest::i_isolate()->heap()->CollectAllGarbage(
3847 i::Heap::kAbortIncrementalMarkingMask); 3844 i::Heap::kAbortIncrementalMarkingMask);
3848 } else { 3845 } else {
3849 map.Clear(); 3846 map.Clear();
3850 } 3847 }
3851 CHECK_EQ(0, static_cast<int>(map.Size())); 3848 CHECK_EQ(0, static_cast<int>(map.Size()));
(...skipping 11113 matching lines...) Expand 10 before | Expand all | Expand 10 after
14965 CompileRun("function f() { x = 42; return x; }; f()"); 14962 CompileRun("function f() { x = 42; return x; }; f()");
14966 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust()); 14963 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust());
14967 // Check with 'eval'. 14964 // Check with 'eval'.
14968 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); 14965 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()");
14969 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust()); 14966 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust());
14970 // Check with 'with'. 14967 // Check with 'with'.
14971 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); 14968 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()");
14972 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust()); 14969 CHECK(v8::Integer::New(isolate, 0)->Equals(context.local(), res).FromJust());
14973 } 14970 }
14974 14971
14975 static int force_set_set_count = 0;
14976 static int force_set_get_count = 0;
14977 bool pass_on_get = false;
14978
14979 static void ForceSetGetter(v8::Local<v8::String> name,
14980 const v8::PropertyCallbackInfo<v8::Value>& info) {
14981 force_set_get_count++;
14982 if (pass_on_get) {
14983 return;
14984 }
14985 info.GetReturnValue().Set(3);
14986 }
14987
14988 static void ForceSetSetter(v8::Local<v8::String> name,
14989 v8::Local<v8::Value> value,
14990 const v8::PropertyCallbackInfo<void>& info) {
14991 force_set_set_count++;
14992 }
14993
14994 static void ForceSetInterceptGetter(
14995 v8::Local<v8::Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
14996 CHECK(name->IsString());
14997 ForceSetGetter(Local<String>::Cast(name), info);
14998 }
14999
15000 static void ForceSetInterceptSetter(
15001 v8::Local<v8::Name> name, v8::Local<v8::Value> value,
15002 const v8::PropertyCallbackInfo<v8::Value>& info) {
15003 force_set_set_count++;
15004 info.GetReturnValue().SetUndefined();
15005 }
15006
15007
15008 TEST(ForceSet) {
15009 force_set_get_count = 0;
15010 force_set_set_count = 0;
15011 pass_on_get = false;
15012
15013 v8::Isolate* isolate = CcTest::isolate();
15014 v8::HandleScope scope(isolate);
15015 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15016 v8::Local<v8::String> access_property = v8_str("a");
15017 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter);
15018 LocalContext context(NULL, templ);
15019 v8::Local<v8::Object> global = context->Global();
15020
15021 // Ordinary properties
15022 v8::Local<v8::String> simple_property = v8_str("p");
15023 global->DefineOwnProperty(context.local(), simple_property,
15024 v8::Int32::New(isolate, 4), v8::ReadOnly)
15025 .FromJust();
15026 CHECK_EQ(4, global->Get(context.local(), simple_property)
15027 .ToLocalChecked()
15028 ->Int32Value(context.local())
15029 .FromJust());
15030 // This should fail because the property is read-only
15031 CHECK(
15032 global->Set(context.local(), simple_property, v8::Int32::New(isolate, 5))
15033 .FromJust());
15034 CHECK_EQ(4, global->Get(context.local(), simple_property)
15035 .ToLocalChecked()
15036 ->Int32Value(context.local())
15037 .FromJust());
15038 // This should succeed even though the property is read-only
15039 CHECK(global->DefineOwnProperty(context.local(), simple_property,
15040 v8::Int32::New(isolate, 6))
15041 .FromJust());
15042 CHECK_EQ(6, global->Get(context.local(), simple_property)
15043 .ToLocalChecked()
15044 ->Int32Value(context.local())
15045 .FromJust());
15046
15047 // Accessors
15048 CHECK_EQ(0, force_set_set_count);
15049 CHECK_EQ(0, force_set_get_count);
15050 CHECK_EQ(3, global->Get(context.local(), access_property)
15051 .ToLocalChecked()
15052 ->Int32Value(context.local())
15053 .FromJust());
15054 // CHECK_EQ the property shouldn't override it, just call the setter
15055 // which in this case does nothing.
15056 CHECK(
15057 global->Set(context.local(), access_property, v8::Int32::New(isolate, 7))
15058 .FromJust());
15059 CHECK_EQ(3, global->Get(context.local(), access_property)
15060 .ToLocalChecked()
15061 ->Int32Value(context.local())
15062 .FromJust());
15063 CHECK_EQ(1, force_set_set_count);
15064 CHECK_EQ(2, force_set_get_count);
15065 // ForceSet doesn't call the accessors for now.
15066 // TODO(verwaest): Update once blink doesn't rely on ForceSet to delete api
15067 // accessors.
15068 CHECK(global->ForceSet(access_property, v8::Int32::New(isolate, 8)));
15069 CHECK_EQ(8, global->Get(context.local(), access_property)
15070 .ToLocalChecked()
15071 ->Int32Value(context.local())
15072 .FromJust());
15073 CHECK_EQ(1, force_set_set_count);
15074 CHECK_EQ(2, force_set_get_count);
15075 }
15076
15077
15078 TEST(ForceSetWithInterceptor) {
15079 v8::Isolate* isolate = CcTest::isolate();
15080 v8::HandleScope scope(isolate);
15081 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
15082 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
15083 ForceSetInterceptGetter, ForceSetInterceptSetter));
15084 pass_on_get = true;
15085 LocalContext context(NULL, templ);
15086 v8::Local<v8::Object> global = context->Global();
15087
15088 force_set_get_count = 0;
15089 force_set_set_count = 0;
15090 pass_on_get = false;
15091
15092 v8::Local<v8::String> some_property = v8_str("a");
15093 CHECK_EQ(0, force_set_set_count);
15094 CHECK_EQ(0, force_set_get_count);
15095 CHECK_EQ(3, global->Get(context.local(), some_property)
15096 .ToLocalChecked()
15097 ->Int32Value(context.local())
15098 .FromJust());
15099 // Setting the property shouldn't override it, just call the setter
15100 // which in this case does nothing.
15101 global->Set(context.local(), some_property, v8::Int32::New(isolate, 7))
15102 .FromJust();
15103 CHECK_EQ(3, global->Get(context.local(), some_property)
15104 .ToLocalChecked()
15105 ->Int32Value(context.local())
15106 .FromJust());
15107 CHECK_EQ(1, force_set_set_count);
15108 CHECK_EQ(2, force_set_get_count);
15109 // Getting the property when the interceptor returns an empty handle
15110 // should yield undefined, since the property isn't present on the
15111 // object itself yet.
15112 pass_on_get = true;
15113 CHECK(global->Get(context.local(), some_property)
15114 .ToLocalChecked()
15115 ->IsUndefined());
15116 CHECK_EQ(1, force_set_set_count);
15117 CHECK_EQ(3, force_set_get_count);
15118 // Forcing the property to be set should cause the value to be
15119 // set locally without calling the interceptor.
15120 global->ForceSet(some_property, v8::Int32::New(isolate, 8));
15121 CHECK_EQ(8, global->Get(context.local(), some_property)
15122 .ToLocalChecked()
15123 ->Int32Value(context.local())
15124 .FromJust());
15125 CHECK_EQ(1, force_set_set_count);
15126 CHECK_EQ(4, force_set_get_count);
15127 // Reenabling the interceptor should cause it to take precedence over
15128 // the property
15129 pass_on_get = false;
15130 CHECK_EQ(3, global->Get(context.local(), some_property)
15131 .ToLocalChecked()
15132 ->Int32Value(context.local())
15133 .FromJust());
15134 CHECK_EQ(1, force_set_set_count);
15135 CHECK_EQ(5, force_set_get_count);
15136 // The interceptor should also work for other properties
15137 CHECK_EQ(3, global->Get(context.local(), v8_str("b"))
15138 .ToLocalChecked()
15139 ->Int32Value(context.local())
15140 .FromJust());
15141 CHECK_EQ(1, force_set_set_count);
15142 CHECK_EQ(6, force_set_get_count);
15143 }
15144
15145 14972
15146 TEST(CreateDataProperty) { 14973 TEST(CreateDataProperty) {
15147 LocalContext env; 14974 LocalContext env;
15148 v8::Isolate* isolate = env->GetIsolate(); 14975 v8::Isolate* isolate = env->GetIsolate();
15149 v8::HandleScope handle_scope(isolate); 14976 v8::HandleScope handle_scope(isolate);
15150 14977
15151 CompileRun( 14978 CompileRun(
15152 "var a = {};" 14979 "var a = {};"
15153 "var b = [];" 14980 "var b = [];"
15154 "Object.defineProperty(a, 'foo', {value: 23});" 14981 "Object.defineProperty(a, 'foo', {value: 23});"
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after
15841 15668
15842 Local<ArrayBufferType> ab = 15669 Local<ArrayBufferType> ab =
15843 ArrayBufferType::New(isolate, backing_store.start(), 15670 ArrayBufferType::New(isolate, backing_store.start(),
15844 (kElementCount + 2) * sizeof(ElementType)); 15671 (kElementCount + 2) * sizeof(ElementType));
15845 Local<TypedArray> ta = 15672 Local<TypedArray> ta =
15846 TypedArray::New(ab, 2*sizeof(ElementType), kElementCount); 15673 TypedArray::New(ab, 2*sizeof(ElementType), kElementCount);
15847 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta); 15674 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta);
15848 CHECK_EQ(kElementCount, static_cast<int>(ta->Length())); 15675 CHECK_EQ(kElementCount, static_cast<int>(ta->Length()));
15849 CHECK_EQ(2 * sizeof(ElementType), ta->ByteOffset()); 15676 CHECK_EQ(2 * sizeof(ElementType), ta->ByteOffset());
15850 CHECK_EQ(kElementCount * sizeof(ElementType), ta->ByteLength()); 15677 CHECK_EQ(kElementCount * sizeof(ElementType), ta->ByteLength());
15851 CHECK(ab->Equals(ta->Buffer())); 15678 CHECK(ab->Equals(env.local(), ta->Buffer()).FromJust());
15852 15679
15853 ElementType* data = backing_store.start() + 2; 15680 ElementType* data = backing_store.start() + 2;
15854 for (int i = 0; i < kElementCount; i++) { 15681 for (int i = 0; i < kElementCount; i++) {
15855 data[i] = static_cast<ElementType>(i); 15682 data[i] = static_cast<ElementType>(i);
15856 } 15683 }
15857 15684
15858 ObjectWithExternalArrayTestHelper<ExternalArrayClass, ElementType>( 15685 ObjectWithExternalArrayTestHelper<ExternalArrayClass, ElementType>(
15859 env.local(), ta, kElementCount, array_type, low, high); 15686 env.local(), ta, kElementCount, array_type, low, high);
15860 } 15687 }
15861 15688
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after
17048 const v8::FunctionCallbackInfo<v8::Value>& args) { 16875 const v8::FunctionCallbackInfo<v8::Value>& args) {
17049 v8::HandleScope scope(args.GetIsolate()); 16876 v8::HandleScope scope(args.GetIsolate());
17050 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16877 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
17051 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 16878 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
17052 CHECK_EQ(5, stackTrace->GetFrameCount()); 16879 CHECK_EQ(5, stackTrace->GetFrameCount());
17053 v8::Local<v8::String> url = v8_str("eval_url"); 16880 v8::Local<v8::String> url = v8_str("eval_url");
17054 for (int i = 0; i < 3; i++) { 16881 for (int i = 0; i < 3; i++) {
17055 v8::Local<v8::String> name = 16882 v8::Local<v8::String> name =
17056 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16883 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17057 CHECK(!name.IsEmpty()); 16884 CHECK(!name.IsEmpty());
17058 CHECK(url->Equals(name)); 16885 CHECK(url->Equals(args.GetIsolate()->GetCurrentContext(), name).FromJust());
17059 } 16886 }
17060 } 16887 }
17061 16888
17062 16889
17063 TEST(SourceURLInStackTrace) { 16890 TEST(SourceURLInStackTrace) {
17064 v8::Isolate* isolate = CcTest::isolate(); 16891 v8::Isolate* isolate = CcTest::isolate();
17065 v8::HandleScope scope(isolate); 16892 v8::HandleScope scope(isolate);
17066 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 16893 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17067 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), 16894 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"),
17068 v8::FunctionTemplate::New(isolate, 16895 v8::FunctionTemplate::New(isolate,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
17109 templ->Set(v8_str("AnalyzeScriptIdInStack"), 16936 templ->Set(v8_str("AnalyzeScriptIdInStack"),
17110 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); 16937 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack));
17111 LocalContext context(0, templ); 16938 LocalContext context(0, templ);
17112 16939
17113 v8::Local<v8::String> scriptSource = v8_str( 16940 v8::Local<v8::String> scriptSource = v8_str(
17114 "function foo() {\n" 16941 "function foo() {\n"
17115 " AnalyzeScriptIdInStack();" 16942 " AnalyzeScriptIdInStack();"
17116 "}\n" 16943 "}\n"
17117 "foo();\n"); 16944 "foo();\n");
17118 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test"); 16945 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test");
17119 script->Run(); 16946 script->Run(context.local()).ToLocalChecked();
17120 for (int i = 0; i < 2; i++) { 16947 for (int i = 0; i < 2; i++) {
17121 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); 16948 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo);
17122 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId()); 16949 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId());
17123 } 16950 }
17124 } 16951 }
17125 16952
17126 16953
17127 void AnalyzeStackOfInlineScriptWithSourceURL( 16954 void AnalyzeStackOfInlineScriptWithSourceURL(
17128 const v8::FunctionCallbackInfo<v8::Value>& args) { 16955 const v8::FunctionCallbackInfo<v8::Value>& args) {
17129 v8::HandleScope scope(args.GetIsolate()); 16956 v8::HandleScope scope(args.GetIsolate());
17130 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16957 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
17131 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 16958 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
17132 CHECK_EQ(4, stackTrace->GetFrameCount()); 16959 CHECK_EQ(4, stackTrace->GetFrameCount());
17133 v8::Local<v8::String> url = v8_str("source_url"); 16960 v8::Local<v8::String> url = v8_str("source_url");
17134 for (int i = 0; i < 3; i++) { 16961 for (int i = 0; i < 3; i++) {
17135 v8::Local<v8::String> name = 16962 v8::Local<v8::String> name =
17136 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16963 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17137 CHECK(!name.IsEmpty()); 16964 CHECK(!name.IsEmpty());
17138 CHECK(url->Equals(name)); 16965 CHECK(url->Equals(args.GetIsolate()->GetCurrentContext(), name).FromJust());
17139 } 16966 }
17140 } 16967 }
17141 16968
17142 16969
17143 TEST(InlineScriptWithSourceURLInStackTrace) { 16970 TEST(InlineScriptWithSourceURLInStackTrace) {
17144 v8::Isolate* isolate = CcTest::isolate(); 16971 v8::Isolate* isolate = CcTest::isolate();
17145 v8::HandleScope scope(isolate); 16972 v8::HandleScope scope(isolate);
17146 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 16973 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17147 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"), 16974 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"),
17148 v8::FunctionTemplate::New( 16975 v8::FunctionTemplate::New(
(...skipping 23 matching lines...) Expand all
17172 const v8::FunctionCallbackInfo<v8::Value>& args) { 16999 const v8::FunctionCallbackInfo<v8::Value>& args) {
17173 v8::HandleScope scope(args.GetIsolate()); 17000 v8::HandleScope scope(args.GetIsolate());
17174 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 17001 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
17175 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 17002 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
17176 CHECK_EQ(4, stackTrace->GetFrameCount()); 17003 CHECK_EQ(4, stackTrace->GetFrameCount());
17177 v8::Local<v8::String> url = v8_str("source_url"); 17004 v8::Local<v8::String> url = v8_str("source_url");
17178 for (int i = 0; i < 3; i++) { 17005 for (int i = 0; i < 3; i++) {
17179 v8::Local<v8::String> name = 17006 v8::Local<v8::String> name =
17180 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 17007 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
17181 CHECK(!name.IsEmpty()); 17008 CHECK(!name.IsEmpty());
17182 CHECK(url->Equals(name)); 17009 CHECK(url->Equals(args.GetIsolate()->GetCurrentContext(), name).FromJust());
17183 } 17010 }
17184 } 17011 }
17185 17012
17186 17013
17187 TEST(DynamicWithSourceURLInStackTrace) { 17014 TEST(DynamicWithSourceURLInStackTrace) {
17188 v8::Isolate* isolate = CcTest::isolate(); 17015 v8::Isolate* isolate = CcTest::isolate();
17189 v8::HandleScope scope(isolate); 17016 v8::HandleScope scope(isolate);
17190 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 17017 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17191 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"), 17018 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"),
17192 v8::FunctionTemplate::New( 17019 v8::FunctionTemplate::New(
(...skipping 30 matching lines...) Expand all
17223 " }\n" 17050 " }\n"
17224 " foo();\n" 17051 " foo();\n"
17225 "}\n" 17052 "}\n"
17226 "outer()\n%s"; 17053 "outer()\n%s";
17227 17054
17228 i::ScopedVector<char> code(1024); 17055 i::ScopedVector<char> code(1024);
17229 i::SNPrintF(code, source, "//# sourceURL=source_url"); 17056 i::SNPrintF(code, source, "//# sourceURL=source_url");
17230 v8::TryCatch try_catch(context->GetIsolate()); 17057 v8::TryCatch try_catch(context->GetIsolate());
17231 CompileRunWithOrigin(code.start(), "", 0, 0); 17058 CompileRunWithOrigin(code.start(), "", 0, 0);
17232 CHECK(try_catch.HasCaught()); 17059 CHECK(try_catch.HasCaught());
17233 v8::String::Utf8Value stack(try_catch.StackTrace()); 17060 v8::String::Utf8Value stack(
17061 try_catch.StackTrace(context.local()).ToLocalChecked());
17234 CHECK(strstr(*stack, "at foo (source_url:3:5)") != NULL); 17062 CHECK(strstr(*stack, "at foo (source_url:3:5)") != NULL);
17235 } 17063 }
17236 17064
17237 17065
17238 TEST(EvalWithSourceURLInMessageScriptResourceNameOrSourceURL) { 17066 TEST(EvalWithSourceURLInMessageScriptResourceNameOrSourceURL) {
17239 LocalContext context; 17067 LocalContext context;
17240 v8::HandleScope scope(context->GetIsolate()); 17068 v8::HandleScope scope(context->GetIsolate());
17241 17069
17242 const char *source = 17070 const char *source =
17243 "function outer() {\n" 17071 "function outer() {\n"
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
17451 v8::String::ExternalStringResource* resource_[4]; 17279 v8::String::ExternalStringResource* resource_[4];
17452 bool found_resource_[4]; 17280 bool found_resource_[4];
17453 }; 17281 };
17454 17282
17455 17283
17456 TEST(ExternalizeOldSpaceTwoByteCons) { 17284 TEST(ExternalizeOldSpaceTwoByteCons) {
17457 v8::Isolate* isolate = CcTest::isolate(); 17285 v8::Isolate* isolate = CcTest::isolate();
17458 LocalContext env; 17286 LocalContext env;
17459 v8::HandleScope scope(isolate); 17287 v8::HandleScope scope(isolate);
17460 v8::Local<v8::String> cons = 17288 v8::Local<v8::String> cons =
17461 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); 17289 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")
17290 ->ToString(env.local())
17291 .ToLocalChecked();
17462 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); 17292 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString());
17463 CcTest::heap()->CollectAllAvailableGarbage(); 17293 CcTest::heap()->CollectAllAvailableGarbage();
17464 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons))); 17294 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons)));
17465 17295
17466 TestResource* resource = new TestResource( 17296 TestResource* resource = new TestResource(
17467 AsciiToTwoByteString("Romeo Montague Juliet Capulet")); 17297 AsciiToTwoByteString("Romeo Montague Juliet Capulet"));
17468 cons->MakeExternal(resource); 17298 cons->MakeExternal(resource);
17469 17299
17470 CHECK(cons->IsExternal()); 17300 CHECK(cons->IsExternal());
17471 CHECK_EQ(resource, cons->GetExternalStringResource()); 17301 CHECK_EQ(resource, cons->GetExternalStringResource());
17472 String::Encoding encoding; 17302 String::Encoding encoding;
17473 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); 17303 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding));
17474 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); 17304 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding);
17475 } 17305 }
17476 17306
17477 17307
17478 TEST(ExternalizeOldSpaceOneByteCons) { 17308 TEST(ExternalizeOldSpaceOneByteCons) {
17479 v8::Isolate* isolate = CcTest::isolate(); 17309 v8::Isolate* isolate = CcTest::isolate();
17480 LocalContext env; 17310 LocalContext env;
17481 v8::HandleScope scope(isolate); 17311 v8::HandleScope scope(isolate);
17482 v8::Local<v8::String> cons = 17312 v8::Local<v8::String> cons =
17483 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")->ToString(isolate); 17313 CompileRun("'Romeo Montague ' + 'Juliet Capulet'")
17314 ->ToString(env.local())
17315 .ToLocalChecked();
17484 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString()); 17316 CHECK(v8::Utils::OpenHandle(*cons)->IsConsString());
17485 CcTest::heap()->CollectAllAvailableGarbage(); 17317 CcTest::heap()->CollectAllAvailableGarbage();
17486 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons))); 17318 CHECK(CcTest::heap()->old_space()->Contains(*v8::Utils::OpenHandle(*cons)));
17487 17319
17488 TestOneByteResource* resource = 17320 TestOneByteResource* resource =
17489 new TestOneByteResource(i::StrDup("Romeo Montague Juliet Capulet")); 17321 new TestOneByteResource(i::StrDup("Romeo Montague Juliet Capulet"));
17490 cons->MakeExternal(resource); 17322 cons->MakeExternal(resource);
17491 17323
17492 CHECK(cons->IsExternalOneByte()); 17324 CHECK(cons->IsExternalOneByte());
17493 CHECK_EQ(resource, cons->GetExternalOneByteStringResource()); 17325 CHECK_EQ(resource, cons->GetExternalOneByteStringResource());
17494 String::Encoding encoding; 17326 String::Encoding encoding;
17495 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding)); 17327 CHECK_EQ(resource, cons->GetExternalStringResourceBase(&encoding));
17496 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); 17328 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding);
17497 } 17329 }
17498 17330
17499 17331
17500 TEST(VisitExternalStrings) { 17332 TEST(VisitExternalStrings) {
17501 v8::Isolate* isolate = CcTest::isolate(); 17333 v8::Isolate* isolate = CcTest::isolate();
17502 LocalContext env; 17334 LocalContext env;
17503 v8::HandleScope scope(isolate); 17335 v8::HandleScope scope(isolate);
17504 const char* string = "Some string"; 17336 const char* string = "Some string";
17505 uint16_t* two_byte_string = AsciiToTwoByteString(string); 17337 uint16_t* two_byte_string = AsciiToTwoByteString(string);
17506 TestResource* resource[4]; 17338 TestResource* resource[4];
17507 resource[0] = new TestResource(two_byte_string); 17339 resource[0] = new TestResource(two_byte_string);
17508 v8::Local<v8::String> string0 = 17340 v8::Local<v8::String> string0 =
17509 v8::String::NewExternal(env->GetIsolate(), resource[0]); 17341 v8::String::NewExternalTwoByte(env->GetIsolate(), resource[0])
17342 .ToLocalChecked();
17510 resource[1] = new TestResource(two_byte_string, NULL, false); 17343 resource[1] = new TestResource(two_byte_string, NULL, false);
17511 v8::Local<v8::String> string1 = 17344 v8::Local<v8::String> string1 =
17512 v8::String::NewExternal(env->GetIsolate(), resource[1]); 17345 v8::String::NewExternalTwoByte(env->GetIsolate(), resource[1])
17346 .ToLocalChecked();
17513 17347
17514 // Externalized symbol. 17348 // Externalized symbol.
17515 resource[2] = new TestResource(two_byte_string, NULL, false); 17349 resource[2] = new TestResource(two_byte_string, NULL, false);
17516 v8::Local<v8::String> string2 = 17350 v8::Local<v8::String> string2 =
17517 v8::String::NewFromUtf8(env->GetIsolate(), string, 17351 v8::String::NewFromUtf8(env->GetIsolate(), string,
17518 v8::NewStringType::kInternalized) 17352 v8::NewStringType::kInternalized)
17519 .ToLocalChecked(); 17353 .ToLocalChecked();
17520 CHECK(string2->MakeExternal(resource[2])); 17354 CHECK(string2->MakeExternal(resource[2]));
17521 17355
17522 // Symbolized External. 17356 // Symbolized External.
17523 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); 17357 resource[3] = new TestResource(AsciiToTwoByteString("Some other string"));
17524 v8::Local<v8::String> string3 = 17358 v8::Local<v8::String> string3 =
17525 v8::String::NewExternal(env->GetIsolate(), resource[3]); 17359 v8::String::NewExternalTwoByte(env->GetIsolate(), resource[3])
17360 .ToLocalChecked();
17526 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. 17361 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string.
17527 // Turn into a symbol. 17362 // Turn into a symbol.
17528 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3); 17363 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3);
17529 CHECK(!CcTest::i_isolate()->factory()->InternalizeString( 17364 CHECK(!CcTest::i_isolate()->factory()->InternalizeString(
17530 string3_i).is_null()); 17365 string3_i).is_null());
17531 CHECK(string3_i->IsInternalizedString()); 17366 CHECK(string3_i->IsInternalizedString());
17532 17367
17533 // We need to add usages for string* to avoid warnings in GCC 4.7 17368 // We need to add usages for string* to avoid warnings in GCC 4.7
17534 CHECK(string0->IsExternal()); 17369 CHECK(string0->IsExternal());
17535 CHECK(string1->IsExternal()); 17370 CHECK(string1->IsExternal());
17536 CHECK(string2->IsExternal()); 17371 CHECK(string2->IsExternal());
17537 CHECK(string3->IsExternal()); 17372 CHECK(string3->IsExternal());
17538 17373
17539 VisitorImpl visitor(resource); 17374 VisitorImpl visitor(resource);
17540 v8::V8::VisitExternalResources(&visitor); 17375 isolate->VisitExternalResources(&visitor);
17541 visitor.CheckVisitedResources(); 17376 visitor.CheckVisitedResources();
17542 } 17377 }
17543 17378
17544 17379
17545 TEST(ExternalStringCollectedAtTearDown) { 17380 TEST(ExternalStringCollectedAtTearDown) {
17546 int destroyed = 0; 17381 int destroyed = 0;
17547 v8::Isolate::CreateParams create_params; 17382 v8::Isolate::CreateParams create_params;
17548 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 17383 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
17549 v8::Isolate* isolate = v8::Isolate::New(create_params); 17384 v8::Isolate* isolate = v8::Isolate::New(create_params);
17550 { v8::Isolate::Scope isolate_scope(isolate); 17385 { v8::Isolate::Scope isolate_scope(isolate);
17551 v8::HandleScope handle_scope(isolate); 17386 v8::HandleScope handle_scope(isolate);
17552 const char* s = "One string to test them all, one string to find them."; 17387 const char* s = "One string to test them all, one string to find them.";
17553 TestOneByteResource* inscription = 17388 TestOneByteResource* inscription =
17554 new TestOneByteResource(i::StrDup(s), &destroyed); 17389 new TestOneByteResource(i::StrDup(s), &destroyed);
17555 v8::Local<v8::String> ring = v8::String::NewExternal(isolate, inscription); 17390 v8::Local<v8::String> ring =
17391 v8::String::NewExternalOneByte(isolate, inscription).ToLocalChecked();
17556 // Ring is still alive. Orcs are roaming freely across our lands. 17392 // Ring is still alive. Orcs are roaming freely across our lands.
17557 CHECK_EQ(0, destroyed); 17393 CHECK_EQ(0, destroyed);
17558 USE(ring); 17394 USE(ring);
17559 } 17395 }
17560 17396
17561 isolate->Dispose(); 17397 isolate->Dispose();
17562 // Ring has been destroyed. Free Peoples of Middle-earth Rejoice. 17398 // Ring has been destroyed. Free Peoples of Middle-earth Rejoice.
17563 CHECK_EQ(1, destroyed); 17399 CHECK_EQ(1, destroyed);
17564 } 17400 }
17565 17401
17566 17402
17567 TEST(ExternalInternalizedStringCollectedAtTearDown) { 17403 TEST(ExternalInternalizedStringCollectedAtTearDown) {
17568 int destroyed = 0; 17404 int destroyed = 0;
17569 v8::Isolate::CreateParams create_params; 17405 v8::Isolate::CreateParams create_params;
17570 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 17406 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
17571 v8::Isolate* isolate = v8::Isolate::New(create_params); 17407 v8::Isolate* isolate = v8::Isolate::New(create_params);
17572 { v8::Isolate::Scope isolate_scope(isolate); 17408 { v8::Isolate::Scope isolate_scope(isolate);
17573 LocalContext env(isolate); 17409 LocalContext env(isolate);
17574 v8::HandleScope handle_scope(isolate); 17410 v8::HandleScope handle_scope(isolate);
17575 CompileRun("var ring = 'One string to test them all';"); 17411 CompileRun("var ring = 'One string to test them all';");
17576 const char* s = "One string to test them all"; 17412 const char* s = "One string to test them all";
17577 TestOneByteResource* inscription = 17413 TestOneByteResource* inscription =
17578 new TestOneByteResource(i::StrDup(s), &destroyed); 17414 new TestOneByteResource(i::StrDup(s), &destroyed);
17579 v8::Local<v8::String> ring = CompileRun("ring")->ToString(isolate); 17415 v8::Local<v8::String> ring =
17416 CompileRun("ring")->ToString(env.local()).ToLocalChecked();
17580 CHECK(v8::Utils::OpenHandle(*ring)->IsInternalizedString()); 17417 CHECK(v8::Utils::OpenHandle(*ring)->IsInternalizedString());
17581 ring->MakeExternal(inscription); 17418 ring->MakeExternal(inscription);
17582 // Ring is still alive. Orcs are roaming freely across our lands. 17419 // Ring is still alive. Orcs are roaming freely across our lands.
17583 CHECK_EQ(0, destroyed); 17420 CHECK_EQ(0, destroyed);
17584 USE(ring); 17421 USE(ring);
17585 } 17422 }
17586 17423
17587 isolate->Dispose(); 17424 isolate->Dispose();
17588 // Ring has been destroyed. Free Peoples of Middle-earth Rejoice. 17425 // Ring has been destroyed. Free Peoples of Middle-earth Rejoice.
17589 CHECK_EQ(1, destroyed); 17426 CHECK_EQ(1, destroyed);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
17686 -qnan, 17523 -qnan,
17687 -snan 17524 -snan
17688 }; 17525 };
17689 int num_test_values = 20; 17526 int num_test_values = 20;
17690 17527
17691 for (int i = 0; i < num_test_values; i++) { 17528 for (int i = 0; i < num_test_values; i++) {
17692 double test_value = test_values[i]; 17529 double test_value = test_values[i];
17693 17530
17694 // Check that Number::New preserves non-NaNs and quiets SNaNs. 17531 // Check that Number::New preserves non-NaNs and quiets SNaNs.
17695 v8::Local<v8::Value> number = v8::Number::New(isolate, test_value); 17532 v8::Local<v8::Value> number = v8::Number::New(isolate, test_value);
17696 double stored_number = number->NumberValue(); 17533 double stored_number = number->NumberValue(context.local()).FromJust();
17697 if (!std::isnan(test_value)) { 17534 if (!std::isnan(test_value)) {
17698 CHECK_EQ(test_value, stored_number); 17535 CHECK_EQ(test_value, stored_number);
17699 } else { 17536 } else {
17700 uint64_t stored_bits = DoubleToBits(stored_number); 17537 uint64_t stored_bits = DoubleToBits(stored_number);
17701 // Check if quiet nan (bits 51..62 all set). 17538 // Check if quiet nan (bits 51..62 all set).
17702 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ 17539 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \
17703 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ 17540 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \
17704 !defined(USE_SIMULATOR) 17541 !defined(USE_SIMULATOR)
17705 // Most significant fraction bit for quiet nan is set to 0 17542 // Most significant fraction bit for quiet nan is set to 0
17706 // on MIPS architecture. Allowed by IEEE-754. 17543 // on MIPS architecture. Allowed by IEEE-754.
17707 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); 17544 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff));
17708 #else 17545 #else
17709 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); 17546 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff));
17710 #endif 17547 #endif
17711 } 17548 }
17712 17549
17713 // Check that Date::New preserves non-NaNs in the date range and 17550 // Check that Date::New preserves non-NaNs in the date range and
17714 // quiets SNaNs. 17551 // quiets SNaNs.
17715 v8::Local<v8::Value> date = v8::Date::New(isolate, test_value); 17552 v8::Local<v8::Value> date =
17553 v8::Date::New(context.local(), test_value).ToLocalChecked();
17716 double expected_stored_date = DoubleToDateTime(test_value); 17554 double expected_stored_date = DoubleToDateTime(test_value);
17717 double stored_date = date->NumberValue(); 17555 double stored_date = date->NumberValue(context.local()).FromJust();
17718 if (!std::isnan(expected_stored_date)) { 17556 if (!std::isnan(expected_stored_date)) {
17719 CHECK_EQ(expected_stored_date, stored_date); 17557 CHECK_EQ(expected_stored_date, stored_date);
17720 } else { 17558 } else {
17721 uint64_t stored_bits = DoubleToBits(stored_date); 17559 uint64_t stored_bits = DoubleToBits(stored_date);
17722 // Check if quiet nan (bits 51..62 all set). 17560 // Check if quiet nan (bits 51..62 all set).
17723 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ 17561 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \
17724 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ 17562 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \
17725 !defined(USE_SIMULATOR) 17563 !defined(USE_SIMULATOR)
17726 // Most significant fraction bit for quiet nan is set to 0 17564 // Most significant fraction bit for quiet nan is set to 0
17727 // on MIPS architecture. Allowed by IEEE-754. 17565 // on MIPS architecture. Allowed by IEEE-754.
17728 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); 17566 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff));
17729 #else 17567 #else
17730 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); 17568 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff));
17731 #endif 17569 #endif
17732 } 17570 }
17733 } 17571 }
17734 } 17572 }
17735 17573
17736 17574
17737 static void SpaghettiIncident( 17575 static void SpaghettiIncident(
17738 const v8::FunctionCallbackInfo<v8::Value>& args) { 17576 const v8::FunctionCallbackInfo<v8::Value>& args) {
17739 v8::HandleScope scope(args.GetIsolate()); 17577 v8::HandleScope scope(args.GetIsolate());
17740 v8::TryCatch tc(args.GetIsolate()); 17578 v8::TryCatch tc(args.GetIsolate());
17741 v8::Local<v8::String> str(args[0]->ToString(args.GetIsolate())); 17579 v8::MaybeLocal<v8::String> str(
17580 args[0]->ToString(args.GetIsolate()->GetCurrentContext()));
17742 USE(str); 17581 USE(str);
17743 if (tc.HasCaught()) 17582 if (tc.HasCaught())
17744 tc.ReThrow(); 17583 tc.ReThrow();
17745 } 17584 }
17746 17585
17747 17586
17748 // Test that an exception can be propagated down through a spaghetti 17587 // Test that an exception can be propagated down through a spaghetti
17749 // stack using ReThrow. 17588 // stack using ReThrow.
17750 THREADED_TEST(SpaghettiStackReThrow) { 17589 THREADED_TEST(SpaghettiStackReThrow) {
17751 v8::Isolate* isolate = CcTest::isolate(); 17590 v8::Isolate* isolate = CcTest::isolate();
17752 v8::HandleScope scope(isolate); 17591 v8::HandleScope scope(isolate);
17753 LocalContext context; 17592 LocalContext context;
17754 context->Global()->Set(v8_str("s"), 17593 context->Global()
17755 v8::FunctionTemplate::New(isolate, SpaghettiIncident) 17594 ->Set(context.local(), v8_str("s"),
17756 ->GetFunction(context.local()) 17595 v8::FunctionTemplate::New(isolate, SpaghettiIncident)
17757 .ToLocalChecked()); 17596 ->GetFunction(context.local())
17597 .ToLocalChecked())
17598 .FromJust();
17758 v8::TryCatch try_catch(isolate); 17599 v8::TryCatch try_catch(isolate);
17759 CompileRun( 17600 CompileRun(
17760 "var i = 0;" 17601 "var i = 0;"
17761 "var o = {" 17602 "var o = {"
17762 " toString: function () {" 17603 " toString: function () {"
17763 " if (i == 10) {" 17604 " if (i == 10) {"
17764 " throw 'Hey!';" 17605 " throw 'Hey!';"
17765 " } else {" 17606 " } else {"
17766 " i++;" 17607 " i++;"
17767 " return s(o);" 17608 " return s(o);"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
17839 { 17680 {
17840 v8::HandleScope scope(isolate); 17681 v8::HandleScope scope(isolate);
17841 v8::Local<Context> context = Context::New(isolate); 17682 v8::Local<Context> context = Context::New(isolate);
17842 17683
17843 context->Enter(); 17684 context->Enter();
17844 v8::TryCatch try_catch(isolate); 17685 v8::TryCatch try_catch(isolate);
17845 CompileRun(source_exception); 17686 CompileRun(source_exception);
17846 CHECK(try_catch.HasCaught()); 17687 CHECK(try_catch.HasCaught());
17847 v8::Local<v8::Message> message = try_catch.Message(); 17688 v8::Local<v8::Message> message = try_catch.Message();
17848 CHECK(!message.IsEmpty()); 17689 CHECK(!message.IsEmpty());
17849 CHECK_EQ(1, message->GetLineNumber()); 17690 CHECK_EQ(1, message->GetLineNumber(context).FromJust());
17850 context->Exit(); 17691 context->Exit();
17851 } 17692 }
17852 isolate->ContextDisposedNotification(); 17693 isolate->ContextDisposedNotification();
17853 for (gc_count = 1; gc_count < 10; gc_count++) { 17694 for (gc_count = 1; gc_count < 10; gc_count++) {
17854 other_context->Enter(); 17695 other_context->Enter();
17855 CompileRun(source_exception); 17696 CompileRun(source_exception);
17856 other_context->Exit(); 17697 other_context->Exit();
17857 CcTest::heap()->CollectAllGarbage(); 17698 CcTest::heap()->CollectAllGarbage();
17858 if (GetGlobalObjectsCount() == 1) break; 17699 if (GetGlobalObjectsCount() == 1) break;
17859 } 17700 }
17860 CHECK_GE(2, gc_count); 17701 CHECK_GE(2, gc_count);
17861 CHECK_EQ(1, GetGlobalObjectsCount()); 17702 CHECK_EQ(1, GetGlobalObjectsCount());
17862 17703
17863 isolate->ContextDisposedNotification(); 17704 isolate->ContextDisposedNotification();
17864 } 17705 }
17865 17706
17866 17707
17867 THREADED_TEST(ScriptOrigin) { 17708 THREADED_TEST(ScriptOrigin) {
17868 LocalContext env; 17709 LocalContext env;
17869 v8::HandleScope scope(env->GetIsolate()); 17710 v8::HandleScope scope(env->GetIsolate());
17870 v8::ScriptOrigin origin = v8::ScriptOrigin( 17711 v8::ScriptOrigin origin = v8::ScriptOrigin(
17871 v8_str("test"), v8::Integer::New(env->GetIsolate(), 1), 17712 v8_str("test"), v8::Integer::New(env->GetIsolate(), 1),
17872 v8::Integer::New(env->GetIsolate(), 1), v8::True(env->GetIsolate()), 17713 v8::Integer::New(env->GetIsolate(), 1), v8::True(env->GetIsolate()),
17873 v8::Local<v8::Integer>(), v8::True(env->GetIsolate()), 17714 v8::Local<v8::Integer>(), v8::True(env->GetIsolate()),
17874 v8_str("http://sourceMapUrl"), v8::True(env->GetIsolate())); 17715 v8_str("http://sourceMapUrl"), v8::True(env->GetIsolate()));
17875 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}"); 17716 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}");
17876 v8::Script::Compile(script, &origin)->Run(); 17717 v8::Script::Compile(env.local(), script, &origin)
17877 v8::Local<v8::Function> f = 17718 .ToLocalChecked()
17878 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); 17719 ->Run(env.local())
17879 v8::Local<v8::Function> g = 17720 .ToLocalChecked();
17880 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); 17721 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17722 env->Global()->Get(env.local(), v8_str("f")).ToLocalChecked());
17723 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17724 env->Global()->Get(env.local(), v8_str("g")).ToLocalChecked());
17881 17725
17882 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin(); 17726 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin();
17883 CHECK_EQ(0, strcmp("test", 17727 CHECK_EQ(0, strcmp("test",
17884 *v8::String::Utf8Value(script_origin_f.ResourceName()))); 17728 *v8::String::Utf8Value(script_origin_f.ResourceName())));
17885 CHECK_EQ( 17729 CHECK_EQ(
17886 1, 17730 1,
17887 script_origin_f.ResourceLineOffset()->Int32Value(env.local()).FromJust()); 17731 script_origin_f.ResourceLineOffset()->Int32Value(env.local()).FromJust());
17888 CHECK(script_origin_f.Options().IsSharedCrossOrigin()); 17732 CHECK(script_origin_f.Options().IsSharedCrossOrigin());
17889 CHECK(script_origin_f.Options().IsEmbedderDebugScript()); 17733 CHECK(script_origin_f.Options().IsEmbedderDebugScript());
17890 CHECK(script_origin_f.Options().IsOpaque()); 17734 CHECK(script_origin_f.Options().IsOpaque());
(...skipping 15 matching lines...) Expand all
17906 *v8::String::Utf8Value(script_origin_g.SourceMapUrl()))); 17750 *v8::String::Utf8Value(script_origin_g.SourceMapUrl())));
17907 } 17751 }
17908 17752
17909 17753
17910 THREADED_TEST(FunctionGetInferredName) { 17754 THREADED_TEST(FunctionGetInferredName) {
17911 LocalContext env; 17755 LocalContext env;
17912 v8::HandleScope scope(env->GetIsolate()); 17756 v8::HandleScope scope(env->GetIsolate());
17913 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); 17757 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
17914 v8::Local<v8::String> script = 17758 v8::Local<v8::String> script =
17915 v8_str("var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;"); 17759 v8_str("var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;");
17916 v8::Script::Compile(script, &origin)->Run(); 17760 v8::Script::Compile(env.local(), script, &origin)
17917 v8::Local<v8::Function> f = 17761 .ToLocalChecked()
17918 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); 17762 ->Run(env.local())
17763 .ToLocalChecked();
17764 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17765 env->Global()->Get(env.local(), v8_str("f")).ToLocalChecked());
17919 CHECK_EQ(0, 17766 CHECK_EQ(0,
17920 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()))); 17767 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName())));
17921 } 17768 }
17922 17769
17923 17770
17924 THREADED_TEST(FunctionGetDebugName) { 17771 THREADED_TEST(FunctionGetDebugName) {
17925 LocalContext env; 17772 LocalContext env;
17926 v8::HandleScope scope(env->GetIsolate()); 17773 v8::HandleScope scope(env->GetIsolate());
17927 const char* code = 17774 const char* code =
17928 "var error = false;" 17775 "var error = false;"
(...skipping 30 matching lines...) Expand all
17959 "}; g();" 17806 "}; g();"
17960 "var h = function() {};" 17807 "var h = function() {};"
17961 "h.displayName = 'displayName';" 17808 "h.displayName = 'displayName';"
17962 "Object.defineProperty(h, 'name', { value: 'function.name' });" 17809 "Object.defineProperty(h, 'name', { value: 'function.name' });"
17963 "var i = function() {};" 17810 "var i = function() {};"
17964 "i.displayName = 239;" 17811 "i.displayName = 239;"
17965 "Object.defineProperty(i, 'name', { value: 'function.name' });" 17812 "Object.defineProperty(i, 'name', { value: 'function.name' });"
17966 "var j = function() {};" 17813 "var j = function() {};"
17967 "Object.defineProperty(j, 'name', { value: 'function.name' });" 17814 "Object.defineProperty(j, 'name', { value: 'function.name' });"
17968 "var foo = { bar : { baz : function() {}}}; var k = foo.bar.baz;"; 17815 "var foo = { bar : { baz : function() {}}}; var k = foo.bar.baz;";
17969 v8::ScriptOrigin origin = 17816 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
17970 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 17817 v8::Script::Compile(env.local(), v8_str(code), &origin)
17971 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), code), &origin) 17818 .ToLocalChecked()
17972 ->Run(); 17819 ->Run(env.local())
17820 .ToLocalChecked();
17973 v8::Local<v8::Value> error = 17821 v8::Local<v8::Value> error =
17974 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "error")); 17822 env->Global()->Get(env.local(), v8_str("error")).ToLocalChecked();
17975 CHECK_EQ(false, error->BooleanValue()); 17823 CHECK_EQ(false, error->BooleanValue(env.local()).FromJust());
17976 const char* functions[] = {"a", "display_a", 17824 const char* functions[] = {"a", "display_a",
17977 "b", "display_b", 17825 "b", "display_b",
17978 "c", "c", 17826 "c", "c",
17979 "d", "d", 17827 "d", "d",
17980 "e", "e", 17828 "e", "e",
17981 "f", "f", 17829 "f", "f",
17982 "g", "set_in_runtime", 17830 "g", "set_in_runtime",
17983 "h", "displayName", 17831 "h", "displayName",
17984 "i", "function.name", 17832 "i", "function.name",
17985 "j", "function.name", 17833 "j", "function.name",
17986 "k", "foo.bar.baz"}; 17834 "k", "foo.bar.baz"};
17987 for (size_t i = 0; i < sizeof(functions) / sizeof(functions[0]) / 2; ++i) { 17835 for (size_t i = 0; i < sizeof(functions) / sizeof(functions[0]) / 2; ++i) {
17988 v8::Local<v8::Function> f = 17836 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17989 v8::Local<v8::Function>::Cast(env->Global()->Get( 17837 env->Global()
17990 v8::String::NewFromUtf8(env->GetIsolate(), functions[i * 2]))); 17838 ->Get(env.local(),
17839 v8::String::NewFromUtf8(env->GetIsolate(), functions[i * 2],
17840 v8::NewStringType::kNormal)
17841 .ToLocalChecked())
17842 .ToLocalChecked());
17991 CHECK_EQ(0, strcmp(functions[i * 2 + 1], 17843 CHECK_EQ(0, strcmp(functions[i * 2 + 1],
17992 *v8::String::Utf8Value(f->GetDebugName()))); 17844 *v8::String::Utf8Value(f->GetDebugName())));
17993 } 17845 }
17994 } 17846 }
17995 17847
17996 17848
17997 THREADED_TEST(FunctionGetDisplayName) { 17849 THREADED_TEST(FunctionGetDisplayName) {
17998 LocalContext env; 17850 LocalContext env;
17999 v8::HandleScope scope(env->GetIsolate()); 17851 v8::HandleScope scope(env->GetIsolate());
18000 const char* code = "var error = false;" 17852 const char* code = "var error = false;"
(...skipping 22 matching lines...) Expand all
18023 "});" 17875 "});"
18024 "function f() {};" 17876 "function f() {};"
18025 "f.displayName = { 'foo': 6, toString: function() {" 17877 "f.displayName = { 'foo': 6, toString: function() {"
18026 " error = true;" 17878 " error = true;"
18027 " return 'wrong_display_name';" 17879 " return 'wrong_display_name';"
18028 "}};" 17880 "}};"
18029 "var g = function() {" 17881 "var g = function() {"
18030 " arguments.callee.displayName = 'set_in_runtime';" 17882 " arguments.callee.displayName = 'set_in_runtime';"
18031 "}; g();"; 17883 "}; g();";
18032 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); 17884 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
18033 v8::Script::Compile(v8_str(code), &origin)->Run(); 17885 v8::Script::Compile(env.local(), v8_str(code), &origin)
18034 v8::Local<v8::Value> error = env->Global()->Get(v8_str("error")); 17886 .ToLocalChecked()
18035 v8::Local<v8::Function> a = 17887 ->Run(env.local())
18036 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("a"))); 17888 .ToLocalChecked();
18037 v8::Local<v8::Function> b = 17889 v8::Local<v8::Value> error =
18038 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("b"))); 17890 env->Global()->Get(env.local(), v8_str("error")).ToLocalChecked();
18039 v8::Local<v8::Function> c = 17891 v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast(
18040 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("c"))); 17892 env->Global()->Get(env.local(), v8_str("a")).ToLocalChecked());
18041 v8::Local<v8::Function> d = 17893 v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast(
18042 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("d"))); 17894 env->Global()->Get(env.local(), v8_str("b")).ToLocalChecked());
18043 v8::Local<v8::Function> e = 17895 v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast(
18044 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("e"))); 17896 env->Global()->Get(env.local(), v8_str("c")).ToLocalChecked());
18045 v8::Local<v8::Function> f = 17897 v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast(
18046 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); 17898 env->Global()->Get(env.local(), v8_str("d")).ToLocalChecked());
18047 v8::Local<v8::Function> g = 17899 v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast(
18048 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); 17900 env->Global()->Get(env.local(), v8_str("e")).ToLocalChecked());
18049 CHECK_EQ(false, error->BooleanValue()); 17901 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17902 env->Global()->Get(env.local(), v8_str("f")).ToLocalChecked());
17903 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17904 env->Global()->Get(env.local(), v8_str("g")).ToLocalChecked());
17905 CHECK_EQ(false, error->BooleanValue(env.local()).FromJust());
18050 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName()))); 17906 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName())));
18051 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName()))); 17907 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName())));
18052 CHECK(c->GetDisplayName()->IsUndefined()); 17908 CHECK(c->GetDisplayName()->IsUndefined());
18053 CHECK(d->GetDisplayName()->IsUndefined()); 17909 CHECK(d->GetDisplayName()->IsUndefined());
18054 CHECK(e->GetDisplayName()->IsUndefined()); 17910 CHECK(e->GetDisplayName()->IsUndefined());
18055 CHECK(f->GetDisplayName()->IsUndefined()); 17911 CHECK(f->GetDisplayName()->IsUndefined());
18056 CHECK_EQ( 17912 CHECK_EQ(
18057 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()))); 17913 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName())));
18058 } 17914 }
18059 17915
18060 17916
18061 THREADED_TEST(ScriptLineNumber) { 17917 THREADED_TEST(ScriptLineNumber) {
18062 LocalContext env; 17918 LocalContext env;
18063 v8::HandleScope scope(env->GetIsolate()); 17919 v8::HandleScope scope(env->GetIsolate());
18064 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); 17920 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
18065 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}"); 17921 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}");
18066 v8::Script::Compile(script, &origin)->Run(); 17922 v8::Script::Compile(env.local(), script, &origin)
18067 v8::Local<v8::Function> f = 17923 .ToLocalChecked()
18068 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); 17924 ->Run(env.local())
18069 v8::Local<v8::Function> g = 17925 .ToLocalChecked();
18070 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); 17926 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
17927 env->Global()->Get(env.local(), v8_str("f")).ToLocalChecked());
17928 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
17929 env->Global()->Get(env.local(), v8_str("g")).ToLocalChecked());
18071 CHECK_EQ(0, f->GetScriptLineNumber()); 17930 CHECK_EQ(0, f->GetScriptLineNumber());
18072 CHECK_EQ(2, g->GetScriptLineNumber()); 17931 CHECK_EQ(2, g->GetScriptLineNumber());
18073 } 17932 }
18074 17933
18075 17934
18076 THREADED_TEST(ScriptColumnNumber) { 17935 THREADED_TEST(ScriptColumnNumber) {
18077 LocalContext env; 17936 LocalContext env;
18078 v8::Isolate* isolate = env->GetIsolate(); 17937 v8::Isolate* isolate = env->GetIsolate();
18079 v8::HandleScope scope(isolate); 17938 v8::HandleScope scope(isolate);
18080 v8::ScriptOrigin origin = 17939 v8::ScriptOrigin origin =
18081 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3), 17940 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3),
18082 v8::Integer::New(isolate, 2)); 17941 v8::Integer::New(isolate, 2));
18083 v8::Local<v8::String> script = 17942 v8::Local<v8::String> script =
18084 v8_str("function foo() {}\n\n function bar() {}"); 17943 v8_str("function foo() {}\n\n function bar() {}");
18085 v8::Script::Compile(script, &origin)->Run(); 17944 v8::Script::Compile(env.local(), script, &origin)
18086 v8::Local<v8::Function> foo = 17945 .ToLocalChecked()
18087 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo"))); 17946 ->Run(env.local())
18088 v8::Local<v8::Function> bar = 17947 .ToLocalChecked();
18089 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar"))); 17948 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
17949 env->Global()->Get(env.local(), v8_str("foo")).ToLocalChecked());
17950 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast(
17951 env->Global()->Get(env.local(), v8_str("bar")).ToLocalChecked());
18090 CHECK_EQ(14, foo->GetScriptColumnNumber()); 17952 CHECK_EQ(14, foo->GetScriptColumnNumber());
18091 CHECK_EQ(17, bar->GetScriptColumnNumber()); 17953 CHECK_EQ(17, bar->GetScriptColumnNumber());
18092 } 17954 }
18093 17955
18094 17956
18095 THREADED_TEST(FunctionIsBuiltin) { 17957 THREADED_TEST(FunctionIsBuiltin) {
18096 LocalContext env; 17958 LocalContext env;
18097 v8::Isolate* isolate = env->GetIsolate(); 17959 v8::Isolate* isolate = env->GetIsolate();
18098 v8::HandleScope scope(isolate); 17960 v8::HandleScope scope(isolate);
18099 v8::Local<v8::Function> f; 17961 v8::Local<v8::Function> f;
(...skipping 12 matching lines...) Expand all
18112 17974
18113 THREADED_TEST(FunctionGetScriptId) { 17975 THREADED_TEST(FunctionGetScriptId) {
18114 LocalContext env; 17976 LocalContext env;
18115 v8::Isolate* isolate = env->GetIsolate(); 17977 v8::Isolate* isolate = env->GetIsolate();
18116 v8::HandleScope scope(isolate); 17978 v8::HandleScope scope(isolate);
18117 v8::ScriptOrigin origin = 17979 v8::ScriptOrigin origin =
18118 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3), 17980 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3),
18119 v8::Integer::New(isolate, 2)); 17981 v8::Integer::New(isolate, 2));
18120 v8::Local<v8::String> scriptSource = 17982 v8::Local<v8::String> scriptSource =
18121 v8_str("function foo() {}\n\n function bar() {}"); 17983 v8_str("function foo() {}\n\n function bar() {}");
18122 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); 17984 v8::Local<v8::Script> script(
18123 script->Run(); 17985 v8::Script::Compile(env.local(), scriptSource, &origin).ToLocalChecked());
18124 v8::Local<v8::Function> foo = 17986 script->Run(env.local()).ToLocalChecked();
18125 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo"))); 17987 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
18126 v8::Local<v8::Function> bar = 17988 env->Global()->Get(env.local(), v8_str("foo")).ToLocalChecked());
18127 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar"))); 17989 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast(
17990 env->Global()->Get(env.local(), v8_str("bar")).ToLocalChecked());
18128 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId()); 17991 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId());
18129 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId()); 17992 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId());
18130 } 17993 }
18131 17994
18132 17995
18133 THREADED_TEST(FunctionGetBoundFunction) { 17996 THREADED_TEST(FunctionGetBoundFunction) {
18134 LocalContext env; 17997 LocalContext env;
18135 v8::HandleScope scope(env->GetIsolate()); 17998 v8::HandleScope scope(env->GetIsolate());
18136 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); 17999 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
18137 v8::Local<v8::String> script = v8_str( 18000 v8::Local<v8::String> script = v8_str(
18138 "var a = new Object();\n" 18001 "var a = new Object();\n"
18139 "a.x = 1;\n" 18002 "a.x = 1;\n"
18140 "function f () { return this.x };\n" 18003 "function f () { return this.x };\n"
18141 "var g = f.bind(a);\n" 18004 "var g = f.bind(a);\n"
18142 "var b = g();"); 18005 "var b = g();");
18143 v8::Script::Compile(script, &origin)->Run(); 18006 v8::Script::Compile(env.local(), script, &origin)
18144 v8::Local<v8::Function> f = 18007 .ToLocalChecked()
18145 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); 18008 ->Run(env.local())
18146 v8::Local<v8::Function> g = 18009 .ToLocalChecked();
18147 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); 18010 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(
18011 env->Global()->Get(env.local(), v8_str("f")).ToLocalChecked());
18012 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast(
18013 env->Global()->Get(env.local(), v8_str("g")).ToLocalChecked());
18148 CHECK(g->GetBoundFunction()->IsFunction()); 18014 CHECK(g->GetBoundFunction()->IsFunction());
18149 Local<v8::Function> original_function = Local<v8::Function>::Cast( 18015 Local<v8::Function> original_function = Local<v8::Function>::Cast(
18150 g->GetBoundFunction()); 18016 g->GetBoundFunction());
18151 CHECK(f->GetName()->Equals(original_function->GetName())); 18017 CHECK(f->GetName()
18018 ->Equals(env.local(), original_function->GetName())
18019 .FromJust());
18152 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber()); 18020 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber());
18153 CHECK_EQ(f->GetScriptColumnNumber(), 18021 CHECK_EQ(f->GetScriptColumnNumber(),
18154 original_function->GetScriptColumnNumber()); 18022 original_function->GetScriptColumnNumber());
18155 } 18023 }
18156 18024
18157 18025
18158 static void GetterWhichReturns42( 18026 static void GetterWhichReturns42(
18159 Local<String> name, 18027 Local<String> name,
18160 const v8::PropertyCallbackInfo<v8::Value>& info) { 18028 const v8::PropertyCallbackInfo<v8::Value>& info) {
18161 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18029 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18162 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18030 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18163 info.GetReturnValue().Set(v8_num(42)); 18031 info.GetReturnValue().Set(v8_num(42));
18164 } 18032 }
18165 18033
18166 18034
18167 static void SetterWhichSetsYOnThisTo23( 18035 static void SetterWhichSetsYOnThisTo23(
18168 Local<String> name, 18036 Local<String> name,
18169 Local<Value> value, 18037 Local<Value> value,
18170 const v8::PropertyCallbackInfo<void>& info) { 18038 const v8::PropertyCallbackInfo<void>& info) {
18171 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18039 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18172 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18040 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18173 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18041 Local<Object>::Cast(info.This())
18042 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("y"), v8_num(23))
18043 .FromJust();
18174 } 18044 }
18175 18045
18176 18046
18177 void FooGetInterceptor(Local<Name> name, 18047 void FooGetInterceptor(Local<Name> name,
18178 const v8::PropertyCallbackInfo<v8::Value>& info) { 18048 const v8::PropertyCallbackInfo<v8::Value>& info) {
18179 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18049 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18180 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18050 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18181 if (!name->Equals(v8_str("foo"))) return; 18051 if (!name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
18052 .FromJust()) {
18053 return;
18054 }
18182 info.GetReturnValue().Set(v8_num(42)); 18055 info.GetReturnValue().Set(v8_num(42));
18183 } 18056 }
18184 18057
18185 18058
18186 void FooSetInterceptor(Local<Name> name, Local<Value> value, 18059 void FooSetInterceptor(Local<Name> name, Local<Value> value,
18187 const v8::PropertyCallbackInfo<v8::Value>& info) { 18060 const v8::PropertyCallbackInfo<v8::Value>& info) {
18188 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject()); 18061 CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
18189 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject()); 18062 CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
18190 if (!name->Equals(v8_str("foo"))) return; 18063 if (!name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
18191 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18064 .FromJust()) {
18065 return;
18066 }
18067 Local<Object>::Cast(info.This())
18068 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("y"), v8_num(23))
18069 .FromJust();
18192 info.GetReturnValue().Set(v8_num(23)); 18070 info.GetReturnValue().Set(v8_num(23));
18193 } 18071 }
18194 18072
18195 18073
18196 TEST(SetterOnConstructorPrototype) { 18074 TEST(SetterOnConstructorPrototype) {
18197 v8::Isolate* isolate = CcTest::isolate(); 18075 v8::Isolate* isolate = CcTest::isolate();
18198 v8::HandleScope scope(isolate); 18076 v8::HandleScope scope(isolate);
18199 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 18077 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18200 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, 18078 templ->SetAccessor(v8_str("x"), GetterWhichReturns42,
18201 SetterWhichSetsYOnThisTo23); 18079 SetterWhichSetsYOnThisTo23);
18202 LocalContext context; 18080 LocalContext context;
18203 CHECK(context->Global() 18081 CHECK(context->Global()
18204 ->Set(context.local(), v8_str("P"), 18082 ->Set(context.local(), v8_str("P"),
18205 templ->NewInstance(context.local()).ToLocalChecked()) 18083 templ->NewInstance(context.local()).ToLocalChecked())
18206 .FromJust()); 18084 .FromJust());
18207 CompileRun("function C1() {" 18085 CompileRun("function C1() {"
18208 " this.x = 23;" 18086 " this.x = 23;"
18209 "};" 18087 "};"
18210 "C1.prototype = P;" 18088 "C1.prototype = P;"
18211 "function C2() {" 18089 "function C2() {"
18212 " this.x = 23" 18090 " this.x = 23"
18213 "};" 18091 "};"
18214 "C2.prototype = { };" 18092 "C2.prototype = { };"
18215 "C2.prototype.__proto__ = P;"); 18093 "C2.prototype.__proto__ = P;");
18216 18094
18217 v8::Local<v8::Script> script; 18095 v8::Local<v8::Script> script;
18218 script = v8_compile("new C1();"); 18096 script = v8_compile("new C1();");
18219 for (int i = 0; i < 10; i++) { 18097 for (int i = 0; i < 10; i++) {
18220 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); 18098 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(
18221 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18099 script->Run(context.local()).ToLocalChecked());
18222 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18100 CHECK_EQ(42, c1->Get(context.local(), v8_str("x"))
18101 .ToLocalChecked()
18102 ->Int32Value(context.local())
18103 .FromJust());
18104 CHECK_EQ(23, c1->Get(context.local(), v8_str("y"))
18105 .ToLocalChecked()
18106 ->Int32Value(context.local())
18107 .FromJust());
18223 } 18108 }
18224 18109
18225 script = v8_compile("new C2();"); 18110 script = v8_compile("new C2();");
18226 for (int i = 0; i < 10; i++) { 18111 for (int i = 0; i < 10; i++) {
18227 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run()); 18112 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(
18228 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18113 script->Run(context.local()).ToLocalChecked());
18229 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18114 CHECK_EQ(42, c2->Get(context.local(), v8_str("x"))
18115 .ToLocalChecked()
18116 ->Int32Value(context.local())
18117 .FromJust());
18118 CHECK_EQ(23, c2->Get(context.local(), v8_str("y"))
18119 .ToLocalChecked()
18120 ->Int32Value(context.local())
18121 .FromJust());
18230 } 18122 }
18231 } 18123 }
18232 18124
18233 18125
18234 static void NamedPropertyGetterWhichReturns42( 18126 static void NamedPropertyGetterWhichReturns42(
18235 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 18127 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
18236 info.GetReturnValue().Set(v8_num(42)); 18128 info.GetReturnValue().Set(v8_num(42));
18237 } 18129 }
18238 18130
18239 18131
18240 static void NamedPropertySetterWhichSetsYOnThisTo23( 18132 static void NamedPropertySetterWhichSetsYOnThisTo23(
18241 Local<Name> name, Local<Value> value, 18133 Local<Name> name, Local<Value> value,
18242 const v8::PropertyCallbackInfo<v8::Value>& info) { 18134 const v8::PropertyCallbackInfo<v8::Value>& info) {
18243 if (name->Equals(v8_str("x"))) { 18135 if (name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("x"))
18244 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 18136 .FromJust()) {
18137 Local<Object>::Cast(info.This())
18138 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("y"), v8_num(23))
18139 .FromJust();
18245 } 18140 }
18246 } 18141 }
18247 18142
18248 18143
18249 THREADED_TEST(InterceptorOnConstructorPrototype) { 18144 THREADED_TEST(InterceptorOnConstructorPrototype) {
18250 v8::Isolate* isolate = CcTest::isolate(); 18145 v8::Isolate* isolate = CcTest::isolate();
18251 v8::HandleScope scope(isolate); 18146 v8::HandleScope scope(isolate);
18252 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 18147 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18253 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 18148 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
18254 NamedPropertyGetterWhichReturns42, 18149 NamedPropertyGetterWhichReturns42,
18255 NamedPropertySetterWhichSetsYOnThisTo23)); 18150 NamedPropertySetterWhichSetsYOnThisTo23));
18256 LocalContext context; 18151 LocalContext context;
18257 CHECK(context->Global() 18152 CHECK(context->Global()
18258 ->Set(context.local(), v8_str("P"), 18153 ->Set(context.local(), v8_str("P"),
18259 templ->NewInstance(context.local()).ToLocalChecked()) 18154 templ->NewInstance(context.local()).ToLocalChecked())
18260 .FromJust()); 18155 .FromJust());
18261 CompileRun("function C1() {" 18156 CompileRun("function C1() {"
18262 " this.x = 23;" 18157 " this.x = 23;"
18263 "};" 18158 "};"
18264 "C1.prototype = P;" 18159 "C1.prototype = P;"
18265 "function C2() {" 18160 "function C2() {"
18266 " this.x = 23" 18161 " this.x = 23"
18267 "};" 18162 "};"
18268 "C2.prototype = { };" 18163 "C2.prototype = { };"
18269 "C2.prototype.__proto__ = P;"); 18164 "C2.prototype.__proto__ = P;");
18270 18165
18271 v8::Local<v8::Script> script; 18166 v8::Local<v8::Script> script;
18272 script = v8_compile("new C1();"); 18167 script = v8_compile("new C1();");
18273 for (int i = 0; i < 10; i++) { 18168 for (int i = 0; i < 10; i++) {
18274 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); 18169 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(
18275 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18170 script->Run(context.local()).ToLocalChecked());
18276 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18171 CHECK_EQ(23, c1->Get(context.local(), v8_str("x"))
18172 .ToLocalChecked()
18173 ->Int32Value(context.local())
18174 .FromJust());
18175 CHECK_EQ(42, c1->Get(context.local(), v8_str("y"))
18176 .ToLocalChecked()
18177 ->Int32Value(context.local())
18178 .FromJust());
18277 } 18179 }
18278 18180
18279 script = v8_compile("new C2();"); 18181 script = v8_compile("new C2();");
18280 for (int i = 0; i < 10; i++) { 18182 for (int i = 0; i < 10; i++) {
18281 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run()); 18183 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(
18282 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18184 script->Run(context.local()).ToLocalChecked());
18283 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18185 CHECK_EQ(23, c2->Get(context.local(), v8_str("x"))
18186 .ToLocalChecked()
18187 ->Int32Value(context.local())
18188 .FromJust());
18189 CHECK_EQ(42, c2->Get(context.local(), v8_str("y"))
18190 .ToLocalChecked()
18191 ->Int32Value(context.local())
18192 .FromJust());
18284 } 18193 }
18285 } 18194 }
18286 18195
18287 18196
18288 TEST(Regress618) { 18197 TEST(Regress618) {
18289 const char* source = "function C1() {" 18198 const char* source = "function C1() {"
18290 " this.x = 23;" 18199 " this.x = 23;"
18291 "};" 18200 "};"
18292 "C1.prototype = P;"; 18201 "C1.prototype = P;";
18293 18202
18294 LocalContext context; 18203 LocalContext context;
18295 v8::Isolate* isolate = context->GetIsolate(); 18204 v8::Isolate* isolate = context->GetIsolate();
18296 v8::HandleScope scope(isolate); 18205 v8::HandleScope scope(isolate);
18297 v8::Local<v8::Script> script; 18206 v8::Local<v8::Script> script;
18298 18207
18299 // Use a simple object as prototype. 18208 // Use a simple object as prototype.
18300 v8::Local<v8::Object> prototype = v8::Object::New(isolate); 18209 v8::Local<v8::Object> prototype = v8::Object::New(isolate);
18301 prototype->Set(v8_str("y"), v8_num(42)); 18210 prototype->Set(context.local(), v8_str("y"), v8_num(42)).FromJust();
18302 CHECK(context->Global() 18211 CHECK(context->Global()
18303 ->Set(context.local(), v8_str("P"), prototype) 18212 ->Set(context.local(), v8_str("P"), prototype)
18304 .FromJust()); 18213 .FromJust());
18305 18214
18306 // This compile will add the code to the compilation cache. 18215 // This compile will add the code to the compilation cache.
18307 CompileRun(source); 18216 CompileRun(source);
18308 18217
18309 script = v8_compile("new C1();"); 18218 script = v8_compile("new C1();");
18310 // Allow enough iterations for the inobject slack tracking logic 18219 // Allow enough iterations for the inobject slack tracking logic
18311 // to finalize instance size and install the fast construct stub. 18220 // to finalize instance size and install the fast construct stub.
18312 for (int i = 0; i < 256; i++) { 18221 for (int i = 0; i < 256; i++) {
18313 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); 18222 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(
18314 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18223 script->Run(context.local()).ToLocalChecked());
18315 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18224 CHECK_EQ(23, c1->Get(context.local(), v8_str("x"))
18225 .ToLocalChecked()
18226 ->Int32Value(context.local())
18227 .FromJust());
18228 CHECK_EQ(42, c1->Get(context.local(), v8_str("y"))
18229 .ToLocalChecked()
18230 ->Int32Value(context.local())
18231 .FromJust());
18316 } 18232 }
18317 18233
18318 // Use an API object with accessors as prototype. 18234 // Use an API object with accessors as prototype.
18319 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 18235 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18320 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, 18236 templ->SetAccessor(v8_str("x"), GetterWhichReturns42,
18321 SetterWhichSetsYOnThisTo23); 18237 SetterWhichSetsYOnThisTo23);
18322 CHECK(context->Global() 18238 CHECK(context->Global()
18323 ->Set(context.local(), v8_str("P"), 18239 ->Set(context.local(), v8_str("P"),
18324 templ->NewInstance(context.local()).ToLocalChecked()) 18240 templ->NewInstance(context.local()).ToLocalChecked())
18325 .FromJust()); 18241 .FromJust());
18326 18242
18327 // This compile will get the code from the compilation cache. 18243 // This compile will get the code from the compilation cache.
18328 CompileRun(source); 18244 CompileRun(source);
18329 18245
18330 script = v8_compile("new C1();"); 18246 script = v8_compile("new C1();");
18331 for (int i = 0; i < 10; i++) { 18247 for (int i = 0; i < 10; i++) {
18332 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); 18248 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(
18333 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); 18249 script->Run(context.local()).ToLocalChecked());
18334 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); 18250 CHECK_EQ(42, c1->Get(context.local(), v8_str("x"))
18251 .ToLocalChecked()
18252 ->Int32Value(context.local())
18253 .FromJust());
18254 CHECK_EQ(23, c1->Get(context.local(), v8_str("y"))
18255 .ToLocalChecked()
18256 ->Int32Value(context.local())
18257 .FromJust());
18335 } 18258 }
18336 } 18259 }
18337 18260
18338 v8::Isolate* gc_callbacks_isolate = NULL; 18261 v8::Isolate* gc_callbacks_isolate = NULL;
18339 int prologue_call_count = 0; 18262 int prologue_call_count = 0;
18340 int epilogue_call_count = 0; 18263 int epilogue_call_count = 0;
18341 int prologue_call_count_second = 0; 18264 int prologue_call_count_second = 0;
18342 int epilogue_call_count_second = 0; 18265 int epilogue_call_count_second = 0;
18343 int prologue_call_count_alloc = 0; 18266 int prologue_call_count_alloc = 0;
18344 int epilogue_call_count_alloc = 0; 18267 int epilogue_call_count_alloc = 0;
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
18601 v8::base::SmartArrayPointer<uintptr_t> aligned_contents( 18524 v8::base::SmartArrayPointer<uintptr_t> aligned_contents(
18602 new uintptr_t[aligned_length]); 18525 new uintptr_t[aligned_length]);
18603 uint16_t* string_contents = 18526 uint16_t* string_contents =
18604 reinterpret_cast<uint16_t*>(aligned_contents.get()); 18527 reinterpret_cast<uint16_t*>(aligned_contents.get());
18605 // Set to contain only one byte. 18528 // Set to contain only one byte.
18606 for (int i = 0; i < length-1; i++) { 18529 for (int i = 0; i < length-1; i++) {
18607 string_contents[i] = 0x41; 18530 string_contents[i] = 0x41;
18608 } 18531 }
18609 string_contents[length-1] = 0; 18532 string_contents[length-1] = 0;
18610 // Simple case. 18533 // Simple case.
18611 Local<String> string = String::NewExternal( 18534 Local<String> string =
18612 isolate, new TestResource(string_contents, NULL, false)); 18535 String::NewExternalTwoByte(isolate,
18536 new TestResource(string_contents, NULL, false))
18537 .ToLocalChecked();
18613 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18538 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18614 // Counter example. 18539 // Counter example.
18615 string = String::NewFromTwoByte(isolate, string_contents); 18540 string = String::NewFromTwoByte(isolate, string_contents,
18541 v8::NewStringType::kNormal)
18542 .ToLocalChecked();
18616 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18543 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
18617 // Test left right and balanced cons strings. 18544 // Test left right and balanced cons strings.
18618 Local<String> base = v8_str("a"); 18545 Local<String> base = v8_str("a");
18619 Local<String> left = base; 18546 Local<String> left = base;
18620 Local<String> right = base; 18547 Local<String> right = base;
18621 for (int i = 0; i < 1000; i++) { 18548 for (int i = 0; i < 1000; i++) {
18622 left = String::Concat(base, left); 18549 left = String::Concat(base, left);
18623 right = String::Concat(right, base); 18550 right = String::Concat(right, base);
18624 } 18551 }
18625 Local<String> balanced = String::Concat(left, base); 18552 Local<String> balanced = String::Concat(left, base);
18626 balanced = String::Concat(balanced, right); 18553 balanced = String::Concat(balanced, right);
18627 Local<String> cons_strings[] = {left, balanced, right}; 18554 Local<String> cons_strings[] = {left, balanced, right};
18628 Local<String> two_byte = String::NewExternal( 18555 Local<String> two_byte =
18629 isolate, new TestResource(string_contents, NULL, false)); 18556 String::NewExternalTwoByte(isolate,
18557 new TestResource(string_contents, NULL, false))
18558 .ToLocalChecked();
18630 USE(two_byte); USE(cons_strings); 18559 USE(two_byte); USE(cons_strings);
18631 for (size_t i = 0; i < arraysize(cons_strings); i++) { 18560 for (size_t i = 0; i < arraysize(cons_strings); i++) {
18632 // Base assumptions. 18561 // Base assumptions.
18633 string = cons_strings[i]; 18562 string = cons_strings[i];
18634 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18563 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
18635 // Test left and right concatentation. 18564 // Test left and right concatentation.
18636 string = String::Concat(two_byte, cons_strings[i]); 18565 string = String::Concat(two_byte, cons_strings[i]);
18637 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18566 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18638 string = String::Concat(cons_strings[i], two_byte); 18567 string = String::Concat(cons_strings[i], two_byte);
18639 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18568 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
18640 } 18569 }
18641 // Set bits in different positions 18570 // Set bits in different positions
18642 // for strings of different lengths and alignments. 18571 // for strings of different lengths and alignments.
18643 for (int alignment = 0; alignment < 7; alignment++) { 18572 for (int alignment = 0; alignment < 7; alignment++) {
18644 for (int size = 2; alignment + size < length; size *= 2) { 18573 for (int size = 2; alignment + size < length; size *= 2) {
18645 int zero_offset = size + alignment; 18574 int zero_offset = size + alignment;
18646 string_contents[zero_offset] = 0; 18575 string_contents[zero_offset] = 0;
18647 for (int i = 0; i < size; i++) { 18576 for (int i = 0; i < size; i++) {
18648 int shift = 8 + (i % 7); 18577 int shift = 8 + (i % 7);
18649 string_contents[alignment + i] = 1 << shift; 18578 string_contents[alignment + i] = 1 << shift;
18650 string = String::NewExternal( 18579 string = String::NewExternalTwoByte(
18651 isolate, 18580 isolate,
18652 new TestResource(string_contents + alignment, NULL, false)); 18581 new TestResource(string_contents + alignment, NULL, false))
18582 .ToLocalChecked();
18653 CHECK_EQ(size, string->Length()); 18583 CHECK_EQ(size, string->Length());
18654 CHECK(!string->ContainsOnlyOneByte()); 18584 CHECK(!string->ContainsOnlyOneByte());
18655 string_contents[alignment + i] = 0x41; 18585 string_contents[alignment + i] = 0x41;
18656 } 18586 }
18657 string_contents[zero_offset] = 0x41; 18587 string_contents[zero_offset] = 0x41;
18658 } 18588 }
18659 } 18589 }
18660 } 18590 }
18661 18591
18662 18592
18663 // Failed access check callback that performs a GC on each invocation. 18593 // Failed access check callback that performs a GC on each invocation.
18664 void FailedAccessCheckCallbackGC(Local<v8::Object> target, 18594 void FailedAccessCheckCallbackGC(Local<v8::Object> target,
18665 v8::AccessType type, 18595 v8::AccessType type,
18666 Local<v8::Value> data) { 18596 Local<v8::Value> data) {
18667 CcTest::heap()->CollectAllGarbage(); 18597 CcTest::heap()->CollectAllGarbage();
18668 CcTest::isolate()->ThrowException( 18598 CcTest::isolate()->ThrowException(
18669 v8::Exception::Error(v8_str("cross context"))); 18599 v8::Exception::Error(v8_str("cross context")));
18670 } 18600 }
18671 18601
18672 18602
18673 TEST(GCInFailedAccessCheckCallback) { 18603 TEST(GCInFailedAccessCheckCallback) {
18674 // Install a failed access check callback that performs a GC on each 18604 // Install a failed access check callback that performs a GC on each
18675 // invocation. Then force the callback to be called from va 18605 // invocation. Then force the callback to be called from va
18676 18606
18677 v8::V8::Initialize(); 18607 v8::V8::Initialize();
18678 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 18608 v8::Isolate* isolate = CcTest::isolate();
18679 18609
18680 v8::Isolate* isolate = CcTest::isolate(); 18610 isolate->SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
18611
18681 v8::HandleScope scope(isolate); 18612 v8::HandleScope scope(isolate);
18682 18613
18683 // Create an ObjectTemplate for global objects and install access 18614 // Create an ObjectTemplate for global objects and install access
18684 // check callbacks that will block access. 18615 // check callbacks that will block access.
18685 v8::Local<v8::ObjectTemplate> global_template = 18616 v8::Local<v8::ObjectTemplate> global_template =
18686 v8::ObjectTemplate::New(isolate); 18617 v8::ObjectTemplate::New(isolate);
18687 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 18618 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
18688 18619
18689 // Create a context and set an x property on it's global object. 18620 // Create a context and set an x property on it's global object.
18690 LocalContext context0(NULL, global_template); 18621 LocalContext context0(NULL, global_template);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
18731 CHECK(CompileRun("0 in other").IsEmpty()); 18662 CHECK(CompileRun("0 in other").IsEmpty());
18732 CHECK(try_catch.HasCaught()); 18663 CHECK(try_catch.HasCaught());
18733 try_catch.Reset(); 18664 try_catch.Reset();
18734 18665
18735 // Delete property. 18666 // Delete property.
18736 CHECK(CompileRun("delete other.x").IsEmpty()); 18667 CHECK(CompileRun("delete other.x").IsEmpty());
18737 CHECK(try_catch.HasCaught()); 18668 CHECK(try_catch.HasCaught());
18738 try_catch.Reset(); 18669 try_catch.Reset();
18739 18670
18740 // Delete element. 18671 // Delete element.
18741 CHECK_EQ(false, global0->Delete(0)); 18672 CHECK(global0->Delete(context1.local(), 0).IsNothing());
18673 CHECK(try_catch.HasCaught());
18674 try_catch.Reset();
18742 18675
18743 // DefineAccessor. 18676 // DefineAccessor.
18744 CHECK_EQ(false, 18677 CHECK(global0->SetAccessor(context1.local(), v8_str("x"), GetXValue, NULL,
18745 global0->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("x"))); 18678 v8_str("x"))
18679 .IsNothing());
18680 CHECK(try_catch.HasCaught());
18681 try_catch.Reset();
18746 18682
18747 // Define JavaScript accessor. 18683 // Define JavaScript accessor.
18748 CHECK(CompileRun( 18684 CHECK(CompileRun(
18749 "Object.prototype.__defineGetter__.call(" 18685 "Object.prototype.__defineGetter__.call("
18750 " other, \'x\', function() { return 42; })").IsEmpty()); 18686 " other, \'x\', function() { return 42; })").IsEmpty());
18751 CHECK(try_catch.HasCaught()); 18687 CHECK(try_catch.HasCaught());
18752 try_catch.Reset(); 18688 try_catch.Reset();
18753 18689
18754 // LookupAccessor. 18690 // LookupAccessor.
18755 CHECK(CompileRun( 18691 CHECK(CompileRun(
18756 "Object.prototype.__lookupGetter__.call(" 18692 "Object.prototype.__lookupGetter__.call("
18757 " other, \'x\')").IsEmpty()); 18693 " other, \'x\')").IsEmpty());
18758 CHECK(try_catch.HasCaught()); 18694 CHECK(try_catch.HasCaught());
18759 try_catch.Reset(); 18695 try_catch.Reset();
18760 18696
18761 // HasOwnElement. 18697 // HasOwnElement.
18762 CHECK(CompileRun( 18698 CHECK(CompileRun(
18763 "Object.prototype.hasOwnProperty.call(" 18699 "Object.prototype.hasOwnProperty.call("
18764 "other, \'0\')").IsEmpty()); 18700 "other, \'0\')").IsEmpty());
18765 CHECK(try_catch.HasCaught()); 18701 CHECK(try_catch.HasCaught());
18766 try_catch.Reset(); 18702 try_catch.Reset();
18767 18703
18768 CHECK_EQ(false, global0->HasRealIndexedProperty(0)); 18704 CHECK(global0->HasRealIndexedProperty(context1.local(), 0).IsNothing());
18769 CHECK_EQ(false, global0->HasRealNamedProperty(v8_str("x"))); 18705 CHECK(try_catch.HasCaught());
18770 CHECK_EQ(false, global0->HasRealNamedCallbackProperty(v8_str("x"))); 18706 try_catch.Reset();
18707
18708 CHECK(
18709 global0->HasRealNamedProperty(context1.local(), v8_str("x")).IsNothing());
18710 CHECK(try_catch.HasCaught());
18711 try_catch.Reset();
18712
18713 CHECK(global0->HasRealNamedCallbackProperty(context1.local(), v8_str("x"))
18714 .IsNothing());
18715 CHECK(try_catch.HasCaught());
18716 try_catch.Reset();
18771 18717
18772 // Reset the failed access check callback so it does not influence 18718 // Reset the failed access check callback so it does not influence
18773 // the other tests. 18719 // the other tests.
18774 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); 18720 isolate->SetFailedAccessCheckCallbackFunction(NULL);
18775 } 18721 }
18776 18722
18777 18723
18778 TEST(IsolateNewDispose) { 18724 TEST(IsolateNewDispose) {
18779 v8::Isolate* current_isolate = CcTest::isolate(); 18725 v8::Isolate* current_isolate = CcTest::isolate();
18780 v8::Isolate::CreateParams create_params; 18726 v8::Isolate::CreateParams create_params;
18781 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 18727 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
18782 v8::Isolate* isolate = v8::Isolate::New(create_params); 18728 v8::Isolate* isolate = v8::Isolate::New(create_params);
18783 CHECK(isolate != NULL); 18729 CHECK(isolate != NULL);
18784 CHECK(current_isolate != isolate); 18730 CHECK(current_isolate != isolate);
18785 CHECK(current_isolate == CcTest::isolate()); 18731 CHECK(current_isolate == CcTest::isolate());
18786 18732
18787 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 18733 isolate->SetFatalErrorHandler(StoringErrorCallback);
18788 last_location = last_message = NULL; 18734 last_location = last_message = NULL;
18789 isolate->Dispose(); 18735 isolate->Dispose();
18790 CHECK(!last_location); 18736 CHECK(!last_location);
18791 CHECK(!last_message); 18737 CHECK(!last_message);
18792 } 18738 }
18793 18739
18794 18740
18795 UNINITIALIZED_TEST(DisposeIsolateWhenInUse) { 18741 UNINITIALIZED_TEST(DisposeIsolateWhenInUse) {
18796 v8::Isolate::CreateParams create_params; 18742 v8::Isolate::CreateParams create_params;
18797 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 18743 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
18798 v8::Isolate* isolate = v8::Isolate::New(create_params); 18744 v8::Isolate* isolate = v8::Isolate::New(create_params);
18799 { 18745 {
18800 v8::Isolate::Scope i_scope(isolate); 18746 v8::Isolate::Scope i_scope(isolate);
18801 v8::HandleScope scope(isolate); 18747 v8::HandleScope scope(isolate);
18802 LocalContext context(isolate); 18748 LocalContext context(isolate);
18803 // Run something in this isolate. 18749 // Run something in this isolate.
18804 ExpectTrue("true"); 18750 ExpectTrue("true");
18805 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 18751 isolate->SetFatalErrorHandler(StoringErrorCallback);
18806 last_location = last_message = NULL; 18752 last_location = last_message = NULL;
18807 // Still entered, should fail. 18753 // Still entered, should fail.
18808 isolate->Dispose(); 18754 isolate->Dispose();
18809 CHECK(last_location); 18755 CHECK(last_location);
18810 CHECK(last_message); 18756 CHECK(last_message);
18811 } 18757 }
18812 isolate->Dispose(); 18758 isolate->Dispose();
18813 } 18759 }
18814 18760
18815 18761
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
18959 } 18905 }
18960 18906
18961 { 18907 {
18962 v8::Isolate::Scope iscope(isolate2); 18908 v8::Isolate::Scope iscope(isolate2);
18963 context2.Reset(); 18909 context2.Reset();
18964 } 18910 }
18965 18911
18966 context1.Reset(); 18912 context1.Reset();
18967 isolate1->Exit(); 18913 isolate1->Exit();
18968 18914
18969 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 18915 isolate2->SetFatalErrorHandler(StoringErrorCallback);
18970 last_location = last_message = NULL; 18916 last_location = last_message = NULL;
18971 18917
18972 isolate1->Dispose(); 18918 isolate1->Dispose();
18973 CHECK(!last_location); 18919 CHECK(!last_location);
18974 CHECK(!last_message); 18920 CHECK(!last_message);
18975 18921
18976 isolate2->Dispose(); 18922 isolate2->Dispose();
18977 CHECK(!last_location); 18923 CHECK(!last_location);
18978 CHECK(!last_message); 18924 CHECK(!last_message);
18979 18925
(...skipping 13 matching lines...) Expand all
18993 v8::HandleScope scope(isolate); 18939 v8::HandleScope scope(isolate);
18994 LocalContext context(isolate); 18940 LocalContext context(isolate);
18995 i::ScopedVector<char> code(1024); 18941 i::ScopedVector<char> code(1024);
18996 i::SNPrintF(code, "function fib(n) {" 18942 i::SNPrintF(code, "function fib(n) {"
18997 " if (n <= 2) return 1;" 18943 " if (n <= 2) return 1;"
18998 " return fib(n-1) + fib(n-2);" 18944 " return fib(n-1) + fib(n-2);"
18999 "}" 18945 "}"
19000 "fib(%d)", limit); 18946 "fib(%d)", limit);
19001 Local<Value> value = CompileRun(code.start()); 18947 Local<Value> value = CompileRun(code.start());
19002 CHECK(value->IsNumber()); 18948 CHECK(value->IsNumber());
19003 return static_cast<int>(value->NumberValue()); 18949 return static_cast<int>(value->NumberValue(context.local()).FromJust());
19004 } 18950 }
19005 18951
19006 class IsolateThread : public v8::base::Thread { 18952 class IsolateThread : public v8::base::Thread {
19007 public: 18953 public:
19008 explicit IsolateThread(int fib_limit) 18954 explicit IsolateThread(int fib_limit)
19009 : Thread(Options("IsolateThread")), fib_limit_(fib_limit), result_(0) {} 18955 : Thread(Options("IsolateThread")), fib_limit_(fib_limit), result_(0) {}
19010 18956
19011 void Run() { 18957 void Run() {
19012 v8::Isolate::CreateParams create_params; 18958 v8::Isolate::CreateParams create_params;
19013 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 18959 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
19052 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 18998 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
19053 v8::Isolate* isolate = v8::Isolate::New(create_params); 18999 v8::Isolate* isolate = v8::Isolate::New(create_params);
19054 Local<v8::Context> context; 19000 Local<v8::Context> context;
19055 { 19001 {
19056 v8::Isolate::Scope isolate_scope(isolate); 19002 v8::Isolate::Scope isolate_scope(isolate);
19057 v8::HandleScope handle_scope(isolate); 19003 v8::HandleScope handle_scope(isolate);
19058 context = v8::Context::New(isolate); 19004 context = v8::Context::New(isolate);
19059 v8::Context::Scope context_scope(context); 19005 v8::Context::Scope context_scope(context);
19060 Local<Value> v = CompileRun("2"); 19006 Local<Value> v = CompileRun("2");
19061 CHECK(v->IsNumber()); 19007 CHECK(v->IsNumber());
19062 CHECK_EQ(2, static_cast<int>(v->NumberValue())); 19008 CHECK_EQ(2, static_cast<int>(v->NumberValue(context).FromJust()));
19063 } 19009 }
19064 { 19010 {
19065 v8::Isolate::Scope isolate_scope(isolate); 19011 v8::Isolate::Scope isolate_scope(isolate);
19066 v8::HandleScope handle_scope(isolate); 19012 v8::HandleScope handle_scope(isolate);
19067 context = v8::Context::New(isolate); 19013 context = v8::Context::New(isolate);
19068 v8::Context::Scope context_scope(context); 19014 v8::Context::Scope context_scope(context);
19069 Local<Value> v = CompileRun("22"); 19015 Local<Value> v = CompileRun("22");
19070 CHECK(v->IsNumber()); 19016 CHECK(v->IsNumber());
19071 CHECK_EQ(22, static_cast<int>(v->NumberValue())); 19017 CHECK_EQ(22, static_cast<int>(v->NumberValue(context).FromJust()));
19072 } 19018 }
19073 isolate->Dispose(); 19019 isolate->Dispose();
19074 } 19020 }
19075 19021
19076 class InitDefaultIsolateThread : public v8::base::Thread { 19022 class InitDefaultIsolateThread : public v8::base::Thread {
19077 public: 19023 public:
19078 enum TestCase { 19024 enum TestCase {
19079 SetResourceConstraints, 19025 SetResourceConstraints,
19080 SetFatalHandler, 19026 SetFatalHandler,
19081 SetCounterFunction, 19027 SetCounterFunction,
(...skipping 21 matching lines...) Expand all
19103 break; 19049 break;
19104 } 19050 }
19105 v8::Isolate* isolate = v8::Isolate::New(create_params); 19051 v8::Isolate* isolate = v8::Isolate::New(create_params);
19106 isolate->Enter(); 19052 isolate->Enter();
19107 switch (testCase_) { 19053 switch (testCase_) {
19108 case SetResourceConstraints: 19054 case SetResourceConstraints:
19109 // Already handled in pre-Isolate-creation block. 19055 // Already handled in pre-Isolate-creation block.
19110 break; 19056 break;
19111 19057
19112 case SetFatalHandler: 19058 case SetFatalHandler:
19113 v8::V8::SetFatalErrorHandler(NULL); 19059 isolate->SetFatalErrorHandler(NULL);
19114 break; 19060 break;
19115 19061
19116 case SetCounterFunction: 19062 case SetCounterFunction:
19117 CcTest::isolate()->SetCounterFunction(NULL); 19063 CcTest::isolate()->SetCounterFunction(NULL);
19118 break; 19064 break;
19119 19065
19120 case SetCreateHistogramFunction: 19066 case SetCreateHistogramFunction:
19121 CcTest::isolate()->SetCreateHistogramFunction(NULL); 19067 CcTest::isolate()->SetCreateHistogramFunction(NULL);
19122 break; 19068 break;
19123 19069
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
19287 19233
19288 virtual void VisitPersistentHandle(Persistent<Value>* value, 19234 virtual void VisitPersistentHandle(Persistent<Value>* value,
19289 uint16_t class_id) { 19235 uint16_t class_id) {
19290 if (class_id != 42) return; 19236 if (class_id != 42) return;
19291 CHECK_EQ(42, value->WrapperClassId()); 19237 CHECK_EQ(42, value->WrapperClassId());
19292 v8::Isolate* isolate = CcTest::isolate(); 19238 v8::Isolate* isolate = CcTest::isolate();
19293 v8::HandleScope handle_scope(isolate); 19239 v8::HandleScope handle_scope(isolate);
19294 v8::Local<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value); 19240 v8::Local<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value);
19295 v8::Local<v8::Value> object = v8::Local<v8::Object>::New(isolate, *object_); 19241 v8::Local<v8::Value> object = v8::Local<v8::Object>::New(isolate, *object_);
19296 CHECK(handle->IsObject()); 19242 CHECK(handle->IsObject());
19297 CHECK(Local<Object>::Cast(handle)->Equals(object)); 19243 CHECK(Local<Object>::Cast(handle)
19244 ->Equals(isolate->GetCurrentContext(), object)
19245 .FromJust());
19298 ++counter_; 19246 ++counter_;
19299 } 19247 }
19300 19248
19301 int counter_; 19249 int counter_;
19302 v8::Persistent<v8::Object>* object_; 19250 v8::Persistent<v8::Object>* object_;
19303 }; 19251 };
19304 19252
19305 19253
19306 TEST(PersistentHandleVisitor) { 19254 TEST(PersistentHandleVisitor) {
19307 LocalContext context; 19255 LocalContext context;
19308 v8::Isolate* isolate = context->GetIsolate(); 19256 v8::Isolate* isolate = context->GetIsolate();
19309 v8::HandleScope scope(isolate); 19257 v8::HandleScope scope(isolate);
19310 v8::Persistent<v8::Object> object(isolate, v8::Object::New(isolate)); 19258 v8::Persistent<v8::Object> object(isolate, v8::Object::New(isolate));
19311 CHECK_EQ(0, object.WrapperClassId()); 19259 CHECK_EQ(0, object.WrapperClassId());
19312 object.SetWrapperClassId(42); 19260 object.SetWrapperClassId(42);
19313 CHECK_EQ(42, object.WrapperClassId()); 19261 CHECK_EQ(42, object.WrapperClassId());
19314 19262
19315 Visitor42 visitor(&object); 19263 Visitor42 visitor(&object);
19316 v8::V8::VisitHandlesWithClassIds(isolate, &visitor); 19264 isolate->VisitHandlesWithClassIds(&visitor);
19317 CHECK_EQ(1, visitor.counter_); 19265 CHECK_EQ(1, visitor.counter_);
19318 19266
19319 object.Reset(); 19267 object.Reset();
19320 } 19268 }
19321 19269
19322 19270
19323 TEST(WrapperClassId) { 19271 TEST(WrapperClassId) {
19324 LocalContext context; 19272 LocalContext context;
19325 v8::Isolate* isolate = context->GetIsolate(); 19273 v8::Isolate* isolate = context->GetIsolate();
19326 v8::HandleScope scope(isolate); 19274 v8::HandleScope scope(isolate);
(...skipping 16 matching lines...) Expand all
19343 19291
19344 CcTest::heap()->CollectAllGarbage(); 19292 CcTest::heap()->CollectAllGarbage();
19345 CcTest::heap()->CollectAllGarbage(); 19293 CcTest::heap()->CollectAllGarbage();
19346 19294
19347 v8::Persistent<v8::Object> object2(isolate, v8::Object::New(isolate)); 19295 v8::Persistent<v8::Object> object2(isolate, v8::Object::New(isolate));
19348 CHECK_EQ(0, object2.WrapperClassId()); 19296 CHECK_EQ(0, object2.WrapperClassId());
19349 object2.SetWrapperClassId(42); 19297 object2.SetWrapperClassId(42);
19350 CHECK_EQ(42, object2.WrapperClassId()); 19298 CHECK_EQ(42, object2.WrapperClassId());
19351 19299
19352 Visitor42 visitor(&object2); 19300 Visitor42 visitor(&object2);
19353 v8::V8::VisitHandlesForPartialDependence(isolate, &visitor); 19301 isolate->VisitHandlesForPartialDependence(&visitor);
19354 CHECK_EQ(1, visitor.counter_); 19302 CHECK_EQ(1, visitor.counter_);
19355 19303
19356 object1.Reset(); 19304 object1.Reset();
19357 object2.Reset(); 19305 object2.Reset();
19358 } 19306 }
19359 19307
19360 19308
19361 TEST(RegExp) { 19309 TEST(RegExp) {
19362 i::FLAG_harmony_regexps = true; 19310 i::FLAG_harmony_regexps = true;
19363 i::FLAG_harmony_unicode_regexps = true; 19311 i::FLAG_harmony_unicode_regexps = true;
19364 LocalContext context; 19312 LocalContext context;
19365 v8::HandleScope scope(context->GetIsolate()); 19313 v8::HandleScope scope(context->GetIsolate());
19366 19314
19367 v8::Local<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); 19315 v8::Local<v8::RegExp> re =
19316 v8::RegExp::New(context.local(), v8_str("foo"), v8::RegExp::kNone)
19317 .ToLocalChecked();
19368 CHECK(re->IsRegExp()); 19318 CHECK(re->IsRegExp());
19369 CHECK(re->GetSource()->Equals(v8_str("foo"))); 19319 CHECK(re->GetSource()->Equals(context.local(), v8_str("foo")).FromJust());
19370 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); 19320 CHECK_EQ(v8::RegExp::kNone, re->GetFlags());
19371 19321
19372 re = v8::RegExp::New(v8_str("bar"), 19322 re = v8::RegExp::New(context.local(), v8_str("bar"),
19373 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | 19323 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase |
19374 v8::RegExp::kGlobal)); 19324 v8::RegExp::kGlobal))
19325 .ToLocalChecked();
19375 CHECK(re->IsRegExp()); 19326 CHECK(re->IsRegExp());
19376 CHECK(re->GetSource()->Equals(v8_str("bar"))); 19327 CHECK(re->GetSource()->Equals(context.local(), v8_str("bar")).FromJust());
19377 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal, 19328 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal,
19378 static_cast<int>(re->GetFlags())); 19329 static_cast<int>(re->GetFlags()));
19379 19330
19380 re = v8::RegExp::New(v8_str("baz"), 19331 re = v8::RegExp::New(context.local(), v8_str("baz"),
19381 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | 19332 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase |
19382 v8::RegExp::kMultiline)); 19333 v8::RegExp::kMultiline))
19334 .ToLocalChecked();
19383 CHECK(re->IsRegExp()); 19335 CHECK(re->IsRegExp());
19384 CHECK(re->GetSource()->Equals(v8_str("baz"))); 19336 CHECK(re->GetSource()->Equals(context.local(), v8_str("baz")).FromJust());
19385 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, 19337 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline,
19386 static_cast<int>(re->GetFlags())); 19338 static_cast<int>(re->GetFlags()));
19387 19339
19388 re = v8::RegExp::New(v8_str("baz"), 19340 re = v8::RegExp::New(context.local(), v8_str("baz"),
19389 static_cast<v8::RegExp::Flags>(v8::RegExp::kUnicode | 19341 static_cast<v8::RegExp::Flags>(v8::RegExp::kUnicode |
19390 v8::RegExp::kSticky)); 19342 v8::RegExp::kSticky))
19343 .ToLocalChecked();
19391 CHECK(re->IsRegExp()); 19344 CHECK(re->IsRegExp());
19392 CHECK(re->GetSource()->Equals(v8_str("baz"))); 19345 CHECK(re->GetSource()->Equals(context.local(), v8_str("baz")).FromJust());
19393 CHECK_EQ(v8::RegExp::kUnicode | v8::RegExp::kSticky, 19346 CHECK_EQ(v8::RegExp::kUnicode | v8::RegExp::kSticky,
19394 static_cast<int>(re->GetFlags())); 19347 static_cast<int>(re->GetFlags()));
19395 19348
19396 re = CompileRun("/quux/").As<v8::RegExp>(); 19349 re = CompileRun("/quux/").As<v8::RegExp>();
19397 CHECK(re->IsRegExp()); 19350 CHECK(re->IsRegExp());
19398 CHECK(re->GetSource()->Equals(v8_str("quux"))); 19351 CHECK(re->GetSource()->Equals(context.local(), v8_str("quux")).FromJust());
19399 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); 19352 CHECK_EQ(v8::RegExp::kNone, re->GetFlags());
19400 19353
19401 re = CompileRun("/quux/gm").As<v8::RegExp>(); 19354 re = CompileRun("/quux/gm").As<v8::RegExp>();
19402 CHECK(re->IsRegExp()); 19355 CHECK(re->IsRegExp());
19403 CHECK(re->GetSource()->Equals(v8_str("quux"))); 19356 CHECK(re->GetSource()->Equals(context.local(), v8_str("quux")).FromJust());
19404 CHECK_EQ(v8::RegExp::kGlobal | v8::RegExp::kMultiline, 19357 CHECK_EQ(v8::RegExp::kGlobal | v8::RegExp::kMultiline,
19405 static_cast<int>(re->GetFlags())); 19358 static_cast<int>(re->GetFlags()));
19406 19359
19407 // Override the RegExp constructor and check the API constructor 19360 // Override the RegExp constructor and check the API constructor
19408 // still works. 19361 // still works.
19409 CompileRun("RegExp = function() {}"); 19362 CompileRun("RegExp = function() {}");
19410 19363
19411 re = v8::RegExp::New(v8_str("foobar"), v8::RegExp::kNone); 19364 re = v8::RegExp::New(context.local(), v8_str("foobar"), v8::RegExp::kNone)
19365 .ToLocalChecked();
19412 CHECK(re->IsRegExp()); 19366 CHECK(re->IsRegExp());
19413 CHECK(re->GetSource()->Equals(v8_str("foobar"))); 19367 CHECK(re->GetSource()->Equals(context.local(), v8_str("foobar")).FromJust());
19414 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); 19368 CHECK_EQ(v8::RegExp::kNone, re->GetFlags());
19415 19369
19416 re = v8::RegExp::New(v8_str("foobarbaz"), 19370 re = v8::RegExp::New(context.local(), v8_str("foobarbaz"),
19417 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | 19371 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase |
19418 v8::RegExp::kMultiline)); 19372 v8::RegExp::kMultiline))
19373 .ToLocalChecked();
19419 CHECK(re->IsRegExp()); 19374 CHECK(re->IsRegExp());
19420 CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); 19375 CHECK(
19376 re->GetSource()->Equals(context.local(), v8_str("foobarbaz")).FromJust());
19421 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, 19377 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline,
19422 static_cast<int>(re->GetFlags())); 19378 static_cast<int>(re->GetFlags()));
19423 19379
19424 CHECK(context->Global()->Set(context.local(), v8_str("re"), re).FromJust()); 19380 CHECK(context->Global()->Set(context.local(), v8_str("re"), re).FromJust());
19425 ExpectTrue("re.test('FoobarbaZ')"); 19381 ExpectTrue("re.test('FoobarbaZ')");
19426 19382
19427 // RegExps are objects on which you can set properties. 19383 // RegExps are objects on which you can set properties.
19428 re->Set(v8_str("property"), v8::Integer::New(context->GetIsolate(), 32)); 19384 re->Set(context.local(), v8_str("property"),
19385 v8::Integer::New(context->GetIsolate(), 32))
19386 .FromJust();
19429 v8::Local<v8::Value> value(CompileRun("re.property")); 19387 v8::Local<v8::Value> value(CompileRun("re.property"));
19430 CHECK_EQ(32, value->Int32Value(context.local()).FromJust()); 19388 CHECK_EQ(32, value->Int32Value(context.local()).FromJust());
19431 19389
19432 v8::TryCatch try_catch(context->GetIsolate()); 19390 v8::TryCatch try_catch(context->GetIsolate());
19433 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); 19391 CHECK(v8::RegExp::New(context.local(), v8_str("foo["), v8::RegExp::kNone)
19434 CHECK(re.IsEmpty()); 19392 .IsEmpty());
19435 CHECK(try_catch.HasCaught()); 19393 CHECK(try_catch.HasCaught());
19436 CHECK(context->Global() 19394 CHECK(context->Global()
19437 ->Set(context.local(), v8_str("ex"), try_catch.Exception()) 19395 ->Set(context.local(), v8_str("ex"), try_catch.Exception())
19438 .FromJust()); 19396 .FromJust());
19439 ExpectTrue("ex instanceof SyntaxError"); 19397 ExpectTrue("ex instanceof SyntaxError");
19440 } 19398 }
19441 19399
19442 19400
19443 THREADED_TEST(Equals) { 19401 THREADED_TEST(Equals) {
19444 LocalContext localContext; 19402 LocalContext localContext;
19445 v8::HandleScope handleScope(localContext->GetIsolate()); 19403 v8::HandleScope handleScope(localContext->GetIsolate());
19446 19404
19447 v8::Local<v8::Object> globalProxy = localContext->Global(); 19405 v8::Local<v8::Object> globalProxy = localContext->Global();
19448 v8::Local<Value> global = globalProxy->GetPrototype(); 19406 v8::Local<Value> global = globalProxy->GetPrototype();
19449 19407
19450 CHECK(global->StrictEquals(global)); 19408 CHECK(global->StrictEquals(global));
19451 CHECK(!global->StrictEquals(globalProxy)); 19409 CHECK(!global->StrictEquals(globalProxy));
19452 CHECK(!globalProxy->StrictEquals(global)); 19410 CHECK(!globalProxy->StrictEquals(global));
19453 CHECK(globalProxy->StrictEquals(globalProxy)); 19411 CHECK(globalProxy->StrictEquals(globalProxy));
19454 19412
19455 CHECK(global->Equals(global)); 19413 CHECK(global->Equals(localContext.local(), global).FromJust());
19456 CHECK(!global->Equals(globalProxy)); 19414 CHECK(!global->Equals(localContext.local(), globalProxy).FromJust());
19457 CHECK(!globalProxy->Equals(global)); 19415 CHECK(!globalProxy->Equals(localContext.local(), global).FromJust());
19458 CHECK(globalProxy->Equals(globalProxy)); 19416 CHECK(globalProxy->Equals(localContext.local(), globalProxy).FromJust());
19459 } 19417 }
19460 19418
19461 19419
19462 static void Getter(v8::Local<v8::Name> property, 19420 static void Getter(v8::Local<v8::Name> property,
19463 const v8::PropertyCallbackInfo<v8::Value>& info) { 19421 const v8::PropertyCallbackInfo<v8::Value>& info) {
19464 info.GetReturnValue().Set(v8_str("42!")); 19422 info.GetReturnValue().Set(v8_str("42!"));
19465 } 19423 }
19466 19424
19467 19425
19468 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { 19426 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
19469 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate()); 19427 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate());
19470 result->Set(0, v8_str("universalAnswer")); 19428 result->Set(info.GetIsolate()->GetCurrentContext(), 0,
19429 v8_str("universalAnswer"))
19430 .FromJust();
19471 info.GetReturnValue().Set(result); 19431 info.GetReturnValue().Set(result);
19472 } 19432 }
19473 19433
19474 19434
19475 TEST(NamedEnumeratorAndForIn) { 19435 TEST(NamedEnumeratorAndForIn) {
19476 LocalContext context; 19436 LocalContext context;
19477 v8::Isolate* isolate = context->GetIsolate(); 19437 v8::Isolate* isolate = context->GetIsolate();
19478 v8::HandleScope handle_scope(isolate); 19438 v8::HandleScope handle_scope(isolate);
19479 v8::Context::Scope context_scope(context.local()); 19439 v8::Context::Scope context_scope(context.local());
19480 19440
19481 v8::Local<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate); 19441 v8::Local<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate);
19482 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL, 19442 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL,
19483 NULL, Enumerator)); 19443 NULL, Enumerator));
19484 CHECK(context->Global() 19444 CHECK(context->Global()
19485 ->Set(context.local(), v8_str("o"), 19445 ->Set(context.local(), v8_str("o"),
19486 tmpl->NewInstance(context.local()).ToLocalChecked()) 19446 tmpl->NewInstance(context.local()).ToLocalChecked())
19487 .FromJust()); 19447 .FromJust());
19488 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast( 19448 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast(
19489 CompileRun("var result = []; for (var k in o) result.push(k); result")); 19449 CompileRun("var result = []; for (var k in o) result.push(k); result"));
19490 CHECK_EQ(1u, result->Length()); 19450 CHECK_EQ(1u, result->Length());
19491 CHECK(v8_str("universalAnswer")->Equals(result->Get(0))); 19451 CHECK(v8_str("universalAnswer")
19452 ->Equals(context.local(),
19453 result->Get(context.local(), 0).ToLocalChecked())
19454 .FromJust());
19492 } 19455 }
19493 19456
19494 19457
19495 TEST(DefinePropertyPostDetach) { 19458 TEST(DefinePropertyPostDetach) {
19496 LocalContext context; 19459 LocalContext context;
19497 v8::HandleScope scope(context->GetIsolate()); 19460 v8::HandleScope scope(context->GetIsolate());
19498 v8::Local<v8::Object> proxy = context->Global(); 19461 v8::Local<v8::Object> proxy = context->Global();
19499 v8::Local<v8::Function> define_property = 19462 v8::Local<v8::Function> define_property =
19500 CompileRun( 19463 CompileRun(
19501 "(function() {" 19464 "(function() {"
19502 " Object.defineProperty(" 19465 " Object.defineProperty("
19503 " this," 19466 " this,"
19504 " 1," 19467 " 1,"
19505 " { configurable: true, enumerable: true, value: 3 });" 19468 " { configurable: true, enumerable: true, value: 3 });"
19506 "})") 19469 "})")
19507 .As<Function>(); 19470 .As<Function>();
19508 context->DetachGlobal(); 19471 context->DetachGlobal();
19509 define_property->Call(proxy, 0, NULL); 19472 CHECK(define_property->Call(context.local(), proxy, 0, NULL).IsEmpty());
19510 } 19473 }
19511 19474
19512 19475
19513 static void InstallContextId(v8::Local<Context> context, int id) { 19476 static void InstallContextId(v8::Local<Context> context, int id) {
19514 Context::Scope scope(context); 19477 Context::Scope scope(context);
19515 CHECK(CompileRun("Object.prototype") 19478 CHECK(CompileRun("Object.prototype")
19516 .As<Object>() 19479 .As<Object>()
19517 ->Set(context, v8_str("context_id"), 19480 ->Set(context, v8_str("context_id"),
19518 v8::Integer::New(context->GetIsolate(), id)) 19481 v8::Integer::New(context->GetIsolate(), id))
19519 .FromJust()); 19482 .FromJust());
19520 } 19483 }
19521 19484
19522 19485
19523 static void CheckContextId(v8::Local<Object> object, int expected) { 19486 static void CheckContextId(v8::Local<Object> object, int expected) {
19524 CHECK_EQ(expected, object->Get(v8_str("context_id")) 19487 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
19525 ->Int32Value(CcTest::isolate()->GetCurrentContext()) 19488 CHECK_EQ(expected, object->Get(context, v8_str("context_id"))
19489 .ToLocalChecked()
19490 ->Int32Value(context)
19526 .FromJust()); 19491 .FromJust());
19527 } 19492 }
19528 19493
19529 19494
19530 THREADED_TEST(CreationContext) { 19495 THREADED_TEST(CreationContext) {
19531 v8::Isolate* isolate = CcTest::isolate(); 19496 v8::Isolate* isolate = CcTest::isolate();
19532 HandleScope handle_scope(isolate); 19497 HandleScope handle_scope(isolate);
19533 Local<Context> context1 = Context::New(isolate); 19498 Local<Context> context1 = Context::New(isolate);
19534 InstallContextId(context1, 1); 19499 InstallContextId(context1, 1);
19535 Local<Context> context2 = Context::New(isolate); 19500 Local<Context> context2 = Context::New(isolate);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
19635 19600
19636 void HasOwnPropertyIndexedPropertyGetter( 19601 void HasOwnPropertyIndexedPropertyGetter(
19637 uint32_t index, 19602 uint32_t index,
19638 const v8::PropertyCallbackInfo<v8::Value>& info) { 19603 const v8::PropertyCallbackInfo<v8::Value>& info) {
19639 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); 19604 if (index == 42) info.GetReturnValue().Set(v8_str("yes"));
19640 } 19605 }
19641 19606
19642 19607
19643 void HasOwnPropertyNamedPropertyGetter( 19608 void HasOwnPropertyNamedPropertyGetter(
19644 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) { 19609 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {
19645 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(v8_str("yes")); 19610 if (property->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
19611 .FromJust()) {
19612 info.GetReturnValue().Set(v8_str("yes"));
19613 }
19646 } 19614 }
19647 19615
19648 19616
19649 void HasOwnPropertyIndexedPropertyQuery( 19617 void HasOwnPropertyIndexedPropertyQuery(
19650 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) { 19618 uint32_t index, const v8::PropertyCallbackInfo<v8::Integer>& info) {
19651 if (index == 42) info.GetReturnValue().Set(1); 19619 if (index == 42) info.GetReturnValue().Set(1);
19652 } 19620 }
19653 19621
19654 19622
19655 void HasOwnPropertyNamedPropertyQuery( 19623 void HasOwnPropertyNamedPropertyQuery(
19656 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { 19624 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) {
19657 if (property->Equals(v8_str("foo"))) info.GetReturnValue().Set(1); 19625 if (property->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
19626 .FromJust()) {
19627 info.GetReturnValue().Set(1);
19628 }
19658 } 19629 }
19659 19630
19660 19631
19661 void HasOwnPropertyNamedPropertyQuery2( 19632 void HasOwnPropertyNamedPropertyQuery2(
19662 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { 19633 Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) {
19663 if (property->Equals(v8_str("bar"))) info.GetReturnValue().Set(1); 19634 if (property->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("bar"))
19635 .FromJust()) {
19636 info.GetReturnValue().Set(1);
19637 }
19664 } 19638 }
19665 19639
19666 19640
19667 void HasOwnPropertyAccessorGetter( 19641 void HasOwnPropertyAccessorGetter(
19668 Local<String> property, 19642 Local<String> property,
19669 const v8::PropertyCallbackInfo<v8::Value>& info) { 19643 const v8::PropertyCallbackInfo<v8::Value>& info) {
19670 info.GetReturnValue().Set(v8_str("yes")); 19644 info.GetReturnValue().Set(v8_str("yes"));
19671 } 19645 }
19672 19646
19673 19647
19674 TEST(HasOwnProperty) { 19648 TEST(HasOwnProperty) {
19675 LocalContext env; 19649 LocalContext env;
19676 v8::Isolate* isolate = env->GetIsolate(); 19650 v8::Isolate* isolate = env->GetIsolate();
19677 v8::HandleScope scope(isolate); 19651 v8::HandleScope scope(isolate);
19678 { // Check normal properties and defined getters. 19652 { // Check normal properties and defined getters.
19679 Local<Value> value = CompileRun( 19653 Local<Value> value = CompileRun(
19680 "function Foo() {" 19654 "function Foo() {"
19681 " this.foo = 11;" 19655 " this.foo = 11;"
19682 " this.__defineGetter__('baz', function() { return 1; });" 19656 " this.__defineGetter__('baz', function() { return 1; });"
19683 "};" 19657 "};"
19684 "function Bar() { " 19658 "function Bar() { "
19685 " this.bar = 13;" 19659 " this.bar = 13;"
19686 " this.__defineGetter__('bla', function() { return 2; });" 19660 " this.__defineGetter__('bla', function() { return 2; });"
19687 "};" 19661 "};"
19688 "Bar.prototype = new Foo();" 19662 "Bar.prototype = new Foo();"
19689 "new Bar();"); 19663 "new Bar();");
19690 CHECK(value->IsObject()); 19664 CHECK(value->IsObject());
19691 Local<Object> object = value->ToObject(isolate); 19665 Local<Object> object = value->ToObject(env.local()).ToLocalChecked();
19692 CHECK(object->Has(v8_str("foo"))); 19666 CHECK(object->Has(env.local(), v8_str("foo")).FromJust());
19693 CHECK(!object->HasOwnProperty(v8_str("foo"))); 19667 CHECK(!object->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19694 CHECK(object->HasOwnProperty(v8_str("bar"))); 19668 CHECK(object->HasOwnProperty(env.local(), v8_str("bar")).FromJust());
19695 CHECK(object->Has(v8_str("baz"))); 19669 CHECK(object->Has(env.local(), v8_str("baz")).FromJust());
19696 CHECK(!object->HasOwnProperty(v8_str("baz"))); 19670 CHECK(!object->HasOwnProperty(env.local(), v8_str("baz")).FromJust());
19697 CHECK(object->HasOwnProperty(v8_str("bla"))); 19671 CHECK(object->HasOwnProperty(env.local(), v8_str("bla")).FromJust());
19698 } 19672 }
19699 { // Check named getter interceptors. 19673 { // Check named getter interceptors.
19700 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19674 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19701 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19675 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
19702 HasOwnPropertyNamedPropertyGetter)); 19676 HasOwnPropertyNamedPropertyGetter));
19703 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19677 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19704 CHECK(!instance->HasOwnProperty(v8_str("42"))); 19678 CHECK(!instance->HasOwnProperty(env.local(), v8_str("42")).FromJust());
19705 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19679 CHECK(instance->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19706 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19680 CHECK(!instance->HasOwnProperty(env.local(), v8_str("bar")).FromJust());
19707 } 19681 }
19708 { // Check indexed getter interceptors. 19682 { // Check indexed getter interceptors.
19709 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19683 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19710 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19684 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
19711 HasOwnPropertyIndexedPropertyGetter)); 19685 HasOwnPropertyIndexedPropertyGetter));
19712 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19686 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19713 CHECK(instance->HasOwnProperty(v8_str("42"))); 19687 CHECK(instance->HasOwnProperty(env.local(), v8_str("42")).FromJust());
19714 CHECK(!instance->HasOwnProperty(v8_str("43"))); 19688 CHECK(!instance->HasOwnProperty(env.local(), v8_str("43")).FromJust());
19715 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19689 CHECK(!instance->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19716 } 19690 }
19717 { // Check named query interceptors. 19691 { // Check named query interceptors.
19718 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19692 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19719 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19693 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
19720 0, 0, HasOwnPropertyNamedPropertyQuery)); 19694 0, 0, HasOwnPropertyNamedPropertyQuery));
19721 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19695 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19722 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19696 CHECK(instance->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19723 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19697 CHECK(!instance->HasOwnProperty(env.local(), v8_str("bar")).FromJust());
19724 } 19698 }
19725 { // Check indexed query interceptors. 19699 { // Check indexed query interceptors.
19726 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19700 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19727 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19701 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
19728 0, 0, HasOwnPropertyIndexedPropertyQuery)); 19702 0, 0, HasOwnPropertyIndexedPropertyQuery));
19729 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19703 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19730 CHECK(instance->HasOwnProperty(v8_str("42"))); 19704 CHECK(instance->HasOwnProperty(env.local(), v8_str("42")).FromJust());
19731 CHECK(!instance->HasOwnProperty(v8_str("41"))); 19705 CHECK(!instance->HasOwnProperty(env.local(), v8_str("41")).FromJust());
19732 } 19706 }
19733 { // Check callbacks. 19707 { // Check callbacks.
19734 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19708 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19735 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter); 19709 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter);
19736 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19710 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19737 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19711 CHECK(instance->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19738 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19712 CHECK(!instance->HasOwnProperty(env.local(), v8_str("bar")).FromJust());
19739 } 19713 }
19740 { // Check that query wins on disagreement. 19714 { // Check that query wins on disagreement.
19741 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19715 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19742 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19716 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
19743 HasOwnPropertyNamedPropertyGetter, 0, 19717 HasOwnPropertyNamedPropertyGetter, 0,
19744 HasOwnPropertyNamedPropertyQuery2)); 19718 HasOwnPropertyNamedPropertyQuery2));
19745 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); 19719 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
19746 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19720 CHECK(!instance->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
19747 CHECK(instance->HasOwnProperty(v8_str("bar"))); 19721 CHECK(instance->HasOwnProperty(env.local(), v8_str("bar")).FromJust());
19748 } 19722 }
19749 } 19723 }
19750 19724
19751 19725
19752 TEST(IndexedInterceptorWithStringProto) { 19726 TEST(IndexedInterceptorWithStringProto) {
19753 v8::Isolate* isolate = CcTest::isolate(); 19727 v8::Isolate* isolate = CcTest::isolate();
19754 v8::HandleScope scope(isolate); 19728 v8::HandleScope scope(isolate);
19755 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19729 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19756 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19730 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
19757 NULL, NULL, HasOwnPropertyIndexedPropertyQuery)); 19731 NULL, NULL, HasOwnPropertyIndexedPropertyQuery));
19758 LocalContext context; 19732 LocalContext context;
19759 CHECK(context->Global() 19733 CHECK(context->Global()
19760 ->Set(context.local(), v8_str("obj"), 19734 ->Set(context.local(), v8_str("obj"),
19761 templ->NewInstance(context.local()).ToLocalChecked()) 19735 templ->NewInstance(context.local()).ToLocalChecked())
19762 .FromJust()); 19736 .FromJust());
19763 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); 19737 CompileRun("var s = new String('foobar'); obj.__proto__ = s;");
19764 // These should be intercepted. 19738 // These should be intercepted.
19765 CHECK(CompileRun("42 in obj")->BooleanValue()); 19739 CHECK(CompileRun("42 in obj")->BooleanValue(context.local()).FromJust());
19766 CHECK(CompileRun("'42' in obj")->BooleanValue()); 19740 CHECK(CompileRun("'42' in obj")->BooleanValue(context.local()).FromJust());
19767 // These should fall through to the String prototype. 19741 // These should fall through to the String prototype.
19768 CHECK(CompileRun("0 in obj")->BooleanValue()); 19742 CHECK(CompileRun("0 in obj")->BooleanValue(context.local()).FromJust());
19769 CHECK(CompileRun("'0' in obj")->BooleanValue()); 19743 CHECK(CompileRun("'0' in obj")->BooleanValue(context.local()).FromJust());
19770 // And these should both fail. 19744 // And these should both fail.
19771 CHECK(!CompileRun("32 in obj")->BooleanValue()); 19745 CHECK(!CompileRun("32 in obj")->BooleanValue(context.local()).FromJust());
19772 CHECK(!CompileRun("'32' in obj")->BooleanValue()); 19746 CHECK(!CompileRun("'32' in obj")->BooleanValue(context.local()).FromJust());
19773 } 19747 }
19774 19748
19775 19749
19776 void CheckCodeGenerationAllowed() { 19750 void CheckCodeGenerationAllowed() {
19777 Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); 19751 Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
19778 Local<Value> result = CompileRun("eval('42')"); 19752 Local<Value> result = CompileRun("eval('42')");
19779 CHECK_EQ(42, result->Int32Value(context).FromJust()); 19753 CHECK_EQ(42, result->Int32Value(context).FromJust());
19780 result = CompileRun("(function(e) { return e('42'); })(eval)"); 19754 result = CompileRun("(function(e) { return e('42'); })(eval)");
19781 CHECK_EQ(42, result->Int32Value(context).FromJust()); 19755 CHECK_EQ(42, result->Int32Value(context).FromJust());
19782 result = CompileRun("var f = new Function('return 42'); f()"); 19756 result = CompileRun("var f = new Function('return 42'); f()");
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
19827 context->AllowCodeGenerationFromStrings(false); 19801 context->AllowCodeGenerationFromStrings(false);
19828 CHECK(!context->IsCodeGenerationFromStringsAllowed()); 19802 CHECK(!context->IsCodeGenerationFromStringsAllowed());
19829 CheckCodeGenerationDisallowed(); 19803 CheckCodeGenerationDisallowed();
19830 19804
19831 // Allow again. 19805 // Allow again.
19832 context->AllowCodeGenerationFromStrings(true); 19806 context->AllowCodeGenerationFromStrings(true);
19833 CheckCodeGenerationAllowed(); 19807 CheckCodeGenerationAllowed();
19834 19808
19835 // Disallow but setting a global callback that will allow the calls. 19809 // Disallow but setting a global callback that will allow the calls.
19836 context->AllowCodeGenerationFromStrings(false); 19810 context->AllowCodeGenerationFromStrings(false);
19837 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationAllowed); 19811 context->GetIsolate()->SetAllowCodeGenerationFromStringsCallback(
19812 &CodeGenerationAllowed);
19838 CHECK(!context->IsCodeGenerationFromStringsAllowed()); 19813 CHECK(!context->IsCodeGenerationFromStringsAllowed());
19839 CheckCodeGenerationAllowed(); 19814 CheckCodeGenerationAllowed();
19840 19815
19841 // Set a callback that disallows the code generation. 19816 // Set a callback that disallows the code generation.
19842 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); 19817 context->GetIsolate()->SetAllowCodeGenerationFromStringsCallback(
19818 &CodeGenerationDisallowed);
19843 CHECK(!context->IsCodeGenerationFromStringsAllowed()); 19819 CHECK(!context->IsCodeGenerationFromStringsAllowed());
19844 CheckCodeGenerationDisallowed(); 19820 CheckCodeGenerationDisallowed();
19845 } 19821 }
19846 19822
19847 19823
19848 TEST(SetErrorMessageForCodeGenFromStrings) { 19824 TEST(SetErrorMessageForCodeGenFromStrings) {
19849 LocalContext context; 19825 LocalContext context;
19850 v8::HandleScope scope(context->GetIsolate()); 19826 v8::HandleScope scope(context->GetIsolate());
19851 TryCatch try_catch(context->GetIsolate()); 19827 TryCatch try_catch(context->GetIsolate());
19852 19828
19853 Local<String> message = v8_str("Message"); 19829 Local<String> message = v8_str("Message");
19854 Local<String> expected_message = v8_str("Uncaught EvalError: Message"); 19830 Local<String> expected_message = v8_str("Uncaught EvalError: Message");
19855 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); 19831 context->GetIsolate()->SetAllowCodeGenerationFromStringsCallback(
19832 &CodeGenerationDisallowed);
19856 context->AllowCodeGenerationFromStrings(false); 19833 context->AllowCodeGenerationFromStrings(false);
19857 context->SetErrorMessageForCodeGenerationFromStrings(message); 19834 context->SetErrorMessageForCodeGenerationFromStrings(message);
19858 Local<Value> result = CompileRun("eval('42')"); 19835 Local<Value> result = CompileRun("eval('42')");
19859 CHECK(result.IsEmpty()); 19836 CHECK(result.IsEmpty());
19860 CHECK(try_catch.HasCaught()); 19837 CHECK(try_catch.HasCaught());
19861 Local<String> actual_message = try_catch.Message()->Get(); 19838 Local<String> actual_message = try_catch.Message()->Get();
19862 CHECK(expected_message->Equals(actual_message)); 19839 CHECK(expected_message->Equals(context.local(), actual_message).FromJust());
19863 } 19840 }
19864 19841
19865 19842
19866 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { 19843 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) {
19867 } 19844 }
19868 19845
19869 19846
19870 THREADED_TEST(CallAPIFunctionOnNonObject) { 19847 THREADED_TEST(CallAPIFunctionOnNonObject) {
19871 LocalContext context; 19848 LocalContext context;
19872 v8::Isolate* isolate = context->GetIsolate(); 19849 v8::Isolate* isolate = context->GetIsolate();
(...skipping 12 matching lines...) Expand all
19885 19862
19886 // Regression test for issue 1470. 19863 // Regression test for issue 1470.
19887 THREADED_TEST(ReadOnlyIndexedProperties) { 19864 THREADED_TEST(ReadOnlyIndexedProperties) {
19888 v8::Isolate* isolate = CcTest::isolate(); 19865 v8::Isolate* isolate = CcTest::isolate();
19889 v8::HandleScope scope(isolate); 19866 v8::HandleScope scope(isolate);
19890 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19867 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19891 19868
19892 LocalContext context; 19869 LocalContext context;
19893 Local<v8::Object> obj = templ->NewInstance(context.local()).ToLocalChecked(); 19870 Local<v8::Object> obj = templ->NewInstance(context.local()).ToLocalChecked();
19894 CHECK(context->Global()->Set(context.local(), v8_str("obj"), obj).FromJust()); 19871 CHECK(context->Global()->Set(context.local(), v8_str("obj"), obj).FromJust());
19895 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); 19872 obj->DefineOwnProperty(context.local(), v8_str("1"), v8_str("DONT_CHANGE"),
19896 obj->Set(v8_str("1"), v8_str("foobar")); 19873 v8::ReadOnly)
19897 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("1")))); 19874 .FromJust();
19898 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); 19875 obj->Set(context.local(), v8_str("1"), v8_str("foobar")).FromJust();
19899 obj->Set(v8_num(2), v8_str("foobar")); 19876 CHECK(v8_str("DONT_CHANGE")
19900 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_num(2)))); 19877 ->Equals(context.local(),
19878 obj->Get(context.local(), v8_str("1")).ToLocalChecked())
19879 .FromJust());
19880 obj->DefineOwnProperty(context.local(), v8_str("2"), v8_str("DONT_CHANGE"),
19881 v8::ReadOnly)
19882 .FromJust();
19883 obj->Set(context.local(), v8_num(2), v8_str("foobar")).FromJust();
19884 CHECK(v8_str("DONT_CHANGE")
19885 ->Equals(context.local(),
19886 obj->Get(context.local(), v8_num(2)).ToLocalChecked())
19887 .FromJust());
19901 19888
19902 // Test non-smi case. 19889 // Test non-smi case.
19903 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); 19890 obj->DefineOwnProperty(context.local(), v8_str("2000000000"),
19904 obj->Set(v8_str("2000000000"), v8_str("foobar")); 19891 v8_str("DONT_CHANGE"), v8::ReadOnly)
19905 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("2000000000")))); 19892 .FromJust();
19893 obj->Set(context.local(), v8_str("2000000000"), v8_str("foobar")).FromJust();
19894 CHECK(v8_str("DONT_CHANGE")
19895 ->Equals(context.local(),
19896 obj->Get(context.local(), v8_str("2000000000"))
19897 .ToLocalChecked())
19898 .FromJust());
19906 } 19899 }
19907 19900
19908 19901
19909 static int CountLiveMapsInMapCache(i::Context* context) { 19902 static int CountLiveMapsInMapCache(i::Context* context) {
19910 i::FixedArray* map_cache = i::FixedArray::cast(context->map_cache()); 19903 i::FixedArray* map_cache = i::FixedArray::cast(context->map_cache());
19911 int length = map_cache->length(); 19904 int length = map_cache->length();
19912 int count = 0; 19905 int count = 0;
19913 for (int i = 0; i < length; i++) { 19906 for (int i = 0; i < length; i++) {
19914 i::Object* value = map_cache->get(i); 19907 i::Object* value = map_cache->get(i);
19915 if (value->IsWeakCell() && !i::WeakCell::cast(value)->cleared()) count++; 19908 if (value->IsWeakCell() && !i::WeakCell::cast(value)->cleared()) count++;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
19970 Local<Object> simple_object = Object::New(isolate); 19963 Local<Object> simple_object = Object::New(isolate);
19971 19964
19972 // Object with explicit security check. 19965 // Object with explicit security check.
19973 Local<Object> protected_object = 19966 Local<Object> protected_object =
19974 no_proto_template->NewInstance(context).ToLocalChecked(); 19967 no_proto_template->NewInstance(context).ToLocalChecked();
19975 19968
19976 // JSGlobalProxy object, always have security check. 19969 // JSGlobalProxy object, always have security check.
19977 Local<Object> proxy_object = context->Global(); 19970 Local<Object> proxy_object = context->Global();
19978 19971
19979 // Global object, the prototype of proxy_object. No security checks. 19972 // Global object, the prototype of proxy_object. No security checks.
19980 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); 19973 Local<Object> global_object =
19974 proxy_object->GetPrototype()->ToObject(context).ToLocalChecked();
19981 19975
19982 // Hidden prototype without security check. 19976 // Hidden prototype without security check.
19983 Local<Object> hidden_prototype = hidden_proto_template->GetFunction(context) 19977 Local<Object> hidden_prototype = hidden_proto_template->GetFunction(context)
19984 .ToLocalChecked() 19978 .ToLocalChecked()
19985 ->NewInstance(context) 19979 ->NewInstance(context)
19986 .ToLocalChecked(); 19980 .ToLocalChecked();
19987 Local<Object> object_with_hidden = 19981 Local<Object> object_with_hidden =
19988 Object::New(isolate); 19982 Object::New(isolate);
19989 object_with_hidden->SetPrototype(hidden_prototype); 19983 object_with_hidden->SetPrototype(context, hidden_prototype).FromJust();
19990 19984
19991 context->Exit(); 19985 context->Exit();
19992 19986
19993 // Template for object for second context. Values to test are put on it as 19987 // Template for object for second context. Values to test are put on it as
19994 // properties. 19988 // properties.
19995 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); 19989 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
19996 global_template->Set(v8_str("simple"), simple_object); 19990 global_template->Set(v8_str("simple"), simple_object);
19997 global_template->Set(v8_str("protected"), protected_object); 19991 global_template->Set(v8_str("protected"), protected_object);
19998 global_template->Set(v8_str("global"), global_object); 19992 global_template->Set(v8_str("global"), global_object);
19999 global_template->Set(v8_str("proxy"), proxy_object); 19993 global_template->Set(v8_str("proxy"), proxy_object);
20000 global_template->Set(v8_str("hidden"), object_with_hidden); 19994 global_template->Set(v8_str("hidden"), object_with_hidden);
20001 19995
20002 LocalContext context2(NULL, global_template); 19996 LocalContext context2(NULL, global_template);
20003 19997
20004 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)"); 19998 Local<Value> result1 = CompileRun("Object.getPrototypeOf(simple)");
20005 CHECK(result1->Equals(simple_object->GetPrototype())); 19999 CHECK(result1->Equals(context2.local(), simple_object->GetPrototype())
20000 .FromJust());
20006 20001
20007 Local<Value> result2 = CompileRun("Object.getPrototypeOf(protected)"); 20002 Local<Value> result2 = CompileRun("Object.getPrototypeOf(protected)");
20008 CHECK(result2->IsNull()); 20003 CHECK(result2->IsNull());
20009 20004
20010 Local<Value> result3 = CompileRun("Object.getPrototypeOf(global)"); 20005 Local<Value> result3 = CompileRun("Object.getPrototypeOf(global)");
20011 CHECK(result3->Equals(global_object->GetPrototype())); 20006 CHECK(result3->Equals(context2.local(), global_object->GetPrototype())
20007 .FromJust());
20012 20008
20013 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); 20009 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)");
20014 CHECK(result4->IsNull()); 20010 CHECK(result4->IsNull());
20015 20011
20016 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); 20012 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)");
20017 CHECK(result5->Equals( 20013 CHECK(result5->Equals(context2.local(), object_with_hidden->GetPrototype()
20018 object_with_hidden->GetPrototype()->ToObject(isolate)->GetPrototype())); 20014 ->ToObject(context2.local())
20015 .ToLocalChecked()
20016 ->GetPrototype())
20017 .FromJust());
20019 } 20018 }
20020 20019
20021 20020
20022 static void TestReceiver(Local<Value> expected_result, 20021 static void TestReceiver(Local<Value> expected_result,
20023 Local<Value> expected_receiver, 20022 Local<Value> expected_receiver,
20024 const char* code) { 20023 const char* code) {
20025 Local<Value> result = CompileRun(code); 20024 Local<Value> result = CompileRun(code);
20025 Local<Context> context = CcTest::isolate()->GetCurrentContext();
20026 CHECK(result->IsObject()); 20026 CHECK(result->IsObject());
20027 CHECK(expected_receiver->Equals(result.As<v8::Object>()->Get(1))); 20027 CHECK(expected_receiver
20028 CHECK(expected_result->Equals(result.As<v8::Object>()->Get(0))); 20028 ->Equals(context,
20029 result.As<v8::Object>()->Get(context, 1).ToLocalChecked())
20030 .FromJust());
20031 CHECK(expected_result
20032 ->Equals(context,
20033 result.As<v8::Object>()->Get(context, 0).ToLocalChecked())
20034 .FromJust());
20029 } 20035 }
20030 20036
20031 20037
20032 THREADED_TEST(ForeignFunctionReceiver) { 20038 THREADED_TEST(ForeignFunctionReceiver) {
20033 v8::Isolate* isolate = CcTest::isolate(); 20039 v8::Isolate* isolate = CcTest::isolate();
20034 HandleScope scope(isolate); 20040 HandleScope scope(isolate);
20035 20041
20036 // Create two contexts with different "id" properties ('i' and 'o'). 20042 // Create two contexts with different "id" properties ('i' and 'o').
20037 // Call a function both from its own context and from a the foreign 20043 // Call a function both from its own context and from a the foreign
20038 // context, and see what "this" is bound to (returning both "this" 20044 // context, and see what "this" is bound to (returning both "this"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
20072 " }" 20078 " }"
20073 " };" 20079 " };"
20074 "}" 20080 "}"
20075 "var id = 'o';" 20081 "var id = 'o';"
20076 "ownfunc"); 20082 "ownfunc");
20077 CHECK(context->Global() 20083 CHECK(context->Global()
20078 ->Set(context.local(), v8_str("func"), foreign_function) 20084 ->Set(context.local(), v8_str("func"), foreign_function)
20079 .FromJust()); 20085 .FromJust());
20080 20086
20081 // Sanity check the contexts. 20087 // Sanity check the contexts.
20082 CHECK(i->Equals(foreign_context->Global()->Get(id))); 20088 CHECK(
20083 CHECK(o->Equals(context->Global()->Get(id))); 20089 i->Equals(
20090 context.local(),
20091 foreign_context->Global()->Get(context.local(), id).ToLocalChecked())
20092 .FromJust());
20093 CHECK(o->Equals(context.local(),
20094 context->Global()->Get(context.local(), id).ToLocalChecked())
20095 .FromJust());
20084 20096
20085 // Checking local function's receiver. 20097 // Checking local function's receiver.
20086 // Calling function using its call/apply methods. 20098 // Calling function using its call/apply methods.
20087 TestReceiver(o, context->Global(), "ownfunc.call()"); 20099 TestReceiver(o, context->Global(), "ownfunc.call()");
20088 TestReceiver(o, context->Global(), "ownfunc.apply()"); 20100 TestReceiver(o, context->Global(), "ownfunc.apply()");
20089 // Making calls through built-in functions. 20101 // Making calls through built-in functions.
20090 TestReceiver(o, context->Global(), "[1].map(ownfunc)[0]"); 20102 TestReceiver(o, context->Global(), "[1].map(ownfunc)[0]");
20091 CHECK(o->Equals(CompileRun("'abcbd'.replace(/b/,ownfunc)[1]"))); 20103 CHECK(
20092 CHECK(o->Equals(CompileRun("'abcbd'.replace(/b/g,ownfunc)[1]"))); 20104 o->Equals(context.local(), CompileRun("'abcbd'.replace(/b/,ownfunc)[1]"))
20093 CHECK(o->Equals(CompileRun("'abcbd'.replace(/b/g,ownfunc)[3]"))); 20105 .FromJust());
20106 CHECK(
20107 o->Equals(context.local(), CompileRun("'abcbd'.replace(/b/g,ownfunc)[1]"))
20108 .FromJust());
20109 CHECK(
20110 o->Equals(context.local(), CompileRun("'abcbd'.replace(/b/g,ownfunc)[3]"))
20111 .FromJust());
20094 // Calling with environment record as base. 20112 // Calling with environment record as base.
20095 TestReceiver(o, context->Global(), "ownfunc()"); 20113 TestReceiver(o, context->Global(), "ownfunc()");
20096 // Calling with no base. 20114 // Calling with no base.
20097 TestReceiver(o, context->Global(), "(1,ownfunc)()"); 20115 TestReceiver(o, context->Global(), "(1,ownfunc)()");
20098 20116
20099 // Checking foreign function return value. 20117 // Checking foreign function return value.
20100 // Calling function using its call/apply methods. 20118 // Calling function using its call/apply methods.
20101 TestReceiver(i, foreign_context->Global(), "func.call()"); 20119 TestReceiver(i, foreign_context->Global(), "func.call()");
20102 TestReceiver(i, foreign_context->Global(), "func.apply()"); 20120 TestReceiver(i, foreign_context->Global(), "func.apply()");
20103 // Calling function using another context's call/apply methods. 20121 // Calling function using another context's call/apply methods.
20104 TestReceiver(i, foreign_context->Global(), 20122 TestReceiver(i, foreign_context->Global(),
20105 "Function.prototype.call.call(func)"); 20123 "Function.prototype.call.call(func)");
20106 TestReceiver(i, foreign_context->Global(), 20124 TestReceiver(i, foreign_context->Global(),
20107 "Function.prototype.call.apply(func)"); 20125 "Function.prototype.call.apply(func)");
20108 TestReceiver(i, foreign_context->Global(), 20126 TestReceiver(i, foreign_context->Global(),
20109 "Function.prototype.apply.call(func)"); 20127 "Function.prototype.apply.call(func)");
20110 TestReceiver(i, foreign_context->Global(), 20128 TestReceiver(i, foreign_context->Global(),
20111 "Function.prototype.apply.apply(func)"); 20129 "Function.prototype.apply.apply(func)");
20112 // Making calls through built-in functions. 20130 // Making calls through built-in functions.
20113 TestReceiver(i, foreign_context->Global(), "[1].map(func)[0]"); 20131 TestReceiver(i, foreign_context->Global(), "[1].map(func)[0]");
20114 // ToString(func()) is func()[0], i.e., the returned this.id. 20132 // ToString(func()) is func()[0], i.e., the returned this.id.
20115 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/,func)[1]"))); 20133 CHECK(i->Equals(context.local(), CompileRun("'abcbd'.replace(/b/,func)[1]"))
20116 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[1]"))); 20134 .FromJust());
20117 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[3]"))); 20135 CHECK(i->Equals(context.local(), CompileRun("'abcbd'.replace(/b/g,func)[1]"))
20136 .FromJust());
20137 CHECK(i->Equals(context.local(), CompileRun("'abcbd'.replace(/b/g,func)[3]"))
20138 .FromJust());
20118 20139
20119 // Calling with environment record as base. 20140 // Calling with environment record as base.
20120 TestReceiver(i, foreign_context->Global(), "func()"); 20141 TestReceiver(i, foreign_context->Global(), "func()");
20121 // Calling with no base. 20142 // Calling with no base.
20122 TestReceiver(i, foreign_context->Global(), "(1,func)()"); 20143 TestReceiver(i, foreign_context->Global(), "(1,func)()");
20123 } 20144 }
20124 20145
20125 20146
20126 uint8_t callback_fired = 0; 20147 uint8_t callback_fired = 0;
20127 20148
(...skipping 27 matching lines...) Expand all
20155 CHECK_EQ(0, callback_fired); 20176 CHECK_EQ(0, callback_fired);
20156 } 20177 }
20157 } 20178 }
20158 20179
20159 20180
20160 TEST(CallCompletedCallback) { 20181 TEST(CallCompletedCallback) {
20161 LocalContext env; 20182 LocalContext env;
20162 v8::HandleScope scope(env->GetIsolate()); 20183 v8::HandleScope scope(env->GetIsolate());
20163 v8::Local<v8::FunctionTemplate> recursive_runtime = 20184 v8::Local<v8::FunctionTemplate> recursive_runtime =
20164 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); 20185 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall);
20165 env->Global()->Set( 20186 env->Global()
20166 v8_str("recursion"), 20187 ->Set(env.local(), v8_str("recursion"),
20167 recursive_runtime->GetFunction(env.local()).ToLocalChecked()); 20188 recursive_runtime->GetFunction(env.local()).ToLocalChecked())
20189 .FromJust();
20168 // Adding the same callback a second time has no effect. 20190 // Adding the same callback a second time has no effect.
20169 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); 20191 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
20170 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); 20192 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
20171 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); 20193 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2);
20172 v8::base::OS::Print("--- Script (1) ---\n"); 20194 v8::base::OS::Print("--- Script (1) ---\n");
20173 Local<Script> script = v8::Script::Compile(v8_str("recursion(0)")); 20195 Local<Script> script =
20174 script->Run(); 20196 v8::Script::Compile(env.local(), v8_str("recursion(0)")).ToLocalChecked();
20197 script->Run(env.local()).ToLocalChecked();
20175 CHECK_EQ(3, callback_fired); 20198 CHECK_EQ(3, callback_fired);
20176 20199
20177 v8::base::OS::Print("\n--- Script (2) ---\n"); 20200 v8::base::OS::Print("\n--- Script (2) ---\n");
20178 callback_fired = 0; 20201 callback_fired = 0;
20179 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); 20202 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1);
20180 script->Run(); 20203 script->Run(env.local()).ToLocalChecked();
20181 CHECK_EQ(2, callback_fired); 20204 CHECK_EQ(2, callback_fired);
20182 20205
20183 v8::base::OS::Print("\n--- Function ---\n"); 20206 v8::base::OS::Print("\n--- Function ---\n");
20184 callback_fired = 0; 20207 callback_fired = 0;
20185 Local<Function> recursive_function = 20208 Local<Function> recursive_function = Local<Function>::Cast(
20186 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); 20209 env->Global()->Get(env.local(), v8_str("recursion")).ToLocalChecked());
20187 v8::Local<Value> args[] = {v8_num(0)}; 20210 v8::Local<Value> args[] = {v8_num(0)};
20188 recursive_function->Call(env->Global(), 1, args); 20211 recursive_function->Call(env.local(), env->Global(), 1, args)
20212 .ToLocalChecked();
20189 CHECK_EQ(2, callback_fired); 20213 CHECK_EQ(2, callback_fired);
20190 } 20214 }
20191 20215
20192 20216
20193 void CallCompletedCallbackNoException() { 20217 void CallCompletedCallbackNoException() {
20194 v8::HandleScope scope(CcTest::isolate()); 20218 v8::HandleScope scope(CcTest::isolate());
20195 CompileRun("1+1;"); 20219 CompileRun("1+1;");
20196 } 20220 }
20197 20221
20198 20222
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
20242 LocalContext env; 20266 LocalContext env;
20243 v8::HandleScope scope(env->GetIsolate()); 20267 v8::HandleScope scope(env->GetIsolate());
20244 CompileRun( 20268 CompileRun(
20245 "var ext1Calls = 0;" 20269 "var ext1Calls = 0;"
20246 "var ext2Calls = 0;"); 20270 "var ext2Calls = 0;");
20247 CompileRun("1+1;"); 20271 CompileRun("1+1;");
20248 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20272 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20249 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20273 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20250 20274
20251 env->GetIsolate()->EnqueueMicrotask( 20275 env->GetIsolate()->EnqueueMicrotask(
20252 Function::New(env->GetIsolate(), MicrotaskOne)); 20276 Function::New(env.local(), MicrotaskOne).ToLocalChecked());
20253 CompileRun("1+1;"); 20277 CompileRun("1+1;");
20254 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20278 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20255 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20279 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20256 20280
20257 env->GetIsolate()->EnqueueMicrotask( 20281 env->GetIsolate()->EnqueueMicrotask(
20258 Function::New(env->GetIsolate(), MicrotaskOne)); 20282 Function::New(env.local(), MicrotaskOne).ToLocalChecked());
20259 env->GetIsolate()->EnqueueMicrotask( 20283 env->GetIsolate()->EnqueueMicrotask(
20260 Function::New(env->GetIsolate(), MicrotaskTwo)); 20284 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20261 CompileRun("1+1;"); 20285 CompileRun("1+1;");
20262 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20286 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20263 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20287 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20264 20288
20265 env->GetIsolate()->EnqueueMicrotask( 20289 env->GetIsolate()->EnqueueMicrotask(
20266 Function::New(env->GetIsolate(), MicrotaskTwo)); 20290 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20267 CompileRun("1+1;"); 20291 CompileRun("1+1;");
20268 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20292 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20269 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20293 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20270 20294
20271 CompileRun("1+1;"); 20295 CompileRun("1+1;");
20272 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20296 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20273 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20297 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20274 20298
20275 g_passed_to_three = NULL; 20299 g_passed_to_three = NULL;
20276 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree); 20300 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree);
20277 CompileRun("1+1;"); 20301 CompileRun("1+1;");
20278 CHECK(!g_passed_to_three); 20302 CHECK(!g_passed_to_three);
20279 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20303 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20280 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20304 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20281 20305
20282 int dummy; 20306 int dummy;
20283 env->GetIsolate()->EnqueueMicrotask( 20307 env->GetIsolate()->EnqueueMicrotask(
20284 Function::New(env->GetIsolate(), MicrotaskOne)); 20308 Function::New(env.local(), MicrotaskOne).ToLocalChecked());
20285 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy); 20309 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy);
20286 env->GetIsolate()->EnqueueMicrotask( 20310 env->GetIsolate()->EnqueueMicrotask(
20287 Function::New(env->GetIsolate(), MicrotaskTwo)); 20311 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20288 CompileRun("1+1;"); 20312 CompileRun("1+1;");
20289 CHECK_EQ(&dummy, g_passed_to_three); 20313 CHECK_EQ(&dummy, g_passed_to_three);
20290 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20314 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20291 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20315 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20292 g_passed_to_three = NULL; 20316 g_passed_to_three = NULL;
20293 } 20317 }
20294 20318
20295 20319
20296 static void MicrotaskExceptionOne( 20320 static void MicrotaskExceptionOne(
20297 const v8::FunctionCallbackInfo<Value>& info) { 20321 const v8::FunctionCallbackInfo<Value>& info) {
(...skipping 14 matching lines...) Expand all
20312 20336
20313 20337
20314 TEST(RunMicrotasksIgnoresThrownExceptions) { 20338 TEST(RunMicrotasksIgnoresThrownExceptions) {
20315 LocalContext env; 20339 LocalContext env;
20316 v8::Isolate* isolate = env->GetIsolate(); 20340 v8::Isolate* isolate = env->GetIsolate();
20317 v8::HandleScope scope(isolate); 20341 v8::HandleScope scope(isolate);
20318 CompileRun( 20342 CompileRun(
20319 "var exception1Calls = 0;" 20343 "var exception1Calls = 0;"
20320 "var exception2Calls = 0;"); 20344 "var exception2Calls = 0;");
20321 isolate->EnqueueMicrotask( 20345 isolate->EnqueueMicrotask(
20322 Function::New(isolate, MicrotaskExceptionOne)); 20346 Function::New(env.local(), MicrotaskExceptionOne).ToLocalChecked());
20323 isolate->EnqueueMicrotask( 20347 isolate->EnqueueMicrotask(
20324 Function::New(isolate, MicrotaskExceptionTwo)); 20348 Function::New(env.local(), MicrotaskExceptionTwo).ToLocalChecked());
20325 TryCatch try_catch(isolate); 20349 TryCatch try_catch(isolate);
20326 CompileRun("1+1;"); 20350 CompileRun("1+1;");
20327 CHECK(!try_catch.HasCaught()); 20351 CHECK(!try_catch.HasCaught());
20328 CHECK_EQ(1, 20352 CHECK_EQ(1,
20329 CompileRun("exception1Calls")->Int32Value(env.local()).FromJust()); 20353 CompileRun("exception1Calls")->Int32Value(env.local()).FromJust());
20330 CHECK_EQ(1, 20354 CHECK_EQ(1,
20331 CompileRun("exception2Calls")->Int32Value(env.local()).FromJust()); 20355 CompileRun("exception2Calls")->Int32Value(env.local()).FromJust());
20332 } 20356 }
20333 20357
20334 20358
20335 TEST(SetAutorunMicrotasks) { 20359 TEST(SetAutorunMicrotasks) {
20336 LocalContext env; 20360 LocalContext env;
20337 v8::HandleScope scope(env->GetIsolate()); 20361 v8::HandleScope scope(env->GetIsolate());
20338 CompileRun( 20362 CompileRun(
20339 "var ext1Calls = 0;" 20363 "var ext1Calls = 0;"
20340 "var ext2Calls = 0;"); 20364 "var ext2Calls = 0;");
20341 CompileRun("1+1;"); 20365 CompileRun("1+1;");
20342 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20366 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20343 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20367 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20344 20368
20345 env->GetIsolate()->EnqueueMicrotask( 20369 env->GetIsolate()->EnqueueMicrotask(
20346 Function::New(env->GetIsolate(), MicrotaskOne)); 20370 Function::New(env.local(), MicrotaskOne).ToLocalChecked());
20347 CompileRun("1+1;"); 20371 CompileRun("1+1;");
20348 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20372 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20349 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20373 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20350 20374
20351 env->GetIsolate()->SetAutorunMicrotasks(false); 20375 env->GetIsolate()->SetAutorunMicrotasks(false);
20352 env->GetIsolate()->EnqueueMicrotask( 20376 env->GetIsolate()->EnqueueMicrotask(
20353 Function::New(env->GetIsolate(), MicrotaskOne)); 20377 Function::New(env.local(), MicrotaskOne).ToLocalChecked());
20354 env->GetIsolate()->EnqueueMicrotask( 20378 env->GetIsolate()->EnqueueMicrotask(
20355 Function::New(env->GetIsolate(), MicrotaskTwo)); 20379 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20356 CompileRun("1+1;"); 20380 CompileRun("1+1;");
20357 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20381 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20358 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20382 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20359 20383
20360 env->GetIsolate()->RunMicrotasks(); 20384 env->GetIsolate()->RunMicrotasks();
20361 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20385 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20362 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20386 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20363 20387
20364 env->GetIsolate()->EnqueueMicrotask( 20388 env->GetIsolate()->EnqueueMicrotask(
20365 Function::New(env->GetIsolate(), MicrotaskTwo)); 20389 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20366 CompileRun("1+1;"); 20390 CompileRun("1+1;");
20367 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20391 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20368 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20392 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20369 20393
20370 env->GetIsolate()->RunMicrotasks(); 20394 env->GetIsolate()->RunMicrotasks();
20371 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20395 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20372 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20396 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20373 20397
20374 env->GetIsolate()->SetAutorunMicrotasks(true); 20398 env->GetIsolate()->SetAutorunMicrotasks(true);
20375 env->GetIsolate()->EnqueueMicrotask( 20399 env->GetIsolate()->EnqueueMicrotask(
20376 Function::New(env->GetIsolate(), MicrotaskTwo)); 20400 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20377 CompileRun("1+1;"); 20401 CompileRun("1+1;");
20378 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20402 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20379 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20403 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20380 20404
20381 env->GetIsolate()->EnqueueMicrotask( 20405 env->GetIsolate()->EnqueueMicrotask(
20382 Function::New(env->GetIsolate(), MicrotaskTwo)); 20406 Function::New(env.local(), MicrotaskTwo).ToLocalChecked());
20383 { 20407 {
20384 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate()); 20408 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate());
20385 CompileRun("1+1;"); 20409 CompileRun("1+1;");
20386 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20410 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20387 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20411 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20388 } 20412 }
20389 20413
20390 CompileRun("1+1;"); 20414 CompileRun("1+1;");
20391 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); 20415 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
20392 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); 20416 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
20393 } 20417 }
20394 20418
20395 20419
20396 TEST(RunMicrotasksWithoutEnteringContext) { 20420 TEST(RunMicrotasksWithoutEnteringContext) {
20397 v8::Isolate* isolate = CcTest::isolate(); 20421 v8::Isolate* isolate = CcTest::isolate();
20398 HandleScope handle_scope(isolate); 20422 HandleScope handle_scope(isolate);
20399 isolate->SetAutorunMicrotasks(false); 20423 isolate->SetAutorunMicrotasks(false);
20400 Local<Context> context = Context::New(isolate); 20424 Local<Context> context = Context::New(isolate);
20401 { 20425 {
20402 Context::Scope context_scope(context); 20426 Context::Scope context_scope(context);
20403 CompileRun("var ext1Calls = 0;"); 20427 CompileRun("var ext1Calls = 0;");
20404 isolate->EnqueueMicrotask(Function::New(isolate, MicrotaskOne)); 20428 isolate->EnqueueMicrotask(
20429 Function::New(context, MicrotaskOne).ToLocalChecked());
20405 } 20430 }
20406 isolate->RunMicrotasks(); 20431 isolate->RunMicrotasks();
20407 { 20432 {
20408 Context::Scope context_scope(context); 20433 Context::Scope context_scope(context);
20409 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(context).FromJust()); 20434 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(context).FromJust());
20410 } 20435 }
20411 isolate->SetAutorunMicrotasks(true); 20436 isolate->SetAutorunMicrotasks(true);
20412 } 20437 }
20413 20438
20414 20439
20415 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) { 20440 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) {
20416 v8::DebugEvent event = event_details.GetEvent(); 20441 v8::DebugEvent event = event_details.GetEvent();
20417 if (event != v8::Break) return; 20442 if (event != v8::Break) return;
20418 Local<Object> exec_state = event_details.GetExecutionState(); 20443 Local<Object> exec_state = event_details.GetExecutionState();
20419 Local<Value> break_id = exec_state->Get(v8_str("break_id")); 20444 Local<Context> context = CcTest::isolate()->GetCurrentContext();
20445 Local<Value> break_id =
20446 exec_state->Get(context, v8_str("break_id")).ToLocalChecked();
20420 CompileRun("function f(id) { new FrameDetails(id, 0); }"); 20447 CompileRun("function f(id) { new FrameDetails(id, 0); }");
20421 Local<Function> fun = 20448 Local<Function> fun = Local<Function>::Cast(
20422 Local<Function>::Cast(CcTest::global()->Get(v8_str("f"))); 20449 CcTest::global()->Get(context, v8_str("f")).ToLocalChecked());
20423 fun->Call(CcTest::global(), 1, &break_id); 20450 fun->Call(context, CcTest::global(), 1, &break_id).ToLocalChecked();
20424 } 20451 }
20425 20452
20426 20453
20427 TEST(Regress385349) { 20454 TEST(Regress385349) {
20428 i::FLAG_harmony_object_observe = true; 20455 i::FLAG_harmony_object_observe = true;
20429 i::FLAG_allow_natives_syntax = true; 20456 i::FLAG_allow_natives_syntax = true;
20430 v8::Isolate* isolate = CcTest::isolate(); 20457 v8::Isolate* isolate = CcTest::isolate();
20431 HandleScope handle_scope(isolate); 20458 HandleScope handle_scope(isolate);
20432 isolate->SetAutorunMicrotasks(false); 20459 isolate->SetAutorunMicrotasks(false);
20433 Local<Context> context = Context::New(isolate); 20460 Local<Context> context = Context::New(isolate);
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
20604 v8::HandleScope scope(isolate); 20631 v8::HandleScope scope(isolate);
20605 i::Handle<i::Object> empty_string = factory->empty_string(); 20632 i::Handle<i::Object> empty_string = factory->empty_string();
20606 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty(isolate)) == *empty_string); 20633 CHECK(*v8::Utils::OpenHandle(*v8::String::Empty(isolate)) == *empty_string);
20607 } 20634 }
20608 20635
20609 20636
20610 static int instance_checked_getter_count = 0; 20637 static int instance_checked_getter_count = 0;
20611 static void InstanceCheckedGetter( 20638 static void InstanceCheckedGetter(
20612 Local<String> name, 20639 Local<String> name,
20613 const v8::PropertyCallbackInfo<v8::Value>& info) { 20640 const v8::PropertyCallbackInfo<v8::Value>& info) {
20614 CHECK(name->Equals(v8_str("foo"))); 20641 CHECK(name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
20642 .FromJust());
20615 instance_checked_getter_count++; 20643 instance_checked_getter_count++;
20616 info.GetReturnValue().Set(v8_num(11)); 20644 info.GetReturnValue().Set(v8_num(11));
20617 } 20645 }
20618 20646
20619 20647
20620 static int instance_checked_setter_count = 0; 20648 static int instance_checked_setter_count = 0;
20621 static void InstanceCheckedSetter(Local<String> name, 20649 static void InstanceCheckedSetter(Local<String> name,
20622 Local<Value> value, 20650 Local<Value> value,
20623 const v8::PropertyCallbackInfo<void>& info) { 20651 const v8::PropertyCallbackInfo<void>& info) {
20624 CHECK(name->Equals(v8_str("foo"))); 20652 CHECK(name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("foo"))
20625 CHECK(value->Equals(v8_num(23))); 20653 .FromJust());
20654 CHECK(value->Equals(info.GetIsolate()->GetCurrentContext(), v8_num(23))
20655 .FromJust());
20626 instance_checked_setter_count++; 20656 instance_checked_setter_count++;
20627 } 20657 }
20628 20658
20629 20659
20630 static void CheckInstanceCheckedResult(int getters, int setters, 20660 static void CheckInstanceCheckedResult(int getters, int setters,
20631 bool expects_callbacks, 20661 bool expects_callbacks,
20632 TryCatch* try_catch) { 20662 TryCatch* try_catch) {
20633 if (expects_callbacks) { 20663 if (expects_callbacks) {
20634 CHECK(!try_catch->HasCaught()); 20664 CHECK(!try_catch->HasCaught());
20635 CHECK_EQ(getters, instance_checked_getter_count); 20665 CHECK_EQ(getters, instance_checked_getter_count);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
20696 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter, 20726 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter,
20697 Local<Value>(), v8::DEFAULT, v8::None, 20727 Local<Value>(), v8::DEFAULT, v8::None,
20698 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20728 v8::AccessorSignature::New(context->GetIsolate(), templ));
20699 CHECK(context->Global() 20729 CHECK(context->Global()
20700 ->Set(context.local(), v8_str("f"), 20730 ->Set(context.local(), v8_str("f"),
20701 templ->GetFunction(context.local()).ToLocalChecked()) 20731 templ->GetFunction(context.local()).ToLocalChecked())
20702 .FromJust()); 20732 .FromJust());
20703 20733
20704 printf("Testing positive ...\n"); 20734 printf("Testing positive ...\n");
20705 CompileRun("var obj = new f();"); 20735 CompileRun("var obj = new f();");
20706 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20736 CHECK(templ->HasInstance(
20737 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20707 CheckInstanceCheckedAccessors(true); 20738 CheckInstanceCheckedAccessors(true);
20708 20739
20709 printf("Testing negative ...\n"); 20740 printf("Testing negative ...\n");
20710 CompileRun("var obj = {};" 20741 CompileRun("var obj = {};"
20711 "obj.__proto__ = new f();"); 20742 "obj.__proto__ = new f();");
20712 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20743 CHECK(!templ->HasInstance(
20744 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20713 CheckInstanceCheckedAccessors(false); 20745 CheckInstanceCheckedAccessors(false);
20714 } 20746 }
20715 20747
20716 20748
20717 static void EmptyInterceptorGetter( 20749 static void EmptyInterceptorGetter(
20718 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) {} 20750 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) {}
20719 20751
20720 20752
20721 static void EmptyInterceptorSetter( 20753 static void EmptyInterceptorSetter(
20722 Local<String> name, Local<Value> value, 20754 Local<String> name, Local<Value> value,
(...skipping 12 matching lines...) Expand all
20735 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter, 20767 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter,
20736 Local<Value>(), v8::DEFAULT, v8::None, 20768 Local<Value>(), v8::DEFAULT, v8::None,
20737 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20769 v8::AccessorSignature::New(context->GetIsolate(), templ));
20738 CHECK(context->Global() 20770 CHECK(context->Global()
20739 ->Set(context.local(), v8_str("f"), 20771 ->Set(context.local(), v8_str("f"),
20740 templ->GetFunction(context.local()).ToLocalChecked()) 20772 templ->GetFunction(context.local()).ToLocalChecked())
20741 .FromJust()); 20773 .FromJust());
20742 20774
20743 printf("Testing positive ...\n"); 20775 printf("Testing positive ...\n");
20744 CompileRun("var obj = new f();"); 20776 CompileRun("var obj = new f();");
20745 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20777 CHECK(templ->HasInstance(
20778 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20746 CheckInstanceCheckedAccessors(true); 20779 CheckInstanceCheckedAccessors(true);
20747 20780
20748 printf("Testing negative ...\n"); 20781 printf("Testing negative ...\n");
20749 CompileRun("var obj = {};" 20782 CompileRun("var obj = {};"
20750 "obj.__proto__ = new f();"); 20783 "obj.__proto__ = new f();");
20751 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20784 CHECK(!templ->HasInstance(
20785 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20752 CheckInstanceCheckedAccessors(false); 20786 CheckInstanceCheckedAccessors(false);
20753 } 20787 }
20754 20788
20755 20789
20756 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { 20790 THREADED_TEST(InstanceCheckOnPrototypeAccessor) {
20757 v8::internal::FLAG_allow_natives_syntax = true; 20791 v8::internal::FLAG_allow_natives_syntax = true;
20758 LocalContext context; 20792 LocalContext context;
20759 v8::HandleScope scope(context->GetIsolate()); 20793 v8::HandleScope scope(context->GetIsolate());
20760 20794
20761 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 20795 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
20762 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); 20796 Local<ObjectTemplate> proto = templ->PrototypeTemplate();
20763 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter, 20797 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter,
20764 InstanceCheckedSetter, Local<Value>(), v8::DEFAULT, 20798 InstanceCheckedSetter, Local<Value>(), v8::DEFAULT,
20765 v8::None, 20799 v8::None,
20766 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20800 v8::AccessorSignature::New(context->GetIsolate(), templ));
20767 CHECK(context->Global() 20801 CHECK(context->Global()
20768 ->Set(context.local(), v8_str("f"), 20802 ->Set(context.local(), v8_str("f"),
20769 templ->GetFunction(context.local()).ToLocalChecked()) 20803 templ->GetFunction(context.local()).ToLocalChecked())
20770 .FromJust()); 20804 .FromJust());
20771 20805
20772 printf("Testing positive ...\n"); 20806 printf("Testing positive ...\n");
20773 CompileRun("var obj = new f();"); 20807 CompileRun("var obj = new f();");
20774 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20808 CHECK(templ->HasInstance(
20809 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20775 CheckInstanceCheckedAccessors(true); 20810 CheckInstanceCheckedAccessors(true);
20776 20811
20777 printf("Testing negative ...\n"); 20812 printf("Testing negative ...\n");
20778 CompileRun("var obj = {};" 20813 CompileRun("var obj = {};"
20779 "obj.__proto__ = new f();"); 20814 "obj.__proto__ = new f();");
20780 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20815 CHECK(!templ->HasInstance(
20816 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20781 CheckInstanceCheckedAccessors(false); 20817 CheckInstanceCheckedAccessors(false);
20782 20818
20783 printf("Testing positive with modified prototype chain ...\n"); 20819 printf("Testing positive with modified prototype chain ...\n");
20784 CompileRun("var obj = new f();" 20820 CompileRun("var obj = new f();"
20785 "var pro = {};" 20821 "var pro = {};"
20786 "pro.__proto__ = obj.__proto__;" 20822 "pro.__proto__ = obj.__proto__;"
20787 "obj.__proto__ = pro;"); 20823 "obj.__proto__ = pro;");
20788 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20824 CHECK(templ->HasInstance(
20825 context->Global()->Get(context.local(), v8_str("obj")).ToLocalChecked()));
20789 CheckInstanceCheckedAccessors(true); 20826 CheckInstanceCheckedAccessors(true);
20790 } 20827 }
20791 20828
20792 20829
20793 TEST(TryFinallyMessage) { 20830 TEST(TryFinallyMessage) {
20794 LocalContext context; 20831 LocalContext context;
20795 v8::HandleScope scope(context->GetIsolate()); 20832 v8::HandleScope scope(context->GetIsolate());
20796 { 20833 {
20797 // Test that the original error message is not lost if there is a 20834 // Test that the original error message is not lost if there is a
20798 // recursive call into Javascript is done in the finally block, e.g. to 20835 // recursive call into Javascript is done in the finally block, e.g. to
20799 // initialize an IC. (crbug.com/129171) 20836 // initialize an IC. (crbug.com/129171)
20800 TryCatch try_catch(context->GetIsolate()); 20837 TryCatch try_catch(context->GetIsolate());
20801 const char* trigger_ic = 20838 const char* trigger_ic =
20802 "try { \n" 20839 "try { \n"
20803 " throw new Error('test'); \n" 20840 " throw new Error('test'); \n"
20804 "} finally { \n" 20841 "} finally { \n"
20805 " var x = 0; \n" 20842 " var x = 0; \n"
20806 " x++; \n" // Trigger an IC initialization here. 20843 " x++; \n" // Trigger an IC initialization here.
20807 "} \n"; 20844 "} \n";
20808 CompileRun(trigger_ic); 20845 CompileRun(trigger_ic);
20809 CHECK(try_catch.HasCaught()); 20846 CHECK(try_catch.HasCaught());
20810 Local<Message> message = try_catch.Message(); 20847 Local<Message> message = try_catch.Message();
20811 CHECK(!message.IsEmpty()); 20848 CHECK(!message.IsEmpty());
20812 CHECK_EQ(2, message->GetLineNumber()); 20849 CHECK_EQ(2, message->GetLineNumber(context.local()).FromJust());
20813 } 20850 }
20814 20851
20815 { 20852 {
20816 // Test that the original exception message is indeed overwritten if 20853 // Test that the original exception message is indeed overwritten if
20817 // a new error is thrown in the finally block. 20854 // a new error is thrown in the finally block.
20818 TryCatch try_catch(context->GetIsolate()); 20855 TryCatch try_catch(context->GetIsolate());
20819 const char* throw_again = 20856 const char* throw_again =
20820 "try { \n" 20857 "try { \n"
20821 " throw new Error('test'); \n" 20858 " throw new Error('test'); \n"
20822 "} finally { \n" 20859 "} finally { \n"
20823 " var x = 0; \n" 20860 " var x = 0; \n"
20824 " x++; \n" 20861 " x++; \n"
20825 " throw new Error('again'); \n" // This is the new uncaught error. 20862 " throw new Error('again'); \n" // This is the new uncaught error.
20826 "} \n"; 20863 "} \n";
20827 CompileRun(throw_again); 20864 CompileRun(throw_again);
20828 CHECK(try_catch.HasCaught()); 20865 CHECK(try_catch.HasCaught());
20829 Local<Message> message = try_catch.Message(); 20866 Local<Message> message = try_catch.Message();
20830 CHECK(!message.IsEmpty()); 20867 CHECK(!message.IsEmpty());
20831 CHECK_EQ(6, message->GetLineNumber()); 20868 CHECK_EQ(6, message->GetLineNumber(context.local()).FromJust());
20832 } 20869 }
20833 } 20870 }
20834 20871
20835 20872
20836 static void Helper137002(bool do_store, 20873 static void Helper137002(bool do_store,
20837 bool polymorphic, 20874 bool polymorphic,
20838 bool remove_accessor, 20875 bool remove_accessor,
20839 bool interceptor) { 20876 bool interceptor) {
20840 LocalContext context; 20877 LocalContext context;
20841 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate()); 20878 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate());
(...skipping 27 matching lines...) Expand all
20869 CompileRun("obj.y = void 0;" 20906 CompileRun("obj.y = void 0;"
20870 "%OptimizeFunctionOnNextCall(f);"); 20907 "%OptimizeFunctionOnNextCall(f);");
20871 if (remove_accessor) { 20908 if (remove_accessor) {
20872 CompileRun("delete obj.foo;"); 20909 CompileRun("delete obj.foo;");
20873 } 20910 }
20874 CompileRun("var result = f(obj);"); 20911 CompileRun("var result = f(obj);");
20875 if (do_store) { 20912 if (do_store) {
20876 CompileRun("result = obj.y;"); 20913 CompileRun("result = obj.y;");
20877 } 20914 }
20878 if (remove_accessor && !interceptor) { 20915 if (remove_accessor && !interceptor) {
20879 CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); 20916 CHECK(context->Global()
20917 ->Get(context.local(), v8_str("result"))
20918 .ToLocalChecked()
20919 ->IsUndefined());
20880 } else { 20920 } else {
20881 CHECK_EQ(do_store ? 23 : 42, context->Global() 20921 CHECK_EQ(do_store ? 23 : 42, context->Global()
20882 ->Get(v8_str("result")) 20922 ->Get(context.local(), v8_str("result"))
20923 .ToLocalChecked()
20883 ->Int32Value(context.local()) 20924 ->Int32Value(context.local())
20884 .FromJust()); 20925 .FromJust());
20885 } 20926 }
20886 } 20927 }
20887 20928
20888 20929
20889 THREADED_TEST(Regress137002a) { 20930 THREADED_TEST(Regress137002a) {
20890 i::FLAG_allow_natives_syntax = true; 20931 i::FLAG_allow_natives_syntax = true;
20891 i::FLAG_compilation_cache = false; 20932 i::FLAG_compilation_cache = false;
20892 v8::HandleScope scope(CcTest::isolate()); 20933 v8::HandleScope scope(CcTest::isolate());
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
20952 "subobj.y = void 0;" 20993 "subobj.y = void 0;"
20953 20994
20954 "var load_result = load(obj);" 20995 "var load_result = load(obj);"
20955 "var load_result2 = load2(subobj);" 20996 "var load_result2 = load2(subobj);"
20956 "var keyed_load_result = keyed_load(obj, 'foo');" 20997 "var keyed_load_result = keyed_load(obj, 'foo');"
20957 "var keyed_load_result2 = keyed_load2(subobj, 'foo');" 20998 "var keyed_load_result2 = keyed_load2(subobj, 'foo');"
20958 "store(obj);" 20999 "store(obj);"
20959 "store2(subobj);" 21000 "store2(subobj);"
20960 "var y_from_obj = obj.y;" 21001 "var y_from_obj = obj.y;"
20961 "var y_from_subobj = subobj.y;"); 21002 "var y_from_subobj = subobj.y;");
20962 CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined()); 21003 CHECK(context->Global()
20963 CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined()); 21004 ->Get(context.local(), v8_str("load_result"))
20964 CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined()); 21005 .ToLocalChecked()
20965 CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined()); 21006 ->IsUndefined());
20966 CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined()); 21007 CHECK(context->Global()
20967 CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined()); 21008 ->Get(context.local(), v8_str("load_result2"))
21009 .ToLocalChecked()
21010 ->IsUndefined());
21011 CHECK(context->Global()
21012 ->Get(context.local(), v8_str("keyed_load_result"))
21013 .ToLocalChecked()
21014 ->IsUndefined());
21015 CHECK(context->Global()
21016 ->Get(context.local(), v8_str("keyed_load_result2"))
21017 .ToLocalChecked()
21018 ->IsUndefined());
21019 CHECK(context->Global()
21020 ->Get(context.local(), v8_str("y_from_obj"))
21021 .ToLocalChecked()
21022 ->IsUndefined());
21023 CHECK(context->Global()
21024 ->Get(context.local(), v8_str("y_from_subobj"))
21025 .ToLocalChecked()
21026 ->IsUndefined());
20968 } 21027 }
20969 21028
20970 21029
20971 THREADED_TEST(Regress142088) { 21030 THREADED_TEST(Regress142088) {
20972 i::FLAG_allow_natives_syntax = true; 21031 i::FLAG_allow_natives_syntax = true;
20973 LocalContext context; 21032 LocalContext context;
20974 v8::Isolate* isolate = context->GetIsolate(); 21033 v8::Isolate* isolate = context->GetIsolate();
20975 v8::HandleScope scope(isolate); 21034 v8::HandleScope scope(isolate);
20976 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 21035 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
20977 templ->SetAccessor(v8_str("foo"), 21036 templ->SetAccessor(v8_str("foo"),
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
21052 Local<Function> function = 21111 Local<Function> function =
21053 templ->GetFunction(context.local()).ToLocalChecked(); 21112 templ->GetFunction(context.local()).ToLocalChecked();
21054 CHECK(!function.IsEmpty()); 21113 CHECK(!function.IsEmpty());
21055 CHECK(function->IsFunction()); 21114 CHECK(function->IsFunction());
21056 } 21115 }
21057 21116
21058 21117
21059 THREADED_TEST(JSONParseObject) { 21118 THREADED_TEST(JSONParseObject) {
21060 LocalContext context; 21119 LocalContext context;
21061 HandleScope scope(context->GetIsolate()); 21120 HandleScope scope(context->GetIsolate());
21062 Local<Value> obj = v8::JSON::Parse(v8_str("{\"x\":42}")); 21121 Local<Value> obj =
21122 v8::JSON::Parse(context->GetIsolate(), v8_str("{\"x\":42}"))
21123 .ToLocalChecked();
21063 Local<Object> global = context->Global(); 21124 Local<Object> global = context->Global();
21064 global->Set(v8_str("obj"), obj); 21125 global->Set(context.local(), v8_str("obj"), obj).FromJust();
21065 ExpectString("JSON.stringify(obj)", "{\"x\":42}"); 21126 ExpectString("JSON.stringify(obj)", "{\"x\":42}");
21066 } 21127 }
21067 21128
21068 21129
21069 THREADED_TEST(JSONParseNumber) { 21130 THREADED_TEST(JSONParseNumber) {
21070 LocalContext context; 21131 LocalContext context;
21071 HandleScope scope(context->GetIsolate()); 21132 HandleScope scope(context->GetIsolate());
21072 Local<Value> obj = v8::JSON::Parse(v8_str("42")); 21133 Local<Value> obj =
21134 v8::JSON::Parse(context->GetIsolate(), v8_str("42")).ToLocalChecked();
21073 Local<Object> global = context->Global(); 21135 Local<Object> global = context->Global();
21074 global->Set(v8_str("obj"), obj); 21136 global->Set(context.local(), v8_str("obj"), obj).FromJust();
21075 ExpectString("JSON.stringify(obj)", "42"); 21137 ExpectString("JSON.stringify(obj)", "42");
21076 } 21138 }
21077 21139
21078 21140
21079 #if V8_OS_POSIX && !V8_OS_NACL 21141 #if V8_OS_POSIX && !V8_OS_NACL
21080 class ThreadInterruptTest { 21142 class ThreadInterruptTest {
21081 public: 21143 public:
21082 ThreadInterruptTest() : sem_(0), sem_value_(0) { } 21144 ThreadInterruptTest() : sem_(0), sem_value_(0) { }
21083 ~ThreadInterruptTest() {} 21145 ~ThreadInterruptTest() {}
21084 21146
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
21152 21214
21153 // Create an ObjectTemplate for global objects and install access 21215 // Create an ObjectTemplate for global objects and install access
21154 // check callbacks that will block access. 21216 // check callbacks that will block access.
21155 v8::Local<v8::ObjectTemplate> global_template = 21217 v8::Local<v8::ObjectTemplate> global_template =
21156 v8::ObjectTemplate::New(isolate); 21218 v8::ObjectTemplate::New(isolate);
21157 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 21219 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
21158 21220
21159 // Create a context and set an x property on it's global object. 21221 // Create a context and set an x property on it's global object.
21160 LocalContext context0(NULL, global_template); 21222 LocalContext context0(NULL, global_template);
21161 v8::Local<v8::Object> global0 = context0->Global(); 21223 v8::Local<v8::Object> global0 = context0->Global();
21162 global0->Set(v8_str("x"), v8_num(42)); 21224 global0->Set(context0.local(), v8_str("x"), v8_num(42)).FromJust();
21163 ExpectString("JSON.stringify(this)", "{\"x\":42}"); 21225 ExpectString("JSON.stringify(this)", "{\"x\":42}");
21164 21226
21165 for (int i = 0; i < 2; i++) { 21227 for (int i = 0; i < 2; i++) {
21166 if (i == 1) { 21228 if (i == 1) {
21167 // Install a toJSON function on the second run. 21229 // Install a toJSON function on the second run.
21168 v8::Local<v8::FunctionTemplate> toJSON = 21230 v8::Local<v8::FunctionTemplate> toJSON =
21169 v8::FunctionTemplate::New(isolate, UnreachableCallback); 21231 v8::FunctionTemplate::New(isolate, UnreachableCallback);
21170 21232
21171 global0->Set(v8_str("toJSON"), 21233 global0->Set(context0.local(), v8_str("toJSON"),
21172 toJSON->GetFunction(context0.local()).ToLocalChecked()); 21234 toJSON->GetFunction(context0.local()).ToLocalChecked())
21235 .FromJust();
21173 } 21236 }
21174 // Create a context with a different security token so that the 21237 // Create a context with a different security token so that the
21175 // failed access check callback will be called on each access. 21238 // failed access check callback will be called on each access.
21176 LocalContext context1(NULL, global_template); 21239 LocalContext context1(NULL, global_template);
21177 CHECK(context1->Global() 21240 CHECK(context1->Global()
21178 ->Set(context1.local(), v8_str("other"), global0) 21241 ->Set(context1.local(), v8_str("other"), global0)
21179 .FromJust()); 21242 .FromJust());
21180 21243
21181 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); 21244 CHECK(CompileRun("JSON.stringify(other)").IsEmpty());
21182 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); 21245 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty());
(...skipping 19 matching lines...) Expand all
21202 21265
21203 void CatcherCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 21266 void CatcherCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
21204 for (int i = 0; i < args.Length(); i++) { 21267 for (int i = 0; i < args.Length(); i++) {
21205 i::PrintF("%s\n", *String::Utf8Value(args[i])); 21268 i::PrintF("%s\n", *String::Utf8Value(args[i]));
21206 } 21269 }
21207 catch_callback_called = true; 21270 catch_callback_called = true;
21208 } 21271 }
21209 21272
21210 21273
21211 void HasOwnPropertyCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 21274 void HasOwnPropertyCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
21212 args[0]->ToObject(args.GetIsolate())->HasOwnProperty( 21275 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
21213 args[1]->ToString(args.GetIsolate())); 21276 CHECK(
21277 args[0]
21278 ->ToObject(context)
21279 .ToLocalChecked()
21280 ->HasOwnProperty(context, args[1]->ToString(context).ToLocalChecked())
21281 .IsNothing());
21214 } 21282 }
21215 21283
21216 21284
21217 void CheckCorrectThrow(const char* script) { 21285 void CheckCorrectThrow(const char* script) {
21218 // Test that the script, when wrapped into a try-catch, triggers the catch 21286 // Test that the script, when wrapped into a try-catch, triggers the catch
21219 // clause due to failed access check throwing an exception. 21287 // clause due to failed access check throwing an exception.
21220 // The subsequent try-catch should run without any exception. 21288 // The subsequent try-catch should run without any exception.
21221 access_check_fail_thrown = false; 21289 access_check_fail_thrown = false;
21222 catch_callback_called = false; 21290 catch_callback_called = false;
21223 i::ScopedVector<char> source(1024); 21291 i::ScopedVector<char> source(1024);
21224 i::SNPrintF(source, "try { %s; } catch (e) { catcher(e); }", script); 21292 i::SNPrintF(source, "try { %s; } catch (e) { catcher(e); }", script);
21225 CompileRun(source.start()); 21293 CompileRun(source.start());
21226 CHECK(access_check_fail_thrown); 21294 CHECK(access_check_fail_thrown);
21227 CHECK(catch_callback_called); 21295 CHECK(catch_callback_called);
21228 21296
21229 access_check_fail_thrown = false; 21297 access_check_fail_thrown = false;
21230 catch_callback_called = false; 21298 catch_callback_called = false;
21231 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };"); 21299 CompileRun("try { [1, 2, 3].sort(); } catch (e) { catcher(e) };");
21232 CHECK(!access_check_fail_thrown); 21300 CHECK(!access_check_fail_thrown);
21233 CHECK(!catch_callback_called); 21301 CHECK(!catch_callback_called);
21234 } 21302 }
21235 21303
21236 21304
21237 TEST(AccessCheckThrows) { 21305 TEST(AccessCheckThrows) {
21238 i::FLAG_allow_natives_syntax = true; 21306 i::FLAG_allow_natives_syntax = true;
21239 v8::V8::Initialize(); 21307 v8::V8::Initialize();
21240 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
21241 v8::Isolate* isolate = CcTest::isolate(); 21308 v8::Isolate* isolate = CcTest::isolate();
21309 isolate->SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
21242 v8::HandleScope scope(isolate); 21310 v8::HandleScope scope(isolate);
21243 21311
21244 // Create an ObjectTemplate for global objects and install access 21312 // Create an ObjectTemplate for global objects and install access
21245 // check callbacks that will block access. 21313 // check callbacks that will block access.
21246 v8::Local<v8::ObjectTemplate> global_template = 21314 v8::Local<v8::ObjectTemplate> global_template =
21247 v8::ObjectTemplate::New(isolate); 21315 v8::ObjectTemplate::New(isolate);
21248 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 21316 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
21249 21317
21250 // Create a context and set an x property on it's global object. 21318 // Create a context and set an x property on it's global object.
21251 LocalContext context0(NULL, global_template); 21319 LocalContext context0(NULL, global_template);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
21294 CheckCorrectThrow("%DeleteProperty_Strict(other, '1')"); 21362 CheckCorrectThrow("%DeleteProperty_Strict(other, '1')");
21295 CheckCorrectThrow("%HasOwnProperty(other, 'x')"); 21363 CheckCorrectThrow("%HasOwnProperty(other, 'x')");
21296 CheckCorrectThrow("%HasProperty('x', other)"); 21364 CheckCorrectThrow("%HasProperty('x', other)");
21297 CheckCorrectThrow("%PropertyIsEnumerable(other, 'x')"); 21365 CheckCorrectThrow("%PropertyIsEnumerable(other, 'x')");
21298 // PROPERTY_ATTRIBUTES_NONE = 0 21366 // PROPERTY_ATTRIBUTES_NONE = 0
21299 CheckCorrectThrow("%DefineAccessorPropertyUnchecked(" 21367 CheckCorrectThrow("%DefineAccessorPropertyUnchecked("
21300 "other, 'x', null, null, 1)"); 21368 "other, 'x', null, null, 1)");
21301 21369
21302 // Reset the failed access check callback so it does not influence 21370 // Reset the failed access check callback so it does not influence
21303 // the other tests. 21371 // the other tests.
21304 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); 21372 isolate->SetFailedAccessCheckCallbackFunction(NULL);
21305 } 21373 }
21306 21374
21307 21375
21308 class RequestInterruptTestBase { 21376 class RequestInterruptTestBase {
21309 public: 21377 public:
21310 RequestInterruptTestBase() 21378 RequestInterruptTestBase()
21311 : env_(), 21379 : env_(),
21312 isolate_(env_->GetIsolate()), 21380 isolate_(env_->GetIsolate()),
21313 sem_(0), 21381 sem_(0),
21314 warmup_(20000), 21382 warmup_(20000),
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
21395 }; 21463 };
21396 21464
21397 InterruptThread i_thread; 21465 InterruptThread i_thread;
21398 }; 21466 };
21399 21467
21400 21468
21401 class RequestInterruptTestWithFunctionCall 21469 class RequestInterruptTestWithFunctionCall
21402 : public RequestInterruptTestBaseWithSimpleInterrupt { 21470 : public RequestInterruptTestBaseWithSimpleInterrupt {
21403 public: 21471 public:
21404 virtual void TestBody() { 21472 virtual void TestBody() {
21405 Local<Function> func = Function::New( 21473 Local<Function> func = Function::New(env_.local(), ShouldContinueCallback,
21406 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); 21474 v8::External::New(isolate_, this))
21475 .ToLocalChecked();
21407 CHECK(env_->Global() 21476 CHECK(env_->Global()
21408 ->Set(env_.local(), v8_str("ShouldContinue"), func) 21477 ->Set(env_.local(), v8_str("ShouldContinue"), func)
21409 .FromJust()); 21478 .FromJust());
21410 21479
21411 CompileRun("while (ShouldContinue()) { }"); 21480 CompileRun("while (ShouldContinue()) { }");
21412 } 21481 }
21413 }; 21482 };
21414 21483
21415 21484
21416 class RequestInterruptTestWithMethodCall 21485 class RequestInterruptTestWithMethodCall
21417 : public RequestInterruptTestBaseWithSimpleInterrupt { 21486 : public RequestInterruptTestBaseWithSimpleInterrupt {
21418 public: 21487 public:
21419 virtual void TestBody() { 21488 virtual void TestBody() {
21420 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21489 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
21421 v8::Local<v8::Template> proto = t->PrototypeTemplate(); 21490 v8::Local<v8::Template> proto = t->PrototypeTemplate();
21422 proto->Set(v8_str("shouldContinue"), Function::New( 21491 proto->Set(v8_str("shouldContinue"),
21423 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); 21492 Function::New(env_.local(), ShouldContinueCallback,
21493 v8::External::New(isolate_, this))
21494 .ToLocalChecked());
21424 CHECK(env_->Global() 21495 CHECK(env_->Global()
21425 ->Set(env_.local(), v8_str("Klass"), 21496 ->Set(env_.local(), v8_str("Klass"),
21426 t->GetFunction(env_.local()).ToLocalChecked()) 21497 t->GetFunction(env_.local()).ToLocalChecked())
21427 .FromJust()); 21498 .FromJust());
21428 21499
21429 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); 21500 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }");
21430 } 21501 }
21431 }; 21502 };
21432 21503
21433 21504
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
21478 } 21549 }
21479 }; 21550 };
21480 21551
21481 21552
21482 class RequestInterruptTestWithMethodCallAndInterceptor 21553 class RequestInterruptTestWithMethodCallAndInterceptor
21483 : public RequestInterruptTestBaseWithSimpleInterrupt { 21554 : public RequestInterruptTestBaseWithSimpleInterrupt {
21484 public: 21555 public:
21485 virtual void TestBody() { 21556 virtual void TestBody() {
21486 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21557 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
21487 v8::Local<v8::Template> proto = t->PrototypeTemplate(); 21558 v8::Local<v8::Template> proto = t->PrototypeTemplate();
21488 proto->Set(v8_str("shouldContinue"), Function::New( 21559 proto->Set(v8_str("shouldContinue"),
21489 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); 21560 Function::New(env_.local(), ShouldContinueCallback,
21561 v8::External::New(isolate_, this))
21562 .ToLocalChecked());
21490 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); 21563 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate();
21491 instance_template->SetHandler( 21564 instance_template->SetHandler(
21492 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor)); 21565 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor));
21493 21566
21494 CHECK(env_->Global() 21567 CHECK(env_->Global()
21495 ->Set(env_.local(), v8_str("Klass"), 21568 ->Set(env_.local(), v8_str("Klass"),
21496 t->GetFunction(env_.local()).ToLocalChecked()) 21569 t->GetFunction(env_.local()).ToLocalChecked())
21497 .FromJust()); 21570 .FromJust());
21498 21571
21499 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); 21572 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }");
21500 } 21573 }
21501 21574
21502 private: 21575 private:
21503 static void EmptyInterceptor( 21576 static void EmptyInterceptor(
21504 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {} 21577 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {}
21505 }; 21578 };
21506 21579
21507 21580
21508 class RequestInterruptTestWithMathAbs 21581 class RequestInterruptTestWithMathAbs
21509 : public RequestInterruptTestBaseWithSimpleInterrupt { 21582 : public RequestInterruptTestBaseWithSimpleInterrupt {
21510 public: 21583 public:
21511 virtual void TestBody() { 21584 virtual void TestBody() {
21512 env_->Global()->Set(v8_str("WakeUpInterruptor"), Function::New( 21585 env_->Global()
21513 isolate_, 21586 ->Set(env_.local(), v8_str("WakeUpInterruptor"),
21514 WakeUpInterruptorCallback, 21587 Function::New(env_.local(), WakeUpInterruptorCallback,
21515 v8::External::New(isolate_, this))); 21588 v8::External::New(isolate_, this))
21589 .ToLocalChecked())
21590 .FromJust();
21516 21591
21517 env_->Global()->Set(v8_str("ShouldContinue"), Function::New( 21592 env_->Global()
21518 isolate_, 21593 ->Set(env_.local(), v8_str("ShouldContinue"),
21519 ShouldContinueCallback, 21594 Function::New(env_.local(), ShouldContinueCallback,
21520 v8::External::New(isolate_, this))); 21595 v8::External::New(isolate_, this))
21596 .ToLocalChecked())
21597 .FromJust();
21521 21598
21522 i::FLAG_allow_natives_syntax = true; 21599 i::FLAG_allow_natives_syntax = true;
21523 CompileRun("function loopish(o) {" 21600 CompileRun("function loopish(o) {"
21524 " var pre = 10;" 21601 " var pre = 10;"
21525 " while (o.abs(1) > 0) {" 21602 " while (o.abs(1) > 0) {"
21526 " if (o.abs(1) >= 0 && !ShouldContinue()) break;" 21603 " if (o.abs(1) >= 0 && !ShouldContinue()) break;"
21527 " if (pre > 0) {" 21604 " if (pre > 0) {"
21528 " if (--pre === 0) WakeUpInterruptor(o === Math);" 21605 " if (--pre === 0) WakeUpInterruptor(o === Math);"
21529 " }" 21606 " }"
21530 " }" 21607 " }"
21531 "}" 21608 "}"
21532 "var i = 50;" 21609 "var i = 50;"
21533 "var obj = {abs: function () { return i-- }, x: null};" 21610 "var obj = {abs: function () { return i-- }, x: null};"
21534 "delete obj.x;" 21611 "delete obj.x;"
21535 "loopish(obj);" 21612 "loopish(obj);"
21536 "%OptimizeFunctionOnNextCall(loopish);" 21613 "%OptimizeFunctionOnNextCall(loopish);"
21537 "loopish(Math);"); 21614 "loopish(Math);");
21538 21615
21539 i::FLAG_allow_natives_syntax = false; 21616 i::FLAG_allow_natives_syntax = false;
21540 } 21617 }
21541 21618
21542 private: 21619 private:
21543 static void WakeUpInterruptorCallback( 21620 static void WakeUpInterruptorCallback(
21544 const v8::FunctionCallbackInfo<Value>& info) { 21621 const v8::FunctionCallbackInfo<Value>& info) {
21545 if (!info[0]->BooleanValue()) return; 21622 if (!info[0]
21623 ->BooleanValue(info.GetIsolate()->GetCurrentContext())
21624 .FromJust()) {
21625 return;
21626 }
21546 21627
21547 RequestInterruptTestBase* test = 21628 RequestInterruptTestBase* test =
21548 reinterpret_cast<RequestInterruptTestBase*>( 21629 reinterpret_cast<RequestInterruptTestBase*>(
21549 info.Data().As<v8::External>()->Value()); 21630 info.Data().As<v8::External>()->Value());
21550 test->WakeUpInterruptor(); 21631 test->WakeUpInterruptor();
21551 } 21632 }
21552 21633
21553 static void ShouldContinueCallback( 21634 static void ShouldContinueCallback(
21554 const v8::FunctionCallbackInfo<Value>& info) { 21635 const v8::FunctionCallbackInfo<Value>& info) {
21555 RequestInterruptTestBase* test = 21636 RequestInterruptTestBase* test =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
21592 21673
21593 class RequestMultipleInterrupts : public RequestInterruptTestBase { 21674 class RequestMultipleInterrupts : public RequestInterruptTestBase {
21594 public: 21675 public:
21595 RequestMultipleInterrupts() : i_thread(this), counter_(0) {} 21676 RequestMultipleInterrupts() : i_thread(this), counter_(0) {}
21596 21677
21597 virtual void StartInterruptThread() { 21678 virtual void StartInterruptThread() {
21598 i_thread.Start(); 21679 i_thread.Start();
21599 } 21680 }
21600 21681
21601 virtual void TestBody() { 21682 virtual void TestBody() {
21602 Local<Function> func = Function::New( 21683 Local<Function> func = Function::New(env_.local(), ShouldContinueCallback,
21603 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); 21684 v8::External::New(isolate_, this))
21685 .ToLocalChecked();
21604 CHECK(env_->Global() 21686 CHECK(env_->Global()
21605 ->Set(env_.local(), v8_str("ShouldContinue"), func) 21687 ->Set(env_.local(), v8_str("ShouldContinue"), func)
21606 .FromJust()); 21688 .FromJust());
21607 21689
21608 CompileRun("while (ShouldContinue()) { }"); 21690 CompileRun("while (ShouldContinue()) { }");
21609 } 21691 }
21610 21692
21611 private: 21693 private:
21612 class InterruptThread : public v8::base::Thread { 21694 class InterruptThread : public v8::base::Thread {
21613 public: 21695 public:
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
21655 21737
21656 interrupt_was_called = false; 21738 interrupt_was_called = false;
21657 isolate->RequestInterrupt(&SmallScriptsInterruptCallback, NULL); 21739 isolate->RequestInterrupt(&SmallScriptsInterruptCallback, NULL);
21658 CompileRun("(function(x){return x;})(1);"); 21740 CompileRun("(function(x){return x;})(1);");
21659 CHECK(interrupt_was_called); 21741 CHECK(interrupt_was_called);
21660 } 21742 }
21661 21743
21662 21744
21663 static Local<Value> function_new_expected_env; 21745 static Local<Value> function_new_expected_env;
21664 static void FunctionNewCallback(const v8::FunctionCallbackInfo<Value>& info) { 21746 static void FunctionNewCallback(const v8::FunctionCallbackInfo<Value>& info) {
21665 CHECK(function_new_expected_env->Equals(info.Data())); 21747 CHECK(
21748 function_new_expected_env->Equals(info.GetIsolate()->GetCurrentContext(),
21749 info.Data())
21750 .FromJust());
21666 info.GetReturnValue().Set(17); 21751 info.GetReturnValue().Set(17);
21667 } 21752 }
21668 21753
21669 21754
21670 THREADED_TEST(FunctionNew) { 21755 THREADED_TEST(FunctionNew) {
21671 LocalContext env; 21756 LocalContext env;
21672 v8::Isolate* isolate = env->GetIsolate(); 21757 v8::Isolate* isolate = env->GetIsolate();
21673 v8::HandleScope scope(isolate); 21758 v8::HandleScope scope(isolate);
21674 Local<Object> data = v8::Object::New(isolate); 21759 Local<Object> data = v8::Object::New(isolate);
21675 function_new_expected_env = data; 21760 function_new_expected_env = data;
21676 Local<Function> func = Function::New(isolate, FunctionNewCallback, data); 21761 Local<Function> func =
21762 Function::New(env.local(), FunctionNewCallback, data).ToLocalChecked();
21677 CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust()); 21763 CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
21678 Local<Value> result = CompileRun("func();"); 21764 Local<Value> result = CompileRun("func();");
21679 CHECK(v8::Integer::New(isolate, 17)->Equals(result)); 21765 CHECK(v8::Integer::New(isolate, 17)->Equals(env.local(), result).FromJust());
21680 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 21766 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
21681 // Verify function not cached 21767 // Verify function not cached
21682 auto serial_number = handle( 21768 auto serial_number = handle(
21683 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func)) 21769 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func))
21684 ->shared() 21770 ->shared()
21685 ->get_api_func_data() 21771 ->get_api_func_data()
21686 ->serial_number()), 21772 ->serial_number()),
21687 i_isolate); 21773 i_isolate);
21688 auto cache = i_isolate->function_cache(); 21774 auto cache = i_isolate->function_cache();
21689 CHECK(cache->Lookup(serial_number)->IsTheHole()); 21775 CHECK(cache->Lookup(serial_number)->IsTheHole());
21690 // Verify that each Function::New creates a new function instance 21776 // Verify that each Function::New creates a new function instance
21691 Local<Object> data2 = v8::Object::New(isolate); 21777 Local<Object> data2 = v8::Object::New(isolate);
21692 function_new_expected_env = data2; 21778 function_new_expected_env = data2;
21693 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); 21779 Local<Function> func2 =
21780 Function::New(env.local(), FunctionNewCallback, data2).ToLocalChecked();
21694 CHECK(!func2->IsNull()); 21781 CHECK(!func2->IsNull());
21695 CHECK(!func->Equals(func2)); 21782 CHECK(!func->Equals(env.local(), func2).FromJust());
21696 CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust()); 21783 CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust());
21697 Local<Value> result2 = CompileRun("func2();"); 21784 Local<Value> result2 = CompileRun("func2();");
21698 CHECK(v8::Integer::New(isolate, 17)->Equals(result2)); 21785 CHECK(v8::Integer::New(isolate, 17)->Equals(env.local(), result2).FromJust());
21699 } 21786 }
21700 21787
21701 21788
21702 TEST(EscapeableHandleScope) { 21789 TEST(EscapeableHandleScope) {
21703 HandleScope outer_scope(CcTest::isolate()); 21790 HandleScope outer_scope(CcTest::isolate());
21704 LocalContext context; 21791 LocalContext context;
21705 const int runs = 10; 21792 const int runs = 10;
21706 Local<String> values[runs]; 21793 Local<String> values[runs];
21707 for (int i = 0; i < runs; i++) { 21794 for (int i = 0; i < runs; i++) {
21708 v8::EscapableHandleScope inner_scope(CcTest::isolate()); 21795 v8::EscapableHandleScope inner_scope(CcTest::isolate());
21709 Local<String> value; 21796 Local<String> value;
21710 if (i != 0) value = v8_str("escape value"); 21797 if (i != 0) value = v8_str("escape value");
21711 values[i] = inner_scope.Escape(value); 21798 values[i] = inner_scope.Escape(value);
21712 } 21799 }
21713 for (int i = 0; i < runs; i++) { 21800 for (int i = 0; i < runs; i++) {
21714 Local<String> expected; 21801 Local<String> expected;
21715 if (i != 0) { 21802 if (i != 0) {
21716 CHECK(v8_str("escape value")->Equals(values[i])); 21803 CHECK(v8_str("escape value")
21804 ->Equals(context.local(), values[i])
21805 .FromJust());
21717 } else { 21806 } else {
21718 CHECK(values[i].IsEmpty()); 21807 CHECK(values[i].IsEmpty());
21719 } 21808 }
21720 } 21809 }
21721 } 21810 }
21722 21811
21723 21812
21724 static void SetterWhichExpectsThisAndHolderToDiffer( 21813 static void SetterWhichExpectsThisAndHolderToDiffer(
21725 Local<String>, Local<Value>, const v8::PropertyCallbackInfo<void>& info) { 21814 Local<String>, Local<Value>, const v8::PropertyCallbackInfo<void>& info) {
21726 CHECK(info.Holder() != info.This()); 21815 CHECK(info.Holder() != info.This());
(...skipping 28 matching lines...) Expand all
21755 static Local<Object> holder; 21844 static Local<Object> holder;
21756 static Local<Object> callee; 21845 static Local<Object> callee;
21757 static int count; 21846 static int count;
21758 21847
21759 static void OptimizationCallback( 21848 static void OptimizationCallback(
21760 const v8::FunctionCallbackInfo<v8::Value>& info) { 21849 const v8::FunctionCallbackInfo<v8::Value>& info) {
21761 CHECK(callee == info.Callee()); 21850 CHECK(callee == info.Callee());
21762 CHECK(data == info.Data()); 21851 CHECK(data == info.Data());
21763 CHECK(receiver == info.This()); 21852 CHECK(receiver == info.This());
21764 if (info.Length() == 1) { 21853 if (info.Length() == 1) {
21765 CHECK(v8_num(1)->Equals(info[0])); 21854 CHECK(v8_num(1)
21855 ->Equals(info.GetIsolate()->GetCurrentContext(), info[0])
21856 .FromJust());
21766 } 21857 }
21767 CHECK(holder == info.Holder()); 21858 CHECK(holder == info.Holder());
21768 count++; 21859 count++;
21769 info.GetReturnValue().Set(v8_str("returned")); 21860 info.GetReturnValue().Set(v8_str("returned"));
21770 } 21861 }
21771 21862
21772 public: 21863 public:
21773 enum SignatureType { 21864 enum SignatureType {
21774 kNoSignature, 21865 kNoSignature,
21775 kSignatureOnReceiver, 21866 kSignatureOnReceiver,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
21833 Local<FunctionTemplate> function_template = FunctionTemplate::New( 21924 Local<FunctionTemplate> function_template = FunctionTemplate::New(
21834 isolate, OptimizationCallback, data, signature); 21925 isolate, OptimizationCallback, data, signature);
21835 Local<Function> function = 21926 Local<Function> function =
21836 function_template->GetFunction(context).ToLocalChecked(); 21927 function_template->GetFunction(context).ToLocalChecked();
21837 Local<Object> global_holder = inner_global; 21928 Local<Object> global_holder = inner_global;
21838 Local<Object> function_holder = function_receiver; 21929 Local<Object> function_holder = function_receiver;
21839 if (signature_type == kSignatureOnPrototype) { 21930 if (signature_type == kSignatureOnPrototype) {
21840 function_holder = Local<Object>::Cast(function_holder->GetPrototype()); 21931 function_holder = Local<Object>::Cast(function_holder->GetPrototype());
21841 global_holder = Local<Object>::Cast(global_holder->GetPrototype()); 21932 global_holder = Local<Object>::Cast(global_holder->GetPrototype());
21842 } 21933 }
21843 global_holder->Set(v8_str("g_f"), function); 21934 global_holder->Set(context, v8_str("g_f"), function).FromJust();
21844 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function); 21935 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function);
21845 function_holder->Set(v8_str("f"), function); 21936 function_holder->Set(context, v8_str("f"), function).FromJust();
21846 function_holder->SetAccessorProperty(v8_str("acc"), function, function); 21937 function_holder->SetAccessorProperty(v8_str("acc"), function, function);
21847 // Initialize expected values. 21938 // Initialize expected values.
21848 callee = function; 21939 callee = function;
21849 count = 0; 21940 count = 0;
21850 if (global) { 21941 if (global) {
21851 receiver = context->Global(); 21942 receiver = context->Global();
21852 holder = inner_global; 21943 holder = inner_global;
21853 } else { 21944 } else {
21854 holder = function_receiver; 21945 holder = function_receiver;
21855 // If not using a signature, add something else to the prototype chain 21946 // If not using a signature, add something else to the prototype chain
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
21935 checker.RunAll(); 22026 checker.RunAll();
21936 } 22027 }
21937 22028
21938 22029
21939 TEST(FunctionCallOptimizationMultipleArgs) { 22030 TEST(FunctionCallOptimizationMultipleArgs) {
21940 i::FLAG_allow_natives_syntax = true; 22031 i::FLAG_allow_natives_syntax = true;
21941 LocalContext context; 22032 LocalContext context;
21942 v8::Isolate* isolate = context->GetIsolate(); 22033 v8::Isolate* isolate = context->GetIsolate();
21943 v8::HandleScope scope(isolate); 22034 v8::HandleScope scope(isolate);
21944 Local<Object> global = context->Global(); 22035 Local<Object> global = context->Global();
21945 Local<v8::Function> function = Function::New(isolate, Returns42); 22036 Local<v8::Function> function =
21946 global->Set(v8_str("x"), function); 22037 Function::New(context.local(), Returns42).ToLocalChecked();
22038 global->Set(context.local(), v8_str("x"), function).FromJust();
21947 CompileRun( 22039 CompileRun(
21948 "function x_wrap() {\n" 22040 "function x_wrap() {\n"
21949 " for (var i = 0; i < 5; i++) {\n" 22041 " for (var i = 0; i < 5; i++) {\n"
21950 " x(1,2,3);\n" 22042 " x(1,2,3);\n"
21951 " }\n" 22043 " }\n"
21952 "}\n" 22044 "}\n"
21953 "x_wrap();\n" 22045 "x_wrap();\n"
21954 "%OptimizeFunctionOnNextCall(x_wrap);" 22046 "%OptimizeFunctionOnNextCall(x_wrap);"
21955 "x_wrap();\n"); 22047 "x_wrap();\n");
21956 } 22048 }
21957 22049
21958 22050
21959 static void ReturnsSymbolCallback( 22051 static void ReturnsSymbolCallback(
21960 const v8::FunctionCallbackInfo<v8::Value>& info) { 22052 const v8::FunctionCallbackInfo<v8::Value>& info) {
21961 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate())); 22053 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate()));
21962 } 22054 }
21963 22055
21964 22056
21965 TEST(ApiCallbackCanReturnSymbols) { 22057 TEST(ApiCallbackCanReturnSymbols) {
21966 i::FLAG_allow_natives_syntax = true; 22058 i::FLAG_allow_natives_syntax = true;
21967 LocalContext context; 22059 LocalContext context;
21968 v8::Isolate* isolate = context->GetIsolate(); 22060 v8::Isolate* isolate = context->GetIsolate();
21969 v8::HandleScope scope(isolate); 22061 v8::HandleScope scope(isolate);
21970 Local<Object> global = context->Global(); 22062 Local<Object> global = context->Global();
21971 Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback); 22063 Local<v8::Function> function =
21972 global->Set(v8_str("x"), function); 22064 Function::New(context.local(), ReturnsSymbolCallback).ToLocalChecked();
22065 global->Set(context.local(), v8_str("x"), function).FromJust();
21973 CompileRun( 22066 CompileRun(
21974 "function x_wrap() {\n" 22067 "function x_wrap() {\n"
21975 " for (var i = 0; i < 5; i++) {\n" 22068 " for (var i = 0; i < 5; i++) {\n"
21976 " x();\n" 22069 " x();\n"
21977 " }\n" 22070 " }\n"
21978 "}\n" 22071 "}\n"
21979 "x_wrap();\n" 22072 "x_wrap();\n"
21980 "%OptimizeFunctionOnNextCall(x_wrap);" 22073 "%OptimizeFunctionOnNextCall(x_wrap);"
21981 "x_wrap();\n"); 22074 "x_wrap();\n");
21982 } 22075 }
21983 22076
21984 22077
21985 TEST(EmptyApiCallback) { 22078 TEST(EmptyApiCallback) {
21986 LocalContext context; 22079 LocalContext context;
21987 auto isolate = context->GetIsolate(); 22080 auto isolate = context->GetIsolate();
21988 v8::HandleScope scope(isolate); 22081 v8::HandleScope scope(isolate);
21989 auto global = context->Global(); 22082 auto global = context->Global();
21990 auto function = FunctionTemplate::New(isolate) 22083 auto function = FunctionTemplate::New(isolate)
21991 ->GetFunction(context.local()) 22084 ->GetFunction(context.local())
21992 .ToLocalChecked(); 22085 .ToLocalChecked();
21993 global->Set(v8_str("x"), function); 22086 global->Set(context.local(), v8_str("x"), function).FromJust();
21994 22087
21995 auto result = CompileRun("x()"); 22088 auto result = CompileRun("x()");
21996 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); 22089 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy());
21997 22090
21998 result = CompileRun("x(1,2,3)"); 22091 result = CompileRun("x(1,2,3)");
21999 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); 22092 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy());
22000 22093
22001 result = CompileRun("7 + x.call(3) + 11"); 22094 result = CompileRun("7 + x.call(3) + 11");
22002 CHECK(result->IsInt32()); 22095 CHECK(result->IsInt32());
22003 CHECK_EQ(21, result->Int32Value(context.local()).FromJust()); 22096 CHECK_EQ(21, result->Int32Value(context.local()).FromJust());
(...skipping 11 matching lines...) Expand all
22015 22108
22016 22109
22017 TEST(SimpleSignatureCheck) { 22110 TEST(SimpleSignatureCheck) {
22018 LocalContext context; 22111 LocalContext context;
22019 auto isolate = context->GetIsolate(); 22112 auto isolate = context->GetIsolate();
22020 v8::HandleScope scope(isolate); 22113 v8::HandleScope scope(isolate);
22021 auto global = context->Global(); 22114 auto global = context->Global();
22022 auto sig_obj = FunctionTemplate::New(isolate); 22115 auto sig_obj = FunctionTemplate::New(isolate);
22023 auto sig = v8::Signature::New(isolate, sig_obj); 22116 auto sig = v8::Signature::New(isolate, sig_obj);
22024 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); 22117 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
22025 global->Set(v8_str("sig_obj"), 22118 global->Set(context.local(), v8_str("sig_obj"),
22026 sig_obj->GetFunction(context.local()).ToLocalChecked()); 22119 sig_obj->GetFunction(context.local()).ToLocalChecked())
22027 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); 22120 .FromJust();
22121 global->Set(context.local(), v8_str("x"),
22122 x->GetFunction(context.local()).ToLocalChecked())
22123 .FromJust();
22028 CompileRun("var s = new sig_obj();"); 22124 CompileRun("var s = new sig_obj();");
22029 { 22125 {
22030 TryCatch try_catch(isolate); 22126 TryCatch try_catch(isolate);
22031 CompileRun("x()"); 22127 CompileRun("x()");
22032 CHECK(try_catch.HasCaught()); 22128 CHECK(try_catch.HasCaught());
22033 } 22129 }
22034 { 22130 {
22035 TryCatch try_catch(isolate); 22131 TryCatch try_catch(isolate);
22036 CompileRun("x.call(1)"); 22132 CompileRun("x.call(1)");
22037 CHECK(try_catch.HasCaught()); 22133 CHECK(try_catch.HasCaught());
(...skipping 19 matching lines...) Expand all
22057 v8::HandleScope scope(isolate); 22153 v8::HandleScope scope(isolate);
22058 auto global = context->Global(); 22154 auto global = context->Global();
22059 auto sig_obj = FunctionTemplate::New(isolate); 22155 auto sig_obj = FunctionTemplate::New(isolate);
22060 auto sig = v8::Signature::New(isolate, sig_obj); 22156 auto sig = v8::Signature::New(isolate, sig_obj);
22061 for (int i = 0; i < 4; ++i) { 22157 for (int i = 0; i < 4; ++i) {
22062 auto temp = FunctionTemplate::New(isolate); 22158 auto temp = FunctionTemplate::New(isolate);
22063 temp->Inherit(sig_obj); 22159 temp->Inherit(sig_obj);
22064 sig_obj = temp; 22160 sig_obj = temp;
22065 } 22161 }
22066 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); 22162 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
22067 global->Set(v8_str("sig_obj"), 22163 global->Set(context.local(), v8_str("sig_obj"),
22068 sig_obj->GetFunction(context.local()).ToLocalChecked()); 22164 sig_obj->GetFunction(context.local()).ToLocalChecked())
22069 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); 22165 .FromJust();
22166 global->Set(context.local(), v8_str("x"),
22167 x->GetFunction(context.local()).ToLocalChecked())
22168 .FromJust();
22070 CompileRun("var s = new sig_obj();"); 22169 CompileRun("var s = new sig_obj();");
22071 { 22170 {
22072 TryCatch try_catch(isolate); 22171 TryCatch try_catch(isolate);
22073 CompileRun("x()"); 22172 CompileRun("x()");
22074 CHECK(try_catch.HasCaught()); 22173 CHECK(try_catch.HasCaught());
22075 } 22174 }
22076 { 22175 {
22077 TryCatch try_catch(isolate); 22176 TryCatch try_catch(isolate);
22078 CompileRun("x.call(1)"); 22177 CompileRun("x.call(1)");
22079 CHECK(try_catch.HasCaught()); 22178 CHECK(try_catch.HasCaught());
(...skipping 15 matching lines...) Expand all
22095 22194
22096 TEST(PrototypeSignatureCheck) { 22195 TEST(PrototypeSignatureCheck) {
22097 LocalContext context; 22196 LocalContext context;
22098 auto isolate = context->GetIsolate(); 22197 auto isolate = context->GetIsolate();
22099 v8::HandleScope scope(isolate); 22198 v8::HandleScope scope(isolate);
22100 auto global = context->Global(); 22199 auto global = context->Global();
22101 auto sig_obj = FunctionTemplate::New(isolate); 22200 auto sig_obj = FunctionTemplate::New(isolate);
22102 sig_obj->SetHiddenPrototype(true); 22201 sig_obj->SetHiddenPrototype(true);
22103 auto sig = v8::Signature::New(isolate, sig_obj); 22202 auto sig = v8::Signature::New(isolate, sig_obj);
22104 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); 22203 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
22105 global->Set(v8_str("sig_obj"), 22204 global->Set(context.local(), v8_str("sig_obj"),
22106 sig_obj->GetFunction(context.local()).ToLocalChecked()); 22205 sig_obj->GetFunction(context.local()).ToLocalChecked())
22107 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); 22206 .FromJust();
22207 global->Set(context.local(), v8_str("x"),
22208 x->GetFunction(context.local()).ToLocalChecked())
22209 .FromJust();
22108 CompileRun("s = {}; s.__proto__ = new sig_obj();"); 22210 CompileRun("s = {}; s.__proto__ = new sig_obj();");
22109 { 22211 {
22110 TryCatch try_catch(isolate); 22212 TryCatch try_catch(isolate);
22111 CompileRun("x()"); 22213 CompileRun("x()");
22112 CHECK(try_catch.HasCaught()); 22214 CHECK(try_catch.HasCaught());
22113 } 22215 }
22114 { 22216 {
22115 TryCatch try_catch(isolate); 22217 TryCatch try_catch(isolate);
22116 CompileRun("x.call(1)"); 22218 CompileRun("x.call(1)");
22117 CHECK(try_catch.HasCaught()); 22219 CHECK(try_catch.HasCaught());
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
22151 histogramTimer.Stop(); 22253 histogramTimer.Stop();
22152 CHECK_EQ(0, strcmp("V8.Test", last_event_message)); 22254 CHECK_EQ(0, strcmp("V8.Test", last_event_message));
22153 CHECK_EQ(1, last_event_status); 22255 CHECK_EQ(1, last_event_status);
22154 } 22256 }
22155 22257
22156 22258
22157 TEST(Promises) { 22259 TEST(Promises) {
22158 LocalContext context; 22260 LocalContext context;
22159 v8::Isolate* isolate = context->GetIsolate(); 22261 v8::Isolate* isolate = context->GetIsolate();
22160 v8::HandleScope scope(isolate); 22262 v8::HandleScope scope(isolate);
22161 Local<Object> global = context->Global();
22162 22263
22163 // Creation. 22264 // Creation.
22164 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); 22265 Local<v8::Promise::Resolver> pr =
22165 Local<v8::Promise::Resolver> rr = v8::Promise::Resolver::New(isolate); 22266 v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22267 Local<v8::Promise::Resolver> rr =
22268 v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22166 Local<v8::Promise> p = pr->GetPromise(); 22269 Local<v8::Promise> p = pr->GetPromise();
22167 Local<v8::Promise> r = rr->GetPromise(); 22270 Local<v8::Promise> r = rr->GetPromise();
22168 CHECK_EQ(isolate, p->GetIsolate());
22169 22271
22170 // IsPromise predicate. 22272 // IsPromise predicate.
22171 CHECK(p->IsPromise()); 22273 CHECK(p->IsPromise());
22172 CHECK(r->IsPromise()); 22274 CHECK(r->IsPromise());
22173 Local<Value> o = v8::Object::New(isolate); 22275 Local<Value> o = v8::Object::New(isolate);
22174 CHECK(!o->IsPromise()); 22276 CHECK(!o->IsPromise());
22175 22277
22176 // Resolution and rejection. 22278 // Resolution and rejection.
22177 pr->Resolve(v8::Integer::New(isolate, 1)); 22279 pr->Resolve(context.local(), v8::Integer::New(isolate, 1)).FromJust();
22178 CHECK(p->IsPromise()); 22280 CHECK(p->IsPromise());
22179 rr->Reject(v8::Integer::New(isolate, 2)); 22281 rr->Reject(context.local(), v8::Integer::New(isolate, 2)).FromJust();
22180 CHECK(r->IsPromise()); 22282 CHECK(r->IsPromise());
22181
22182 // Chaining non-pending promises.
22183 CompileRun(
22184 "var x1 = 0;\n"
22185 "var x2 = 0;\n"
22186 "function f1(x) { x1 = x; return x+1 };\n"
22187 "function f2(x) { x2 = x; return x+1 };\n");
22188 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1")));
22189 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2")));
22190
22191 p->Chain(f1);
22192 CHECK_EQ(0,
22193 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22194 isolate->RunMicrotasks();
22195 CHECK_EQ(1,
22196 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22197
22198 p->Catch(f2);
22199 isolate->RunMicrotasks();
22200 CHECK_EQ(0,
22201 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22202
22203 r->Catch(f2);
22204 CHECK_EQ(0,
22205 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22206 isolate->RunMicrotasks();
22207 CHECK_EQ(2,
22208 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22209
22210 r->Chain(f1);
22211 isolate->RunMicrotasks();
22212 CHECK_EQ(1,
22213 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22214
22215 // Chaining pending promises.
22216 CompileRun("x1 = x2 = 0;");
22217 pr = v8::Promise::Resolver::New(isolate);
22218 rr = v8::Promise::Resolver::New(isolate);
22219
22220 pr->GetPromise()->Chain(f1);
22221 rr->GetPromise()->Catch(f2);
22222 isolate->RunMicrotasks();
22223 CHECK_EQ(0,
22224 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22225 CHECK_EQ(0,
22226 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22227
22228 pr->Resolve(v8::Integer::New(isolate, 1));
22229 rr->Reject(v8::Integer::New(isolate, 2));
22230 CHECK_EQ(0,
22231 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22232 CHECK_EQ(0,
22233 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22234
22235 isolate->RunMicrotasks();
22236 CHECK_EQ(1,
22237 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22238 CHECK_EQ(2,
22239 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22240
22241 // Multi-chaining.
22242 CompileRun("x1 = x2 = 0;");
22243 pr = v8::Promise::Resolver::New(isolate);
22244 pr->GetPromise()->Chain(f1)->Chain(f2);
22245 pr->Resolve(v8::Integer::New(isolate, 3));
22246 CHECK_EQ(0,
22247 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22248 CHECK_EQ(0,
22249 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22250 isolate->RunMicrotasks();
22251 CHECK_EQ(3,
22252 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22253 CHECK_EQ(4,
22254 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22255
22256 CompileRun("x1 = x2 = 0;");
22257 rr = v8::Promise::Resolver::New(isolate);
22258 rr->GetPromise()->Catch(f1)->Chain(f2);
22259 rr->Reject(v8::Integer::New(isolate, 3));
22260 CHECK_EQ(0,
22261 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22262 CHECK_EQ(0,
22263 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22264 isolate->RunMicrotasks();
22265 CHECK_EQ(3,
22266 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22267 CHECK_EQ(4,
22268 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
22269 } 22283 }
22270 22284
22271 22285
22272 TEST(PromiseThen) { 22286 TEST(PromiseThen) {
22273 LocalContext context; 22287 LocalContext context;
22274 v8::Isolate* isolate = context->GetIsolate(); 22288 v8::Isolate* isolate = context->GetIsolate();
22275 v8::HandleScope scope(isolate); 22289 v8::HandleScope scope(isolate);
22276 Local<Object> global = context->Global(); 22290 Local<Object> global = context->Global();
22277 22291
22278 // Creation. 22292 // Creation.
22279 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); 22293 Local<v8::Promise::Resolver> pr =
22280 Local<v8::Promise::Resolver> qr = v8::Promise::Resolver::New(isolate); 22294 v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22295 Local<v8::Promise::Resolver> qr =
22296 v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22281 Local<v8::Promise> p = pr->GetPromise(); 22297 Local<v8::Promise> p = pr->GetPromise();
22282 Local<v8::Promise> q = qr->GetPromise(); 22298 Local<v8::Promise> q = qr->GetPromise();
22283 22299
22284 CHECK(p->IsPromise()); 22300 CHECK(p->IsPromise());
22285 CHECK(q->IsPromise()); 22301 CHECK(q->IsPromise());
22286 22302
22287 pr->Resolve(v8::Integer::New(isolate, 1)); 22303 pr->Resolve(context.local(), v8::Integer::New(isolate, 1)).FromJust();
22288 qr->Resolve(p); 22304 qr->Resolve(context.local(), p).FromJust();
22289 22305
22290 // Chaining non-pending promises. 22306 // Chaining non-pending promises.
22291 CompileRun( 22307 CompileRun(
22292 "var x1 = 0;\n" 22308 "var x1 = 0;\n"
22293 "var x2 = 0;\n" 22309 "var x2 = 0;\n"
22294 "function f1(x) { x1 = x; return x+1 };\n" 22310 "function f1(x) { x1 = x; return x+1 };\n"
22295 "function f2(x) { x2 = x; return x+1 };\n"); 22311 "function f2(x) { x2 = x; return x+1 };\n");
22296 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1"))); 22312 Local<Function> f1 = Local<Function>::Cast(
22297 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2"))); 22313 global->Get(context.local(), v8_str("f1")).ToLocalChecked());
22298 22314 Local<Function> f2 = Local<Function>::Cast(
22299 // TODO(caitp): remove tests once PromiseChain is removed, per bug 3237 22315 global->Get(context.local(), v8_str("f2")).ToLocalChecked());
22300 /* q->Chain(f1);
22301 CHECK(global->Get(v8_str2("x1"))->IsNumber());
22302 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value());
22303 isolate->RunMicrotasks();
22304 CHECK(!global->Get(v8_str("x1"))->IsNumber());
22305 CHECK(p->Equals(global->Get(v8_str("x1")))); */
22306 22316
22307 // Then 22317 // Then
22308 CompileRun("x1 = x2 = 0;"); 22318 CompileRun("x1 = x2 = 0;");
22309 q->Then(f1); 22319 q->Then(context.local(), f1).ToLocalChecked();
22310 CHECK_EQ(0, 22320 CHECK_EQ(0, global->Get(context.local(), v8_str("x1"))
22311 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22321 .ToLocalChecked()
22322 ->Int32Value(context.local())
22323 .FromJust());
22312 isolate->RunMicrotasks(); 22324 isolate->RunMicrotasks();
22313 CHECK_EQ(1, 22325 CHECK_EQ(1, global->Get(context.local(), v8_str("x1"))
22314 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22326 .ToLocalChecked()
22327 ->Int32Value(context.local())
22328 .FromJust());
22315 22329
22316 // Then 22330 // Then
22317 CompileRun("x1 = x2 = 0;"); 22331 CompileRun("x1 = x2 = 0;");
22318 pr = v8::Promise::Resolver::New(isolate); 22332 pr = v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22319 qr = v8::Promise::Resolver::New(isolate); 22333 qr = v8::Promise::Resolver::New(context.local()).ToLocalChecked();
22320 22334
22321 qr->Resolve(pr); 22335 qr->Resolve(context.local(), pr).FromJust();
22322 qr->GetPromise()->Then(f1)->Then(f2); 22336 qr->GetPromise()
22337 ->Then(context.local(), f1)
22338 .ToLocalChecked()
22339 ->Then(context.local(), f2)
22340 .ToLocalChecked();
22323 22341
22324 CHECK_EQ(0, 22342 CHECK_EQ(0, global->Get(context.local(), v8_str("x1"))
22325 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22343 .ToLocalChecked()
22326 CHECK_EQ(0, 22344 ->Int32Value(context.local())
22327 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); 22345 .FromJust());
22346 CHECK_EQ(0, global->Get(context.local(), v8_str("x2"))
22347 .ToLocalChecked()
22348 ->Int32Value(context.local())
22349 .FromJust());
22328 isolate->RunMicrotasks(); 22350 isolate->RunMicrotasks();
22329 CHECK_EQ(0, 22351 CHECK_EQ(0, global->Get(context.local(), v8_str("x1"))
22330 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22352 .ToLocalChecked()
22331 CHECK_EQ(0, 22353 ->Int32Value(context.local())
22332 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); 22354 .FromJust());
22355 CHECK_EQ(0, global->Get(context.local(), v8_str("x2"))
22356 .ToLocalChecked()
22357 ->Int32Value(context.local())
22358 .FromJust());
22333 22359
22334 pr->Resolve(v8::Integer::New(isolate, 3)); 22360 pr->Resolve(context.local(), v8::Integer::New(isolate, 3)).FromJust();
22335 22361
22336 CHECK_EQ(0, 22362 CHECK_EQ(0, global->Get(context.local(), v8_str("x1"))
22337 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22363 .ToLocalChecked()
22338 CHECK_EQ(0, 22364 ->Int32Value(context.local())
22339 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); 22365 .FromJust());
22366 CHECK_EQ(0, global->Get(context.local(), v8_str("x2"))
22367 .ToLocalChecked()
22368 ->Int32Value(context.local())
22369 .FromJust());
22340 isolate->RunMicrotasks(); 22370 isolate->RunMicrotasks();
22341 CHECK_EQ(3, 22371 CHECK_EQ(3, global->Get(context.local(), v8_str("x1"))
22342 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); 22372 .ToLocalChecked()
22343 CHECK_EQ(4, 22373 ->Int32Value(context.local())
22344 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); 22374 .FromJust());
22375 CHECK_EQ(4, global->Get(context.local(), v8_str("x2"))
22376 .ToLocalChecked()
22377 ->Int32Value(context.local())
22378 .FromJust());
22345 } 22379 }
22346 22380
22347 22381
22348 TEST(DisallowJavascriptExecutionScope) { 22382 TEST(DisallowJavascriptExecutionScope) {
22349 LocalContext context; 22383 LocalContext context;
22350 v8::Isolate* isolate = context->GetIsolate(); 22384 v8::Isolate* isolate = context->GetIsolate();
22351 v8::HandleScope scope(isolate); 22385 v8::HandleScope scope(isolate);
22352 v8::Isolate::DisallowJavascriptExecutionScope no_js( 22386 v8::Isolate::DisallowJavascriptExecutionScope no_js(
22353 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE); 22387 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE);
22354 CompileRun("2+2"); 22388 CompileRun("2+2");
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
22427 CompileRun("Object.getPrototypeOf(friend);"); 22461 CompileRun("Object.getPrototypeOf(friend);");
22428 CHECK_EQ(2, access_count); 22462 CHECK_EQ(2, access_count);
22429 } 22463 }
22430 22464
22431 22465
22432 TEST(CaptureStackTraceForStackOverflow) { 22466 TEST(CaptureStackTraceForStackOverflow) {
22433 v8::internal::FLAG_stack_size = 150; 22467 v8::internal::FLAG_stack_size = 150;
22434 LocalContext current; 22468 LocalContext current;
22435 v8::Isolate* isolate = current->GetIsolate(); 22469 v8::Isolate* isolate = current->GetIsolate();
22436 v8::HandleScope scope(isolate); 22470 v8::HandleScope scope(isolate);
22437 V8::SetCaptureStackTraceForUncaughtExceptions( 22471 isolate->SetCaptureStackTraceForUncaughtExceptions(true, 10,
22438 true, 10, v8::StackTrace::kDetailed); 22472 v8::StackTrace::kDetailed);
22439 v8::TryCatch try_catch(isolate); 22473 v8::TryCatch try_catch(isolate);
22440 CompileRun("(function f(x) { f(x+1); })(0)"); 22474 CompileRun("(function f(x) { f(x+1); })(0)");
22441 CHECK(try_catch.HasCaught()); 22475 CHECK(try_catch.HasCaught());
22442 } 22476 }
22443 22477
22444 22478
22445 TEST(ScriptNameAndLineNumber) { 22479 TEST(ScriptNameAndLineNumber) {
22446 LocalContext env; 22480 LocalContext env;
22447 v8::Isolate* isolate = env->GetIsolate(); 22481 v8::Isolate* isolate = env->GetIsolate();
22448 v8::HandleScope scope(isolate); 22482 v8::HandleScope scope(isolate);
22449 const char* url = "http://www.foo.com/foo.js"; 22483 const char* url = "http://www.foo.com/foo.js";
22450 v8::ScriptOrigin origin(v8_str(url), v8::Integer::New(isolate, 13)); 22484 v8::ScriptOrigin origin(v8_str(url), v8::Integer::New(isolate, 13));
22451 v8::ScriptCompiler::Source script_source(v8_str("var foo;"), origin); 22485 v8::ScriptCompiler::Source script_source(v8_str("var foo;"), origin);
22452 Local<Script> script = v8::ScriptCompiler::Compile( 22486 Local<Script> script =
22453 isolate, &script_source); 22487 v8::ScriptCompiler::Compile(env.local(), &script_source).ToLocalChecked();
22454 Local<Value> script_name = script->GetUnboundScript()->GetScriptName(); 22488 Local<Value> script_name = script->GetUnboundScript()->GetScriptName();
22455 CHECK(!script_name.IsEmpty()); 22489 CHECK(!script_name.IsEmpty());
22456 CHECK(script_name->IsString()); 22490 CHECK(script_name->IsString());
22457 String::Utf8Value utf8_name(script_name); 22491 String::Utf8Value utf8_name(script_name);
22458 CHECK_EQ(0, strcmp(url, *utf8_name)); 22492 CHECK_EQ(0, strcmp(url, *utf8_name));
22459 int line_number = script->GetUnboundScript()->GetLineNumber(0); 22493 int line_number = script->GetUnboundScript()->GetLineNumber(0);
22460 CHECK_EQ(13, line_number); 22494 CHECK_EQ(13, line_number);
22461 } 22495 }
22462 22496
22463 void CheckMagicComments(Local<Script> script, const char* expected_source_url, 22497 void CheckMagicComments(Local<Script> script, const char* expected_source_url,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
22551 LocalContext env; 22585 LocalContext env;
22552 v8::Isolate* isolate = env->GetIsolate(); 22586 v8::Isolate* isolate = env->GetIsolate();
22553 v8::HandleScope scope(isolate); 22587 v8::HandleScope scope(isolate);
22554 CompileRun( 22588 CompileRun(
22555 "var x = { value : 13};" 22589 "var x = { value : 13};"
22556 "Object.defineProperty(x, 'p0', {value : 12});" 22590 "Object.defineProperty(x, 'p0', {value : 12});"
22557 "Object.defineProperty(x, 'p1', {" 22591 "Object.defineProperty(x, 'p1', {"
22558 " set : function(value) { this.value = value; }," 22592 " set : function(value) { this.value = value; },"
22559 " get : function() { return this.value; }," 22593 " get : function() { return this.value; },"
22560 "});"); 22594 "});");
22561 Local<Object> x = Local<Object>::Cast(env->Global()->Get(v8_str("x"))); 22595 Local<Object> x = Local<Object>::Cast(
22562 Local<Value> desc = x->GetOwnPropertyDescriptor(v8_str("no_prop")); 22596 env->Global()->Get(env.local(), v8_str("x")).ToLocalChecked());
22597 Local<Value> desc =
22598 x->GetOwnPropertyDescriptor(env.local(), v8_str("no_prop"))
22599 .ToLocalChecked();
22563 CHECK(desc->IsUndefined()); 22600 CHECK(desc->IsUndefined());
22564 desc = x->GetOwnPropertyDescriptor(v8_str("p0")); 22601 desc =
22565 CHECK(v8_num(12)->Equals(Local<Object>::Cast(desc)->Get(v8_str("value")))); 22602 x->GetOwnPropertyDescriptor(env.local(), v8_str("p0")).ToLocalChecked();
22566 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); 22603 CHECK(v8_num(12)
22604 ->Equals(env.local(), Local<Object>::Cast(desc)
22605 ->Get(env.local(), v8_str("value"))
22606 .ToLocalChecked())
22607 .FromJust());
22608 desc =
22609 x->GetOwnPropertyDescriptor(env.local(), v8_str("p1")).ToLocalChecked();
22567 Local<Function> set = 22610 Local<Function> set =
22568 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); 22611 Local<Function>::Cast(Local<Object>::Cast(desc)
22612 ->Get(env.local(), v8_str("set"))
22613 .ToLocalChecked());
22569 Local<Function> get = 22614 Local<Function> get =
22570 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); 22615 Local<Function>::Cast(Local<Object>::Cast(desc)
22571 CHECK(v8_num(13)->Equals(get->Call(x, 0, NULL))); 22616 ->Get(env.local(), v8_str("get"))
22617 .ToLocalChecked());
22618 CHECK(v8_num(13)
22619 ->Equals(env.local(),
22620 get->Call(env.local(), x, 0, NULL).ToLocalChecked())
22621 .FromJust());
22572 Local<Value> args[] = {v8_num(14)}; 22622 Local<Value> args[] = {v8_num(14)};
22573 set->Call(x, 1, args); 22623 set->Call(env.local(), x, 1, args).ToLocalChecked();
22574 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); 22624 CHECK(v8_num(14)
22625 ->Equals(env.local(),
22626 get->Call(env.local(), x, 0, NULL).ToLocalChecked())
22627 .FromJust());
22575 } 22628 }
22576 22629
22577 22630
22578 TEST(Regress411877) { 22631 TEST(Regress411877) {
22579 v8::Isolate* isolate = CcTest::isolate(); 22632 v8::Isolate* isolate = CcTest::isolate();
22580 v8::HandleScope handle_scope(isolate); 22633 v8::HandleScope handle_scope(isolate);
22581 v8::Local<v8::ObjectTemplate> object_template = 22634 v8::Local<v8::ObjectTemplate> object_template =
22582 v8::ObjectTemplate::New(isolate); 22635 v8::ObjectTemplate::New(isolate);
22583 object_template->SetAccessCheckCallback(AccessCounter); 22636 object_template->SetAccessCheckCallback(AccessCounter);
22584 22637
(...skipping 13 matching lines...) Expand all
22598 v8::HandleScope handle_scope(isolate); 22651 v8::HandleScope handle_scope(isolate);
22599 v8::Local<v8::ObjectTemplate> object_template = 22652 v8::Local<v8::ObjectTemplate> object_template =
22600 v8::ObjectTemplate::New(isolate); 22653 v8::ObjectTemplate::New(isolate);
22601 object_template->SetAccessCheckCallback(AccessCounter); 22654 object_template->SetAccessCheckCallback(AccessCounter);
22602 22655
22603 v8::Local<Context> context = Context::New(isolate); 22656 v8::Local<Context> context = Context::New(isolate);
22604 v8::Context::Scope context_scope(context); 22657 v8::Context::Scope context_scope(context);
22605 22658
22606 v8::Local<v8::Object> obj = 22659 v8::Local<v8::Object> obj =
22607 object_template->NewInstance(context).ToLocalChecked(); 22660 object_template->NewInstance(context).ToLocalChecked();
22608 obj->Set(v8_str("key"), v8_str("value")); 22661 obj->Set(context, v8_str("key"), v8_str("value")).FromJust();
22609 obj->Delete(v8_str("key")); 22662 obj->Delete(context, v8_str("key")).FromJust();
22610 22663
22611 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")), 22664 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")),
22612 v8_str("hidden value 2")) 22665 v8_str("hidden value 2"))
22613 .FromJust(); 22666 .FromJust();
22614 } 22667 }
22615 22668
22616 22669
22617 TEST(Regress411793) { 22670 TEST(Regress411793) {
22618 v8::Isolate* isolate = CcTest::isolate(); 22671 v8::Isolate* isolate = CcTest::isolate();
22619 v8::HandleScope handle_scope(isolate); 22672 v8::HandleScope handle_scope(isolate);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
22696 // TestSourceStream::GetMoreData won't block, so it's OK to just run the 22749 // TestSourceStream::GetMoreData won't block, so it's OK to just run the
22697 // task here in the main thread. 22750 // task here in the main thread.
22698 task->Run(); 22751 task->Run();
22699 delete task; 22752 delete task;
22700 22753
22701 // Possible errors are only produced while compiling. 22754 // Possible errors are only produced while compiling.
22702 CHECK_EQ(false, try_catch.HasCaught()); 22755 CHECK_EQ(false, try_catch.HasCaught());
22703 22756
22704 v8::ScriptOrigin origin(v8_str("http://foo.com")); 22757 v8::ScriptOrigin origin(v8_str("http://foo.com"));
22705 char* full_source = TestSourceStream::FullSourceString(chunks); 22758 char* full_source = TestSourceStream::FullSourceString(chunks);
22706 v8::Local<Script> script = v8::ScriptCompiler::Compile( 22759 v8::MaybeLocal<Script> script = v8::ScriptCompiler::Compile(
22707 isolate, &source, v8_str(full_source), origin); 22760 env.local(), &source, v8_str(full_source), origin);
22708 if (expected_success) { 22761 if (expected_success) {
22709 CHECK(!script.IsEmpty()); 22762 CHECK(!script.IsEmpty());
22710 v8::Local<Value> result(script->Run()); 22763 v8::Local<Value> result(
22764 script.ToLocalChecked()->Run(env.local()).ToLocalChecked());
22711 // All scripts are supposed to return the fixed value 13 when ran. 22765 // All scripts are supposed to return the fixed value 13 when ran.
22712 CHECK_EQ(13, result->Int32Value(env.local()).FromJust()); 22766 CHECK_EQ(13, result->Int32Value(env.local()).FromJust());
22713 CheckMagicComments(script, expected_source_url, 22767 CheckMagicComments(script.ToLocalChecked(), expected_source_url,
22714 expected_source_mapping_url); 22768 expected_source_mapping_url);
22715 } else { 22769 } else {
22716 CHECK(script.IsEmpty()); 22770 CHECK(script.IsEmpty());
22717 CHECK(try_catch.HasCaught()); 22771 CHECK(try_catch.HasCaught());
22718 } 22772 }
22719 delete[] full_source; 22773 delete[] full_source;
22720 } 22774 }
22721 22775
22722 22776
22723 TEST(StreamingSimpleScript) { 22777 TEST(StreamingSimpleScript) {
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
22971 task->Run(); 23025 task->Run();
22972 delete task; 23026 delete task;
22973 23027
22974 CHECK(!try_catch.HasCaught()); 23028 CHECK(!try_catch.HasCaught());
22975 23029
22976 v8::ScriptOrigin origin(v8_str("http://foo.com")); 23030 v8::ScriptOrigin origin(v8_str("http://foo.com"));
22977 char* full_source = TestSourceStream::FullSourceString(chunks); 23031 char* full_source = TestSourceStream::FullSourceString(chunks);
22978 23032
22979 EnableDebugger(isolate); 23033 EnableDebugger(isolate);
22980 23034
22981 v8::Local<Script> script = v8::ScriptCompiler::Compile( 23035 v8::Local<Script> script =
22982 isolate, &source, v8_str(full_source), origin); 23036 v8::ScriptCompiler::Compile(env.local(), &source, v8_str(full_source),
23037 origin)
23038 .ToLocalChecked();
22983 23039
22984 Maybe<uint32_t> result = 23040 Maybe<uint32_t> result =
22985 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local()); 23041 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local());
22986 CHECK_EQ(3U, result.FromMaybe(0)); 23042 CHECK_EQ(3U, result.FromMaybe(0));
22987 23043
22988 delete[] full_source; 23044 delete[] full_source;
22989 23045
22990 DisableDebugger(isolate); 23046 DisableDebugger(isolate);
22991 } 23047 }
22992 23048
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
23075 v8::ScriptCompiler::StartStreamingScript(isolate, &source); 23131 v8::ScriptCompiler::StartStreamingScript(isolate, &source);
23076 task->Run(); 23132 task->Run();
23077 delete task; 23133 delete task;
23078 23134
23079 // Parsing should succeed (the script will be parsed and compiled in a context 23135 // Parsing should succeed (the script will be parsed and compiled in a context
23080 // independent way, so the error is not detected). 23136 // independent way, so the error is not detected).
23081 CHECK_EQ(false, try_catch.HasCaught()); 23137 CHECK_EQ(false, try_catch.HasCaught());
23082 23138
23083 v8::ScriptOrigin origin(v8_str("http://foo.com")); 23139 v8::ScriptOrigin origin(v8_str("http://foo.com"));
23084 char* full_source = TestSourceStream::FullSourceString(chunks); 23140 char* full_source = TestSourceStream::FullSourceString(chunks);
23085 v8::Local<Script> script = v8::ScriptCompiler::Compile( 23141 v8::Local<Script> script =
23086 isolate, &source, v8_str(full_source), origin); 23142 v8::ScriptCompiler::Compile(env.local(), &source, v8_str(full_source),
23143 origin)
23144 .ToLocalChecked();
23087 CHECK(!script.IsEmpty()); 23145 CHECK(!script.IsEmpty());
23088 CHECK_EQ(false, try_catch.HasCaught()); 23146 CHECK_EQ(false, try_catch.HasCaught());
23089 23147
23090 // Running the script exposes the error. 23148 // Running the script exposes the error.
23091 v8::Local<Value> result(script->Run()); 23149 CHECK(script->Run(env.local()).IsEmpty());
23092 CHECK(result.IsEmpty());
23093 CHECK(try_catch.HasCaught()); 23150 CHECK(try_catch.HasCaught());
23094 delete[] full_source; 23151 delete[] full_source;
23095 } 23152 }
23096 23153
23097 23154
23098 TEST(CodeCache) { 23155 TEST(CodeCache) {
23099 v8::Isolate::CreateParams create_params; 23156 v8::Isolate::CreateParams create_params;
23100 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 23157 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
23101 23158
23102 const char* source = "Math.sqrt(4)"; 23159 const char* source = "Math.sqrt(4)";
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
23134 v8::ScriptCompiler::Source source(source_string, script_origin, cache); 23191 v8::ScriptCompiler::Source source(source_string, script_origin, cache);
23135 v8::ScriptCompiler::CompileOptions option = 23192 v8::ScriptCompiler::CompileOptions option =
23136 v8::ScriptCompiler::kConsumeCodeCache; 23193 v8::ScriptCompiler::kConsumeCodeCache;
23137 v8::Local<v8::Script> script; 23194 v8::Local<v8::Script> script;
23138 { 23195 {
23139 i::DisallowCompilation no_compile( 23196 i::DisallowCompilation no_compile(
23140 reinterpret_cast<i::Isolate*>(isolate2)); 23197 reinterpret_cast<i::Isolate*>(isolate2));
23141 script = v8::ScriptCompiler::Compile(context, &source, option) 23198 script = v8::ScriptCompiler::Compile(context, &source, option)
23142 .ToLocalChecked(); 23199 .ToLocalChecked();
23143 } 23200 }
23144 CHECK_EQ(2, 23201 CHECK_EQ(2, script->Run(context)
23145 script->Run()->ToInt32(isolate2)->Int32Value(context).FromJust()); 23202 .ToLocalChecked()
23203 ->ToInt32(context)
23204 .ToLocalChecked()
23205 ->Int32Value(context)
23206 .FromJust());
23146 } 23207 }
23147 isolate2->Dispose(); 23208 isolate2->Dispose();
23148 } 23209 }
23149 23210
23150 23211
23151 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { 23212 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) {
23152 const char* garbage = "garbage garbage garbage garbage garbage garbage"; 23213 const char* garbage = "garbage garbage garbage garbage garbage garbage";
23153 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); 23214 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage);
23154 int length = 16; 23215 int length = 16;
23155 v8::ScriptCompiler::CachedData* cached_data = 23216 v8::ScriptCompiler::CachedData* cached_data =
23156 new v8::ScriptCompiler::CachedData(data, length); 23217 new v8::ScriptCompiler::CachedData(data, length);
23157 CHECK(!cached_data->rejected); 23218 CHECK(!cached_data->rejected);
23158 v8::ScriptOrigin origin(v8_str("origin")); 23219 v8::ScriptOrigin origin(v8_str("origin"));
23159 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); 23220 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data);
23221 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
23160 v8::Local<v8::Script> script = 23222 v8::Local<v8::Script> script =
23161 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); 23223 v8::ScriptCompiler::Compile(context, &source, option).ToLocalChecked();
23162 CHECK(cached_data->rejected); 23224 CHECK(cached_data->rejected);
23163 CHECK_EQ(42, script->Run() 23225 CHECK_EQ(
23164 ->Int32Value(CcTest::isolate()->GetCurrentContext()) 23226 42,
23165 .FromJust()); 23227 script->Run(context).ToLocalChecked()->Int32Value(context).FromJust());
23166 } 23228 }
23167 23229
23168 23230
23169 TEST(InvalidCacheData) { 23231 TEST(InvalidCacheData) {
23170 v8::V8::Initialize(); 23232 v8::V8::Initialize();
23171 v8::HandleScope scope(CcTest::isolate()); 23233 v8::HandleScope scope(CcTest::isolate());
23172 LocalContext context; 23234 LocalContext context;
23173 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); 23235 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache);
23174 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); 23236 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache);
23175 } 23237 }
23176 23238
23177 23239
23178 TEST(ParserCacheRejectedGracefully) { 23240 TEST(ParserCacheRejectedGracefully) {
23179 i::FLAG_min_preparse_length = 0; 23241 i::FLAG_min_preparse_length = 0;
23180 v8::V8::Initialize(); 23242 v8::V8::Initialize();
23181 v8::HandleScope scope(CcTest::isolate()); 23243 v8::HandleScope scope(CcTest::isolate());
23182 LocalContext context; 23244 LocalContext context;
23183 // Produce valid cached data. 23245 // Produce valid cached data.
23184 v8::ScriptOrigin origin(v8_str("origin")); 23246 v8::ScriptOrigin origin(v8_str("origin"));
23185 v8::Local<v8::String> source_str = v8_str("function foo() {}"); 23247 v8::Local<v8::String> source_str = v8_str("function foo() {}");
23186 v8::ScriptCompiler::Source source(source_str, origin); 23248 v8::ScriptCompiler::Source source(source_str, origin);
23187 v8::Local<v8::Script> script = v8::ScriptCompiler::Compile( 23249 v8::Local<v8::Script> script =
23188 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache); 23250 v8::ScriptCompiler::Compile(context.local(), &source,
23189 CHECK(!script.IsEmpty()); 23251 v8::ScriptCompiler::kProduceParserCache)
23252 .ToLocalChecked();
23253 USE(script);
23190 const v8::ScriptCompiler::CachedData* original_cached_data = 23254 const v8::ScriptCompiler::CachedData* original_cached_data =
23191 source.GetCachedData(); 23255 source.GetCachedData();
23192 CHECK(original_cached_data != NULL); 23256 CHECK(original_cached_data != NULL);
23193 CHECK(original_cached_data->data != NULL); 23257 CHECK(original_cached_data->data != NULL);
23194 CHECK(!original_cached_data->rejected); 23258 CHECK(!original_cached_data->rejected);
23195 CHECK_GT(original_cached_data->length, 0); 23259 CHECK_GT(original_cached_data->length, 0);
23196 // Recompiling the same script with it won't reject the data. 23260 // Recompiling the same script with it won't reject the data.
23197 { 23261 {
23198 v8::ScriptCompiler::Source source_with_cached_data( 23262 v8::ScriptCompiler::Source source_with_cached_data(
23199 source_str, origin, 23263 source_str, origin,
23200 new v8::ScriptCompiler::CachedData(original_cached_data->data, 23264 new v8::ScriptCompiler::CachedData(original_cached_data->data,
23201 original_cached_data->length)); 23265 original_cached_data->length));
23202 v8::Local<v8::Script> script = 23266 v8::Local<v8::Script> script =
23203 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, 23267 v8::ScriptCompiler::Compile(context.local(), &source_with_cached_data,
23204 v8::ScriptCompiler::kConsumeParserCache); 23268 v8::ScriptCompiler::kConsumeParserCache)
23205 CHECK(!script.IsEmpty()); 23269 .ToLocalChecked();
23270 USE(script);
23206 const v8::ScriptCompiler::CachedData* new_cached_data = 23271 const v8::ScriptCompiler::CachedData* new_cached_data =
23207 source_with_cached_data.GetCachedData(); 23272 source_with_cached_data.GetCachedData();
23208 CHECK(new_cached_data != NULL); 23273 CHECK(new_cached_data != NULL);
23209 CHECK(!new_cached_data->rejected); 23274 CHECK(!new_cached_data->rejected);
23210 } 23275 }
23211 // Compile an incompatible script with the cached data. The new script doesn't 23276 // Compile an incompatible script with the cached data. The new script doesn't
23212 // have the same starting position for the function as the old one, so the old 23277 // have the same starting position for the function as the old one, so the old
23213 // cached data will be incompatible with it and will be rejected. 23278 // cached data will be incompatible with it and will be rejected.
23214 { 23279 {
23215 v8::Local<v8::String> incompatible_source_str = 23280 v8::Local<v8::String> incompatible_source_str =
23216 v8_str(" function foo() {}"); 23281 v8_str(" function foo() {}");
23217 v8::ScriptCompiler::Source source_with_cached_data( 23282 v8::ScriptCompiler::Source source_with_cached_data(
23218 incompatible_source_str, origin, 23283 incompatible_source_str, origin,
23219 new v8::ScriptCompiler::CachedData(original_cached_data->data, 23284 new v8::ScriptCompiler::CachedData(original_cached_data->data,
23220 original_cached_data->length)); 23285 original_cached_data->length));
23221 v8::Local<v8::Script> script = 23286 v8::Local<v8::Script> script =
23222 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, 23287 v8::ScriptCompiler::Compile(context.local(), &source_with_cached_data,
23223 v8::ScriptCompiler::kConsumeParserCache); 23288 v8::ScriptCompiler::kConsumeParserCache)
23224 CHECK(!script.IsEmpty()); 23289 .ToLocalChecked();
23290 USE(script);
23225 const v8::ScriptCompiler::CachedData* new_cached_data = 23291 const v8::ScriptCompiler::CachedData* new_cached_data =
23226 source_with_cached_data.GetCachedData(); 23292 source_with_cached_data.GetCachedData();
23227 CHECK(new_cached_data != NULL); 23293 CHECK(new_cached_data != NULL);
23228 CHECK(new_cached_data->rejected); 23294 CHECK(new_cached_data->rejected);
23229 } 23295 }
23230 } 23296 }
23231 23297
23232 23298
23233 TEST(StringConcatOverflow) { 23299 TEST(StringConcatOverflow) {
23234 v8::V8::Initialize(); 23300 v8::V8::Initialize();
23235 v8::HandleScope scope(CcTest::isolate()); 23301 v8::HandleScope scope(CcTest::isolate());
23236 RandomLengthOneByteResource* r = 23302 RandomLengthOneByteResource* r =
23237 new RandomLengthOneByteResource(i::String::kMaxLength); 23303 new RandomLengthOneByteResource(i::String::kMaxLength);
23238 v8::Local<v8::String> str = v8::String::NewExternal(CcTest::isolate(), r); 23304 v8::Local<v8::String> str =
23305 v8::String::NewExternalOneByte(CcTest::isolate(), r).ToLocalChecked();
23239 CHECK(!str.IsEmpty()); 23306 CHECK(!str.IsEmpty());
23240 v8::TryCatch try_catch(CcTest::isolate()); 23307 v8::TryCatch try_catch(CcTest::isolate());
23241 v8::Local<v8::String> result = v8::String::Concat(str, str); 23308 v8::Local<v8::String> result = v8::String::Concat(str, str);
23242 CHECK(result.IsEmpty()); 23309 CHECK(result.IsEmpty());
23243 CHECK(!try_catch.HasCaught()); 23310 CHECK(!try_catch.HasCaught());
23244 } 23311 }
23245 23312
23246 23313
23247 TEST(TurboAsmDisablesNeuter) { 23314 TEST(TurboAsmDisablesNeuter) {
23248 v8::V8::Initialize(); 23315 v8::V8::Initialize();
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
23309 LocalContext env; 23376 LocalContext env;
23310 23377
23311 Local<FunctionTemplate> t = FunctionTemplate::New(isolate); 23378 Local<FunctionTemplate> t = FunctionTemplate::New(isolate);
23312 t->SetHiddenPrototype(true); 23379 t->SetHiddenPrototype(true);
23313 Local<Object> proto = t->GetFunction(env.local()) 23380 Local<Object> proto = t->GetFunction(env.local())
23314 .ToLocalChecked() 23381 .ToLocalChecked()
23315 ->NewInstance(env.local()) 23382 ->NewInstance(env.local())
23316 .ToLocalChecked(); 23383 .ToLocalChecked();
23317 Local<Object> object = Object::New(isolate); 23384 Local<Object> object = Object::New(isolate);
23318 Local<Object> proto2 = Object::New(isolate); 23385 Local<Object> proto2 = Object::New(isolate);
23319 object->SetPrototype(proto); 23386 object->SetPrototype(env.local(), proto).FromJust();
23320 proto->SetPrototype(proto2); 23387 proto->SetPrototype(env.local(), proto2).FromJust();
23321 23388
23322 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust()); 23389 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust());
23323 CHECK(env->Global()->Set(env.local(), v8_str("proto"), proto).FromJust()); 23390 CHECK(env->Global()->Set(env.local(), v8_str("proto"), proto).FromJust());
23324 CHECK(env->Global()->Set(env.local(), v8_str("proto2"), proto2).FromJust()); 23391 CHECK(env->Global()->Set(env.local(), v8_str("proto2"), proto2).FromJust());
23325 23392
23326 v8::Local<v8::Value> result = CompileRun("%_GetPrototype(object)"); 23393 v8::Local<v8::Value> result = CompileRun("%_GetPrototype(object)");
23327 CHECK(result->Equals(proto2)); 23394 CHECK(result->Equals(env.local(), proto2).FromJust());
23328 23395
23329 result = CompileRun( 23396 result = CompileRun(
23330 "function f() { return %_GetPrototype(object); }" 23397 "function f() { return %_GetPrototype(object); }"
23331 "%OptimizeFunctionOnNextCall(f);" 23398 "%OptimizeFunctionOnNextCall(f);"
23332 "f()"); 23399 "f()");
23333 CHECK(result->Equals(proto2)); 23400 CHECK(result->Equals(env.local(), proto2).FromJust());
23334 } 23401 }
23335 23402
23336 23403
23337 TEST(ClassPrototypeCreationContext) { 23404 TEST(ClassPrototypeCreationContext) {
23338 v8::Isolate* isolate = CcTest::isolate(); 23405 v8::Isolate* isolate = CcTest::isolate();
23339 v8::HandleScope handle_scope(isolate); 23406 v8::HandleScope handle_scope(isolate);
23340 LocalContext env; 23407 LocalContext env;
23341 23408
23342 Local<Object> result = Local<Object>::Cast( 23409 Local<Object> result = Local<Object>::Cast(
23343 CompileRun("'use strict'; class Example { }; Example.prototype")); 23410 CompileRun("'use strict'; class Example { }; Example.prototype"));
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
23463 23530
23464 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); 23531 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
23465 23532
23466 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 23533 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
23467 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag); 23534 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag);
23468 23535
23469 // Create an environment 23536 // Create an environment
23470 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 23537 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
23471 context0->Enter(); 23538 context0->Enter();
23472 v8::Local<v8::Object> global0 = context0->Global(); 23539 v8::Local<v8::Object> global0 = context0->Global();
23473 global0->Set(v8_str("object"), 23540 global0->Set(context0, v8_str("object"),
23474 obj_template->NewInstance(context0).ToLocalChecked()); 23541 obj_template->NewInstance(context0).ToLocalChecked())
23542 .FromJust();
23475 { 23543 {
23476 v8::TryCatch try_catch(isolate); 23544 v8::TryCatch try_catch(isolate);
23477 value = CompileRun("'use strong'; object.x"); 23545 value = CompileRun("'use strong'; object.x");
23478 CHECK(!try_catch.HasCaught()); 23546 CHECK(!try_catch.HasCaught());
23479 CHECK(!access_was_called); 23547 CHECK(!access_was_called);
23480 CHECK_EQ(42, value->Int32Value(context0).FromJust()); 23548 CHECK_EQ(42, value->Int32Value(context0).FromJust());
23481 } 23549 }
23482 { 23550 {
23483 v8::TryCatch try_catch(isolate); 23551 v8::TryCatch try_catch(isolate);
23484 value = CompileRun("'use strong'; object.foo"); 23552 value = CompileRun("'use strong'; object.foo");
23485 CHECK(try_catch.HasCaught()); 23553 CHECK(try_catch.HasCaught());
23486 CHECK(!access_was_called); 23554 CHECK(!access_was_called);
23487 } 23555 }
23488 { 23556 {
23489 v8::TryCatch try_catch(isolate); 23557 v8::TryCatch try_catch(isolate);
23490 value = CompileRun("'use strong'; object[10]"); 23558 value = CompileRun("'use strong'; object[10]");
23491 CHECK(try_catch.HasCaught()); 23559 CHECK(try_catch.HasCaught());
23492 CHECK(!access_was_called); 23560 CHECK(!access_was_called);
23493 } 23561 }
23494 23562
23495 // Create an environment 23563 // Create an environment
23496 v8::Local<Context> context1 = Context::New(isolate); 23564 v8::Local<Context> context1 = Context::New(isolate);
23497 context1->Enter(); 23565 context1->Enter();
23498 v8::Local<v8::Object> global1 = context1->Global(); 23566 v8::Local<v8::Object> global1 = context1->Global();
23499 global1->Set(v8_str("object"), 23567 global1->Set(context1, v8_str("object"),
23500 obj_template->NewInstance(context1).ToLocalChecked()); 23568 obj_template->NewInstance(context1).ToLocalChecked())
23569 .FromJust();
23501 { 23570 {
23502 v8::TryCatch try_catch(isolate); 23571 v8::TryCatch try_catch(isolate);
23503 value = CompileRun("'use strong'; object.x"); 23572 value = CompileRun("'use strong'; object.x");
23504 CHECK(!try_catch.HasCaught()); 23573 CHECK(!try_catch.HasCaught());
23505 CHECK(access_was_called); 23574 CHECK(access_was_called);
23506 CHECK_EQ(42, value->Int32Value(context1).FromJust()); 23575 CHECK_EQ(42, value->Int32Value(context1).FromJust());
23507 } 23576 }
23508 access_was_called = false; 23577 access_was_called = false;
23509 { 23578 {
23510 v8::TryCatch try_catch(isolate); 23579 v8::TryCatch try_catch(isolate);
(...skipping 23 matching lines...) Expand all
23534 23603
23535 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); 23604 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
23536 23605
23537 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 23606 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
23538 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag); 23607 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag);
23539 23608
23540 // Create an environment 23609 // Create an environment
23541 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 23610 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
23542 context0->Enter(); 23611 context0->Enter();
23543 v8::Local<v8::Object> global0 = context0->Global(); 23612 v8::Local<v8::Object> global0 = context0->Global();
23544 global0->Set(v8_str("object"), 23613 global0->Set(context0, v8_str("object"),
23545 obj_template->NewInstance(context0).ToLocalChecked()); 23614 obj_template->NewInstance(context0).ToLocalChecked())
23615 .FromJust();
23546 { 23616 {
23547 v8::TryCatch try_catch(isolate); 23617 v8::TryCatch try_catch(isolate);
23548 value = CompileRun("'use strong'; object.x"); 23618 value = CompileRun("'use strong'; object.x");
23549 CHECK(!try_catch.HasCaught()); 23619 CHECK(!try_catch.HasCaught());
23550 CHECK(!access_was_called); 23620 CHECK(!access_was_called);
23551 CHECK_EQ(42, value->Int32Value(context0).FromJust()); 23621 CHECK_EQ(42, value->Int32Value(context0).FromJust());
23552 } 23622 }
23553 { 23623 {
23554 v8::TryCatch try_catch(isolate); 23624 v8::TryCatch try_catch(isolate);
23555 value = CompileRun("'use strong'; object.foo"); 23625 value = CompileRun("'use strong'; object.foo");
23556 CHECK(try_catch.HasCaught()); 23626 CHECK(try_catch.HasCaught());
23557 CHECK(!access_was_called); 23627 CHECK(!access_was_called);
23558 } 23628 }
23559 { 23629 {
23560 v8::TryCatch try_catch(isolate); 23630 v8::TryCatch try_catch(isolate);
23561 value = CompileRun("'use strong'; object[10]"); 23631 value = CompileRun("'use strong'; object[10]");
23562 CHECK(try_catch.HasCaught()); 23632 CHECK(try_catch.HasCaught());
23563 CHECK(!access_was_called); 23633 CHECK(!access_was_called);
23564 } 23634 }
23565 23635
23566 // Create an environment 23636 // Create an environment
23567 v8::Local<Context> context1 = Context::New(isolate); 23637 v8::Local<Context> context1 = Context::New(isolate);
23568 context1->Enter(); 23638 context1->Enter();
23569 v8::Local<v8::Object> global1 = context1->Global(); 23639 v8::Local<v8::Object> global1 = context1->Global();
23570 global1->Set(v8_str("object"), 23640 global1->Set(context1, v8_str("object"),
23571 obj_template->NewInstance(context1).ToLocalChecked()); 23641 obj_template->NewInstance(context1).ToLocalChecked())
23642 .FromJust();
23572 { 23643 {
23573 v8::TryCatch try_catch(isolate); 23644 v8::TryCatch try_catch(isolate);
23574 value = CompileRun("'use strong'; object.x"); 23645 value = CompileRun("'use strong'; object.x");
23575 CHECK(try_catch.HasCaught()); 23646 CHECK(try_catch.HasCaught());
23576 CHECK(access_was_called); 23647 CHECK(access_was_called);
23577 } 23648 }
23578 access_was_called = false; 23649 access_was_called = false;
23579 { 23650 {
23580 v8::TryCatch try_catch(isolate); 23651 v8::TryCatch try_catch(isolate);
23581 value = CompileRun("'use strong'; object.foo"); 23652 value = CompileRun("'use strong'; object.foo");
(...skipping 23 matching lines...) Expand all
23605 v8::TryCatch try_catch(isolate); 23676 v8::TryCatch try_catch(isolate);
23606 fun = Local<Function>::Cast(CompileRun( 23677 fun = Local<Function>::Cast(CompileRun(
23607 "function f(x) { 'use strong'; }" 23678 "function f(x) { 'use strong'; }"
23608 "f")); 23679 "f"));
23609 23680
23610 CHECK(!try_catch.HasCaught()); 23681 CHECK(!try_catch.HasCaught());
23611 } 23682 }
23612 23683
23613 { 23684 {
23614 v8::TryCatch try_catch(isolate); 23685 v8::TryCatch try_catch(isolate);
23615 fun->Call(v8::Undefined(isolate), 0, nullptr); 23686 CHECK(fun->Call(env.local(), v8::Undefined(isolate), 0, nullptr).IsEmpty());
23616 CHECK(try_catch.HasCaught()); 23687 CHECK(try_catch.HasCaught());
23617 } 23688 }
23618 23689
23619 { 23690 {
23620 v8::TryCatch try_catch(isolate); 23691 v8::TryCatch try_catch(isolate);
23621 v8::Local<Value> args[] = {v8_num(42)}; 23692 v8::Local<Value> args[] = {v8_num(42)};
23622 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23693 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args)
23694 .ToLocalChecked();
23623 CHECK(!try_catch.HasCaught()); 23695 CHECK(!try_catch.HasCaught());
23624 } 23696 }
23625 23697
23626 { 23698 {
23627 v8::TryCatch try_catch(isolate); 23699 v8::TryCatch try_catch(isolate);
23628 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; 23700 v8::Local<Value> args[] = {v8_num(42), v8_num(555)};
23629 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23701 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args)
23702 .ToLocalChecked();
23630 CHECK(!try_catch.HasCaught()); 23703 CHECK(!try_catch.HasCaught());
23631 } 23704 }
23632 } 23705 }
23633 23706
23634 23707
23635 TEST(StrongModeArityCallFromApi2) { 23708 TEST(StrongModeArityCallFromApi2) {
23636 i::FLAG_strong_mode = true; 23709 i::FLAG_strong_mode = true;
23637 LocalContext env; 23710 LocalContext env;
23638 v8::Isolate* isolate = env->GetIsolate(); 23711 v8::Isolate* isolate = env->GetIsolate();
23639 v8::HandleScope scope(isolate); 23712 v8::HandleScope scope(isolate);
23640 Local<Function> fun; 23713 Local<Function> fun;
23641 { 23714 {
23642 v8::TryCatch try_catch(isolate); 23715 v8::TryCatch try_catch(isolate);
23643 fun = Local<Function>::Cast(CompileRun( 23716 fun = Local<Function>::Cast(CompileRun(
23644 "'use strong';" 23717 "'use strong';"
23645 "function f(x) {}" 23718 "function f(x) {}"
23646 "f")); 23719 "f"));
23647 23720
23648 CHECK(!try_catch.HasCaught()); 23721 CHECK(!try_catch.HasCaught());
23649 } 23722 }
23650 23723
23651 { 23724 {
23652 v8::TryCatch try_catch(isolate); 23725 v8::TryCatch try_catch(isolate);
23653 fun->Call(v8::Undefined(isolate), 0, nullptr); 23726 CHECK(fun->Call(env.local(), v8::Undefined(isolate), 0, nullptr).IsEmpty());
23654 CHECK(try_catch.HasCaught()); 23727 CHECK(try_catch.HasCaught());
23655 } 23728 }
23656 23729
23657 { 23730 {
23658 v8::TryCatch try_catch(isolate); 23731 v8::TryCatch try_catch(isolate);
23659 v8::Local<Value> args[] = {v8_num(42)}; 23732 v8::Local<Value> args[] = {v8_num(42)};
23660 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23733 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args)
23734 .ToLocalChecked();
23661 CHECK(!try_catch.HasCaught()); 23735 CHECK(!try_catch.HasCaught());
23662 } 23736 }
23663 23737
23664 { 23738 {
23665 v8::TryCatch try_catch(isolate); 23739 v8::TryCatch try_catch(isolate);
23666 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; 23740 v8::Local<Value> args[] = {v8_num(42), v8_num(555)};
23667 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23741 fun->Call(env.local(), v8::Undefined(isolate), arraysize(args), args)
23742 .ToLocalChecked();
23668 CHECK(!try_catch.HasCaught()); 23743 CHECK(!try_catch.HasCaught());
23669 } 23744 }
23670 } 23745 }
23671 23746
23672 23747
23673 TEST(StrongObjectDelete) { 23748 TEST(StrongObjectDelete) {
23674 i::FLAG_strong_mode = true; 23749 i::FLAG_strong_mode = true;
23675 LocalContext env; 23750 LocalContext env;
23676 v8::Isolate* isolate = env->GetIsolate(); 23751 v8::Isolate* isolate = env->GetIsolate();
23677 v8::HandleScope scope(isolate); 23752 v8::HandleScope scope(isolate);
23678 Local<Object> obj; 23753 Local<Object> obj;
23679 { 23754 {
23680 v8::TryCatch try_catch(isolate); 23755 v8::TryCatch try_catch(isolate);
23681 obj = Local<Object>::Cast(CompileRun( 23756 obj = Local<Object>::Cast(CompileRun(
23682 "'use strong';" 23757 "'use strong';"
23683 "({});")); 23758 "({});"));
23684 CHECK(!try_catch.HasCaught()); 23759 CHECK(!try_catch.HasCaught());
23685 } 23760 }
23686 obj->ForceSet(v8_str("foo"), v8_num(1), v8::None); 23761 obj->DefineOwnProperty(env.local(), v8_str("foo"), v8_num(1), v8::None)
23687 obj->ForceSet(v8_str("2"), v8_num(1), v8::None); 23762 .FromJust();
23688 CHECK(obj->HasOwnProperty(v8_str("foo"))); 23763 obj->DefineOwnProperty(env.local(), v8_str("2"), v8_num(1), v8::None)
23689 CHECK(obj->HasOwnProperty(v8_str("2"))); 23764 .FromJust();
23690 CHECK(!obj->Delete(v8_str("foo"))); 23765 CHECK(obj->HasOwnProperty(env.local(), v8_str("foo")).FromJust());
23691 CHECK(!obj->Delete(2)); 23766 CHECK(obj->HasOwnProperty(env.local(), v8_str("2")).FromJust());
23767 CHECK(!obj->Delete(env.local(), v8_str("foo")).FromJust());
23768 CHECK(!obj->Delete(env.local(), 2).FromJust());
23692 } 23769 }
23693 23770
23694 23771
23695 static void ExtrasBindingTestRuntimeFunction( 23772 static void ExtrasBindingTestRuntimeFunction(
23696 const v8::FunctionCallbackInfo<v8::Value>& args) { 23773 const v8::FunctionCallbackInfo<v8::Value>& args) {
23697 CHECK_EQ( 23774 CHECK_EQ(
23698 3, 23775 3,
23699 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust()); 23776 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust());
23700 args.GetReturnValue().Set(v8_num(7)); 23777 args.GetReturnValue().Set(v8_num(7));
23701 } 23778 }
23702 23779
23703 23780
23704 TEST(ExtrasBindingObject) { 23781 TEST(ExtrasBindingObject) {
23705 v8::Isolate* isolate = CcTest::isolate(); 23782 v8::Isolate* isolate = CcTest::isolate();
23706 v8::HandleScope handle_scope(isolate); 23783 v8::HandleScope handle_scope(isolate);
23707 LocalContext env; 23784 LocalContext env;
23708 23785
23709 // standalone.gypi ensures we include the test-extra.js file, which should 23786 // standalone.gypi ensures we include the test-extra.js file, which should
23710 // export the tested functions. 23787 // export the tested functions.
23711 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23788 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
23712 23789
23713 auto func = 23790 auto func = binding->Get(env.local(), v8_str("testExtraShouldReturnFive"))
23714 binding->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>(); 23791 .ToLocalChecked()
23792 .As<v8::Function>();
23715 auto undefined = v8::Undefined(isolate); 23793 auto undefined = v8::Undefined(isolate);
23716 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); 23794 auto result = func->Call(env.local(), undefined, 0, {})
23795 .ToLocalChecked()
23796 .As<v8::Number>();
23717 CHECK_EQ(5, result->Int32Value(env.local()).FromJust()); 23797 CHECK_EQ(5, result->Int32Value(env.local()).FromJust());
23718 23798
23719 v8::Local<v8::FunctionTemplate> runtimeFunction = 23799 v8::Local<v8::FunctionTemplate> runtimeFunction =
23720 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); 23800 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction);
23721 binding->Set(v8_str("runtime"), 23801 binding->Set(env.local(), v8_str("runtime"),
23722 runtimeFunction->GetFunction(env.local()).ToLocalChecked()); 23802 runtimeFunction->GetFunction(env.local()).ToLocalChecked())
23723 func = 23803 .FromJust();
23724 binding->Get(v8_str("testExtraShouldCallToRuntime")).As<v8::Function>(); 23804 func = binding->Get(env.local(), v8_str("testExtraShouldCallToRuntime"))
23725 result = func->Call(undefined, 0, {}).As<v8::Number>(); 23805 .ToLocalChecked()
23806 .As<v8::Function>();
23807 result = func->Call(env.local(), undefined, 0, {})
23808 .ToLocalChecked()
23809 .As<v8::Number>();
23726 CHECK_EQ(7, result->Int32Value(env.local()).FromJust()); 23810 CHECK_EQ(7, result->Int32Value(env.local()).FromJust());
23727 } 23811 }
23728 23812
23729 23813
23730 TEST(ExperimentalExtras) { 23814 TEST(ExperimentalExtras) {
23731 i::FLAG_experimental_extras = true; 23815 i::FLAG_experimental_extras = true;
23732 23816
23733 v8::Isolate* isolate = CcTest::isolate(); 23817 v8::Isolate* isolate = CcTest::isolate();
23734 v8::HandleScope handle_scope(isolate); 23818 v8::HandleScope handle_scope(isolate);
23735 LocalContext env; 23819 LocalContext env;
23736 23820
23737 // standalone.gypi ensures we include the test-experimental-extra.js file, 23821 // standalone.gypi ensures we include the test-experimental-extra.js file,
23738 // which should export the tested functions. 23822 // which should export the tested functions.
23739 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23823 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
23740 23824
23741 auto func = binding->Get(v8_str("testExperimentalExtraShouldReturnTen")) 23825 auto func =
23742 .As<v8::Function>(); 23826 binding->Get(env.local(), v8_str("testExperimentalExtraShouldReturnTen"))
23827 .ToLocalChecked()
23828 .As<v8::Function>();
23743 auto undefined = v8::Undefined(isolate); 23829 auto undefined = v8::Undefined(isolate);
23744 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); 23830 auto result = func->Call(env.local(), undefined, 0, {})
23831 .ToLocalChecked()
23832 .As<v8::Number>();
23745 CHECK_EQ(10, result->Int32Value(env.local()).FromJust()); 23833 CHECK_EQ(10, result->Int32Value(env.local()).FromJust());
23746 23834
23747 v8::Local<v8::FunctionTemplate> runtimeFunction = 23835 v8::Local<v8::FunctionTemplate> runtimeFunction =
23748 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); 23836 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction);
23749 binding->Set(v8_str("runtime"), 23837 binding->Set(env.local(), v8_str("runtime"),
23750 runtimeFunction->GetFunction(env.local()).ToLocalChecked()); 23838 runtimeFunction->GetFunction(env.local()).ToLocalChecked())
23751 func = binding->Get(v8_str("testExperimentalExtraShouldCallToRuntime")) 23839 .FromJust();
23840 func = binding->Get(env.local(),
23841 v8_str("testExperimentalExtraShouldCallToRuntime"))
23842 .ToLocalChecked()
23752 .As<v8::Function>(); 23843 .As<v8::Function>();
23753 result = func->Call(undefined, 0, {}).As<v8::Number>(); 23844 result = func->Call(env.local(), undefined, 0, {})
23845 .ToLocalChecked()
23846 .As<v8::Number>();
23754 CHECK_EQ(7, result->Int32Value(env.local()).FromJust()); 23847 CHECK_EQ(7, result->Int32Value(env.local()).FromJust());
23755 } 23848 }
23756 23849
23757 23850
23758 TEST(ExtrasUtilsObject) { 23851 TEST(ExtrasUtilsObject) {
23759 LocalContext context; 23852 LocalContext context;
23760 v8::Isolate* isolate = context->GetIsolate(); 23853 v8::Isolate* isolate = context->GetIsolate();
23761 v8::HandleScope handle_scope(isolate); 23854 v8::HandleScope handle_scope(isolate);
23762 23855
23763 LocalContext env; 23856 LocalContext env;
23764 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23857 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
23765 23858
23766 auto func = binding->Get(v8_str("testExtraCanUseUtils")).As<v8::Function>(); 23859 auto func = binding->Get(env.local(), v8_str("testExtraCanUseUtils"))
23860 .ToLocalChecked()
23861 .As<v8::Function>();
23767 auto undefined = v8::Undefined(isolate); 23862 auto undefined = v8::Undefined(isolate);
23768 auto result = func->Call(undefined, 0, {}).As<v8::Object>(); 23863 auto result = func->Call(env.local(), undefined, 0, {})
23864 .ToLocalChecked()
23865 .As<v8::Object>();
23769 23866
23770 auto private_symbol = result->Get(v8_str("privateSymbol")).As<v8::Symbol>(); 23867 auto private_symbol = result->Get(env.local(), v8_str("privateSymbol"))
23868 .ToLocalChecked()
23869 .As<v8::Symbol>();
23771 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol); 23870 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol);
23772 CHECK_EQ(true, ips->IsPrivate()); 23871 CHECK_EQ(true, ips->IsPrivate());
23773 23872
23774 CompileRun("var result = 0; function store(x) { result = x; }"); 23873 CompileRun("var result = 0; function store(x) { result = x; }");
23775 auto store = CompileRun("store").As<v8::Function>(); 23874 auto store = CompileRun("store").As<v8::Function>();
23776 23875
23777 auto fulfilled_promise = 23876 auto fulfilled_promise = result->Get(env.local(), v8_str("fulfilledPromise"))
23778 result->Get(v8_str("fulfilledPromise")).As<v8::Promise>(); 23877 .ToLocalChecked()
23779 fulfilled_promise->Then(store); 23878 .As<v8::Promise>();
23879 fulfilled_promise->Then(env.local(), store).ToLocalChecked();
23780 isolate->RunMicrotasks(); 23880 isolate->RunMicrotasks();
23781 CHECK_EQ(1, CompileRun("result")->Int32Value(env.local()).FromJust()); 23881 CHECK_EQ(1, CompileRun("result")->Int32Value(env.local()).FromJust());
23782 23882
23783 auto fulfilled_promise_2 = 23883 auto fulfilled_promise_2 =
23784 result->Get(v8_str("fulfilledPromise2")).As<v8::Promise>(); 23884 result->Get(env.local(), v8_str("fulfilledPromise2"))
23785 fulfilled_promise_2->Then(store); 23885 .ToLocalChecked()
23886 .As<v8::Promise>();
23887 fulfilled_promise_2->Then(env.local(), store).ToLocalChecked();
23786 isolate->RunMicrotasks(); 23888 isolate->RunMicrotasks();
23787 CHECK_EQ(2, CompileRun("result")->Int32Value(env.local()).FromJust()); 23889 CHECK_EQ(2, CompileRun("result")->Int32Value(env.local()).FromJust());
23788 23890
23789 auto rejected_promise = 23891 auto rejected_promise = result->Get(env.local(), v8_str("rejectedPromise"))
23790 result->Get(v8_str("rejectedPromise")).As<v8::Promise>(); 23892 .ToLocalChecked()
23791 rejected_promise->Catch(store); 23893 .As<v8::Promise>();
23894 rejected_promise->Catch(env.local(), store).ToLocalChecked();
23792 isolate->RunMicrotasks(); 23895 isolate->RunMicrotasks();
23793 CHECK_EQ(3, CompileRun("result")->Int32Value(env.local()).FromJust()); 23896 CHECK_EQ(3, CompileRun("result")->Int32Value(env.local()).FromJust());
23794 } 23897 }
23795 23898
23796 23899
23797 TEST(Map) { 23900 TEST(Map) {
23798 v8::Isolate* isolate = CcTest::isolate(); 23901 v8::Isolate* isolate = CcTest::isolate();
23799 v8::HandleScope handle_scope(isolate); 23902 v8::HandleScope handle_scope(isolate);
23800 LocalContext env; 23903 LocalContext env;
23801 23904
23802 v8::Local<v8::Map> map = v8::Map::New(isolate); 23905 v8::Local<v8::Map> map = v8::Map::New(isolate);
23803 CHECK(map->IsObject()); 23906 CHECK(map->IsObject());
23804 CHECK(map->IsMap()); 23907 CHECK(map->IsMap());
23805 CHECK(map->GetPrototype()->StrictEquals(CompileRun("Map.prototype"))); 23908 CHECK(map->GetPrototype()->StrictEquals(CompileRun("Map.prototype")));
23806 CHECK_EQ(0U, map->Size()); 23909 CHECK_EQ(0U, map->Size());
23807 23910
23808 v8::Local<v8::Value> val = CompileRun("new Map([[1, 2], [3, 4]])"); 23911 v8::Local<v8::Value> val = CompileRun("new Map([[1, 2], [3, 4]])");
23809 CHECK(val->IsMap()); 23912 CHECK(val->IsMap());
23810 map = v8::Local<v8::Map>::Cast(val); 23913 map = v8::Local<v8::Map>::Cast(val);
23811 CHECK_EQ(2U, map->Size()); 23914 CHECK_EQ(2U, map->Size());
23812 23915
23813 v8::Local<v8::Array> contents = map->AsArray(); 23916 v8::Local<v8::Array> contents = map->AsArray();
23814 CHECK_EQ(4U, contents->Length()); 23917 CHECK_EQ(4U, contents->Length());
23815 CHECK_EQ(1, contents->Get(0).As<v8::Int32>()->Value()); 23918 CHECK_EQ(
23816 CHECK_EQ(2, contents->Get(1).As<v8::Int32>()->Value()); 23919 1,
23817 CHECK_EQ(3, contents->Get(2).As<v8::Int32>()->Value()); 23920 contents->Get(env.local(), 0).ToLocalChecked().As<v8::Int32>()->Value());
23818 CHECK_EQ(4, contents->Get(3).As<v8::Int32>()->Value()); 23921 CHECK_EQ(
23922 2,
23923 contents->Get(env.local(), 1).ToLocalChecked().As<v8::Int32>()->Value());
23924 CHECK_EQ(
23925 3,
23926 contents->Get(env.local(), 2).ToLocalChecked().As<v8::Int32>()->Value());
23927 CHECK_EQ(
23928 4,
23929 contents->Get(env.local(), 3).ToLocalChecked().As<v8::Int32>()->Value());
23819 23930
23820 CHECK_EQ(2U, map->Size()); 23931 CHECK_EQ(2U, map->Size());
23821 23932
23822 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust()); 23933 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust());
23823 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust()); 23934 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust());
23824 23935
23825 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust()); 23936 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust());
23826 CHECK(!map->Has(env.local(), map).FromJust()); 23937 CHECK(!map->Has(env.local(), map).FromJust());
23827 23938
23828 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1)) 23939 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1))
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
23863 CHECK(set->GetPrototype()->StrictEquals(CompileRun("Set.prototype"))); 23974 CHECK(set->GetPrototype()->StrictEquals(CompileRun("Set.prototype")));
23864 CHECK_EQ(0U, set->Size()); 23975 CHECK_EQ(0U, set->Size());
23865 23976
23866 v8::Local<v8::Value> val = CompileRun("new Set([1, 2])"); 23977 v8::Local<v8::Value> val = CompileRun("new Set([1, 2])");
23867 CHECK(val->IsSet()); 23978 CHECK(val->IsSet());
23868 set = v8::Local<v8::Set>::Cast(val); 23979 set = v8::Local<v8::Set>::Cast(val);
23869 CHECK_EQ(2U, set->Size()); 23980 CHECK_EQ(2U, set->Size());
23870 23981
23871 v8::Local<v8::Array> keys = set->AsArray(); 23982 v8::Local<v8::Array> keys = set->AsArray();
23872 CHECK_EQ(2U, keys->Length()); 23983 CHECK_EQ(2U, keys->Length());
23873 CHECK_EQ(1, keys->Get(0).As<v8::Int32>()->Value()); 23984 CHECK_EQ(1,
23874 CHECK_EQ(2, keys->Get(1).As<v8::Int32>()->Value()); 23985 keys->Get(env.local(), 0).ToLocalChecked().As<v8::Int32>()->Value());
23986 CHECK_EQ(2,
23987 keys->Get(env.local(), 1).ToLocalChecked().As<v8::Int32>()->Value());
23875 23988
23876 CHECK_EQ(2U, set->Size()); 23989 CHECK_EQ(2U, set->Size());
23877 23990
23878 CHECK(set->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust()); 23991 CHECK(set->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust());
23879 CHECK(set->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust()); 23992 CHECK(set->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust());
23880 23993
23881 CHECK(!set->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust()); 23994 CHECK(!set->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust());
23882 CHECK(!set->Has(env.local(), set).FromJust()); 23995 CHECK(!set->Has(env.local(), set).FromJust());
23883 23996
23884 CHECK(!set->Add(env.local(), set).IsEmpty()); 23997 CHECK(!set->Add(env.local(), set).IsEmpty());
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
23937 } 24050 }
23938 24051
23939 class FutexInterruptionThread : public v8::base::Thread { 24052 class FutexInterruptionThread : public v8::base::Thread {
23940 public: 24053 public:
23941 explicit FutexInterruptionThread(v8::Isolate* isolate) 24054 explicit FutexInterruptionThread(v8::Isolate* isolate)
23942 : Thread(Options("FutexInterruptionThread")), isolate_(isolate) {} 24055 : Thread(Options("FutexInterruptionThread")), isolate_(isolate) {}
23943 24056
23944 virtual void Run() { 24057 virtual void Run() {
23945 // Wait a bit before terminating. 24058 // Wait a bit before terminating.
23946 v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(100)); 24059 v8::base::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(100));
23947 v8::V8::TerminateExecution(isolate_); 24060 isolate_->TerminateExecution();
23948 } 24061 }
23949 24062
23950 private: 24063 private:
23951 v8::Isolate* isolate_; 24064 v8::Isolate* isolate_;
23952 }; 24065 };
23953 24066
23954 24067
23955 TEST(FutexInterruption) { 24068 TEST(FutexInterruption) {
23956 i::FLAG_harmony_sharedarraybuffer = true; 24069 i::FLAG_harmony_sharedarraybuffer = true;
23957 v8::Isolate* isolate = CcTest::isolate(); 24070 v8::Isolate* isolate = CcTest::isolate();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
23995 v8::Local<v8::ObjectTemplate> global_template = 24108 v8::Local<v8::ObjectTemplate> global_template =
23996 v8::ObjectTemplate::New(isolate); 24109 v8::ObjectTemplate::New(isolate);
23997 LocalContext env(NULL, global_template); 24110 LocalContext env(NULL, global_template);
23998 24111
23999 i::FLAG_abort_on_uncaught_exception = true; 24112 i::FLAG_abort_on_uncaught_exception = true;
24000 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException); 24113 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException);
24001 24114
24002 CompileRun("function boom() { throw new Error(\"boom\") }"); 24115 CompileRun("function boom() { throw new Error(\"boom\") }");
24003 24116
24004 v8::Local<v8::Object> global_object = env->Global(); 24117 v8::Local<v8::Object> global_object = env->Global();
24005 v8::Local<v8::Function> foo = 24118 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast(
24006 v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); 24119 global_object->Get(env.local(), v8_str("boom")).ToLocalChecked());
24007 24120
24008 foo->Call(global_object, 0, NULL); 24121 CHECK(foo->Call(env.local(), global_object, 0, NULL).IsEmpty());
24009 24122
24010 CHECK_EQ(1, nb_uncaught_exception_callback_calls); 24123 CHECK_EQ(1, nb_uncaught_exception_callback_calls);
24011 } 24124 }
24012 24125
24013 24126
24014 TEST(AccessCheckedIsConcatSpreadable) { 24127 TEST(AccessCheckedIsConcatSpreadable) {
24015 i::FLAG_harmony_concat_spreadable = true; 24128 i::FLAG_harmony_concat_spreadable = true;
24016 v8::Isolate* isolate = CcTest::isolate(); 24129 v8::Isolate* isolate = CcTest::isolate();
24017 HandleScope scope(isolate); 24130 HandleScope scope(isolate);
24018 LocalContext env; 24131 LocalContext env;
24019 24132
24020 // Object with access check 24133 // Object with access check
24021 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); 24134 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate);
24022 spreadable_template->SetAccessCheckCallback(AccessBlocker); 24135 spreadable_template->SetAccessCheckCallback(AccessBlocker);
24023 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), 24136 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate),
24024 v8::Boolean::New(isolate, true)); 24137 v8::Boolean::New(isolate, true));
24025 Local<Object> object = 24138 Local<Object> object =
24026 spreadable_template->NewInstance(env.local()).ToLocalChecked(); 24139 spreadable_template->NewInstance(env.local()).ToLocalChecked();
24027 24140
24028 allowed_access = true; 24141 allowed_access = true;
24029 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust()); 24142 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust());
24030 object->Set(v8_str("length"), v8_num(2)); 24143 object->Set(env.local(), v8_str("length"), v8_num(2)).FromJust();
24031 object->Set(0U, v8_str("a")); 24144 object->Set(env.local(), 0U, v8_str("a")).FromJust();
24032 object->Set(1U, v8_str("b")); 24145 object->Set(env.local(), 1U, v8_str("b")).FromJust();
24033 24146
24034 // Access check is allowed, and the object is spread 24147 // Access check is allowed, and the object is spread
24035 CompileRun("var result = [].concat(object)"); 24148 CompileRun("var result = [].concat(object)");
24036 ExpectTrue("Array.isArray(result)"); 24149 ExpectTrue("Array.isArray(result)");
24037 ExpectString("result[0]", "a"); 24150 ExpectString("result[0]", "a");
24038 ExpectString("result[1]", "b"); 24151 ExpectString("result[1]", "b");
24039 ExpectTrue("result.length === 2"); 24152 ExpectTrue("result.length === 2");
24040 ExpectTrue("object[Symbol.isConcatSpreadable]"); 24153 ExpectTrue("object[Symbol.isConcatSpreadable]");
24041 24154
24042 // If access check fails, the value of @@isConcatSpreadable is ignored 24155 // If access check fails, the value of @@isConcatSpreadable is ignored
24043 allowed_access = false; 24156 allowed_access = false;
24044 CompileRun("var result = [].concat(object)"); 24157 CompileRun("var result = [].concat(object)");
24045 ExpectTrue("Array.isArray(result)"); 24158 ExpectTrue("Array.isArray(result)");
24046 ExpectTrue("result[0] === object"); 24159 ExpectTrue("result[0] === object");
24047 ExpectTrue("result.length === 1"); 24160 ExpectTrue("result.length === 1");
24048 ExpectTrue("object[Symbol.isConcatSpreadable] === undefined"); 24161 ExpectTrue("object[Symbol.isConcatSpreadable] === undefined");
24049 } 24162 }
24050 24163
24051 24164
24052 TEST(AccessCheckedToStringTag) { 24165 TEST(AccessCheckedToStringTag) {
24053 i::FLAG_harmony_tostring = true; 24166 i::FLAG_harmony_tostring = true;
24054 v8::Isolate* isolate = CcTest::isolate(); 24167 v8::Isolate* isolate = CcTest::isolate();
24055 HandleScope scope(isolate); 24168 HandleScope scope(isolate);
24056 LocalContext env; 24169 LocalContext env;
24057 24170
24058 // Object with access check 24171 // Object with access check
24059 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); 24172 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate);
24060 object_template->SetAccessCheckCallback(AccessBlocker); 24173 object_template->SetAccessCheckCallback(AccessBlocker);
24061 Local<Object> object = object_template->NewInstance(); 24174 Local<Object> object =
24175 object_template->NewInstance(env.local()).ToLocalChecked();
24062 24176
24063 allowed_access = true; 24177 allowed_access = true;
24064 env->Global()->Set(v8_str("object"), object); 24178 env->Global()->Set(env.local(), v8_str("object"), object).FromJust();
24065 object->Set(v8::Symbol::GetToStringTag(isolate), v8_str("hello")); 24179 object->Set(env.local(), v8::Symbol::GetToStringTag(isolate), v8_str("hello"))
24180 .FromJust();
24066 24181
24067 // Access check is allowed, and the toStringTag is read 24182 // Access check is allowed, and the toStringTag is read
24068 CompileRun("var result = Object.prototype.toString.call(object)"); 24183 CompileRun("var result = Object.prototype.toString.call(object)");
24069 ExpectString("result", "[object hello]"); 24184 ExpectString("result", "[object hello]");
24070 ExpectString("object[Symbol.toStringTag]", "hello"); 24185 ExpectString("object[Symbol.toStringTag]", "hello");
24071 24186
24072 // ToString through the API should succeed too. 24187 // ToString through the API should succeed too.
24073 String::Utf8Value result_allowed( 24188 String::Utf8Value result_allowed(
24074 object->ObjectProtoToString(env.local()).ToLocalChecked()); 24189 object->ObjectProtoToString(env.local()).ToLocalChecked());
24075 CHECK_EQ(0, strcmp(*result_allowed, "[object hello]")); 24190 CHECK_EQ(0, strcmp(*result_allowed, "[object hello]"));
(...skipping 18 matching lines...) Expand all
24094 24209
24095 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); 24210 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate);
24096 object_template->SetIntrinsicDataProperty(v8_str("values"), 24211 object_template->SetIntrinsicDataProperty(v8_str("values"),
24097 v8::kArrayProto_values); 24212 v8::kArrayProto_values);
24098 Local<Object> object = 24213 Local<Object> object =
24099 object_template->NewInstance(env.local()).ToLocalChecked(); 24214 object_template->NewInstance(env.local()).ToLocalChecked();
24100 24215
24101 CHECK(env->Global()->Set(env.local(), v8_str("obj1"), object).FromJust()); 24216 CHECK(env->Global()->Set(env.local(), v8_str("obj1"), object).FromJust());
24102 ExpectString("typeof obj1.values", "function"); 24217 ExpectString("typeof obj1.values", "function");
24103 24218
24104 auto values = Local<Function>::Cast(object->Get(v8_str("values"))); 24219 auto values = Local<Function>::Cast(
24220 object->Get(env.local(), v8_str("values")).ToLocalChecked());
24105 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values)); 24221 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values));
24106 auto ctx = v8::Utils::OpenHandle(*env.local()); 24222 auto ctx = v8::Utils::OpenHandle(*env.local());
24107 CHECK_EQ(fn->GetCreationContext(), *ctx); 24223 CHECK_EQ(fn->GetCreationContext(), *ctx);
24108 24224
24109 { 24225 {
24110 LocalContext env2; 24226 LocalContext env2;
24111 Local<Object> object2 = 24227 Local<Object> object2 =
24112 object_template->NewInstance(env2.local()).ToLocalChecked(); 24228 object_template->NewInstance(env2.local()).ToLocalChecked();
24113 CHECK( 24229 CHECK(
24114 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust()); 24230 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust());
24115 ExpectString("typeof obj2.values", "function"); 24231 ExpectString("typeof obj2.values", "function");
24116 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); 24232 CHECK_NE(*object->Get(env2.local(), v8_str("values")).ToLocalChecked(),
24233 *object2->Get(env2.local(), v8_str("values")).ToLocalChecked());
24117 24234
24118 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); 24235 auto values2 = Local<Function>::Cast(
24236 object2->Get(env2.local(), v8_str("values")).ToLocalChecked());
24119 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); 24237 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2));
24120 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); 24238 auto ctx2 = v8::Utils::OpenHandle(*env2.local());
24121 CHECK_EQ(fn2->GetCreationContext(), *ctx2); 24239 CHECK_EQ(fn2->GetCreationContext(), *ctx2);
24122 } 24240 }
24123 } 24241 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698