OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
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): Remove this after the setting is turned on globally. | |
29 // #define V8_IMMINENT_DEPRECATION_WARNINGS | |
30 | |
28 #include <climits> | 31 #include <climits> |
29 #include <csignal> | 32 #include <csignal> |
30 #include <map> | 33 #include <map> |
31 #include <string> | 34 #include <string> |
32 | 35 |
33 #include "test/cctest/test-api.h" | 36 #include "test/cctest/test-api.h" |
34 | 37 |
35 #if V8_OS_POSIX | 38 #if V8_OS_POSIX |
36 #include <unistd.h> // NOLINT | 39 #include <unistd.h> // NOLINT |
37 #endif | 40 #endif |
(...skipping 15 matching lines...) Expand all Loading... | |
53 #include "test/cctest/heap-tester.h" | 56 #include "test/cctest/heap-tester.h" |
54 | 57 |
55 static const bool kLogThreading = false; | 58 static const bool kLogThreading = false; |
56 | 59 |
57 using ::v8::Boolean; | 60 using ::v8::Boolean; |
58 using ::v8::BooleanObject; | 61 using ::v8::BooleanObject; |
59 using ::v8::Context; | 62 using ::v8::Context; |
60 using ::v8::Extension; | 63 using ::v8::Extension; |
61 using ::v8::Function; | 64 using ::v8::Function; |
62 using ::v8::FunctionTemplate; | 65 using ::v8::FunctionTemplate; |
63 using ::v8::Handle; | |
64 using ::v8::HandleScope; | 66 using ::v8::HandleScope; |
65 using ::v8::Local; | 67 using ::v8::Local; |
66 using ::v8::Maybe; | 68 using ::v8::Maybe; |
67 using ::v8::Message; | 69 using ::v8::Message; |
68 using ::v8::MessageCallback; | 70 using ::v8::MessageCallback; |
69 using ::v8::Name; | 71 using ::v8::Name; |
70 using ::v8::None; | 72 using ::v8::None; |
71 using ::v8::Object; | 73 using ::v8::Object; |
72 using ::v8::ObjectTemplate; | 74 using ::v8::ObjectTemplate; |
73 using ::v8::Persistent; | 75 using ::v8::Persistent; |
(...skipping 10 matching lines...) Expand all Loading... | |
84 | 86 |
85 | 87 |
86 #define THREADED_PROFILED_TEST(Name) \ | 88 #define THREADED_PROFILED_TEST(Name) \ |
87 static void Test##Name(); \ | 89 static void Test##Name(); \ |
88 TEST(Name##WithProfiler) { \ | 90 TEST(Name##WithProfiler) { \ |
89 RunWithProfiler(&Test##Name); \ | 91 RunWithProfiler(&Test##Name); \ |
90 } \ | 92 } \ |
91 THREADED_TEST(Name) | 93 THREADED_TEST(Name) |
92 | 94 |
93 | 95 |
96 // TODO(vogelheim): move tocctest | |
94 void RunWithProfiler(void (*test)()) { | 97 void RunWithProfiler(void (*test)()) { |
95 LocalContext env; | 98 LocalContext env; |
96 v8::HandleScope scope(env->GetIsolate()); | 99 v8::HandleScope scope(env->GetIsolate()); |
97 v8::Local<v8::String> profile_name = | 100 v8::Local<v8::String> profile_name = v8_str("my_profile1"); |
98 v8::String::NewFromUtf8(env->GetIsolate(), "my_profile1"); | |
99 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); | 101 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler(); |
100 | 102 |
101 cpu_profiler->StartProfiling(profile_name); | 103 cpu_profiler->StartProfiling(profile_name); |
102 (*test)(); | 104 (*test)(); |
103 reinterpret_cast<i::CpuProfiler*>(cpu_profiler)->DeleteAllProfiles(); | 105 reinterpret_cast<i::CpuProfiler*>(cpu_profiler)->DeleteAllProfiles(); |
104 } | 106 } |
105 | 107 |
106 | 108 |
107 static int signature_callback_count; | 109 static int signature_callback_count; |
108 static Local<Value> signature_expected_receiver; | 110 static Local<Value> signature_expected_receiver; |
109 static void IncrementingSignatureCallback( | 111 static void IncrementingSignatureCallback( |
110 const v8::FunctionCallbackInfo<v8::Value>& args) { | 112 const v8::FunctionCallbackInfo<v8::Value>& args) { |
111 ApiTestFuzzer::Fuzz(); | 113 ApiTestFuzzer::Fuzz(); |
112 signature_callback_count++; | 114 signature_callback_count++; |
113 CHECK(signature_expected_receiver->Equals(args.Holder())); | 115 CHECK(signature_expected_receiver->Equals( |
114 CHECK(signature_expected_receiver->Equals(args.This())); | 116 args.GetIsolate()->GetCurrentContext(), |
115 v8::Handle<v8::Array> result = | 117 args.Holder()) |
118 .FromJust()); | |
119 CHECK(signature_expected_receiver->Equals( | |
120 args.GetIsolate()->GetCurrentContext(), | |
121 args.This()) | |
122 .FromJust()); | |
123 v8::Local<v8::Array> result = | |
116 v8::Array::New(args.GetIsolate(), args.Length()); | 124 v8::Array::New(args.GetIsolate(), args.Length()); |
117 for (int i = 0; i < args.Length(); i++) | 125 for (int i = 0; i < args.Length(); i++) { |
118 result->Set(v8::Integer::New(args.GetIsolate(), i), args[i]); | 126 CHECK(result->Set(args.GetIsolate()->GetCurrentContext(), |
127 v8::Integer::New(args.GetIsolate(), i), args[i]) | |
128 .FromJust()); | |
129 } | |
119 args.GetReturnValue().Set(result); | 130 args.GetReturnValue().Set(result); |
120 } | 131 } |
121 | 132 |
122 | 133 |
123 static void Returns42(const v8::FunctionCallbackInfo<v8::Value>& info) { | 134 static void Returns42(const v8::FunctionCallbackInfo<v8::Value>& info) { |
124 info.GetReturnValue().Set(42); | 135 info.GetReturnValue().Set(42); |
125 } | 136 } |
126 | 137 |
127 | 138 |
128 // Tests that call v8::V8::Dispose() cannot be threaded. | 139 // Tests that call v8::V8::Dispose() cannot be threaded. |
(...skipping 18 matching lines...) Expand all Loading... | |
147 Local<Context> local_env; | 158 Local<Context> local_env; |
148 { | 159 { |
149 LocalContext env; | 160 LocalContext env; |
150 local_env = env.local(); | 161 local_env = env.local(); |
151 } | 162 } |
152 | 163 |
153 // Local context should still be live. | 164 // Local context should still be live. |
154 CHECK(!local_env.IsEmpty()); | 165 CHECK(!local_env.IsEmpty()); |
155 local_env->Enter(); | 166 local_env->Enter(); |
156 | 167 |
157 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); | 168 v8::Local<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); |
158 CHECK(!undef.IsEmpty()); | 169 CHECK(!undef.IsEmpty()); |
159 CHECK(undef->IsUndefined()); | 170 CHECK(undef->IsUndefined()); |
160 | 171 |
161 const char* source = "1 + 2 + 3"; | 172 const char* source = "1 + 2 + 3"; |
162 Local<Script> script = v8_compile(source); | 173 Local<Script> script = v8_compile(source); |
163 CHECK_EQ(6, script->Run()->Int32Value()); | 174 CHECK_EQ(6, v8_run_int32value(script)); |
164 | 175 |
165 local_env->Exit(); | 176 local_env->Exit(); |
166 } | 177 } |
167 | 178 |
168 | 179 |
169 THREADED_TEST(IsolateOfContext) { | 180 THREADED_TEST(IsolateOfContext) { |
170 v8::HandleScope scope(CcTest::isolate()); | 181 v8::HandleScope scope(CcTest::isolate()); |
171 v8::Handle<Context> env = Context::New(CcTest::isolate()); | 182 v8::Local<Context> env = Context::New(CcTest::isolate()); |
172 | 183 |
173 CHECK(!env->GetIsolate()->InContext()); | 184 CHECK(!env->GetIsolate()->InContext()); |
174 CHECK(env->GetIsolate() == CcTest::isolate()); | 185 CHECK(env->GetIsolate() == CcTest::isolate()); |
175 env->Enter(); | 186 env->Enter(); |
176 CHECK(env->GetIsolate()->InContext()); | 187 CHECK(env->GetIsolate()->InContext()); |
177 CHECK(env->GetIsolate() == CcTest::isolate()); | 188 CHECK(env->GetIsolate() == CcTest::isolate()); |
178 env->Exit(); | 189 env->Exit(); |
179 CHECK(!env->GetIsolate()->InContext()); | 190 CHECK(!env->GetIsolate()->InContext()); |
180 CHECK(env->GetIsolate() == CcTest::isolate()); | 191 CHECK(env->GetIsolate() == CcTest::isolate()); |
181 } | 192 } |
(...skipping 10 matching lines...) Expand all Loading... | |
192 signature_callback_count = 0; | 203 signature_callback_count = 0; |
193 signature_expected_receiver = receiver; | 204 signature_expected_receiver = receiver; |
194 bool expected_to_throw = receiver.IsEmpty(); | 205 bool expected_to_throw = receiver.IsEmpty(); |
195 v8::TryCatch try_catch(isolate); | 206 v8::TryCatch try_catch(isolate); |
196 CompileRun(source.start()); | 207 CompileRun(source.start()); |
197 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); | 208 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); |
198 if (!expected_to_throw) { | 209 if (!expected_to_throw) { |
199 CHECK_EQ(10, signature_callback_count); | 210 CHECK_EQ(10, signature_callback_count); |
200 } else { | 211 } else { |
201 CHECK(v8_str("TypeError: Illegal invocation") | 212 CHECK(v8_str("TypeError: Illegal invocation") |
202 ->Equals(try_catch.Exception()->ToString(isolate))); | 213 ->Equals(isolate->GetCurrentContext(), |
214 try_catch.Exception() | |
215 ->ToString(isolate->GetCurrentContext()) | |
216 .ToLocalChecked()) | |
217 .FromJust()); | |
203 } | 218 } |
204 } | 219 } |
205 | 220 |
206 | 221 |
207 THREADED_TEST(ReceiverSignature) { | 222 THREADED_TEST(ReceiverSignature) { |
208 LocalContext env; | 223 LocalContext env; |
209 v8::Isolate* isolate = env->GetIsolate(); | 224 v8::Isolate* isolate = env->GetIsolate(); |
210 v8::HandleScope scope(isolate); | 225 v8::HandleScope scope(isolate); |
211 // Setup templates. | 226 // Setup templates. |
212 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); | 227 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
213 v8::Handle<v8::Signature> sig = v8::Signature::New(isolate, fun); | 228 v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); |
214 v8::Handle<v8::FunctionTemplate> callback_sig = | 229 v8::Local<v8::FunctionTemplate> callback_sig = v8::FunctionTemplate::New( |
215 v8::FunctionTemplate::New( | 230 isolate, IncrementingSignatureCallback, Local<Value>(), sig); |
216 isolate, IncrementingSignatureCallback, Local<Value>(), sig); | 231 v8::Local<v8::FunctionTemplate> callback = |
217 v8::Handle<v8::FunctionTemplate> callback = | |
218 v8::FunctionTemplate::New(isolate, IncrementingSignatureCallback); | 232 v8::FunctionTemplate::New(isolate, IncrementingSignatureCallback); |
219 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(isolate); | 233 v8::Local<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(isolate); |
220 sub_fun->Inherit(fun); | 234 sub_fun->Inherit(fun); |
221 v8::Handle<v8::FunctionTemplate> unrel_fun = | 235 v8::Local<v8::FunctionTemplate> unrel_fun = |
222 v8::FunctionTemplate::New(isolate); | 236 v8::FunctionTemplate::New(isolate); |
223 // Install properties. | 237 // Install properties. |
224 v8::Handle<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); | 238 v8::Local<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); |
225 fun_proto->Set(v8_str("prop_sig"), callback_sig); | 239 fun_proto->Set(v8_str("prop_sig"), callback_sig); |
226 fun_proto->Set(v8_str("prop"), callback); | 240 fun_proto->Set(v8_str("prop"), callback); |
227 fun_proto->SetAccessorProperty( | 241 fun_proto->SetAccessorProperty( |
228 v8_str("accessor_sig"), callback_sig, callback_sig); | 242 v8_str("accessor_sig"), callback_sig, callback_sig); |
229 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); | 243 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); |
230 // Instantiate templates. | 244 // Instantiate templates. |
231 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); | 245 Local<Value> fun_instance = |
232 Local<Value> sub_fun_instance = sub_fun->InstanceTemplate()->NewInstance(); | 246 fun->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked(); |
247 Local<Value> sub_fun_instance = | |
248 sub_fun->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked(); | |
233 // Setup global variables. | 249 // Setup global variables. |
234 env->Global()->Set(v8_str("Fun"), fun->GetFunction()); | 250 CHECK(env->Global() |
235 env->Global()->Set(v8_str("UnrelFun"), unrel_fun->GetFunction()); | 251 ->Set(env.local(), v8_str("Fun"), |
236 env->Global()->Set(v8_str("fun_instance"), fun_instance); | 252 fun->GetFunction(env.local()).ToLocalChecked()) |
237 env->Global()->Set(v8_str("sub_fun_instance"), sub_fun_instance); | 253 .FromJust()); |
254 CHECK(env->Global() | |
255 ->Set(env.local(), v8_str("UnrelFun"), | |
256 unrel_fun->GetFunction(env.local()).ToLocalChecked()) | |
257 .FromJust()); | |
258 CHECK(env->Global() | |
259 ->Set(env.local(), v8_str("fun_instance"), fun_instance) | |
260 .FromJust()); | |
261 CHECK(env->Global() | |
262 ->Set(env.local(), v8_str("sub_fun_instance"), sub_fun_instance) | |
263 .FromJust()); | |
238 CompileRun( | 264 CompileRun( |
239 "var accessor_sig_key = 'accessor_sig';" | 265 "var accessor_sig_key = 'accessor_sig';" |
240 "var accessor_key = 'accessor';" | 266 "var accessor_key = 'accessor';" |
241 "var prop_sig_key = 'prop_sig';" | 267 "var prop_sig_key = 'prop_sig';" |
242 "var prop_key = 'prop';" | 268 "var prop_key = 'prop';" |
243 "" | 269 "" |
244 "function copy_props(obj) {" | 270 "function copy_props(obj) {" |
245 " var keys = [accessor_sig_key, accessor_key, prop_sig_key, prop_key];" | 271 " var keys = [accessor_sig_key, accessor_key, prop_sig_key, prop_key];" |
246 " var source = Fun.prototype;" | 272 " var source = Fun.prototype;" |
247 " for (var i in keys) {" | 273 " for (var i in keys) {" |
(...skipping 28 matching lines...) Expand all Loading... | |
276 TestSignature("test_object.accessor_sig = 1;", test_object, isolate); | 302 TestSignature("test_object.accessor_sig = 1;", test_object, isolate); |
277 TestSignature("test_object[accessor_sig_key] = 1;", test_object, isolate); | 303 TestSignature("test_object[accessor_sig_key] = 1;", test_object, isolate); |
278 } | 304 } |
279 } | 305 } |
280 | 306 |
281 | 307 |
282 THREADED_TEST(HulIgennem) { | 308 THREADED_TEST(HulIgennem) { |
283 LocalContext env; | 309 LocalContext env; |
284 v8::Isolate* isolate = env->GetIsolate(); | 310 v8::Isolate* isolate = env->GetIsolate(); |
285 v8::HandleScope scope(isolate); | 311 v8::HandleScope scope(isolate); |
286 v8::Handle<v8::Primitive> undef = v8::Undefined(isolate); | 312 v8::Local<v8::Primitive> undef = v8::Undefined(isolate); |
287 Local<String> undef_str = undef->ToString(isolate); | 313 Local<String> undef_str = undef->ToString(env.local()).ToLocalChecked(); |
288 char* value = i::NewArray<char>(undef_str->Utf8Length() + 1); | 314 char* value = i::NewArray<char>(undef_str->Utf8Length() + 1); |
289 undef_str->WriteUtf8(value); | 315 undef_str->WriteUtf8(value); |
290 CHECK_EQ(0, strcmp(value, "undefined")); | 316 CHECK_EQ(0, strcmp(value, "undefined")); |
291 i::DeleteArray(value); | 317 i::DeleteArray(value); |
292 } | 318 } |
293 | 319 |
294 | 320 |
295 THREADED_TEST(Access) { | 321 THREADED_TEST(Access) { |
296 LocalContext env; | 322 LocalContext env; |
297 v8::Isolate* isolate = env->GetIsolate(); | 323 v8::Isolate* isolate = env->GetIsolate(); |
298 v8::HandleScope scope(isolate); | 324 v8::HandleScope scope(isolate); |
299 Local<v8::Object> obj = v8::Object::New(isolate); | 325 Local<v8::Object> obj = v8::Object::New(isolate); |
300 Local<Value> foo_before = obj->Get(v8_str("foo")); | 326 Local<Value> foo_before = |
327 obj->Get(env.local(), v8_str("foo")).ToLocalChecked(); | |
301 CHECK(foo_before->IsUndefined()); | 328 CHECK(foo_before->IsUndefined()); |
302 Local<String> bar_str = v8_str("bar"); | 329 Local<String> bar_str = v8_str("bar"); |
303 obj->Set(v8_str("foo"), bar_str); | 330 CHECK(obj->Set(env.local(), v8_str("foo"), bar_str).FromJust()); |
304 Local<Value> foo_after = obj->Get(v8_str("foo")); | 331 Local<Value> foo_after = |
332 obj->Get(env.local(), v8_str("foo")).ToLocalChecked(); | |
305 CHECK(!foo_after->IsUndefined()); | 333 CHECK(!foo_after->IsUndefined()); |
306 CHECK(foo_after->IsString()); | 334 CHECK(foo_after->IsString()); |
307 CHECK(bar_str->Equals(foo_after)); | 335 CHECK(bar_str->Equals(env.local(), foo_after).FromJust()); |
308 } | 336 } |
309 | 337 |
310 | 338 |
311 THREADED_TEST(AccessElement) { | 339 THREADED_TEST(AccessElement) { |
312 LocalContext env; | 340 LocalContext env; |
313 v8::HandleScope scope(env->GetIsolate()); | 341 v8::HandleScope scope(env->GetIsolate()); |
314 Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); | 342 Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); |
315 Local<Value> before = obj->Get(1); | 343 Local<Value> before = obj->Get(env.local(), 1).ToLocalChecked(); |
316 CHECK(before->IsUndefined()); | 344 CHECK(before->IsUndefined()); |
317 Local<String> bar_str = v8_str("bar"); | 345 Local<String> bar_str = v8_str("bar"); |
318 obj->Set(1, bar_str); | 346 CHECK(obj->Set(env.local(), 1, bar_str).FromJust()); |
319 Local<Value> after = obj->Get(1); | 347 Local<Value> after = obj->Get(env.local(), 1).ToLocalChecked(); |
320 CHECK(!after->IsUndefined()); | 348 CHECK(!after->IsUndefined()); |
321 CHECK(after->IsString()); | 349 CHECK(after->IsString()); |
322 CHECK(bar_str->Equals(after)); | 350 CHECK(bar_str->Equals(env.local(), after).FromJust()); |
323 | 351 |
324 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); | 352 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); |
325 CHECK(v8_str("a")->Equals(value->Get(0))); | 353 CHECK(v8_str("a") |
326 CHECK(v8_str("b")->Equals(value->Get(1))); | 354 ->Equals(env.local(), value->Get(env.local(), 0).ToLocalChecked()) |
355 .FromJust()); | |
356 CHECK(v8_str("b") | |
357 ->Equals(env.local(), value->Get(env.local(), 1).ToLocalChecked()) | |
358 .FromJust()); | |
327 } | 359 } |
328 | 360 |
329 | 361 |
330 THREADED_TEST(Script) { | 362 THREADED_TEST(Script) { |
331 LocalContext env; | 363 LocalContext env; |
332 v8::HandleScope scope(env->GetIsolate()); | 364 v8::HandleScope scope(env->GetIsolate()); |
333 const char* source = "1 + 2 + 3"; | 365 const char* source = "1 + 2 + 3"; |
334 Local<Script> script = v8_compile(source); | 366 Local<Script> script = v8_compile(source); |
335 CHECK_EQ(6, script->Run()->Int32Value()); | 367 CHECK_EQ(6, v8_run_int32value(script)); |
336 } | 368 } |
337 | 369 |
338 | 370 |
339 class TestResource: public String::ExternalStringResource { | 371 class TestResource: public String::ExternalStringResource { |
340 public: | 372 public: |
341 explicit TestResource(uint16_t* data, int* counter = NULL, | 373 explicit TestResource(uint16_t* data, int* counter = NULL, |
342 bool owning_data = true) | 374 bool owning_data = true) |
343 : data_(data), length_(0), counter_(counter), owning_data_(owning_data) { | 375 : data_(data), length_(0), counter_(counter), owning_data_(owning_data) { |
344 while (data[length_]) ++length_; | 376 while (data[length_]) ++length_; |
345 } | 377 } |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
396 | 428 |
397 | 429 |
398 THREADED_TEST(ScriptUsingStringResource) { | 430 THREADED_TEST(ScriptUsingStringResource) { |
399 int dispose_count = 0; | 431 int dispose_count = 0; |
400 const char* c_source = "1 + 2 * 3"; | 432 const char* c_source = "1 + 2 * 3"; |
401 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); | 433 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); |
402 { | 434 { |
403 LocalContext env; | 435 LocalContext env; |
404 v8::HandleScope scope(env->GetIsolate()); | 436 v8::HandleScope scope(env->GetIsolate()); |
405 TestResource* resource = new TestResource(two_byte_source, &dispose_count); | 437 TestResource* resource = new TestResource(two_byte_source, &dispose_count); |
406 Local<String> source = String::NewExternal(env->GetIsolate(), resource); | 438 Local<String> source = |
439 String::NewExternalTwoByte(env->GetIsolate(), resource) | |
440 .ToLocalChecked(); | |
407 Local<Script> script = v8_compile(source); | 441 Local<Script> script = v8_compile(source); |
408 Local<Value> value = script->Run(); | 442 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
409 CHECK(value->IsNumber()); | 443 CHECK(value->IsNumber()); |
410 CHECK_EQ(7, value->Int32Value()); | 444 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
411 CHECK(source->IsExternal()); | 445 CHECK(source->IsExternal()); |
412 CHECK_EQ(resource, | 446 CHECK_EQ(resource, |
413 static_cast<TestResource*>(source->GetExternalStringResource())); | 447 static_cast<TestResource*>(source->GetExternalStringResource())); |
414 String::Encoding encoding = String::UNKNOWN_ENCODING; | 448 String::Encoding encoding = String::UNKNOWN_ENCODING; |
415 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 449 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
416 source->GetExternalStringResourceBase(&encoding)); | 450 source->GetExternalStringResourceBase(&encoding)); |
417 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); | 451 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); |
418 CcTest::heap()->CollectAllGarbage(); | 452 CcTest::heap()->CollectAllGarbage(); |
419 CHECK_EQ(0, dispose_count); | 453 CHECK_EQ(0, dispose_count); |
420 } | 454 } |
421 CcTest::i_isolate()->compilation_cache()->Clear(); | 455 CcTest::i_isolate()->compilation_cache()->Clear(); |
422 CcTest::heap()->CollectAllAvailableGarbage(); | 456 CcTest::heap()->CollectAllAvailableGarbage(); |
423 CHECK_EQ(1, dispose_count); | 457 CHECK_EQ(1, dispose_count); |
424 } | 458 } |
425 | 459 |
426 | 460 |
427 THREADED_TEST(ScriptUsingOneByteStringResource) { | 461 THREADED_TEST(ScriptUsingOneByteStringResource) { |
428 int dispose_count = 0; | 462 int dispose_count = 0; |
429 const char* c_source = "1 + 2 * 3"; | 463 const char* c_source = "1 + 2 * 3"; |
430 { | 464 { |
431 LocalContext env; | 465 LocalContext env; |
432 v8::HandleScope scope(env->GetIsolate()); | 466 v8::HandleScope scope(env->GetIsolate()); |
433 TestOneByteResource* resource = | 467 TestOneByteResource* resource = |
434 new TestOneByteResource(i::StrDup(c_source), &dispose_count); | 468 new TestOneByteResource(i::StrDup(c_source), &dispose_count); |
435 Local<String> source = String::NewExternal(env->GetIsolate(), resource); | 469 Local<String> source = |
470 String::NewExternalOneByte(env->GetIsolate(), resource) | |
471 .ToLocalChecked(); | |
436 CHECK(source->IsExternalOneByte()); | 472 CHECK(source->IsExternalOneByte()); |
437 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 473 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
438 source->GetExternalOneByteStringResource()); | 474 source->GetExternalOneByteStringResource()); |
439 String::Encoding encoding = String::UNKNOWN_ENCODING; | 475 String::Encoding encoding = String::UNKNOWN_ENCODING; |
440 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), | 476 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), |
441 source->GetExternalStringResourceBase(&encoding)); | 477 source->GetExternalStringResourceBase(&encoding)); |
442 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); | 478 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); |
443 Local<Script> script = v8_compile(source); | 479 Local<Script> script = v8_compile(source); |
444 Local<Value> value = script->Run(); | 480 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
445 CHECK(value->IsNumber()); | 481 CHECK(value->IsNumber()); |
446 CHECK_EQ(7, value->Int32Value()); | 482 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
447 CcTest::heap()->CollectAllGarbage(); | 483 CcTest::heap()->CollectAllGarbage(); |
448 CHECK_EQ(0, dispose_count); | 484 CHECK_EQ(0, dispose_count); |
449 } | 485 } |
450 CcTest::i_isolate()->compilation_cache()->Clear(); | 486 CcTest::i_isolate()->compilation_cache()->Clear(); |
451 CcTest::heap()->CollectAllAvailableGarbage(); | 487 CcTest::heap()->CollectAllAvailableGarbage(); |
452 CHECK_EQ(1, dispose_count); | 488 CHECK_EQ(1, dispose_count); |
453 } | 489 } |
454 | 490 |
455 | 491 |
456 THREADED_TEST(ScriptMakingExternalString) { | 492 THREADED_TEST(ScriptMakingExternalString) { |
457 int dispose_count = 0; | 493 int dispose_count = 0; |
458 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); | 494 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); |
459 { | 495 { |
460 LocalContext env; | 496 LocalContext env; |
461 v8::HandleScope scope(env->GetIsolate()); | 497 v8::HandleScope scope(env->GetIsolate()); |
462 Local<String> source = | 498 Local<String> source = |
463 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); | 499 String::NewFromTwoByte(env->GetIsolate(), two_byte_source, |
500 v8::NewStringType::kNormal) | |
501 .ToLocalChecked(); | |
464 // Trigger GCs so that the newly allocated string moves to old gen. | 502 // Trigger GCs so that the newly allocated string moves to old gen. |
465 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 503 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
466 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 504 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
467 CHECK_EQ(source->IsExternal(), false); | 505 CHECK_EQ(source->IsExternal(), false); |
468 CHECK_EQ(source->IsExternalOneByte(), false); | 506 CHECK_EQ(source->IsExternalOneByte(), false); |
469 String::Encoding encoding = String::UNKNOWN_ENCODING; | 507 String::Encoding encoding = String::UNKNOWN_ENCODING; |
470 CHECK(!source->GetExternalStringResourceBase(&encoding)); | 508 CHECK(!source->GetExternalStringResourceBase(&encoding)); |
471 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); | 509 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); |
472 bool success = source->MakeExternal(new TestResource(two_byte_source, | 510 bool success = source->MakeExternal(new TestResource(two_byte_source, |
473 &dispose_count)); | 511 &dispose_count)); |
474 CHECK(success); | 512 CHECK(success); |
475 Local<Script> script = v8_compile(source); | 513 Local<Script> script = v8_compile(source); |
476 Local<Value> value = script->Run(); | 514 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
477 CHECK(value->IsNumber()); | 515 CHECK(value->IsNumber()); |
478 CHECK_EQ(7, value->Int32Value()); | 516 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
479 CcTest::heap()->CollectAllGarbage(); | 517 CcTest::heap()->CollectAllGarbage(); |
480 CHECK_EQ(0, dispose_count); | 518 CHECK_EQ(0, dispose_count); |
481 } | 519 } |
482 CcTest::i_isolate()->compilation_cache()->Clear(); | 520 CcTest::i_isolate()->compilation_cache()->Clear(); |
483 CcTest::heap()->CollectAllGarbage(); | 521 CcTest::heap()->CollectAllGarbage(); |
484 CHECK_EQ(1, dispose_count); | 522 CHECK_EQ(1, dispose_count); |
485 } | 523 } |
486 | 524 |
487 | 525 |
488 THREADED_TEST(ScriptMakingExternalOneByteString) { | 526 THREADED_TEST(ScriptMakingExternalOneByteString) { |
489 int dispose_count = 0; | 527 int dispose_count = 0; |
490 const char* c_source = "1 + 2 * 3"; | 528 const char* c_source = "1 + 2 * 3"; |
491 { | 529 { |
492 LocalContext env; | 530 LocalContext env; |
493 v8::HandleScope scope(env->GetIsolate()); | 531 v8::HandleScope scope(env->GetIsolate()); |
494 Local<String> source = v8_str(c_source); | 532 Local<String> source = v8_str(c_source); |
495 // Trigger GCs so that the newly allocated string moves to old gen. | 533 // Trigger GCs so that the newly allocated string moves to old gen. |
496 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 534 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
497 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 535 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
498 bool success = source->MakeExternal( | 536 bool success = source->MakeExternal( |
499 new TestOneByteResource(i::StrDup(c_source), &dispose_count)); | 537 new TestOneByteResource(i::StrDup(c_source), &dispose_count)); |
500 CHECK(success); | 538 CHECK(success); |
501 Local<Script> script = v8_compile(source); | 539 Local<Script> script = v8_compile(source); |
502 Local<Value> value = script->Run(); | 540 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
503 CHECK(value->IsNumber()); | 541 CHECK(value->IsNumber()); |
504 CHECK_EQ(7, value->Int32Value()); | 542 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
505 CcTest::heap()->CollectAllGarbage(); | 543 CcTest::heap()->CollectAllGarbage(); |
506 CHECK_EQ(0, dispose_count); | 544 CHECK_EQ(0, dispose_count); |
507 } | 545 } |
508 CcTest::i_isolate()->compilation_cache()->Clear(); | 546 CcTest::i_isolate()->compilation_cache()->Clear(); |
509 CcTest::heap()->CollectAllGarbage(); | 547 CcTest::heap()->CollectAllGarbage(); |
510 CHECK_EQ(1, dispose_count); | 548 CHECK_EQ(1, dispose_count); |
511 } | 549 } |
512 | 550 |
513 | 551 |
514 TEST(MakingExternalStringConditions) { | 552 TEST(MakingExternalStringConditions) { |
515 LocalContext env; | 553 LocalContext env; |
516 v8::HandleScope scope(env->GetIsolate()); | 554 v8::HandleScope scope(env->GetIsolate()); |
517 | 555 |
518 // Free some space in the new space so that we can check freshness. | 556 // Free some space in the new space so that we can check freshness. |
519 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 557 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
520 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 558 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
521 | 559 |
522 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); | 560 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); |
523 Local<String> small_string = | 561 Local<String> small_string = |
524 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); | 562 String::NewFromTwoByte(env->GetIsolate(), two_byte_string, |
563 v8::NewStringType::kNormal) | |
564 .ToLocalChecked(); | |
525 i::DeleteArray(two_byte_string); | 565 i::DeleteArray(two_byte_string); |
526 | 566 |
527 // We should refuse to externalize small strings. | 567 // We should refuse to externalize small strings. |
528 CHECK(!small_string->CanMakeExternal()); | 568 CHECK(!small_string->CanMakeExternal()); |
529 // Trigger GCs so that the newly allocated string moves to old gen. | 569 // Trigger GCs so that the newly allocated string moves to old gen. |
530 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 570 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
531 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 571 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
532 // Old space strings should be accepted. | 572 // Old space strings should be accepted. |
533 CHECK(small_string->CanMakeExternal()); | 573 CHECK(small_string->CanMakeExternal()); |
534 | 574 |
535 two_byte_string = AsciiToTwoByteString("small string 2"); | 575 two_byte_string = AsciiToTwoByteString("small string 2"); |
536 small_string = String::NewFromTwoByte(env->GetIsolate(), two_byte_string); | 576 small_string = String::NewFromTwoByte(env->GetIsolate(), two_byte_string, |
577 v8::NewStringType::kNormal) | |
578 .ToLocalChecked(); | |
537 i::DeleteArray(two_byte_string); | 579 i::DeleteArray(two_byte_string); |
538 | 580 |
539 const int buf_size = 10 * 1024; | 581 const int buf_size = 10 * 1024; |
540 char* buf = i::NewArray<char>(buf_size); | 582 char* buf = i::NewArray<char>(buf_size); |
541 memset(buf, 'a', buf_size); | 583 memset(buf, 'a', buf_size); |
542 buf[buf_size - 1] = '\0'; | 584 buf[buf_size - 1] = '\0'; |
543 | 585 |
544 two_byte_string = AsciiToTwoByteString(buf); | 586 two_byte_string = AsciiToTwoByteString(buf); |
545 Local<String> large_string = | 587 Local<String> large_string = |
546 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); | 588 String::NewFromTwoByte(env->GetIsolate(), two_byte_string, |
589 v8::NewStringType::kNormal) | |
590 .ToLocalChecked(); | |
547 i::DeleteArray(buf); | 591 i::DeleteArray(buf); |
548 i::DeleteArray(two_byte_string); | 592 i::DeleteArray(two_byte_string); |
549 // Large strings should be immediately accepted. | 593 // Large strings should be immediately accepted. |
550 CHECK(large_string->CanMakeExternal()); | 594 CHECK(large_string->CanMakeExternal()); |
551 } | 595 } |
552 | 596 |
553 | 597 |
554 TEST(MakingExternalOneByteStringConditions) { | 598 TEST(MakingExternalOneByteStringConditions) { |
555 LocalContext env; | 599 LocalContext env; |
556 v8::HandleScope scope(env->GetIsolate()); | 600 v8::HandleScope scope(env->GetIsolate()); |
557 | 601 |
558 // Free some space in the new space so that we can check freshness. | 602 // Free some space in the new space so that we can check freshness. |
559 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 603 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
560 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 604 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
561 | 605 |
562 Local<String> small_string = String::NewFromUtf8(env->GetIsolate(), "s1"); | 606 Local<String> small_string = v8_str("s1"); |
563 // We should refuse to externalize small strings. | 607 // We should refuse to externalize small strings. |
564 CHECK(!small_string->CanMakeExternal()); | 608 CHECK(!small_string->CanMakeExternal()); |
565 // Trigger GCs so that the newly allocated string moves to old gen. | 609 // Trigger GCs so that the newly allocated string moves to old gen. |
566 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 610 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 611 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
568 // Old space strings should be accepted. | 612 // Old space strings should be accepted. |
569 CHECK(small_string->CanMakeExternal()); | 613 CHECK(small_string->CanMakeExternal()); |
570 | 614 |
571 const int buf_size = 10 * 1024; | 615 const int buf_size = 10 * 1024; |
572 char* buf = i::NewArray<char>(buf_size); | 616 char* buf = i::NewArray<char>(buf_size); |
573 memset(buf, 'a', buf_size); | 617 memset(buf, 'a', buf_size); |
574 buf[buf_size - 1] = '\0'; | 618 buf[buf_size - 1] = '\0'; |
575 Local<String> large_string = String::NewFromUtf8(env->GetIsolate(), buf); | 619 Local<String> large_string = v8_str(buf); |
576 i::DeleteArray(buf); | 620 i::DeleteArray(buf); |
577 // Large strings should be immediately accepted. | 621 // Large strings should be immediately accepted. |
578 CHECK(large_string->CanMakeExternal()); | 622 CHECK(large_string->CanMakeExternal()); |
579 } | 623 } |
580 | 624 |
581 | 625 |
582 TEST(MakingExternalUnalignedOneByteString) { | 626 TEST(MakingExternalUnalignedOneByteString) { |
583 LocalContext env; | 627 LocalContext env; |
584 v8::HandleScope scope(env->GetIsolate()); | 628 v8::HandleScope scope(env->GetIsolate()); |
585 | 629 |
(...skipping 25 matching lines...) Expand all Loading... | |
611 CcTest::heap()->CollectAllGarbage(); | 655 CcTest::heap()->CollectAllGarbage(); |
612 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); | 656 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); |
613 } | 657 } |
614 | 658 |
615 | 659 |
616 THREADED_TEST(UsingExternalString) { | 660 THREADED_TEST(UsingExternalString) { |
617 i::Factory* factory = CcTest::i_isolate()->factory(); | 661 i::Factory* factory = CcTest::i_isolate()->factory(); |
618 { | 662 { |
619 v8::HandleScope scope(CcTest::isolate()); | 663 v8::HandleScope scope(CcTest::isolate()); |
620 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 664 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
621 Local<String> string = String::NewExternal( | 665 Local<String> string = |
622 CcTest::isolate(), new TestResource(two_byte_string)); | 666 String::NewExternalTwoByte(CcTest::isolate(), |
667 new TestResource(two_byte_string)) | |
668 .ToLocalChecked(); | |
623 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 669 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
624 // Trigger GCs so that the newly allocated string moves to old gen. | 670 // Trigger GCs so that the newly allocated string moves to old gen. |
625 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 671 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
626 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 672 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
627 i::Handle<i::String> isymbol = | 673 i::Handle<i::String> isymbol = |
628 factory->InternalizeString(istring); | 674 factory->InternalizeString(istring); |
629 CHECK(isymbol->IsInternalizedString()); | 675 CHECK(isymbol->IsInternalizedString()); |
630 } | 676 } |
631 CcTest::heap()->CollectAllGarbage(); | 677 CcTest::heap()->CollectAllGarbage(); |
632 CcTest::heap()->CollectAllGarbage(); | 678 CcTest::heap()->CollectAllGarbage(); |
633 } | 679 } |
634 | 680 |
635 | 681 |
636 THREADED_TEST(UsingExternalOneByteString) { | 682 THREADED_TEST(UsingExternalOneByteString) { |
637 i::Factory* factory = CcTest::i_isolate()->factory(); | 683 i::Factory* factory = CcTest::i_isolate()->factory(); |
638 { | 684 { |
639 v8::HandleScope scope(CcTest::isolate()); | 685 v8::HandleScope scope(CcTest::isolate()); |
640 const char* one_byte_string = "test string"; | 686 const char* one_byte_string = "test string"; |
641 Local<String> string = String::NewExternal( | 687 Local<String> string = |
642 CcTest::isolate(), new TestOneByteResource(i::StrDup(one_byte_string))); | 688 String::NewExternalOneByte( |
689 CcTest::isolate(), | |
690 new TestOneByteResource(i::StrDup(one_byte_string))) | |
691 .ToLocalChecked(); | |
643 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 692 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
644 // Trigger GCs so that the newly allocated string moves to old gen. | 693 // Trigger GCs so that the newly allocated string moves to old gen. |
645 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now | 694 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now |
646 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now | 695 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now |
647 i::Handle<i::String> isymbol = | 696 i::Handle<i::String> isymbol = |
648 factory->InternalizeString(istring); | 697 factory->InternalizeString(istring); |
649 CHECK(isymbol->IsInternalizedString()); | 698 CHECK(isymbol->IsInternalizedString()); |
650 } | 699 } |
651 CcTest::heap()->CollectAllGarbage(); | 700 CcTest::heap()->CollectAllGarbage(); |
652 CcTest::heap()->CollectAllGarbage(); | 701 CcTest::heap()->CollectAllGarbage(); |
(...skipping 24 matching lines...) Expand all Loading... | |
677 int length_; | 726 int length_; |
678 }; | 727 }; |
679 | 728 |
680 | 729 |
681 THREADED_TEST(NewExternalForVeryLongString) { | 730 THREADED_TEST(NewExternalForVeryLongString) { |
682 auto isolate = CcTest::isolate(); | 731 auto isolate = CcTest::isolate(); |
683 { | 732 { |
684 v8::HandleScope scope(isolate); | 733 v8::HandleScope scope(isolate); |
685 v8::TryCatch try_catch(isolate); | 734 v8::TryCatch try_catch(isolate); |
686 RandomLengthOneByteResource r(1 << 30); | 735 RandomLengthOneByteResource r(1 << 30); |
687 v8::Local<v8::String> str = v8::String::NewExternal(isolate, &r); | 736 v8::MaybeLocal<v8::String> maybe_str = |
688 CHECK(str.IsEmpty()); | 737 v8::String::NewExternalOneByte(isolate, &r); |
738 CHECK(maybe_str.IsEmpty()); | |
689 CHECK(!try_catch.HasCaught()); | 739 CHECK(!try_catch.HasCaught()); |
690 } | 740 } |
691 | 741 |
692 { | 742 { |
693 v8::HandleScope scope(isolate); | 743 v8::HandleScope scope(isolate); |
694 v8::TryCatch try_catch(isolate); | 744 v8::TryCatch try_catch(isolate); |
695 RandomLengthResource r(1 << 30); | 745 RandomLengthResource r(1 << 30); |
696 v8::Local<v8::String> str = v8::String::NewExternal(isolate, &r); | 746 v8::MaybeLocal<v8::String> maybe_str = |
697 CHECK(str.IsEmpty()); | 747 v8::String::NewExternalTwoByte(isolate, &r); |
748 CHECK(maybe_str.IsEmpty()); | |
698 CHECK(!try_catch.HasCaught()); | 749 CHECK(!try_catch.HasCaught()); |
699 } | 750 } |
700 } | 751 } |
701 | 752 |
702 | 753 |
703 THREADED_TEST(ScavengeExternalString) { | 754 THREADED_TEST(ScavengeExternalString) { |
704 i::FLAG_stress_compaction = false; | 755 i::FLAG_stress_compaction = false; |
705 i::FLAG_gc_global = false; | 756 i::FLAG_gc_global = false; |
706 int dispose_count = 0; | 757 int dispose_count = 0; |
707 bool in_new_space = false; | 758 bool in_new_space = false; |
708 { | 759 { |
709 v8::HandleScope scope(CcTest::isolate()); | 760 v8::HandleScope scope(CcTest::isolate()); |
710 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); | 761 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); |
711 Local<String> string = String::NewExternal( | 762 Local<String> string = |
712 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); | 763 String::NewExternalTwoByte( |
764 CcTest::isolate(), | |
765 new TestResource(two_byte_string, &dispose_count)) | |
766 .ToLocalChecked(); | |
713 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 767 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
714 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 768 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
715 in_new_space = CcTest::heap()->InNewSpace(*istring); | 769 in_new_space = CcTest::heap()->InNewSpace(*istring); |
716 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 770 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); |
717 CHECK_EQ(0, dispose_count); | 771 CHECK_EQ(0, dispose_count); |
718 } | 772 } |
719 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 773 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); |
720 CHECK_EQ(1, dispose_count); | 774 CHECK_EQ(1, dispose_count); |
721 } | 775 } |
722 | 776 |
723 | 777 |
724 THREADED_TEST(ScavengeExternalOneByteString) { | 778 THREADED_TEST(ScavengeExternalOneByteString) { |
725 i::FLAG_stress_compaction = false; | 779 i::FLAG_stress_compaction = false; |
726 i::FLAG_gc_global = false; | 780 i::FLAG_gc_global = false; |
727 int dispose_count = 0; | 781 int dispose_count = 0; |
728 bool in_new_space = false; | 782 bool in_new_space = false; |
729 { | 783 { |
730 v8::HandleScope scope(CcTest::isolate()); | 784 v8::HandleScope scope(CcTest::isolate()); |
731 const char* one_byte_string = "test string"; | 785 const char* one_byte_string = "test string"; |
732 Local<String> string = String::NewExternal( | 786 Local<String> string = |
733 CcTest::isolate(), | 787 String::NewExternalOneByte( |
734 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); | 788 CcTest::isolate(), |
789 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)) | |
790 .ToLocalChecked(); | |
735 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); | 791 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); |
736 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 792 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
737 in_new_space = CcTest::heap()->InNewSpace(*istring); | 793 in_new_space = CcTest::heap()->InNewSpace(*istring); |
738 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); | 794 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); |
739 CHECK_EQ(0, dispose_count); | 795 CHECK_EQ(0, dispose_count); |
740 } | 796 } |
741 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); | 797 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); |
742 CHECK_EQ(1, dispose_count); | 798 CHECK_EQ(1, dispose_count); |
743 } | 799 } |
744 | 800 |
(...skipping 23 matching lines...) Expand all Loading... | |
768 TEST(ExternalStringWithDisposeHandling) { | 824 TEST(ExternalStringWithDisposeHandling) { |
769 const char* c_source = "1 + 2 * 3"; | 825 const char* c_source = "1 + 2 * 3"; |
770 | 826 |
771 // Use a stack allocated external string resource allocated object. | 827 // Use a stack allocated external string resource allocated object. |
772 TestOneByteResourceWithDisposeControl::dispose_count = 0; | 828 TestOneByteResourceWithDisposeControl::dispose_count = 0; |
773 TestOneByteResourceWithDisposeControl::dispose_calls = 0; | 829 TestOneByteResourceWithDisposeControl::dispose_calls = 0; |
774 TestOneByteResourceWithDisposeControl res_stack(i::StrDup(c_source), false); | 830 TestOneByteResourceWithDisposeControl res_stack(i::StrDup(c_source), false); |
775 { | 831 { |
776 LocalContext env; | 832 LocalContext env; |
777 v8::HandleScope scope(env->GetIsolate()); | 833 v8::HandleScope scope(env->GetIsolate()); |
778 Local<String> source = String::NewExternal(env->GetIsolate(), &res_stack); | 834 Local<String> source = |
835 String::NewExternalOneByte(env->GetIsolate(), &res_stack) | |
836 .ToLocalChecked(); | |
779 Local<Script> script = v8_compile(source); | 837 Local<Script> script = v8_compile(source); |
780 Local<Value> value = script->Run(); | 838 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
781 CHECK(value->IsNumber()); | 839 CHECK(value->IsNumber()); |
782 CHECK_EQ(7, value->Int32Value()); | 840 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
783 CcTest::heap()->CollectAllAvailableGarbage(); | 841 CcTest::heap()->CollectAllAvailableGarbage(); |
784 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); | 842 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); |
785 } | 843 } |
786 CcTest::i_isolate()->compilation_cache()->Clear(); | 844 CcTest::i_isolate()->compilation_cache()->Clear(); |
787 CcTest::heap()->CollectAllAvailableGarbage(); | 845 CcTest::heap()->CollectAllAvailableGarbage(); |
788 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); | 846 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); |
789 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); | 847 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); |
790 | 848 |
791 // Use a heap allocated external string resource allocated object. | 849 // Use a heap allocated external string resource allocated object. |
792 TestOneByteResourceWithDisposeControl::dispose_count = 0; | 850 TestOneByteResourceWithDisposeControl::dispose_count = 0; |
793 TestOneByteResourceWithDisposeControl::dispose_calls = 0; | 851 TestOneByteResourceWithDisposeControl::dispose_calls = 0; |
794 TestOneByteResource* res_heap = | 852 TestOneByteResource* res_heap = |
795 new TestOneByteResourceWithDisposeControl(i::StrDup(c_source), true); | 853 new TestOneByteResourceWithDisposeControl(i::StrDup(c_source), true); |
796 { | 854 { |
797 LocalContext env; | 855 LocalContext env; |
798 v8::HandleScope scope(env->GetIsolate()); | 856 v8::HandleScope scope(env->GetIsolate()); |
799 Local<String> source = String::NewExternal(env->GetIsolate(), res_heap); | 857 Local<String> source = |
858 String::NewExternalOneByte(env->GetIsolate(), res_heap) | |
859 .ToLocalChecked(); | |
800 Local<Script> script = v8_compile(source); | 860 Local<Script> script = v8_compile(source); |
801 Local<Value> value = script->Run(); | 861 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
802 CHECK(value->IsNumber()); | 862 CHECK(value->IsNumber()); |
803 CHECK_EQ(7, value->Int32Value()); | 863 CHECK_EQ(7, value->Int32Value(env.local()).FromJust()); |
804 CcTest::heap()->CollectAllAvailableGarbage(); | 864 CcTest::heap()->CollectAllAvailableGarbage(); |
805 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); | 865 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); |
806 } | 866 } |
807 CcTest::i_isolate()->compilation_cache()->Clear(); | 867 CcTest::i_isolate()->compilation_cache()->Clear(); |
808 CcTest::heap()->CollectAllAvailableGarbage(); | 868 CcTest::heap()->CollectAllAvailableGarbage(); |
809 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); | 869 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); |
810 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_count); | 870 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_count); |
811 } | 871 } |
812 | 872 |
813 | 873 |
814 THREADED_TEST(StringConcat) { | 874 THREADED_TEST(StringConcat) { |
815 { | 875 { |
816 LocalContext env; | 876 LocalContext env; |
817 v8::HandleScope scope(env->GetIsolate()); | 877 v8::HandleScope scope(env->GetIsolate()); |
818 const char* one_byte_string_1 = "function a_times_t"; | 878 const char* one_byte_string_1 = "function a_times_t"; |
819 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; | 879 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; |
820 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; | 880 const char* one_byte_extern_1 = "a * 2 + b;} a_times_two_plus_b(4, 8) + "; |
821 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + "; | 881 const char* two_byte_extern_1 = "a_times_two_plus_b(4, 8) + "; |
822 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + "; | 882 const char* one_byte_string_2 = "a_times_two_plus_b(4, 8) + "; |
823 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + "; | 883 const char* two_byte_string_2 = "a_times_two_plus_b(4, 8) + "; |
824 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);"; | 884 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);"; |
825 Local<String> left = v8_str(one_byte_string_1); | 885 Local<String> left = v8_str(one_byte_string_1); |
826 | 886 |
827 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1); | 887 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1); |
828 Local<String> right = | 888 Local<String> right = |
829 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); | 889 String::NewFromTwoByte(env->GetIsolate(), two_byte_source, |
890 v8::NewStringType::kNormal) | |
891 .ToLocalChecked(); | |
830 i::DeleteArray(two_byte_source); | 892 i::DeleteArray(two_byte_source); |
831 | 893 |
832 Local<String> source = String::Concat(left, right); | 894 Local<String> source = String::Concat(left, right); |
833 right = String::NewExternal( | 895 right = String::NewExternalOneByte( |
834 env->GetIsolate(), | 896 env->GetIsolate(), |
835 new TestOneByteResource(i::StrDup(one_byte_extern_1))); | 897 new TestOneByteResource(i::StrDup(one_byte_extern_1))) |
898 .ToLocalChecked(); | |
836 source = String::Concat(source, right); | 899 source = String::Concat(source, right); |
837 right = String::NewExternal( | 900 right = String::NewExternalTwoByte( |
838 env->GetIsolate(), | 901 env->GetIsolate(), |
839 new TestResource(AsciiToTwoByteString(two_byte_extern_1))); | 902 new TestResource(AsciiToTwoByteString(two_byte_extern_1))) |
903 .ToLocalChecked(); | |
840 source = String::Concat(source, right); | 904 source = String::Concat(source, right); |
841 right = v8_str(one_byte_string_2); | 905 right = v8_str(one_byte_string_2); |
842 source = String::Concat(source, right); | 906 source = String::Concat(source, right); |
843 | 907 |
844 two_byte_source = AsciiToTwoByteString(two_byte_string_2); | 908 two_byte_source = AsciiToTwoByteString(two_byte_string_2); |
845 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source); | 909 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source, |
910 v8::NewStringType::kNormal) | |
911 .ToLocalChecked(); | |
846 i::DeleteArray(two_byte_source); | 912 i::DeleteArray(two_byte_source); |
847 | 913 |
848 source = String::Concat(source, right); | 914 source = String::Concat(source, right); |
849 right = String::NewExternal( | 915 right = String::NewExternalTwoByte( |
850 env->GetIsolate(), | 916 env->GetIsolate(), |
851 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); | 917 new TestResource(AsciiToTwoByteString(two_byte_extern_2))) |
918 .ToLocalChecked(); | |
852 source = String::Concat(source, right); | 919 source = String::Concat(source, right); |
853 Local<Script> script = v8_compile(source); | 920 Local<Script> script = v8_compile(source); |
854 Local<Value> value = script->Run(); | 921 Local<Value> value = script->Run(env.local()).ToLocalChecked(); |
855 CHECK(value->IsNumber()); | 922 CHECK(value->IsNumber()); |
856 CHECK_EQ(68, value->Int32Value()); | 923 CHECK_EQ(68, value->Int32Value(env.local()).FromJust()); |
857 } | 924 } |
858 CcTest::i_isolate()->compilation_cache()->Clear(); | 925 CcTest::i_isolate()->compilation_cache()->Clear(); |
859 CcTest::heap()->CollectAllGarbage(); | 926 CcTest::heap()->CollectAllGarbage(); |
860 CcTest::heap()->CollectAllGarbage(); | 927 CcTest::heap()->CollectAllGarbage(); |
861 } | 928 } |
862 | 929 |
863 | 930 |
864 THREADED_TEST(GlobalProperties) { | 931 THREADED_TEST(GlobalProperties) { |
865 LocalContext env; | 932 LocalContext env; |
866 v8::HandleScope scope(env->GetIsolate()); | 933 v8::HandleScope scope(env->GetIsolate()); |
867 v8::Handle<v8::Object> global = env->Global(); | 934 v8::Local<v8::Object> global = env->Global(); |
868 global->Set(v8_str("pi"), v8_num(3.1415926)); | 935 CHECK(global->Set(env.local(), v8_str("pi"), v8_num(3.1415926)).FromJust()); |
869 Local<Value> pi = global->Get(v8_str("pi")); | 936 Local<Value> pi = global->Get(env.local(), v8_str("pi")).ToLocalChecked(); |
870 CHECK_EQ(3.1415926, pi->NumberValue()); | 937 CHECK_EQ(3.1415926, pi->NumberValue(env.local()).FromJust()); |
871 } | 938 } |
872 | 939 |
873 | 940 |
874 static void handle_callback_impl(const v8::FunctionCallbackInfo<Value>& info, | 941 static void handle_callback_impl(const v8::FunctionCallbackInfo<Value>& info, |
875 i::Address callback) { | 942 i::Address callback) { |
876 ApiTestFuzzer::Fuzz(); | 943 ApiTestFuzzer::Fuzz(); |
877 CheckReturnValue(info, callback); | 944 CheckReturnValue(info, callback); |
878 info.GetReturnValue().Set(v8_str("bad value")); | 945 info.GetReturnValue().Set(v8_str("bad value")); |
879 info.GetReturnValue().Set(v8_num(102)); | 946 info.GetReturnValue().Set(v8_num(102)); |
880 } | 947 } |
881 | 948 |
882 | 949 |
883 static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) { | 950 static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) { |
884 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback)); | 951 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback)); |
885 } | 952 } |
886 | 953 |
887 | 954 |
888 static void handle_callback_2(const v8::FunctionCallbackInfo<Value>& info) { | 955 static void handle_callback_2(const v8::FunctionCallbackInfo<Value>& info) { |
889 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback_2)); | 956 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback_2)); |
890 } | 957 } |
891 | 958 |
892 static void construct_callback( | 959 static void construct_callback( |
893 const v8::FunctionCallbackInfo<Value>& info) { | 960 const v8::FunctionCallbackInfo<Value>& info) { |
894 ApiTestFuzzer::Fuzz(); | 961 ApiTestFuzzer::Fuzz(); |
895 CheckReturnValue(info, FUNCTION_ADDR(construct_callback)); | 962 CheckReturnValue(info, FUNCTION_ADDR(construct_callback)); |
896 info.This()->Set(v8_str("x"), v8_num(1)); | 963 CHECK( |
897 info.This()->Set(v8_str("y"), v8_num(2)); | 964 info.This() |
965 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("x"), v8_num(1)) | |
966 .FromJust()); | |
967 CHECK( | |
968 info.This() | |
969 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("y"), v8_num(2)) | |
970 .FromJust()); | |
898 info.GetReturnValue().Set(v8_str("bad value")); | 971 info.GetReturnValue().Set(v8_str("bad value")); |
899 info.GetReturnValue().Set(info.This()); | 972 info.GetReturnValue().Set(info.This()); |
900 } | 973 } |
901 | 974 |
902 | 975 |
903 static void Return239Callback( | 976 static void Return239Callback( |
904 Local<String> name, const v8::PropertyCallbackInfo<Value>& info) { | 977 Local<String> name, const v8::PropertyCallbackInfo<Value>& info) { |
905 ApiTestFuzzer::Fuzz(); | 978 ApiTestFuzzer::Fuzz(); |
906 CheckReturnValue(info, FUNCTION_ADDR(Return239Callback)); | 979 CheckReturnValue(info, FUNCTION_ADDR(Return239Callback)); |
907 info.GetReturnValue().Set(v8_str("bad value")); | 980 info.GetReturnValue().Set(v8_str("bad value")); |
908 info.GetReturnValue().Set(v8_num(239)); | 981 info.GetReturnValue().Set(v8_num(239)); |
909 } | 982 } |
910 | 983 |
911 | 984 |
912 template<typename Handler> | 985 template<typename Handler> |
913 static void TestFunctionTemplateInitializer(Handler handler, | 986 static void TestFunctionTemplateInitializer(Handler handler, |
914 Handler handler_2) { | 987 Handler handler_2) { |
915 // Test constructor calls. | 988 // Test constructor calls. |
916 { | 989 { |
917 LocalContext env; | 990 LocalContext env; |
918 v8::Isolate* isolate = env->GetIsolate(); | 991 v8::Isolate* isolate = env->GetIsolate(); |
919 v8::HandleScope scope(isolate); | 992 v8::HandleScope scope(isolate); |
920 | 993 |
921 Local<v8::FunctionTemplate> fun_templ = | 994 Local<v8::FunctionTemplate> fun_templ = |
922 v8::FunctionTemplate::New(isolate, handler); | 995 v8::FunctionTemplate::New(isolate, handler); |
923 Local<Function> fun = fun_templ->GetFunction(); | 996 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
924 env->Global()->Set(v8_str("obj"), fun); | 997 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
925 Local<Script> script = v8_compile("obj()"); | 998 Local<Script> script = v8_compile("obj()"); |
926 for (int i = 0; i < 30; i++) { | 999 for (int i = 0; i < 30; i++) { |
927 CHECK_EQ(102, script->Run()->Int32Value()); | 1000 CHECK_EQ(102, v8_run_int32value(script)); |
928 } | 1001 } |
929 } | 1002 } |
930 // Use SetCallHandler to initialize a function template, should work like | 1003 // Use SetCallHandler to initialize a function template, should work like |
931 // the previous one. | 1004 // the previous one. |
932 { | 1005 { |
933 LocalContext env; | 1006 LocalContext env; |
934 v8::Isolate* isolate = env->GetIsolate(); | 1007 v8::Isolate* isolate = env->GetIsolate(); |
935 v8::HandleScope scope(isolate); | 1008 v8::HandleScope scope(isolate); |
936 | 1009 |
937 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); | 1010 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
938 fun_templ->SetCallHandler(handler_2); | 1011 fun_templ->SetCallHandler(handler_2); |
939 Local<Function> fun = fun_templ->GetFunction(); | 1012 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
940 env->Global()->Set(v8_str("obj"), fun); | 1013 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
941 Local<Script> script = v8_compile("obj()"); | 1014 Local<Script> script = v8_compile("obj()"); |
942 for (int i = 0; i < 30; i++) { | 1015 for (int i = 0; i < 30; i++) { |
943 CHECK_EQ(102, script->Run()->Int32Value()); | 1016 CHECK_EQ(102, v8_run_int32value(script)); |
944 } | 1017 } |
945 } | 1018 } |
946 } | 1019 } |
947 | 1020 |
948 | 1021 |
949 template<typename Constructor, typename Accessor> | 1022 template<typename Constructor, typename Accessor> |
950 static void TestFunctionTemplateAccessor(Constructor constructor, | 1023 static void TestFunctionTemplateAccessor(Constructor constructor, |
951 Accessor accessor) { | 1024 Accessor accessor) { |
952 LocalContext env; | 1025 LocalContext env; |
953 v8::HandleScope scope(env->GetIsolate()); | 1026 v8::HandleScope scope(env->GetIsolate()); |
954 | 1027 |
955 Local<v8::FunctionTemplate> fun_templ = | 1028 Local<v8::FunctionTemplate> fun_templ = |
956 v8::FunctionTemplate::New(env->GetIsolate(), constructor); | 1029 v8::FunctionTemplate::New(env->GetIsolate(), constructor); |
957 fun_templ->SetClassName(v8_str("funky")); | 1030 fun_templ->SetClassName(v8_str("funky")); |
958 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); | 1031 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); |
959 Local<Function> fun = fun_templ->GetFunction(); | 1032 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
960 env->Global()->Set(v8_str("obj"), fun); | 1033 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
961 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); | 1034 Local<Value> result = |
962 CHECK(v8_str("[object funky]")->Equals(result)); | 1035 v8_compile("(new obj()).toString()")->Run(env.local()).ToLocalChecked(); |
1036 CHECK(v8_str("[object funky]")->Equals(env.local(), result).FromJust()); | |
963 CompileRun("var obj_instance = new obj();"); | 1037 CompileRun("var obj_instance = new obj();"); |
964 Local<Script> script; | 1038 Local<Script> script; |
965 script = v8_compile("obj_instance.x"); | 1039 script = v8_compile("obj_instance.x"); |
966 for (int i = 0; i < 30; i++) { | 1040 for (int i = 0; i < 30; i++) { |
967 CHECK_EQ(1, script->Run()->Int32Value()); | 1041 CHECK_EQ(1, v8_run_int32value(script)); |
968 } | 1042 } |
969 script = v8_compile("obj_instance.m"); | 1043 script = v8_compile("obj_instance.m"); |
970 for (int i = 0; i < 30; i++) { | 1044 for (int i = 0; i < 30; i++) { |
971 CHECK_EQ(239, script->Run()->Int32Value()); | 1045 CHECK_EQ(239, v8_run_int32value(script)); |
972 } | 1046 } |
973 } | 1047 } |
974 | 1048 |
975 | 1049 |
976 THREADED_PROFILED_TEST(FunctionTemplate) { | 1050 THREADED_PROFILED_TEST(FunctionTemplate) { |
977 TestFunctionTemplateInitializer(handle_callback, handle_callback_2); | 1051 TestFunctionTemplateInitializer(handle_callback, handle_callback_2); |
978 TestFunctionTemplateAccessor(construct_callback, Return239Callback); | 1052 TestFunctionTemplateAccessor(construct_callback, Return239Callback); |
979 } | 1053 } |
980 | 1054 |
981 | 1055 |
982 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { | 1056 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { |
983 ApiTestFuzzer::Fuzz(); | 1057 ApiTestFuzzer::Fuzz(); |
984 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback)); | 1058 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback)); |
985 info.GetReturnValue().Set(v8_num(51423 + info.Length())); | 1059 info.GetReturnValue().Set(v8_num(51423 + info.Length())); |
986 } | 1060 } |
987 | 1061 |
988 | 1062 |
989 template<typename Callback> | 1063 template<typename Callback> |
990 static void TestSimpleCallback(Callback callback) { | 1064 static void TestSimpleCallback(Callback callback) { |
991 LocalContext env; | 1065 LocalContext env; |
992 v8::Isolate* isolate = env->GetIsolate(); | 1066 v8::Isolate* isolate = env->GetIsolate(); |
993 v8::HandleScope scope(isolate); | 1067 v8::HandleScope scope(isolate); |
994 | 1068 |
995 v8::Handle<v8::ObjectTemplate> object_template = | 1069 v8::Local<v8::ObjectTemplate> object_template = |
996 v8::ObjectTemplate::New(isolate); | 1070 v8::ObjectTemplate::New(isolate); |
997 object_template->Set(isolate, "callback", | 1071 object_template->Set(isolate, "callback", |
998 v8::FunctionTemplate::New(isolate, callback)); | 1072 v8::FunctionTemplate::New(isolate, callback)); |
999 v8::Local<v8::Object> object = object_template->NewInstance(); | 1073 v8::Local<v8::Object> object = |
1000 (*env)->Global()->Set(v8_str("callback_object"), object); | 1074 object_template->NewInstance(env.local()).ToLocalChecked(); |
1001 v8::Handle<v8::Script> script; | 1075 CHECK((*env) |
1076 ->Global() | |
1077 ->Set(env.local(), v8_str("callback_object"), object) | |
1078 .FromJust()); | |
1079 v8::Local<v8::Script> script; | |
1002 script = v8_compile("callback_object.callback(17)"); | 1080 script = v8_compile("callback_object.callback(17)"); |
1003 for (int i = 0; i < 30; i++) { | 1081 for (int i = 0; i < 30; i++) { |
1004 CHECK_EQ(51424, script->Run()->Int32Value()); | 1082 CHECK_EQ(51424, v8_run_int32value(script)); |
1005 } | 1083 } |
1006 script = v8_compile("callback_object.callback(17, 24)"); | 1084 script = v8_compile("callback_object.callback(17, 24)"); |
1007 for (int i = 0; i < 30; i++) { | 1085 for (int i = 0; i < 30; i++) { |
1008 CHECK_EQ(51425, script->Run()->Int32Value()); | 1086 CHECK_EQ(51425, v8_run_int32value(script)); |
1009 } | 1087 } |
1010 } | 1088 } |
1011 | 1089 |
1012 | 1090 |
1013 THREADED_PROFILED_TEST(SimpleCallback) { | 1091 THREADED_PROFILED_TEST(SimpleCallback) { |
1014 TestSimpleCallback(SimpleCallback); | 1092 TestSimpleCallback(SimpleCallback); |
1015 } | 1093 } |
1016 | 1094 |
1017 | 1095 |
1018 template<typename T> | 1096 template<typename T> |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1079 break; | 1157 break; |
1080 case kEmptyStringReturnValue: | 1158 case kEmptyStringReturnValue: |
1081 info.GetReturnValue().SetEmptyString(); | 1159 info.GetReturnValue().SetEmptyString(); |
1082 break; | 1160 break; |
1083 } | 1161 } |
1084 } | 1162 } |
1085 | 1163 |
1086 template<> | 1164 template<> |
1087 void FastReturnValueCallback<Object>( | 1165 void FastReturnValueCallback<Object>( |
1088 const v8::FunctionCallbackInfo<v8::Value>& info) { | 1166 const v8::FunctionCallbackInfo<v8::Value>& info) { |
1089 v8::Handle<v8::Object> object; | 1167 v8::Local<v8::Object> object; |
1090 if (!fast_return_value_object_is_empty) { | 1168 if (!fast_return_value_object_is_empty) { |
1091 object = Object::New(info.GetIsolate()); | 1169 object = Object::New(info.GetIsolate()); |
1092 } | 1170 } |
1093 info.GetReturnValue().Set(object); | 1171 info.GetReturnValue().Set(object); |
1094 } | 1172 } |
1095 | 1173 |
1096 template<typename T> | 1174 template <typename T> |
1097 Handle<Value> TestFastReturnValues() { | 1175 Local<Value> TestFastReturnValues() { |
1098 LocalContext env; | 1176 LocalContext env; |
1099 v8::Isolate* isolate = env->GetIsolate(); | 1177 v8::Isolate* isolate = env->GetIsolate(); |
1100 v8::EscapableHandleScope scope(isolate); | 1178 v8::EscapableHandleScope scope(isolate); |
1101 v8::Handle<v8::ObjectTemplate> object_template = | 1179 v8::Local<v8::ObjectTemplate> object_template = |
1102 v8::ObjectTemplate::New(isolate); | 1180 v8::ObjectTemplate::New(isolate); |
1103 v8::FunctionCallback callback = &FastReturnValueCallback<T>; | 1181 v8::FunctionCallback callback = &FastReturnValueCallback<T>; |
1104 object_template->Set(isolate, "callback", | 1182 object_template->Set(isolate, "callback", |
1105 v8::FunctionTemplate::New(isolate, callback)); | 1183 v8::FunctionTemplate::New(isolate, callback)); |
1106 v8::Local<v8::Object> object = object_template->NewInstance(); | 1184 v8::Local<v8::Object> object = |
1107 (*env)->Global()->Set(v8_str("callback_object"), object); | 1185 object_template->NewInstance(env.local()).ToLocalChecked(); |
1186 CHECK((*env) | |
1187 ->Global() | |
1188 ->Set(env.local(), v8_str("callback_object"), object) | |
1189 .FromJust()); | |
1108 return scope.Escape(CompileRun("callback_object.callback()")); | 1190 return scope.Escape(CompileRun("callback_object.callback()")); |
1109 } | 1191 } |
1110 | 1192 |
1111 | 1193 |
1112 THREADED_PROFILED_TEST(FastReturnValues) { | 1194 THREADED_PROFILED_TEST(FastReturnValues) { |
1113 LocalContext env; | 1195 LocalContext env; |
1114 v8::Isolate* isolate = env->GetIsolate(); | 1196 v8::Isolate* isolate = env->GetIsolate(); |
1115 v8::HandleScope scope(isolate); | 1197 v8::HandleScope scope(isolate); |
1116 v8::Handle<v8::Value> value; | 1198 v8::Local<v8::Value> value; |
1117 // check int32_t and uint32_t | 1199 // check int32_t and uint32_t |
1118 int32_t int_values[] = { | 1200 int32_t int_values[] = { |
1119 0, 234, -723, | 1201 0, 234, -723, |
1120 i::Smi::kMinValue, i::Smi::kMaxValue | 1202 i::Smi::kMinValue, i::Smi::kMaxValue |
1121 }; | 1203 }; |
1122 for (size_t i = 0; i < arraysize(int_values); i++) { | 1204 for (size_t i = 0; i < arraysize(int_values); i++) { |
1123 for (int modifier = -1; modifier <= 1; modifier++) { | 1205 for (int modifier = -1; modifier <= 1; modifier++) { |
1124 int int_value = int_values[i] + modifier; | 1206 int int_value = int_values[i] + modifier; |
1125 // check int32_t | 1207 // check int32_t |
1126 fast_return_value_int32 = int_value; | 1208 fast_return_value_int32 = int_value; |
1127 value = TestFastReturnValues<int32_t>(); | 1209 value = TestFastReturnValues<int32_t>(); |
1128 CHECK(value->IsInt32()); | 1210 CHECK(value->IsInt32()); |
1129 CHECK(fast_return_value_int32 == value->Int32Value()); | 1211 CHECK_EQ(fast_return_value_int32, |
1212 value->Int32Value(env.local()).FromJust()); | |
1130 // check uint32_t | 1213 // check uint32_t |
1131 fast_return_value_uint32 = static_cast<uint32_t>(int_value); | 1214 fast_return_value_uint32 = static_cast<uint32_t>(int_value); |
1132 value = TestFastReturnValues<uint32_t>(); | 1215 value = TestFastReturnValues<uint32_t>(); |
1133 CHECK(value->IsUint32()); | 1216 CHECK(value->IsUint32()); |
1134 CHECK(fast_return_value_uint32 == value->Uint32Value()); | 1217 CHECK_EQ(fast_return_value_uint32, |
1218 value->Uint32Value(env.local()).FromJust()); | |
1135 } | 1219 } |
1136 } | 1220 } |
1137 // check double | 1221 // check double |
1138 value = TestFastReturnValues<double>(); | 1222 value = TestFastReturnValues<double>(); |
1139 CHECK(value->IsNumber()); | 1223 CHECK(value->IsNumber()); |
1140 CHECK_EQ(kFastReturnValueDouble, value->ToNumber(isolate)->Value()); | 1224 CHECK_EQ(kFastReturnValueDouble, |
1225 value->ToNumber(env.local()).ToLocalChecked()->Value()); | |
1141 // check bool values | 1226 // check bool values |
1142 for (int i = 0; i < 2; i++) { | 1227 for (int i = 0; i < 2; i++) { |
1143 fast_return_value_bool = i == 0; | 1228 fast_return_value_bool = i == 0; |
1144 value = TestFastReturnValues<bool>(); | 1229 value = TestFastReturnValues<bool>(); |
1145 CHECK(value->IsBoolean()); | 1230 CHECK(value->IsBoolean()); |
1146 CHECK_EQ(fast_return_value_bool, value->ToBoolean(isolate)->Value()); | 1231 CHECK_EQ(fast_return_value_bool, |
1232 value->ToBoolean(env.local()).ToLocalChecked()->Value()); | |
1147 } | 1233 } |
1148 // check oddballs | 1234 // check oddballs |
1149 ReturnValueOddball oddballs[] = { | 1235 ReturnValueOddball oddballs[] = { |
1150 kNullReturnValue, | 1236 kNullReturnValue, |
1151 kUndefinedReturnValue, | 1237 kUndefinedReturnValue, |
1152 kEmptyStringReturnValue | 1238 kEmptyStringReturnValue |
1153 }; | 1239 }; |
1154 for (size_t i = 0; i < arraysize(oddballs); i++) { | 1240 for (size_t i = 0; i < arraysize(oddballs); i++) { |
1155 fast_return_value_void = oddballs[i]; | 1241 fast_return_value_void = oddballs[i]; |
1156 value = TestFastReturnValues<void>(); | 1242 value = TestFastReturnValues<void>(); |
(...skipping 19 matching lines...) Expand all Loading... | |
1176 CHECK(value->IsUndefined()); | 1262 CHECK(value->IsUndefined()); |
1177 } | 1263 } |
1178 | 1264 |
1179 | 1265 |
1180 THREADED_TEST(FunctionTemplateSetLength) { | 1266 THREADED_TEST(FunctionTemplateSetLength) { |
1181 LocalContext env; | 1267 LocalContext env; |
1182 v8::Isolate* isolate = env->GetIsolate(); | 1268 v8::Isolate* isolate = env->GetIsolate(); |
1183 v8::HandleScope scope(isolate); | 1269 v8::HandleScope scope(isolate); |
1184 { | 1270 { |
1185 Local<v8::FunctionTemplate> fun_templ = | 1271 Local<v8::FunctionTemplate> fun_templ = |
1186 v8::FunctionTemplate::New(isolate, | 1272 v8::FunctionTemplate::New(isolate, handle_callback, Local<v8::Value>(), |
1187 handle_callback, | 1273 Local<v8::Signature>(), 23); |
1188 Handle<v8::Value>(), | 1274 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
1189 Handle<v8::Signature>(), | 1275 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
1190 23); | |
1191 Local<Function> fun = fun_templ->GetFunction(); | |
1192 env->Global()->Set(v8_str("obj"), fun); | |
1193 Local<Script> script = v8_compile("obj.length"); | 1276 Local<Script> script = v8_compile("obj.length"); |
1194 CHECK_EQ(23, script->Run()->Int32Value()); | 1277 CHECK_EQ(23, v8_run_int32value(script)); |
1195 } | 1278 } |
1196 { | 1279 { |
1197 Local<v8::FunctionTemplate> fun_templ = | 1280 Local<v8::FunctionTemplate> fun_templ = |
1198 v8::FunctionTemplate::New(isolate, handle_callback); | 1281 v8::FunctionTemplate::New(isolate, handle_callback); |
1199 fun_templ->SetLength(22); | 1282 fun_templ->SetLength(22); |
1200 Local<Function> fun = fun_templ->GetFunction(); | 1283 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
1201 env->Global()->Set(v8_str("obj"), fun); | 1284 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
1202 Local<Script> script = v8_compile("obj.length"); | 1285 Local<Script> script = v8_compile("obj.length"); |
1203 CHECK_EQ(22, script->Run()->Int32Value()); | 1286 CHECK_EQ(22, v8_run_int32value(script)); |
1204 } | 1287 } |
1205 { | 1288 { |
1206 // Without setting length it defaults to 0. | 1289 // Without setting length it defaults to 0. |
1207 Local<v8::FunctionTemplate> fun_templ = | 1290 Local<v8::FunctionTemplate> fun_templ = |
1208 v8::FunctionTemplate::New(isolate, handle_callback); | 1291 v8::FunctionTemplate::New(isolate, handle_callback); |
1209 Local<Function> fun = fun_templ->GetFunction(); | 1292 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
1210 env->Global()->Set(v8_str("obj"), fun); | 1293 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust()); |
1211 Local<Script> script = v8_compile("obj.length"); | 1294 Local<Script> script = v8_compile("obj.length"); |
1212 CHECK_EQ(0, script->Run()->Int32Value()); | 1295 CHECK_EQ(0, v8_run_int32value(script)); |
1213 } | 1296 } |
1214 } | 1297 } |
1215 | 1298 |
1216 | 1299 |
1217 static void* expected_ptr; | 1300 static void* expected_ptr; |
1218 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1301 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1219 void* ptr = v8::External::Cast(*args.Data())->Value(); | 1302 void* ptr = v8::External::Cast(*args.Data())->Value(); |
1220 CHECK_EQ(expected_ptr, ptr); | 1303 CHECK_EQ(expected_ptr, ptr); |
1221 args.GetReturnValue().Set(true); | 1304 args.GetReturnValue().Set(true); |
1222 } | 1305 } |
1223 | 1306 |
1224 | 1307 |
1225 static void TestExternalPointerWrapping() { | 1308 static void TestExternalPointerWrapping() { |
1226 LocalContext env; | 1309 LocalContext env; |
1227 v8::Isolate* isolate = env->GetIsolate(); | 1310 v8::Isolate* isolate = env->GetIsolate(); |
1228 v8::HandleScope scope(isolate); | 1311 v8::HandleScope scope(isolate); |
1229 | 1312 |
1230 v8::Handle<v8::Value> data = | 1313 v8::Local<v8::Value> data = v8::External::New(isolate, expected_ptr); |
1231 v8::External::New(isolate, expected_ptr); | |
1232 | 1314 |
1233 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | 1315 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
1234 obj->Set(v8_str("func"), | 1316 CHECK(obj->Set(env.local(), v8_str("func"), |
1235 v8::FunctionTemplate::New(isolate, callback, data)->GetFunction()); | 1317 v8::FunctionTemplate::New(isolate, callback, data) |
1236 env->Global()->Set(v8_str("obj"), obj); | 1318 ->GetFunction(env.local()) |
1319 .ToLocalChecked()) | |
1320 .FromJust()); | |
1321 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust()); | |
1237 | 1322 |
1238 CHECK(CompileRun( | 1323 CHECK(CompileRun("function foo() {\n" |
1239 "function foo() {\n" | 1324 " for (var i = 0; i < 13; i++) obj.func();\n" |
1240 " for (var i = 0; i < 13; i++) obj.func();\n" | 1325 "}\n" |
1241 "}\n" | 1326 "foo(), true") |
1242 "foo(), true")->BooleanValue()); | 1327 ->BooleanValue(env.local()) |
1328 .FromJust()); | |
1243 } | 1329 } |
1244 | 1330 |
1245 | 1331 |
1246 THREADED_TEST(ExternalWrap) { | 1332 THREADED_TEST(ExternalWrap) { |
1247 // Check heap allocated object. | 1333 // Check heap allocated object. |
1248 int* ptr = new int; | 1334 int* ptr = new int; |
1249 expected_ptr = ptr; | 1335 expected_ptr = ptr; |
1250 TestExternalPointerWrapping(); | 1336 TestExternalPointerWrapping(); |
1251 delete ptr; | 1337 delete ptr; |
1252 | 1338 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1292 THREADED_TEST(FindInstanceInPrototypeChain) { | 1378 THREADED_TEST(FindInstanceInPrototypeChain) { |
1293 LocalContext env; | 1379 LocalContext env; |
1294 v8::Isolate* isolate = env->GetIsolate(); | 1380 v8::Isolate* isolate = env->GetIsolate(); |
1295 v8::HandleScope scope(isolate); | 1381 v8::HandleScope scope(isolate); |
1296 | 1382 |
1297 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(isolate); | 1383 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(isolate); |
1298 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(isolate); | 1384 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(isolate); |
1299 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(isolate); | 1385 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(isolate); |
1300 derived->Inherit(base); | 1386 derived->Inherit(base); |
1301 | 1387 |
1302 Local<v8::Function> base_function = base->GetFunction(); | 1388 Local<v8::Function> base_function = |
1303 Local<v8::Function> derived_function = derived->GetFunction(); | 1389 base->GetFunction(env.local()).ToLocalChecked(); |
1304 Local<v8::Function> other_function = other->GetFunction(); | 1390 Local<v8::Function> derived_function = |
1391 derived->GetFunction(env.local()).ToLocalChecked(); | |
1392 Local<v8::Function> other_function = | |
1393 other->GetFunction(env.local()).ToLocalChecked(); | |
1305 | 1394 |
1306 Local<v8::Object> base_instance = base_function->NewInstance(); | 1395 Local<v8::Object> base_instance = |
1307 Local<v8::Object> derived_instance = derived_function->NewInstance(); | 1396 base_function->NewInstance(env.local()).ToLocalChecked(); |
1308 Local<v8::Object> derived_instance2 = derived_function->NewInstance(); | 1397 Local<v8::Object> derived_instance = |
1309 Local<v8::Object> other_instance = other_function->NewInstance(); | 1398 derived_function->NewInstance(env.local()).ToLocalChecked(); |
1310 derived_instance2->Set(v8_str("__proto__"), derived_instance); | 1399 Local<v8::Object> derived_instance2 = |
1311 other_instance->Set(v8_str("__proto__"), derived_instance2); | 1400 derived_function->NewInstance(env.local()).ToLocalChecked(); |
1401 Local<v8::Object> other_instance = | |
1402 other_function->NewInstance(env.local()).ToLocalChecked(); | |
1403 CHECK( | |
1404 derived_instance2->Set(env.local(), v8_str("__proto__"), derived_instance) | |
1405 .FromJust()); | |
1406 CHECK(other_instance->Set(env.local(), v8_str("__proto__"), derived_instance2) | |
1407 .FromJust()); | |
1312 | 1408 |
1313 // base_instance is only an instance of base. | 1409 // base_instance is only an instance of base. |
1314 CHECK( | 1410 CHECK(base_instance->Equals(env.local(), |
1315 base_instance->Equals(base_instance->FindInstanceInPrototypeChain(base))); | 1411 base_instance->FindInstanceInPrototypeChain(base)) |
1412 .FromJust()); | |
1316 CHECK(base_instance->FindInstanceInPrototypeChain(derived).IsEmpty()); | 1413 CHECK(base_instance->FindInstanceInPrototypeChain(derived).IsEmpty()); |
1317 CHECK(base_instance->FindInstanceInPrototypeChain(other).IsEmpty()); | 1414 CHECK(base_instance->FindInstanceInPrototypeChain(other).IsEmpty()); |
1318 | 1415 |
1319 // derived_instance is an instance of base and derived. | 1416 // derived_instance is an instance of base and derived. |
1320 CHECK(derived_instance->Equals( | 1417 CHECK(derived_instance->Equals(env.local(), |
1321 derived_instance->FindInstanceInPrototypeChain(base))); | 1418 derived_instance->FindInstanceInPrototypeChain( |
1322 CHECK(derived_instance->Equals( | 1419 base)) |
1323 derived_instance->FindInstanceInPrototypeChain(derived))); | 1420 .FromJust()); |
1421 CHECK(derived_instance->Equals(env.local(), | |
1422 derived_instance->FindInstanceInPrototypeChain( | |
1423 derived)) | |
1424 .FromJust()); | |
1324 CHECK(derived_instance->FindInstanceInPrototypeChain(other).IsEmpty()); | 1425 CHECK(derived_instance->FindInstanceInPrototypeChain(other).IsEmpty()); |
1325 | 1426 |
1326 // other_instance is an instance of other and its immediate | 1427 // other_instance is an instance of other and its immediate |
1327 // prototype derived_instance2 is an instance of base and derived. | 1428 // prototype derived_instance2 is an instance of base and derived. |
1328 // Note, derived_instance is an instance of base and derived too, | 1429 // Note, derived_instance is an instance of base and derived too, |
1329 // but it comes after derived_instance2 in the prototype chain of | 1430 // but it comes after derived_instance2 in the prototype chain of |
1330 // other_instance. | 1431 // other_instance. |
1331 CHECK(derived_instance2->Equals( | 1432 CHECK(derived_instance2->Equals( |
1332 other_instance->FindInstanceInPrototypeChain(base))); | 1433 env.local(), |
1333 CHECK(derived_instance2->Equals( | 1434 other_instance->FindInstanceInPrototypeChain(base)) |
1334 other_instance->FindInstanceInPrototypeChain(derived))); | 1435 .FromJust()); |
1436 CHECK(derived_instance2->Equals(env.local(), | |
1437 other_instance->FindInstanceInPrototypeChain( | |
1438 derived)) | |
1439 .FromJust()); | |
1335 CHECK(other_instance->Equals( | 1440 CHECK(other_instance->Equals( |
1336 other_instance->FindInstanceInPrototypeChain(other))); | 1441 env.local(), |
1442 other_instance->FindInstanceInPrototypeChain(other)) | |
1443 .FromJust()); | |
1337 } | 1444 } |
1338 | 1445 |
1339 | 1446 |
1340 THREADED_TEST(TinyInteger) { | 1447 THREADED_TEST(TinyInteger) { |
1341 LocalContext env; | 1448 LocalContext env; |
1342 v8::Isolate* isolate = env->GetIsolate(); | 1449 v8::Isolate* isolate = env->GetIsolate(); |
1343 v8::HandleScope scope(isolate); | 1450 v8::HandleScope scope(isolate); |
1344 | 1451 |
1345 int32_t value = 239; | 1452 int32_t value = 239; |
1346 Local<v8::Integer> value_obj = v8::Integer::New(isolate, value); | 1453 Local<v8::Integer> value_obj = v8::Integer::New(isolate, value); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1456 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); | 1563 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); |
1457 | 1564 |
1458 value_obj = v8::Integer::NewFromUnsigned(isolate, value); | 1565 value_obj = v8::Integer::NewFromUnsigned(isolate, value); |
1459 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); | 1566 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); |
1460 } | 1567 } |
1461 | 1568 |
1462 | 1569 |
1463 THREADED_TEST(IsNativeError) { | 1570 THREADED_TEST(IsNativeError) { |
1464 LocalContext env; | 1571 LocalContext env; |
1465 v8::HandleScope scope(env->GetIsolate()); | 1572 v8::HandleScope scope(env->GetIsolate()); |
1466 v8::Handle<Value> syntax_error = CompileRun( | 1573 v8::Local<Value> syntax_error = CompileRun( |
1467 "var out = 0; try { eval(\"#\"); } catch(x) { out = x; } out; "); | 1574 "var out = 0; try { eval(\"#\"); } catch(x) { out = x; } out; "); |
1468 CHECK(syntax_error->IsNativeError()); | 1575 CHECK(syntax_error->IsNativeError()); |
1469 v8::Handle<Value> not_error = CompileRun("{a:42}"); | 1576 v8::Local<Value> not_error = CompileRun("{a:42}"); |
1470 CHECK(!not_error->IsNativeError()); | 1577 CHECK(!not_error->IsNativeError()); |
1471 v8::Handle<Value> not_object = CompileRun("42"); | 1578 v8::Local<Value> not_object = CompileRun("42"); |
1472 CHECK(!not_object->IsNativeError()); | 1579 CHECK(!not_object->IsNativeError()); |
1473 } | 1580 } |
1474 | 1581 |
1475 | 1582 |
1476 THREADED_TEST(IsGeneratorFunctionOrObject) { | 1583 THREADED_TEST(IsGeneratorFunctionOrObject) { |
1477 LocalContext env; | 1584 LocalContext env; |
1478 v8::HandleScope scope(env->GetIsolate()); | 1585 v8::HandleScope scope(env->GetIsolate()); |
1479 | 1586 |
1480 CompileRun("function *gen() { yield 1; }\nfunction func() {}"); | 1587 CompileRun("function *gen() { yield 1; }\nfunction func() {}"); |
1481 v8::Handle<Value> gen = CompileRun("gen"); | 1588 v8::Local<Value> gen = CompileRun("gen"); |
1482 v8::Handle<Value> genObj = CompileRun("gen()"); | 1589 v8::Local<Value> genObj = CompileRun("gen()"); |
1483 v8::Handle<Value> object = CompileRun("{a:42}"); | 1590 v8::Local<Value> object = CompileRun("{a:42}"); |
1484 v8::Handle<Value> func = CompileRun("func"); | 1591 v8::Local<Value> func = CompileRun("func"); |
1485 | 1592 |
1486 CHECK(gen->IsGeneratorFunction()); | 1593 CHECK(gen->IsGeneratorFunction()); |
1487 CHECK(gen->IsFunction()); | 1594 CHECK(gen->IsFunction()); |
1488 CHECK(!gen->IsGeneratorObject()); | 1595 CHECK(!gen->IsGeneratorObject()); |
1489 | 1596 |
1490 CHECK(!genObj->IsGeneratorFunction()); | 1597 CHECK(!genObj->IsGeneratorFunction()); |
1491 CHECK(!genObj->IsFunction()); | 1598 CHECK(!genObj->IsFunction()); |
1492 CHECK(genObj->IsGeneratorObject()); | 1599 CHECK(genObj->IsGeneratorObject()); |
1493 | 1600 |
1494 CHECK(!object->IsGeneratorFunction()); | 1601 CHECK(!object->IsGeneratorFunction()); |
1495 CHECK(!object->IsFunction()); | 1602 CHECK(!object->IsFunction()); |
1496 CHECK(!object->IsGeneratorObject()); | 1603 CHECK(!object->IsGeneratorObject()); |
1497 | 1604 |
1498 CHECK(!func->IsGeneratorFunction()); | 1605 CHECK(!func->IsGeneratorFunction()); |
1499 CHECK(func->IsFunction()); | 1606 CHECK(func->IsFunction()); |
1500 CHECK(!func->IsGeneratorObject()); | 1607 CHECK(!func->IsGeneratorObject()); |
1501 } | 1608 } |
1502 | 1609 |
1503 | 1610 |
1504 THREADED_TEST(ArgumentsObject) { | 1611 THREADED_TEST(ArgumentsObject) { |
1505 LocalContext env; | 1612 LocalContext env; |
1506 v8::HandleScope scope(env->GetIsolate()); | 1613 v8::HandleScope scope(env->GetIsolate()); |
1507 v8::Handle<Value> arguments_object = | 1614 v8::Local<Value> arguments_object = |
1508 CompileRun("var out = 0; (function(){ out = arguments; })(1,2,3); out;"); | 1615 CompileRun("var out = 0; (function(){ out = arguments; })(1,2,3); out;"); |
1509 CHECK(arguments_object->IsArgumentsObject()); | 1616 CHECK(arguments_object->IsArgumentsObject()); |
1510 v8::Handle<Value> array = CompileRun("[1,2,3]"); | 1617 v8::Local<Value> array = CompileRun("[1,2,3]"); |
1511 CHECK(!array->IsArgumentsObject()); | 1618 CHECK(!array->IsArgumentsObject()); |
1512 v8::Handle<Value> object = CompileRun("{a:42}"); | 1619 v8::Local<Value> object = CompileRun("{a:42}"); |
1513 CHECK(!object->IsArgumentsObject()); | 1620 CHECK(!object->IsArgumentsObject()); |
1514 } | 1621 } |
1515 | 1622 |
1516 | 1623 |
1517 THREADED_TEST(IsMapOrSet) { | 1624 THREADED_TEST(IsMapOrSet) { |
1518 LocalContext env; | 1625 LocalContext env; |
1519 v8::HandleScope scope(env->GetIsolate()); | 1626 v8::HandleScope scope(env->GetIsolate()); |
1520 v8::Handle<Value> map = CompileRun("new Map()"); | 1627 v8::Local<Value> map = CompileRun("new Map()"); |
1521 v8::Handle<Value> set = CompileRun("new Set()"); | 1628 v8::Local<Value> set = CompileRun("new Set()"); |
1522 v8::Handle<Value> weak_map = CompileRun("new WeakMap()"); | 1629 v8::Local<Value> weak_map = CompileRun("new WeakMap()"); |
1523 v8::Handle<Value> weak_set = CompileRun("new WeakSet()"); | 1630 v8::Local<Value> weak_set = CompileRun("new WeakSet()"); |
1524 CHECK(map->IsMap()); | 1631 CHECK(map->IsMap()); |
1525 CHECK(set->IsSet()); | 1632 CHECK(set->IsSet()); |
1526 CHECK(weak_map->IsWeakMap()); | 1633 CHECK(weak_map->IsWeakMap()); |
1527 CHECK(weak_set->IsWeakSet()); | 1634 CHECK(weak_set->IsWeakSet()); |
1528 | 1635 |
1529 CHECK(!map->IsSet()); | 1636 CHECK(!map->IsSet()); |
1530 CHECK(!map->IsWeakMap()); | 1637 CHECK(!map->IsWeakMap()); |
1531 CHECK(!map->IsWeakSet()); | 1638 CHECK(!map->IsWeakSet()); |
1532 | 1639 |
1533 CHECK(!set->IsMap()); | 1640 CHECK(!set->IsMap()); |
1534 CHECK(!set->IsWeakMap()); | 1641 CHECK(!set->IsWeakMap()); |
1535 CHECK(!set->IsWeakSet()); | 1642 CHECK(!set->IsWeakSet()); |
1536 | 1643 |
1537 CHECK(!weak_map->IsMap()); | 1644 CHECK(!weak_map->IsMap()); |
1538 CHECK(!weak_map->IsSet()); | 1645 CHECK(!weak_map->IsSet()); |
1539 CHECK(!weak_map->IsWeakSet()); | 1646 CHECK(!weak_map->IsWeakSet()); |
1540 | 1647 |
1541 CHECK(!weak_set->IsMap()); | 1648 CHECK(!weak_set->IsMap()); |
1542 CHECK(!weak_set->IsSet()); | 1649 CHECK(!weak_set->IsSet()); |
1543 CHECK(!weak_set->IsWeakMap()); | 1650 CHECK(!weak_set->IsWeakMap()); |
1544 | 1651 |
1545 v8::Handle<Value> object = CompileRun("{a:42}"); | 1652 v8::Local<Value> object = CompileRun("{a:42}"); |
1546 CHECK(!object->IsMap()); | 1653 CHECK(!object->IsMap()); |
1547 CHECK(!object->IsSet()); | 1654 CHECK(!object->IsSet()); |
1548 CHECK(!object->IsWeakMap()); | 1655 CHECK(!object->IsWeakMap()); |
1549 CHECK(!object->IsWeakSet()); | 1656 CHECK(!object->IsWeakSet()); |
1550 } | 1657 } |
1551 | 1658 |
1552 | 1659 |
1553 THREADED_TEST(StringObject) { | 1660 THREADED_TEST(StringObject) { |
1554 LocalContext env; | 1661 LocalContext env; |
1555 v8::HandleScope scope(env->GetIsolate()); | 1662 v8::HandleScope scope(env->GetIsolate()); |
1556 v8::Handle<Value> boxed_string = CompileRun("new String(\"test\")"); | 1663 v8::Local<Value> boxed_string = CompileRun("new String(\"test\")"); |
1557 CHECK(boxed_string->IsStringObject()); | 1664 CHECK(boxed_string->IsStringObject()); |
1558 v8::Handle<Value> unboxed_string = CompileRun("\"test\""); | 1665 v8::Local<Value> unboxed_string = CompileRun("\"test\""); |
1559 CHECK(!unboxed_string->IsStringObject()); | 1666 CHECK(!unboxed_string->IsStringObject()); |
1560 v8::Handle<Value> boxed_not_string = CompileRun("new Number(42)"); | 1667 v8::Local<Value> boxed_not_string = CompileRun("new Number(42)"); |
1561 CHECK(!boxed_not_string->IsStringObject()); | 1668 CHECK(!boxed_not_string->IsStringObject()); |
1562 v8::Handle<Value> not_object = CompileRun("0"); | 1669 v8::Local<Value> not_object = CompileRun("0"); |
1563 CHECK(!not_object->IsStringObject()); | 1670 CHECK(!not_object->IsStringObject()); |
1564 v8::Handle<v8::StringObject> as_boxed = boxed_string.As<v8::StringObject>(); | 1671 v8::Local<v8::StringObject> as_boxed = boxed_string.As<v8::StringObject>(); |
1565 CHECK(!as_boxed.IsEmpty()); | 1672 CHECK(!as_boxed.IsEmpty()); |
1566 Local<v8::String> the_string = as_boxed->ValueOf(); | 1673 Local<v8::String> the_string = as_boxed->ValueOf(); |
1567 CHECK(!the_string.IsEmpty()); | 1674 CHECK(!the_string.IsEmpty()); |
1568 ExpectObject("\"test\"", the_string); | 1675 ExpectObject("\"test\"", the_string); |
1569 v8::Handle<v8::Value> new_boxed_string = v8::StringObject::New(the_string); | 1676 v8::Local<v8::Value> new_boxed_string = v8::StringObject::New(the_string); |
1570 CHECK(new_boxed_string->IsStringObject()); | 1677 CHECK(new_boxed_string->IsStringObject()); |
1571 as_boxed = new_boxed_string.As<v8::StringObject>(); | 1678 as_boxed = new_boxed_string.As<v8::StringObject>(); |
1572 the_string = as_boxed->ValueOf(); | 1679 the_string = as_boxed->ValueOf(); |
1573 CHECK(!the_string.IsEmpty()); | 1680 CHECK(!the_string.IsEmpty()); |
1574 ExpectObject("\"test\"", the_string); | 1681 ExpectObject("\"test\"", the_string); |
1575 } | 1682 } |
1576 | 1683 |
1577 | 1684 |
1578 TEST(StringObjectDelete) { | 1685 TEST(StringObjectDelete) { |
1579 LocalContext context; | 1686 LocalContext context; |
1580 v8::HandleScope scope(context->GetIsolate()); | 1687 v8::HandleScope scope(context->GetIsolate()); |
1581 v8::Handle<Value> boxed_string = CompileRun("new String(\"test\")"); | 1688 v8::Local<Value> boxed_string = CompileRun("new String(\"test\")"); |
1582 CHECK(boxed_string->IsStringObject()); | 1689 CHECK(boxed_string->IsStringObject()); |
1583 v8::Handle<v8::Object> str_obj = boxed_string.As<v8::Object>(); | 1690 v8::Local<v8::Object> str_obj = boxed_string.As<v8::Object>(); |
1584 CHECK(!str_obj->Delete(2)); | 1691 CHECK(!str_obj->Delete(context.local(), 2).FromJust()); |
1585 CHECK(!str_obj->Delete(v8_num(2))); | 1692 CHECK(!str_obj->Delete(context.local(), v8_num(2)).FromJust()); |
1586 } | 1693 } |
1587 | 1694 |
1588 | 1695 |
1589 THREADED_TEST(NumberObject) { | 1696 THREADED_TEST(NumberObject) { |
1590 LocalContext env; | 1697 LocalContext env; |
1591 v8::HandleScope scope(env->GetIsolate()); | 1698 v8::HandleScope scope(env->GetIsolate()); |
1592 v8::Handle<Value> boxed_number = CompileRun("new Number(42)"); | 1699 v8::Local<Value> boxed_number = CompileRun("new Number(42)"); |
1593 CHECK(boxed_number->IsNumberObject()); | 1700 CHECK(boxed_number->IsNumberObject()); |
1594 v8::Handle<Value> unboxed_number = CompileRun("42"); | 1701 v8::Local<Value> unboxed_number = CompileRun("42"); |
1595 CHECK(!unboxed_number->IsNumberObject()); | 1702 CHECK(!unboxed_number->IsNumberObject()); |
1596 v8::Handle<Value> boxed_not_number = CompileRun("new Boolean(false)"); | 1703 v8::Local<Value> boxed_not_number = CompileRun("new Boolean(false)"); |
1597 CHECK(!boxed_not_number->IsNumberObject()); | 1704 CHECK(!boxed_not_number->IsNumberObject()); |
1598 v8::Handle<v8::NumberObject> as_boxed = boxed_number.As<v8::NumberObject>(); | 1705 v8::Local<v8::NumberObject> as_boxed = boxed_number.As<v8::NumberObject>(); |
1599 CHECK(!as_boxed.IsEmpty()); | 1706 CHECK(!as_boxed.IsEmpty()); |
1600 double the_number = as_boxed->ValueOf(); | 1707 double the_number = as_boxed->ValueOf(); |
1601 CHECK_EQ(42.0, the_number); | 1708 CHECK_EQ(42.0, the_number); |
1602 v8::Handle<v8::Value> new_boxed_number = | 1709 v8::Local<v8::Value> new_boxed_number = |
1603 v8::NumberObject::New(env->GetIsolate(), 43); | 1710 v8::NumberObject::New(env->GetIsolate(), 43); |
1604 CHECK(new_boxed_number->IsNumberObject()); | 1711 CHECK(new_boxed_number->IsNumberObject()); |
1605 as_boxed = new_boxed_number.As<v8::NumberObject>(); | 1712 as_boxed = new_boxed_number.As<v8::NumberObject>(); |
1606 the_number = as_boxed->ValueOf(); | 1713 the_number = as_boxed->ValueOf(); |
1607 CHECK_EQ(43.0, the_number); | 1714 CHECK_EQ(43.0, the_number); |
1608 } | 1715 } |
1609 | 1716 |
1610 | 1717 |
1611 THREADED_TEST(BooleanObject) { | 1718 THREADED_TEST(BooleanObject) { |
1612 LocalContext env; | 1719 LocalContext env; |
1613 v8::HandleScope scope(env->GetIsolate()); | 1720 v8::HandleScope scope(env->GetIsolate()); |
1614 v8::Handle<Value> boxed_boolean = CompileRun("new Boolean(true)"); | 1721 v8::Local<Value> boxed_boolean = CompileRun("new Boolean(true)"); |
1615 CHECK(boxed_boolean->IsBooleanObject()); | 1722 CHECK(boxed_boolean->IsBooleanObject()); |
1616 v8::Handle<Value> unboxed_boolean = CompileRun("true"); | 1723 v8::Local<Value> unboxed_boolean = CompileRun("true"); |
1617 CHECK(!unboxed_boolean->IsBooleanObject()); | 1724 CHECK(!unboxed_boolean->IsBooleanObject()); |
1618 v8::Handle<Value> boxed_not_boolean = CompileRun("new Number(42)"); | 1725 v8::Local<Value> boxed_not_boolean = CompileRun("new Number(42)"); |
1619 CHECK(!boxed_not_boolean->IsBooleanObject()); | 1726 CHECK(!boxed_not_boolean->IsBooleanObject()); |
1620 v8::Handle<v8::BooleanObject> as_boxed = | 1727 v8::Local<v8::BooleanObject> as_boxed = boxed_boolean.As<v8::BooleanObject>(); |
1621 boxed_boolean.As<v8::BooleanObject>(); | |
1622 CHECK(!as_boxed.IsEmpty()); | 1728 CHECK(!as_boxed.IsEmpty()); |
1623 bool the_boolean = as_boxed->ValueOf(); | 1729 bool the_boolean = as_boxed->ValueOf(); |
1624 CHECK_EQ(true, the_boolean); | 1730 CHECK_EQ(true, the_boolean); |
1625 v8::Handle<v8::Value> boxed_true = v8::BooleanObject::New(true); | 1731 v8::Local<v8::Value> boxed_true = v8::BooleanObject::New(true); |
1626 v8::Handle<v8::Value> boxed_false = v8::BooleanObject::New(false); | 1732 v8::Local<v8::Value> boxed_false = v8::BooleanObject::New(false); |
1627 CHECK(boxed_true->IsBooleanObject()); | 1733 CHECK(boxed_true->IsBooleanObject()); |
1628 CHECK(boxed_false->IsBooleanObject()); | 1734 CHECK(boxed_false->IsBooleanObject()); |
1629 as_boxed = boxed_true.As<v8::BooleanObject>(); | 1735 as_boxed = boxed_true.As<v8::BooleanObject>(); |
1630 CHECK_EQ(true, as_boxed->ValueOf()); | 1736 CHECK_EQ(true, as_boxed->ValueOf()); |
1631 as_boxed = boxed_false.As<v8::BooleanObject>(); | 1737 as_boxed = boxed_false.As<v8::BooleanObject>(); |
1632 CHECK_EQ(false, as_boxed->ValueOf()); | 1738 CHECK_EQ(false, as_boxed->ValueOf()); |
1633 } | 1739 } |
1634 | 1740 |
1635 | 1741 |
1636 THREADED_TEST(PrimitiveAndWrappedBooleans) { | 1742 THREADED_TEST(PrimitiveAndWrappedBooleans) { |
1637 LocalContext env; | 1743 LocalContext env; |
1638 v8::HandleScope scope(env->GetIsolate()); | 1744 v8::HandleScope scope(env->GetIsolate()); |
1639 | 1745 |
1640 Local<Value> primitive_false = Boolean::New(env->GetIsolate(), false); | 1746 Local<Value> primitive_false = Boolean::New(env->GetIsolate(), false); |
1641 CHECK(primitive_false->IsBoolean()); | 1747 CHECK(primitive_false->IsBoolean()); |
1642 CHECK(!primitive_false->IsBooleanObject()); | 1748 CHECK(!primitive_false->IsBooleanObject()); |
1643 CHECK(!primitive_false->BooleanValue()); | 1749 CHECK(!primitive_false->BooleanValue(env.local()).FromJust()); |
1644 CHECK(!primitive_false->IsTrue()); | 1750 CHECK(!primitive_false->IsTrue()); |
1645 CHECK(primitive_false->IsFalse()); | 1751 CHECK(primitive_false->IsFalse()); |
1646 | 1752 |
1647 Local<Value> false_value = BooleanObject::New(false); | 1753 Local<Value> false_value = BooleanObject::New(false); |
1648 CHECK(!false_value->IsBoolean()); | 1754 CHECK(!false_value->IsBoolean()); |
1649 CHECK(false_value->IsBooleanObject()); | 1755 CHECK(false_value->IsBooleanObject()); |
1650 CHECK(false_value->BooleanValue()); | 1756 CHECK(false_value->BooleanValue(env.local()).FromJust()); |
1651 CHECK(!false_value->IsTrue()); | 1757 CHECK(!false_value->IsTrue()); |
1652 CHECK(!false_value->IsFalse()); | 1758 CHECK(!false_value->IsFalse()); |
1653 | 1759 |
1654 Local<BooleanObject> false_boolean_object = false_value.As<BooleanObject>(); | 1760 Local<BooleanObject> false_boolean_object = false_value.As<BooleanObject>(); |
1655 CHECK(!false_boolean_object->IsBoolean()); | 1761 CHECK(!false_boolean_object->IsBoolean()); |
1656 CHECK(false_boolean_object->IsBooleanObject()); | 1762 CHECK(false_boolean_object->IsBooleanObject()); |
1657 // TODO(svenpanne) Uncomment when BooleanObject::BooleanValue() is deleted. | 1763 CHECK(false_boolean_object->BooleanValue(env.local()).FromJust()); |
1658 // CHECK(false_boolean_object->BooleanValue()); | |
1659 CHECK(!false_boolean_object->ValueOf()); | 1764 CHECK(!false_boolean_object->ValueOf()); |
1660 CHECK(!false_boolean_object->IsTrue()); | 1765 CHECK(!false_boolean_object->IsTrue()); |
1661 CHECK(!false_boolean_object->IsFalse()); | 1766 CHECK(!false_boolean_object->IsFalse()); |
1662 | 1767 |
1663 Local<Value> primitive_true = Boolean::New(env->GetIsolate(), true); | 1768 Local<Value> primitive_true = Boolean::New(env->GetIsolate(), true); |
1664 CHECK(primitive_true->IsBoolean()); | 1769 CHECK(primitive_true->IsBoolean()); |
1665 CHECK(!primitive_true->IsBooleanObject()); | 1770 CHECK(!primitive_true->IsBooleanObject()); |
1666 CHECK(primitive_true->BooleanValue()); | 1771 CHECK(primitive_true->BooleanValue(env.local()).FromJust()); |
1667 CHECK(primitive_true->IsTrue()); | 1772 CHECK(primitive_true->IsTrue()); |
1668 CHECK(!primitive_true->IsFalse()); | 1773 CHECK(!primitive_true->IsFalse()); |
1669 | 1774 |
1670 Local<Value> true_value = BooleanObject::New(true); | 1775 Local<Value> true_value = BooleanObject::New(true); |
1671 CHECK(!true_value->IsBoolean()); | 1776 CHECK(!true_value->IsBoolean()); |
1672 CHECK(true_value->IsBooleanObject()); | 1777 CHECK(true_value->IsBooleanObject()); |
1673 CHECK(true_value->BooleanValue()); | 1778 CHECK(true_value->BooleanValue(env.local()).FromJust()); |
1674 CHECK(!true_value->IsTrue()); | 1779 CHECK(!true_value->IsTrue()); |
1675 CHECK(!true_value->IsFalse()); | 1780 CHECK(!true_value->IsFalse()); |
1676 | 1781 |
1677 Local<BooleanObject> true_boolean_object = true_value.As<BooleanObject>(); | 1782 Local<BooleanObject> true_boolean_object = true_value.As<BooleanObject>(); |
1678 CHECK(!true_boolean_object->IsBoolean()); | 1783 CHECK(!true_boolean_object->IsBoolean()); |
1679 CHECK(true_boolean_object->IsBooleanObject()); | 1784 CHECK(true_boolean_object->IsBooleanObject()); |
1680 // TODO(svenpanne) Uncomment when BooleanObject::BooleanValue() is deleted. | 1785 CHECK(true_boolean_object->BooleanValue(env.local()).FromJust()); |
1681 // CHECK(true_boolean_object->BooleanValue()); | |
1682 CHECK(true_boolean_object->ValueOf()); | 1786 CHECK(true_boolean_object->ValueOf()); |
1683 CHECK(!true_boolean_object->IsTrue()); | 1787 CHECK(!true_boolean_object->IsTrue()); |
1684 CHECK(!true_boolean_object->IsFalse()); | 1788 CHECK(!true_boolean_object->IsFalse()); |
1685 } | 1789 } |
1686 | 1790 |
1687 | 1791 |
1688 THREADED_TEST(Number) { | 1792 THREADED_TEST(Number) { |
1689 LocalContext env; | 1793 LocalContext env; |
1690 v8::HandleScope scope(env->GetIsolate()); | 1794 v8::HandleScope scope(env->GetIsolate()); |
1691 double PI = 3.1415926; | 1795 double PI = 3.1415926; |
1692 Local<v8::Number> pi_obj = v8::Number::New(env->GetIsolate(), PI); | 1796 Local<v8::Number> pi_obj = v8::Number::New(env->GetIsolate(), PI); |
1693 CHECK_EQ(PI, pi_obj->NumberValue()); | 1797 CHECK_EQ(PI, pi_obj->NumberValue(env.local()).FromJust()); |
1694 } | 1798 } |
1695 | 1799 |
1696 | 1800 |
1697 THREADED_TEST(ToNumber) { | 1801 THREADED_TEST(ToNumber) { |
1698 LocalContext env; | 1802 LocalContext env; |
1699 v8::Isolate* isolate = CcTest::isolate(); | 1803 v8::Isolate* isolate = CcTest::isolate(); |
1700 v8::HandleScope scope(isolate); | 1804 v8::HandleScope scope(isolate); |
1701 Local<String> str = v8_str("3.1415926"); | 1805 Local<String> str = v8_str("3.1415926"); |
1702 CHECK_EQ(3.1415926, str->NumberValue()); | 1806 CHECK_EQ(3.1415926, str->NumberValue(env.local()).FromJust()); |
1703 v8::Handle<v8::Boolean> t = v8::True(isolate); | 1807 v8::Local<v8::Boolean> t = v8::True(isolate); |
1704 CHECK_EQ(1.0, t->NumberValue()); | 1808 CHECK_EQ(1.0, t->NumberValue(env.local()).FromJust()); |
1705 v8::Handle<v8::Boolean> f = v8::False(isolate); | 1809 v8::Local<v8::Boolean> f = v8::False(isolate); |
1706 CHECK_EQ(0.0, f->NumberValue()); | 1810 CHECK_EQ(0.0, f->NumberValue(env.local()).FromJust()); |
1707 } | 1811 } |
1708 | 1812 |
1709 | 1813 |
1710 THREADED_TEST(Date) { | 1814 THREADED_TEST(Date) { |
1711 LocalContext env; | 1815 LocalContext env; |
1712 v8::HandleScope scope(env->GetIsolate()); | 1816 v8::HandleScope scope(env->GetIsolate()); |
1713 double PI = 3.1415926; | 1817 double PI = 3.1415926; |
1714 Local<Value> date = v8::Date::New(env->GetIsolate(), PI); | 1818 Local<Value> date = v8::Date::New(env.local(), PI).ToLocalChecked(); |
1715 CHECK_EQ(3.0, date->NumberValue()); | 1819 CHECK_EQ(3.0, date->NumberValue(env.local()).FromJust()); |
1716 date.As<v8::Date>()->Set(v8_str("property"), | 1820 CHECK(date.As<v8::Date>() |
1717 v8::Integer::New(env->GetIsolate(), 42)); | 1821 ->Set(env.local(), v8_str("property"), |
1718 CHECK_EQ(42, date.As<v8::Date>()->Get(v8_str("property"))->Int32Value()); | 1822 v8::Integer::New(env->GetIsolate(), 42)) |
1823 .FromJust()); | |
1824 CHECK_EQ(42, date.As<v8::Date>() | |
1825 ->Get(env.local(), v8_str("property")) | |
1826 .ToLocalChecked() | |
1827 ->Int32Value(env.local()) | |
1828 .FromJust()); | |
1719 } | 1829 } |
1720 | 1830 |
1721 | 1831 |
1722 THREADED_TEST(Boolean) { | 1832 THREADED_TEST(Boolean) { |
1723 LocalContext env; | 1833 LocalContext env; |
1724 v8::Isolate* isolate = env->GetIsolate(); | 1834 v8::Isolate* isolate = env->GetIsolate(); |
1725 v8::HandleScope scope(isolate); | 1835 v8::HandleScope scope(isolate); |
1726 v8::Handle<v8::Boolean> t = v8::True(isolate); | 1836 v8::Local<v8::Boolean> t = v8::True(isolate); |
1727 CHECK(t->Value()); | 1837 CHECK(t->Value()); |
1728 v8::Handle<v8::Boolean> f = v8::False(isolate); | 1838 v8::Local<v8::Boolean> f = v8::False(isolate); |
1729 CHECK(!f->Value()); | 1839 CHECK(!f->Value()); |
1730 v8::Handle<v8::Primitive> u = v8::Undefined(isolate); | 1840 v8::Local<v8::Primitive> u = v8::Undefined(isolate); |
1731 CHECK(!u->BooleanValue()); | 1841 CHECK(!u->BooleanValue(env.local()).FromJust()); |
1732 v8::Handle<v8::Primitive> n = v8::Null(isolate); | 1842 v8::Local<v8::Primitive> n = v8::Null(isolate); |
1733 CHECK(!n->BooleanValue()); | 1843 CHECK(!n->BooleanValue(env.local()).FromJust()); |
1734 v8::Handle<String> str1 = v8_str(""); | 1844 v8::Local<String> str1 = v8_str(""); |
1735 CHECK(!str1->BooleanValue()); | 1845 CHECK(!str1->BooleanValue(env.local()).FromJust()); |
1736 v8::Handle<String> str2 = v8_str("x"); | 1846 v8::Local<String> str2 = v8_str("x"); |
1737 CHECK(str2->BooleanValue()); | 1847 CHECK(str2->BooleanValue(env.local()).FromJust()); |
1738 CHECK(!v8::Number::New(isolate, 0)->BooleanValue()); | 1848 CHECK(!v8::Number::New(isolate, 0)->BooleanValue(env.local()).FromJust()); |
1739 CHECK(v8::Number::New(isolate, -1)->BooleanValue()); | 1849 CHECK(v8::Number::New(isolate, -1)->BooleanValue(env.local()).FromJust()); |
1740 CHECK(v8::Number::New(isolate, 1)->BooleanValue()); | 1850 CHECK(v8::Number::New(isolate, 1)->BooleanValue(env.local()).FromJust()); |
1741 CHECK(v8::Number::New(isolate, 42)->BooleanValue()); | 1851 CHECK(v8::Number::New(isolate, 42)->BooleanValue(env.local()).FromJust()); |
1742 CHECK(!v8_compile("NaN")->Run()->BooleanValue()); | 1852 CHECK(!v8_compile("NaN") |
1853 ->Run(env.local()) | |
1854 .ToLocalChecked() | |
1855 ->BooleanValue(env.local()) | |
1856 .FromJust()); | |
1743 } | 1857 } |
1744 | 1858 |
1745 | 1859 |
1746 static void DummyCallHandler(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1860 static void DummyCallHandler(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1747 ApiTestFuzzer::Fuzz(); | 1861 ApiTestFuzzer::Fuzz(); |
1748 args.GetReturnValue().Set(v8_num(13.4)); | 1862 args.GetReturnValue().Set(v8_num(13.4)); |
1749 } | 1863 } |
1750 | 1864 |
1751 | 1865 |
1752 static void GetM(Local<String> name, | 1866 static void GetM(Local<String> name, |
1753 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1867 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1754 ApiTestFuzzer::Fuzz(); | 1868 ApiTestFuzzer::Fuzz(); |
1755 info.GetReturnValue().Set(v8_num(876)); | 1869 info.GetReturnValue().Set(v8_num(876)); |
1756 } | 1870 } |
1757 | 1871 |
1758 | 1872 |
1759 THREADED_TEST(GlobalPrototype) { | 1873 THREADED_TEST(GlobalPrototype) { |
1760 v8::Isolate* isolate = CcTest::isolate(); | 1874 v8::Isolate* isolate = CcTest::isolate(); |
1761 v8::HandleScope scope(isolate); | 1875 v8::HandleScope scope(isolate); |
1762 v8::Handle<v8::FunctionTemplate> func_templ = | 1876 v8::Local<v8::FunctionTemplate> func_templ = |
1763 v8::FunctionTemplate::New(isolate); | 1877 v8::FunctionTemplate::New(isolate); |
1764 func_templ->PrototypeTemplate()->Set( | 1878 func_templ->PrototypeTemplate()->Set( |
1765 isolate, "dummy", v8::FunctionTemplate::New(isolate, DummyCallHandler)); | 1879 isolate, "dummy", v8::FunctionTemplate::New(isolate, DummyCallHandler)); |
1766 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); | 1880 v8::Local<ObjectTemplate> templ = func_templ->InstanceTemplate(); |
1767 templ->Set(isolate, "x", v8_num(200)); | 1881 templ->Set(isolate, "x", v8_num(200)); |
1768 templ->SetAccessor(v8_str("m"), GetM); | 1882 templ->SetAccessor(v8_str("m"), GetM); |
1769 LocalContext env(0, templ); | 1883 LocalContext env(0, templ); |
1770 v8::Handle<Script> script(v8_compile("dummy()")); | 1884 v8::Local<Script> script(v8_compile("dummy()")); |
1771 v8::Handle<Value> result(script->Run()); | 1885 v8::Local<Value> result(script->Run(env.local()).ToLocalChecked()); |
1772 CHECK_EQ(13.4, result->NumberValue()); | 1886 CHECK_EQ(13.4, result->NumberValue(env.local()).FromJust()); |
1773 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); | 1887 CHECK_EQ(200, v8_run_int32value(v8_compile("x"))); |
1774 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); | 1888 CHECK_EQ(876, v8_run_int32value(v8_compile("m"))); |
1775 } | 1889 } |
1776 | 1890 |
1777 | 1891 |
1778 THREADED_TEST(ObjectTemplate) { | 1892 THREADED_TEST(ObjectTemplate) { |
1779 v8::Isolate* isolate = CcTest::isolate(); | 1893 v8::Isolate* isolate = CcTest::isolate(); |
1780 v8::HandleScope scope(isolate); | 1894 v8::HandleScope scope(isolate); |
1781 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); | 1895 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
1782 v8::Local<v8::String> class_name = | 1896 v8::Local<v8::String> class_name = v8_str("the_class_name"); |
1783 v8::String::NewFromUtf8(isolate, "the_class_name"); | |
1784 fun->SetClassName(class_name); | 1897 fun->SetClassName(class_name); |
1785 Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun); | 1898 Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun); |
1786 templ1->Set(isolate, "x", v8_num(10)); | 1899 templ1->Set(isolate, "x", v8_num(10)); |
1787 templ1->Set(isolate, "y", v8_num(13)); | 1900 templ1->Set(isolate, "y", v8_num(13)); |
1788 LocalContext env; | 1901 LocalContext env; |
1789 Local<v8::Object> instance1 = templ1->NewInstance(); | 1902 Local<v8::Object> instance1 = |
1903 templ1->NewInstance(env.local()).ToLocalChecked(); | |
1790 CHECK(class_name->StrictEquals(instance1->GetConstructorName())); | 1904 CHECK(class_name->StrictEquals(instance1->GetConstructorName())); |
1791 env->Global()->Set(v8_str("p"), instance1); | 1905 CHECK(env->Global()->Set(env.local(), v8_str("p"), instance1).FromJust()); |
1792 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); | 1906 CHECK(v8_compile("(p.x == 10)") |
1793 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); | 1907 ->Run(env.local()) |
1908 .ToLocalChecked() | |
1909 ->BooleanValue(env.local()) | |
1910 .FromJust()); | |
1911 CHECK(v8_compile("(p.y == 13)") | |
1912 ->Run(env.local()) | |
1913 .ToLocalChecked() | |
1914 ->BooleanValue(env.local()) | |
1915 .FromJust()); | |
1794 Local<v8::FunctionTemplate> fun2 = v8::FunctionTemplate::New(isolate); | 1916 Local<v8::FunctionTemplate> fun2 = v8::FunctionTemplate::New(isolate); |
1795 fun2->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123)); | 1917 fun2->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123)); |
1796 Local<ObjectTemplate> templ2 = fun2->InstanceTemplate(); | 1918 Local<ObjectTemplate> templ2 = fun2->InstanceTemplate(); |
1797 templ2->Set(isolate, "a", v8_num(12)); | 1919 templ2->Set(isolate, "a", v8_num(12)); |
1798 templ2->Set(isolate, "b", templ1); | 1920 templ2->Set(isolate, "b", templ1); |
1799 Local<v8::Object> instance2 = templ2->NewInstance(); | 1921 Local<v8::Object> instance2 = |
1800 env->Global()->Set(v8_str("q"), instance2); | 1922 templ2->NewInstance(env.local()).ToLocalChecked(); |
1801 CHECK(v8_compile("(q.nirk == 123)")->Run()->BooleanValue()); | 1923 CHECK(env->Global()->Set(env.local(), v8_str("q"), instance2).FromJust()); |
1802 CHECK(v8_compile("(q.a == 12)")->Run()->BooleanValue()); | 1924 CHECK(v8_compile("(q.nirk == 123)") |
1803 CHECK(v8_compile("(q.b.x == 10)")->Run()->BooleanValue()); | 1925 ->Run(env.local()) |
1804 CHECK(v8_compile("(q.b.y == 13)")->Run()->BooleanValue()); | 1926 .ToLocalChecked() |
1927 ->BooleanValue(env.local()) | |
1928 .FromJust()); | |
1929 CHECK(v8_compile("(q.a == 12)") | |
1930 ->Run(env.local()) | |
1931 .ToLocalChecked() | |
1932 ->BooleanValue(env.local()) | |
1933 .FromJust()); | |
1934 CHECK(v8_compile("(q.b.x == 10)") | |
1935 ->Run(env.local()) | |
1936 .ToLocalChecked() | |
1937 ->BooleanValue(env.local()) | |
1938 .FromJust()); | |
1939 CHECK(v8_compile("(q.b.y == 13)") | |
1940 ->Run(env.local()) | |
1941 .ToLocalChecked() | |
1942 ->BooleanValue(env.local()) | |
1943 .FromJust()); | |
1805 } | 1944 } |
1806 | 1945 |
1807 | 1946 |
1808 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1947 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1809 ApiTestFuzzer::Fuzz(); | 1948 ApiTestFuzzer::Fuzz(); |
1810 args.GetReturnValue().Set(v8_num(17.2)); | 1949 args.GetReturnValue().Set(v8_num(17.2)); |
1811 } | 1950 } |
1812 | 1951 |
1813 | 1952 |
1814 static void GetKnurd(Local<String> property, | 1953 static void GetKnurd(Local<String> property, |
1815 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1954 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1816 ApiTestFuzzer::Fuzz(); | 1955 ApiTestFuzzer::Fuzz(); |
1817 info.GetReturnValue().Set(v8_num(15.2)); | 1956 info.GetReturnValue().Set(v8_num(15.2)); |
1818 } | 1957 } |
1819 | 1958 |
1820 | 1959 |
1821 THREADED_TEST(DescriptorInheritance) { | 1960 THREADED_TEST(DescriptorInheritance) { |
1822 v8::Isolate* isolate = CcTest::isolate(); | 1961 v8::Isolate* isolate = CcTest::isolate(); |
1823 v8::HandleScope scope(isolate); | 1962 v8::HandleScope scope(isolate); |
1824 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New(isolate); | 1963 v8::Local<v8::FunctionTemplate> super = v8::FunctionTemplate::New(isolate); |
1825 super->PrototypeTemplate()->Set(isolate, "flabby", | 1964 super->PrototypeTemplate()->Set(isolate, "flabby", |
1826 v8::FunctionTemplate::New(isolate, | 1965 v8::FunctionTemplate::New(isolate, |
1827 GetFlabby)); | 1966 GetFlabby)); |
1828 super->PrototypeTemplate()->Set(isolate, "PI", v8_num(3.14)); | 1967 super->PrototypeTemplate()->Set(isolate, "PI", v8_num(3.14)); |
1829 | 1968 |
1830 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); | 1969 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); |
1831 | 1970 |
1832 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(isolate); | 1971 v8::Local<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(isolate); |
1833 base1->Inherit(super); | 1972 base1->Inherit(super); |
1834 base1->PrototypeTemplate()->Set(isolate, "v1", v8_num(20.1)); | 1973 base1->PrototypeTemplate()->Set(isolate, "v1", v8_num(20.1)); |
1835 | 1974 |
1836 v8::Handle<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(isolate); | 1975 v8::Local<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(isolate); |
1837 base2->Inherit(super); | 1976 base2->Inherit(super); |
1838 base2->PrototypeTemplate()->Set(isolate, "v2", v8_num(10.1)); | 1977 base2->PrototypeTemplate()->Set(isolate, "v2", v8_num(10.1)); |
1839 | 1978 |
1840 LocalContext env; | 1979 LocalContext env; |
1841 | 1980 |
1842 env->Global()->Set(v8_str("s"), super->GetFunction()); | 1981 CHECK(env->Global() |
1843 env->Global()->Set(v8_str("base1"), base1->GetFunction()); | 1982 ->Set(env.local(), v8_str("s"), |
1844 env->Global()->Set(v8_str("base2"), base2->GetFunction()); | 1983 super->GetFunction(env.local()).ToLocalChecked()) |
1984 .FromJust()); | |
1985 CHECK(env->Global() | |
1986 ->Set(env.local(), v8_str("base1"), | |
1987 base1->GetFunction(env.local()).ToLocalChecked()) | |
1988 .FromJust()); | |
1989 CHECK(env->Global() | |
1990 ->Set(env.local(), v8_str("base2"), | |
1991 base2->GetFunction(env.local()).ToLocalChecked()) | |
1992 .FromJust()); | |
1845 | 1993 |
1846 // Checks right __proto__ chain. | 1994 // Checks right __proto__ chain. |
1847 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype")->BooleanValue()); | 1995 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype") |
1848 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype")->BooleanValue()); | 1996 ->BooleanValue(env.local()) |
1997 .FromJust()); | |
1998 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype") | |
1999 ->BooleanValue(env.local()) | |
2000 .FromJust()); | |
1849 | 2001 |
1850 CHECK(v8_compile("s.prototype.PI == 3.14")->Run()->BooleanValue()); | 2002 CHECK(v8_compile("s.prototype.PI == 3.14") |
2003 ->Run(env.local()) | |
2004 .ToLocalChecked() | |
2005 ->BooleanValue(env.local()) | |
2006 .FromJust()); | |
1851 | 2007 |
1852 // Instance accessor should not be visible on function object or its prototype | 2008 // Instance accessor should not be visible on function object or its prototype |
1853 CHECK(CompileRun("s.knurd == undefined")->BooleanValue()); | 2009 CHECK( |
1854 CHECK(CompileRun("s.prototype.knurd == undefined")->BooleanValue()); | 2010 CompileRun("s.knurd == undefined")->BooleanValue(env.local()).FromJust()); |
1855 CHECK(CompileRun("base1.prototype.knurd == undefined")->BooleanValue()); | 2011 CHECK(CompileRun("s.prototype.knurd == undefined") |
2012 ->BooleanValue(env.local()) | |
2013 .FromJust()); | |
2014 CHECK(CompileRun("base1.prototype.knurd == undefined") | |
2015 ->BooleanValue(env.local()) | |
2016 .FromJust()); | |
1856 | 2017 |
1857 env->Global()->Set(v8_str("obj"), | 2018 CHECK(env->Global() |
1858 base1->GetFunction()->NewInstance()); | 2019 ->Set(env.local(), v8_str("obj"), base1->GetFunction(env.local()) |
1859 CHECK_EQ(17.2, v8_compile("obj.flabby()")->Run()->NumberValue()); | 2020 .ToLocalChecked() |
1860 CHECK(v8_compile("'flabby' in obj")->Run()->BooleanValue()); | 2021 ->NewInstance(env.local()) |
1861 CHECK_EQ(15.2, v8_compile("obj.knurd")->Run()->NumberValue()); | 2022 .ToLocalChecked()) |
1862 CHECK(v8_compile("'knurd' in obj")->Run()->BooleanValue()); | 2023 .FromJust()); |
1863 CHECK_EQ(20.1, v8_compile("obj.v1")->Run()->NumberValue()); | 2024 CHECK_EQ(17.2, v8_compile("obj.flabby()") |
2025 ->Run(env.local()) | |
2026 .ToLocalChecked() | |
2027 ->NumberValue(env.local()) | |
2028 .FromJust()); | |
2029 CHECK(v8_compile("'flabby' in obj") | |
2030 ->Run(env.local()) | |
2031 .ToLocalChecked() | |
2032 ->BooleanValue(env.local()) | |
2033 .FromJust()); | |
2034 CHECK_EQ(15.2, v8_compile("obj.knurd") | |
2035 ->Run(env.local()) | |
2036 .ToLocalChecked() | |
2037 ->NumberValue(env.local()) | |
2038 .FromJust()); | |
2039 CHECK(v8_compile("'knurd' in obj") | |
2040 ->Run(env.local()) | |
2041 .ToLocalChecked() | |
2042 ->BooleanValue(env.local()) | |
2043 .FromJust()); | |
2044 CHECK_EQ(20.1, v8_compile("obj.v1") | |
2045 ->Run(env.local()) | |
2046 .ToLocalChecked() | |
2047 ->NumberValue(env.local()) | |
2048 .FromJust()); | |
1864 | 2049 |
1865 env->Global()->Set(v8_str("obj2"), | 2050 CHECK(env->Global() |
1866 base2->GetFunction()->NewInstance()); | 2051 ->Set(env.local(), v8_str("obj2"), base2->GetFunction(env.local()) |
1867 CHECK_EQ(17.2, v8_compile("obj2.flabby()")->Run()->NumberValue()); | 2052 .ToLocalChecked() |
1868 CHECK(v8_compile("'flabby' in obj2")->Run()->BooleanValue()); | 2053 ->NewInstance(env.local()) |
1869 CHECK_EQ(15.2, v8_compile("obj2.knurd")->Run()->NumberValue()); | 2054 .ToLocalChecked()) |
1870 CHECK(v8_compile("'knurd' in obj2")->Run()->BooleanValue()); | 2055 .FromJust()); |
1871 CHECK_EQ(10.1, v8_compile("obj2.v2")->Run()->NumberValue()); | 2056 CHECK_EQ(17.2, v8_compile("obj2.flabby()") |
2057 ->Run(env.local()) | |
2058 .ToLocalChecked() | |
2059 ->NumberValue(env.local()) | |
2060 .FromJust()); | |
2061 CHECK(v8_compile("'flabby' in obj2") | |
2062 ->Run(env.local()) | |
2063 .ToLocalChecked() | |
2064 ->BooleanValue(env.local()) | |
2065 .FromJust()); | |
2066 CHECK_EQ(15.2, v8_compile("obj2.knurd") | |
2067 ->Run(env.local()) | |
2068 .ToLocalChecked() | |
2069 ->NumberValue(env.local()) | |
2070 .FromJust()); | |
2071 CHECK(v8_compile("'knurd' in obj2") | |
2072 ->Run(env.local()) | |
2073 .ToLocalChecked() | |
2074 ->BooleanValue(env.local()) | |
2075 .FromJust()); | |
2076 CHECK_EQ(10.1, v8_compile("obj2.v2") | |
2077 ->Run(env.local()) | |
2078 .ToLocalChecked() | |
2079 ->NumberValue(env.local()) | |
2080 .FromJust()); | |
1872 | 2081 |
1873 // base1 and base2 cannot cross reference to each's prototype | 2082 // base1 and base2 cannot cross reference to each's prototype |
1874 CHECK(v8_compile("obj.v2")->Run()->IsUndefined()); | 2083 CHECK(v8_compile("obj.v2")->Run(env.local()).ToLocalChecked()->IsUndefined()); |
1875 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined()); | 2084 CHECK( |
2085 v8_compile("obj2.v1")->Run(env.local()).ToLocalChecked()->IsUndefined()); | |
1876 } | 2086 } |
1877 | 2087 |
1878 | 2088 |
1879 // Helper functions for Interceptor/Accessor interaction tests | 2089 // Helper functions for Interceptor/Accessor interaction tests |
1880 | 2090 |
1881 void SimpleAccessorGetter(Local<String> name, | 2091 void SimpleAccessorGetter(Local<String> name, |
1882 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2092 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1883 Handle<Object> self = Handle<Object>::Cast(info.This()); | 2093 Local<Object> self = Local<Object>::Cast(info.This()); |
1884 info.GetReturnValue().Set( | 2094 info.GetReturnValue().Set(self->Get(info.GetIsolate()->GetCurrentContext(), |
1885 self->Get(String::Concat(v8_str("accessor_"), name))); | 2095 String::Concat(v8_str("accessor_"), name)) |
2096 .ToLocalChecked()); | |
1886 } | 2097 } |
1887 | 2098 |
1888 void SimpleAccessorSetter(Local<String> name, Local<Value> value, | 2099 void SimpleAccessorSetter(Local<String> name, Local<Value> value, |
1889 const v8::PropertyCallbackInfo<void>& info) { | 2100 const v8::PropertyCallbackInfo<void>& info) { |
1890 Handle<Object> self = Handle<Object>::Cast(info.This()); | 2101 Local<Object> self = Local<Object>::Cast(info.This()); |
1891 self->Set(String::Concat(v8_str("accessor_"), name), value); | 2102 CHECK(self->Set(info.GetIsolate()->GetCurrentContext(), |
2103 String::Concat(v8_str("accessor_"), name), value) | |
2104 .FromJust()); | |
1892 } | 2105 } |
1893 | 2106 |
1894 void SymbolAccessorGetter(Local<Name> name, | 2107 void SymbolAccessorGetter(Local<Name> name, |
1895 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2108 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1896 CHECK(name->IsSymbol()); | 2109 CHECK(name->IsSymbol()); |
1897 Local<Symbol> sym = Local<Symbol>::Cast(name); | 2110 Local<Symbol> sym = Local<Symbol>::Cast(name); |
1898 if (sym->Name()->IsUndefined()) | 2111 if (sym->Name()->IsUndefined()) |
1899 return; | 2112 return; |
1900 SimpleAccessorGetter(Local<String>::Cast(sym->Name()), info); | 2113 SimpleAccessorGetter(Local<String>::Cast(sym->Name()), info); |
1901 } | 2114 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1937 i::Handle<i::String> name(v8::Utils::OpenHandle(*v8_str("length"))); | 2150 i::Handle<i::String> name(v8::Utils::OpenHandle(*v8_str("length"))); |
1938 i::LookupIterator it(a, name, i::LookupIterator::OWN_SKIP_INTERCEPTOR); | 2151 i::LookupIterator it(a, name, i::LookupIterator::OWN_SKIP_INTERCEPTOR); |
1939 CHECK_EQ(i::LookupIterator::ACCESSOR, it.state()); | 2152 CHECK_EQ(i::LookupIterator::ACCESSOR, it.state()); |
1940 CHECK(it.GetAccessors()->IsExecutableAccessorInfo()); | 2153 CHECK(it.GetAccessors()->IsExecutableAccessorInfo()); |
1941 } | 2154 } |
1942 | 2155 |
1943 | 2156 |
1944 THREADED_TEST(UndefinedIsNotEnumerable) { | 2157 THREADED_TEST(UndefinedIsNotEnumerable) { |
1945 LocalContext env; | 2158 LocalContext env; |
1946 v8::HandleScope scope(env->GetIsolate()); | 2159 v8::HandleScope scope(env->GetIsolate()); |
1947 v8::Handle<Value> result = CompileRun("this.propertyIsEnumerable(undefined)"); | 2160 v8::Local<Value> result = CompileRun("this.propertyIsEnumerable(undefined)"); |
1948 CHECK(result->IsFalse()); | 2161 CHECK(result->IsFalse()); |
1949 } | 2162 } |
1950 | 2163 |
1951 | 2164 |
1952 v8::Handle<Script> call_recursively_script; | 2165 v8::Local<Script> call_recursively_script; |
1953 static const int kTargetRecursionDepth = 150; // near maximum | 2166 static const int kTargetRecursionDepth = 150; // near maximum |
1954 | 2167 |
1955 | 2168 |
1956 static void CallScriptRecursivelyCall( | 2169 static void CallScriptRecursivelyCall( |
1957 const v8::FunctionCallbackInfo<v8::Value>& args) { | 2170 const v8::FunctionCallbackInfo<v8::Value>& args) { |
1958 ApiTestFuzzer::Fuzz(); | 2171 ApiTestFuzzer::Fuzz(); |
1959 int depth = args.This()->Get(v8_str("depth"))->Int32Value(); | 2172 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
2173 int depth = args.This() | |
2174 ->Get(context, v8_str("depth")) | |
2175 .ToLocalChecked() | |
2176 ->Int32Value(context) | |
2177 .FromJust(); | |
1960 if (depth == kTargetRecursionDepth) return; | 2178 if (depth == kTargetRecursionDepth) return; |
1961 args.This()->Set(v8_str("depth"), | 2179 CHECK(args.This() |
1962 v8::Integer::New(args.GetIsolate(), depth + 1)); | 2180 ->Set(context, v8_str("depth"), |
1963 args.GetReturnValue().Set(call_recursively_script->Run()); | 2181 v8::Integer::New(args.GetIsolate(), depth + 1)) |
2182 .FromJust()); | |
2183 args.GetReturnValue().Set( | |
2184 call_recursively_script->Run(context).ToLocalChecked()); | |
1964 } | 2185 } |
1965 | 2186 |
1966 | 2187 |
1967 static void CallFunctionRecursivelyCall( | 2188 static void CallFunctionRecursivelyCall( |
1968 const v8::FunctionCallbackInfo<v8::Value>& args) { | 2189 const v8::FunctionCallbackInfo<v8::Value>& args) { |
1969 ApiTestFuzzer::Fuzz(); | 2190 ApiTestFuzzer::Fuzz(); |
1970 int depth = args.This()->Get(v8_str("depth"))->Int32Value(); | 2191 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
2192 int depth = args.This() | |
2193 ->Get(context, v8_str("depth")) | |
2194 .ToLocalChecked() | |
2195 ->Int32Value(context) | |
2196 .FromJust(); | |
1971 if (depth == kTargetRecursionDepth) { | 2197 if (depth == kTargetRecursionDepth) { |
1972 printf("[depth = %d]\n", depth); | 2198 printf("[depth = %d]\n", depth); |
1973 return; | 2199 return; |
1974 } | 2200 } |
1975 args.This()->Set(v8_str("depth"), | 2201 CHECK(args.This() |
1976 v8::Integer::New(args.GetIsolate(), depth + 1)); | 2202 ->Set(context, v8_str("depth"), |
1977 v8::Handle<Value> function = | 2203 v8::Integer::New(args.GetIsolate(), depth + 1)) |
1978 args.This()->Get(v8_str("callFunctionRecursively")); | 2204 .FromJust()); |
1979 args.GetReturnValue().Set( | 2205 v8::Local<Value> function = |
1980 function.As<Function>()->Call(args.This(), 0, NULL)); | 2206 args.This() |
2207 ->Get(context, v8_str("callFunctionRecursively")) | |
2208 .ToLocalChecked(); | |
2209 args.GetReturnValue().Set(function.As<Function>() | |
2210 ->Call(context, args.This(), 0, NULL) | |
2211 .ToLocalChecked()); | |
1981 } | 2212 } |
1982 | 2213 |
1983 | 2214 |
1984 THREADED_TEST(DeepCrossLanguageRecursion) { | 2215 THREADED_TEST(DeepCrossLanguageRecursion) { |
1985 v8::Isolate* isolate = CcTest::isolate(); | 2216 v8::Isolate* isolate = CcTest::isolate(); |
1986 v8::HandleScope scope(isolate); | 2217 v8::HandleScope scope(isolate); |
1987 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); | 2218 v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); |
1988 global->Set(v8_str("callScriptRecursively"), | 2219 global->Set(v8_str("callScriptRecursively"), |
1989 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall)); | 2220 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall)); |
1990 global->Set(v8_str("callFunctionRecursively"), | 2221 global->Set(v8_str("callFunctionRecursively"), |
1991 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); | 2222 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); |
1992 LocalContext env(NULL, global); | 2223 LocalContext env(NULL, global); |
1993 | 2224 |
1994 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); | 2225 CHECK(env->Global() |
2226 ->Set(env.local(), v8_str("depth"), v8::Integer::New(isolate, 0)) | |
2227 .FromJust()); | |
1995 call_recursively_script = v8_compile("callScriptRecursively()"); | 2228 call_recursively_script = v8_compile("callScriptRecursively()"); |
1996 call_recursively_script->Run(); | 2229 call_recursively_script->Run(env.local()).ToLocalChecked(); |
1997 call_recursively_script = v8::Handle<Script>(); | 2230 call_recursively_script = v8::Local<Script>(); |
1998 | 2231 |
1999 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); | 2232 CHECK(env->Global() |
2233 ->Set(env.local(), v8_str("depth"), v8::Integer::New(isolate, 0)) | |
2234 .FromJust()); | |
2000 CompileRun("callFunctionRecursively()"); | 2235 CompileRun("callFunctionRecursively()"); |
2001 } | 2236 } |
2002 | 2237 |
2003 | 2238 |
2004 static void ThrowingPropertyHandlerGet( | 2239 static void ThrowingPropertyHandlerGet( |
2005 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { | 2240 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { |
2006 // Since this interceptor is used on "with" objects, the runtime will look up | 2241 // Since this interceptor is used on "with" objects, the runtime will look up |
2007 // @@unscopables. Punt. | 2242 // @@unscopables. Punt. |
2008 if (key->IsSymbol()) return; | 2243 if (key->IsSymbol()) return; |
2009 ApiTestFuzzer::Fuzz(); | 2244 ApiTestFuzzer::Fuzz(); |
2010 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); | 2245 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); |
2011 } | 2246 } |
2012 | 2247 |
2013 | 2248 |
2014 static void ThrowingPropertyHandlerSet( | 2249 static void ThrowingPropertyHandlerSet( |
2015 Local<Name> key, Local<Value>, | 2250 Local<Name> key, Local<Value>, |
2016 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2251 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2017 info.GetIsolate()->ThrowException(key); | 2252 info.GetIsolate()->ThrowException(key); |
2018 info.GetReturnValue().SetUndefined(); // not the same as empty handle | 2253 info.GetReturnValue().SetUndefined(); // not the same as empty handle |
2019 } | 2254 } |
2020 | 2255 |
2021 | 2256 |
2022 THREADED_TEST(CallbackExceptionRegression) { | 2257 THREADED_TEST(CallbackExceptionRegression) { |
2023 v8::Isolate* isolate = CcTest::isolate(); | 2258 v8::Isolate* isolate = CcTest::isolate(); |
2024 v8::HandleScope scope(isolate); | 2259 v8::HandleScope scope(isolate); |
2025 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); | 2260 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); |
2026 obj->SetHandler(v8::NamedPropertyHandlerConfiguration( | 2261 obj->SetHandler(v8::NamedPropertyHandlerConfiguration( |
2027 ThrowingPropertyHandlerGet, ThrowingPropertyHandlerSet)); | 2262 ThrowingPropertyHandlerGet, ThrowingPropertyHandlerSet)); |
2028 LocalContext env; | 2263 LocalContext env; |
2029 env->Global()->Set(v8_str("obj"), obj->NewInstance()); | 2264 CHECK(env->Global() |
2030 v8::Handle<Value> otto = | 2265 ->Set(env.local(), v8_str("obj"), |
2266 obj->NewInstance(env.local()).ToLocalChecked()) | |
2267 .FromJust()); | |
2268 v8::Local<Value> otto = | |
2031 CompileRun("try { with (obj) { otto; } } catch (e) { e; }"); | 2269 CompileRun("try { with (obj) { otto; } } catch (e) { e; }"); |
2032 CHECK(v8_str("otto")->Equals(otto)); | 2270 CHECK(v8_str("otto")->Equals(env.local(), otto).FromJust()); |
2033 v8::Handle<Value> netto = | 2271 v8::Local<Value> netto = |
2034 CompileRun("try { with (obj) { netto = 4; } } catch (e) { e; }"); | 2272 CompileRun("try { with (obj) { netto = 4; } } catch (e) { e; }"); |
2035 CHECK(v8_str("netto")->Equals(netto)); | 2273 CHECK(v8_str("netto")->Equals(env.local(), netto).FromJust()); |
2036 } | 2274 } |
2037 | 2275 |
2038 | 2276 |
2039 THREADED_TEST(FunctionPrototype) { | 2277 THREADED_TEST(FunctionPrototype) { |
2040 v8::Isolate* isolate = CcTest::isolate(); | 2278 v8::Isolate* isolate = CcTest::isolate(); |
2041 v8::HandleScope scope(isolate); | 2279 v8::HandleScope scope(isolate); |
2042 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); | 2280 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); |
2043 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); | 2281 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); |
2044 LocalContext env; | 2282 LocalContext env; |
2045 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); | 2283 CHECK(env->Global() |
2284 ->Set(env.local(), v8_str("Foo"), | |
2285 Foo->GetFunction(env.local()).ToLocalChecked()) | |
2286 .FromJust()); | |
2046 Local<Script> script = v8_compile("Foo.prototype.plak"); | 2287 Local<Script> script = v8_compile("Foo.prototype.plak"); |
2047 CHECK_EQ(script->Run()->Int32Value(), 321); | 2288 CHECK_EQ(v8_run_int32value(script), 321); |
2048 } | 2289 } |
2049 | 2290 |
2050 | 2291 |
2051 THREADED_TEST(InternalFields) { | 2292 THREADED_TEST(InternalFields) { |
2052 LocalContext env; | 2293 LocalContext env; |
2053 v8::Isolate* isolate = env->GetIsolate(); | 2294 v8::Isolate* isolate = env->GetIsolate(); |
2054 v8::HandleScope scope(isolate); | 2295 v8::HandleScope scope(isolate); |
2055 | 2296 |
2056 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 2297 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2057 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 2298 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
2058 instance_templ->SetInternalFieldCount(1); | 2299 instance_templ->SetInternalFieldCount(1); |
2059 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 2300 Local<v8::Object> obj = templ->GetFunction(env.local()) |
2301 .ToLocalChecked() | |
2302 ->NewInstance(env.local()) | |
2303 .ToLocalChecked(); | |
2060 CHECK_EQ(1, obj->InternalFieldCount()); | 2304 CHECK_EQ(1, obj->InternalFieldCount()); |
2061 CHECK(obj->GetInternalField(0)->IsUndefined()); | 2305 CHECK(obj->GetInternalField(0)->IsUndefined()); |
2062 obj->SetInternalField(0, v8_num(17)); | 2306 obj->SetInternalField(0, v8_num(17)); |
2063 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); | 2307 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value(env.local()).FromJust()); |
2064 } | 2308 } |
2065 | 2309 |
2066 | 2310 |
2067 THREADED_TEST(GlobalObjectInternalFields) { | 2311 THREADED_TEST(GlobalObjectInternalFields) { |
2068 v8::Isolate* isolate = CcTest::isolate(); | 2312 v8::Isolate* isolate = CcTest::isolate(); |
2069 v8::HandleScope scope(isolate); | 2313 v8::HandleScope scope(isolate); |
2070 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); | 2314 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); |
2071 global_template->SetInternalFieldCount(1); | 2315 global_template->SetInternalFieldCount(1); |
2072 LocalContext env(NULL, global_template); | 2316 LocalContext env(NULL, global_template); |
2073 v8::Handle<v8::Object> global_proxy = env->Global(); | 2317 v8::Local<v8::Object> global_proxy = env->Global(); |
2074 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); | 2318 v8::Local<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); |
2075 CHECK_EQ(1, global->InternalFieldCount()); | 2319 CHECK_EQ(1, global->InternalFieldCount()); |
2076 CHECK(global->GetInternalField(0)->IsUndefined()); | 2320 CHECK(global->GetInternalField(0)->IsUndefined()); |
2077 global->SetInternalField(0, v8_num(17)); | 2321 global->SetInternalField(0, v8_num(17)); |
2078 CHECK_EQ(17, global->GetInternalField(0)->Int32Value()); | 2322 CHECK_EQ(17, global->GetInternalField(0)->Int32Value(env.local()).FromJust()); |
2079 } | 2323 } |
2080 | 2324 |
2081 | 2325 |
2082 THREADED_TEST(GlobalObjectHasRealIndexedProperty) { | 2326 THREADED_TEST(GlobalObjectHasRealIndexedProperty) { |
2083 LocalContext env; | 2327 LocalContext env; |
2084 v8::HandleScope scope(CcTest::isolate()); | 2328 v8::HandleScope scope(CcTest::isolate()); |
2085 | 2329 |
2086 v8::Local<v8::Object> global = env->Global(); | 2330 v8::Local<v8::Object> global = env->Global(); |
2087 global->Set(0, v8::String::NewFromUtf8(CcTest::isolate(), "value")); | 2331 CHECK(global->Set(env.local(), 0, v8_str("value")).FromJust()); |
2088 CHECK(global->HasRealIndexedProperty(0)); | 2332 CHECK(global->HasRealIndexedProperty(env.local(), 0).FromJust()); |
2089 } | 2333 } |
2090 | 2334 |
2091 | 2335 |
2092 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj, | 2336 static void CheckAlignedPointerInInternalField(Local<v8::Object> obj, |
2093 void* value) { | 2337 void* value) { |
2094 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); | 2338 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); |
2095 obj->SetAlignedPointerInInternalField(0, value); | 2339 obj->SetAlignedPointerInInternalField(0, value); |
2096 CcTest::heap()->CollectAllGarbage(); | 2340 CcTest::heap()->CollectAllGarbage(); |
2097 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); | 2341 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); |
2098 } | 2342 } |
2099 | 2343 |
2100 | 2344 |
2101 THREADED_TEST(InternalFieldsAlignedPointers) { | 2345 THREADED_TEST(InternalFieldsAlignedPointers) { |
2102 LocalContext env; | 2346 LocalContext env; |
2103 v8::Isolate* isolate = env->GetIsolate(); | 2347 v8::Isolate* isolate = env->GetIsolate(); |
2104 v8::HandleScope scope(isolate); | 2348 v8::HandleScope scope(isolate); |
2105 | 2349 |
2106 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 2350 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2107 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 2351 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
2108 instance_templ->SetInternalFieldCount(1); | 2352 instance_templ->SetInternalFieldCount(1); |
2109 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 2353 Local<v8::Object> obj = templ->GetFunction(env.local()) |
2354 .ToLocalChecked() | |
2355 ->NewInstance(env.local()) | |
2356 .ToLocalChecked(); | |
2110 CHECK_EQ(1, obj->InternalFieldCount()); | 2357 CHECK_EQ(1, obj->InternalFieldCount()); |
2111 | 2358 |
2112 CheckAlignedPointerInInternalField(obj, NULL); | 2359 CheckAlignedPointerInInternalField(obj, NULL); |
2113 | 2360 |
2114 int* heap_allocated = new int[100]; | 2361 int* heap_allocated = new int[100]; |
2115 CheckAlignedPointerInInternalField(obj, heap_allocated); | 2362 CheckAlignedPointerInInternalField(obj, heap_allocated); |
2116 delete[] heap_allocated; | 2363 delete[] heap_allocated; |
2117 | 2364 |
2118 int stack_allocated[100]; | 2365 int stack_allocated[100]; |
2119 CheckAlignedPointerInInternalField(obj, stack_allocated); | 2366 CheckAlignedPointerInInternalField(obj, stack_allocated); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2162 env->SetAlignedPointerInEmbedderData(i, AlignedTestPointer(i)); | 2409 env->SetAlignedPointerInEmbedderData(i, AlignedTestPointer(i)); |
2163 } | 2410 } |
2164 CcTest::heap()->CollectAllGarbage(); | 2411 CcTest::heap()->CollectAllGarbage(); |
2165 for (int i = 0; i < 100; i++) { | 2412 for (int i = 0; i < 100; i++) { |
2166 CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i)); | 2413 CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i)); |
2167 } | 2414 } |
2168 } | 2415 } |
2169 | 2416 |
2170 | 2417 |
2171 static void CheckEmbedderData(LocalContext* env, int index, | 2418 static void CheckEmbedderData(LocalContext* env, int index, |
2172 v8::Handle<Value> data) { | 2419 v8::Local<Value> data) { |
2173 (*env)->SetEmbedderData(index, data); | 2420 (*env)->SetEmbedderData(index, data); |
2174 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data)); | 2421 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data)); |
2175 } | 2422 } |
2176 | 2423 |
2177 | 2424 |
2178 THREADED_TEST(EmbedderData) { | 2425 THREADED_TEST(EmbedderData) { |
2179 LocalContext env; | 2426 LocalContext env; |
2180 v8::Isolate* isolate = env->GetIsolate(); | 2427 v8::Isolate* isolate = env->GetIsolate(); |
2181 v8::HandleScope scope(isolate); | 2428 v8::HandleScope scope(isolate); |
2182 | 2429 |
2183 CheckEmbedderData( | 2430 CheckEmbedderData(&env, 3, v8_str("The quick brown fox jumps")); |
2184 &env, 3, v8::String::NewFromUtf8(isolate, "The quick brown fox jumps")); | 2431 CheckEmbedderData(&env, 2, v8_str("over the lazy dog.")); |
2185 CheckEmbedderData(&env, 2, | |
2186 v8::String::NewFromUtf8(isolate, "over the lazy dog.")); | |
2187 CheckEmbedderData(&env, 1, v8::Number::New(isolate, 1.2345)); | 2432 CheckEmbedderData(&env, 1, v8::Number::New(isolate, 1.2345)); |
2188 CheckEmbedderData(&env, 0, v8::Boolean::New(isolate, true)); | 2433 CheckEmbedderData(&env, 0, v8::Boolean::New(isolate, true)); |
2189 } | 2434 } |
2190 | 2435 |
2191 | 2436 |
2437 // TODO(vogelheim): Does this test even make sense in a post-deprecation world? | |
2438 /* | |
2192 THREADED_TEST(GetIsolate) { | 2439 THREADED_TEST(GetIsolate) { |
2193 LocalContext env; | 2440 LocalContext env; |
2194 v8::Isolate* isolate = env->GetIsolate(); | 2441 v8::Isolate* isolate = env->GetIsolate(); |
2195 v8::HandleScope scope(isolate); | 2442 v8::HandleScope scope(isolate); |
2196 Local<v8::Object> obj = v8::Object::New(isolate); | 2443 Local<v8::Object> obj = v8::Object::New(isolate); |
2197 CHECK_EQ(isolate, obj->GetIsolate()); | 2444 CHECK_EQ(isolate, obj->GetIsolate()); |
2198 CHECK_EQ(isolate, CcTest::global()->GetIsolate()); | 2445 CHECK_EQ(isolate, CcTest::global()->GetIsolate()); |
2199 } | 2446 } |
2447 */ | |
2200 | 2448 |
2201 | 2449 |
2202 THREADED_TEST(IdentityHash) { | 2450 THREADED_TEST(IdentityHash) { |
2203 LocalContext env; | 2451 LocalContext env; |
2204 v8::Isolate* isolate = env->GetIsolate(); | 2452 v8::Isolate* isolate = env->GetIsolate(); |
2205 v8::HandleScope scope(isolate); | 2453 v8::HandleScope scope(isolate); |
2206 | 2454 |
2207 // Ensure that the test starts with an fresh heap to test whether the hash | 2455 // Ensure that the test starts with an fresh heap to test whether the hash |
2208 // code is based on the address. | 2456 // code is based on the address. |
2209 CcTest::heap()->CollectAllGarbage(); | 2457 CcTest::heap()->CollectAllGarbage(); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2242 CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash()); | 2490 CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash()); |
2243 } | 2491 } |
2244 } | 2492 } |
2245 | 2493 |
2246 | 2494 |
2247 void GlobalProxyIdentityHash(bool set_in_js) { | 2495 void GlobalProxyIdentityHash(bool set_in_js) { |
2248 LocalContext env; | 2496 LocalContext env; |
2249 v8::Isolate* isolate = env->GetIsolate(); | 2497 v8::Isolate* isolate = env->GetIsolate(); |
2250 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 2498 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
2251 v8::HandleScope scope(isolate); | 2499 v8::HandleScope scope(isolate); |
2252 Handle<Object> global_proxy = env->Global(); | 2500 Local<Object> global_proxy = env->Global(); |
2253 i::Handle<i::Object> i_global_proxy = v8::Utils::OpenHandle(*global_proxy); | 2501 i::Handle<i::Object> i_global_proxy = v8::Utils::OpenHandle(*global_proxy); |
2254 env->Global()->Set(v8_str("global"), global_proxy); | 2502 CHECK(env->Global() |
2503 ->Set(env.local(), v8_str("global"), global_proxy) | |
2504 .FromJust()); | |
2255 i::Handle<i::Object> original_hash; | 2505 i::Handle<i::Object> original_hash; |
2256 if (set_in_js) { | 2506 if (set_in_js) { |
2257 CompileRun("var m = new Set(); m.add(global);"); | 2507 CompileRun("var m = new Set(); m.add(global);"); |
2258 original_hash = i::Handle<i::Object>(i_global_proxy->GetHash(), i_isolate); | 2508 original_hash = i::Handle<i::Object>(i_global_proxy->GetHash(), i_isolate); |
2259 } else { | 2509 } else { |
2260 original_hash = i::Handle<i::Object>( | 2510 original_hash = i::Handle<i::Object>( |
2261 i::Object::GetOrCreateHash(i_isolate, i_global_proxy)); | 2511 i::Object::GetOrCreateHash(i_isolate, i_global_proxy)); |
2262 } | 2512 } |
2263 CHECK(original_hash->IsSmi()); | 2513 CHECK(original_hash->IsSmi()); |
2264 int32_t hash1 = i::Handle<i::Smi>::cast(original_hash)->value(); | 2514 int32_t hash1 = i::Handle<i::Smi>::cast(original_hash)->value(); |
2265 // Hash should be retained after being detached. | 2515 // Hash should be retained after being detached. |
2266 env->DetachGlobal(); | 2516 env->DetachGlobal(); |
2267 int hash2 = global_proxy->GetIdentityHash(); | 2517 int hash2 = global_proxy->GetIdentityHash(); |
2268 CHECK_EQ(hash1, hash2); | 2518 CHECK_EQ(hash1, hash2); |
2269 { | 2519 { |
2270 // Re-attach global proxy to a new context, hash should stay the same. | 2520 // Re-attach global proxy to a new context, hash should stay the same. |
2271 LocalContext env2(NULL, Handle<ObjectTemplate>(), global_proxy); | 2521 LocalContext env2(NULL, Local<ObjectTemplate>(), global_proxy); |
2272 int hash3 = global_proxy->GetIdentityHash(); | 2522 int hash3 = global_proxy->GetIdentityHash(); |
2273 CHECK_EQ(hash1, hash3); | 2523 CHECK_EQ(hash1, hash3); |
2274 } | 2524 } |
2275 } | 2525 } |
2276 | 2526 |
2277 | 2527 |
2278 THREADED_TEST(GlobalProxyIdentityHash) { | 2528 THREADED_TEST(GlobalProxyIdentityHash) { |
2279 GlobalProxyIdentityHash(true); | 2529 GlobalProxyIdentityHash(true); |
2280 GlobalProxyIdentityHash(false); | 2530 GlobalProxyIdentityHash(false); |
2281 } | 2531 } |
2282 | 2532 |
2283 | 2533 |
2284 TEST(SymbolIdentityHash) { | 2534 TEST(SymbolIdentityHash) { |
2285 LocalContext env; | 2535 LocalContext env; |
2286 v8::Isolate* isolate = env->GetIsolate(); | 2536 v8::Isolate* isolate = env->GetIsolate(); |
2287 v8::HandleScope scope(isolate); | 2537 v8::HandleScope scope(isolate); |
2288 | 2538 |
2289 { | 2539 { |
2290 Local<v8::Symbol> symbol = v8::Symbol::New(isolate); | 2540 Local<v8::Symbol> symbol = v8::Symbol::New(isolate); |
2291 int hash = symbol->GetIdentityHash(); | 2541 int hash = symbol->GetIdentityHash(); |
2292 int hash1 = symbol->GetIdentityHash(); | 2542 int hash1 = symbol->GetIdentityHash(); |
2293 CHECK_EQ(hash, hash1); | 2543 CHECK_EQ(hash, hash1); |
2294 CcTest::heap()->CollectAllGarbage(); | 2544 CcTest::heap()->CollectAllGarbage(); |
2295 int hash3 = symbol->GetIdentityHash(); | 2545 int hash3 = symbol->GetIdentityHash(); |
2296 CHECK_EQ(hash, hash3); | 2546 CHECK_EQ(hash, hash3); |
2297 } | 2547 } |
2298 | 2548 |
2299 { | 2549 { |
2300 v8::Handle<v8::Symbol> js_symbol = | 2550 v8::Local<v8::Symbol> js_symbol = |
2301 CompileRun("Symbol('foo')").As<v8::Symbol>(); | 2551 CompileRun("Symbol('foo')").As<v8::Symbol>(); |
2302 int hash = js_symbol->GetIdentityHash(); | 2552 int hash = js_symbol->GetIdentityHash(); |
2303 int hash1 = js_symbol->GetIdentityHash(); | 2553 int hash1 = js_symbol->GetIdentityHash(); |
2304 CHECK_EQ(hash, hash1); | 2554 CHECK_EQ(hash, hash1); |
2305 CcTest::heap()->CollectAllGarbage(); | 2555 CcTest::heap()->CollectAllGarbage(); |
2306 int hash3 = js_symbol->GetIdentityHash(); | 2556 int hash3 = js_symbol->GetIdentityHash(); |
2307 CHECK_EQ(hash, hash3); | 2557 CHECK_EQ(hash, hash3); |
2308 } | 2558 } |
2309 } | 2559 } |
2310 | 2560 |
2311 | 2561 |
2312 TEST(StringIdentityHash) { | 2562 TEST(StringIdentityHash) { |
2313 LocalContext env; | 2563 LocalContext env; |
2314 v8::Isolate* isolate = env->GetIsolate(); | 2564 v8::Isolate* isolate = env->GetIsolate(); |
2315 v8::HandleScope scope(isolate); | 2565 v8::HandleScope scope(isolate); |
2316 | 2566 |
2317 Local<v8::String> str = v8::String::NewFromUtf8(isolate, "str1"); | 2567 Local<v8::String> str = v8_str("str1"); |
2318 int hash = str->GetIdentityHash(); | 2568 int hash = str->GetIdentityHash(); |
2319 int hash1 = str->GetIdentityHash(); | 2569 int hash1 = str->GetIdentityHash(); |
2320 CHECK_EQ(hash, hash1); | 2570 CHECK_EQ(hash, hash1); |
2321 CcTest::heap()->CollectAllGarbage(); | 2571 CcTest::heap()->CollectAllGarbage(); |
2322 int hash3 = str->GetIdentityHash(); | 2572 int hash3 = str->GetIdentityHash(); |
2323 CHECK_EQ(hash, hash3); | 2573 CHECK_EQ(hash, hash3); |
2324 | 2574 |
2325 Local<v8::String> str2 = v8::String::NewFromUtf8(isolate, "str1"); | 2575 Local<v8::String> str2 = v8_str("str1"); |
2326 int hash4 = str2->GetIdentityHash(); | 2576 int hash4 = str2->GetIdentityHash(); |
2327 CHECK_EQ(hash, hash4); | 2577 CHECK_EQ(hash, hash4); |
2328 } | 2578 } |
2329 | 2579 |
2330 | 2580 |
2331 THREADED_TEST(SymbolProperties) { | 2581 THREADED_TEST(SymbolProperties) { |
2332 LocalContext env; | 2582 LocalContext env; |
2333 v8::Isolate* isolate = env->GetIsolate(); | 2583 v8::Isolate* isolate = env->GetIsolate(); |
2334 v8::HandleScope scope(isolate); | 2584 v8::HandleScope scope(isolate); |
2335 | 2585 |
2336 v8::Local<v8::Object> obj = v8::Object::New(isolate); | 2586 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
2337 v8::Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); | 2587 v8::Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); |
2338 v8::Local<v8::Symbol> sym2 = v8::Symbol::New(isolate, v8_str("my-symbol")); | 2588 v8::Local<v8::Symbol> sym2 = v8::Symbol::New(isolate, v8_str("my-symbol")); |
2339 v8::Local<v8::Symbol> sym3 = v8::Symbol::New(isolate, v8_str("sym3")); | 2589 v8::Local<v8::Symbol> sym3 = v8::Symbol::New(isolate, v8_str("sym3")); |
2340 | 2590 |
2341 CcTest::heap()->CollectAllGarbage(); | 2591 CcTest::heap()->CollectAllGarbage(); |
2342 | 2592 |
2343 // Check basic symbol functionality. | 2593 // Check basic symbol functionality. |
2344 CHECK(sym1->IsSymbol()); | 2594 CHECK(sym1->IsSymbol()); |
2345 CHECK(sym2->IsSymbol()); | 2595 CHECK(sym2->IsSymbol()); |
2346 CHECK(!obj->IsSymbol()); | 2596 CHECK(!obj->IsSymbol()); |
2347 | 2597 |
2348 CHECK(sym1->Equals(sym1)); | 2598 CHECK(sym1->Equals(env.local(), sym1).FromJust()); |
2349 CHECK(sym2->Equals(sym2)); | 2599 CHECK(sym2->Equals(env.local(), sym2).FromJust()); |
2350 CHECK(!sym1->Equals(sym2)); | 2600 CHECK(!sym1->Equals(env.local(), sym2).FromJust()); |
2351 CHECK(!sym2->Equals(sym1)); | 2601 CHECK(!sym2->Equals(env.local(), sym1).FromJust()); |
2352 CHECK(sym1->StrictEquals(sym1)); | 2602 CHECK(sym1->StrictEquals(sym1)); |
2353 CHECK(sym2->StrictEquals(sym2)); | 2603 CHECK(sym2->StrictEquals(sym2)); |
2354 CHECK(!sym1->StrictEquals(sym2)); | 2604 CHECK(!sym1->StrictEquals(sym2)); |
2355 CHECK(!sym2->StrictEquals(sym1)); | 2605 CHECK(!sym2->StrictEquals(sym1)); |
2356 | 2606 |
2357 CHECK(sym2->Name()->Equals(v8_str("my-symbol"))); | 2607 CHECK(sym2->Name()->Equals(env.local(), v8_str("my-symbol")).FromJust()); |
2358 | 2608 |
2359 v8::Local<v8::Value> sym_val = sym2; | 2609 v8::Local<v8::Value> sym_val = sym2; |
2360 CHECK(sym_val->IsSymbol()); | 2610 CHECK(sym_val->IsSymbol()); |
2361 CHECK(sym_val->Equals(sym2)); | 2611 CHECK(sym_val->Equals(env.local(), sym2).FromJust()); |
2362 CHECK(sym_val->StrictEquals(sym2)); | 2612 CHECK(sym_val->StrictEquals(sym2)); |
2363 CHECK(v8::Symbol::Cast(*sym_val)->Equals(sym2)); | 2613 CHECK(v8::Symbol::Cast(*sym_val)->Equals(env.local(), sym2).FromJust()); |
2364 | 2614 |
2365 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2); | 2615 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2); |
2366 CHECK(sym_obj->IsSymbolObject()); | 2616 CHECK(sym_obj->IsSymbolObject()); |
2367 CHECK(!sym2->IsSymbolObject()); | 2617 CHECK(!sym2->IsSymbolObject()); |
2368 CHECK(!obj->IsSymbolObject()); | 2618 CHECK(!obj->IsSymbolObject()); |
2369 CHECK(sym_obj->Equals(sym2)); | 2619 CHECK(sym_obj->Equals(env.local(), sym2).FromJust()); |
2370 CHECK(!sym_obj->StrictEquals(sym2)); | 2620 CHECK(!sym_obj->StrictEquals(sym2)); |
2371 CHECK(v8::SymbolObject::Cast(*sym_obj)->Equals(sym_obj)); | 2621 CHECK(v8::SymbolObject::Cast(*sym_obj) |
2372 CHECK(v8::SymbolObject::Cast(*sym_obj)->ValueOf()->Equals(sym2)); | 2622 ->Equals(env.local(), sym_obj) |
2623 .FromJust()); | |
2624 CHECK(v8::SymbolObject::Cast(*sym_obj) | |
2625 ->ValueOf() | |
2626 ->Equals(env.local(), sym2) | |
2627 .FromJust()); | |
2373 | 2628 |
2374 // Make sure delete of a non-existent symbol property works. | 2629 // Make sure delete of a non-existent symbol property works. |
2375 CHECK(obj->Delete(sym1)); | 2630 CHECK(obj->Delete(env.local(), sym1).FromJust()); |
2376 CHECK(!obj->Has(sym1)); | 2631 CHECK(!obj->Has(env.local(), sym1).FromJust()); |
2377 | 2632 |
2378 CHECK(obj->Set(sym1, v8::Integer::New(isolate, 1503))); | 2633 CHECK( |
2379 CHECK(obj->Has(sym1)); | 2634 obj->Set(env.local(), sym1, v8::Integer::New(isolate, 1503)).FromJust()); |
2380 CHECK_EQ(1503, obj->Get(sym1)->Int32Value()); | 2635 CHECK(obj->Has(env.local(), sym1).FromJust()); |
2381 CHECK(obj->Set(sym1, v8::Integer::New(isolate, 2002))); | 2636 CHECK_EQ(1503, obj->Get(env.local(), sym1) |
2382 CHECK(obj->Has(sym1)); | 2637 .ToLocalChecked() |
2383 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); | 2638 ->Int32Value(env.local()) |
2384 CHECK_EQ(v8::None, obj->GetPropertyAttributes(sym1)); | 2639 .FromJust()); |
2640 CHECK( | |
2641 obj->Set(env.local(), sym1, v8::Integer::New(isolate, 2002)).FromJust()); | |
2642 CHECK(obj->Has(env.local(), sym1).FromJust()); | |
2643 CHECK_EQ(2002, obj->Get(env.local(), sym1) | |
2644 .ToLocalChecked() | |
2645 ->Int32Value(env.local()) | |
2646 .FromJust()); | |
2647 CHECK_EQ(v8::None, obj->GetPropertyAttributes(env.local(), sym1).FromJust()); | |
2385 | 2648 |
2386 CHECK_EQ(0u, obj->GetOwnPropertyNames()->Length()); | 2649 CHECK_EQ(0u, |
2387 unsigned num_props = obj->GetPropertyNames()->Length(); | 2650 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); |
2388 CHECK(obj->Set(v8::String::NewFromUtf8(isolate, "bla"), | 2651 unsigned num_props = |
2389 v8::Integer::New(isolate, 20))); | 2652 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length(); |
2390 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); | 2653 CHECK(obj->Set(env.local(), v8_str("bla"), v8::Integer::New(isolate, 20)) |
2391 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); | 2654 .FromJust()); |
2655 CHECK_EQ(1u, | |
2656 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2657 CHECK_EQ(num_props + 1, | |
2658 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2392 | 2659 |
2393 CcTest::heap()->CollectAllGarbage(); | 2660 CcTest::heap()->CollectAllGarbage(); |
2394 | 2661 |
2395 CHECK(obj->SetAccessor(sym3, SymbolAccessorGetter, SymbolAccessorSetter)); | 2662 CHECK(obj->SetAccessor(env.local(), sym3, SymbolAccessorGetter, |
2396 CHECK(obj->Get(sym3)->IsUndefined()); | 2663 SymbolAccessorSetter) |
2397 CHECK(obj->Set(sym3, v8::Integer::New(isolate, 42))); | 2664 .FromJust()); |
2398 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); | 2665 CHECK(obj->Get(env.local(), sym3).ToLocalChecked()->IsUndefined()); |
2399 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) | 2666 CHECK(obj->Set(env.local(), sym3, v8::Integer::New(isolate, 42)).FromJust()); |
2400 ->Equals(v8::Integer::New(isolate, 42))); | 2667 CHECK(obj->Get(env.local(), sym3) |
2668 .ToLocalChecked() | |
2669 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2670 .FromJust()); | |
2671 CHECK(obj->Get(env.local(), v8_str("accessor_sym3")) | |
2672 .ToLocalChecked() | |
2673 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2674 .FromJust()); | |
2401 | 2675 |
2402 // Add another property and delete it afterwards to force the object in | 2676 // Add another property and delete it afterwards to force the object in |
2403 // slow case. | 2677 // slow case. |
2404 CHECK(obj->Set(sym2, v8::Integer::New(isolate, 2008))); | 2678 CHECK( |
2405 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); | 2679 obj->Set(env.local(), sym2, v8::Integer::New(isolate, 2008)).FromJust()); |
2406 CHECK_EQ(2008, obj->Get(sym2)->Int32Value()); | 2680 CHECK_EQ(2002, obj->Get(env.local(), sym1) |
2407 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); | 2681 .ToLocalChecked() |
2408 CHECK_EQ(2u, obj->GetOwnPropertyNames()->Length()); | 2682 ->Int32Value(env.local()) |
2683 .FromJust()); | |
2684 CHECK_EQ(2008, obj->Get(env.local(), sym2) | |
2685 .ToLocalChecked() | |
2686 ->Int32Value(env.local()) | |
2687 .FromJust()); | |
2688 CHECK_EQ(2002, obj->Get(env.local(), sym1) | |
2689 .ToLocalChecked() | |
2690 ->Int32Value(env.local()) | |
2691 .FromJust()); | |
2692 CHECK_EQ(2u, | |
2693 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2409 | 2694 |
2410 CHECK(obj->Has(sym1)); | 2695 CHECK(obj->Has(env.local(), sym1).FromJust()); |
2411 CHECK(obj->Has(sym2)); | 2696 CHECK(obj->Has(env.local(), sym2).FromJust()); |
2412 CHECK(obj->Has(sym3)); | 2697 CHECK(obj->Has(env.local(), sym3).FromJust()); |
2413 CHECK(obj->Has(v8::String::NewFromUtf8(isolate, "accessor_sym3"))); | 2698 CHECK(obj->Has(env.local(), v8_str("accessor_sym3")).FromJust()); |
2414 CHECK(obj->Delete(sym2)); | 2699 CHECK(obj->Delete(env.local(), sym2).FromJust()); |
2415 CHECK(obj->Has(sym1)); | 2700 CHECK(obj->Has(env.local(), sym1).FromJust()); |
2416 CHECK(!obj->Has(sym2)); | 2701 CHECK(!obj->Has(env.local(), sym2).FromJust()); |
2417 CHECK(obj->Has(sym3)); | 2702 CHECK(obj->Has(env.local(), sym3).FromJust()); |
2418 CHECK(obj->Has(v8::String::NewFromUtf8(isolate, "accessor_sym3"))); | 2703 CHECK(obj->Has(env.local(), v8_str("accessor_sym3")).FromJust()); |
2419 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); | 2704 CHECK_EQ(2002, obj->Get(env.local(), sym1) |
2420 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); | 2705 .ToLocalChecked() |
2421 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) | 2706 ->Int32Value(env.local()) |
2422 ->Equals(v8::Integer::New(isolate, 42))); | 2707 .FromJust()); |
2423 CHECK_EQ(2u, obj->GetOwnPropertyNames()->Length()); | 2708 CHECK(obj->Get(env.local(), sym3) |
2709 .ToLocalChecked() | |
2710 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2711 .FromJust()); | |
2712 CHECK(obj->Get(env.local(), v8_str("accessor_sym3")) | |
2713 .ToLocalChecked() | |
2714 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2715 .FromJust()); | |
2716 CHECK_EQ(2u, | |
2717 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2424 | 2718 |
2425 // Symbol properties are inherited. | 2719 // Symbol properties are inherited. |
2426 v8::Local<v8::Object> child = v8::Object::New(isolate); | 2720 v8::Local<v8::Object> child = v8::Object::New(isolate); |
2427 child->SetPrototype(obj); | 2721 CHECK(child->SetPrototype(env.local(), obj).FromJust()); |
2428 CHECK(child->Has(sym1)); | 2722 CHECK(child->Has(env.local(), sym1).FromJust()); |
2429 CHECK_EQ(2002, child->Get(sym1)->Int32Value()); | 2723 CHECK_EQ(2002, child->Get(env.local(), sym1) |
2430 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); | 2724 .ToLocalChecked() |
2431 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) | 2725 ->Int32Value(env.local()) |
2432 ->Equals(v8::Integer::New(isolate, 42))); | 2726 .FromJust()); |
2433 CHECK_EQ(0u, child->GetOwnPropertyNames()->Length()); | 2727 CHECK(obj->Get(env.local(), sym3) |
2728 .ToLocalChecked() | |
2729 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2730 .FromJust()); | |
2731 CHECK(obj->Get(env.local(), v8_str("accessor_sym3")) | |
2732 .ToLocalChecked() | |
2733 ->Equals(env.local(), v8::Integer::New(isolate, 42)) | |
2734 .FromJust()); | |
2735 CHECK_EQ(0u, | |
2736 child->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2434 } | 2737 } |
2435 | 2738 |
2436 | 2739 |
2437 THREADED_TEST(SymbolTemplateProperties) { | 2740 THREADED_TEST(SymbolTemplateProperties) { |
2438 LocalContext env; | 2741 LocalContext env; |
2439 v8::Isolate* isolate = env->GetIsolate(); | 2742 v8::Isolate* isolate = env->GetIsolate(); |
2440 v8::HandleScope scope(isolate); | 2743 v8::HandleScope scope(isolate); |
2441 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate); | 2744 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate); |
2442 v8::Local<v8::Name> name = v8::Symbol::New(isolate); | 2745 v8::Local<v8::Name> name = v8::Symbol::New(isolate); |
2443 CHECK(!name.IsEmpty()); | 2746 CHECK(!name.IsEmpty()); |
2444 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate)); | 2747 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate)); |
2445 v8::Local<v8::Object> new_instance = foo->InstanceTemplate()->NewInstance(); | 2748 v8::Local<v8::Object> new_instance = |
2749 foo->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked(); | |
2446 CHECK(!new_instance.IsEmpty()); | 2750 CHECK(!new_instance.IsEmpty()); |
2447 CHECK(new_instance->Has(name)); | 2751 CHECK(new_instance->Has(env.local(), name).FromJust()); |
2448 } | 2752 } |
2449 | 2753 |
2450 | 2754 |
2451 THREADED_TEST(PrivateProperties) { | 2755 THREADED_TEST(PrivateProperties) { |
2452 LocalContext env; | 2756 LocalContext env; |
2453 v8::Isolate* isolate = env->GetIsolate(); | 2757 v8::Isolate* isolate = env->GetIsolate(); |
2454 v8::HandleScope scope(isolate); | 2758 v8::HandleScope scope(isolate); |
2455 | 2759 |
2456 v8::Local<v8::Object> obj = v8::Object::New(isolate); | 2760 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
2457 v8::Local<v8::Private> priv1 = v8::Private::New(isolate); | 2761 v8::Local<v8::Private> priv1 = v8::Private::New(isolate); |
2458 v8::Local<v8::Private> priv2 = | 2762 v8::Local<v8::Private> priv2 = |
2459 v8::Private::New(isolate, v8_str("my-private")); | 2763 v8::Private::New(isolate, v8_str("my-private")); |
2460 | 2764 |
2461 CcTest::heap()->CollectAllGarbage(); | 2765 CcTest::heap()->CollectAllGarbage(); |
2462 | 2766 |
2463 CHECK(priv2->Name()->Equals(v8::String::NewFromUtf8(isolate, "my-private"))); | 2767 CHECK(priv2->Name() |
2768 ->Equals(env.local(), | |
2769 v8::String::NewFromUtf8(isolate, "my-private", | |
2770 v8::NewStringType::kNormal) | |
2771 .ToLocalChecked()) | |
2772 .FromJust()); | |
2464 | 2773 |
2465 // Make sure delete of a non-existent private symbol property works. | 2774 // Make sure delete of a non-existent private symbol property works. |
2466 obj->DeletePrivate(env.local(), priv1).FromJust(); | 2775 obj->DeletePrivate(env.local(), priv1).FromJust(); |
2467 CHECK(!obj->HasPrivate(env.local(), priv1).FromJust()); | 2776 CHECK(!obj->HasPrivate(env.local(), priv1).FromJust()); |
2468 | 2777 |
2469 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 1503)) | 2778 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 1503)) |
2470 .FromJust()); | 2779 .FromJust()); |
2471 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); | 2780 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
2472 CHECK_EQ(1503, | 2781 CHECK_EQ(1503, obj->GetPrivate(env.local(), priv1) |
2473 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); | 2782 .ToLocalChecked() |
2783 ->Int32Value(env.local()) | |
2784 .FromJust()); | |
2474 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 2002)) | 2785 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 2002)) |
2475 .FromJust()); | 2786 .FromJust()); |
2476 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); | 2787 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
2477 CHECK_EQ(2002, | 2788 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1) |
2478 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); | 2789 .ToLocalChecked() |
2790 ->Int32Value(env.local()) | |
2791 .FromJust()); | |
2479 | 2792 |
2480 CHECK_EQ(0u, obj->GetOwnPropertyNames()->Length()); | 2793 CHECK_EQ(0u, |
2481 unsigned num_props = obj->GetPropertyNames()->Length(); | 2794 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); |
2482 CHECK(obj->Set(v8::String::NewFromUtf8(isolate, "bla"), | 2795 unsigned num_props = |
2483 v8::Integer::New(isolate, 20))); | 2796 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length(); |
2484 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); | 2797 CHECK(obj->Set(env.local(), v8::String::NewFromUtf8( |
2485 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); | 2798 isolate, "bla", v8::NewStringType::kNormal) |
2799 .ToLocalChecked(), | |
2800 v8::Integer::New(isolate, 20)) | |
2801 .FromJust()); | |
2802 CHECK_EQ(1u, | |
2803 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2804 CHECK_EQ(num_props + 1, | |
2805 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2486 | 2806 |
2487 CcTest::heap()->CollectAllGarbage(); | 2807 CcTest::heap()->CollectAllGarbage(); |
2488 | 2808 |
2489 // Add another property and delete it afterwards to force the object in | 2809 // Add another property and delete it afterwards to force the object in |
2490 // slow case. | 2810 // slow case. |
2491 CHECK(obj->SetPrivate(env.local(), priv2, v8::Integer::New(isolate, 2008)) | 2811 CHECK(obj->SetPrivate(env.local(), priv2, v8::Integer::New(isolate, 2008)) |
2492 .FromJust()); | 2812 .FromJust()); |
2493 CHECK_EQ(2002, | 2813 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1) |
2494 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); | 2814 .ToLocalChecked() |
2495 CHECK_EQ(2008, | 2815 ->Int32Value(env.local()) |
2496 obj->GetPrivate(env.local(), priv2).ToLocalChecked()->Int32Value()); | 2816 .FromJust()); |
2497 CHECK_EQ(2002, | 2817 CHECK_EQ(2008, obj->GetPrivate(env.local(), priv2) |
2498 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); | 2818 .ToLocalChecked() |
2499 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); | 2819 ->Int32Value(env.local()) |
2820 .FromJust()); | |
2821 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1) | |
2822 .ToLocalChecked() | |
2823 ->Int32Value(env.local()) | |
2824 .FromJust()); | |
2825 CHECK_EQ(1u, | |
2826 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2500 | 2827 |
2501 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); | 2828 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
2502 CHECK(obj->HasPrivate(env.local(), priv2).FromJust()); | 2829 CHECK(obj->HasPrivate(env.local(), priv2).FromJust()); |
2503 CHECK(obj->DeletePrivate(env.local(), priv2).FromJust()); | 2830 CHECK(obj->DeletePrivate(env.local(), priv2).FromJust()); |
2504 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); | 2831 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); |
2505 CHECK(!obj->HasPrivate(env.local(), priv2).FromJust()); | 2832 CHECK(!obj->HasPrivate(env.local(), priv2).FromJust()); |
2506 CHECK_EQ(2002, | 2833 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1) |
2507 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); | 2834 .ToLocalChecked() |
2508 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); | 2835 ->Int32Value(env.local()) |
2836 .FromJust()); | |
2837 CHECK_EQ(1u, | |
2838 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2509 | 2839 |
2510 // Private properties are not inherited (for the time being). | 2840 // Private properties are not inherited (for the time being). |
2511 v8::Local<v8::Object> child = v8::Object::New(isolate); | 2841 v8::Local<v8::Object> child = v8::Object::New(isolate); |
2512 child->SetPrototype(obj); | 2842 CHECK(child->SetPrototype(env.local(), obj).FromJust()); |
2513 CHECK(!child->HasPrivate(env.local(), priv1).FromJust()); | 2843 CHECK(!child->HasPrivate(env.local(), priv1).FromJust()); |
2514 CHECK_EQ(0u, child->GetOwnPropertyNames()->Length()); | 2844 CHECK_EQ(0u, |
2845 child->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length()); | |
2515 } | 2846 } |
2516 | 2847 |
2517 | 2848 |
2518 THREADED_TEST(GlobalSymbols) { | 2849 THREADED_TEST(GlobalSymbols) { |
2519 LocalContext env; | 2850 LocalContext env; |
2520 v8::Isolate* isolate = env->GetIsolate(); | 2851 v8::Isolate* isolate = env->GetIsolate(); |
2521 v8::HandleScope scope(isolate); | 2852 v8::HandleScope scope(isolate); |
2522 | 2853 |
2523 v8::Local<String> name = v8_str("my-symbol"); | 2854 v8::Local<String> name = v8_str("my-symbol"); |
2524 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name); | 2855 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name); |
2525 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name); | 2856 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name); |
2526 CHECK(glob2->SameValue(glob)); | 2857 CHECK(glob2->SameValue(glob)); |
2527 | 2858 |
2528 v8::Local<v8::Symbol> glob_api = v8::Symbol::ForApi(isolate, name); | 2859 v8::Local<v8::Symbol> glob_api = v8::Symbol::ForApi(isolate, name); |
2529 v8::Local<v8::Symbol> glob_api2 = v8::Symbol::ForApi(isolate, name); | 2860 v8::Local<v8::Symbol> glob_api2 = v8::Symbol::ForApi(isolate, name); |
2530 CHECK(glob_api2->SameValue(glob_api)); | 2861 CHECK(glob_api2->SameValue(glob_api)); |
2531 CHECK(!glob_api->SameValue(glob)); | 2862 CHECK(!glob_api->SameValue(glob)); |
2532 | 2863 |
2533 v8::Local<v8::Symbol> sym = v8::Symbol::New(isolate, name); | 2864 v8::Local<v8::Symbol> sym = v8::Symbol::New(isolate, name); |
2534 CHECK(!sym->SameValue(glob)); | 2865 CHECK(!sym->SameValue(glob)); |
2535 | 2866 |
2536 CompileRun("var sym2 = Symbol.for('my-symbol')"); | 2867 CompileRun("var sym2 = Symbol.for('my-symbol')"); |
2537 v8::Local<Value> sym2 = env->Global()->Get(v8_str("sym2")); | 2868 v8::Local<Value> sym2 = |
2869 env->Global()->Get(env.local(), v8_str("sym2")).ToLocalChecked(); | |
2538 CHECK(sym2->SameValue(glob)); | 2870 CHECK(sym2->SameValue(glob)); |
2539 CHECK(!sym2->SameValue(glob_api)); | 2871 CHECK(!sym2->SameValue(glob_api)); |
2540 } | 2872 } |
2541 | 2873 |
2542 | 2874 |
2543 static void CheckWellKnownSymbol(v8::Local<v8::Symbol>(*getter)(v8::Isolate*), | 2875 static void CheckWellKnownSymbol(v8::Local<v8::Symbol>(*getter)(v8::Isolate*), |
2544 const char* name) { | 2876 const char* name) { |
2545 LocalContext env; | 2877 LocalContext env; |
2546 v8::Isolate* isolate = env->GetIsolate(); | 2878 v8::Isolate* isolate = env->GetIsolate(); |
2547 v8::HandleScope scope(isolate); | 2879 v8::HandleScope scope(isolate); |
2548 | 2880 |
2549 v8::Local<v8::Symbol> symbol = getter(isolate); | 2881 v8::Local<v8::Symbol> symbol = getter(isolate); |
2550 std::string script = std::string("var sym = ") + name; | 2882 std::string script = std::string("var sym = ") + name; |
2551 CompileRun(script.c_str()); | 2883 CompileRun(script.c_str()); |
2552 v8::Local<Value> value = env->Global()->Get(v8_str("sym")); | 2884 v8::Local<Value> value = |
2885 env->Global()->Get(env.local(), v8_str("sym")).ToLocalChecked(); | |
2553 | 2886 |
2554 CHECK(!value.IsEmpty()); | 2887 CHECK(!value.IsEmpty()); |
2555 CHECK(!symbol.IsEmpty()); | 2888 CHECK(!symbol.IsEmpty()); |
2556 CHECK(value->SameValue(symbol)); | 2889 CHECK(value->SameValue(symbol)); |
2557 } | 2890 } |
2558 | 2891 |
2559 | 2892 |
2560 THREADED_TEST(WellKnownSymbols) { | 2893 THREADED_TEST(WellKnownSymbols) { |
2561 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); | 2894 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); |
2562 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); | 2895 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); |
(...skipping 12 matching lines...) Expand all Loading... | |
2575 CHECK(obj->SetPrivate(env.local(), glob, v8::Integer::New(isolate, 3)) | 2908 CHECK(obj->SetPrivate(env.local(), glob, v8::Integer::New(isolate, 3)) |
2576 .FromJust()); | 2909 .FromJust()); |
2577 | 2910 |
2578 v8::Local<v8::Private> glob2 = v8::Private::ForApi(isolate, name); | 2911 v8::Local<v8::Private> glob2 = v8::Private::ForApi(isolate, name); |
2579 CHECK(obj->HasPrivate(env.local(), glob2).FromJust()); | 2912 CHECK(obj->HasPrivate(env.local(), glob2).FromJust()); |
2580 | 2913 |
2581 v8::Local<v8::Private> priv = v8::Private::New(isolate, name); | 2914 v8::Local<v8::Private> priv = v8::Private::New(isolate, name); |
2582 CHECK(!obj->HasPrivate(env.local(), priv).FromJust()); | 2915 CHECK(!obj->HasPrivate(env.local(), priv).FromJust()); |
2583 | 2916 |
2584 CompileRun("var intern = %CreatePrivateSymbol('my-private')"); | 2917 CompileRun("var intern = %CreatePrivateSymbol('my-private')"); |
2585 v8::Local<Value> intern = env->Global()->Get(v8_str("intern")); | 2918 v8::Local<Value> intern = |
2586 CHECK(!obj->Has(intern)); | 2919 env->Global()->Get(env.local(), v8_str("intern")).ToLocalChecked(); |
2920 CHECK(!obj->Has(env.local(), intern).FromJust()); | |
2587 } | 2921 } |
2588 | 2922 |
2589 | 2923 |
2590 class ScopedArrayBufferContents { | 2924 class ScopedArrayBufferContents { |
2591 public: | 2925 public: |
2592 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents) | 2926 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents) |
2593 : contents_(contents) {} | 2927 : contents_(contents) {} |
2594 ~ScopedArrayBufferContents() { free(contents_.Data()); } | 2928 ~ScopedArrayBufferContents() { free(contents_.Data()); } |
2595 void* Data() const { return contents_.Data(); } | 2929 void* Data() const { return contents_.Data(); } |
2596 size_t ByteLength() const { return contents_.ByteLength(); } | 2930 size_t ByteLength() const { return contents_.ByteLength(); } |
2597 | 2931 |
2598 private: | 2932 private: |
2599 const v8::ArrayBuffer::Contents contents_; | 2933 const v8::ArrayBuffer::Contents contents_; |
2600 }; | 2934 }; |
2601 | 2935 |
2602 template <typename T> | 2936 template <typename T> |
2603 static void CheckInternalFieldsAreZero(v8::Handle<T> value) { | 2937 static void CheckInternalFieldsAreZero(v8::Local<T> value) { |
2604 CHECK_EQ(T::kInternalFieldCount, value->InternalFieldCount()); | 2938 CHECK_EQ(T::kInternalFieldCount, value->InternalFieldCount()); |
2605 for (int i = 0; i < value->InternalFieldCount(); i++) { | 2939 for (int i = 0; i < value->InternalFieldCount(); i++) { |
2606 CHECK_EQ(0, value->GetInternalField(i)->Int32Value()); | 2940 CHECK_EQ(0, value->GetInternalField(i) |
2941 ->Int32Value(CcTest::isolate()->GetCurrentContext()) | |
2942 .FromJust()); | |
2607 } | 2943 } |
2608 } | 2944 } |
2609 | 2945 |
2610 | 2946 |
2611 THREADED_TEST(ArrayBuffer_ApiInternalToExternal) { | 2947 THREADED_TEST(ArrayBuffer_ApiInternalToExternal) { |
2612 LocalContext env; | 2948 LocalContext env; |
2613 v8::Isolate* isolate = env->GetIsolate(); | 2949 v8::Isolate* isolate = env->GetIsolate(); |
2614 v8::HandleScope handle_scope(isolate); | 2950 v8::HandleScope handle_scope(isolate); |
2615 | 2951 |
2616 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 1024); | 2952 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 1024); |
2617 CheckInternalFieldsAreZero(ab); | 2953 CheckInternalFieldsAreZero(ab); |
2618 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); | 2954 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
2619 CHECK(!ab->IsExternal()); | 2955 CHECK(!ab->IsExternal()); |
2620 CcTest::heap()->CollectAllGarbage(); | 2956 CcTest::heap()->CollectAllGarbage(); |
2621 | 2957 |
2622 ScopedArrayBufferContents ab_contents(ab->Externalize()); | 2958 ScopedArrayBufferContents ab_contents(ab->Externalize()); |
2623 CHECK(ab->IsExternal()); | 2959 CHECK(ab->IsExternal()); |
2624 | 2960 |
2625 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); | 2961 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); |
2626 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); | 2962 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); |
2627 DCHECK(data != NULL); | 2963 DCHECK(data != NULL); |
2628 env->Global()->Set(v8_str("ab"), ab); | 2964 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); |
2629 | 2965 |
2630 v8::Handle<v8::Value> result = CompileRun("ab.byteLength"); | 2966 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); |
2631 CHECK_EQ(1024, result->Int32Value()); | 2967 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
2632 | 2968 |
2633 result = CompileRun( | 2969 result = CompileRun( |
2634 "var u8 = new Uint8Array(ab);" | 2970 "var u8 = new Uint8Array(ab);" |
2635 "u8[0] = 0xFF;" | 2971 "u8[0] = 0xFF;" |
2636 "u8[1] = 0xAA;" | 2972 "u8[1] = 0xAA;" |
2637 "u8.length"); | 2973 "u8.length"); |
2638 CHECK_EQ(1024, result->Int32Value()); | 2974 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
2639 CHECK_EQ(0xFF, data[0]); | 2975 CHECK_EQ(0xFF, data[0]); |
2640 CHECK_EQ(0xAA, data[1]); | 2976 CHECK_EQ(0xAA, data[1]); |
2641 data[0] = 0xCC; | 2977 data[0] = 0xCC; |
2642 data[1] = 0x11; | 2978 data[1] = 0x11; |
2643 result = CompileRun("u8[0] + u8[1]"); | 2979 result = CompileRun("u8[0] + u8[1]"); |
2644 CHECK_EQ(0xDD, result->Int32Value()); | 2980 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
2645 } | 2981 } |
2646 | 2982 |
2647 | 2983 |
2648 THREADED_TEST(ArrayBuffer_JSInternalToExternal) { | 2984 THREADED_TEST(ArrayBuffer_JSInternalToExternal) { |
2649 LocalContext env; | 2985 LocalContext env; |
2650 v8::Isolate* isolate = env->GetIsolate(); | 2986 v8::Isolate* isolate = env->GetIsolate(); |
2651 v8::HandleScope handle_scope(isolate); | 2987 v8::HandleScope handle_scope(isolate); |
2652 | 2988 |
2653 | 2989 |
2654 v8::Local<v8::Value> result = CompileRun( | 2990 v8::Local<v8::Value> result = CompileRun( |
2655 "var ab1 = new ArrayBuffer(2);" | 2991 "var ab1 = new ArrayBuffer(2);" |
2656 "var u8_a = new Uint8Array(ab1);" | 2992 "var u8_a = new Uint8Array(ab1);" |
2657 "u8_a[0] = 0xAA;" | 2993 "u8_a[0] = 0xAA;" |
2658 "u8_a[1] = 0xFF; u8_a.buffer"); | 2994 "u8_a[1] = 0xFF; u8_a.buffer"); |
2659 Local<v8::ArrayBuffer> ab1 = Local<v8::ArrayBuffer>::Cast(result); | 2995 Local<v8::ArrayBuffer> ab1 = Local<v8::ArrayBuffer>::Cast(result); |
2660 CheckInternalFieldsAreZero(ab1); | 2996 CheckInternalFieldsAreZero(ab1); |
2661 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); | 2997 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); |
2662 CHECK(!ab1->IsExternal()); | 2998 CHECK(!ab1->IsExternal()); |
2663 ScopedArrayBufferContents ab1_contents(ab1->Externalize()); | 2999 ScopedArrayBufferContents ab1_contents(ab1->Externalize()); |
2664 CHECK(ab1->IsExternal()); | 3000 CHECK(ab1->IsExternal()); |
2665 | 3001 |
2666 result = CompileRun("ab1.byteLength"); | 3002 result = CompileRun("ab1.byteLength"); |
2667 CHECK_EQ(2, result->Int32Value()); | 3003 CHECK_EQ(2, result->Int32Value(env.local()).FromJust()); |
2668 result = CompileRun("u8_a[0]"); | 3004 result = CompileRun("u8_a[0]"); |
2669 CHECK_EQ(0xAA, result->Int32Value()); | 3005 CHECK_EQ(0xAA, result->Int32Value(env.local()).FromJust()); |
2670 result = CompileRun("u8_a[1]"); | 3006 result = CompileRun("u8_a[1]"); |
2671 CHECK_EQ(0xFF, result->Int32Value()); | 3007 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust()); |
2672 result = CompileRun( | 3008 result = CompileRun( |
2673 "var u8_b = new Uint8Array(ab1);" | 3009 "var u8_b = new Uint8Array(ab1);" |
2674 "u8_b[0] = 0xBB;" | 3010 "u8_b[0] = 0xBB;" |
2675 "u8_a[0]"); | 3011 "u8_a[0]"); |
2676 CHECK_EQ(0xBB, result->Int32Value()); | 3012 CHECK_EQ(0xBB, result->Int32Value(env.local()).FromJust()); |
2677 result = CompileRun("u8_b[1]"); | 3013 result = CompileRun("u8_b[1]"); |
2678 CHECK_EQ(0xFF, result->Int32Value()); | 3014 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust()); |
2679 | 3015 |
2680 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); | 3016 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); |
2681 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); | 3017 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); |
2682 CHECK_EQ(0xBB, ab1_data[0]); | 3018 CHECK_EQ(0xBB, ab1_data[0]); |
2683 CHECK_EQ(0xFF, ab1_data[1]); | 3019 CHECK_EQ(0xFF, ab1_data[1]); |
2684 ab1_data[0] = 0xCC; | 3020 ab1_data[0] = 0xCC; |
2685 ab1_data[1] = 0x11; | 3021 ab1_data[1] = 0x11; |
2686 result = CompileRun("u8_a[0] + u8_a[1]"); | 3022 result = CompileRun("u8_a[0] + u8_a[1]"); |
2687 CHECK_EQ(0xDD, result->Int32Value()); | 3023 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
2688 } | 3024 } |
2689 | 3025 |
2690 | 3026 |
2691 THREADED_TEST(ArrayBuffer_External) { | 3027 THREADED_TEST(ArrayBuffer_External) { |
2692 LocalContext env; | 3028 LocalContext env; |
2693 v8::Isolate* isolate = env->GetIsolate(); | 3029 v8::Isolate* isolate = env->GetIsolate(); |
2694 v8::HandleScope handle_scope(isolate); | 3030 v8::HandleScope handle_scope(isolate); |
2695 | 3031 |
2696 i::ScopedVector<uint8_t> my_data(100); | 3032 i::ScopedVector<uint8_t> my_data(100); |
2697 memset(my_data.start(), 0, 100); | 3033 memset(my_data.start(), 0, 100); |
2698 Local<v8::ArrayBuffer> ab3 = | 3034 Local<v8::ArrayBuffer> ab3 = |
2699 v8::ArrayBuffer::New(isolate, my_data.start(), 100); | 3035 v8::ArrayBuffer::New(isolate, my_data.start(), 100); |
2700 CheckInternalFieldsAreZero(ab3); | 3036 CheckInternalFieldsAreZero(ab3); |
2701 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); | 3037 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); |
2702 CHECK(ab3->IsExternal()); | 3038 CHECK(ab3->IsExternal()); |
2703 | 3039 |
2704 env->Global()->Set(v8_str("ab3"), ab3); | 3040 CHECK(env->Global()->Set(env.local(), v8_str("ab3"), ab3).FromJust()); |
2705 | 3041 |
2706 v8::Handle<v8::Value> result = CompileRun("ab3.byteLength"); | 3042 v8::Local<v8::Value> result = CompileRun("ab3.byteLength"); |
2707 CHECK_EQ(100, result->Int32Value()); | 3043 CHECK_EQ(100, result->Int32Value(env.local()).FromJust()); |
2708 | 3044 |
2709 result = CompileRun( | 3045 result = CompileRun( |
2710 "var u8_b = new Uint8Array(ab3);" | 3046 "var u8_b = new Uint8Array(ab3);" |
2711 "u8_b[0] = 0xBB;" | 3047 "u8_b[0] = 0xBB;" |
2712 "u8_b[1] = 0xCC;" | 3048 "u8_b[1] = 0xCC;" |
2713 "u8_b.length"); | 3049 "u8_b.length"); |
2714 CHECK_EQ(100, result->Int32Value()); | 3050 CHECK_EQ(100, result->Int32Value(env.local()).FromJust()); |
2715 CHECK_EQ(0xBB, my_data[0]); | 3051 CHECK_EQ(0xBB, my_data[0]); |
2716 CHECK_EQ(0xCC, my_data[1]); | 3052 CHECK_EQ(0xCC, my_data[1]); |
2717 my_data[0] = 0xCC; | 3053 my_data[0] = 0xCC; |
2718 my_data[1] = 0x11; | 3054 my_data[1] = 0x11; |
2719 result = CompileRun("u8_b[0] + u8_b[1]"); | 3055 result = CompileRun("u8_b[0] + u8_b[1]"); |
2720 CHECK_EQ(0xDD, result->Int32Value()); | 3056 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
2721 } | 3057 } |
2722 | 3058 |
2723 | 3059 |
2724 THREADED_TEST(ArrayBuffer_DisableNeuter) { | 3060 THREADED_TEST(ArrayBuffer_DisableNeuter) { |
2725 LocalContext env; | 3061 LocalContext env; |
2726 v8::Isolate* isolate = env->GetIsolate(); | 3062 v8::Isolate* isolate = env->GetIsolate(); |
2727 v8::HandleScope handle_scope(isolate); | 3063 v8::HandleScope handle_scope(isolate); |
2728 | 3064 |
2729 i::ScopedVector<uint8_t> my_data(100); | 3065 i::ScopedVector<uint8_t> my_data(100); |
2730 memset(my_data.start(), 0, 100); | 3066 memset(my_data.start(), 0, 100); |
2731 Local<v8::ArrayBuffer> ab = | 3067 Local<v8::ArrayBuffer> ab = |
2732 v8::ArrayBuffer::New(isolate, my_data.start(), 100); | 3068 v8::ArrayBuffer::New(isolate, my_data.start(), 100); |
2733 CHECK(ab->IsNeuterable()); | 3069 CHECK(ab->IsNeuterable()); |
2734 | 3070 |
2735 i::Handle<i::JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab); | 3071 i::Handle<i::JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab); |
2736 buf->set_is_neuterable(false); | 3072 buf->set_is_neuterable(false); |
2737 | 3073 |
2738 CHECK(!ab->IsNeuterable()); | 3074 CHECK(!ab->IsNeuterable()); |
2739 } | 3075 } |
2740 | 3076 |
2741 | 3077 |
2742 static void CheckDataViewIsNeutered(v8::Handle<v8::DataView> dv) { | 3078 static void CheckDataViewIsNeutered(v8::Local<v8::DataView> dv) { |
2743 CHECK_EQ(0, static_cast<int>(dv->ByteLength())); | 3079 CHECK_EQ(0, static_cast<int>(dv->ByteLength())); |
2744 CHECK_EQ(0, static_cast<int>(dv->ByteOffset())); | 3080 CHECK_EQ(0, static_cast<int>(dv->ByteOffset())); |
2745 } | 3081 } |
2746 | 3082 |
2747 | 3083 |
2748 static void CheckIsNeutered(v8::Handle<v8::TypedArray> ta) { | 3084 static void CheckIsNeutered(v8::Local<v8::TypedArray> ta) { |
2749 CHECK_EQ(0, static_cast<int>(ta->ByteLength())); | 3085 CHECK_EQ(0, static_cast<int>(ta->ByteLength())); |
2750 CHECK_EQ(0, static_cast<int>(ta->Length())); | 3086 CHECK_EQ(0, static_cast<int>(ta->Length())); |
2751 CHECK_EQ(0, static_cast<int>(ta->ByteOffset())); | 3087 CHECK_EQ(0, static_cast<int>(ta->ByteOffset())); |
2752 } | 3088 } |
2753 | 3089 |
2754 | 3090 |
2755 static void CheckIsTypedArrayVarNeutered(const char* name) { | 3091 static void CheckIsTypedArrayVarNeutered(const char* name) { |
2756 i::ScopedVector<char> source(1024); | 3092 i::ScopedVector<char> source(1024); |
2757 i::SNPrintF(source, | 3093 i::SNPrintF(source, |
2758 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0", | 3094 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0", |
2759 name, name, name); | 3095 name, name, name); |
2760 CHECK(CompileRun(source.start())->IsTrue()); | 3096 CHECK(CompileRun(source.start())->IsTrue()); |
2761 v8::Handle<v8::TypedArray> ta = | 3097 v8::Local<v8::TypedArray> ta = |
2762 v8::Handle<v8::TypedArray>::Cast(CompileRun(name)); | 3098 v8::Local<v8::TypedArray>::Cast(CompileRun(name)); |
2763 CheckIsNeutered(ta); | 3099 CheckIsNeutered(ta); |
2764 } | 3100 } |
2765 | 3101 |
2766 | 3102 |
2767 template <typename TypedArray, int kElementSize> | 3103 template <typename TypedArray, int kElementSize> |
2768 static Handle<TypedArray> CreateAndCheck(Handle<v8::ArrayBuffer> ab, | 3104 static Local<TypedArray> CreateAndCheck(Local<v8::ArrayBuffer> ab, |
2769 int byteOffset, int length) { | 3105 int byteOffset, int length) { |
2770 v8::Handle<TypedArray> ta = TypedArray::New(ab, byteOffset, length); | 3106 v8::Local<TypedArray> ta = TypedArray::New(ab, byteOffset, length); |
2771 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta); | 3107 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta); |
2772 CHECK_EQ(byteOffset, static_cast<int>(ta->ByteOffset())); | 3108 CHECK_EQ(byteOffset, static_cast<int>(ta->ByteOffset())); |
2773 CHECK_EQ(length, static_cast<int>(ta->Length())); | 3109 CHECK_EQ(length, static_cast<int>(ta->Length())); |
2774 CHECK_EQ(length * kElementSize, static_cast<int>(ta->ByteLength())); | 3110 CHECK_EQ(length * kElementSize, static_cast<int>(ta->ByteLength())); |
2775 return ta; | 3111 return ta; |
2776 } | 3112 } |
2777 | 3113 |
2778 | 3114 |
2779 THREADED_TEST(ArrayBuffer_NeuteringApi) { | 3115 THREADED_TEST(ArrayBuffer_NeuteringApi) { |
2780 LocalContext env; | 3116 LocalContext env; |
2781 v8::Isolate* isolate = env->GetIsolate(); | 3117 v8::Isolate* isolate = env->GetIsolate(); |
2782 v8::HandleScope handle_scope(isolate); | 3118 v8::HandleScope handle_scope(isolate); |
2783 | 3119 |
2784 v8::Handle<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(isolate, 1024); | 3120 v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(isolate, 1024); |
2785 | 3121 |
2786 v8::Handle<v8::Uint8Array> u8a = | 3122 v8::Local<v8::Uint8Array> u8a = |
2787 CreateAndCheck<v8::Uint8Array, 1>(buffer, 1, 1023); | 3123 CreateAndCheck<v8::Uint8Array, 1>(buffer, 1, 1023); |
2788 v8::Handle<v8::Uint8ClampedArray> u8c = | 3124 v8::Local<v8::Uint8ClampedArray> u8c = |
2789 CreateAndCheck<v8::Uint8ClampedArray, 1>(buffer, 1, 1023); | 3125 CreateAndCheck<v8::Uint8ClampedArray, 1>(buffer, 1, 1023); |
2790 v8::Handle<v8::Int8Array> i8a = | 3126 v8::Local<v8::Int8Array> i8a = |
2791 CreateAndCheck<v8::Int8Array, 1>(buffer, 1, 1023); | 3127 CreateAndCheck<v8::Int8Array, 1>(buffer, 1, 1023); |
2792 | 3128 |
2793 v8::Handle<v8::Uint16Array> u16a = | 3129 v8::Local<v8::Uint16Array> u16a = |
2794 CreateAndCheck<v8::Uint16Array, 2>(buffer, 2, 511); | 3130 CreateAndCheck<v8::Uint16Array, 2>(buffer, 2, 511); |
2795 v8::Handle<v8::Int16Array> i16a = | 3131 v8::Local<v8::Int16Array> i16a = |
2796 CreateAndCheck<v8::Int16Array, 2>(buffer, 2, 511); | 3132 CreateAndCheck<v8::Int16Array, 2>(buffer, 2, 511); |
2797 | 3133 |
2798 v8::Handle<v8::Uint32Array> u32a = | 3134 v8::Local<v8::Uint32Array> u32a = |
2799 CreateAndCheck<v8::Uint32Array, 4>(buffer, 4, 255); | 3135 CreateAndCheck<v8::Uint32Array, 4>(buffer, 4, 255); |
2800 v8::Handle<v8::Int32Array> i32a = | 3136 v8::Local<v8::Int32Array> i32a = |
2801 CreateAndCheck<v8::Int32Array, 4>(buffer, 4, 255); | 3137 CreateAndCheck<v8::Int32Array, 4>(buffer, 4, 255); |
2802 | 3138 |
2803 v8::Handle<v8::Float32Array> f32a = | 3139 v8::Local<v8::Float32Array> f32a = |
2804 CreateAndCheck<v8::Float32Array, 4>(buffer, 4, 255); | 3140 CreateAndCheck<v8::Float32Array, 4>(buffer, 4, 255); |
2805 v8::Handle<v8::Float64Array> f64a = | 3141 v8::Local<v8::Float64Array> f64a = |
2806 CreateAndCheck<v8::Float64Array, 8>(buffer, 8, 127); | 3142 CreateAndCheck<v8::Float64Array, 8>(buffer, 8, 127); |
2807 | 3143 |
2808 v8::Handle<v8::DataView> dv = v8::DataView::New(buffer, 1, 1023); | 3144 v8::Local<v8::DataView> dv = v8::DataView::New(buffer, 1, 1023); |
2809 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); | 3145 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); |
2810 CHECK_EQ(1, static_cast<int>(dv->ByteOffset())); | 3146 CHECK_EQ(1, static_cast<int>(dv->ByteOffset())); |
2811 CHECK_EQ(1023, static_cast<int>(dv->ByteLength())); | 3147 CHECK_EQ(1023, static_cast<int>(dv->ByteLength())); |
2812 | 3148 |
2813 ScopedArrayBufferContents contents(buffer->Externalize()); | 3149 ScopedArrayBufferContents contents(buffer->Externalize()); |
2814 buffer->Neuter(); | 3150 buffer->Neuter(); |
2815 CHECK_EQ(0, static_cast<int>(buffer->ByteLength())); | 3151 CHECK_EQ(0, static_cast<int>(buffer->ByteLength())); |
2816 CheckIsNeutered(u8a); | 3152 CheckIsNeutered(u8a); |
2817 CheckIsNeutered(u8c); | 3153 CheckIsNeutered(u8c); |
2818 CheckIsNeutered(i8a); | 3154 CheckIsNeutered(i8a); |
(...skipping 18 matching lines...) Expand all Loading... | |
2837 "var u8c = new Uint8ClampedArray(ab, 1, 1023);" | 3173 "var u8c = new Uint8ClampedArray(ab, 1, 1023);" |
2838 "var i8a = new Int8Array(ab, 1, 1023);" | 3174 "var i8a = new Int8Array(ab, 1, 1023);" |
2839 "var u16a = new Uint16Array(ab, 2, 511);" | 3175 "var u16a = new Uint16Array(ab, 2, 511);" |
2840 "var i16a = new Int16Array(ab, 2, 511);" | 3176 "var i16a = new Int16Array(ab, 2, 511);" |
2841 "var u32a = new Uint32Array(ab, 4, 255);" | 3177 "var u32a = new Uint32Array(ab, 4, 255);" |
2842 "var i32a = new Int32Array(ab, 4, 255);" | 3178 "var i32a = new Int32Array(ab, 4, 255);" |
2843 "var f32a = new Float32Array(ab, 4, 255);" | 3179 "var f32a = new Float32Array(ab, 4, 255);" |
2844 "var f64a = new Float64Array(ab, 8, 127);" | 3180 "var f64a = new Float64Array(ab, 8, 127);" |
2845 "var dv = new DataView(ab, 1, 1023);"); | 3181 "var dv = new DataView(ab, 1, 1023);"); |
2846 | 3182 |
2847 v8::Handle<v8::ArrayBuffer> ab = | 3183 v8::Local<v8::ArrayBuffer> ab = |
2848 Local<v8::ArrayBuffer>::Cast(CompileRun("ab")); | 3184 Local<v8::ArrayBuffer>::Cast(CompileRun("ab")); |
2849 | 3185 |
2850 v8::Handle<v8::DataView> dv = | 3186 v8::Local<v8::DataView> dv = v8::Local<v8::DataView>::Cast(CompileRun("dv")); |
2851 v8::Handle<v8::DataView>::Cast(CompileRun("dv")); | |
2852 | 3187 |
2853 ScopedArrayBufferContents contents(ab->Externalize()); | 3188 ScopedArrayBufferContents contents(ab->Externalize()); |
2854 ab->Neuter(); | 3189 ab->Neuter(); |
2855 CHECK_EQ(0, static_cast<int>(ab->ByteLength())); | 3190 CHECK_EQ(0, static_cast<int>(ab->ByteLength())); |
2856 CHECK_EQ(0, CompileRun("ab.byteLength")->Int32Value()); | 3191 CHECK_EQ(0, v8_run_int32value(v8_compile("ab.byteLength"))); |
2857 | 3192 |
2858 CheckIsTypedArrayVarNeutered("u8a"); | 3193 CheckIsTypedArrayVarNeutered("u8a"); |
2859 CheckIsTypedArrayVarNeutered("u8c"); | 3194 CheckIsTypedArrayVarNeutered("u8c"); |
2860 CheckIsTypedArrayVarNeutered("i8a"); | 3195 CheckIsTypedArrayVarNeutered("i8a"); |
2861 CheckIsTypedArrayVarNeutered("u16a"); | 3196 CheckIsTypedArrayVarNeutered("u16a"); |
2862 CheckIsTypedArrayVarNeutered("i16a"); | 3197 CheckIsTypedArrayVarNeutered("i16a"); |
2863 CheckIsTypedArrayVarNeutered("u32a"); | 3198 CheckIsTypedArrayVarNeutered("u32a"); |
2864 CheckIsTypedArrayVarNeutered("i32a"); | 3199 CheckIsTypedArrayVarNeutered("i32a"); |
2865 CheckIsTypedArrayVarNeutered("f32a"); | 3200 CheckIsTypedArrayVarNeutered("f32a"); |
2866 CheckIsTypedArrayVarNeutered("f64a"); | 3201 CheckIsTypedArrayVarNeutered("f64a"); |
(...skipping 28 matching lines...) Expand all Loading... | |
2895 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); | 3230 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); |
2896 CHECK(!ab->IsExternal()); | 3231 CHECK(!ab->IsExternal()); |
2897 CcTest::heap()->CollectAllGarbage(); | 3232 CcTest::heap()->CollectAllGarbage(); |
2898 | 3233 |
2899 ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); | 3234 ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); |
2900 CHECK(ab->IsExternal()); | 3235 CHECK(ab->IsExternal()); |
2901 | 3236 |
2902 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); | 3237 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); |
2903 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); | 3238 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); |
2904 DCHECK(data != NULL); | 3239 DCHECK(data != NULL); |
2905 env->Global()->Set(v8_str("ab"), ab); | 3240 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust()); |
2906 | 3241 |
2907 v8::Handle<v8::Value> result = CompileRun("ab.byteLength"); | 3242 v8::Local<v8::Value> result = CompileRun("ab.byteLength"); |
2908 CHECK_EQ(1024, result->Int32Value()); | 3243 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
2909 | 3244 |
2910 result = CompileRun( | 3245 result = CompileRun( |
2911 "var u8 = new Uint8Array(ab);" | 3246 "var u8 = new Uint8Array(ab);" |
2912 "u8[0] = 0xFF;" | 3247 "u8[0] = 0xFF;" |
2913 "u8[1] = 0xAA;" | 3248 "u8[1] = 0xAA;" |
2914 "u8.length"); | 3249 "u8.length"); |
2915 CHECK_EQ(1024, result->Int32Value()); | 3250 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust()); |
2916 CHECK_EQ(0xFF, data[0]); | 3251 CHECK_EQ(0xFF, data[0]); |
2917 CHECK_EQ(0xAA, data[1]); | 3252 CHECK_EQ(0xAA, data[1]); |
2918 data[0] = 0xCC; | 3253 data[0] = 0xCC; |
2919 data[1] = 0x11; | 3254 data[1] = 0x11; |
2920 result = CompileRun("u8[0] + u8[1]"); | 3255 result = CompileRun("u8[0] + u8[1]"); |
2921 CHECK_EQ(0xDD, result->Int32Value()); | 3256 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
2922 } | 3257 } |
2923 | 3258 |
2924 | 3259 |
2925 THREADED_TEST(SharedArrayBuffer_JSInternalToExternal) { | 3260 THREADED_TEST(SharedArrayBuffer_JSInternalToExternal) { |
2926 i::FLAG_harmony_sharedarraybuffer = true; | 3261 i::FLAG_harmony_sharedarraybuffer = true; |
2927 LocalContext env; | 3262 LocalContext env; |
2928 v8::Isolate* isolate = env->GetIsolate(); | 3263 v8::Isolate* isolate = env->GetIsolate(); |
2929 v8::HandleScope handle_scope(isolate); | 3264 v8::HandleScope handle_scope(isolate); |
2930 | 3265 |
2931 | 3266 |
2932 v8::Local<v8::Value> result = CompileRun( | 3267 v8::Local<v8::Value> result = CompileRun( |
2933 "var ab1 = new SharedArrayBuffer(2);" | 3268 "var ab1 = new SharedArrayBuffer(2);" |
2934 "var u8_a = new Uint8Array(ab1);" | 3269 "var u8_a = new Uint8Array(ab1);" |
2935 "u8_a[0] = 0xAA;" | 3270 "u8_a[0] = 0xAA;" |
2936 "u8_a[1] = 0xFF; u8_a.buffer"); | 3271 "u8_a[1] = 0xFF; u8_a.buffer"); |
2937 Local<v8::SharedArrayBuffer> ab1 = Local<v8::SharedArrayBuffer>::Cast(result); | 3272 Local<v8::SharedArrayBuffer> ab1 = Local<v8::SharedArrayBuffer>::Cast(result); |
2938 CheckInternalFieldsAreZero(ab1); | 3273 CheckInternalFieldsAreZero(ab1); |
2939 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); | 3274 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); |
2940 CHECK(!ab1->IsExternal()); | 3275 CHECK(!ab1->IsExternal()); |
2941 ScopedSharedArrayBufferContents ab1_contents(ab1->Externalize()); | 3276 ScopedSharedArrayBufferContents ab1_contents(ab1->Externalize()); |
2942 CHECK(ab1->IsExternal()); | 3277 CHECK(ab1->IsExternal()); |
2943 | 3278 |
2944 result = CompileRun("ab1.byteLength"); | 3279 result = CompileRun("ab1.byteLength"); |
2945 CHECK_EQ(2, result->Int32Value()); | 3280 CHECK_EQ(2, result->Int32Value(env.local()).FromJust()); |
2946 result = CompileRun("u8_a[0]"); | 3281 result = CompileRun("u8_a[0]"); |
2947 CHECK_EQ(0xAA, result->Int32Value()); | 3282 CHECK_EQ(0xAA, result->Int32Value(env.local()).FromJust()); |
2948 result = CompileRun("u8_a[1]"); | 3283 result = CompileRun("u8_a[1]"); |
2949 CHECK_EQ(0xFF, result->Int32Value()); | 3284 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust()); |
2950 result = CompileRun( | 3285 result = CompileRun( |
2951 "var u8_b = new Uint8Array(ab1);" | 3286 "var u8_b = new Uint8Array(ab1);" |
2952 "u8_b[0] = 0xBB;" | 3287 "u8_b[0] = 0xBB;" |
2953 "u8_a[0]"); | 3288 "u8_a[0]"); |
2954 CHECK_EQ(0xBB, result->Int32Value()); | 3289 CHECK_EQ(0xBB, result->Int32Value(env.local()).FromJust()); |
2955 result = CompileRun("u8_b[1]"); | 3290 result = CompileRun("u8_b[1]"); |
2956 CHECK_EQ(0xFF, result->Int32Value()); | 3291 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust()); |
2957 | 3292 |
2958 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); | 3293 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); |
2959 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); | 3294 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); |
2960 CHECK_EQ(0xBB, ab1_data[0]); | 3295 CHECK_EQ(0xBB, ab1_data[0]); |
2961 CHECK_EQ(0xFF, ab1_data[1]); | 3296 CHECK_EQ(0xFF, ab1_data[1]); |
2962 ab1_data[0] = 0xCC; | 3297 ab1_data[0] = 0xCC; |
2963 ab1_data[1] = 0x11; | 3298 ab1_data[1] = 0x11; |
2964 result = CompileRun("u8_a[0] + u8_a[1]"); | 3299 result = CompileRun("u8_a[0] + u8_a[1]"); |
2965 CHECK_EQ(0xDD, result->Int32Value()); | 3300 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
2966 } | 3301 } |
2967 | 3302 |
2968 | 3303 |
2969 THREADED_TEST(SharedArrayBuffer_External) { | 3304 THREADED_TEST(SharedArrayBuffer_External) { |
2970 i::FLAG_harmony_sharedarraybuffer = true; | 3305 i::FLAG_harmony_sharedarraybuffer = true; |
2971 LocalContext env; | 3306 LocalContext env; |
2972 v8::Isolate* isolate = env->GetIsolate(); | 3307 v8::Isolate* isolate = env->GetIsolate(); |
2973 v8::HandleScope handle_scope(isolate); | 3308 v8::HandleScope handle_scope(isolate); |
2974 | 3309 |
2975 i::ScopedVector<uint8_t> my_data(100); | 3310 i::ScopedVector<uint8_t> my_data(100); |
2976 memset(my_data.start(), 0, 100); | 3311 memset(my_data.start(), 0, 100); |
2977 Local<v8::SharedArrayBuffer> ab3 = | 3312 Local<v8::SharedArrayBuffer> ab3 = |
2978 v8::SharedArrayBuffer::New(isolate, my_data.start(), 100); | 3313 v8::SharedArrayBuffer::New(isolate, my_data.start(), 100); |
2979 CheckInternalFieldsAreZero(ab3); | 3314 CheckInternalFieldsAreZero(ab3); |
2980 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); | 3315 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); |
2981 CHECK(ab3->IsExternal()); | 3316 CHECK(ab3->IsExternal()); |
2982 | 3317 |
2983 env->Global()->Set(v8_str("ab3"), ab3); | 3318 CHECK(env->Global()->Set(env.local(), v8_str("ab3"), ab3).FromJust()); |
2984 | 3319 |
2985 v8::Handle<v8::Value> result = CompileRun("ab3.byteLength"); | 3320 v8::Local<v8::Value> result = CompileRun("ab3.byteLength"); |
2986 CHECK_EQ(100, result->Int32Value()); | 3321 CHECK_EQ(100, result->Int32Value(env.local()).FromJust()); |
2987 | 3322 |
2988 result = CompileRun( | 3323 result = CompileRun( |
2989 "var u8_b = new Uint8Array(ab3);" | 3324 "var u8_b = new Uint8Array(ab3);" |
2990 "u8_b[0] = 0xBB;" | 3325 "u8_b[0] = 0xBB;" |
2991 "u8_b[1] = 0xCC;" | 3326 "u8_b[1] = 0xCC;" |
2992 "u8_b.length"); | 3327 "u8_b.length"); |
2993 CHECK_EQ(100, result->Int32Value()); | 3328 CHECK_EQ(100, result->Int32Value(env.local()).FromJust()); |
2994 CHECK_EQ(0xBB, my_data[0]); | 3329 CHECK_EQ(0xBB, my_data[0]); |
2995 CHECK_EQ(0xCC, my_data[1]); | 3330 CHECK_EQ(0xCC, my_data[1]); |
2996 my_data[0] = 0xCC; | 3331 my_data[0] = 0xCC; |
2997 my_data[1] = 0x11; | 3332 my_data[1] = 0x11; |
2998 result = CompileRun("u8_b[0] + u8_b[1]"); | 3333 result = CompileRun("u8_b[0] + u8_b[1]"); |
2999 CHECK_EQ(0xDD, result->Int32Value()); | 3334 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust()); |
3000 } | 3335 } |
3001 | 3336 |
3002 | 3337 |
3003 THREADED_TEST(HiddenProperties) { | 3338 THREADED_TEST(HiddenProperties) { |
3004 LocalContext env; | 3339 LocalContext env; |
3005 v8::Isolate* isolate = env->GetIsolate(); | 3340 v8::Isolate* isolate = env->GetIsolate(); |
3006 v8::HandleScope scope(isolate); | 3341 v8::HandleScope scope(isolate); |
3007 | 3342 |
3008 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); | 3343 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); |
3009 v8::Local<v8::Private> key = | 3344 v8::Local<v8::Private> key = |
3010 v8::Private::ForApi(isolate, v8_str("api-test::hidden-key")); | 3345 v8::Private::ForApi(isolate, v8_str("api-test::hidden-key")); |
3011 v8::Local<v8::String> empty = v8_str(""); | 3346 v8::Local<v8::String> empty = v8_str(""); |
3012 v8::Local<v8::String> prop_name = v8_str("prop_name"); | 3347 v8::Local<v8::String> prop_name = v8_str("prop_name"); |
3013 | 3348 |
3014 CcTest::heap()->CollectAllGarbage(); | 3349 CcTest::heap()->CollectAllGarbage(); |
3015 | 3350 |
3016 // Make sure delete of a non-existent hidden value works | 3351 // Make sure delete of a non-existent hidden value works |
3017 obj->DeletePrivate(env.local(), key).FromJust(); | 3352 obj->DeletePrivate(env.local(), key).FromJust(); |
3018 | 3353 |
3019 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 1503)) | 3354 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 1503)) |
3020 .FromJust()); | 3355 .FromJust()); |
3021 CHECK_EQ(1503, | 3356 CHECK_EQ(1503, obj->GetPrivate(env.local(), key) |
3022 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3357 .ToLocalChecked() |
3358 ->Int32Value(env.local()) | |
3359 .FromJust()); | |
3023 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) | 3360 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) |
3024 .FromJust()); | 3361 .FromJust()); |
3025 CHECK_EQ(2002, | 3362 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) |
3026 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3363 .ToLocalChecked() |
3364 ->Int32Value(env.local()) | |
3365 .FromJust()); | |
3027 | 3366 |
3028 CcTest::heap()->CollectAllGarbage(); | 3367 CcTest::heap()->CollectAllGarbage(); |
3029 | 3368 |
3030 // Make sure we do not find the hidden property. | 3369 // Make sure we do not find the hidden property. |
3031 CHECK(!obj->Has(empty)); | 3370 CHECK(!obj->Has(env.local(), empty).FromJust()); |
3032 CHECK_EQ(2002, | 3371 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) |
3033 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3372 .ToLocalChecked() |
3034 CHECK(obj->Get(empty)->IsUndefined()); | 3373 ->Int32Value(env.local()) |
3035 CHECK_EQ(2002, | 3374 .FromJust()); |
3036 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3375 CHECK(obj->Get(env.local(), empty).ToLocalChecked()->IsUndefined()); |
3037 CHECK(obj->Set(empty, v8::Integer::New(isolate, 2003))); | 3376 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) |
3038 CHECK_EQ(2002, | 3377 .ToLocalChecked() |
3039 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3378 ->Int32Value(env.local()) |
3040 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); | 3379 .FromJust()); |
3380 CHECK( | |
3381 obj->Set(env.local(), empty, v8::Integer::New(isolate, 2003)).FromJust()); | |
3382 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) | |
3383 .ToLocalChecked() | |
3384 ->Int32Value(env.local()) | |
3385 .FromJust()); | |
3386 CHECK_EQ(2003, obj->Get(env.local(), empty) | |
3387 .ToLocalChecked() | |
3388 ->Int32Value(env.local()) | |
3389 .FromJust()); | |
3041 | 3390 |
3042 CcTest::heap()->CollectAllGarbage(); | 3391 CcTest::heap()->CollectAllGarbage(); |
3043 | 3392 |
3044 // Add another property and delete it afterwards to force the object in | 3393 // Add another property and delete it afterwards to force the object in |
3045 // slow case. | 3394 // slow case. |
3046 CHECK(obj->Set(prop_name, v8::Integer::New(isolate, 2008))); | 3395 CHECK(obj->Set(env.local(), prop_name, v8::Integer::New(isolate, 2008)) |
3047 CHECK_EQ(2002, | 3396 .FromJust()); |
3048 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3397 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) |
3049 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); | 3398 .ToLocalChecked() |
3050 CHECK_EQ(2002, | 3399 ->Int32Value(env.local()) |
3051 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3400 .FromJust()); |
3052 CHECK(obj->Delete(prop_name)); | 3401 CHECK_EQ(2008, obj->Get(env.local(), prop_name) |
3053 CHECK_EQ(2002, | 3402 .ToLocalChecked() |
3054 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3403 ->Int32Value(env.local()) |
3404 .FromJust()); | |
3405 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) | |
3406 .ToLocalChecked() | |
3407 ->Int32Value(env.local()) | |
3408 .FromJust()); | |
3409 CHECK(obj->Delete(env.local(), prop_name).FromJust()); | |
3410 CHECK_EQ(2002, obj->GetPrivate(env.local(), key) | |
3411 .ToLocalChecked() | |
3412 ->Int32Value(env.local()) | |
3413 .FromJust()); | |
3055 | 3414 |
3056 CcTest::heap()->CollectAllGarbage(); | 3415 CcTest::heap()->CollectAllGarbage(); |
3057 | 3416 |
3058 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) | 3417 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) |
3059 .FromJust()); | 3418 .FromJust()); |
3060 CHECK(obj->DeletePrivate(env.local(), key).FromJust()); | 3419 CHECK(obj->DeletePrivate(env.local(), key).FromJust()); |
3061 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); | 3420 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); |
3062 } | 3421 } |
3063 | 3422 |
3064 | 3423 |
(...skipping 17 matching lines...) Expand all Loading... | |
3082 " set: function() { set_called = true; }})"); | 3441 " set: function() { set_called = true; }})"); |
3083 | 3442 |
3084 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); | 3443 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); |
3085 // Make sure that the getter and setter from Object.prototype is not invoked. | 3444 // Make sure that the getter and setter from Object.prototype is not invoked. |
3086 // If it did we would have full access to the hidden properties in | 3445 // If it did we would have full access to the hidden properties in |
3087 // the accessor. | 3446 // the accessor. |
3088 CHECK( | 3447 CHECK( |
3089 obj->SetPrivate(env.local(), key, v8::Integer::New(env->GetIsolate(), 42)) | 3448 obj->SetPrivate(env.local(), key, v8::Integer::New(env->GetIsolate(), 42)) |
3090 .FromJust()); | 3449 .FromJust()); |
3091 ExpectFalse("set_called"); | 3450 ExpectFalse("set_called"); |
3092 CHECK_EQ(42, | 3451 CHECK_EQ(42, obj->GetPrivate(env.local(), key) |
3093 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); | 3452 .ToLocalChecked() |
3453 ->Int32Value(env.local()) | |
3454 .FromJust()); | |
3094 } | 3455 } |
3095 | 3456 |
3096 | 3457 |
3097 THREADED_TEST(External) { | 3458 THREADED_TEST(External) { |
3098 v8::HandleScope scope(CcTest::isolate()); | 3459 v8::HandleScope scope(CcTest::isolate()); |
3099 int x = 3; | 3460 int x = 3; |
3100 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); | 3461 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); |
3101 LocalContext env; | 3462 LocalContext env; |
3102 env->Global()->Set(v8_str("ext"), ext); | 3463 CHECK(env->Global()->Set(env.local(), v8_str("ext"), ext).FromJust()); |
3103 Local<Value> reext_obj = CompileRun("this.ext"); | 3464 Local<Value> reext_obj = CompileRun("this.ext"); |
3104 v8::Handle<v8::External> reext = reext_obj.As<v8::External>(); | 3465 v8::Local<v8::External> reext = reext_obj.As<v8::External>(); |
3105 int* ptr = static_cast<int*>(reext->Value()); | 3466 int* ptr = static_cast<int*>(reext->Value()); |
3106 CHECK_EQ(x, 3); | 3467 CHECK_EQ(x, 3); |
3107 *ptr = 10; | 3468 *ptr = 10; |
3108 CHECK_EQ(x, 10); | 3469 CHECK_EQ(x, 10); |
3109 | 3470 |
3110 // Make sure unaligned pointers are wrapped properly. | 3471 // Make sure unaligned pointers are wrapped properly. |
3111 char* data = i::StrDup("0123456789"); | 3472 char* data = i::StrDup("0123456789"); |
3112 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]); | 3473 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]); |
3113 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]); | 3474 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]); |
3114 Local<v8::Value> two = v8::External::New(CcTest::isolate(), &data[2]); | 3475 Local<v8::Value> two = v8::External::New(CcTest::isolate(), &data[2]); |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3390 | 3751 |
3391 namespace { | 3752 namespace { |
3392 | 3753 |
3393 void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); } | 3754 void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); } |
3394 | 3755 |
3395 | 3756 |
3396 Local<v8::Object> NewObjectForIntKey( | 3757 Local<v8::Object> NewObjectForIntKey( |
3397 v8::Isolate* isolate, const v8::Global<v8::ObjectTemplate>& templ, | 3758 v8::Isolate* isolate, const v8::Global<v8::ObjectTemplate>& templ, |
3398 int key) { | 3759 int key) { |
3399 auto local = Local<v8::ObjectTemplate>::New(isolate, templ); | 3760 auto local = Local<v8::ObjectTemplate>::New(isolate, templ); |
3400 auto obj = local->NewInstance(); | 3761 auto obj = local->NewInstance(isolate->GetCurrentContext()).ToLocalChecked(); |
3401 obj->SetAlignedPointerInInternalField(0, IntKeyToVoidPointer(key)); | 3762 obj->SetAlignedPointerInInternalField(0, IntKeyToVoidPointer(key)); |
3402 return obj; | 3763 return obj; |
3403 } | 3764 } |
3404 | 3765 |
3405 | 3766 |
3406 template <typename K, typename V> | 3767 template <typename K, typename V> |
3407 class PhantomStdMapTraits : public v8::StdMapTraits<K, V> { | 3768 class PhantomStdMapTraits : public v8::StdMapTraits<K, V> { |
3408 public: | 3769 public: |
3409 typedef typename v8::GlobalValueMap<K, V, PhantomStdMapTraits<K, V>> MapType; | 3770 typedef typename v8::GlobalValueMap<K, V, PhantomStdMapTraits<K, V>> MapType; |
3410 static const v8::PersistentContainerCallbackType kCallbackType = | 3771 static const v8::PersistentContainerCallbackType kCallbackType = |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3461 int initial_handle_count = global_handles->global_handles_count(); | 3822 int initial_handle_count = global_handles->global_handles_count(); |
3462 CHECK_EQ(0, static_cast<int>(map.Size())); | 3823 CHECK_EQ(0, static_cast<int>(map.Size())); |
3463 { | 3824 { |
3464 HandleScope scope(isolate); | 3825 HandleScope scope(isolate); |
3465 Local<v8::Object> obj = map.Get(7); | 3826 Local<v8::Object> obj = map.Get(7); |
3466 CHECK(obj.IsEmpty()); | 3827 CHECK(obj.IsEmpty()); |
3467 Local<v8::Object> expected = v8::Object::New(isolate); | 3828 Local<v8::Object> expected = v8::Object::New(isolate); |
3468 map.Set(7, expected); | 3829 map.Set(7, expected); |
3469 CHECK_EQ(1, static_cast<int>(map.Size())); | 3830 CHECK_EQ(1, static_cast<int>(map.Size())); |
3470 obj = map.Get(7); | 3831 obj = map.Get(7); |
3471 CHECK(expected->Equals(obj)); | 3832 CHECK(expected->Equals(env.local(), obj).FromJust()); |
3472 { | 3833 { |
3473 typename Map::PersistentValueReference ref = map.GetReference(7); | 3834 typename Map::PersistentValueReference ref = map.GetReference(7); |
3474 CHECK(expected->Equals(ref.NewLocal(isolate))); | 3835 CHECK(expected->Equals(ref.NewLocal(isolate))); |
3475 } | 3836 } |
3476 v8::Global<v8::Object> removed = map.Remove(7); | 3837 v8::Global<v8::Object> removed = map.Remove(7); |
3477 CHECK_EQ(0, static_cast<int>(map.Size())); | 3838 CHECK_EQ(0, static_cast<int>(map.Size())); |
3478 CHECK(expected == removed); | 3839 CHECK(expected == removed); |
3479 removed = map.Remove(7); | 3840 removed = map.Remove(7); |
3480 CHECK(removed.IsEmpty()); | 3841 CHECK(removed.IsEmpty()); |
3481 map.Set(8, expected); | 3842 map.Set(8, expected); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3546 | 3907 |
3547 vector.Append(obj1); | 3908 vector.Append(obj1); |
3548 vector.Append(obj2); | 3909 vector.Append(obj2); |
3549 vector.Append(obj1); | 3910 vector.Append(obj1); |
3550 vector.Append(obj3.Pass()); | 3911 vector.Append(obj3.Pass()); |
3551 vector.Append(obj1); | 3912 vector.Append(obj1); |
3552 | 3913 |
3553 CHECK(!vector.IsEmpty()); | 3914 CHECK(!vector.IsEmpty()); |
3554 CHECK_EQ(5, static_cast<int>(vector.Size())); | 3915 CHECK_EQ(5, static_cast<int>(vector.Size())); |
3555 CHECK(obj3.IsEmpty()); | 3916 CHECK(obj3.IsEmpty()); |
3556 CHECK(obj1->Equals(vector.Get(0))); | 3917 CHECK(obj1->Equals(env.local(), vector.Get(0)).FromJust()); |
3557 CHECK(obj1->Equals(vector.Get(2))); | 3918 CHECK(obj1->Equals(env.local(), vector.Get(2)).FromJust()); |
3558 CHECK(obj1->Equals(vector.Get(4))); | 3919 CHECK(obj1->Equals(env.local(), vector.Get(4)).FromJust()); |
3559 CHECK(obj2->Equals(vector.Get(1))); | 3920 CHECK(obj2->Equals(env.local(), vector.Get(1)).FromJust()); |
3560 | 3921 |
3561 CHECK_EQ(5 + handle_count, global_handles->global_handles_count()); | 3922 CHECK_EQ(5 + handle_count, global_handles->global_handles_count()); |
3562 | 3923 |
3563 vector.Clear(); | 3924 vector.Clear(); |
3564 CHECK(vector.IsEmpty()); | 3925 CHECK(vector.IsEmpty()); |
3565 CHECK_EQ(0, static_cast<int>(vector.Size())); | 3926 CHECK_EQ(0, static_cast<int>(vector.Size())); |
3566 CHECK_EQ(handle_count, global_handles->global_handles_count()); | 3927 CHECK_EQ(handle_count, global_handles->global_handles_count()); |
3567 } | 3928 } |
3568 | 3929 |
3569 | 3930 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3700 v8::WeakCallbackType::kParameter); | 4061 v8::WeakCallbackType::kParameter); |
3701 } | 4062 } |
3702 | 4063 |
3703 WeakCallCounterAndPersistent<Value> root(&counter); | 4064 WeakCallCounterAndPersistent<Value> root(&counter); |
3704 root.handle.Reset(iso, g1s1.handle); // make a root. | 4065 root.handle.Reset(iso, g1s1.handle); // make a root. |
3705 | 4066 |
3706 // Connect group 1 and 2, make a cycle. | 4067 // Connect group 1 and 2, make a cycle. |
3707 { | 4068 { |
3708 HandleScope scope(iso); | 4069 HandleScope scope(iso); |
3709 CHECK(Local<Object>::New(iso, g1s2.handle.As<Object>()) | 4070 CHECK(Local<Object>::New(iso, g1s2.handle.As<Object>()) |
3710 ->Set(0, Local<Value>::New(iso, g2s2.handle))); | 4071 ->Set(env.local(), 0, Local<Value>::New(iso, g2s2.handle)) |
4072 .FromJust()); | |
3711 CHECK(Local<Object>::New(iso, g2s1.handle.As<Object>()) | 4073 CHECK(Local<Object>::New(iso, g2s1.handle.As<Object>()) |
3712 ->Set(0, Local<Value>::New(iso, g1s1.handle))); | 4074 ->Set(env.local(), 0, Local<Value>::New(iso, g1s1.handle)) |
4075 .FromJust()); | |
3713 } | 4076 } |
3714 | 4077 |
3715 { | 4078 { |
3716 UniqueId id1 = MakeUniqueId(g1s1.handle); | 4079 UniqueId id1 = MakeUniqueId(g1s1.handle); |
3717 UniqueId id2 = MakeUniqueId(g2s2.handle); | 4080 UniqueId id2 = MakeUniqueId(g2s2.handle); |
3718 iso->SetObjectGroupId(g1s1.handle, id1); | 4081 iso->SetObjectGroupId(g1s1.handle, id1); |
3719 iso->SetObjectGroupId(g1s2.handle, id1); | 4082 iso->SetObjectGroupId(g1s2.handle, id1); |
3720 iso->SetReferenceFromGroup(id1, g1c1.handle); | 4083 iso->SetReferenceFromGroup(id1, g1c1.handle); |
3721 iso->SetObjectGroupId(g2s1.handle, id2); | 4084 iso->SetObjectGroupId(g2s1.handle, id2); |
3722 iso->SetObjectGroupId(g2s2.handle, id2); | 4085 iso->SetObjectGroupId(g2s2.handle, id2); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3776 WeakCallCounterAndPersistent<Object> g1s1(&counter); | 4139 WeakCallCounterAndPersistent<Object> g1s1(&counter); |
3777 WeakCallCounterAndPersistent<String> g1s2(&counter); | 4140 WeakCallCounterAndPersistent<String> g1s2(&counter); |
3778 WeakCallCounterAndPersistent<String> g1c1(&counter); | 4141 WeakCallCounterAndPersistent<String> g1c1(&counter); |
3779 WeakCallCounterAndPersistent<Object> g2s1(&counter); | 4142 WeakCallCounterAndPersistent<Object> g2s1(&counter); |
3780 WeakCallCounterAndPersistent<String> g2s2(&counter); | 4143 WeakCallCounterAndPersistent<String> g2s2(&counter); |
3781 WeakCallCounterAndPersistent<String> g2c1(&counter); | 4144 WeakCallCounterAndPersistent<String> g2c1(&counter); |
3782 | 4145 |
3783 { | 4146 { |
3784 HandleScope scope(iso); | 4147 HandleScope scope(iso); |
3785 g1s1.handle.Reset(iso, Object::New(iso)); | 4148 g1s1.handle.Reset(iso, Object::New(iso)); |
3786 g1s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo1")); | 4149 g1s2.handle.Reset(iso, v8_str("foo1")); |
3787 g1c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo2")); | 4150 g1c1.handle.Reset(iso, v8_str("foo2")); |
3788 g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback, | 4151 g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback, |
3789 v8::WeakCallbackType::kParameter); | 4152 v8::WeakCallbackType::kParameter); |
3790 g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback, | 4153 g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback, |
3791 v8::WeakCallbackType::kParameter); | 4154 v8::WeakCallbackType::kParameter); |
3792 g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback, | 4155 g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback, |
3793 v8::WeakCallbackType::kParameter); | 4156 v8::WeakCallbackType::kParameter); |
3794 | 4157 |
3795 g2s1.handle.Reset(iso, Object::New(iso)); | 4158 g2s1.handle.Reset(iso, Object::New(iso)); |
3796 g2s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo3")); | 4159 g2s2.handle.Reset(iso, v8_str("foo3")); |
3797 g2c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo4")); | 4160 g2c1.handle.Reset(iso, v8_str("foo4")); |
3798 g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback, | 4161 g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback, |
3799 v8::WeakCallbackType::kParameter); | 4162 v8::WeakCallbackType::kParameter); |
3800 g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback, | 4163 g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback, |
3801 v8::WeakCallbackType::kParameter); | 4164 v8::WeakCallbackType::kParameter); |
3802 g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback, | 4165 g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback, |
3803 v8::WeakCallbackType::kParameter); | 4166 v8::WeakCallbackType::kParameter); |
3804 } | 4167 } |
3805 | 4168 |
3806 WeakCallCounterAndPersistent<Value> root(&counter); | 4169 WeakCallCounterAndPersistent<Value> root(&counter); |
3807 root.handle.Reset(iso, g1s1.handle); // make a root. | 4170 root.handle.Reset(iso, g1s1.handle); // make a root. |
3808 | 4171 |
3809 // Connect group 1 and 2, make a cycle. | 4172 // Connect group 1 and 2, make a cycle. |
3810 { | 4173 { |
3811 HandleScope scope(iso); | 4174 HandleScope scope(iso); |
3812 CHECK(Local<Object>::New(iso, g1s1.handle) | 4175 CHECK(Local<Object>::New(iso, g1s1.handle) |
3813 ->Set(0, Local<Object>::New(iso, g2s1.handle))); | 4176 ->Set(env.local(), 0, Local<Object>::New(iso, g2s1.handle)) |
4177 .FromJust()); | |
3814 CHECK(Local<Object>::New(iso, g2s1.handle) | 4178 CHECK(Local<Object>::New(iso, g2s1.handle) |
3815 ->Set(0, Local<Object>::New(iso, g1s1.handle))); | 4179 ->Set(env.local(), 0, Local<Object>::New(iso, g1s1.handle)) |
4180 .FromJust()); | |
3816 } | 4181 } |
3817 | 4182 |
3818 { | 4183 { |
3819 UniqueId id1 = MakeUniqueId(g1s1.handle); | 4184 UniqueId id1 = MakeUniqueId(g1s1.handle); |
3820 UniqueId id2 = MakeUniqueId(g2s2.handle); | 4185 UniqueId id2 = MakeUniqueId(g2s2.handle); |
3821 iso->SetObjectGroupId(g1s1.handle, id1); | 4186 iso->SetObjectGroupId(g1s1.handle, id1); |
3822 iso->SetObjectGroupId(g1s2.handle, id1); | 4187 iso->SetObjectGroupId(g1s2.handle, id1); |
3823 iso->SetReference(g1s1.handle, g1c1.handle); | 4188 iso->SetReference(g1s1.handle, g1c1.handle); |
3824 iso->SetObjectGroupId(g2s1.handle, id2); | 4189 iso->SetObjectGroupId(g2s1.handle, id2); |
3825 iso->SetObjectGroupId(g2s2.handle, id2); | 4190 iso->SetObjectGroupId(g2s2.handle, id2); |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4041 HandleScope handle_scope(iso); | 4406 HandleScope handle_scope(iso); |
4042 g1s1.handle.MarkPartiallyDependent(); | 4407 g1s1.handle.MarkPartiallyDependent(); |
4043 g1s2.handle.MarkPartiallyDependent(); | 4408 g1s2.handle.MarkPartiallyDependent(); |
4044 g2s1.handle.MarkPartiallyDependent(); | 4409 g2s1.handle.MarkPartiallyDependent(); |
4045 g2s2.handle.MarkPartiallyDependent(); | 4410 g2s2.handle.MarkPartiallyDependent(); |
4046 g3s1.handle.MarkPartiallyDependent(); | 4411 g3s1.handle.MarkPartiallyDependent(); |
4047 g3s2.handle.MarkPartiallyDependent(); | 4412 g3s2.handle.MarkPartiallyDependent(); |
4048 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); | 4413 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); |
4049 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); | 4414 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); |
4050 Local<Object>::New(iso, g1s1.handle.As<Object>()) | 4415 Local<Object>::New(iso, g1s1.handle.As<Object>()) |
4051 ->Set(v8_str("x"), Local<Value>::New(iso, g2s1.handle)); | 4416 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g2s1.handle)) |
4417 .FromJust(); | |
4052 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); | 4418 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); |
4053 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); | 4419 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); |
4054 Local<Object>::New(iso, g2s1.handle.As<Object>()) | 4420 Local<Object>::New(iso, g2s1.handle.As<Object>()) |
4055 ->Set(v8_str("x"), Local<Value>::New(iso, g3s1.handle)); | 4421 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g3s1.handle)) |
4422 .FromJust(); | |
4056 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); | 4423 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); |
4057 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); | 4424 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); |
4058 Local<Object>::New(iso, g3s1.handle.As<Object>()) | 4425 Local<Object>::New(iso, g3s1.handle.As<Object>()) |
4059 ->Set(v8_str("x"), Local<Value>::New(iso, g1s1.handle)); | 4426 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g1s1.handle)) |
4427 .FromJust(); | |
4060 } | 4428 } |
4061 | 4429 |
4062 v8::internal::Heap* heap = | 4430 v8::internal::Heap* heap = |
4063 reinterpret_cast<v8::internal::Isolate*>(iso)->heap(); | 4431 reinterpret_cast<v8::internal::Isolate*>(iso)->heap(); |
4064 heap->CollectAllGarbage(); | 4432 heap->CollectAllGarbage(); |
4065 | 4433 |
4066 // All objects should be alive. | 4434 // All objects should be alive. |
4067 CHECK_EQ(0, counter.NumberOfWeakCalls()); | 4435 CHECK_EQ(0, counter.NumberOfWeakCalls()); |
4068 | 4436 |
4069 // Weaken the root. | 4437 // Weaken the root. |
4070 root.handle.SetWeak(&root, &WeakPointerCallback, | 4438 root.handle.SetWeak(&root, &WeakPointerCallback, |
4071 v8::WeakCallbackType::kParameter); | 4439 v8::WeakCallbackType::kParameter); |
4072 root.handle.MarkPartiallyDependent(); | 4440 root.handle.MarkPartiallyDependent(); |
4073 | 4441 |
4074 // Groups are deleted, rebuild groups. | 4442 // Groups are deleted, rebuild groups. |
4075 { | 4443 { |
4076 HandleScope handle_scope(iso); | 4444 HandleScope handle_scope(iso); |
4077 g1s1.handle.MarkPartiallyDependent(); | 4445 g1s1.handle.MarkPartiallyDependent(); |
4078 g1s2.handle.MarkPartiallyDependent(); | 4446 g1s2.handle.MarkPartiallyDependent(); |
4079 g2s1.handle.MarkPartiallyDependent(); | 4447 g2s1.handle.MarkPartiallyDependent(); |
4080 g2s2.handle.MarkPartiallyDependent(); | 4448 g2s2.handle.MarkPartiallyDependent(); |
4081 g3s1.handle.MarkPartiallyDependent(); | 4449 g3s1.handle.MarkPartiallyDependent(); |
4082 g3s2.handle.MarkPartiallyDependent(); | 4450 g3s2.handle.MarkPartiallyDependent(); |
4083 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); | 4451 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); |
4084 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); | 4452 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); |
4085 Local<Object>::New(iso, g1s1.handle.As<Object>()) | 4453 Local<Object>::New(iso, g1s1.handle.As<Object>()) |
4086 ->Set(v8_str("x"), Local<Value>::New(iso, g2s1.handle)); | 4454 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g2s1.handle)) |
4455 .FromJust(); | |
4087 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); | 4456 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); |
4088 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); | 4457 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); |
4089 Local<Object>::New(iso, g2s1.handle.As<Object>()) | 4458 Local<Object>::New(iso, g2s1.handle.As<Object>()) |
4090 ->Set(v8_str("x"), Local<Value>::New(iso, g3s1.handle)); | 4459 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g3s1.handle)) |
4460 .FromJust(); | |
4091 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); | 4461 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); |
4092 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); | 4462 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); |
4093 Local<Object>::New(iso, g3s1.handle.As<Object>()) | 4463 Local<Object>::New(iso, g3s1.handle.As<Object>()) |
4094 ->Set(v8_str("x"), Local<Value>::New(iso, g1s1.handle)); | 4464 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g1s1.handle)) |
4465 .FromJust(); | |
4095 } | 4466 } |
4096 | 4467 |
4097 heap->CollectAllGarbage(); | 4468 heap->CollectAllGarbage(); |
4098 | 4469 |
4099 // All objects should be gone. 7 global handles in total. | 4470 // All objects should be gone. 7 global handles in total. |
4100 CHECK_EQ(7, counter.NumberOfWeakCalls()); | 4471 CHECK_EQ(7, counter.NumberOfWeakCalls()); |
4101 } | 4472 } |
4102 | 4473 |
4103 | 4474 |
4104 THREADED_TEST(ScriptException) { | 4475 THREADED_TEST(ScriptException) { |
4105 LocalContext env; | 4476 LocalContext env; |
4106 v8::HandleScope scope(env->GetIsolate()); | 4477 v8::HandleScope scope(env->GetIsolate()); |
4107 Local<Script> script = v8_compile("throw 'panama!';"); | 4478 Local<Script> script = v8_compile("throw 'panama!';"); |
4108 v8::TryCatch try_catch(env->GetIsolate()); | 4479 v8::TryCatch try_catch(env->GetIsolate()); |
4109 Local<Value> result = script->Run(); | 4480 v8::MaybeLocal<Value> result = script->Run(env.local()); |
4110 CHECK(result.IsEmpty()); | 4481 CHECK(result.IsEmpty()); |
4111 CHECK(try_catch.HasCaught()); | 4482 CHECK(try_catch.HasCaught()); |
4112 String::Utf8Value exception_value(try_catch.Exception()); | 4483 String::Utf8Value exception_value(try_catch.Exception()); |
4113 CHECK_EQ(0, strcmp(*exception_value, "panama!")); | 4484 CHECK_EQ(0, strcmp(*exception_value, "panama!")); |
4114 } | 4485 } |
4115 | 4486 |
4116 | 4487 |
4117 TEST(TryCatchCustomException) { | 4488 TEST(TryCatchCustomException) { |
4118 LocalContext env; | 4489 LocalContext env; |
4119 v8::Isolate* isolate = env->GetIsolate(); | 4490 v8::Isolate* isolate = env->GetIsolate(); |
4120 v8::HandleScope scope(isolate); | 4491 v8::HandleScope scope(isolate); |
4121 v8::TryCatch try_catch(isolate); | 4492 v8::TryCatch try_catch(isolate); |
4122 CompileRun( | 4493 CompileRun( |
4123 "function CustomError() { this.a = 'b'; }" | 4494 "function CustomError() { this.a = 'b'; }" |
4124 "(function f() { throw new CustomError(); })();"); | 4495 "(function f() { throw new CustomError(); })();"); |
4125 CHECK(try_catch.HasCaught()); | 4496 CHECK(try_catch.HasCaught()); |
4126 CHECK(try_catch.Exception() | 4497 CHECK(try_catch.Exception() |
4127 ->ToObject(isolate) | 4498 ->ToObject(env.local()) |
4128 ->Get(v8_str("a")) | 4499 .ToLocalChecked() |
4129 ->Equals(v8_str("b"))); | 4500 ->Get(env.local(), v8_str("a")) |
4501 .ToLocalChecked() | |
4502 ->Equals(env.local(), v8_str("b")) | |
4503 .FromJust()); | |
4130 } | 4504 } |
4131 | 4505 |
4132 | 4506 |
4133 bool message_received; | 4507 bool message_received; |
4134 | 4508 |
4135 | 4509 |
4136 static void check_message_0(v8::Handle<v8::Message> message, | 4510 static void check_message_0(v8::Local<v8::Message> message, |
4137 v8::Handle<Value> data) { | 4511 v8::Local<Value> data) { |
4138 CHECK_EQ(5.76, data->NumberValue()); | 4512 CHECK_EQ(5.76, data->NumberValue(CcTest::isolate()->GetCurrentContext()) |
4139 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); | 4513 .FromJust()); |
4514 CHECK_EQ(6.75, message->GetScriptOrigin() | |
4515 .ResourceName() | |
4516 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4517 .FromJust()); | |
4140 CHECK(!message->IsSharedCrossOrigin()); | 4518 CHECK(!message->IsSharedCrossOrigin()); |
4141 message_received = true; | 4519 message_received = true; |
4142 } | 4520 } |
4143 | 4521 |
4144 | 4522 |
4145 THREADED_TEST(MessageHandler0) { | 4523 THREADED_TEST(MessageHandler0) { |
4146 message_received = false; | 4524 message_received = false; |
4147 v8::HandleScope scope(CcTest::isolate()); | 4525 v8::HandleScope scope(CcTest::isolate()); |
4148 CHECK(!message_received); | 4526 CHECK(!message_received); |
4149 LocalContext context; | 4527 LocalContext context; |
4150 v8::V8::AddMessageListener(check_message_0, v8_num(5.76)); | 4528 CcTest::isolate()->AddMessageListener(check_message_0, v8_num(5.76)); |
4151 v8::Handle<v8::Script> script = CompileWithOrigin("throw 'error'", "6.75"); | 4529 v8::Local<v8::Script> script = CompileWithOrigin("throw 'error'", "6.75"); |
4152 script->Run(); | 4530 CHECK(script->Run(context.local()).IsEmpty()); |
4153 CHECK(message_received); | 4531 CHECK(message_received); |
4154 // clear out the message listener | 4532 // clear out the message listener |
4155 v8::V8::RemoveMessageListeners(check_message_0); | 4533 CcTest::isolate()->RemoveMessageListeners(check_message_0); |
4156 } | 4534 } |
4157 | 4535 |
4158 | 4536 |
4159 static void check_message_1(v8::Handle<v8::Message> message, | 4537 static void check_message_1(v8::Local<v8::Message> message, |
4160 v8::Handle<Value> data) { | 4538 v8::Local<Value> data) { |
4161 CHECK(data->IsNumber()); | 4539 CHECK(data->IsNumber()); |
4162 CHECK_EQ(1337, data->Int32Value()); | 4540 CHECK_EQ(1337, |
4541 data->Int32Value(CcTest::isolate()->GetCurrentContext()).FromJust()); | |
4163 CHECK(!message->IsSharedCrossOrigin()); | 4542 CHECK(!message->IsSharedCrossOrigin()); |
4164 message_received = true; | 4543 message_received = true; |
4165 } | 4544 } |
4166 | 4545 |
4167 | 4546 |
4168 TEST(MessageHandler1) { | 4547 TEST(MessageHandler1) { |
4169 message_received = false; | 4548 message_received = false; |
4170 v8::HandleScope scope(CcTest::isolate()); | 4549 v8::HandleScope scope(CcTest::isolate()); |
4171 CHECK(!message_received); | 4550 CHECK(!message_received); |
4172 v8::V8::AddMessageListener(check_message_1); | 4551 CcTest::isolate()->AddMessageListener(check_message_1); |
4173 LocalContext context; | 4552 LocalContext context; |
4174 CompileRun("throw 1337;"); | 4553 CompileRun("throw 1337;"); |
4175 CHECK(message_received); | 4554 CHECK(message_received); |
4176 // clear out the message listener | 4555 // clear out the message listener |
4177 v8::V8::RemoveMessageListeners(check_message_1); | 4556 CcTest::isolate()->RemoveMessageListeners(check_message_1); |
4178 } | 4557 } |
4179 | 4558 |
4180 | 4559 |
4181 static void check_message_2(v8::Handle<v8::Message> message, | 4560 static void check_message_2(v8::Local<v8::Message> message, |
4182 v8::Handle<Value> data) { | 4561 v8::Local<Value> data) { |
4183 LocalContext context; | 4562 LocalContext context; |
4184 CHECK(data->IsObject()); | 4563 CHECK(data->IsObject()); |
4185 v8::Local<v8::Value> hidden_property = | 4564 v8::Local<v8::Value> hidden_property = |
4186 v8::Object::Cast(*data) | 4565 v8::Object::Cast(*data) |
4187 ->GetPrivate( | 4566 ->GetPrivate( |
4188 context.local(), | 4567 context.local(), |
4189 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key"))) | 4568 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key"))) |
4190 .ToLocalChecked(); | 4569 .ToLocalChecked(); |
4191 CHECK(v8_str("hidden value")->Equals(hidden_property)); | 4570 CHECK(v8_str("hidden value") |
4571 ->Equals(context.local(), hidden_property) | |
4572 .FromJust()); | |
4192 CHECK(!message->IsSharedCrossOrigin()); | 4573 CHECK(!message->IsSharedCrossOrigin()); |
4193 message_received = true; | 4574 message_received = true; |
4194 } | 4575 } |
4195 | 4576 |
4196 | 4577 |
4197 TEST(MessageHandler2) { | 4578 TEST(MessageHandler2) { |
4198 message_received = false; | 4579 message_received = false; |
4199 v8::HandleScope scope(CcTest::isolate()); | 4580 v8::HandleScope scope(CcTest::isolate()); |
4200 CHECK(!message_received); | 4581 CHECK(!message_received); |
4201 v8::V8::AddMessageListener(check_message_2); | 4582 CcTest::isolate()->AddMessageListener(check_message_2); |
4202 LocalContext context; | 4583 LocalContext context; |
4203 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); | 4584 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); |
4204 v8::Object::Cast(*error) | 4585 v8::Object::Cast(*error) |
4205 ->SetPrivate(context.local(), | 4586 ->SetPrivate(context.local(), |
4206 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")), | 4587 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")), |
4207 v8_str("hidden value")) | 4588 v8_str("hidden value")) |
4208 .FromJust(); | 4589 .FromJust(); |
4209 context->Global()->Set(v8_str("error"), error); | 4590 CHECK(context->Global() |
4591 ->Set(context.local(), v8_str("error"), error) | |
4592 .FromJust()); | |
4210 CompileRun("throw error;"); | 4593 CompileRun("throw error;"); |
4211 CHECK(message_received); | 4594 CHECK(message_received); |
4212 // clear out the message listener | 4595 // clear out the message listener |
4213 v8::V8::RemoveMessageListeners(check_message_2); | 4596 CcTest::isolate()->RemoveMessageListeners(check_message_2); |
4214 } | 4597 } |
4215 | 4598 |
4216 | 4599 |
4217 static void check_message_3(v8::Handle<v8::Message> message, | 4600 static void check_message_3(v8::Local<v8::Message> message, |
4218 v8::Handle<Value> data) { | 4601 v8::Local<Value> data) { |
4219 CHECK(message->IsSharedCrossOrigin()); | 4602 CHECK(message->IsSharedCrossOrigin()); |
4220 CHECK(message->GetScriptOrigin().Options().IsSharedCrossOrigin()); | 4603 CHECK(message->GetScriptOrigin().Options().IsSharedCrossOrigin()); |
4221 CHECK(message->GetScriptOrigin().Options().IsEmbedderDebugScript()); | 4604 CHECK(message->GetScriptOrigin().Options().IsEmbedderDebugScript()); |
4222 CHECK(message->GetScriptOrigin().Options().IsOpaque()); | 4605 CHECK(message->GetScriptOrigin().Options().IsOpaque()); |
4223 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); | 4606 CHECK_EQ(6.75, message->GetScriptOrigin() |
4224 CHECK_EQ(7.40, message->GetScriptOrigin().SourceMapUrl()->NumberValue()); | 4607 .ResourceName() |
4608 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4609 .FromJust()); | |
4610 CHECK_EQ(7.40, message->GetScriptOrigin() | |
4611 .SourceMapUrl() | |
4612 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4613 .FromJust()); | |
4225 message_received = true; | 4614 message_received = true; |
4226 } | 4615 } |
4227 | 4616 |
4228 | 4617 |
4229 TEST(MessageHandler3) { | 4618 TEST(MessageHandler3) { |
4230 message_received = false; | 4619 message_received = false; |
4231 v8::Isolate* isolate = CcTest::isolate(); | 4620 v8::Isolate* isolate = CcTest::isolate(); |
4232 v8::HandleScope scope(isolate); | 4621 v8::HandleScope scope(isolate); |
4233 CHECK(!message_received); | 4622 CHECK(!message_received); |
4234 v8::V8::AddMessageListener(check_message_3); | 4623 isolate->AddMessageListener(check_message_3); |
4235 LocalContext context; | 4624 LocalContext context; |
4236 v8::ScriptOrigin origin = v8::ScriptOrigin( | 4625 v8::ScriptOrigin origin = v8::ScriptOrigin( |
4237 v8_str("6.75"), v8::Integer::New(isolate, 1), | 4626 v8_str("6.75"), v8::Integer::New(isolate, 1), |
4238 v8::Integer::New(isolate, 2), v8::True(isolate), Handle<v8::Integer>(), | 4627 v8::Integer::New(isolate, 2), v8::True(isolate), Local<v8::Integer>(), |
4239 v8::True(isolate), v8_str("7.40"), v8::True(isolate)); | 4628 v8::True(isolate), v8_str("7.40"), v8::True(isolate)); |
4240 v8::Handle<v8::Script> script = | 4629 v8::Local<v8::Script> script = |
4241 Script::Compile(v8_str("throw 'error'"), &origin); | 4630 Script::Compile(context.local(), v8_str("throw 'error'"), &origin) |
4242 script->Run(); | 4631 .ToLocalChecked(); |
4632 CHECK(script->Run(context.local()).IsEmpty()); | |
4243 CHECK(message_received); | 4633 CHECK(message_received); |
4244 // clear out the message listener | 4634 // clear out the message listener |
4245 v8::V8::RemoveMessageListeners(check_message_3); | 4635 isolate->RemoveMessageListeners(check_message_3); |
4246 } | 4636 } |
4247 | 4637 |
4248 | 4638 |
4249 static void check_message_4(v8::Handle<v8::Message> message, | 4639 static void check_message_4(v8::Local<v8::Message> message, |
4250 v8::Handle<Value> data) { | 4640 v8::Local<Value> data) { |
4251 CHECK(!message->IsSharedCrossOrigin()); | 4641 CHECK(!message->IsSharedCrossOrigin()); |
4252 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); | 4642 CHECK_EQ(6.75, message->GetScriptOrigin() |
4643 .ResourceName() | |
4644 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4645 .FromJust()); | |
4253 message_received = true; | 4646 message_received = true; |
4254 } | 4647 } |
4255 | 4648 |
4256 | 4649 |
4257 TEST(MessageHandler4) { | 4650 TEST(MessageHandler4) { |
4258 message_received = false; | 4651 message_received = false; |
4259 v8::Isolate* isolate = CcTest::isolate(); | 4652 v8::Isolate* isolate = CcTest::isolate(); |
4260 v8::HandleScope scope(isolate); | 4653 v8::HandleScope scope(isolate); |
4261 CHECK(!message_received); | 4654 CHECK(!message_received); |
4262 v8::V8::AddMessageListener(check_message_4); | 4655 isolate->AddMessageListener(check_message_4); |
4263 LocalContext context; | 4656 LocalContext context; |
4264 v8::ScriptOrigin origin = | 4657 v8::ScriptOrigin origin = |
4265 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), | 4658 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), |
4266 v8::Integer::New(isolate, 2), v8::False(isolate)); | 4659 v8::Integer::New(isolate, 2), v8::False(isolate)); |
4267 v8::Handle<v8::Script> script = | 4660 v8::Local<v8::Script> script = |
4268 Script::Compile(v8_str("throw 'error'"), &origin); | 4661 Script::Compile(context.local(), v8_str("throw 'error'"), &origin) |
4269 script->Run(); | 4662 .ToLocalChecked(); |
4663 CHECK(script->Run(context.local()).IsEmpty()); | |
4270 CHECK(message_received); | 4664 CHECK(message_received); |
4271 // clear out the message listener | 4665 // clear out the message listener |
4272 v8::V8::RemoveMessageListeners(check_message_4); | 4666 isolate->RemoveMessageListeners(check_message_4); |
4273 } | 4667 } |
4274 | 4668 |
4275 | 4669 |
4276 static void check_message_5a(v8::Handle<v8::Message> message, | 4670 static void check_message_5a(v8::Local<v8::Message> message, |
4277 v8::Handle<Value> data) { | 4671 v8::Local<Value> data) { |
4278 CHECK(message->IsSharedCrossOrigin()); | 4672 CHECK(message->IsSharedCrossOrigin()); |
4279 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); | 4673 CHECK_EQ(6.75, message->GetScriptOrigin() |
4674 .ResourceName() | |
4675 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4676 .FromJust()); | |
4280 message_received = true; | 4677 message_received = true; |
4281 } | 4678 } |
4282 | 4679 |
4283 | 4680 |
4284 static void check_message_5b(v8::Handle<v8::Message> message, | 4681 static void check_message_5b(v8::Local<v8::Message> message, |
4285 v8::Handle<Value> data) { | 4682 v8::Local<Value> data) { |
4286 CHECK(!message->IsSharedCrossOrigin()); | 4683 CHECK(!message->IsSharedCrossOrigin()); |
4287 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); | 4684 CHECK_EQ(6.75, message->GetScriptOrigin() |
4685 .ResourceName() | |
4686 ->NumberValue(CcTest::isolate()->GetCurrentContext()) | |
4687 .FromJust()); | |
4288 message_received = true; | 4688 message_received = true; |
4289 } | 4689 } |
4290 | 4690 |
4291 | 4691 |
4292 TEST(MessageHandler5) { | 4692 TEST(MessageHandler5) { |
4293 message_received = false; | 4693 message_received = false; |
4294 v8::Isolate* isolate = CcTest::isolate(); | 4694 v8::Isolate* isolate = CcTest::isolate(); |
4295 v8::HandleScope scope(isolate); | 4695 v8::HandleScope scope(isolate); |
4296 CHECK(!message_received); | 4696 CHECK(!message_received); |
4297 v8::V8::AddMessageListener(check_message_5a); | 4697 isolate->AddMessageListener(check_message_5a); |
4298 LocalContext context; | 4698 LocalContext context; |
4299 v8::ScriptOrigin origin1 = | 4699 v8::ScriptOrigin origin1 = |
4300 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), | 4700 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), |
4301 v8::Integer::New(isolate, 2), v8::True(isolate)); | 4701 v8::Integer::New(isolate, 2), v8::True(isolate)); |
4302 v8::Handle<v8::Script> script = | 4702 v8::Local<v8::Script> script = |
4303 Script::Compile(v8_str("throw 'error'"), &origin1); | 4703 Script::Compile(context.local(), v8_str("throw 'error'"), &origin1) |
4304 script->Run(); | 4704 .ToLocalChecked(); |
4705 CHECK(script->Run(context.local()).IsEmpty()); | |
4305 CHECK(message_received); | 4706 CHECK(message_received); |
4306 // clear out the message listener | 4707 // clear out the message listener |
4307 v8::V8::RemoveMessageListeners(check_message_5a); | 4708 isolate->RemoveMessageListeners(check_message_5a); |
4308 | 4709 |
4309 message_received = false; | 4710 message_received = false; |
4310 v8::V8::AddMessageListener(check_message_5b); | 4711 isolate->AddMessageListener(check_message_5b); |
4311 v8::ScriptOrigin origin2 = | 4712 v8::ScriptOrigin origin2 = |
4312 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), | 4713 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), |
4313 v8::Integer::New(isolate, 2), v8::False(isolate)); | 4714 v8::Integer::New(isolate, 2), v8::False(isolate)); |
4314 script = Script::Compile(v8_str("throw 'error'"), &origin2); | 4715 script = Script::Compile(context.local(), v8_str("throw 'error'"), &origin2) |
4315 script->Run(); | 4716 .ToLocalChecked(); |
4717 CHECK(script->Run(context.local()).IsEmpty()); | |
4316 CHECK(message_received); | 4718 CHECK(message_received); |
4317 // clear out the message listener | 4719 // clear out the message listener |
4318 v8::V8::RemoveMessageListeners(check_message_5b); | 4720 isolate->RemoveMessageListeners(check_message_5b); |
4319 } | 4721 } |
4320 | 4722 |
4321 | 4723 |
4322 TEST(NativeWeakMap) { | 4724 TEST(NativeWeakMap) { |
4323 v8::Isolate* isolate = CcTest::isolate(); | 4725 v8::Isolate* isolate = CcTest::isolate(); |
4324 HandleScope scope(isolate); | 4726 HandleScope scope(isolate); |
4325 Local<v8::NativeWeakMap> weak_map(v8::NativeWeakMap::New(isolate)); | 4727 Local<v8::NativeWeakMap> weak_map(v8::NativeWeakMap::New(isolate)); |
4326 CHECK(!weak_map.IsEmpty()); | 4728 CHECK(!weak_map.IsEmpty()); |
4327 | 4729 |
4328 LocalContext env; | 4730 LocalContext env; |
4329 Local<Object> value = v8::Object::New(isolate); | 4731 Local<Object> value = v8::Object::New(isolate); |
4330 | 4732 |
4331 Local<Object> local1 = v8::Object::New(isolate); | 4733 Local<Object> local1 = v8::Object::New(isolate); |
4332 CHECK(!weak_map->Has(local1)); | 4734 CHECK(!weak_map->Has(local1)); |
4333 CHECK(weak_map->Get(local1)->IsUndefined()); | 4735 CHECK(weak_map->Get(local1)->IsUndefined()); |
4334 weak_map->Set(local1, value); | 4736 weak_map->Set(local1, value); |
4335 CHECK(weak_map->Has(local1)); | 4737 CHECK(weak_map->Has(local1)); |
4336 CHECK(value->Equals(weak_map->Get(local1))); | 4738 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust()); |
4337 | 4739 |
4338 WeakCallCounter counter(1234); | 4740 WeakCallCounter counter(1234); |
4339 WeakCallCounterAndPersistent<Value> o1(&counter); | 4741 WeakCallCounterAndPersistent<Value> o1(&counter); |
4340 WeakCallCounterAndPersistent<Value> o2(&counter); | 4742 WeakCallCounterAndPersistent<Value> o2(&counter); |
4341 WeakCallCounterAndPersistent<Value> s1(&counter); | 4743 WeakCallCounterAndPersistent<Value> s1(&counter); |
4342 { | 4744 { |
4343 HandleScope scope(isolate); | 4745 HandleScope scope(isolate); |
4344 Local<v8::Object> obj1 = v8::Object::New(isolate); | 4746 Local<v8::Object> obj1 = v8::Object::New(isolate); |
4345 Local<v8::Object> obj2 = v8::Object::New(isolate); | 4747 Local<v8::Object> obj2 = v8::Object::New(isolate); |
4346 Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); | 4748 Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); |
4347 | 4749 |
4348 weak_map->Set(obj1, value); | 4750 weak_map->Set(obj1, value); |
4349 weak_map->Set(obj2, value); | 4751 weak_map->Set(obj2, value); |
4350 weak_map->Set(sym1, value); | 4752 weak_map->Set(sym1, value); |
4351 | 4753 |
4352 o1.handle.Reset(isolate, obj1); | 4754 o1.handle.Reset(isolate, obj1); |
4353 o2.handle.Reset(isolate, obj2); | 4755 o2.handle.Reset(isolate, obj2); |
4354 s1.handle.Reset(isolate, sym1); | 4756 s1.handle.Reset(isolate, sym1); |
4355 | 4757 |
4356 CHECK(weak_map->Has(local1)); | 4758 CHECK(weak_map->Has(local1)); |
4357 CHECK(weak_map->Has(obj1)); | 4759 CHECK(weak_map->Has(obj1)); |
4358 CHECK(weak_map->Has(obj2)); | 4760 CHECK(weak_map->Has(obj2)); |
4359 CHECK(weak_map->Has(sym1)); | 4761 CHECK(weak_map->Has(sym1)); |
4360 | 4762 |
4361 CHECK(value->Equals(weak_map->Get(local1))); | 4763 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust()); |
4362 CHECK(value->Equals(weak_map->Get(obj1))); | 4764 CHECK(value->Equals(env.local(), weak_map->Get(obj1)).FromJust()); |
4363 CHECK(value->Equals(weak_map->Get(obj2))); | 4765 CHECK(value->Equals(env.local(), weak_map->Get(obj2)).FromJust()); |
4364 CHECK(value->Equals(weak_map->Get(sym1))); | 4766 CHECK(value->Equals(env.local(), weak_map->Get(sym1)).FromJust()); |
4365 } | 4767 } |
4366 CcTest::heap()->CollectAllGarbage(); | 4768 CcTest::heap()->CollectAllGarbage(); |
4367 { | 4769 { |
4368 HandleScope scope(isolate); | 4770 HandleScope scope(isolate); |
4369 CHECK(value->Equals(weak_map->Get(local1))); | 4771 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust()); |
4370 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, o1.handle)))); | 4772 CHECK(value->Equals(env.local(), |
4371 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, o2.handle)))); | 4773 weak_map->Get(Local<Value>::New(isolate, o1.handle))) |
4372 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, s1.handle)))); | 4774 .FromJust()); |
4775 CHECK(value->Equals(env.local(), | |
4776 weak_map->Get(Local<Value>::New(isolate, o2.handle))) | |
4777 .FromJust()); | |
4778 CHECK(value->Equals(env.local(), | |
4779 weak_map->Get(Local<Value>::New(isolate, s1.handle))) | |
4780 .FromJust()); | |
4373 } | 4781 } |
4374 | 4782 |
4375 o1.handle.SetWeak(&o1, &WeakPointerCallback, | 4783 o1.handle.SetWeak(&o1, &WeakPointerCallback, |
4376 v8::WeakCallbackType::kParameter); | 4784 v8::WeakCallbackType::kParameter); |
4377 o2.handle.SetWeak(&o2, &WeakPointerCallback, | 4785 o2.handle.SetWeak(&o2, &WeakPointerCallback, |
4378 v8::WeakCallbackType::kParameter); | 4786 v8::WeakCallbackType::kParameter); |
4379 s1.handle.SetWeak(&s1, &WeakPointerCallback, | 4787 s1.handle.SetWeak(&s1, &WeakPointerCallback, |
4380 v8::WeakCallbackType::kParameter); | 4788 v8::WeakCallbackType::kParameter); |
4381 | 4789 |
4382 CcTest::heap()->CollectAllGarbage(); | 4790 CcTest::heap()->CollectAllGarbage(); |
4383 CHECK_EQ(3, counter.NumberOfWeakCalls()); | 4791 CHECK_EQ(3, counter.NumberOfWeakCalls()); |
4384 | 4792 |
4385 CHECK(o1.handle.IsEmpty()); | 4793 CHECK(o1.handle.IsEmpty()); |
4386 CHECK(o2.handle.IsEmpty()); | 4794 CHECK(o2.handle.IsEmpty()); |
4387 CHECK(s1.handle.IsEmpty()); | 4795 CHECK(s1.handle.IsEmpty()); |
4388 | 4796 |
4389 CHECK(value->Equals(weak_map->Get(local1))); | 4797 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust()); |
4390 CHECK(weak_map->Delete(local1)); | 4798 CHECK(weak_map->Delete(local1)); |
4391 CHECK(!weak_map->Has(local1)); | 4799 CHECK(!weak_map->Has(local1)); |
4392 CHECK(weak_map->Get(local1)->IsUndefined()); | 4800 CHECK(weak_map->Get(local1)->IsUndefined()); |
4393 } | 4801 } |
4394 | 4802 |
4395 | 4803 |
4396 THREADED_TEST(GetSetProperty) { | 4804 THREADED_TEST(GetSetProperty) { |
4397 LocalContext context; | 4805 LocalContext context; |
4398 v8::Isolate* isolate = context->GetIsolate(); | 4806 v8::Isolate* isolate = context->GetIsolate(); |
4399 v8::HandleScope scope(isolate); | 4807 v8::HandleScope scope(isolate); |
4400 context->Global()->Set(v8_str("foo"), v8_num(14)); | 4808 CHECK(context->Global() |
4401 context->Global()->Set(v8_str("12"), v8_num(92)); | 4809 ->Set(context.local(), v8_str("foo"), v8_num(14)) |
4402 context->Global()->Set(v8::Integer::New(isolate, 16), v8_num(32)); | 4810 .FromJust()); |
4403 context->Global()->Set(v8_num(13), v8_num(56)); | 4811 CHECK(context->Global() |
4812 ->Set(context.local(), v8_str("12"), v8_num(92)) | |
4813 .FromJust()); | |
4814 CHECK(context->Global() | |
4815 ->Set(context.local(), v8::Integer::New(isolate, 16), v8_num(32)) | |
4816 .FromJust()); | |
4817 CHECK(context->Global() | |
4818 ->Set(context.local(), v8_num(13), v8_num(56)) | |
4819 .FromJust()); | |
4404 Local<Value> foo = CompileRun("this.foo"); | 4820 Local<Value> foo = CompileRun("this.foo"); |
4405 CHECK_EQ(14, foo->Int32Value()); | 4821 CHECK_EQ(14, foo->Int32Value(context.local()).FromJust()); |
4406 Local<Value> twelve = CompileRun("this[12]"); | 4822 Local<Value> twelve = CompileRun("this[12]"); |
4407 CHECK_EQ(92, twelve->Int32Value()); | 4823 CHECK_EQ(92, twelve->Int32Value(context.local()).FromJust()); |
4408 Local<Value> sixteen = CompileRun("this[16]"); | 4824 Local<Value> sixteen = CompileRun("this[16]"); |
4409 CHECK_EQ(32, sixteen->Int32Value()); | 4825 CHECK_EQ(32, sixteen->Int32Value(context.local()).FromJust()); |
4410 Local<Value> thirteen = CompileRun("this[13]"); | 4826 Local<Value> thirteen = CompileRun("this[13]"); |
4411 CHECK_EQ(56, thirteen->Int32Value()); | 4827 CHECK_EQ(56, thirteen->Int32Value(context.local()).FromJust()); |
4412 CHECK_EQ(92, | 4828 CHECK_EQ(92, context->Global() |
4413 context->Global()->Get(v8::Integer::New(isolate, 12))->Int32Value()); | 4829 ->Get(context.local(), v8::Integer::New(isolate, 12)) |
4414 CHECK_EQ(92, context->Global()->Get(v8_str("12"))->Int32Value()); | 4830 .ToLocalChecked() |
4415 CHECK_EQ(92, context->Global()->Get(v8_num(12))->Int32Value()); | 4831 ->Int32Value(context.local()) |
4416 CHECK_EQ(32, | 4832 .FromJust()); |
4417 context->Global()->Get(v8::Integer::New(isolate, 16))->Int32Value()); | 4833 CHECK_EQ(92, context->Global() |
4418 CHECK_EQ(32, context->Global()->Get(v8_str("16"))->Int32Value()); | 4834 ->Get(context.local(), v8_str("12")) |
4419 CHECK_EQ(32, context->Global()->Get(v8_num(16))->Int32Value()); | 4835 .ToLocalChecked() |
4420 CHECK_EQ(56, | 4836 ->Int32Value(context.local()) |
4421 context->Global()->Get(v8::Integer::New(isolate, 13))->Int32Value()); | 4837 .FromJust()); |
4422 CHECK_EQ(56, context->Global()->Get(v8_str("13"))->Int32Value()); | 4838 CHECK_EQ(92, context->Global() |
4423 CHECK_EQ(56, context->Global()->Get(v8_num(13))->Int32Value()); | 4839 ->Get(context.local(), v8_num(12)) |
4840 .ToLocalChecked() | |
4841 ->Int32Value(context.local()) | |
4842 .FromJust()); | |
4843 CHECK_EQ(32, context->Global() | |
4844 ->Get(context.local(), v8::Integer::New(isolate, 16)) | |
4845 .ToLocalChecked() | |
4846 ->Int32Value(context.local()) | |
4847 .FromJust()); | |
4848 CHECK_EQ(32, context->Global() | |
4849 ->Get(context.local(), v8_str("16")) | |
4850 .ToLocalChecked() | |
4851 ->Int32Value(context.local()) | |
4852 .FromJust()); | |
4853 CHECK_EQ(32, context->Global() | |
4854 ->Get(context.local(), v8_num(16)) | |
4855 .ToLocalChecked() | |
4856 ->Int32Value(context.local()) | |
4857 .FromJust()); | |
4858 CHECK_EQ(56, context->Global() | |
4859 ->Get(context.local(), v8::Integer::New(isolate, 13)) | |
4860 .ToLocalChecked() | |
4861 ->Int32Value(context.local()) | |
4862 .FromJust()); | |
4863 CHECK_EQ(56, context->Global() | |
4864 ->Get(context.local(), v8_str("13")) | |
4865 .ToLocalChecked() | |
4866 ->Int32Value(context.local()) | |
4867 .FromJust()); | |
4868 CHECK_EQ(56, context->Global() | |
4869 ->Get(context.local(), v8_num(13)) | |
4870 .ToLocalChecked() | |
4871 ->Int32Value(context.local()) | |
4872 .FromJust()); | |
4424 } | 4873 } |
4425 | 4874 |
4426 | 4875 |
4876 /* | |
4877 TODO(vogelheim): What about ForceSet | |
4878 | |
4879 | |
4427 THREADED_TEST(PropertyAttributes) { | 4880 THREADED_TEST(PropertyAttributes) { |
4428 LocalContext context; | 4881 LocalContext context; |
4429 v8::HandleScope scope(context->GetIsolate()); | 4882 v8::HandleScope scope(context->GetIsolate()); |
4430 // none | 4883 // none |
4431 Local<String> prop = v8_str("none"); | 4884 Local<String> prop = v8_str("none"); |
4432 context->Global()->Set(prop, v8_num(7)); | 4885 CHECK(context->Global()->Set(context.local(), prop, v8_num(7)).FromJust()); |
4433 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4886 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(), |
4887 prop).FromJust()); | |
4434 // read-only | 4888 // read-only |
4435 prop = v8_str("read_only"); | 4889 prop = v8_str("read_only"); |
4436 context->Global()->ForceSet(prop, v8_num(7), v8::ReadOnly); | 4890 context->Global()->ForceSet(context.local(), prop, v8_num(7), |
vogelheim
2015/11/23 18:22:15
I can't figure out how to replace ForceSet with no
jochen (gone - plz use gerrit)
2015/11/24 12:42:25
does context->Global()->DefineOwnProperty(context.
vogelheim
2015/11/26 10:57:32
It does. Done.
| |
4437 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4891 v8::ReadOnly).FromJust(); |
4438 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); | 4892 CHECK_EQ(7, context->Global()->Get(context.local(), |
4893 prop).ToLocalChecked()->Int32Value(context.local()).FromJust()); | |
4894 CHECK_EQ(v8::ReadOnly, | |
4895 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust()); | |
4439 CompileRun("read_only = 9"); | 4896 CompileRun("read_only = 9"); |
4440 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4897 CHECK_EQ(7, context->Global()->Get(context.local(), |
4441 context->Global()->Set(prop, v8_num(10)); | 4898 prop).ToLocalChecked()->Int32Value(context.local()).FromJust()); |
4442 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); | 4899 CHECK(context->Global()->Set(context.local(), prop, v8_num(10)).FromJust()); |
4900 CHECK_EQ(7, context->Global()->Get(context.local(), | |
4901 prop).ToLocalChecked()->Int32Value(context.local()).FromJust()); | |
4443 // dont-delete | 4902 // dont-delete |
4444 prop = v8_str("dont_delete"); | 4903 prop = v8_str("dont_delete"); |
4445 context->Global()->ForceSet(prop, v8_num(13), v8::DontDelete); | 4904 context->Global()->ForceSet(context.local(), prop, v8_num(13), |
4446 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4905 v8::DontDelete).FromJust(); |
4906 CHECK_EQ(13, context->Global()->Get(context.local(), | |
4907 prop).ToLocalChecked()->Int32Value(context.local()).FromJust()); | |
4447 CompileRun("delete dont_delete"); | 4908 CompileRun("delete dont_delete"); |
4448 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); | 4909 CHECK_EQ(13, context->Global()->Get(context.local(), |
4449 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); | 4910 prop).ToLocalChecked()->Int32Value(context.local()).FromJust()); |
4911 CHECK_EQ(v8::DontDelete, | |
4912 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust()); | |
4450 // dont-enum | 4913 // dont-enum |
4451 prop = v8_str("dont_enum"); | 4914 prop = v8_str("dont_enum"); |
4452 context->Global()->ForceSet(prop, v8_num(28), v8::DontEnum); | 4915 context->Global()->ForceSet(prop, v8_num(28), v8::DontEnum); |
4453 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); | 4916 CHECK_EQ(v8::DontEnum, |
4917 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust()); | |
4454 // absent | 4918 // absent |
4455 prop = v8_str("absent"); | 4919 prop = v8_str("absent"); |
4456 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); | 4920 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(), |
4921 prop).FromJust()); | |
4457 Local<Value> fake_prop = v8_num(1); | 4922 Local<Value> fake_prop = v8_num(1); |
4458 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(fake_prop)); | 4923 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(), |
4924 fake_prop).FromJust()); | |
4459 // exception | 4925 // exception |
4460 TryCatch try_catch(context->GetIsolate()); | 4926 TryCatch try_catch(context->GetIsolate()); |
4461 Local<Value> exception = | 4927 Local<Value> exception = |
4462 CompileRun("({ toString: function() { throw 'exception';} })"); | 4928 CompileRun("({ toString: function() { throw 'exception';} })"); |
4463 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(exception)); | 4929 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(), |
4930 exception).FromJust()); | |
4464 CHECK(try_catch.HasCaught()); | 4931 CHECK(try_catch.HasCaught()); |
4465 String::Utf8Value exception_value(try_catch.Exception()); | 4932 String::Utf8Value exception_value(try_catch.Exception()); |
4466 CHECK_EQ(0, strcmp("exception", *exception_value)); | 4933 CHECK_EQ(0, strcmp("exception", *exception_value)); |
4467 try_catch.Reset(); | 4934 try_catch.Reset(); |
4468 } | 4935 } |
4469 | 4936 */ |
4470 | 4937 |
4471 THREADED_TEST(Array) { | 4938 THREADED_TEST(Array) { |
4472 LocalContext context; | 4939 LocalContext context; |
4473 v8::HandleScope scope(context->GetIsolate()); | 4940 v8::HandleScope scope(context->GetIsolate()); |
4474 Local<v8::Array> array = v8::Array::New(context->GetIsolate()); | 4941 Local<v8::Array> array = v8::Array::New(context->GetIsolate()); |
4475 CHECK_EQ(0u, array->Length()); | 4942 CHECK_EQ(0u, array->Length()); |
4476 CHECK(array->Get(0)->IsUndefined()); | 4943 CHECK(array->Get(context.local(), 0).ToLocalChecked()->IsUndefined()); |
4477 CHECK(!array->Has(0)); | 4944 CHECK(!array->Has(context.local(), 0).FromJust()); |
4478 CHECK(array->Get(100)->IsUndefined()); | 4945 CHECK(array->Get(context.local(), 100).ToLocalChecked()->IsUndefined()); |
4479 CHECK(!array->Has(100)); | 4946 CHECK(!array->Has(context.local(), 100).FromJust()); |
4480 array->Set(2, v8_num(7)); | 4947 CHECK(array->Set(context.local(), 2, v8_num(7)).FromJust()); |
4481 CHECK_EQ(3u, array->Length()); | 4948 CHECK_EQ(3u, array->Length()); |
4482 CHECK(!array->Has(0)); | 4949 CHECK(!array->Has(context.local(), 0).FromJust()); |
4483 CHECK(!array->Has(1)); | 4950 CHECK(!array->Has(context.local(), 1).FromJust()); |
4484 CHECK(array->Has(2)); | 4951 CHECK(array->Has(context.local(), 2).FromJust()); |
4485 CHECK_EQ(7, array->Get(2)->Int32Value()); | 4952 CHECK_EQ(7, array->Get(context.local(), 2) |
4953 .ToLocalChecked() | |
4954 ->Int32Value(context.local()) | |
4955 .FromJust()); | |
4486 Local<Value> obj = CompileRun("[1, 2, 3]"); | 4956 Local<Value> obj = CompileRun("[1, 2, 3]"); |
4487 Local<v8::Array> arr = obj.As<v8::Array>(); | 4957 Local<v8::Array> arr = obj.As<v8::Array>(); |
4488 CHECK_EQ(3u, arr->Length()); | 4958 CHECK_EQ(3u, arr->Length()); |
4489 CHECK_EQ(1, arr->Get(0)->Int32Value()); | 4959 CHECK_EQ(1, arr->Get(context.local(), 0) |
4490 CHECK_EQ(2, arr->Get(1)->Int32Value()); | 4960 .ToLocalChecked() |
4491 CHECK_EQ(3, arr->Get(2)->Int32Value()); | 4961 ->Int32Value(context.local()) |
4962 .FromJust()); | |
4963 CHECK_EQ(2, arr->Get(context.local(), 1) | |
4964 .ToLocalChecked() | |
4965 ->Int32Value(context.local()) | |
4966 .FromJust()); | |
4967 CHECK_EQ(3, arr->Get(context.local(), 2) | |
4968 .ToLocalChecked() | |
4969 ->Int32Value(context.local()) | |
4970 .FromJust()); | |
4492 array = v8::Array::New(context->GetIsolate(), 27); | 4971 array = v8::Array::New(context->GetIsolate(), 27); |
4493 CHECK_EQ(27u, array->Length()); | 4972 CHECK_EQ(27u, array->Length()); |
4494 array = v8::Array::New(context->GetIsolate(), -27); | 4973 array = v8::Array::New(context->GetIsolate(), -27); |
4495 CHECK_EQ(0u, array->Length()); | 4974 CHECK_EQ(0u, array->Length()); |
4496 } | 4975 } |
4497 | 4976 |
4498 | 4977 |
4499 void HandleF(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4978 void HandleF(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4500 v8::EscapableHandleScope scope(args.GetIsolate()); | 4979 v8::EscapableHandleScope scope(args.GetIsolate()); |
4501 ApiTestFuzzer::Fuzz(); | 4980 ApiTestFuzzer::Fuzz(); |
4502 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); | 4981 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); |
4503 for (int i = 0; i < args.Length(); i++) result->Set(i, args[i]); | 4982 for (int i = 0; i < args.Length(); i++) { |
4983 CHECK(result->Set(CcTest::isolate()->GetCurrentContext(), i, args[i]) | |
4984 .FromJust()); | |
4985 } | |
4504 args.GetReturnValue().Set(scope.Escape(result)); | 4986 args.GetReturnValue().Set(scope.Escape(result)); |
4505 } | 4987 } |
4506 | 4988 |
4507 | 4989 |
4508 THREADED_TEST(Vector) { | 4990 THREADED_TEST(Vector) { |
4509 v8::Isolate* isolate = CcTest::isolate(); | 4991 v8::Isolate* isolate = CcTest::isolate(); |
4510 v8::HandleScope scope(isolate); | 4992 v8::HandleScope scope(isolate); |
4511 Local<ObjectTemplate> global = ObjectTemplate::New(isolate); | 4993 Local<ObjectTemplate> global = ObjectTemplate::New(isolate); |
4512 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF)); | 4994 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF)); |
4513 LocalContext context(0, global); | 4995 LocalContext context(0, global); |
4514 | 4996 |
4515 const char* fun = "f()"; | 4997 const char* fun = "f()"; |
4516 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); | 4998 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); |
4517 CHECK_EQ(0u, a0->Length()); | 4999 CHECK_EQ(0u, a0->Length()); |
4518 | 5000 |
4519 const char* fun2 = "f(11)"; | 5001 const char* fun2 = "f(11)"; |
4520 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); | 5002 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); |
4521 CHECK_EQ(1u, a1->Length()); | 5003 CHECK_EQ(1u, a1->Length()); |
4522 CHECK_EQ(11, a1->Get(0)->Int32Value()); | 5004 CHECK_EQ(11, a1->Get(context.local(), 0) |
5005 .ToLocalChecked() | |
5006 ->Int32Value(context.local()) | |
5007 .FromJust()); | |
4523 | 5008 |
4524 const char* fun3 = "f(12, 13)"; | 5009 const char* fun3 = "f(12, 13)"; |
4525 Local<v8::Array> a2 = CompileRun(fun3).As<v8::Array>(); | 5010 Local<v8::Array> a2 = CompileRun(fun3).As<v8::Array>(); |
4526 CHECK_EQ(2u, a2->Length()); | 5011 CHECK_EQ(2u, a2->Length()); |
4527 CHECK_EQ(12, a2->Get(0)->Int32Value()); | 5012 CHECK_EQ(12, a2->Get(context.local(), 0) |
4528 CHECK_EQ(13, a2->Get(1)->Int32Value()); | 5013 .ToLocalChecked() |
5014 ->Int32Value(context.local()) | |
5015 .FromJust()); | |
5016 CHECK_EQ(13, a2->Get(context.local(), 1) | |
5017 .ToLocalChecked() | |
5018 ->Int32Value(context.local()) | |
5019 .FromJust()); | |
4529 | 5020 |
4530 const char* fun4 = "f(14, 15, 16)"; | 5021 const char* fun4 = "f(14, 15, 16)"; |
4531 Local<v8::Array> a3 = CompileRun(fun4).As<v8::Array>(); | 5022 Local<v8::Array> a3 = CompileRun(fun4).As<v8::Array>(); |
4532 CHECK_EQ(3u, a3->Length()); | 5023 CHECK_EQ(3u, a3->Length()); |
4533 CHECK_EQ(14, a3->Get(0)->Int32Value()); | 5024 CHECK_EQ(14, a3->Get(context.local(), 0) |
4534 CHECK_EQ(15, a3->Get(1)->Int32Value()); | 5025 .ToLocalChecked() |
4535 CHECK_EQ(16, a3->Get(2)->Int32Value()); | 5026 ->Int32Value(context.local()) |
5027 .FromJust()); | |
5028 CHECK_EQ(15, a3->Get(context.local(), 1) | |
5029 .ToLocalChecked() | |
5030 ->Int32Value(context.local()) | |
5031 .FromJust()); | |
5032 CHECK_EQ(16, a3->Get(context.local(), 2) | |
5033 .ToLocalChecked() | |
5034 ->Int32Value(context.local()) | |
5035 .FromJust()); | |
4536 | 5036 |
4537 const char* fun5 = "f(17, 18, 19, 20)"; | 5037 const char* fun5 = "f(17, 18, 19, 20)"; |
4538 Local<v8::Array> a4 = CompileRun(fun5).As<v8::Array>(); | 5038 Local<v8::Array> a4 = CompileRun(fun5).As<v8::Array>(); |
4539 CHECK_EQ(4u, a4->Length()); | 5039 CHECK_EQ(4u, a4->Length()); |
4540 CHECK_EQ(17, a4->Get(0)->Int32Value()); | 5040 CHECK_EQ(17, a4->Get(context.local(), 0) |
4541 CHECK_EQ(18, a4->Get(1)->Int32Value()); | 5041 .ToLocalChecked() |
4542 CHECK_EQ(19, a4->Get(2)->Int32Value()); | 5042 ->Int32Value(context.local()) |
4543 CHECK_EQ(20, a4->Get(3)->Int32Value()); | 5043 .FromJust()); |
5044 CHECK_EQ(18, a4->Get(context.local(), 1) | |
5045 .ToLocalChecked() | |
5046 ->Int32Value(context.local()) | |
5047 .FromJust()); | |
5048 CHECK_EQ(19, a4->Get(context.local(), 2) | |
5049 .ToLocalChecked() | |
5050 ->Int32Value(context.local()) | |
5051 .FromJust()); | |
5052 CHECK_EQ(20, a4->Get(context.local(), 3) | |
5053 .ToLocalChecked() | |
5054 ->Int32Value(context.local()) | |
5055 .FromJust()); | |
4544 } | 5056 } |
4545 | 5057 |
4546 | 5058 |
4547 THREADED_TEST(FunctionCall) { | 5059 THREADED_TEST(FunctionCall) { |
4548 LocalContext context; | 5060 LocalContext context; |
4549 v8::Isolate* isolate = context->GetIsolate(); | 5061 v8::Isolate* isolate = context->GetIsolate(); |
4550 v8::HandleScope scope(isolate); | 5062 v8::HandleScope scope(isolate); |
4551 CompileRun( | 5063 CompileRun( |
4552 "function Foo() {" | 5064 "function Foo() {" |
4553 " var result = [];" | 5065 " var result = [];" |
4554 " for (var i = 0; i < arguments.length; i++) {" | 5066 " for (var i = 0; i < arguments.length; i++) {" |
4555 " result.push(arguments[i]);" | 5067 " result.push(arguments[i]);" |
4556 " }" | 5068 " }" |
4557 " return result;" | 5069 " return result;" |
4558 "}" | 5070 "}" |
4559 "function ReturnThisSloppy() {" | 5071 "function ReturnThisSloppy() {" |
4560 " return this;" | 5072 " return this;" |
4561 "}" | 5073 "}" |
4562 "function ReturnThisStrict() {" | 5074 "function ReturnThisStrict() {" |
4563 " 'use strict';" | 5075 " 'use strict';" |
4564 " return this;" | 5076 " return this;" |
4565 "}"); | 5077 "}"); |
4566 Local<Function> Foo = | 5078 Local<Function> Foo = Local<Function>::Cast( |
4567 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); | 5079 context->Global()->Get(context.local(), v8_str("Foo")).ToLocalChecked()); |
4568 Local<Function> ReturnThisSloppy = | 5080 Local<Function> ReturnThisSloppy = Local<Function>::Cast( |
4569 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisSloppy"))); | 5081 context->Global() |
4570 Local<Function> ReturnThisStrict = | 5082 ->Get(context.local(), v8_str("ReturnThisSloppy")) |
4571 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisStrict"))); | 5083 .ToLocalChecked()); |
5084 Local<Function> ReturnThisStrict = Local<Function>::Cast( | |
5085 context->Global() | |
5086 ->Get(context.local(), v8_str("ReturnThisStrict")) | |
5087 .ToLocalChecked()); | |
4572 | 5088 |
4573 v8::Handle<Value>* args0 = NULL; | 5089 v8::Local<Value>* args0 = NULL; |
4574 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->Call(Foo, 0, args0)); | 5090 Local<v8::Array> a0 = Local<v8::Array>::Cast( |
5091 Foo->Call(context.local(), Foo, 0, args0).ToLocalChecked()); | |
4575 CHECK_EQ(0u, a0->Length()); | 5092 CHECK_EQ(0u, a0->Length()); |
4576 | 5093 |
4577 v8::Handle<Value> args1[] = {v8_num(1.1)}; | 5094 v8::Local<Value> args1[] = {v8_num(1.1)}; |
4578 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->Call(Foo, 1, args1)); | 5095 Local<v8::Array> a1 = Local<v8::Array>::Cast( |
5096 Foo->Call(context.local(), Foo, 1, args1).ToLocalChecked()); | |
4579 CHECK_EQ(1u, a1->Length()); | 5097 CHECK_EQ(1u, a1->Length()); |
4580 CHECK_EQ(1.1, a1->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5098 CHECK_EQ(1.1, a1->Get(context.local(), v8::Integer::New(isolate, 0)) |
5099 .ToLocalChecked() | |
5100 ->NumberValue(context.local()) | |
5101 .FromJust()); | |
4581 | 5102 |
4582 v8::Handle<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; | 5103 v8::Local<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; |
4583 Local<v8::Array> a2 = Local<v8::Array>::Cast(Foo->Call(Foo, 2, args2)); | 5104 Local<v8::Array> a2 = Local<v8::Array>::Cast( |
5105 Foo->Call(context.local(), Foo, 2, args2).ToLocalChecked()); | |
4584 CHECK_EQ(2u, a2->Length()); | 5106 CHECK_EQ(2u, a2->Length()); |
4585 CHECK_EQ(2.2, a2->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5107 CHECK_EQ(2.2, a2->Get(context.local(), v8::Integer::New(isolate, 0)) |
4586 CHECK_EQ(3.3, a2->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5108 .ToLocalChecked() |
5109 ->NumberValue(context.local()) | |
5110 .FromJust()); | |
5111 CHECK_EQ(3.3, a2->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5112 .ToLocalChecked() | |
5113 ->NumberValue(context.local()) | |
5114 .FromJust()); | |
4587 | 5115 |
4588 v8::Handle<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; | 5116 v8::Local<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; |
4589 Local<v8::Array> a3 = Local<v8::Array>::Cast(Foo->Call(Foo, 3, args3)); | 5117 Local<v8::Array> a3 = Local<v8::Array>::Cast( |
5118 Foo->Call(context.local(), Foo, 3, args3).ToLocalChecked()); | |
4590 CHECK_EQ(3u, a3->Length()); | 5119 CHECK_EQ(3u, a3->Length()); |
4591 CHECK_EQ(4.4, a3->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5120 CHECK_EQ(4.4, a3->Get(context.local(), v8::Integer::New(isolate, 0)) |
4592 CHECK_EQ(5.5, a3->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5121 .ToLocalChecked() |
4593 CHECK_EQ(6.6, a3->Get(v8::Integer::New(isolate, 2))->NumberValue()); | 5122 ->NumberValue(context.local()) |
5123 .FromJust()); | |
5124 CHECK_EQ(5.5, a3->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5125 .ToLocalChecked() | |
5126 ->NumberValue(context.local()) | |
5127 .FromJust()); | |
5128 CHECK_EQ(6.6, a3->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5129 .ToLocalChecked() | |
5130 ->NumberValue(context.local()) | |
5131 .FromJust()); | |
4594 | 5132 |
4595 v8::Handle<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), | 5133 v8::Local<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), |
4596 v8_num(10.11)}; | 5134 v8_num(10.11)}; |
4597 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->Call(Foo, 4, args4)); | 5135 Local<v8::Array> a4 = Local<v8::Array>::Cast( |
5136 Foo->Call(context.local(), Foo, 4, args4).ToLocalChecked()); | |
4598 CHECK_EQ(4u, a4->Length()); | 5137 CHECK_EQ(4u, a4->Length()); |
4599 CHECK_EQ(7.7, a4->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5138 CHECK_EQ(7.7, a4->Get(context.local(), v8::Integer::New(isolate, 0)) |
4600 CHECK_EQ(8.8, a4->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5139 .ToLocalChecked() |
4601 CHECK_EQ(9.9, a4->Get(v8::Integer::New(isolate, 2))->NumberValue()); | 5140 ->NumberValue(context.local()) |
4602 CHECK_EQ(10.11, a4->Get(v8::Integer::New(isolate, 3))->NumberValue()); | 5141 .FromJust()); |
5142 CHECK_EQ(8.8, a4->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5143 .ToLocalChecked() | |
5144 ->NumberValue(context.local()) | |
5145 .FromJust()); | |
5146 CHECK_EQ(9.9, a4->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5147 .ToLocalChecked() | |
5148 ->NumberValue(context.local()) | |
5149 .FromJust()); | |
5150 CHECK_EQ(10.11, a4->Get(context.local(), v8::Integer::New(isolate, 3)) | |
5151 .ToLocalChecked() | |
5152 ->NumberValue(context.local()) | |
5153 .FromJust()); | |
4603 | 5154 |
4604 Local<v8::Value> r1 = ReturnThisSloppy->Call(v8::Undefined(isolate), 0, NULL); | 5155 Local<v8::Value> r1 = |
5156 ReturnThisSloppy->Call(context.local(), v8::Undefined(isolate), 0, NULL) | |
5157 .ToLocalChecked(); | |
4605 CHECK(r1->StrictEquals(context->Global())); | 5158 CHECK(r1->StrictEquals(context->Global())); |
4606 Local<v8::Value> r2 = ReturnThisSloppy->Call(v8::Null(isolate), 0, NULL); | 5159 Local<v8::Value> r2 = |
5160 ReturnThisSloppy->Call(context.local(), v8::Null(isolate), 0, NULL) | |
5161 .ToLocalChecked(); | |
4607 CHECK(r2->StrictEquals(context->Global())); | 5162 CHECK(r2->StrictEquals(context->Global())); |
4608 Local<v8::Value> r3 = ReturnThisSloppy->Call(v8_num(42), 0, NULL); | 5163 Local<v8::Value> r3 = |
5164 ReturnThisSloppy->Call(context.local(), v8_num(42), 0, NULL) | |
5165 .ToLocalChecked(); | |
4609 CHECK(r3->IsNumberObject()); | 5166 CHECK(r3->IsNumberObject()); |
4610 CHECK_EQ(42.0, r3.As<v8::NumberObject>()->ValueOf()); | 5167 CHECK_EQ(42.0, r3.As<v8::NumberObject>()->ValueOf()); |
4611 Local<v8::Value> r4 = ReturnThisSloppy->Call(v8_str("hello"), 0, NULL); | 5168 Local<v8::Value> r4 = |
5169 ReturnThisSloppy->Call(context.local(), v8_str("hello"), 0, NULL) | |
5170 .ToLocalChecked(); | |
4612 CHECK(r4->IsStringObject()); | 5171 CHECK(r4->IsStringObject()); |
4613 CHECK(r4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello"))); | 5172 CHECK(r4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello"))); |
4614 Local<v8::Value> r5 = ReturnThisSloppy->Call(v8::True(isolate), 0, NULL); | 5173 Local<v8::Value> r5 = |
5174 ReturnThisSloppy->Call(context.local(), v8::True(isolate), 0, NULL) | |
5175 .ToLocalChecked(); | |
4615 CHECK(r5->IsBooleanObject()); | 5176 CHECK(r5->IsBooleanObject()); |
4616 CHECK(r5.As<v8::BooleanObject>()->ValueOf()); | 5177 CHECK(r5.As<v8::BooleanObject>()->ValueOf()); |
4617 | 5178 |
4618 Local<v8::Value> r6 = ReturnThisStrict->Call(v8::Undefined(isolate), 0, NULL); | 5179 Local<v8::Value> r6 = |
5180 ReturnThisStrict->Call(context.local(), v8::Undefined(isolate), 0, NULL) | |
5181 .ToLocalChecked(); | |
4619 CHECK(r6->IsUndefined()); | 5182 CHECK(r6->IsUndefined()); |
4620 Local<v8::Value> r7 = ReturnThisStrict->Call(v8::Null(isolate), 0, NULL); | 5183 Local<v8::Value> r7 = |
5184 ReturnThisStrict->Call(context.local(), v8::Null(isolate), 0, NULL) | |
5185 .ToLocalChecked(); | |
4621 CHECK(r7->IsNull()); | 5186 CHECK(r7->IsNull()); |
4622 Local<v8::Value> r8 = ReturnThisStrict->Call(v8_num(42), 0, NULL); | 5187 Local<v8::Value> r8 = |
5188 ReturnThisStrict->Call(context.local(), v8_num(42), 0, NULL) | |
5189 .ToLocalChecked(); | |
4623 CHECK(r8->StrictEquals(v8_num(42))); | 5190 CHECK(r8->StrictEquals(v8_num(42))); |
4624 Local<v8::Value> r9 = ReturnThisStrict->Call(v8_str("hello"), 0, NULL); | 5191 Local<v8::Value> r9 = |
5192 ReturnThisStrict->Call(context.local(), v8_str("hello"), 0, NULL) | |
5193 .ToLocalChecked(); | |
4625 CHECK(r9->StrictEquals(v8_str("hello"))); | 5194 CHECK(r9->StrictEquals(v8_str("hello"))); |
4626 Local<v8::Value> r10 = ReturnThisStrict->Call(v8::True(isolate), 0, NULL); | 5195 Local<v8::Value> r10 = |
5196 ReturnThisStrict->Call(context.local(), v8::True(isolate), 0, NULL) | |
5197 .ToLocalChecked(); | |
4627 CHECK(r10->StrictEquals(v8::True(isolate))); | 5198 CHECK(r10->StrictEquals(v8::True(isolate))); |
4628 } | 5199 } |
4629 | 5200 |
4630 | 5201 |
4631 THREADED_TEST(ConstructCall) { | 5202 THREADED_TEST(ConstructCall) { |
4632 LocalContext context; | 5203 LocalContext context; |
4633 v8::Isolate* isolate = context->GetIsolate(); | 5204 v8::Isolate* isolate = context->GetIsolate(); |
4634 v8::HandleScope scope(isolate); | 5205 v8::HandleScope scope(isolate); |
4635 CompileRun( | 5206 CompileRun( |
4636 "function Foo() {" | 5207 "function Foo() {" |
4637 " var result = [];" | 5208 " var result = [];" |
4638 " for (var i = 0; i < arguments.length; i++) {" | 5209 " for (var i = 0; i < arguments.length; i++) {" |
4639 " result.push(arguments[i]);" | 5210 " result.push(arguments[i]);" |
4640 " }" | 5211 " }" |
4641 " return result;" | 5212 " return result;" |
4642 "}"); | 5213 "}"); |
4643 Local<Function> Foo = | 5214 Local<Function> Foo = Local<Function>::Cast( |
4644 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); | 5215 context->Global()->Get(context.local(), v8_str("Foo")).ToLocalChecked()); |
4645 | 5216 |
4646 v8::Handle<Value>* args0 = NULL; | 5217 v8::Local<Value>* args0 = NULL; |
4647 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->NewInstance(0, args0)); | 5218 Local<v8::Array> a0 = Local<v8::Array>::Cast( |
5219 Foo->NewInstance(context.local(), 0, args0).ToLocalChecked()); | |
4648 CHECK_EQ(0u, a0->Length()); | 5220 CHECK_EQ(0u, a0->Length()); |
4649 | 5221 |
4650 v8::Handle<Value> args1[] = {v8_num(1.1)}; | 5222 v8::Local<Value> args1[] = {v8_num(1.1)}; |
4651 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->NewInstance(1, args1)); | 5223 Local<v8::Array> a1 = Local<v8::Array>::Cast( |
5224 Foo->NewInstance(context.local(), 1, args1).ToLocalChecked()); | |
4652 CHECK_EQ(1u, a1->Length()); | 5225 CHECK_EQ(1u, a1->Length()); |
4653 CHECK_EQ(1.1, a1->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5226 CHECK_EQ(1.1, a1->Get(context.local(), v8::Integer::New(isolate, 0)) |
5227 .ToLocalChecked() | |
5228 ->NumberValue(context.local()) | |
5229 .FromJust()); | |
4654 | 5230 |
4655 v8::Handle<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; | 5231 v8::Local<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; |
4656 Local<v8::Array> a2 = Local<v8::Array>::Cast(Foo->NewInstance(2, args2)); | 5232 Local<v8::Array> a2 = Local<v8::Array>::Cast( |
5233 Foo->NewInstance(context.local(), 2, args2).ToLocalChecked()); | |
4657 CHECK_EQ(2u, a2->Length()); | 5234 CHECK_EQ(2u, a2->Length()); |
4658 CHECK_EQ(2.2, a2->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5235 CHECK_EQ(2.2, a2->Get(context.local(), v8::Integer::New(isolate, 0)) |
4659 CHECK_EQ(3.3, a2->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5236 .ToLocalChecked() |
5237 ->NumberValue(context.local()) | |
5238 .FromJust()); | |
5239 CHECK_EQ(3.3, a2->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5240 .ToLocalChecked() | |
5241 ->NumberValue(context.local()) | |
5242 .FromJust()); | |
4660 | 5243 |
4661 v8::Handle<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; | 5244 v8::Local<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; |
4662 Local<v8::Array> a3 = Local<v8::Array>::Cast(Foo->NewInstance(3, args3)); | 5245 Local<v8::Array> a3 = Local<v8::Array>::Cast( |
5246 Foo->NewInstance(context.local(), 3, args3).ToLocalChecked()); | |
4663 CHECK_EQ(3u, a3->Length()); | 5247 CHECK_EQ(3u, a3->Length()); |
4664 CHECK_EQ(4.4, a3->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5248 CHECK_EQ(4.4, a3->Get(context.local(), v8::Integer::New(isolate, 0)) |
4665 CHECK_EQ(5.5, a3->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5249 .ToLocalChecked() |
4666 CHECK_EQ(6.6, a3->Get(v8::Integer::New(isolate, 2))->NumberValue()); | 5250 ->NumberValue(context.local()) |
5251 .FromJust()); | |
5252 CHECK_EQ(5.5, a3->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5253 .ToLocalChecked() | |
5254 ->NumberValue(context.local()) | |
5255 .FromJust()); | |
5256 CHECK_EQ(6.6, a3->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5257 .ToLocalChecked() | |
5258 ->NumberValue(context.local()) | |
5259 .FromJust()); | |
4667 | 5260 |
4668 v8::Handle<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), | 5261 v8::Local<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), |
4669 v8_num(10.11)}; | 5262 v8_num(10.11)}; |
4670 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->NewInstance(4, args4)); | 5263 Local<v8::Array> a4 = Local<v8::Array>::Cast( |
5264 Foo->NewInstance(context.local(), 4, args4).ToLocalChecked()); | |
4671 CHECK_EQ(4u, a4->Length()); | 5265 CHECK_EQ(4u, a4->Length()); |
4672 CHECK_EQ(7.7, a4->Get(v8::Integer::New(isolate, 0))->NumberValue()); | 5266 CHECK_EQ(7.7, a4->Get(context.local(), v8::Integer::New(isolate, 0)) |
4673 CHECK_EQ(8.8, a4->Get(v8::Integer::New(isolate, 1))->NumberValue()); | 5267 .ToLocalChecked() |
4674 CHECK_EQ(9.9, a4->Get(v8::Integer::New(isolate, 2))->NumberValue()); | 5268 ->NumberValue(context.local()) |
4675 CHECK_EQ(10.11, a4->Get(v8::Integer::New(isolate, 3))->NumberValue()); | 5269 .FromJust()); |
5270 CHECK_EQ(8.8, a4->Get(context.local(), v8::Integer::New(isolate, 1)) | |
5271 .ToLocalChecked() | |
5272 ->NumberValue(context.local()) | |
5273 .FromJust()); | |
5274 CHECK_EQ(9.9, a4->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5275 .ToLocalChecked() | |
5276 ->NumberValue(context.local()) | |
5277 .FromJust()); | |
5278 CHECK_EQ(10.11, a4->Get(context.local(), v8::Integer::New(isolate, 3)) | |
5279 .ToLocalChecked() | |
5280 ->NumberValue(context.local()) | |
5281 .FromJust()); | |
4676 } | 5282 } |
4677 | 5283 |
4678 | 5284 |
4679 static void CheckUncle(v8::TryCatch* try_catch) { | |
4680 CHECK(try_catch->HasCaught()); | |
4681 String::Utf8Value str_value(try_catch->Exception()); | |
4682 CHECK_EQ(0, strcmp(*str_value, "uncle?")); | |
4683 try_catch->Reset(); | |
4684 } | |
4685 | |
4686 | |
4687 THREADED_TEST(ConversionNumber) { | 5285 THREADED_TEST(ConversionNumber) { |
4688 LocalContext env; | 5286 LocalContext env; |
4689 v8::Isolate* isolate = env->GetIsolate(); | 5287 v8::Isolate* isolate = env->GetIsolate(); |
4690 v8::HandleScope scope(isolate); | 5288 v8::HandleScope scope(isolate); |
4691 // Very large number. | 5289 // Very large number. |
4692 CompileRun("var obj = Math.pow(2,32) * 1237;"); | 5290 CompileRun("var obj = Math.pow(2,32) * 1237;"); |
4693 Local<Value> obj = env->Global()->Get(v8_str("obj")); | 5291 Local<Value> obj = |
4694 CHECK_EQ(5312874545152.0, obj->ToNumber(isolate)->Value()); | 5292 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4695 CHECK_EQ(0, obj->ToInt32(isolate)->Value()); | 5293 CHECK_EQ(5312874545152.0, |
5294 obj->ToNumber(env.local()).ToLocalChecked()->Value()); | |
5295 CHECK_EQ(0, obj->ToInt32(env.local()).ToLocalChecked()->Value()); | |
4696 CHECK(0u == | 5296 CHECK(0u == |
4697 obj->ToUint32(isolate)->Value()); // NOLINT - no CHECK_EQ for unsigned. | 5297 obj->ToUint32(env.local()) |
5298 .ToLocalChecked() | |
5299 ->Value()); // NOLINT - no CHECK_EQ for unsigned. | |
4698 // Large number. | 5300 // Large number. |
4699 CompileRun("var obj = -1234567890123;"); | 5301 CompileRun("var obj = -1234567890123;"); |
4700 obj = env->Global()->Get(v8_str("obj")); | 5302 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4701 CHECK_EQ(-1234567890123.0, obj->ToNumber(isolate)->Value()); | 5303 CHECK_EQ(-1234567890123.0, |
4702 CHECK_EQ(-1912276171, obj->ToInt32(isolate)->Value()); | 5304 obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4703 CHECK(2382691125u == obj->ToUint32(isolate)->Value()); // NOLINT | 5305 CHECK_EQ(-1912276171, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
5306 CHECK(2382691125u == | |
5307 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT | |
4704 // Small positive integer. | 5308 // Small positive integer. |
4705 CompileRun("var obj = 42;"); | 5309 CompileRun("var obj = 42;"); |
4706 obj = env->Global()->Get(v8_str("obj")); | 5310 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4707 CHECK_EQ(42.0, obj->ToNumber(isolate)->Value()); | 5311 CHECK_EQ(42.0, obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4708 CHECK_EQ(42, obj->ToInt32(isolate)->Value()); | 5312 CHECK_EQ(42, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
4709 CHECK(42u == obj->ToUint32(isolate)->Value()); // NOLINT | 5313 CHECK(42u == obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT |
4710 // Negative integer. | 5314 // Negative integer. |
4711 CompileRun("var obj = -37;"); | 5315 CompileRun("var obj = -37;"); |
4712 obj = env->Global()->Get(v8_str("obj")); | 5316 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4713 CHECK_EQ(-37.0, obj->ToNumber(isolate)->Value()); | 5317 CHECK_EQ(-37.0, obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4714 CHECK_EQ(-37, obj->ToInt32(isolate)->Value()); | 5318 CHECK_EQ(-37, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
4715 CHECK(4294967259u == obj->ToUint32(isolate)->Value()); // NOLINT | 5319 CHECK(4294967259u == |
5320 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT | |
4716 // Positive non-int32 integer. | 5321 // Positive non-int32 integer. |
4717 CompileRun("var obj = 0x81234567;"); | 5322 CompileRun("var obj = 0x81234567;"); |
4718 obj = env->Global()->Get(v8_str("obj")); | 5323 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4719 CHECK_EQ(2166572391.0, obj->ToNumber(isolate)->Value()); | 5324 CHECK_EQ(2166572391.0, obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4720 CHECK_EQ(-2128394905, obj->ToInt32(isolate)->Value()); | 5325 CHECK_EQ(-2128394905, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
4721 CHECK(2166572391u == obj->ToUint32(isolate)->Value()); // NOLINT | 5326 CHECK(2166572391u == |
5327 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT | |
4722 // Fraction. | 5328 // Fraction. |
4723 CompileRun("var obj = 42.3;"); | 5329 CompileRun("var obj = 42.3;"); |
4724 obj = env->Global()->Get(v8_str("obj")); | 5330 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4725 CHECK_EQ(42.3, obj->ToNumber(isolate)->Value()); | 5331 CHECK_EQ(42.3, obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4726 CHECK_EQ(42, obj->ToInt32(isolate)->Value()); | 5332 CHECK_EQ(42, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
4727 CHECK(42u == obj->ToUint32(isolate)->Value()); // NOLINT | 5333 CHECK(42u == obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT |
4728 // Large negative fraction. | 5334 // Large negative fraction. |
4729 CompileRun("var obj = -5726623061.75;"); | 5335 CompileRun("var obj = -5726623061.75;"); |
4730 obj = env->Global()->Get(v8_str("obj")); | 5336 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4731 CHECK_EQ(-5726623061.75, obj->ToNumber(isolate)->Value()); | 5337 CHECK_EQ(-5726623061.75, |
4732 CHECK_EQ(-1431655765, obj->ToInt32(isolate)->Value()); | 5338 obj->ToNumber(env.local()).ToLocalChecked()->Value()); |
4733 CHECK(2863311531u == obj->ToUint32(isolate)->Value()); // NOLINT | 5339 CHECK_EQ(-1431655765, obj->ToInt32(env.local()).ToLocalChecked()->Value()); |
5340 CHECK(2863311531u == | |
5341 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT | |
4734 } | 5342 } |
4735 | 5343 |
4736 | 5344 |
4737 THREADED_TEST(isNumberType) { | 5345 THREADED_TEST(isNumberType) { |
4738 LocalContext env; | 5346 LocalContext env; |
4739 v8::HandleScope scope(env->GetIsolate()); | 5347 v8::HandleScope scope(env->GetIsolate()); |
4740 // Very large number. | 5348 // Very large number. |
4741 CompileRun("var obj = Math.pow(2,32) * 1237;"); | 5349 CompileRun("var obj = Math.pow(2,32) * 1237;"); |
4742 Local<Value> obj = env->Global()->Get(v8_str("obj")); | 5350 Local<Value> obj = |
5351 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); | |
4743 CHECK(!obj->IsInt32()); | 5352 CHECK(!obj->IsInt32()); |
4744 CHECK(!obj->IsUint32()); | 5353 CHECK(!obj->IsUint32()); |
4745 // Large negative number. | 5354 // Large negative number. |
4746 CompileRun("var obj = -1234567890123;"); | 5355 CompileRun("var obj = -1234567890123;"); |
4747 obj = env->Global()->Get(v8_str("obj")); | 5356 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4748 CHECK(!obj->IsInt32()); | 5357 CHECK(!obj->IsInt32()); |
4749 CHECK(!obj->IsUint32()); | 5358 CHECK(!obj->IsUint32()); |
4750 // Small positive integer. | 5359 // Small positive integer. |
4751 CompileRun("var obj = 42;"); | 5360 CompileRun("var obj = 42;"); |
4752 obj = env->Global()->Get(v8_str("obj")); | 5361 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4753 CHECK(obj->IsInt32()); | 5362 CHECK(obj->IsInt32()); |
4754 CHECK(obj->IsUint32()); | 5363 CHECK(obj->IsUint32()); |
4755 // Negative integer. | 5364 // Negative integer. |
4756 CompileRun("var obj = -37;"); | 5365 CompileRun("var obj = -37;"); |
4757 obj = env->Global()->Get(v8_str("obj")); | 5366 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4758 CHECK(obj->IsInt32()); | 5367 CHECK(obj->IsInt32()); |
4759 CHECK(!obj->IsUint32()); | 5368 CHECK(!obj->IsUint32()); |
4760 // Positive non-int32 integer. | 5369 // Positive non-int32 integer. |
4761 CompileRun("var obj = 0x81234567;"); | 5370 CompileRun("var obj = 0x81234567;"); |
4762 obj = env->Global()->Get(v8_str("obj")); | 5371 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4763 CHECK(!obj->IsInt32()); | 5372 CHECK(!obj->IsInt32()); |
4764 CHECK(obj->IsUint32()); | 5373 CHECK(obj->IsUint32()); |
4765 // Fraction. | 5374 // Fraction. |
4766 CompileRun("var obj = 42.3;"); | 5375 CompileRun("var obj = 42.3;"); |
4767 obj = env->Global()->Get(v8_str("obj")); | 5376 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4768 CHECK(!obj->IsInt32()); | 5377 CHECK(!obj->IsInt32()); |
4769 CHECK(!obj->IsUint32()); | 5378 CHECK(!obj->IsUint32()); |
4770 // Large negative fraction. | 5379 // Large negative fraction. |
4771 CompileRun("var obj = -5726623061.75;"); | 5380 CompileRun("var obj = -5726623061.75;"); |
4772 obj = env->Global()->Get(v8_str("obj")); | 5381 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4773 CHECK(!obj->IsInt32()); | 5382 CHECK(!obj->IsInt32()); |
4774 CHECK(!obj->IsUint32()); | 5383 CHECK(!obj->IsUint32()); |
4775 // Positive zero | 5384 // Positive zero |
4776 CompileRun("var obj = 0.0;"); | 5385 CompileRun("var obj = 0.0;"); |
4777 obj = env->Global()->Get(v8_str("obj")); | 5386 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4778 CHECK(obj->IsInt32()); | 5387 CHECK(obj->IsInt32()); |
4779 CHECK(obj->IsUint32()); | 5388 CHECK(obj->IsUint32()); |
4780 // Positive zero | 5389 // Positive zero |
4781 CompileRun("var obj = -0.0;"); | 5390 CompileRun("var obj = -0.0;"); |
4782 obj = env->Global()->Get(v8_str("obj")); | 5391 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); |
4783 CHECK(!obj->IsInt32()); | 5392 CHECK(!obj->IsInt32()); |
4784 CHECK(!obj->IsUint32()); | 5393 CHECK(!obj->IsUint32()); |
4785 } | 5394 } |
4786 | 5395 |
4787 | 5396 |
5397 static void CheckUncle(v8::TryCatch* try_catch) { | |
5398 CHECK(try_catch->HasCaught()); | |
5399 String::Utf8Value str_value(try_catch->Exception()); | |
5400 CHECK_EQ(0, strcmp(*str_value, "uncle?")); | |
5401 try_catch->Reset(); | |
5402 } | |
5403 | |
5404 | |
4788 THREADED_TEST(ConversionException) { | 5405 THREADED_TEST(ConversionException) { |
4789 LocalContext env; | 5406 LocalContext env; |
4790 v8::Isolate* isolate = env->GetIsolate(); | 5407 v8::Isolate* isolate = env->GetIsolate(); |
4791 v8::HandleScope scope(isolate); | 5408 v8::HandleScope scope(isolate); |
4792 CompileRun( | 5409 CompileRun( |
4793 "function TestClass() { };" | 5410 "function TestClass() { };" |
4794 "TestClass.prototype.toString = function () { throw 'uncle?'; };" | 5411 "TestClass.prototype.toString = function () { throw 'uncle?'; };" |
4795 "var obj = new TestClass();"); | 5412 "var obj = new TestClass();"); |
4796 Local<Value> obj = env->Global()->Get(v8_str("obj")); | 5413 Local<Value> obj = |
5414 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked(); | |
4797 | 5415 |
4798 v8::TryCatch try_catch(isolate); | 5416 v8::TryCatch try_catch(isolate); |
4799 | 5417 |
4800 Local<Value> to_string_result = obj->ToString(isolate); | 5418 CHECK(obj->ToString(env.local()).IsEmpty()); |
4801 CHECK(to_string_result.IsEmpty()); | |
4802 CheckUncle(&try_catch); | 5419 CheckUncle(&try_catch); |
4803 | 5420 |
4804 Local<Value> to_number_result = obj->ToNumber(isolate); | 5421 CHECK(obj->ToNumber(env.local()).IsEmpty()); |
4805 CHECK(to_number_result.IsEmpty()); | |
4806 CheckUncle(&try_catch); | 5422 CheckUncle(&try_catch); |
4807 | 5423 |
4808 Local<Value> to_integer_result = obj->ToInteger(isolate); | 5424 CHECK(obj->ToInteger(env.local()).IsEmpty()); |
4809 CHECK(to_integer_result.IsEmpty()); | |
4810 CheckUncle(&try_catch); | 5425 CheckUncle(&try_catch); |
4811 | 5426 |
4812 Local<Value> to_uint32_result = obj->ToUint32(isolate); | 5427 CHECK(obj->ToUint32(env.local()).IsEmpty()); |
4813 CHECK(to_uint32_result.IsEmpty()); | |
4814 CheckUncle(&try_catch); | 5428 CheckUncle(&try_catch); |
4815 | 5429 |
4816 Local<Value> to_int32_result = obj->ToInt32(isolate); | 5430 CHECK(obj->ToInt32(env.local()).IsEmpty()); |
4817 CHECK(to_int32_result.IsEmpty()); | |
4818 CheckUncle(&try_catch); | 5431 CheckUncle(&try_catch); |
4819 | 5432 |
4820 Local<Value> to_object_result = v8::Undefined(isolate)->ToObject(isolate); | 5433 CHECK(v8::Undefined(isolate)->ToObject(env.local()).IsEmpty()); |
4821 CHECK(to_object_result.IsEmpty()); | |
4822 CHECK(try_catch.HasCaught()); | 5434 CHECK(try_catch.HasCaught()); |
4823 try_catch.Reset(); | 5435 try_catch.Reset(); |
4824 | 5436 |
4825 int32_t int32_value = obj->Int32Value(); | 5437 CHECK(obj->Int32Value(env.local()).IsNothing()); |
4826 CHECK_EQ(0, int32_value); | |
4827 CheckUncle(&try_catch); | 5438 CheckUncle(&try_catch); |
4828 | 5439 |
4829 uint32_t uint32_value = obj->Uint32Value(); | 5440 CHECK(obj->Uint32Value(env.local()).IsNothing()); |
4830 CHECK_EQ(0u, uint32_value); | |
4831 CheckUncle(&try_catch); | 5441 CheckUncle(&try_catch); |
4832 | 5442 |
4833 double number_value = obj->NumberValue(); | 5443 CHECK(obj->NumberValue(env.local()).IsNothing()); |
4834 CHECK(std::isnan(number_value)); | |
4835 CheckUncle(&try_catch); | 5444 CheckUncle(&try_catch); |
4836 | 5445 |
4837 int64_t integer_value = obj->IntegerValue(); | 5446 CHECK(obj->IntegerValue(env.local()).IsNothing()); |
4838 CHECK_EQ(0, integer_value); | |
4839 CheckUncle(&try_catch); | 5447 CheckUncle(&try_catch); |
4840 } | 5448 } |
4841 | 5449 |
4842 | 5450 |
4843 void ThrowFromC(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5451 void ThrowFromC(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4844 ApiTestFuzzer::Fuzz(); | 5452 ApiTestFuzzer::Fuzz(); |
4845 args.GetIsolate()->ThrowException(v8_str("konto")); | 5453 args.GetIsolate()->ThrowException(v8_str("konto")); |
4846 } | 5454 } |
4847 | 5455 |
4848 | 5456 |
4849 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5457 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4850 if (args.Length() < 1) { | 5458 if (args.Length() < 1) { |
4851 args.GetReturnValue().Set(false); | 5459 args.GetReturnValue().Set(false); |
4852 return; | 5460 return; |
4853 } | 5461 } |
4854 v8::HandleScope scope(args.GetIsolate()); | 5462 v8::HandleScope scope(args.GetIsolate()); |
4855 v8::TryCatch try_catch(args.GetIsolate()); | 5463 v8::TryCatch try_catch(args.GetIsolate()); |
4856 Local<Value> result = CompileRun(args[0]->ToString(args.GetIsolate())); | 5464 Local<Value> result = |
5465 CompileRun(args[0] | |
5466 ->ToString(args.GetIsolate()->GetCurrentContext()) | |
5467 .ToLocalChecked()); | |
4857 CHECK(!try_catch.HasCaught() || result.IsEmpty()); | 5468 CHECK(!try_catch.HasCaught() || result.IsEmpty()); |
4858 args.GetReturnValue().Set(try_catch.HasCaught()); | 5469 args.GetReturnValue().Set(try_catch.HasCaught()); |
4859 } | 5470 } |
4860 | 5471 |
4861 | 5472 |
4862 THREADED_TEST(APICatch) { | 5473 THREADED_TEST(APICatch) { |
4863 v8::Isolate* isolate = CcTest::isolate(); | 5474 v8::Isolate* isolate = CcTest::isolate(); |
4864 v8::HandleScope scope(isolate); | 5475 v8::HandleScope scope(isolate); |
4865 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5476 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
4866 templ->Set(v8_str("ThrowFromC"), | 5477 templ->Set(v8_str("ThrowFromC"), |
4867 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 5478 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
4868 LocalContext context(0, templ); | 5479 LocalContext context(0, templ); |
4869 CompileRun( | 5480 CompileRun( |
4870 "var thrown = false;" | 5481 "var thrown = false;" |
4871 "try {" | 5482 "try {" |
4872 " ThrowFromC();" | 5483 " ThrowFromC();" |
4873 "} catch (e) {" | 5484 "} catch (e) {" |
4874 " thrown = true;" | 5485 " thrown = true;" |
4875 "}"); | 5486 "}"); |
4876 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); | 5487 Local<Value> thrown = context->Global() |
4877 CHECK(thrown->BooleanValue()); | 5488 ->Get(context.local(), v8_str("thrown")) |
5489 .ToLocalChecked(); | |
5490 CHECK(thrown->BooleanValue(context.local()).FromJust()); | |
4878 } | 5491 } |
4879 | 5492 |
4880 | 5493 |
4881 THREADED_TEST(APIThrowTryCatch) { | 5494 THREADED_TEST(APIThrowTryCatch) { |
4882 v8::Isolate* isolate = CcTest::isolate(); | 5495 v8::Isolate* isolate = CcTest::isolate(); |
4883 v8::HandleScope scope(isolate); | 5496 v8::HandleScope scope(isolate); |
4884 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5497 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
4885 templ->Set(v8_str("ThrowFromC"), | 5498 templ->Set(v8_str("ThrowFromC"), |
4886 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 5499 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
4887 LocalContext context(0, templ); | 5500 LocalContext context(0, templ); |
(...skipping 21 matching lines...) Expand all Loading... | |
4909 " try {" | 5522 " try {" |
4910 " CCatcher('throw 7;');" | 5523 " CCatcher('throw 7;');" |
4911 " } finally {" | 5524 " } finally {" |
4912 " }" | 5525 " }" |
4913 "} catch (e) {" | 5526 "} catch (e) {" |
4914 "}"); | 5527 "}"); |
4915 CHECK(result->IsTrue()); | 5528 CHECK(result->IsTrue()); |
4916 } | 5529 } |
4917 | 5530 |
4918 | 5531 |
4919 static void check_reference_error_message(v8::Handle<v8::Message> message, | 5532 static void check_reference_error_message(v8::Local<v8::Message> message, |
4920 v8::Handle<v8::Value> data) { | 5533 v8::Local<v8::Value> data) { |
4921 const char* reference_error = "Uncaught ReferenceError: asdf is not defined"; | 5534 const char* reference_error = "Uncaught ReferenceError: asdf is not defined"; |
4922 CHECK(message->Get()->Equals(v8_str(reference_error))); | 5535 CHECK(message->Get() |
5536 ->Equals(CcTest::isolate()->GetCurrentContext(), | |
5537 v8_str(reference_error)) | |
5538 .FromJust()); | |
4923 } | 5539 } |
4924 | 5540 |
4925 | 5541 |
4926 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5542 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4927 ApiTestFuzzer::Fuzz(); | 5543 ApiTestFuzzer::Fuzz(); |
4928 CHECK(false); | 5544 CHECK(false); |
4929 } | 5545 } |
4930 | 5546 |
4931 | 5547 |
4932 // Test that overwritten methods are not invoked on uncaught exception | 5548 // Test that overwritten methods are not invoked on uncaught exception |
4933 // formatting. However, they are invoked when performing normal error | 5549 // formatting. However, they are invoked when performing normal error |
4934 // string conversions. | 5550 // string conversions. |
4935 TEST(APIThrowMessageOverwrittenToString) { | 5551 TEST(APIThrowMessageOverwrittenToString) { |
4936 v8::Isolate* isolate = CcTest::isolate(); | 5552 v8::Isolate* isolate = CcTest::isolate(); |
4937 v8::HandleScope scope(isolate); | 5553 v8::HandleScope scope(isolate); |
4938 v8::V8::AddMessageListener(check_reference_error_message); | 5554 isolate->AddMessageListener(check_reference_error_message); |
4939 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5555 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
4940 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail)); | 5556 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail)); |
4941 LocalContext context(NULL, templ); | 5557 LocalContext context(NULL, templ); |
4942 CompileRun("asdf;"); | 5558 CompileRun("asdf;"); |
4943 CompileRun( | 5559 CompileRun( |
4944 "var limit = {};" | 5560 "var limit = {};" |
4945 "limit.valueOf = fail;" | 5561 "limit.valueOf = fail;" |
4946 "Error.stackTraceLimit = limit;"); | 5562 "Error.stackTraceLimit = limit;"); |
4947 CompileRun("asdf"); | 5563 CompileRun("asdf"); |
4948 CompileRun("Array.prototype.pop = fail;"); | 5564 CompileRun("Array.prototype.pop = fail;"); |
4949 CompileRun("Object.prototype.hasOwnProperty = fail;"); | 5565 CompileRun("Object.prototype.hasOwnProperty = fail;"); |
4950 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); | 5566 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); |
4951 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); | 5567 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); |
4952 CompileRun("String.prototype.toString = function f() { return 'Yikes'; }"); | 5568 CompileRun("String.prototype.toString = function f() { return 'Yikes'; }"); |
4953 CompileRun( | 5569 CompileRun( |
4954 "ReferenceError.prototype.toString =" | 5570 "ReferenceError.prototype.toString =" |
4955 " function() { return 'Whoops' }"); | 5571 " function() { return 'Whoops' }"); |
4956 CompileRun("asdf;"); | 5572 CompileRun("asdf;"); |
4957 CompileRun("ReferenceError.prototype.constructor.name = void 0;"); | 5573 CompileRun("ReferenceError.prototype.constructor.name = void 0;"); |
4958 CompileRun("asdf;"); | 5574 CompileRun("asdf;"); |
4959 CompileRun("ReferenceError.prototype.constructor = void 0;"); | 5575 CompileRun("ReferenceError.prototype.constructor = void 0;"); |
4960 CompileRun("asdf;"); | 5576 CompileRun("asdf;"); |
4961 CompileRun("ReferenceError.prototype.__proto__ = new Object();"); | 5577 CompileRun("ReferenceError.prototype.__proto__ = new Object();"); |
4962 CompileRun("asdf;"); | 5578 CompileRun("asdf;"); |
4963 CompileRun("ReferenceError.prototype = new Object();"); | 5579 CompileRun("ReferenceError.prototype = new Object();"); |
4964 CompileRun("asdf;"); | 5580 CompileRun("asdf;"); |
4965 v8::Handle<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }"); | 5581 v8::Local<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }"); |
4966 CHECK(string->Equals(v8_str("Whoops"))); | 5582 CHECK(string->Equals(context.local(), v8_str("Whoops")).FromJust()); |
4967 CompileRun( | 5583 CompileRun( |
4968 "ReferenceError.prototype.constructor = new Object();" | 5584 "ReferenceError.prototype.constructor = new Object();" |
4969 "ReferenceError.prototype.constructor.name = 1;" | 5585 "ReferenceError.prototype.constructor.name = 1;" |
4970 "Number.prototype.toString = function() { return 'Whoops'; };" | 5586 "Number.prototype.toString = function() { return 'Whoops'; };" |
4971 "ReferenceError.prototype.toString = Object.prototype.toString;"); | 5587 "ReferenceError.prototype.toString = Object.prototype.toString;"); |
4972 CompileRun("asdf;"); | 5588 CompileRun("asdf;"); |
4973 v8::V8::RemoveMessageListeners(check_reference_error_message); | 5589 isolate->RemoveMessageListeners(check_reference_error_message); |
4974 } | 5590 } |
4975 | 5591 |
4976 | 5592 |
4977 static void check_custom_error_tostring(v8::Handle<v8::Message> message, | 5593 static void check_custom_error_tostring(v8::Local<v8::Message> message, |
4978 v8::Handle<v8::Value> data) { | 5594 v8::Local<v8::Value> data) { |
4979 const char* uncaught_error = "Uncaught MyError toString"; | 5595 const char* uncaught_error = "Uncaught MyError toString"; |
4980 CHECK(message->Get()->Equals(v8_str(uncaught_error))); | 5596 CHECK(message->Get() |
5597 ->Equals(CcTest::isolate()->GetCurrentContext(), | |
5598 v8_str(uncaught_error)) | |
5599 .FromJust()); | |
4981 } | 5600 } |
4982 | 5601 |
4983 | 5602 |
4984 TEST(CustomErrorToString) { | 5603 TEST(CustomErrorToString) { |
4985 LocalContext context; | 5604 LocalContext context; |
4986 v8::HandleScope scope(context->GetIsolate()); | 5605 v8::HandleScope scope(context->GetIsolate()); |
4987 v8::V8::AddMessageListener(check_custom_error_tostring); | 5606 context->GetIsolate()->AddMessageListener(check_custom_error_tostring); |
4988 CompileRun( | 5607 CompileRun( |
4989 "function MyError(name, message) { " | 5608 "function MyError(name, message) { " |
4990 " this.name = name; " | 5609 " this.name = name; " |
4991 " this.message = message; " | 5610 " this.message = message; " |
4992 "} " | 5611 "} " |
4993 "MyError.prototype = Object.create(Error.prototype); " | 5612 "MyError.prototype = Object.create(Error.prototype); " |
4994 "MyError.prototype.toString = function() { " | 5613 "MyError.prototype.toString = function() { " |
4995 " return 'MyError toString'; " | 5614 " return 'MyError toString'; " |
4996 "}; " | 5615 "}; " |
4997 "throw new MyError('my name', 'my message'); "); | 5616 "throw new MyError('my name', 'my message'); "); |
4998 v8::V8::RemoveMessageListeners(check_custom_error_tostring); | 5617 context->GetIsolate()->RemoveMessageListeners(check_custom_error_tostring); |
4999 } | 5618 } |
5000 | 5619 |
5001 | 5620 |
5002 static void check_custom_error_message(v8::Handle<v8::Message> message, | 5621 static void check_custom_error_message(v8::Local<v8::Message> message, |
5003 v8::Handle<v8::Value> data) { | 5622 v8::Local<v8::Value> data) { |
5004 const char* uncaught_error = "Uncaught MyError: my message"; | 5623 const char* uncaught_error = "Uncaught MyError: my message"; |
5005 printf("%s\n", *v8::String::Utf8Value(message->Get())); | 5624 printf("%s\n", *v8::String::Utf8Value(message->Get())); |
5006 CHECK(message->Get()->Equals(v8_str(uncaught_error))); | 5625 CHECK(message->Get() |
5626 ->Equals(CcTest::isolate()->GetCurrentContext(), | |
5627 v8_str(uncaught_error)) | |
5628 .FromJust()); | |
5007 } | 5629 } |
5008 | 5630 |
5009 | 5631 |
5010 TEST(CustomErrorMessage) { | 5632 TEST(CustomErrorMessage) { |
5011 LocalContext context; | 5633 LocalContext context; |
5012 v8::HandleScope scope(context->GetIsolate()); | 5634 v8::HandleScope scope(context->GetIsolate()); |
5013 v8::V8::AddMessageListener(check_custom_error_message); | 5635 context->GetIsolate()->AddMessageListener(check_custom_error_message); |
5014 | 5636 |
5015 // Handlebars. | 5637 // Handlebars. |
5016 CompileRun( | 5638 CompileRun( |
5017 "function MyError(msg) { " | 5639 "function MyError(msg) { " |
5018 " this.name = 'MyError'; " | 5640 " this.name = 'MyError'; " |
5019 " this.message = msg; " | 5641 " this.message = msg; " |
5020 "} " | 5642 "} " |
5021 "MyError.prototype = new Error(); " | 5643 "MyError.prototype = new Error(); " |
5022 "throw new MyError('my message'); "); | 5644 "throw new MyError('my message'); "); |
5023 | 5645 |
(...skipping 15 matching lines...) Expand all Loading... | |
5039 | 5661 |
5040 // Object.create. | 5662 // Object.create. |
5041 CompileRun( | 5663 CompileRun( |
5042 "function MyError(msg) { " | 5664 "function MyError(msg) { " |
5043 " this.name = 'MyError'; " | 5665 " this.name = 'MyError'; " |
5044 " this.message = msg; " | 5666 " this.message = msg; " |
5045 "} " | 5667 "} " |
5046 "MyError.prototype = Object.create(Error.prototype); " | 5668 "MyError.prototype = Object.create(Error.prototype); " |
5047 "throw new MyError('my message'); "); | 5669 "throw new MyError('my message'); "); |
5048 | 5670 |
5049 v8::V8::RemoveMessageListeners(check_custom_error_message); | 5671 context->GetIsolate()->RemoveMessageListeners(check_custom_error_message); |
5050 } | 5672 } |
5051 | 5673 |
5052 | 5674 |
5053 static void check_custom_rethrowing_message(v8::Handle<v8::Message> message, | 5675 static void check_custom_rethrowing_message(v8::Local<v8::Message> message, |
5054 v8::Handle<v8::Value> data) { | 5676 v8::Local<v8::Value> data) { |
5055 const char* uncaught_error = "Uncaught exception"; | 5677 const char* uncaught_error = "Uncaught exception"; |
5056 CHECK(message->Get()->Equals(v8_str(uncaught_error))); | 5678 CHECK(message->Get() |
5679 ->Equals(CcTest::isolate()->GetCurrentContext(), | |
5680 v8_str(uncaught_error)) | |
5681 .FromJust()); | |
5057 } | 5682 } |
5058 | 5683 |
5059 | 5684 |
5060 TEST(CustomErrorRethrowsOnToString) { | 5685 TEST(CustomErrorRethrowsOnToString) { |
5061 LocalContext context; | 5686 LocalContext context; |
5062 v8::HandleScope scope(context->GetIsolate()); | 5687 v8::HandleScope scope(context->GetIsolate()); |
5063 v8::V8::AddMessageListener(check_custom_rethrowing_message); | 5688 context->GetIsolate()->AddMessageListener(check_custom_rethrowing_message); |
5064 | 5689 |
5065 CompileRun( | 5690 CompileRun( |
5066 "var e = { toString: function() { throw e; } };" | 5691 "var e = { toString: function() { throw e; } };" |
5067 "try { throw e; } finally {}"); | 5692 "try { throw e; } finally {}"); |
5068 | 5693 |
5069 v8::V8::RemoveMessageListeners(check_custom_rethrowing_message); | 5694 context->GetIsolate()->RemoveMessageListeners( |
5695 check_custom_rethrowing_message); | |
5070 } | 5696 } |
5071 | 5697 |
5072 | 5698 |
5073 static void receive_message(v8::Handle<v8::Message> message, | 5699 static void receive_message(v8::Local<v8::Message> message, |
5074 v8::Handle<v8::Value> data) { | 5700 v8::Local<v8::Value> data) { |
5075 message->Get(); | 5701 message->Get(); |
5076 message_received = true; | 5702 message_received = true; |
5077 } | 5703 } |
5078 | 5704 |
5079 | 5705 |
5080 TEST(APIThrowMessage) { | 5706 TEST(APIThrowMessage) { |
5081 message_received = false; | 5707 message_received = false; |
5082 v8::Isolate* isolate = CcTest::isolate(); | 5708 v8::Isolate* isolate = CcTest::isolate(); |
5083 v8::HandleScope scope(isolate); | 5709 v8::HandleScope scope(isolate); |
5084 v8::V8::AddMessageListener(receive_message); | 5710 isolate->AddMessageListener(receive_message); |
5085 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5711 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5086 templ->Set(v8_str("ThrowFromC"), | 5712 templ->Set(v8_str("ThrowFromC"), |
5087 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 5713 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
5088 LocalContext context(0, templ); | 5714 LocalContext context(0, templ); |
5089 CompileRun("ThrowFromC();"); | 5715 CompileRun("ThrowFromC();"); |
5090 CHECK(message_received); | 5716 CHECK(message_received); |
5091 v8::V8::RemoveMessageListeners(receive_message); | 5717 isolate->RemoveMessageListeners(receive_message); |
5092 } | 5718 } |
5093 | 5719 |
5094 | 5720 |
5095 TEST(APIThrowMessageAndVerboseTryCatch) { | 5721 TEST(APIThrowMessageAndVerboseTryCatch) { |
5096 message_received = false; | 5722 message_received = false; |
5097 v8::Isolate* isolate = CcTest::isolate(); | 5723 v8::Isolate* isolate = CcTest::isolate(); |
5098 v8::HandleScope scope(isolate); | 5724 v8::HandleScope scope(isolate); |
5099 v8::V8::AddMessageListener(receive_message); | 5725 isolate->AddMessageListener(receive_message); |
5100 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5726 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5101 templ->Set(v8_str("ThrowFromC"), | 5727 templ->Set(v8_str("ThrowFromC"), |
5102 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 5728 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
5103 LocalContext context(0, templ); | 5729 LocalContext context(0, templ); |
5104 v8::TryCatch try_catch(isolate); | 5730 v8::TryCatch try_catch(isolate); |
5105 try_catch.SetVerbose(true); | 5731 try_catch.SetVerbose(true); |
5106 Local<Value> result = CompileRun("ThrowFromC();"); | 5732 Local<Value> result = CompileRun("ThrowFromC();"); |
5107 CHECK(try_catch.HasCaught()); | 5733 CHECK(try_catch.HasCaught()); |
5108 CHECK(result.IsEmpty()); | 5734 CHECK(result.IsEmpty()); |
5109 CHECK(message_received); | 5735 CHECK(message_received); |
5110 v8::V8::RemoveMessageListeners(receive_message); | 5736 isolate->RemoveMessageListeners(receive_message); |
5111 } | 5737 } |
5112 | 5738 |
5113 | 5739 |
5114 TEST(APIStackOverflowAndVerboseTryCatch) { | 5740 TEST(APIStackOverflowAndVerboseTryCatch) { |
5115 message_received = false; | 5741 message_received = false; |
5116 LocalContext context; | 5742 LocalContext context; |
5117 v8::HandleScope scope(context->GetIsolate()); | 5743 v8::HandleScope scope(context->GetIsolate()); |
5118 v8::V8::AddMessageListener(receive_message); | 5744 context->GetIsolate()->AddMessageListener(receive_message); |
5119 v8::TryCatch try_catch(context->GetIsolate()); | 5745 v8::TryCatch try_catch(context->GetIsolate()); |
5120 try_catch.SetVerbose(true); | 5746 try_catch.SetVerbose(true); |
5121 Local<Value> result = CompileRun("function foo() { foo(); } foo();"); | 5747 Local<Value> result = CompileRun("function foo() { foo(); } foo();"); |
5122 CHECK(try_catch.HasCaught()); | 5748 CHECK(try_catch.HasCaught()); |
5123 CHECK(result.IsEmpty()); | 5749 CHECK(result.IsEmpty()); |
5124 CHECK(message_received); | 5750 CHECK(message_received); |
5125 v8::V8::RemoveMessageListeners(receive_message); | 5751 context->GetIsolate()->RemoveMessageListeners(receive_message); |
5126 } | 5752 } |
5127 | 5753 |
5128 | 5754 |
5129 THREADED_TEST(ExternalScriptException) { | 5755 THREADED_TEST(ExternalScriptException) { |
5130 v8::Isolate* isolate = CcTest::isolate(); | 5756 v8::Isolate* isolate = CcTest::isolate(); |
5131 v8::HandleScope scope(isolate); | 5757 v8::HandleScope scope(isolate); |
5132 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5758 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5133 templ->Set(v8_str("ThrowFromC"), | 5759 templ->Set(v8_str("ThrowFromC"), |
5134 v8::FunctionTemplate::New(isolate, ThrowFromC)); | 5760 v8::FunctionTemplate::New(isolate, ThrowFromC)); |
5135 LocalContext context(0, templ); | 5761 LocalContext context(0, templ); |
5136 | 5762 |
5137 v8::TryCatch try_catch(isolate); | 5763 v8::TryCatch try_catch(isolate); |
5138 Local<Value> result = CompileRun("ThrowFromC(); throw 'panama';"); | 5764 Local<Value> result = CompileRun("ThrowFromC(); throw 'panama';"); |
5139 CHECK(result.IsEmpty()); | 5765 CHECK(result.IsEmpty()); |
5140 CHECK(try_catch.HasCaught()); | 5766 CHECK(try_catch.HasCaught()); |
5141 String::Utf8Value exception_value(try_catch.Exception()); | 5767 String::Utf8Value exception_value(try_catch.Exception()); |
5142 CHECK_EQ(0, strcmp("konto", *exception_value)); | 5768 CHECK_EQ(0, strcmp("konto", *exception_value)); |
5143 } | 5769 } |
5144 | 5770 |
5145 | 5771 |
5146 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5772 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5147 ApiTestFuzzer::Fuzz(); | 5773 ApiTestFuzzer::Fuzz(); |
5148 CHECK_EQ(4, args.Length()); | 5774 CHECK_EQ(4, args.Length()); |
5149 int count = args[0]->Int32Value(); | 5775 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
5150 int cInterval = args[2]->Int32Value(); | 5776 int count = args[0]->Int32Value(context).FromJust(); |
5777 int cInterval = args[2]->Int32Value(context).FromJust(); | |
5151 if (count == 0) { | 5778 if (count == 0) { |
5152 args.GetIsolate()->ThrowException(v8_str("FromC")); | 5779 args.GetIsolate()->ThrowException(v8_str("FromC")); |
5153 return; | 5780 return; |
5154 } else { | 5781 } else { |
5155 Local<v8::Object> global = args.GetIsolate()->GetCurrentContext()->Global(); | 5782 Local<v8::Object> global = context->Global(); |
5156 Local<Value> fun = global->Get(v8_str("JSThrowCountDown")); | 5783 Local<Value> fun = |
5157 v8::Handle<Value> argv[] = {v8_num(count - 1), args[1], args[2], args[3]}; | 5784 global->Get(context, v8_str("JSThrowCountDown")).ToLocalChecked(); |
5785 v8::Local<Value> argv[] = {v8_num(count - 1), args[1], args[2], args[3]}; | |
5158 if (count % cInterval == 0) { | 5786 if (count % cInterval == 0) { |
5159 v8::TryCatch try_catch(args.GetIsolate()); | 5787 v8::TryCatch try_catch(args.GetIsolate()); |
5160 Local<Value> result = fun.As<Function>()->Call(global, 4, argv); | 5788 Local<Value> result = fun.As<Function>() |
5161 int expected = args[3]->Int32Value(); | 5789 ->Call(context, global, 4, argv) |
5790 .FromMaybe(Local<Value>()); | |
5791 int expected = args[3]->Int32Value(context).FromJust(); | |
5162 if (try_catch.HasCaught()) { | 5792 if (try_catch.HasCaught()) { |
5163 CHECK_EQ(expected, count); | 5793 CHECK_EQ(expected, count); |
5164 CHECK(result.IsEmpty()); | 5794 CHECK(result.IsEmpty()); |
5165 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); | 5795 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); |
5166 } else { | 5796 } else { |
5167 CHECK_NE(expected, count); | 5797 CHECK_NE(expected, count); |
5168 } | 5798 } |
5169 args.GetReturnValue().Set(result); | 5799 args.GetReturnValue().Set(result); |
5170 return; | 5800 return; |
5171 } else { | 5801 } else { |
5172 args.GetReturnValue().Set(fun.As<Function>()->Call(global, 4, argv)); | 5802 args.GetReturnValue().Set(fun.As<Function>() |
5803 ->Call(context, global, 4, argv) | |
5804 .FromMaybe(v8::Local<v8::Value>())); | |
5173 return; | 5805 return; |
5174 } | 5806 } |
5175 } | 5807 } |
5176 } | 5808 } |
5177 | 5809 |
5178 | 5810 |
5179 void JSCheck(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5811 void JSCheck(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5180 ApiTestFuzzer::Fuzz(); | 5812 ApiTestFuzzer::Fuzz(); |
5181 CHECK_EQ(3, args.Length()); | 5813 CHECK_EQ(3, args.Length()); |
5182 bool equality = args[0]->BooleanValue(); | 5814 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
5183 int count = args[1]->Int32Value(); | 5815 bool equality = args[0]->BooleanValue(context).FromJust(); |
5184 int expected = args[2]->Int32Value(); | 5816 int count = args[1]->Int32Value(context).FromJust(); |
5817 int expected = args[2]->Int32Value(context).FromJust(); | |
5185 if (equality) { | 5818 if (equality) { |
5186 CHECK_EQ(count, expected); | 5819 CHECK_EQ(count, expected); |
5187 } else { | 5820 } else { |
5188 CHECK_NE(count, expected); | 5821 CHECK_NE(count, expected); |
5189 } | 5822 } |
5190 } | 5823 } |
5191 | 5824 |
5192 | 5825 |
5193 THREADED_TEST(EvalInTryFinally) { | 5826 THREADED_TEST(EvalInTryFinally) { |
5194 LocalContext context; | 5827 LocalContext context; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5245 " expected);" | 5878 " expected);" |
5246 " check(false, count, expected);" | 5879 " check(false, count, expected);" |
5247 " return value;" | 5880 " return value;" |
5248 " } catch (e) {" | 5881 " } catch (e) {" |
5249 " check(true, count, expected);" | 5882 " check(true, count, expected);" |
5250 " }" | 5883 " }" |
5251 " } else {" | 5884 " } else {" |
5252 " return CThrowCountDown(count - 1, jsInterval, cInterval, expected);" | 5885 " return CThrowCountDown(count - 1, jsInterval, cInterval, expected);" |
5253 " }" | 5886 " }" |
5254 "}"); | 5887 "}"); |
5255 Local<Function> fun = | 5888 Local<Function> fun = Local<Function>::Cast( |
5256 Local<Function>::Cast(context->Global()->Get(v8_str("JSThrowCountDown"))); | 5889 context->Global() |
5890 ->Get(context.local(), v8_str("JSThrowCountDown")) | |
5891 .ToLocalChecked()); | |
5257 | 5892 |
5258 const int argc = 4; | 5893 const int argc = 4; |
5259 // count jsInterval cInterval expected | 5894 // count jsInterval cInterval expected |
5260 | 5895 |
5261 // *JS[4] *C[3] @JS[2] C[1] JS[0] | 5896 // *JS[4] *C[3] @JS[2] C[1] JS[0] |
5262 v8::Handle<Value> a0[argc] = {v8_num(4), v8_num(2), v8_num(3), v8_num(2)}; | 5897 v8::Local<Value> a0[argc] = {v8_num(4), v8_num(2), v8_num(3), v8_num(2)}; |
5263 fun->Call(fun, argc, a0); | 5898 fun->Call(context.local(), fun, argc, a0).ToLocalChecked(); |
5264 | 5899 |
5265 // JS[5] *C[4] JS[3] @C[2] JS[1] C[0] | 5900 // JS[5] *C[4] JS[3] @C[2] JS[1] C[0] |
5266 v8::Handle<Value> a1[argc] = {v8_num(5), v8_num(6), v8_num(1), v8_num(2)}; | 5901 v8::Local<Value> a1[argc] = {v8_num(5), v8_num(6), v8_num(1), v8_num(2)}; |
5267 fun->Call(fun, argc, a1); | 5902 fun->Call(context.local(), fun, argc, a1).ToLocalChecked(); |
5268 | 5903 |
5269 // JS[6] @C[5] JS[4] C[3] JS[2] C[1] JS[0] | 5904 // JS[6] @C[5] JS[4] C[3] JS[2] C[1] JS[0] |
5270 v8::Handle<Value> a2[argc] = {v8_num(6), v8_num(7), v8_num(5), v8_num(5)}; | 5905 v8::Local<Value> a2[argc] = {v8_num(6), v8_num(7), v8_num(5), v8_num(5)}; |
5271 fun->Call(fun, argc, a2); | 5906 fun->Call(context.local(), fun, argc, a2).ToLocalChecked(); |
5272 | 5907 |
5273 // @JS[6] C[5] JS[4] C[3] JS[2] C[1] JS[0] | 5908 // @JS[6] C[5] JS[4] C[3] JS[2] C[1] JS[0] |
5274 v8::Handle<Value> a3[argc] = {v8_num(6), v8_num(6), v8_num(7), v8_num(6)}; | 5909 v8::Local<Value> a3[argc] = {v8_num(6), v8_num(6), v8_num(7), v8_num(6)}; |
5275 fun->Call(fun, argc, a3); | 5910 fun->Call(context.local(), fun, argc, a3).ToLocalChecked(); |
5276 | 5911 |
5277 // JS[6] *C[5] @JS[4] C[3] JS[2] C[1] JS[0] | 5912 // JS[6] *C[5] @JS[4] C[3] JS[2] C[1] JS[0] |
5278 v8::Handle<Value> a4[argc] = {v8_num(6), v8_num(4), v8_num(5), v8_num(4)}; | 5913 v8::Local<Value> a4[argc] = {v8_num(6), v8_num(4), v8_num(5), v8_num(4)}; |
5279 fun->Call(fun, argc, a4); | 5914 fun->Call(context.local(), fun, argc, a4).ToLocalChecked(); |
5280 | 5915 |
5281 // JS[6] C[5] *JS[4] @C[3] JS[2] C[1] JS[0] | 5916 // JS[6] C[5] *JS[4] @C[3] JS[2] C[1] JS[0] |
5282 v8::Handle<Value> a5[argc] = {v8_num(6), v8_num(4), v8_num(3), v8_num(3)}; | 5917 v8::Local<Value> a5[argc] = {v8_num(6), v8_num(4), v8_num(3), v8_num(3)}; |
5283 fun->Call(fun, argc, a5); | 5918 fun->Call(context.local(), fun, argc, a5).ToLocalChecked(); |
5284 } | 5919 } |
5285 | 5920 |
5286 | 5921 |
5287 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5922 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5288 ApiTestFuzzer::Fuzz(); | 5923 ApiTestFuzzer::Fuzz(); |
5289 CHECK_EQ(1, args.Length()); | 5924 CHECK_EQ(1, args.Length()); |
5290 args.GetIsolate()->ThrowException(args[0]); | 5925 args.GetIsolate()->ThrowException(args[0]); |
5291 } | 5926 } |
5292 | 5927 |
5293 | 5928 |
5294 THREADED_TEST(ThrowValues) { | 5929 THREADED_TEST(ThrowValues) { |
5295 v8::Isolate* isolate = CcTest::isolate(); | 5930 v8::Isolate* isolate = CcTest::isolate(); |
5296 v8::HandleScope scope(isolate); | 5931 v8::HandleScope scope(isolate); |
5297 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 5932 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5298 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue)); | 5933 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue)); |
5299 LocalContext context(0, templ); | 5934 LocalContext context(0, templ); |
5300 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( | 5935 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast( |
5301 "function Run(obj) {" | 5936 CompileRun("function Run(obj) {" |
5302 " try {" | 5937 " try {" |
5303 " Throw(obj);" | 5938 " Throw(obj);" |
5304 " } catch (e) {" | 5939 " } catch (e) {" |
5305 " return e;" | 5940 " return e;" |
5306 " }" | 5941 " }" |
5307 " return 'no exception';" | 5942 " return 'no exception';" |
5308 "}" | 5943 "}" |
5309 "[Run('str'), Run(1), Run(0), Run(null), Run(void 0)];")); | 5944 "[Run('str'), Run(1), Run(0), Run(null), Run(void 0)];")); |
5310 CHECK_EQ(5u, result->Length()); | 5945 CHECK_EQ(5u, result->Length()); |
5311 CHECK(result->Get(v8::Integer::New(isolate, 0))->IsString()); | 5946 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 0)) |
5312 CHECK(result->Get(v8::Integer::New(isolate, 1))->IsNumber()); | 5947 .ToLocalChecked() |
5313 CHECK_EQ(1, result->Get(v8::Integer::New(isolate, 1))->Int32Value()); | 5948 ->IsString()); |
5314 CHECK(result->Get(v8::Integer::New(isolate, 2))->IsNumber()); | 5949 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 1)) |
5315 CHECK_EQ(0, result->Get(v8::Integer::New(isolate, 2))->Int32Value()); | 5950 .ToLocalChecked() |
5316 CHECK(result->Get(v8::Integer::New(isolate, 3))->IsNull()); | 5951 ->IsNumber()); |
5317 CHECK(result->Get(v8::Integer::New(isolate, 4))->IsUndefined()); | 5952 CHECK_EQ(1, result->Get(context.local(), v8::Integer::New(isolate, 1)) |
5953 .ToLocalChecked() | |
5954 ->Int32Value(context.local()) | |
5955 .FromJust()); | |
5956 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5957 .ToLocalChecked() | |
5958 ->IsNumber()); | |
5959 CHECK_EQ(0, result->Get(context.local(), v8::Integer::New(isolate, 2)) | |
5960 .ToLocalChecked() | |
5961 ->Int32Value(context.local()) | |
5962 .FromJust()); | |
5963 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 3)) | |
5964 .ToLocalChecked() | |
5965 ->IsNull()); | |
5966 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 4)) | |
5967 .ToLocalChecked() | |
5968 ->IsUndefined()); | |
5318 } | 5969 } |
5319 | 5970 |
5320 | 5971 |
5321 THREADED_TEST(CatchZero) { | 5972 THREADED_TEST(CatchZero) { |
5322 LocalContext context; | 5973 LocalContext context; |
5323 v8::HandleScope scope(context->GetIsolate()); | 5974 v8::HandleScope scope(context->GetIsolate()); |
5324 v8::TryCatch try_catch(context->GetIsolate()); | 5975 v8::TryCatch try_catch(context->GetIsolate()); |
5325 CHECK(!try_catch.HasCaught()); | 5976 CHECK(!try_catch.HasCaught()); |
5326 CompileRun("throw 10"); | 5977 CompileRun("throw 10"); |
5327 CHECK(try_catch.HasCaught()); | 5978 CHECK(try_catch.HasCaught()); |
5328 CHECK_EQ(10, try_catch.Exception()->Int32Value()); | 5979 CHECK_EQ(10, try_catch.Exception()->Int32Value(context.local()).FromJust()); |
5329 try_catch.Reset(); | 5980 try_catch.Reset(); |
5330 CHECK(!try_catch.HasCaught()); | 5981 CHECK(!try_catch.HasCaught()); |
5331 CompileRun("throw 0"); | 5982 CompileRun("throw 0"); |
5332 CHECK(try_catch.HasCaught()); | 5983 CHECK(try_catch.HasCaught()); |
5333 CHECK_EQ(0, try_catch.Exception()->Int32Value()); | 5984 CHECK_EQ(0, try_catch.Exception()->Int32Value(context.local()).FromJust()); |
5334 } | 5985 } |
5335 | 5986 |
5336 | 5987 |
5337 THREADED_TEST(CatchExceptionFromWith) { | 5988 THREADED_TEST(CatchExceptionFromWith) { |
5338 LocalContext context; | 5989 LocalContext context; |
5339 v8::HandleScope scope(context->GetIsolate()); | 5990 v8::HandleScope scope(context->GetIsolate()); |
5340 v8::TryCatch try_catch(context->GetIsolate()); | 5991 v8::TryCatch try_catch(context->GetIsolate()); |
5341 CHECK(!try_catch.HasCaught()); | 5992 CHECK(!try_catch.HasCaught()); |
5342 CompileRun("var o = {}; with (o) { throw 42; }"); | 5993 CompileRun("var o = {}; with (o) { throw 42; }"); |
5343 CHECK(try_catch.HasCaught()); | 5994 CHECK(try_catch.HasCaught()); |
(...skipping 13 matching lines...) Expand all Loading... | |
5357 | 6008 |
5358 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { | 6009 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5359 v8::TryCatch try_catch(args.GetIsolate()); | 6010 v8::TryCatch try_catch(args.GetIsolate()); |
5360 } | 6011 } |
5361 | 6012 |
5362 | 6013 |
5363 THREADED_TEST(TryCatchAndFinally) { | 6014 THREADED_TEST(TryCatchAndFinally) { |
5364 LocalContext context; | 6015 LocalContext context; |
5365 v8::Isolate* isolate = context->GetIsolate(); | 6016 v8::Isolate* isolate = context->GetIsolate(); |
5366 v8::HandleScope scope(isolate); | 6017 v8::HandleScope scope(isolate); |
5367 context->Global()->Set( | 6018 CHECK(context->Global() |
5368 v8_str("native_with_try_catch"), | 6019 ->Set(context.local(), v8_str("native_with_try_catch"), |
5369 v8::FunctionTemplate::New(isolate, WithTryCatch)->GetFunction()); | 6020 v8::FunctionTemplate::New(isolate, WithTryCatch) |
6021 ->GetFunction(context.local()) | |
6022 .ToLocalChecked()) | |
6023 .FromJust()); | |
5370 v8::TryCatch try_catch(isolate); | 6024 v8::TryCatch try_catch(isolate); |
5371 CHECK(!try_catch.HasCaught()); | 6025 CHECK(!try_catch.HasCaught()); |
5372 CompileRun( | 6026 CompileRun( |
5373 "try {\n" | 6027 "try {\n" |
5374 " throw new Error('a');\n" | 6028 " throw new Error('a');\n" |
5375 "} finally {\n" | 6029 "} finally {\n" |
5376 " native_with_try_catch();\n" | 6030 " native_with_try_catch();\n" |
5377 "}\n"); | 6031 "}\n"); |
5378 CHECK(try_catch.HasCaught()); | 6032 CHECK(try_catch.HasCaught()); |
5379 } | 6033 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5423 v8::TryCatch try_catch(context->GetIsolate()); | 6077 v8::TryCatch try_catch(context->GetIsolate()); |
5424 TryCatchNested2Helper(5); | 6078 TryCatchNested2Helper(5); |
5425 CHECK(try_catch.HasCaught()); | 6079 CHECK(try_catch.HasCaught()); |
5426 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E2")); | 6080 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E2")); |
5427 } | 6081 } |
5428 } | 6082 } |
5429 | 6083 |
5430 | 6084 |
5431 void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) { | 6085 void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) { |
5432 CHECK(try_catch->HasCaught()); | 6086 CHECK(try_catch->HasCaught()); |
5433 Handle<Message> message = try_catch->Message(); | 6087 Local<Message> message = try_catch->Message(); |
5434 Handle<Value> resource = message->GetScriptOrigin().ResourceName(); | 6088 Local<Value> resource = message->GetScriptOrigin().ResourceName(); |
5435 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(resource), "inner")); | 6089 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(resource), "inner")); |
5436 CHECK_EQ(0, | 6090 CHECK_EQ(0, |
5437 strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a")); | 6091 strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a")); |
5438 CHECK_EQ(1, message->GetLineNumber()); | 6092 CHECK_EQ(1, message->GetLineNumber(CcTest::isolate()->GetCurrentContext()) |
5439 CHECK_EQ(0, message->GetStartColumn()); | 6093 .FromJust()); |
6094 CHECK_EQ(0, message->GetStartColumn(CcTest::isolate()->GetCurrentContext()) | |
6095 .FromJust()); | |
5440 } | 6096 } |
5441 | 6097 |
5442 | 6098 |
5443 void TryCatchMixedNestingHelper( | 6099 void TryCatchMixedNestingHelper( |
5444 const v8::FunctionCallbackInfo<v8::Value>& args) { | 6100 const v8::FunctionCallbackInfo<v8::Value>& args) { |
5445 ApiTestFuzzer::Fuzz(); | 6101 ApiTestFuzzer::Fuzz(); |
5446 v8::TryCatch try_catch(args.GetIsolate()); | 6102 v8::TryCatch try_catch(args.GetIsolate()); |
5447 CompileRunWithOrigin("throw new Error('a');\n", "inner", 0, 0); | 6103 CompileRunWithOrigin("throw new Error('a');\n", "inner", 0, 0); |
5448 CHECK(try_catch.HasCaught()); | 6104 CHECK(try_catch.HasCaught()); |
5449 TryCatchMixedNestingCheck(&try_catch); | 6105 TryCatchMixedNestingCheck(&try_catch); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5515 CompileRun("TryCatchNativeResetHelper();"); | 6171 CompileRun("TryCatchNativeResetHelper();"); |
5516 CHECK(!try_catch.HasCaught()); | 6172 CHECK(!try_catch.HasCaught()); |
5517 } | 6173 } |
5518 | 6174 |
5519 | 6175 |
5520 THREADED_TEST(Equality) { | 6176 THREADED_TEST(Equality) { |
5521 LocalContext context; | 6177 LocalContext context; |
5522 v8::Isolate* isolate = context->GetIsolate(); | 6178 v8::Isolate* isolate = context->GetIsolate(); |
5523 v8::HandleScope scope(context->GetIsolate()); | 6179 v8::HandleScope scope(context->GetIsolate()); |
5524 // Check that equality works at all before relying on CHECK_EQ | 6180 // Check that equality works at all before relying on CHECK_EQ |
5525 CHECK(v8_str("a")->Equals(v8_str("a"))); | 6181 CHECK(v8_str("a")->Equals(context.local(), v8_str("a")).FromJust()); |
5526 CHECK(!v8_str("a")->Equals(v8_str("b"))); | 6182 CHECK(!v8_str("a")->Equals(context.local(), v8_str("b")).FromJust()); |
5527 | 6183 |
5528 CHECK(v8_str("a")->Equals(v8_str("a"))); | 6184 CHECK(v8_str("a")->Equals(context.local(), v8_str("a")).FromJust()); |
5529 CHECK(!v8_str("a")->Equals(v8_str("b"))); | 6185 CHECK(!v8_str("a")->Equals(context.local(), v8_str("b")).FromJust()); |
5530 CHECK(v8_num(1)->Equals(v8_num(1))); | 6186 CHECK(v8_num(1)->Equals(context.local(), v8_num(1)).FromJust()); |
5531 CHECK(v8_num(1.00)->Equals(v8_num(1))); | 6187 CHECK(v8_num(1.00)->Equals(context.local(), v8_num(1)).FromJust()); |
5532 CHECK(!v8_num(1)->Equals(v8_num(2))); | 6188 CHECK(!v8_num(1)->Equals(context.local(), v8_num(2)).FromJust()); |
5533 | 6189 |
5534 // Assume String is not internalized. | 6190 // Assume String is not internalized. |
5535 CHECK(v8_str("a")->StrictEquals(v8_str("a"))); | 6191 CHECK(v8_str("a")->StrictEquals(v8_str("a"))); |
5536 CHECK(!v8_str("a")->StrictEquals(v8_str("b"))); | 6192 CHECK(!v8_str("a")->StrictEquals(v8_str("b"))); |
5537 CHECK(!v8_str("5")->StrictEquals(v8_num(5))); | 6193 CHECK(!v8_str("5")->StrictEquals(v8_num(5))); |
5538 CHECK(v8_num(1)->StrictEquals(v8_num(1))); | 6194 CHECK(v8_num(1)->StrictEquals(v8_num(1))); |
5539 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); | 6195 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); |
5540 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); | 6196 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); |
5541 Local<Value> not_a_number = v8_num(std::numeric_limits<double>::quiet_NaN()); | 6197 Local<Value> not_a_number = v8_num(std::numeric_limits<double>::quiet_NaN()); |
5542 CHECK(!not_a_number->StrictEquals(not_a_number)); | 6198 CHECK(!not_a_number->StrictEquals(not_a_number)); |
5543 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); | 6199 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); |
5544 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); | 6200 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); |
5545 | 6201 |
5546 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | 6202 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
5547 v8::Persistent<v8::Object> alias(isolate, obj); | 6203 v8::Persistent<v8::Object> alias(isolate, obj); |
5548 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); | 6204 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); |
5549 alias.Reset(); | 6205 alias.Reset(); |
5550 | 6206 |
5551 CHECK(v8_str("a")->SameValue(v8_str("a"))); | 6207 CHECK(v8_str("a")->SameValue(v8_str("a"))); |
5552 CHECK(!v8_str("a")->SameValue(v8_str("b"))); | 6208 CHECK(!v8_str("a")->SameValue(v8_str("b"))); |
5553 CHECK(!v8_str("5")->SameValue(v8_num(5))); | 6209 CHECK(!v8_str("5")->SameValue(v8_num(5))); |
5554 CHECK(v8_num(1)->SameValue(v8_num(1))); | 6210 CHECK(v8_num(1)->SameValue(v8_num(1))); |
5555 CHECK(!v8_num(1)->SameValue(v8_num(2))); | 6211 CHECK(!v8_num(1)->SameValue(v8_num(2))); |
5556 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); | 6212 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); |
5557 CHECK(not_a_number->SameValue(not_a_number)); | 6213 CHECK(not_a_number->SameValue(not_a_number)); |
5558 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); | 6214 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); |
5559 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); | 6215 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); |
5560 } | 6216 } |
5561 | 6217 |
5562 | 6218 |
5563 THREADED_TEST(MultiRun) { | 6219 THREADED_TEST(MultiRun) { |
5564 LocalContext context; | 6220 LocalContext context; |
5565 v8::HandleScope scope(context->GetIsolate()); | 6221 v8::HandleScope scope(context->GetIsolate()); |
5566 Local<Script> script = v8_compile("x"); | 6222 Local<Script> script = v8_compile("x"); |
5567 for (int i = 0; i < 10; i++) script->Run(); | 6223 for (int i = 0; i < 10; i++) { |
6224 script->Run(context.local()).IsEmpty(); | |
6225 } | |
5568 } | 6226 } |
5569 | 6227 |
5570 | 6228 |
5571 static void GetXValue(Local<String> name, | 6229 static void GetXValue(Local<Name> name, |
5572 const v8::PropertyCallbackInfo<v8::Value>& info) { | 6230 const v8::PropertyCallbackInfo<v8::Value>& info) { |
5573 ApiTestFuzzer::Fuzz(); | 6231 ApiTestFuzzer::Fuzz(); |
5574 CHECK(info.Data()->Equals(v8_str("donut"))); | 6232 CHECK(info.Data() |
5575 CHECK(name->Equals(v8_str("x"))); | 6233 ->Equals(CcTest::isolate()->GetCurrentContext(), v8_str("donut")) |
6234 .FromJust()); | |
6235 CHECK(name->Equals(CcTest::isolate()->GetCurrentContext(), v8_str("x")) | |
6236 .FromJust()); | |
5576 info.GetReturnValue().Set(name); | 6237 info.GetReturnValue().Set(name); |
5577 } | 6238 } |
5578 | 6239 |
5579 | 6240 |
5580 THREADED_TEST(SimplePropertyRead) { | 6241 THREADED_TEST(SimplePropertyRead) { |
5581 LocalContext context; | 6242 LocalContext context; |
5582 v8::Isolate* isolate = context->GetIsolate(); | 6243 v8::Isolate* isolate = context->GetIsolate(); |
5583 v8::HandleScope scope(isolate); | 6244 v8::HandleScope scope(isolate); |
5584 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6245 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5585 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 6246 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
5586 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6247 CHECK(context->Global() |
6248 ->Set(context.local(), v8_str("obj"), | |
6249 templ->NewInstance(context.local()).ToLocalChecked()) | |
6250 .FromJust()); | |
5587 Local<Script> script = v8_compile("obj.x"); | 6251 Local<Script> script = v8_compile("obj.x"); |
5588 for (int i = 0; i < 10; i++) { | 6252 for (int i = 0; i < 10; i++) { |
5589 Local<Value> result = script->Run(); | 6253 Local<Value> result = script->Run(context.local()).ToLocalChecked(); |
5590 CHECK(result->Equals(v8_str("x"))); | 6254 CHECK(result->Equals(context.local(), v8_str("x")).FromJust()); |
5591 } | 6255 } |
5592 } | 6256 } |
5593 | 6257 |
5594 | 6258 |
5595 THREADED_TEST(DefinePropertyOnAPIAccessor) { | 6259 THREADED_TEST(DefinePropertyOnAPIAccessor) { |
5596 LocalContext context; | 6260 LocalContext context; |
5597 v8::Isolate* isolate = context->GetIsolate(); | 6261 v8::Isolate* isolate = context->GetIsolate(); |
5598 v8::HandleScope scope(isolate); | 6262 v8::HandleScope scope(isolate); |
5599 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6263 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5600 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 6264 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
5601 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6265 CHECK(context->Global() |
6266 ->Set(context.local(), v8_str("obj"), | |
6267 templ->NewInstance(context.local()).ToLocalChecked()) | |
6268 .FromJust()); | |
5602 | 6269 |
5603 // Uses getOwnPropertyDescriptor to check the configurable status | 6270 // Uses getOwnPropertyDescriptor to check the configurable status |
5604 Local<Script> script_desc = v8_compile( | 6271 Local<Script> script_desc = v8_compile( |
5605 "var prop = Object.getOwnPropertyDescriptor( " | 6272 "var prop = Object.getOwnPropertyDescriptor( " |
5606 "obj, 'x');" | 6273 "obj, 'x');" |
5607 "prop.configurable;"); | 6274 "prop.configurable;"); |
5608 Local<Value> result = script_desc->Run(); | 6275 Local<Value> result = script_desc->Run(context.local()).ToLocalChecked(); |
5609 CHECK_EQ(result->BooleanValue(), true); | 6276 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true); |
5610 | 6277 |
5611 // Redefine get - but still configurable | 6278 // Redefine get - but still configurable |
5612 Local<Script> script_define = v8_compile( | 6279 Local<Script> script_define = v8_compile( |
5613 "var desc = { get: function(){return 42; }," | 6280 "var desc = { get: function(){return 42; }," |
5614 " configurable: true };" | 6281 " configurable: true };" |
5615 "Object.defineProperty(obj, 'x', desc);" | 6282 "Object.defineProperty(obj, 'x', desc);" |
5616 "obj.x"); | 6283 "obj.x"); |
5617 result = script_define->Run(); | 6284 result = script_define->Run(context.local()).ToLocalChecked(); |
5618 CHECK(result->Equals(v8_num(42))); | 6285 CHECK(result->Equals(context.local(), v8_num(42)).FromJust()); |
5619 | 6286 |
5620 // Check that the accessor is still configurable | 6287 // Check that the accessor is still configurable |
5621 result = script_desc->Run(); | 6288 result = script_desc->Run(context.local()).ToLocalChecked(); |
5622 CHECK_EQ(result->BooleanValue(), true); | 6289 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true); |
5623 | 6290 |
5624 // Redefine to a non-configurable | 6291 // Redefine to a non-configurable |
5625 script_define = v8_compile( | 6292 script_define = v8_compile( |
5626 "var desc = { get: function(){return 43; }," | 6293 "var desc = { get: function(){return 43; }," |
5627 " configurable: false };" | 6294 " configurable: false };" |
5628 "Object.defineProperty(obj, 'x', desc);" | 6295 "Object.defineProperty(obj, 'x', desc);" |
5629 "obj.x"); | 6296 "obj.x"); |
5630 result = script_define->Run(); | 6297 result = script_define->Run(context.local()).ToLocalChecked(); |
5631 CHECK(result->Equals(v8_num(43))); | 6298 CHECK(result->Equals(context.local(), v8_num(43)).FromJust()); |
5632 result = script_desc->Run(); | 6299 result = script_desc->Run(context.local()).ToLocalChecked(); |
5633 CHECK_EQ(result->BooleanValue(), false); | 6300 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), false); |
5634 | 6301 |
5635 // Make sure that it is not possible to redefine again | 6302 // Make sure that it is not possible to redefine again |
5636 v8::TryCatch try_catch(isolate); | 6303 v8::TryCatch try_catch(isolate); |
5637 result = script_define->Run(); | 6304 CHECK(script_define->Run(context.local()).IsEmpty()); |
5638 CHECK(try_catch.HasCaught()); | 6305 CHECK(try_catch.HasCaught()); |
5639 String::Utf8Value exception_value(try_catch.Exception()); | 6306 String::Utf8Value exception_value(try_catch.Exception()); |
5640 CHECK_EQ(0, | 6307 CHECK_EQ(0, |
5641 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); | 6308 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); |
5642 } | 6309 } |
5643 | 6310 |
5644 | 6311 |
5645 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { | 6312 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { |
5646 v8::Isolate* isolate = CcTest::isolate(); | 6313 v8::Isolate* isolate = CcTest::isolate(); |
5647 v8::HandleScope scope(isolate); | 6314 v8::HandleScope scope(isolate); |
5648 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6315 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5649 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); | 6316 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); |
5650 LocalContext context; | 6317 LocalContext context; |
5651 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6318 CHECK(context->Global() |
6319 ->Set(context.local(), v8_str("obj"), | |
6320 templ->NewInstance(context.local()).ToLocalChecked()) | |
6321 .FromJust()); | |
5652 | 6322 |
5653 Local<Script> script_desc = v8_compile( | 6323 Local<Script> script_desc = v8_compile( |
5654 "var prop =" | 6324 "var prop =" |
5655 "Object.getOwnPropertyDescriptor( " | 6325 "Object.getOwnPropertyDescriptor( " |
5656 "obj, 'x');" | 6326 "obj, 'x');" |
5657 "prop.configurable;"); | 6327 "prop.configurable;"); |
5658 Local<Value> result = script_desc->Run(); | 6328 Local<Value> result = script_desc->Run(context.local()).ToLocalChecked(); |
5659 CHECK_EQ(result->BooleanValue(), true); | 6329 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true); |
5660 | 6330 |
5661 Local<Script> script_define = v8_compile( | 6331 Local<Script> script_define = v8_compile( |
5662 "var desc = {get: function(){return 42; }," | 6332 "var desc = {get: function(){return 42; }," |
5663 " configurable: true };" | 6333 " configurable: true };" |
5664 "Object.defineProperty(obj, 'x', desc);" | 6334 "Object.defineProperty(obj, 'x', desc);" |
5665 "obj.x"); | 6335 "obj.x"); |
5666 result = script_define->Run(); | 6336 result = script_define->Run(context.local()).ToLocalChecked(); |
5667 CHECK(result->Equals(v8_num(42))); | 6337 CHECK(result->Equals(context.local(), v8_num(42)).FromJust()); |
5668 | 6338 |
5669 | 6339 result = script_desc->Run(context.local()).ToLocalChecked(); |
5670 result = script_desc->Run(); | 6340 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true); |
5671 CHECK_EQ(result->BooleanValue(), true); | |
5672 | |
5673 | 6341 |
5674 script_define = v8_compile( | 6342 script_define = v8_compile( |
5675 "var desc = {get: function(){return 43; }," | 6343 "var desc = {get: function(){return 43; }," |
5676 " configurable: false };" | 6344 " configurable: false };" |
5677 "Object.defineProperty(obj, 'x', desc);" | 6345 "Object.defineProperty(obj, 'x', desc);" |
5678 "obj.x"); | 6346 "obj.x"); |
5679 result = script_define->Run(); | 6347 result = script_define->Run(context.local()).ToLocalChecked(); |
5680 CHECK(result->Equals(v8_num(43))); | 6348 CHECK(result->Equals(context.local(), v8_num(43)).FromJust()); |
5681 result = script_desc->Run(); | |
5682 | 6349 |
5683 CHECK_EQ(result->BooleanValue(), false); | 6350 result = script_desc->Run(context.local()).ToLocalChecked(); |
6351 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), false); | |
5684 | 6352 |
5685 v8::TryCatch try_catch(isolate); | 6353 v8::TryCatch try_catch(isolate); |
5686 result = script_define->Run(); | 6354 CHECK(script_define->Run(context.local()).IsEmpty()); |
5687 CHECK(try_catch.HasCaught()); | 6355 CHECK(try_catch.HasCaught()); |
5688 String::Utf8Value exception_value(try_catch.Exception()); | 6356 String::Utf8Value exception_value(try_catch.Exception()); |
5689 CHECK_EQ(0, | 6357 CHECK_EQ(0, |
5690 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); | 6358 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); |
5691 } | 6359 } |
5692 | 6360 |
5693 | 6361 |
5694 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context, | 6362 static v8::Local<v8::Object> GetGlobalProperty(LocalContext* context, |
5695 char const* name) { | 6363 char const* name) { |
5696 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name))); | 6364 return v8::Local<v8::Object>::Cast( |
6365 (*context) | |
6366 ->Global() | |
6367 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str(name)) | |
6368 .ToLocalChecked()); | |
5697 } | 6369 } |
5698 | 6370 |
5699 | 6371 |
5700 THREADED_TEST(DefineAPIAccessorOnObject) { | 6372 THREADED_TEST(DefineAPIAccessorOnObject) { |
5701 v8::Isolate* isolate = CcTest::isolate(); | 6373 v8::Isolate* isolate = CcTest::isolate(); |
5702 v8::HandleScope scope(isolate); | 6374 v8::HandleScope scope(isolate); |
5703 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6375 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5704 LocalContext context; | 6376 LocalContext context; |
5705 | 6377 |
5706 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); | 6378 CHECK(context->Global() |
6379 ->Set(context.local(), v8_str("obj1"), | |
6380 templ->NewInstance(context.local()).ToLocalChecked()) | |
6381 .FromJust()); | |
5707 CompileRun("var obj2 = {};"); | 6382 CompileRun("var obj2 = {};"); |
5708 | 6383 |
5709 CHECK(CompileRun("obj1.x")->IsUndefined()); | 6384 CHECK(CompileRun("obj1.x")->IsUndefined()); |
5710 CHECK(CompileRun("obj2.x")->IsUndefined()); | 6385 CHECK(CompileRun("obj2.x")->IsUndefined()); |
5711 | 6386 |
5712 CHECK(GetGlobalProperty(&context, "obj1") | 6387 CHECK(GetGlobalProperty(&context, "obj1") |
5713 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6388 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
6389 v8_str("donut")) | |
6390 .FromJust()); | |
5714 | 6391 |
5715 ExpectString("obj1.x", "x"); | 6392 ExpectString("obj1.x", "x"); |
5716 CHECK(CompileRun("obj2.x")->IsUndefined()); | 6393 CHECK(CompileRun("obj2.x")->IsUndefined()); |
5717 | 6394 |
5718 CHECK(GetGlobalProperty(&context, "obj2") | 6395 CHECK(GetGlobalProperty(&context, "obj2") |
5719 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6396 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
6397 v8_str("donut")) | |
6398 .FromJust()); | |
5720 | 6399 |
5721 ExpectString("obj1.x", "x"); | 6400 ExpectString("obj1.x", "x"); |
5722 ExpectString("obj2.x", "x"); | 6401 ExpectString("obj2.x", "x"); |
5723 | 6402 |
5724 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); | 6403 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); |
5725 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); | 6404 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); |
5726 | 6405 |
5727 CompileRun( | 6406 CompileRun( |
5728 "Object.defineProperty(obj1, 'x'," | 6407 "Object.defineProperty(obj1, 'x'," |
5729 "{ get: function() { return 'y'; }, configurable: true })"); | 6408 "{ get: function() { return 'y'; }, configurable: true })"); |
5730 | 6409 |
5731 ExpectString("obj1.x", "y"); | 6410 ExpectString("obj1.x", "y"); |
5732 ExpectString("obj2.x", "x"); | 6411 ExpectString("obj2.x", "x"); |
5733 | 6412 |
5734 CompileRun( | 6413 CompileRun( |
5735 "Object.defineProperty(obj2, 'x'," | 6414 "Object.defineProperty(obj2, 'x'," |
5736 "{ get: function() { return 'y'; }, configurable: true })"); | 6415 "{ get: function() { return 'y'; }, configurable: true })"); |
5737 | 6416 |
5738 ExpectString("obj1.x", "y"); | 6417 ExpectString("obj1.x", "y"); |
5739 ExpectString("obj2.x", "y"); | 6418 ExpectString("obj2.x", "y"); |
5740 | 6419 |
5741 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); | 6420 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); |
5742 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); | 6421 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); |
5743 | 6422 |
5744 CHECK(GetGlobalProperty(&context, "obj1") | 6423 CHECK(GetGlobalProperty(&context, "obj1") |
5745 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6424 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
6425 v8_str("donut")) | |
6426 .FromJust()); | |
5746 CHECK(GetGlobalProperty(&context, "obj2") | 6427 CHECK(GetGlobalProperty(&context, "obj2") |
5747 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6428 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
6429 v8_str("donut")) | |
6430 .FromJust()); | |
5748 | 6431 |
5749 ExpectString("obj1.x", "x"); | 6432 ExpectString("obj1.x", "x"); |
5750 ExpectString("obj2.x", "x"); | 6433 ExpectString("obj2.x", "x"); |
5751 | 6434 |
5752 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); | 6435 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); |
5753 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); | 6436 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); |
5754 | 6437 |
5755 // Define getters/setters, but now make them not configurable. | 6438 // Define getters/setters, but now make them not configurable. |
5756 CompileRun( | 6439 CompileRun( |
5757 "Object.defineProperty(obj1, 'x'," | 6440 "Object.defineProperty(obj1, 'x'," |
5758 "{ get: function() { return 'z'; }, configurable: false })"); | 6441 "{ get: function() { return 'z'; }, configurable: false })"); |
5759 CompileRun( | 6442 CompileRun( |
5760 "Object.defineProperty(obj2, 'x'," | 6443 "Object.defineProperty(obj2, 'x'," |
5761 "{ get: function() { return 'z'; }, configurable: false })"); | 6444 "{ get: function() { return 'z'; }, configurable: false })"); |
5762 | |
5763 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); | 6445 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); |
5764 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); | 6446 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); |
5765 | 6447 |
5766 ExpectString("obj1.x", "z"); | 6448 ExpectString("obj1.x", "z"); |
5767 ExpectString("obj2.x", "z"); | 6449 ExpectString("obj2.x", "z"); |
5768 | 6450 |
5769 CHECK(!GetGlobalProperty(&context, "obj1") | 6451 CHECK(GetGlobalProperty(&context, "obj1") |
5770 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6452 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
5771 CHECK(!GetGlobalProperty(&context, "obj2") | 6453 v8_str("donut")) |
5772 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6454 .IsNothing()); |
6455 CHECK(GetGlobalProperty(&context, "obj2") | |
6456 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, | |
6457 v8_str("donut")) | |
6458 .IsNothing()); | |
5773 | 6459 |
5774 ExpectString("obj1.x", "z"); | 6460 ExpectString("obj1.x", "z"); |
5775 ExpectString("obj2.x", "z"); | 6461 ExpectString("obj2.x", "z"); |
5776 } | 6462 } |
5777 | 6463 |
5778 | 6464 |
5779 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) { | 6465 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) { |
5780 v8::Isolate* isolate = CcTest::isolate(); | 6466 v8::Isolate* isolate = CcTest::isolate(); |
5781 v8::HandleScope scope(isolate); | 6467 v8::HandleScope scope(isolate); |
5782 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6468 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5783 LocalContext context; | 6469 LocalContext context; |
5784 | 6470 |
5785 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); | 6471 CHECK(context->Global() |
6472 ->Set(context.local(), v8_str("obj1"), | |
6473 templ->NewInstance(context.local()).ToLocalChecked()) | |
6474 .FromJust()); | |
5786 CompileRun("var obj2 = {};"); | 6475 CompileRun("var obj2 = {};"); |
5787 | 6476 |
5788 CHECK(GetGlobalProperty(&context, "obj1") | 6477 CHECK(GetGlobalProperty(&context, "obj1") |
5789 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"), | 6478 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
5790 v8::DEFAULT, v8::DontDelete)); | 6479 v8_str("donut"), v8::DEFAULT, v8::DontDelete) |
6480 .FromJust()); | |
5791 CHECK(GetGlobalProperty(&context, "obj2") | 6481 CHECK(GetGlobalProperty(&context, "obj2") |
5792 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"), | 6482 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
5793 v8::DEFAULT, v8::DontDelete)); | 6483 v8_str("donut"), v8::DEFAULT, v8::DontDelete) |
6484 .FromJust()); | |
5794 | 6485 |
5795 ExpectString("obj1.x", "x"); | 6486 ExpectString("obj1.x", "x"); |
5796 ExpectString("obj2.x", "x"); | 6487 ExpectString("obj2.x", "x"); |
5797 | 6488 |
5798 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); | 6489 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); |
5799 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); | 6490 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); |
5800 | 6491 |
5801 CHECK(!GetGlobalProperty(&context, "obj1") | 6492 CHECK(GetGlobalProperty(&context, "obj1") |
5802 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6493 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, |
5803 CHECK(!GetGlobalProperty(&context, "obj2") | 6494 v8_str("donut")) |
5804 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); | 6495 .IsNothing()); |
6496 CHECK(GetGlobalProperty(&context, "obj2") | |
6497 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL, | |
6498 v8_str("donut")) | |
6499 .IsNothing()); | |
5805 | 6500 |
5806 { | 6501 { |
5807 v8::TryCatch try_catch(isolate); | 6502 v8::TryCatch try_catch(isolate); |
5808 CompileRun( | 6503 CompileRun( |
5809 "Object.defineProperty(obj1, 'x'," | 6504 "Object.defineProperty(obj1, 'x'," |
5810 "{get: function() { return 'func'; }})"); | 6505 "{get: function() { return 'func'; }})"); |
5811 CHECK(try_catch.HasCaught()); | 6506 CHECK(try_catch.HasCaught()); |
5812 String::Utf8Value exception_value(try_catch.Exception()); | 6507 String::Utf8Value exception_value(try_catch.Exception()); |
5813 CHECK_EQ( | 6508 CHECK_EQ( |
5814 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); | 6509 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); |
5815 } | 6510 } |
5816 { | 6511 { |
5817 v8::TryCatch try_catch(isolate); | 6512 v8::TryCatch try_catch(isolate); |
5818 CompileRun( | 6513 CompileRun( |
5819 "Object.defineProperty(obj2, 'x'," | 6514 "Object.defineProperty(obj2, 'x'," |
5820 "{get: function() { return 'func'; }})"); | 6515 "{get: function() { return 'func'; }})"); |
5821 CHECK(try_catch.HasCaught()); | 6516 CHECK(try_catch.HasCaught()); |
5822 String::Utf8Value exception_value(try_catch.Exception()); | 6517 String::Utf8Value exception_value(try_catch.Exception()); |
5823 CHECK_EQ( | 6518 CHECK_EQ( |
5824 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); | 6519 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); |
5825 } | 6520 } |
5826 } | 6521 } |
5827 | 6522 |
5828 | 6523 |
5829 static void Get239Value(Local<String> name, | 6524 static void Get239Value(Local<Name> name, |
5830 const v8::PropertyCallbackInfo<v8::Value>& info) { | 6525 const v8::PropertyCallbackInfo<v8::Value>& info) { |
5831 ApiTestFuzzer::Fuzz(); | 6526 ApiTestFuzzer::Fuzz(); |
5832 CHECK(info.Data()->Equals(v8_str("donut"))); | 6527 CHECK(info.Data() |
5833 CHECK(name->Equals(v8_str("239"))); | 6528 ->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("donut")) |
6529 .FromJust()); | |
6530 CHECK(name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("239")) | |
6531 .FromJust()); | |
5834 info.GetReturnValue().Set(name); | 6532 info.GetReturnValue().Set(name); |
5835 } | 6533 } |
5836 | 6534 |
5837 | 6535 |
5838 THREADED_TEST(ElementAPIAccessor) { | 6536 THREADED_TEST(ElementAPIAccessor) { |
5839 v8::Isolate* isolate = CcTest::isolate(); | 6537 v8::Isolate* isolate = CcTest::isolate(); |
5840 v8::HandleScope scope(isolate); | 6538 v8::HandleScope scope(isolate); |
5841 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6539 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5842 LocalContext context; | 6540 LocalContext context; |
5843 | 6541 |
5844 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); | 6542 CHECK(context->Global() |
6543 ->Set(context.local(), v8_str("obj1"), | |
6544 templ->NewInstance(context.local()).ToLocalChecked()) | |
6545 .FromJust()); | |
5845 CompileRun("var obj2 = {};"); | 6546 CompileRun("var obj2 = {};"); |
5846 | 6547 |
5847 CHECK(GetGlobalProperty(&context, "obj1") | 6548 CHECK(GetGlobalProperty(&context, "obj1") |
5848 ->SetAccessor(v8_str("239"), Get239Value, NULL, v8_str("donut"))); | 6549 ->SetAccessor(context.local(), v8_str("239"), Get239Value, NULL, |
6550 v8_str("donut")) | |
6551 .FromJust()); | |
5849 CHECK(GetGlobalProperty(&context, "obj2") | 6552 CHECK(GetGlobalProperty(&context, "obj2") |
5850 ->SetAccessor(v8_str("239"), Get239Value, NULL, v8_str("donut"))); | 6553 ->SetAccessor(context.local(), v8_str("239"), Get239Value, NULL, |
6554 v8_str("donut")) | |
6555 .FromJust()); | |
5851 | 6556 |
5852 ExpectString("obj1[239]", "239"); | 6557 ExpectString("obj1[239]", "239"); |
5853 ExpectString("obj2[239]", "239"); | 6558 ExpectString("obj2[239]", "239"); |
5854 ExpectString("obj1['239']", "239"); | 6559 ExpectString("obj1['239']", "239"); |
5855 ExpectString("obj2['239']", "239"); | 6560 ExpectString("obj2['239']", "239"); |
5856 } | 6561 } |
5857 | 6562 |
5858 | 6563 |
5859 v8::Persistent<Value> xValue; | 6564 v8::Persistent<Value> xValue; |
5860 | 6565 |
5861 | 6566 |
5862 static void SetXValue(Local<String> name, Local<Value> value, | 6567 static void SetXValue(Local<Name> name, Local<Value> value, |
5863 const v8::PropertyCallbackInfo<void>& info) { | 6568 const v8::PropertyCallbackInfo<void>& info) { |
5864 CHECK(value->Equals(v8_num(4))); | 6569 Local<Context> context = info.GetIsolate()->GetCurrentContext(); |
5865 CHECK(info.Data()->Equals(v8_str("donut"))); | 6570 CHECK(value->Equals(context, v8_num(4)).FromJust()); |
5866 CHECK(name->Equals(v8_str("x"))); | 6571 CHECK(info.Data()->Equals(context, v8_str("donut")).FromJust()); |
6572 CHECK(name->Equals(context, v8_str("x")).FromJust()); | |
5867 CHECK(xValue.IsEmpty()); | 6573 CHECK(xValue.IsEmpty()); |
5868 xValue.Reset(info.GetIsolate(), value); | 6574 xValue.Reset(info.GetIsolate(), value); |
5869 } | 6575 } |
5870 | 6576 |
5871 | 6577 |
5872 THREADED_TEST(SimplePropertyWrite) { | 6578 THREADED_TEST(SimplePropertyWrite) { |
5873 v8::Isolate* isolate = CcTest::isolate(); | 6579 v8::Isolate* isolate = CcTest::isolate(); |
5874 v8::HandleScope scope(isolate); | 6580 v8::HandleScope scope(isolate); |
5875 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6581 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5876 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); | 6582 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); |
5877 LocalContext context; | 6583 LocalContext context; |
5878 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6584 CHECK(context->Global() |
6585 ->Set(context.local(), v8_str("obj"), | |
6586 templ->NewInstance(context.local()).ToLocalChecked()) | |
6587 .FromJust()); | |
5879 Local<Script> script = v8_compile("obj.x = 4"); | 6588 Local<Script> script = v8_compile("obj.x = 4"); |
5880 for (int i = 0; i < 10; i++) { | 6589 for (int i = 0; i < 10; i++) { |
5881 CHECK(xValue.IsEmpty()); | 6590 CHECK(xValue.IsEmpty()); |
5882 script->Run(); | 6591 script->Run(context.local()).ToLocalChecked(); |
5883 CHECK(v8_num(4)->Equals(Local<Value>::New(CcTest::isolate(), xValue))); | 6592 CHECK(v8_num(4) |
6593 ->Equals(context.local(), | |
6594 Local<Value>::New(CcTest::isolate(), xValue)) | |
6595 .FromJust()); | |
5884 xValue.Reset(); | 6596 xValue.Reset(); |
5885 } | 6597 } |
5886 } | 6598 } |
5887 | 6599 |
5888 | 6600 |
5889 THREADED_TEST(SetterOnly) { | 6601 THREADED_TEST(SetterOnly) { |
5890 v8::Isolate* isolate = CcTest::isolate(); | 6602 v8::Isolate* isolate = CcTest::isolate(); |
5891 v8::HandleScope scope(isolate); | 6603 v8::HandleScope scope(isolate); |
5892 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6604 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5893 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); | 6605 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); |
5894 LocalContext context; | 6606 LocalContext context; |
5895 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6607 CHECK(context->Global() |
6608 ->Set(context.local(), v8_str("obj"), | |
6609 templ->NewInstance(context.local()).ToLocalChecked()) | |
6610 .FromJust()); | |
5896 Local<Script> script = v8_compile("obj.x = 4; obj.x"); | 6611 Local<Script> script = v8_compile("obj.x = 4; obj.x"); |
5897 for (int i = 0; i < 10; i++) { | 6612 for (int i = 0; i < 10; i++) { |
5898 CHECK(xValue.IsEmpty()); | 6613 CHECK(xValue.IsEmpty()); |
5899 script->Run(); | 6614 script->Run(context.local()).ToLocalChecked(); |
5900 CHECK(v8_num(4)->Equals(Local<Value>::New(CcTest::isolate(), xValue))); | 6615 CHECK(v8_num(4) |
6616 ->Equals(context.local(), | |
6617 Local<Value>::New(CcTest::isolate(), xValue)) | |
6618 .FromJust()); | |
5901 xValue.Reset(); | 6619 xValue.Reset(); |
5902 } | 6620 } |
5903 } | 6621 } |
5904 | 6622 |
5905 | 6623 |
5906 THREADED_TEST(NoAccessors) { | 6624 THREADED_TEST(NoAccessors) { |
5907 v8::Isolate* isolate = CcTest::isolate(); | 6625 v8::Isolate* isolate = CcTest::isolate(); |
5908 v8::HandleScope scope(isolate); | 6626 v8::HandleScope scope(isolate); |
5909 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6627 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5910 templ->SetAccessor(v8_str("x"), static_cast<v8::AccessorGetterCallback>(NULL), | 6628 templ->SetAccessor(v8_str("x"), static_cast<v8::AccessorGetterCallback>(NULL), |
5911 NULL, v8_str("donut")); | 6629 NULL, v8_str("donut")); |
5912 LocalContext context; | 6630 LocalContext context; |
5913 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 6631 CHECK(context->Global() |
6632 ->Set(context.local(), v8_str("obj"), | |
6633 templ->NewInstance(context.local()).ToLocalChecked()) | |
6634 .FromJust()); | |
5914 Local<Script> script = v8_compile("obj.x = 4; obj.x"); | 6635 Local<Script> script = v8_compile("obj.x = 4; obj.x"); |
5915 for (int i = 0; i < 10; i++) { | 6636 for (int i = 0; i < 10; i++) { |
5916 script->Run(); | 6637 script->Run(context.local()).ToLocalChecked(); |
5917 } | 6638 } |
5918 } | 6639 } |
5919 | 6640 |
5920 | 6641 |
5921 THREADED_TEST(MultiContexts) { | 6642 THREADED_TEST(MultiContexts) { |
5922 v8::Isolate* isolate = CcTest::isolate(); | 6643 v8::Isolate* isolate = CcTest::isolate(); |
5923 v8::HandleScope scope(isolate); | 6644 v8::HandleScope scope(isolate); |
5924 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 6645 v8::Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
5925 templ->Set(v8_str("dummy"), | 6646 templ->Set(v8_str("dummy"), |
5926 v8::FunctionTemplate::New(isolate, DummyCallHandler)); | 6647 v8::FunctionTemplate::New(isolate, DummyCallHandler)); |
5927 | 6648 |
5928 Local<String> password = v8_str("Password"); | 6649 Local<String> password = v8_str("Password"); |
5929 | 6650 |
5930 // Create an environment | 6651 // Create an environment |
5931 LocalContext context0(0, templ); | 6652 LocalContext context0(0, templ); |
5932 context0->SetSecurityToken(password); | 6653 context0->SetSecurityToken(password); |
5933 v8::Handle<v8::Object> global0 = context0->Global(); | 6654 v8::Local<v8::Object> global0 = context0->Global(); |
5934 global0->Set(v8_str("custom"), v8_num(1234)); | 6655 CHECK(global0->Set(context0.local(), v8_str("custom"), v8_num(1234)) |
5935 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); | 6656 .FromJust()); |
6657 CHECK_EQ(1234, global0->Get(context0.local(), v8_str("custom")) | |
6658 .ToLocalChecked() | |
6659 ->Int32Value(context0.local()) | |
6660 .FromJust()); | |
5936 | 6661 |
5937 // Create an independent environment | 6662 // Create an independent environment |
5938 LocalContext context1(0, templ); | 6663 LocalContext context1(0, templ); |
5939 context1->SetSecurityToken(password); | 6664 context1->SetSecurityToken(password); |
5940 v8::Handle<v8::Object> global1 = context1->Global(); | 6665 v8::Local<v8::Object> global1 = context1->Global(); |
5941 global1->Set(v8_str("custom"), v8_num(1234)); | 6666 CHECK(global1->Set(context1.local(), v8_str("custom"), v8_num(1234)) |
5942 CHECK(!global0->Equals(global1)); | 6667 .FromJust()); |
5943 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); | 6668 CHECK(!global0->Equals(context1.local(), global1).FromJust()); |
5944 CHECK_EQ(1234, global1->Get(v8_str("custom"))->Int32Value()); | 6669 CHECK_EQ(1234, global0->Get(context1.local(), v8_str("custom")) |
6670 .ToLocalChecked() | |
6671 ->Int32Value(context0.local()) | |
6672 .FromJust()); | |
6673 CHECK_EQ(1234, global1->Get(context1.local(), v8_str("custom")) | |
6674 .ToLocalChecked() | |
6675 ->Int32Value(context1.local()) | |
6676 .FromJust()); | |
5945 | 6677 |
5946 // Now create a new context with the old global | 6678 // Now create a new context with the old global |
5947 LocalContext context2(0, templ, global1); | 6679 LocalContext context2(0, templ, global1); |
5948 context2->SetSecurityToken(password); | 6680 context2->SetSecurityToken(password); |
5949 v8::Handle<v8::Object> global2 = context2->Global(); | 6681 v8::Local<v8::Object> global2 = context2->Global(); |
5950 CHECK(global1->Equals(global2)); | 6682 CHECK(global1->Equals(context2.local(), global2).FromJust()); |
5951 CHECK_EQ(0, global1->Get(v8_str("custom"))->Int32Value()); | 6683 CHECK_EQ(0, global1->Get(context2.local(), v8_str("custom")) |
5952 CHECK_EQ(0, global2->Get(v8_str("custom"))->Int32Value()); | 6684 .ToLocalChecked() |
6685 ->Int32Value(context1.local()) | |
6686 .FromJust()); | |
6687 CHECK_EQ(0, global2->Get(context2.local(), v8_str("custom")) | |
6688 .ToLocalChecked() | |
6689 ->Int32Value(context2.local()) | |
6690 .FromJust()); | |
5953 } | 6691 } |
5954 | 6692 |
5955 | 6693 |
5956 THREADED_TEST(FunctionPrototypeAcrossContexts) { | 6694 THREADED_TEST(FunctionPrototypeAcrossContexts) { |
5957 // Make sure that functions created by cloning boilerplates cannot | 6695 // Make sure that functions created by cloning boilerplates cannot |
5958 // communicate through their __proto__ field. | 6696 // communicate through their __proto__ field. |
5959 | 6697 |
5960 v8::HandleScope scope(CcTest::isolate()); | 6698 v8::HandleScope scope(CcTest::isolate()); |
5961 | 6699 |
5962 LocalContext env0; | 6700 LocalContext env0; |
5963 v8::Handle<v8::Object> global0 = env0->Global(); | 6701 v8::Local<v8::Object> global0 = env0->Global(); |
5964 v8::Handle<v8::Object> object0 = | 6702 v8::Local<v8::Object> object0 = global0->Get(env0.local(), v8_str("Object")) |
5965 global0->Get(v8_str("Object")).As<v8::Object>(); | 6703 .ToLocalChecked() |
5966 v8::Handle<v8::Object> tostring0 = | 6704 .As<v8::Object>(); |
5967 object0->Get(v8_str("toString")).As<v8::Object>(); | 6705 v8::Local<v8::Object> tostring0 = |
5968 v8::Handle<v8::Object> proto0 = | 6706 object0->Get(env0.local(), v8_str("toString")) |
5969 tostring0->Get(v8_str("__proto__")).As<v8::Object>(); | 6707 .ToLocalChecked() |
5970 proto0->Set(v8_str("custom"), v8_num(1234)); | 6708 .As<v8::Object>(); |
6709 v8::Local<v8::Object> proto0 = | |
6710 tostring0->Get(env0.local(), v8_str("__proto__")) | |
6711 .ToLocalChecked() | |
6712 .As<v8::Object>(); | |
6713 CHECK(proto0->Set(env0.local(), v8_str("custom"), v8_num(1234)).FromJust()); | |
5971 | 6714 |
5972 LocalContext env1; | 6715 LocalContext env1; |
5973 v8::Handle<v8::Object> global1 = env1->Global(); | 6716 v8::Local<v8::Object> global1 = env1->Global(); |
5974 v8::Handle<v8::Object> object1 = | 6717 v8::Local<v8::Object> object1 = global1->Get(env1.local(), v8_str("Object")) |
5975 global1->Get(v8_str("Object")).As<v8::Object>(); | 6718 .ToLocalChecked() |
5976 v8::Handle<v8::Object> tostring1 = | 6719 .As<v8::Object>(); |
5977 object1->Get(v8_str("toString")).As<v8::Object>(); | 6720 v8::Local<v8::Object> tostring1 = |
5978 v8::Handle<v8::Object> proto1 = | 6721 object1->Get(env1.local(), v8_str("toString")) |
5979 tostring1->Get(v8_str("__proto__")).As<v8::Object>(); | 6722 .ToLocalChecked() |
5980 CHECK(!proto1->Has(v8_str("custom"))); | 6723 .As<v8::Object>(); |
6724 v8::Local<v8::Object> proto1 = | |
6725 tostring1->Get(env1.local(), v8_str("__proto__")) | |
6726 .ToLocalChecked() | |
6727 .As<v8::Object>(); | |
6728 CHECK(!proto1->Has(env1.local(), v8_str("custom")).FromJust()); | |
5981 } | 6729 } |
5982 | 6730 |
5983 | 6731 |
5984 THREADED_TEST(Regress892105) { | 6732 THREADED_TEST(Regress892105) { |
5985 // Make sure that object and array literals created by cloning | 6733 // Make sure that object and array literals created by cloning |
5986 // boilerplates cannot communicate through their __proto__ | 6734 // boilerplates cannot communicate through their __proto__ |
5987 // field. This is rather difficult to check, but we try to add stuff | 6735 // field. This is rather difficult to check, but we try to add stuff |
5988 // to Object.prototype and Array.prototype and create a new | 6736 // to Object.prototype and Array.prototype and create a new |
5989 // environment. This should succeed. | 6737 // environment. This should succeed. |
5990 | 6738 |
5991 v8::HandleScope scope(CcTest::isolate()); | 6739 v8::HandleScope scope(CcTest::isolate()); |
5992 | 6740 |
5993 Local<String> source = v8_str( | 6741 Local<String> source = v8_str( |
5994 "Object.prototype.obj = 1234;" | 6742 "Object.prototype.obj = 1234;" |
5995 "Array.prototype.arr = 4567;" | 6743 "Array.prototype.arr = 4567;" |
5996 "8901"); | 6744 "8901"); |
5997 | 6745 |
5998 LocalContext env0; | 6746 LocalContext env0; |
5999 Local<Script> script0 = v8_compile(source); | 6747 Local<Script> script0 = v8_compile(source); |
6000 CHECK_EQ(8901.0, script0->Run()->NumberValue()); | 6748 CHECK_EQ(8901.0, script0->Run(env0.local()) |
6749 .ToLocalChecked() | |
6750 ->NumberValue(env0.local()) | |
6751 .FromJust()); | |
6001 | 6752 |
6002 LocalContext env1; | 6753 LocalContext env1; |
6003 Local<Script> script1 = v8_compile(source); | 6754 Local<Script> script1 = v8_compile(source); |
6004 CHECK_EQ(8901.0, script1->Run()->NumberValue()); | 6755 CHECK_EQ(8901.0, script1->Run(env1.local()) |
6756 .ToLocalChecked() | |
6757 ->NumberValue(env1.local()) | |
6758 .FromJust()); | |
6005 } | 6759 } |
6006 | 6760 |
6007 | 6761 |
6008 THREADED_TEST(UndetectableObject) { | 6762 THREADED_TEST(UndetectableObject) { |
6009 LocalContext env; | 6763 LocalContext env; |
6010 v8::HandleScope scope(env->GetIsolate()); | 6764 v8::HandleScope scope(env->GetIsolate()); |
6011 | 6765 |
6012 Local<v8::FunctionTemplate> desc = | 6766 Local<v8::FunctionTemplate> desc = |
6013 v8::FunctionTemplate::New(env->GetIsolate()); | 6767 v8::FunctionTemplate::New(env->GetIsolate()); |
6014 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6768 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6015 | 6769 |
6016 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6770 Local<v8::Object> obj = desc->GetFunction(env.local()) |
6017 env->Global()->Set(v8_str("undetectable"), obj); | 6771 .ToLocalChecked() |
6772 ->NewInstance(env.local()) | |
6773 .ToLocalChecked(); | |
6774 CHECK( | |
6775 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust()); | |
6018 | 6776 |
6019 ExpectString("undetectable.toString()", "[object Object]"); | 6777 ExpectString("undetectable.toString()", "[object Object]"); |
6020 ExpectString("typeof undetectable", "undefined"); | 6778 ExpectString("typeof undetectable", "undefined"); |
6021 ExpectString("typeof(undetectable)", "undefined"); | 6779 ExpectString("typeof(undetectable)", "undefined"); |
6022 ExpectBoolean("typeof undetectable == 'undefined'", true); | 6780 ExpectBoolean("typeof undetectable == 'undefined'", true); |
6023 ExpectBoolean("typeof undetectable == 'object'", false); | 6781 ExpectBoolean("typeof undetectable == 'object'", false); |
6024 ExpectBoolean("if (undetectable) { true; } else { false; }", false); | 6782 ExpectBoolean("if (undetectable) { true; } else { false; }", false); |
6025 ExpectBoolean("!undetectable", true); | 6783 ExpectBoolean("!undetectable", true); |
6026 | 6784 |
6027 ExpectObject("true&&undetectable", obj); | 6785 ExpectObject("true&&undetectable", obj); |
(...skipping 22 matching lines...) Expand all Loading... | |
6050 | 6808 |
6051 | 6809 |
6052 THREADED_TEST(VoidLiteral) { | 6810 THREADED_TEST(VoidLiteral) { |
6053 LocalContext env; | 6811 LocalContext env; |
6054 v8::Isolate* isolate = env->GetIsolate(); | 6812 v8::Isolate* isolate = env->GetIsolate(); |
6055 v8::HandleScope scope(isolate); | 6813 v8::HandleScope scope(isolate); |
6056 | 6814 |
6057 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); | 6815 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
6058 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6816 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6059 | 6817 |
6060 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6818 Local<v8::Object> obj = desc->GetFunction(env.local()) |
6061 env->Global()->Set(v8_str("undetectable"), obj); | 6819 .ToLocalChecked() |
6820 ->NewInstance(env.local()) | |
6821 .ToLocalChecked(); | |
6822 CHECK( | |
6823 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust()); | |
6062 | 6824 |
6063 ExpectBoolean("undefined == void 0", true); | 6825 ExpectBoolean("undefined == void 0", true); |
6064 ExpectBoolean("undetectable == void 0", true); | 6826 ExpectBoolean("undetectable == void 0", true); |
6065 ExpectBoolean("null == void 0", true); | 6827 ExpectBoolean("null == void 0", true); |
6066 ExpectBoolean("undefined === void 0", true); | 6828 ExpectBoolean("undefined === void 0", true); |
6067 ExpectBoolean("undetectable === void 0", false); | 6829 ExpectBoolean("undetectable === void 0", false); |
6068 ExpectBoolean("null === void 0", false); | 6830 ExpectBoolean("null === void 0", false); |
6069 | 6831 |
6070 ExpectBoolean("void 0 == undefined", true); | 6832 ExpectBoolean("void 0 == undefined", true); |
6071 ExpectBoolean("void 0 == undetectable", true); | 6833 ExpectBoolean("void 0 == undetectable", true); |
(...skipping 24 matching lines...) Expand all Loading... | |
6096 | 6858 |
6097 | 6859 |
6098 THREADED_TEST(ExtensibleOnUndetectable) { | 6860 THREADED_TEST(ExtensibleOnUndetectable) { |
6099 LocalContext env; | 6861 LocalContext env; |
6100 v8::Isolate* isolate = env->GetIsolate(); | 6862 v8::Isolate* isolate = env->GetIsolate(); |
6101 v8::HandleScope scope(isolate); | 6863 v8::HandleScope scope(isolate); |
6102 | 6864 |
6103 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); | 6865 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
6104 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6866 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6105 | 6867 |
6106 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6868 Local<v8::Object> obj = desc->GetFunction(env.local()) |
6107 env->Global()->Set(v8_str("undetectable"), obj); | 6869 .ToLocalChecked() |
6870 ->NewInstance(env.local()) | |
6871 .ToLocalChecked(); | |
6872 CHECK( | |
6873 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust()); | |
6108 | 6874 |
6109 Local<String> source = v8_str( | 6875 Local<String> source = v8_str( |
6110 "undetectable.x = 42;" | 6876 "undetectable.x = 42;" |
6111 "undetectable.x"); | 6877 "undetectable.x"); |
6112 | 6878 |
6113 Local<Script> script = v8_compile(source); | 6879 Local<Script> script = v8_compile(source); |
6114 | 6880 |
6115 CHECK(v8::Integer::New(isolate, 42)->Equals(script->Run())); | 6881 CHECK(v8::Integer::New(isolate, 42) |
6882 ->Equals(env.local(), script->Run(env.local()).ToLocalChecked()) | |
6883 .FromJust()); | |
6116 | 6884 |
6117 ExpectBoolean("Object.isExtensible(undetectable)", true); | 6885 ExpectBoolean("Object.isExtensible(undetectable)", true); |
6118 | 6886 |
6119 source = v8_str("Object.preventExtensions(undetectable);"); | 6887 source = v8_str("Object.preventExtensions(undetectable);"); |
6120 script = v8_compile(source); | 6888 script = v8_compile(source); |
6121 script->Run(); | 6889 script->Run(env.local()).ToLocalChecked(); |
6122 ExpectBoolean("Object.isExtensible(undetectable)", false); | 6890 ExpectBoolean("Object.isExtensible(undetectable)", false); |
6123 | 6891 |
6124 source = v8_str("undetectable.y = 2000;"); | 6892 source = v8_str("undetectable.y = 2000;"); |
6125 script = v8_compile(source); | 6893 script = v8_compile(source); |
6126 script->Run(); | 6894 script->Run(env.local()).ToLocalChecked(); |
6127 ExpectBoolean("undetectable.y == undefined", true); | 6895 ExpectBoolean("undetectable.y == undefined", true); |
6128 } | 6896 } |
6129 | 6897 |
6130 | 6898 |
6131 // The point of this test is type checking. We run it only so compilers | 6899 // The point of this test is type checking. We run it only so compilers |
6132 // don't complain about an unused function. | 6900 // don't complain about an unused function. |
6133 TEST(PersistentHandles) { | 6901 TEST(PersistentHandles) { |
6134 LocalContext env; | 6902 LocalContext env; |
6135 v8::Isolate* isolate = CcTest::isolate(); | 6903 v8::Isolate* isolate = CcTest::isolate(); |
6136 v8::HandleScope scope(isolate); | 6904 v8::HandleScope scope(isolate); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6168 "function Foo() {" | 6936 "function Foo() {" |
6169 " return 4;" | 6937 " return 4;" |
6170 "}"; | 6938 "}"; |
6171 | 6939 |
6172 | 6940 |
6173 TEST(SimpleExtensions) { | 6941 TEST(SimpleExtensions) { |
6174 v8::HandleScope handle_scope(CcTest::isolate()); | 6942 v8::HandleScope handle_scope(CcTest::isolate()); |
6175 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); | 6943 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); |
6176 const char* extension_names[] = {"simpletest"}; | 6944 const char* extension_names[] = {"simpletest"}; |
6177 v8::ExtensionConfiguration extensions(1, extension_names); | 6945 v8::ExtensionConfiguration extensions(1, extension_names); |
6178 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 6946 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6179 Context::Scope lock(context); | 6947 Context::Scope lock(context); |
6180 v8::Handle<Value> result = CompileRun("Foo()"); | 6948 v8::Local<Value> result = CompileRun("Foo()"); |
6181 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); | 6949 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4)) |
6950 .FromJust()); | |
6182 } | 6951 } |
6183 | 6952 |
6184 | 6953 |
6185 static const char* kStackTraceFromExtensionSource = | 6954 static const char* kStackTraceFromExtensionSource = |
6186 "function foo() {" | 6955 "function foo() {" |
6187 " throw new Error();" | 6956 " throw new Error();" |
6188 "}" | 6957 "}" |
6189 "function bar() {" | 6958 "function bar() {" |
6190 " foo();" | 6959 " foo();" |
6191 "}"; | 6960 "}"; |
6192 | 6961 |
6193 | 6962 |
6194 TEST(StackTraceInExtension) { | 6963 TEST(StackTraceInExtension) { |
6195 v8::HandleScope handle_scope(CcTest::isolate()); | 6964 v8::HandleScope handle_scope(CcTest::isolate()); |
6196 v8::RegisterExtension( | 6965 v8::RegisterExtension( |
6197 new Extension("stacktracetest", kStackTraceFromExtensionSource)); | 6966 new Extension("stacktracetest", kStackTraceFromExtensionSource)); |
6198 const char* extension_names[] = {"stacktracetest"}; | 6967 const char* extension_names[] = {"stacktracetest"}; |
6199 v8::ExtensionConfiguration extensions(1, extension_names); | 6968 v8::ExtensionConfiguration extensions(1, extension_names); |
6200 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 6969 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6201 Context::Scope lock(context); | 6970 Context::Scope lock(context); |
6202 CompileRun( | 6971 CompileRun( |
6203 "function user() { bar(); }" | 6972 "function user() { bar(); }" |
6204 "var error;" | 6973 "var error;" |
6205 "try{ user(); } catch (e) { error = e; }"); | 6974 "try{ user(); } catch (e) { error = e; }"); |
6206 CHECK_EQ(-1, CompileRun("error.stack.indexOf('foo')")->Int32Value()); | 6975 CHECK_EQ(-1, v8_run_int32value(v8_compile("error.stack.indexOf('foo')"))); |
6207 CHECK_EQ(-1, CompileRun("error.stack.indexOf('bar')")->Int32Value()); | 6976 CHECK_EQ(-1, v8_run_int32value(v8_compile("error.stack.indexOf('bar')"))); |
6208 CHECK_NE(-1, CompileRun("error.stack.indexOf('user')")->Int32Value()); | 6977 CHECK_NE(-1, v8_run_int32value(v8_compile("error.stack.indexOf('user')"))); |
6209 } | 6978 } |
6210 | 6979 |
6211 | 6980 |
6212 TEST(NullExtensions) { | 6981 TEST(NullExtensions) { |
6213 v8::HandleScope handle_scope(CcTest::isolate()); | 6982 v8::HandleScope handle_scope(CcTest::isolate()); |
6214 v8::RegisterExtension(new Extension("nulltest", NULL)); | 6983 v8::RegisterExtension(new Extension("nulltest", NULL)); |
6215 const char* extension_names[] = {"nulltest"}; | 6984 const char* extension_names[] = {"nulltest"}; |
6216 v8::ExtensionConfiguration extensions(1, extension_names); | 6985 v8::ExtensionConfiguration extensions(1, extension_names); |
6217 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 6986 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6218 Context::Scope lock(context); | 6987 Context::Scope lock(context); |
6219 v8::Handle<Value> result = CompileRun("1+3"); | 6988 v8::Local<Value> result = CompileRun("1+3"); |
6220 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); | 6989 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4)) |
6990 .FromJust()); | |
6221 } | 6991 } |
6222 | 6992 |
6223 | 6993 |
6224 static const char* kEmbeddedExtensionSource = | 6994 static const char* kEmbeddedExtensionSource = |
6225 "function Ret54321(){return 54321;}~~@@$" | 6995 "function Ret54321(){return 54321;}~~@@$" |
6226 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; | 6996 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; |
6227 static const int kEmbeddedExtensionSourceValidLen = 34; | 6997 static const int kEmbeddedExtensionSourceValidLen = 34; |
6228 | 6998 |
6229 | 6999 |
6230 TEST(ExtensionMissingSourceLength) { | 7000 TEST(ExtensionMissingSourceLength) { |
6231 v8::HandleScope handle_scope(CcTest::isolate()); | 7001 v8::HandleScope handle_scope(CcTest::isolate()); |
6232 v8::RegisterExtension( | 7002 v8::RegisterExtension( |
6233 new Extension("srclentest_fail", kEmbeddedExtensionSource)); | 7003 new Extension("srclentest_fail", kEmbeddedExtensionSource)); |
6234 const char* extension_names[] = {"srclentest_fail"}; | 7004 const char* extension_names[] = {"srclentest_fail"}; |
6235 v8::ExtensionConfiguration extensions(1, extension_names); | 7005 v8::ExtensionConfiguration extensions(1, extension_names); |
6236 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7006 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6237 CHECK(0 == *context); | 7007 CHECK(0 == *context); |
6238 } | 7008 } |
6239 | 7009 |
6240 | 7010 |
6241 TEST(ExtensionWithSourceLength) { | 7011 TEST(ExtensionWithSourceLength) { |
6242 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; | 7012 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; |
6243 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { | 7013 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { |
6244 v8::HandleScope handle_scope(CcTest::isolate()); | 7014 v8::HandleScope handle_scope(CcTest::isolate()); |
6245 i::ScopedVector<char> extension_name(32); | 7015 i::ScopedVector<char> extension_name(32); |
6246 i::SNPrintF(extension_name, "ext #%d", source_len); | 7016 i::SNPrintF(extension_name, "ext #%d", source_len); |
6247 v8::RegisterExtension(new Extension( | 7017 v8::RegisterExtension(new Extension( |
6248 extension_name.start(), kEmbeddedExtensionSource, 0, 0, source_len)); | 7018 extension_name.start(), kEmbeddedExtensionSource, 0, 0, source_len)); |
6249 const char* extension_names[1] = {extension_name.start()}; | 7019 const char* extension_names[1] = {extension_name.start()}; |
6250 v8::ExtensionConfiguration extensions(1, extension_names); | 7020 v8::ExtensionConfiguration extensions(1, extension_names); |
6251 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7021 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6252 if (source_len == kEmbeddedExtensionSourceValidLen) { | 7022 if (source_len == kEmbeddedExtensionSourceValidLen) { |
6253 Context::Scope lock(context); | 7023 Context::Scope lock(context); |
6254 v8::Handle<Value> result = CompileRun("Ret54321()"); | 7024 v8::Local<Value> result = CompileRun("Ret54321()"); |
6255 CHECK(v8::Integer::New(CcTest::isolate(), 54321)->Equals(result)); | 7025 CHECK(v8::Integer::New(CcTest::isolate(), 54321) |
7026 ->Equals(context, result) | |
7027 .FromJust()); | |
6256 } else { | 7028 } else { |
6257 // Anything but exactly the right length should fail to compile. | 7029 // Anything but exactly the right length should fail to compile. |
6258 CHECK(0 == *context); | 7030 CHECK(0 == *context); |
6259 } | 7031 } |
6260 } | 7032 } |
6261 } | 7033 } |
6262 | 7034 |
6263 | 7035 |
6264 static const char* kEvalExtensionSource1 = | 7036 static const char* kEvalExtensionSource1 = |
6265 "function UseEval1() {" | 7037 "function UseEval1() {" |
(...skipping 11 matching lines...) Expand all Loading... | |
6277 " this.UseEval2 = e;" | 7049 " this.UseEval2 = e;" |
6278 "})()"; | 7050 "})()"; |
6279 | 7051 |
6280 | 7052 |
6281 TEST(UseEvalFromExtension) { | 7053 TEST(UseEvalFromExtension) { |
6282 v8::HandleScope handle_scope(CcTest::isolate()); | 7054 v8::HandleScope handle_scope(CcTest::isolate()); |
6283 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); | 7055 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); |
6284 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); | 7056 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); |
6285 const char* extension_names[] = {"evaltest1", "evaltest2"}; | 7057 const char* extension_names[] = {"evaltest1", "evaltest2"}; |
6286 v8::ExtensionConfiguration extensions(2, extension_names); | 7058 v8::ExtensionConfiguration extensions(2, extension_names); |
6287 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7059 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6288 Context::Scope lock(context); | 7060 Context::Scope lock(context); |
6289 v8::Handle<Value> result = CompileRun("UseEval1()"); | 7061 v8::Local<Value> result = CompileRun("UseEval1()"); |
6290 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); | 7062 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42)) |
7063 .FromJust()); | |
6291 result = CompileRun("UseEval2()"); | 7064 result = CompileRun("UseEval2()"); |
6292 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); | 7065 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42)) |
7066 .FromJust()); | |
6293 } | 7067 } |
6294 | 7068 |
6295 | 7069 |
6296 static const char* kWithExtensionSource1 = | 7070 static const char* kWithExtensionSource1 = |
6297 "function UseWith1() {" | 7071 "function UseWith1() {" |
6298 " var x = 42;" | 7072 " var x = 42;" |
6299 " with({x:87}) { return x; }" | 7073 " with({x:87}) { return x; }" |
6300 "}"; | 7074 "}"; |
6301 | 7075 |
6302 | 7076 |
6303 static const char* kWithExtensionSource2 = | 7077 static const char* kWithExtensionSource2 = |
6304 "(function() {" | 7078 "(function() {" |
6305 " var x = 42;" | 7079 " var x = 42;" |
6306 " function e() {" | 7080 " function e() {" |
6307 " with ({x:87}) { return x; }" | 7081 " with ({x:87}) { return x; }" |
6308 " }" | 7082 " }" |
6309 " this.UseWith2 = e;" | 7083 " this.UseWith2 = e;" |
6310 "})()"; | 7084 "})()"; |
6311 | 7085 |
6312 | 7086 |
6313 TEST(UseWithFromExtension) { | 7087 TEST(UseWithFromExtension) { |
6314 v8::HandleScope handle_scope(CcTest::isolate()); | 7088 v8::HandleScope handle_scope(CcTest::isolate()); |
6315 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); | 7089 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); |
6316 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); | 7090 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); |
6317 const char* extension_names[] = {"withtest1", "withtest2"}; | 7091 const char* extension_names[] = {"withtest1", "withtest2"}; |
6318 v8::ExtensionConfiguration extensions(2, extension_names); | 7092 v8::ExtensionConfiguration extensions(2, extension_names); |
6319 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7093 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6320 Context::Scope lock(context); | 7094 Context::Scope lock(context); |
6321 v8::Handle<Value> result = CompileRun("UseWith1()"); | 7095 v8::Local<Value> result = CompileRun("UseWith1()"); |
6322 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 87))); | 7096 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 87)) |
7097 .FromJust()); | |
6323 result = CompileRun("UseWith2()"); | 7098 result = CompileRun("UseWith2()"); |
6324 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 87))); | 7099 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 87)) |
7100 .FromJust()); | |
6325 } | 7101 } |
6326 | 7102 |
6327 | 7103 |
6328 TEST(AutoExtensions) { | 7104 TEST(AutoExtensions) { |
6329 v8::HandleScope handle_scope(CcTest::isolate()); | 7105 v8::HandleScope handle_scope(CcTest::isolate()); |
6330 Extension* extension = new Extension("autotest", kSimpleExtensionSource); | 7106 Extension* extension = new Extension("autotest", kSimpleExtensionSource); |
6331 extension->set_auto_enable(true); | 7107 extension->set_auto_enable(true); |
6332 v8::RegisterExtension(extension); | 7108 v8::RegisterExtension(extension); |
6333 v8::Handle<Context> context = Context::New(CcTest::isolate()); | 7109 v8::Local<Context> context = Context::New(CcTest::isolate()); |
6334 Context::Scope lock(context); | 7110 Context::Scope lock(context); |
6335 v8::Handle<Value> result = CompileRun("Foo()"); | 7111 v8::Local<Value> result = CompileRun("Foo()"); |
6336 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); | 7112 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4)) |
7113 .FromJust()); | |
6337 } | 7114 } |
6338 | 7115 |
6339 | 7116 |
6340 static const char* kSyntaxErrorInExtensionSource = "["; | 7117 static const char* kSyntaxErrorInExtensionSource = "["; |
6341 | 7118 |
6342 | 7119 |
6343 // Test that a syntax error in an extension does not cause a fatal | 7120 // Test that a syntax error in an extension does not cause a fatal |
6344 // error but results in an empty context. | 7121 // error but results in an empty context. |
6345 TEST(SyntaxErrorExtensions) { | 7122 TEST(SyntaxErrorExtensions) { |
6346 v8::HandleScope handle_scope(CcTest::isolate()); | 7123 v8::HandleScope handle_scope(CcTest::isolate()); |
6347 v8::RegisterExtension( | 7124 v8::RegisterExtension( |
6348 new Extension("syntaxerror", kSyntaxErrorInExtensionSource)); | 7125 new Extension("syntaxerror", kSyntaxErrorInExtensionSource)); |
6349 const char* extension_names[] = {"syntaxerror"}; | 7126 const char* extension_names[] = {"syntaxerror"}; |
6350 v8::ExtensionConfiguration extensions(1, extension_names); | 7127 v8::ExtensionConfiguration extensions(1, extension_names); |
6351 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7128 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6352 CHECK(context.IsEmpty()); | 7129 CHECK(context.IsEmpty()); |
6353 } | 7130 } |
6354 | 7131 |
6355 | 7132 |
6356 static const char* kExceptionInExtensionSource = "throw 42"; | 7133 static const char* kExceptionInExtensionSource = "throw 42"; |
6357 | 7134 |
6358 | 7135 |
6359 // Test that an exception when installing an extension does not cause | 7136 // Test that an exception when installing an extension does not cause |
6360 // a fatal error but results in an empty context. | 7137 // a fatal error but results in an empty context. |
6361 TEST(ExceptionExtensions) { | 7138 TEST(ExceptionExtensions) { |
6362 v8::HandleScope handle_scope(CcTest::isolate()); | 7139 v8::HandleScope handle_scope(CcTest::isolate()); |
6363 v8::RegisterExtension( | 7140 v8::RegisterExtension( |
6364 new Extension("exception", kExceptionInExtensionSource)); | 7141 new Extension("exception", kExceptionInExtensionSource)); |
6365 const char* extension_names[] = {"exception"}; | 7142 const char* extension_names[] = {"exception"}; |
6366 v8::ExtensionConfiguration extensions(1, extension_names); | 7143 v8::ExtensionConfiguration extensions(1, extension_names); |
6367 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7144 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6368 CHECK(context.IsEmpty()); | 7145 CHECK(context.IsEmpty()); |
6369 } | 7146 } |
6370 | 7147 |
6371 | 7148 |
6372 static const char* kNativeCallInExtensionSource = | 7149 static const char* kNativeCallInExtensionSource = |
6373 "function call_runtime_last_index_of(x) {" | 7150 "function call_runtime_last_index_of(x) {" |
6374 " return %StringLastIndexOf(x, 'bob', 10);" | 7151 " return %StringLastIndexOf(x, 'bob', 10);" |
6375 "}"; | 7152 "}"; |
6376 | 7153 |
6377 | 7154 |
6378 static const char* kNativeCallTest = | 7155 static const char* kNativeCallTest = |
6379 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; | 7156 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; |
6380 | 7157 |
6381 // Test that a native runtime calls are supported in extensions. | 7158 // Test that a native runtime calls are supported in extensions. |
6382 TEST(NativeCallInExtensions) { | 7159 TEST(NativeCallInExtensions) { |
6383 v8::HandleScope handle_scope(CcTest::isolate()); | 7160 v8::HandleScope handle_scope(CcTest::isolate()); |
6384 v8::RegisterExtension( | 7161 v8::RegisterExtension( |
6385 new Extension("nativecall", kNativeCallInExtensionSource)); | 7162 new Extension("nativecall", kNativeCallInExtensionSource)); |
6386 const char* extension_names[] = {"nativecall"}; | 7163 const char* extension_names[] = {"nativecall"}; |
6387 v8::ExtensionConfiguration extensions(1, extension_names); | 7164 v8::ExtensionConfiguration extensions(1, extension_names); |
6388 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7165 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6389 Context::Scope lock(context); | 7166 Context::Scope lock(context); |
6390 v8::Handle<Value> result = CompileRun(kNativeCallTest); | 7167 v8::Local<Value> result = CompileRun(kNativeCallTest); |
6391 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 3))); | 7168 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 3)) |
7169 .FromJust()); | |
6392 } | 7170 } |
6393 | 7171 |
6394 | 7172 |
6395 class NativeFunctionExtension : public Extension { | 7173 class NativeFunctionExtension : public Extension { |
6396 public: | 7174 public: |
6397 NativeFunctionExtension(const char* name, const char* source, | 7175 NativeFunctionExtension(const char* name, const char* source, |
6398 v8::FunctionCallback fun = &Echo) | 7176 v8::FunctionCallback fun = &Echo) |
6399 : Extension(name, source), function_(fun) {} | 7177 : Extension(name, source), function_(fun) {} |
6400 | 7178 |
6401 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( | 7179 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( |
6402 v8::Isolate* isolate, v8::Handle<v8::String> name) { | 7180 v8::Isolate* isolate, v8::Local<v8::String> name) { |
6403 return v8::FunctionTemplate::New(isolate, function_); | 7181 return v8::FunctionTemplate::New(isolate, function_); |
6404 } | 7182 } |
6405 | 7183 |
6406 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7184 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
6407 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); | 7185 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); |
6408 } | 7186 } |
6409 | 7187 |
6410 private: | 7188 private: |
6411 v8::FunctionCallback function_; | 7189 v8::FunctionCallback function_; |
6412 }; | 7190 }; |
6413 | 7191 |
6414 | 7192 |
6415 TEST(NativeFunctionDeclaration) { | 7193 TEST(NativeFunctionDeclaration) { |
6416 v8::HandleScope handle_scope(CcTest::isolate()); | 7194 v8::HandleScope handle_scope(CcTest::isolate()); |
6417 const char* name = "nativedecl"; | 7195 const char* name = "nativedecl"; |
6418 v8::RegisterExtension( | 7196 v8::RegisterExtension( |
6419 new NativeFunctionExtension(name, "native function foo();")); | 7197 new NativeFunctionExtension(name, "native function foo();")); |
6420 const char* extension_names[] = {name}; | 7198 const char* extension_names[] = {name}; |
6421 v8::ExtensionConfiguration extensions(1, extension_names); | 7199 v8::ExtensionConfiguration extensions(1, extension_names); |
6422 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7200 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6423 Context::Scope lock(context); | 7201 Context::Scope lock(context); |
6424 v8::Handle<Value> result = CompileRun("foo(42);"); | 7202 v8::Local<Value> result = CompileRun("foo(42);"); |
6425 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); | 7203 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42)) |
7204 .FromJust()); | |
6426 } | 7205 } |
6427 | 7206 |
6428 | 7207 |
6429 TEST(NativeFunctionDeclarationError) { | 7208 TEST(NativeFunctionDeclarationError) { |
6430 v8::HandleScope handle_scope(CcTest::isolate()); | 7209 v8::HandleScope handle_scope(CcTest::isolate()); |
6431 const char* name = "nativedeclerr"; | 7210 const char* name = "nativedeclerr"; |
6432 // Syntax error in extension code. | 7211 // Syntax error in extension code. |
6433 v8::RegisterExtension( | 7212 v8::RegisterExtension( |
6434 new NativeFunctionExtension(name, "native\nfunction foo();")); | 7213 new NativeFunctionExtension(name, "native\nfunction foo();")); |
6435 const char* extension_names[] = {name}; | 7214 const char* extension_names[] = {name}; |
6436 v8::ExtensionConfiguration extensions(1, extension_names); | 7215 v8::ExtensionConfiguration extensions(1, extension_names); |
6437 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7216 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6438 CHECK(context.IsEmpty()); | 7217 CHECK(context.IsEmpty()); |
6439 } | 7218 } |
6440 | 7219 |
6441 | 7220 |
6442 TEST(NativeFunctionDeclarationErrorEscape) { | 7221 TEST(NativeFunctionDeclarationErrorEscape) { |
6443 v8::HandleScope handle_scope(CcTest::isolate()); | 7222 v8::HandleScope handle_scope(CcTest::isolate()); |
6444 const char* name = "nativedeclerresc"; | 7223 const char* name = "nativedeclerresc"; |
6445 // Syntax error in extension code - escape code in "native" means that | 7224 // Syntax error in extension code - escape code in "native" means that |
6446 // it's not treated as a keyword. | 7225 // it's not treated as a keyword. |
6447 v8::RegisterExtension( | 7226 v8::RegisterExtension( |
6448 new NativeFunctionExtension(name, "nativ\\u0065 function foo();")); | 7227 new NativeFunctionExtension(name, "nativ\\u0065 function foo();")); |
6449 const char* extension_names[] = {name}; | 7228 const char* extension_names[] = {name}; |
6450 v8::ExtensionConfiguration extensions(1, extension_names); | 7229 v8::ExtensionConfiguration extensions(1, extension_names); |
6451 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); | 7230 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions); |
6452 CHECK(context.IsEmpty()); | 7231 CHECK(context.IsEmpty()); |
6453 } | 7232 } |
6454 | 7233 |
6455 | 7234 |
6456 static void CheckDependencies(const char* name, const char* expected) { | 7235 static void CheckDependencies(const char* name, const char* expected) { |
6457 v8::HandleScope handle_scope(CcTest::isolate()); | 7236 v8::HandleScope handle_scope(CcTest::isolate()); |
6458 v8::ExtensionConfiguration config(1, &name); | 7237 v8::ExtensionConfiguration config(1, &name); |
6459 LocalContext context(&config); | 7238 LocalContext context(&config); |
6460 CHECK(String::NewFromUtf8(CcTest::isolate(), expected) | 7239 CHECK( |
6461 ->Equals(context->Global()->Get(v8_str("loaded")))); | 7240 v8_str(expected) |
7241 ->Equals(context.local(), context->Global() | |
7242 ->Get(context.local(), v8_str("loaded")) | |
7243 .ToLocalChecked()) | |
7244 .FromJust()); | |
6462 } | 7245 } |
6463 | 7246 |
6464 | 7247 |
6465 /* | 7248 /* |
6466 * Configuration: | 7249 * Configuration: |
6467 * | 7250 * |
6468 * /-- B <--\ | 7251 * /-- B <--\ |
6469 * A <- -- D <-- E | 7252 * A <- -- D <-- E |
6470 * \-- C <--/ | 7253 * \-- C <--/ |
6471 */ | 7254 */ |
6472 THREADED_TEST(ExtensionDependency) { | 7255 THREADED_TEST(ExtensionDependency) { |
6473 static const char* kEDeps[] = {"D"}; | 7256 static const char* kEDeps[] = {"D"}; |
6474 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps)); | 7257 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps)); |
6475 static const char* kDDeps[] = {"B", "C"}; | 7258 static const char* kDDeps[] = {"B", "C"}; |
6476 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps)); | 7259 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps)); |
6477 static const char* kBCDeps[] = {"A"}; | 7260 static const char* kBCDeps[] = {"A"}; |
6478 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps)); | 7261 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps)); |
6479 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps)); | 7262 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps)); |
6480 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';")); | 7263 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';")); |
6481 CheckDependencies("A", "undefinedA"); | 7264 CheckDependencies("A", "undefinedA"); |
6482 CheckDependencies("B", "undefinedAB"); | 7265 CheckDependencies("B", "undefinedAB"); |
6483 CheckDependencies("C", "undefinedAC"); | 7266 CheckDependencies("C", "undefinedAC"); |
6484 CheckDependencies("D", "undefinedABCD"); | 7267 CheckDependencies("D", "undefinedABCD"); |
6485 CheckDependencies("E", "undefinedABCDE"); | 7268 CheckDependencies("E", "undefinedABCDE"); |
6486 v8::HandleScope handle_scope(CcTest::isolate()); | 7269 v8::HandleScope handle_scope(CcTest::isolate()); |
6487 static const char* exts[2] = {"C", "E"}; | 7270 static const char* exts[2] = {"C", "E"}; |
6488 v8::ExtensionConfiguration config(2, exts); | 7271 v8::ExtensionConfiguration config(2, exts); |
6489 LocalContext context(&config); | 7272 LocalContext context(&config); |
6490 CHECK(v8_str("undefinedACBDE") | 7273 CHECK( |
6491 ->Equals(context->Global()->Get(v8_str("loaded")))); | 7274 v8_str("undefinedACBDE") |
7275 ->Equals(context.local(), context->Global() | |
7276 ->Get(context.local(), v8_str("loaded")) | |
7277 .ToLocalChecked()) | |
7278 .FromJust()); | |
6492 } | 7279 } |
6493 | 7280 |
6494 | 7281 |
6495 static const char* kExtensionTestScript = | 7282 static const char* kExtensionTestScript = |
6496 "native function A();" | 7283 "native function A();" |
6497 "native function B();" | 7284 "native function B();" |
6498 "native function C();" | 7285 "native function C();" |
6499 "function Foo(i) {" | 7286 "function Foo(i) {" |
6500 " if (i == 0) return A();" | 7287 " if (i == 0) return A();" |
6501 " if (i == 1) return B();" | 7288 " if (i == 1) return B();" |
6502 " if (i == 2) return C();" | 7289 " if (i == 2) return C();" |
6503 "}"; | 7290 "}"; |
6504 | 7291 |
6505 | 7292 |
6506 static void CallFun(const v8::FunctionCallbackInfo<v8::Value>& args) { | 7293 static void CallFun(const v8::FunctionCallbackInfo<v8::Value>& args) { |
6507 ApiTestFuzzer::Fuzz(); | 7294 ApiTestFuzzer::Fuzz(); |
6508 if (args.IsConstructCall()) { | 7295 if (args.IsConstructCall()) { |
6509 args.This()->Set(v8_str("data"), args.Data()); | 7296 CHECK(args.This() |
7297 ->Set(args.GetIsolate()->GetCurrentContext(), v8_str("data"), | |
7298 args.Data()) | |
7299 .FromJust()); | |
6510 args.GetReturnValue().SetNull(); | 7300 args.GetReturnValue().SetNull(); |
6511 return; | 7301 return; |
6512 } | 7302 } |
6513 args.GetReturnValue().Set(args.Data()); | 7303 args.GetReturnValue().Set(args.Data()); |
6514 } | 7304 } |
6515 | 7305 |
6516 | 7306 |
6517 class FunctionExtension : public Extension { | 7307 class FunctionExtension : public Extension { |
6518 public: | 7308 public: |
6519 FunctionExtension() : Extension("functiontest", kExtensionTestScript) {} | 7309 FunctionExtension() : Extension("functiontest", kExtensionTestScript) {} |
6520 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( | 7310 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( |
6521 v8::Isolate* isolate, v8::Handle<String> name); | 7311 v8::Isolate* isolate, v8::Local<String> name); |
6522 }; | 7312 }; |
6523 | 7313 |
6524 | 7314 |
6525 static int lookup_count = 0; | 7315 static int lookup_count = 0; |
6526 v8::Handle<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate( | 7316 v8::Local<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate( |
6527 v8::Isolate* isolate, v8::Handle<String> name) { | 7317 v8::Isolate* isolate, v8::Local<String> name) { |
6528 lookup_count++; | 7318 lookup_count++; |
6529 if (name->Equals(v8_str("A"))) { | 7319 if (name->Equals(isolate->GetCurrentContext(), v8_str("A")).FromJust()) { |
6530 return v8::FunctionTemplate::New(isolate, CallFun, | 7320 return v8::FunctionTemplate::New(isolate, CallFun, |
6531 v8::Integer::New(isolate, 8)); | 7321 v8::Integer::New(isolate, 8)); |
6532 } else if (name->Equals(v8_str("B"))) { | 7322 } else if (name->Equals(isolate->GetCurrentContext(), v8_str("B")) |
7323 .FromJust()) { | |
6533 return v8::FunctionTemplate::New(isolate, CallFun, | 7324 return v8::FunctionTemplate::New(isolate, CallFun, |
6534 v8::Integer::New(isolate, 7)); | 7325 v8::Integer::New(isolate, 7)); |
6535 } else if (name->Equals(v8_str("C"))) { | 7326 } else if (name->Equals(isolate->GetCurrentContext(), v8_str("C")) |
7327 .FromJust()) { | |
6536 return v8::FunctionTemplate::New(isolate, CallFun, | 7328 return v8::FunctionTemplate::New(isolate, CallFun, |
6537 v8::Integer::New(isolate, 6)); | 7329 v8::Integer::New(isolate, 6)); |
6538 } else { | 7330 } else { |
6539 return v8::Handle<v8::FunctionTemplate>(); | 7331 return v8::Local<v8::FunctionTemplate>(); |
6540 } | 7332 } |
6541 } | 7333 } |
6542 | 7334 |
6543 | 7335 |
6544 THREADED_TEST(FunctionLookup) { | 7336 THREADED_TEST(FunctionLookup) { |
6545 v8::RegisterExtension(new FunctionExtension()); | 7337 v8::RegisterExtension(new FunctionExtension()); |
6546 v8::HandleScope handle_scope(CcTest::isolate()); | 7338 v8::HandleScope handle_scope(CcTest::isolate()); |
6547 static const char* exts[1] = {"functiontest"}; | 7339 static const char* exts[1] = {"functiontest"}; |
6548 v8::ExtensionConfiguration config(1, exts); | 7340 v8::ExtensionConfiguration config(1, exts); |
6549 LocalContext context(&config); | 7341 LocalContext context(&config); |
6550 CHECK_EQ(3, lookup_count); | 7342 CHECK_EQ(3, lookup_count); |
6551 CHECK(v8::Integer::New(CcTest::isolate(), 8)->Equals(CompileRun("Foo(0)"))); | 7343 CHECK(v8::Integer::New(CcTest::isolate(), 8) |
6552 CHECK(v8::Integer::New(CcTest::isolate(), 7)->Equals(CompileRun("Foo(1)"))); | 7344 ->Equals(context.local(), CompileRun("Foo(0)")) |
6553 CHECK(v8::Integer::New(CcTest::isolate(), 6)->Equals(CompileRun("Foo(2)"))); | 7345 .FromJust()); |
7346 CHECK(v8::Integer::New(CcTest::isolate(), 7) | |
7347 ->Equals(context.local(), CompileRun("Foo(1)")) | |
7348 .FromJust()); | |
7349 CHECK(v8::Integer::New(CcTest::isolate(), 6) | |
7350 ->Equals(context.local(), CompileRun("Foo(2)")) | |
7351 .FromJust()); | |
6554 } | 7352 } |
6555 | 7353 |
6556 | 7354 |
6557 THREADED_TEST(NativeFunctionConstructCall) { | 7355 THREADED_TEST(NativeFunctionConstructCall) { |
6558 v8::RegisterExtension(new FunctionExtension()); | 7356 v8::RegisterExtension(new FunctionExtension()); |
6559 v8::HandleScope handle_scope(CcTest::isolate()); | 7357 v8::HandleScope handle_scope(CcTest::isolate()); |
6560 static const char* exts[1] = {"functiontest"}; | 7358 static const char* exts[1] = {"functiontest"}; |
6561 v8::ExtensionConfiguration config(1, exts); | 7359 v8::ExtensionConfiguration config(1, exts); |
6562 LocalContext context(&config); | 7360 LocalContext context(&config); |
6563 for (int i = 0; i < 10; i++) { | 7361 for (int i = 0; i < 10; i++) { |
6564 // Run a few times to ensure that allocation of objects doesn't | 7362 // Run a few times to ensure that allocation of objects doesn't |
6565 // change behavior of a constructor function. | 7363 // change behavior of a constructor function. |
6566 CHECK(v8::Integer::New(CcTest::isolate(), 8) | 7364 CHECK(v8::Integer::New(CcTest::isolate(), 8) |
6567 ->Equals(CompileRun("(new A()).data"))); | 7365 ->Equals(context.local(), CompileRun("(new A()).data")) |
7366 .FromJust()); | |
6568 CHECK(v8::Integer::New(CcTest::isolate(), 7) | 7367 CHECK(v8::Integer::New(CcTest::isolate(), 7) |
6569 ->Equals(CompileRun("(new B()).data"))); | 7368 ->Equals(context.local(), CompileRun("(new B()).data")) |
7369 .FromJust()); | |
6570 CHECK(v8::Integer::New(CcTest::isolate(), 6) | 7370 CHECK(v8::Integer::New(CcTest::isolate(), 6) |
6571 ->Equals(CompileRun("(new C()).data"))); | 7371 ->Equals(context.local(), CompileRun("(new C()).data")) |
7372 .FromJust()); | |
6572 } | 7373 } |
6573 } | 7374 } |
6574 | 7375 |
6575 | 7376 |
6576 static const char* last_location; | 7377 static const char* last_location; |
6577 static const char* last_message; | 7378 static const char* last_message; |
6578 void StoringErrorCallback(const char* location, const char* message) { | 7379 void StoringErrorCallback(const char* location, const char* message) { |
6579 if (last_location == NULL) { | 7380 if (last_location == NULL) { |
6580 last_location = location; | 7381 last_location = location; |
6581 last_message = message; | 7382 last_message = message; |
6582 } | 7383 } |
6583 } | 7384 } |
6584 | 7385 |
6585 | 7386 |
6586 // ErrorReporting creates a circular extensions configuration and | 7387 // ErrorReporting creates a circular extensions configuration and |
6587 // tests that the fatal error handler gets called. This renders V8 | 7388 // tests that the fatal error handler gets called. This renders V8 |
6588 // unusable and therefore this test cannot be run in parallel. | 7389 // unusable and therefore this test cannot be run in parallel. |
6589 TEST(ErrorReporting) { | 7390 TEST(ErrorReporting) { |
6590 v8::V8::SetFatalErrorHandler(StoringErrorCallback); | 7391 CcTest::isolate()->SetFatalErrorHandler(StoringErrorCallback); |
6591 static const char* aDeps[] = {"B"}; | 7392 static const char* aDeps[] = {"B"}; |
6592 v8::RegisterExtension(new Extension("A", "", 1, aDeps)); | 7393 v8::RegisterExtension(new Extension("A", "", 1, aDeps)); |
6593 static const char* bDeps[] = {"A"}; | 7394 static const char* bDeps[] = {"A"}; |
6594 v8::RegisterExtension(new Extension("B", "", 1, bDeps)); | 7395 v8::RegisterExtension(new Extension("B", "", 1, bDeps)); |
6595 last_location = NULL; | 7396 last_location = NULL; |
6596 v8::ExtensionConfiguration config(1, bDeps); | 7397 v8::ExtensionConfiguration config(1, bDeps); |
6597 v8::Handle<Context> context = Context::New(CcTest::isolate(), &config); | 7398 v8::Local<Context> context = Context::New(CcTest::isolate(), &config); |
6598 CHECK(context.IsEmpty()); | 7399 CHECK(context.IsEmpty()); |
6599 CHECK(last_location); | 7400 CHECK(last_location); |
6600 } | 7401 } |
6601 | 7402 |
6602 | 7403 |
6603 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message, | 7404 static void MissingScriptInfoMessageListener(v8::Local<v8::Message> message, |
6604 v8::Handle<Value> data) { | 7405 v8::Local<Value> data) { |
7406 v8::Isolate* isolate = CcTest::isolate(); | |
7407 Local<Context> context = isolate->GetCurrentContext(); | |
6605 CHECK(message->GetScriptOrigin().ResourceName()->IsUndefined()); | 7408 CHECK(message->GetScriptOrigin().ResourceName()->IsUndefined()); |
6606 CHECK(v8::Undefined(CcTest::isolate()) | 7409 CHECK(v8::Undefined(isolate) |
6607 ->Equals(message->GetScriptOrigin().ResourceName())); | 7410 ->Equals(context, message->GetScriptOrigin().ResourceName()) |
6608 message->GetLineNumber(); | 7411 .FromJust()); |
6609 message->GetSourceLine(); | 7412 message->GetLineNumber(context).FromJust(); |
7413 message->GetSourceLine(context).ToLocalChecked(); | |
6610 } | 7414 } |
6611 | 7415 |
6612 | 7416 |
6613 THREADED_TEST(ErrorWithMissingScriptInfo) { | 7417 THREADED_TEST(ErrorWithMissingScriptInfo) { |
6614 LocalContext context; | 7418 LocalContext context; |
6615 v8::HandleScope scope(context->GetIsolate()); | 7419 v8::HandleScope scope(context->GetIsolate()); |
6616 v8::V8::AddMessageListener(MissingScriptInfoMessageListener); | 7420 context->GetIsolate()->AddMessageListener(MissingScriptInfoMessageListener); |
6617 CompileRun("throw Error()"); | 7421 CompileRun("throw Error()"); |
6618 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); | 7422 context->GetIsolate()->RemoveMessageListeners( |
7423 MissingScriptInfoMessageListener); | |
6619 } | 7424 } |
6620 | 7425 |
6621 | 7426 |
6622 struct FlagAndPersistent { | 7427 struct FlagAndPersistent { |
6623 bool flag; | 7428 bool flag; |
6624 v8::Global<v8::Object> handle; | 7429 v8::Global<v8::Object> handle; |
6625 }; | 7430 }; |
6626 | 7431 |
6627 | 7432 |
6628 static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) { | 7433 static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) { |
6629 data.GetParameter()->flag = true; | 7434 data.GetParameter()->flag = true; |
6630 data.GetParameter()->handle.Reset(); | 7435 data.GetParameter()->handle.Reset(); |
6631 } | 7436 } |
6632 | 7437 |
6633 | 7438 |
6634 static void IndependentWeakHandle(bool global_gc, bool interlinked) { | 7439 static void IndependentWeakHandle(bool global_gc, bool interlinked) { |
6635 v8::Isolate* iso = CcTest::isolate(); | 7440 v8::Isolate* iso = CcTest::isolate(); |
6636 v8::HandleScope scope(iso); | 7441 v8::HandleScope scope(iso); |
6637 v8::Handle<Context> context = Context::New(iso); | 7442 v8::Local<Context> context = Context::New(iso); |
6638 Context::Scope context_scope(context); | 7443 Context::Scope context_scope(context); |
6639 | 7444 |
6640 FlagAndPersistent object_a, object_b; | 7445 FlagAndPersistent object_a, object_b; |
6641 | 7446 |
6642 intptr_t big_heap_size; | 7447 intptr_t big_heap_size; |
6643 | 7448 |
6644 { | 7449 { |
6645 v8::HandleScope handle_scope(iso); | 7450 v8::HandleScope handle_scope(iso); |
6646 Local<Object> a(v8::Object::New(iso)); | 7451 Local<Object> a(v8::Object::New(iso)); |
6647 Local<Object> b(v8::Object::New(iso)); | 7452 Local<Object> b(v8::Object::New(iso)); |
6648 object_a.handle.Reset(iso, a); | 7453 object_a.handle.Reset(iso, a); |
6649 object_b.handle.Reset(iso, b); | 7454 object_b.handle.Reset(iso, b); |
6650 if (interlinked) { | 7455 if (interlinked) { |
6651 a->Set(v8_str("x"), b); | 7456 a->Set(context, v8_str("x"), b).FromJust(); |
6652 b->Set(v8_str("x"), a); | 7457 b->Set(context, v8_str("x"), a).FromJust(); |
6653 } | 7458 } |
6654 if (global_gc) { | 7459 if (global_gc) { |
6655 CcTest::heap()->CollectAllGarbage(); | 7460 CcTest::heap()->CollectAllGarbage(); |
6656 } else { | 7461 } else { |
6657 CcTest::heap()->CollectGarbage(i::NEW_SPACE); | 7462 CcTest::heap()->CollectGarbage(i::NEW_SPACE); |
6658 } | 7463 } |
6659 // We are relying on this creating a big flag array and reserving the space | 7464 // We are relying on this creating a big flag array and reserving the space |
6660 // up front. | 7465 // up front. |
6661 v8::Handle<Value> big_array = CompileRun("new Array(5000)"); | 7466 v8::Local<Value> big_array = CompileRun("new Array(5000)"); |
6662 a->Set(v8_str("y"), big_array); | 7467 a->Set(context, v8_str("y"), big_array).FromJust(); |
6663 big_heap_size = CcTest::heap()->SizeOfObjects(); | 7468 big_heap_size = CcTest::heap()->SizeOfObjects(); |
6664 } | 7469 } |
6665 | 7470 |
6666 object_a.flag = false; | 7471 object_a.flag = false; |
6667 object_b.flag = false; | 7472 object_b.flag = false; |
6668 object_a.handle.SetWeak(&object_a, &SetFlag, | 7473 object_a.handle.SetWeak(&object_a, &SetFlag, |
6669 v8::WeakCallbackType::kParameter); | 7474 v8::WeakCallbackType::kParameter); |
6670 object_b.handle.SetWeak(&object_b, &SetFlag, | 7475 object_b.handle.SetWeak(&object_b, &SetFlag, |
6671 v8::WeakCallbackType::kParameter); | 7476 v8::WeakCallbackType::kParameter); |
6672 CHECK(!object_b.handle.IsIndependent()); | 7477 CHECK(!object_b.handle.IsIndependent()); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6719 private: | 7524 private: |
6720 int y_; | 7525 int y_; |
6721 int x_; | 7526 int x_; |
6722 }; | 7527 }; |
6723 | 7528 |
6724 | 7529 |
6725 void CheckInternalFields( | 7530 void CheckInternalFields( |
6726 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) { | 7531 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) { |
6727 v8::Persistent<v8::Object>* handle = data.GetParameter(); | 7532 v8::Persistent<v8::Object>* handle = data.GetParameter(); |
6728 handle->Reset(); | 7533 handle->Reset(); |
6729 Trivial* t1 = reinterpret_cast<Trivial*>(data.GetInternalField1()); | 7534 Trivial* t1 = reinterpret_cast<Trivial*>(data.GetInternalField(0)); |
6730 Trivial2* t2 = reinterpret_cast<Trivial2*>(data.GetInternalField2()); | 7535 Trivial2* t2 = reinterpret_cast<Trivial2*>(data.GetInternalField(1)); |
6731 CHECK_EQ(42, t1->x()); | 7536 CHECK_EQ(42, t1->x()); |
6732 CHECK_EQ(103, t2->x()); | 7537 CHECK_EQ(103, t2->x()); |
6733 t1->set_x(1729); | 7538 t1->set_x(1729); |
6734 t2->set_x(33550336); | 7539 t2->set_x(33550336); |
6735 } | 7540 } |
6736 | 7541 |
6737 | 7542 |
6738 void InternalFieldCallback(bool global_gc) { | 7543 void InternalFieldCallback(bool global_gc) { |
6739 LocalContext env; | 7544 LocalContext env; |
6740 v8::Isolate* isolate = env->GetIsolate(); | 7545 v8::Isolate* isolate = env->GetIsolate(); |
6741 v8::HandleScope scope(isolate); | 7546 v8::HandleScope scope(isolate); |
6742 | 7547 |
6743 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 7548 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
6744 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 7549 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
6745 Trivial* t1; | 7550 Trivial* t1; |
6746 Trivial2* t2; | 7551 Trivial2* t2; |
6747 instance_templ->SetInternalFieldCount(2); | 7552 instance_templ->SetInternalFieldCount(2); |
6748 { | 7553 { |
6749 v8::HandleScope scope(isolate); | 7554 v8::HandleScope scope(isolate); |
6750 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 7555 Local<v8::Object> obj = templ->GetFunction(env.local()) |
7556 .ToLocalChecked() | |
7557 ->NewInstance(env.local()) | |
7558 .ToLocalChecked(); | |
6751 v8::Persistent<v8::Object> handle(isolate, obj); | 7559 v8::Persistent<v8::Object> handle(isolate, obj); |
6752 CHECK_EQ(2, obj->InternalFieldCount()); | 7560 CHECK_EQ(2, obj->InternalFieldCount()); |
6753 CHECK(obj->GetInternalField(0)->IsUndefined()); | 7561 CHECK(obj->GetInternalField(0)->IsUndefined()); |
6754 t1 = new Trivial(42); | 7562 t1 = new Trivial(42); |
6755 t2 = new Trivial2(103, 9); | 7563 t2 = new Trivial2(103, 9); |
6756 | 7564 |
6757 obj->SetAlignedPointerInInternalField(0, t1); | 7565 obj->SetAlignedPointerInInternalField(0, t1); |
6758 t1 = reinterpret_cast<Trivial*>(obj->GetAlignedPointerFromInternalField(0)); | 7566 t1 = reinterpret_cast<Trivial*>(obj->GetAlignedPointerFromInternalField(0)); |
6759 CHECK_EQ(42, t1->x()); | 7567 CHECK_EQ(42, t1->x()); |
6760 | 7568 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6798 } | 7606 } |
6799 | 7607 |
6800 | 7608 |
6801 void v8::internal::HeapTester::ResetWeakHandle(bool global_gc) { | 7609 void v8::internal::HeapTester::ResetWeakHandle(bool global_gc) { |
6802 using v8::Context; | 7610 using v8::Context; |
6803 using v8::Local; | 7611 using v8::Local; |
6804 using v8::Object; | 7612 using v8::Object; |
6805 | 7613 |
6806 v8::Isolate* iso = CcTest::isolate(); | 7614 v8::Isolate* iso = CcTest::isolate(); |
6807 v8::HandleScope scope(iso); | 7615 v8::HandleScope scope(iso); |
6808 v8::Handle<Context> context = Context::New(iso); | 7616 v8::Local<Context> context = Context::New(iso); |
6809 Context::Scope context_scope(context); | 7617 Context::Scope context_scope(context); |
6810 | 7618 |
6811 FlagAndPersistent object_a, object_b; | 7619 FlagAndPersistent object_a, object_b; |
6812 | 7620 |
6813 { | 7621 { |
6814 v8::HandleScope handle_scope(iso); | 7622 v8::HandleScope handle_scope(iso); |
6815 Local<Object> a(v8::Object::New(iso)); | 7623 Local<Object> a(v8::Object::New(iso)); |
6816 Local<Object> b(v8::Object::New(iso)); | 7624 Local<Object> b(v8::Object::New(iso)); |
6817 object_a.handle.Reset(iso, a); | 7625 object_a.handle.Reset(iso, a); |
6818 object_b.handle.Reset(iso, b); | 7626 object_b.handle.Reset(iso, b); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6879 const v8::WeakCallbackInfo<FlagAndPersistent>& data) { | 7687 const v8::WeakCallbackInfo<FlagAndPersistent>& data) { |
6880 data.GetParameter()->handle.Reset(); | 7688 data.GetParameter()->handle.Reset(); |
6881 data.SetSecondPassCallback(ForceMarkSweep2); | 7689 data.SetSecondPassCallback(ForceMarkSweep2); |
6882 } | 7690 } |
6883 | 7691 |
6884 | 7692 |
6885 THREADED_TEST(GCFromWeakCallbacks) { | 7693 THREADED_TEST(GCFromWeakCallbacks) { |
6886 v8::Isolate* isolate = CcTest::isolate(); | 7694 v8::Isolate* isolate = CcTest::isolate(); |
6887 v8::Locker locker(CcTest::isolate()); | 7695 v8::Locker locker(CcTest::isolate()); |
6888 v8::HandleScope scope(isolate); | 7696 v8::HandleScope scope(isolate); |
6889 v8::Handle<Context> context = Context::New(isolate); | 7697 v8::Local<Context> context = Context::New(isolate); |
6890 Context::Scope context_scope(context); | 7698 Context::Scope context_scope(context); |
6891 | 7699 |
6892 static const int kNumberOfGCTypes = 2; | 7700 static const int kNumberOfGCTypes = 2; |
6893 typedef v8::WeakCallbackInfo<FlagAndPersistent>::Callback Callback; | 7701 typedef v8::WeakCallbackInfo<FlagAndPersistent>::Callback Callback; |
6894 Callback gc_forcing_callback[kNumberOfGCTypes] = {&ForceScavenge1, | 7702 Callback gc_forcing_callback[kNumberOfGCTypes] = {&ForceScavenge1, |
6895 &ForceMarkSweep1}; | 7703 &ForceMarkSweep1}; |
6896 | 7704 |
6897 typedef void (*GCInvoker)(); | 7705 typedef void (*GCInvoker)(); |
6898 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep}; | 7706 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep}; |
6899 | 7707 |
6900 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) { | 7708 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) { |
6901 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) { | 7709 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) { |
6902 FlagAndPersistent object; | 7710 FlagAndPersistent object; |
6903 { | 7711 { |
6904 v8::HandleScope handle_scope(isolate); | 7712 v8::HandleScope handle_scope(isolate); |
6905 object.handle.Reset(isolate, v8::Object::New(isolate)); | 7713 object.handle.Reset(isolate, v8::Object::New(isolate)); |
6906 } | 7714 } |
6907 object.flag = false; | 7715 object.flag = false; |
6908 object.handle.SetWeak(&object, gc_forcing_callback[inner_gc], | 7716 object.handle.SetWeak(&object, gc_forcing_callback[inner_gc], |
6909 v8::WeakCallbackType::kParameter); | 7717 v8::WeakCallbackType::kParameter); |
6910 object.handle.MarkIndependent(); | 7718 object.handle.MarkIndependent(); |
6911 invoke_gc[outer_gc](); | 7719 invoke_gc[outer_gc](); |
6912 EmptyMessageQueues(isolate); | 7720 EmptyMessageQueues(isolate); |
6913 CHECK(object.flag); | 7721 CHECK(object.flag); |
6914 } | 7722 } |
6915 } | 7723 } |
6916 } | 7724 } |
6917 | 7725 |
6918 | 7726 |
6919 v8::Handle<Function> args_fun; | 7727 v8::Local<Function> args_fun; |
6920 | 7728 |
6921 | 7729 |
6922 static void ArgumentsTestCallback( | 7730 static void ArgumentsTestCallback( |
6923 const v8::FunctionCallbackInfo<v8::Value>& args) { | 7731 const v8::FunctionCallbackInfo<v8::Value>& args) { |
6924 ApiTestFuzzer::Fuzz(); | 7732 ApiTestFuzzer::Fuzz(); |
6925 v8::Isolate* isolate = args.GetIsolate(); | 7733 v8::Isolate* isolate = args.GetIsolate(); |
6926 CHECK(args_fun->Equals(args.Callee())); | 7734 Local<Context> context = isolate->GetCurrentContext(); |
7735 CHECK(args_fun->Equals(context, args.Callee()).FromJust()); | |
6927 CHECK_EQ(3, args.Length()); | 7736 CHECK_EQ(3, args.Length()); |
6928 CHECK(v8::Integer::New(isolate, 1)->Equals(args[0])); | 7737 CHECK(v8::Integer::New(isolate, 1)->Equals(context, args[0]).FromJust()); |
6929 CHECK(v8::Integer::New(isolate, 2)->Equals(args[1])); | 7738 CHECK(v8::Integer::New(isolate, 2)->Equals(context, args[1]).FromJust()); |
6930 CHECK(v8::Integer::New(isolate, 3)->Equals(args[2])); | 7739 CHECK(v8::Integer::New(isolate, 3)->Equals(context, args[2]).FromJust()); |
6931 CHECK(v8::Undefined(isolate)->Equals(args[3])); | 7740 CHECK(v8::Undefined(isolate)->Equals(context, args[3]).FromJust()); |
6932 v8::HandleScope scope(args.GetIsolate()); | 7741 v8::HandleScope scope(args.GetIsolate()); |
6933 CcTest::heap()->CollectAllGarbage(); | 7742 CcTest::heap()->CollectAllGarbage(); |
6934 } | 7743 } |
6935 | 7744 |
6936 | 7745 |
6937 THREADED_TEST(Arguments) { | 7746 THREADED_TEST(Arguments) { |
6938 v8::Isolate* isolate = CcTest::isolate(); | 7747 v8::Isolate* isolate = CcTest::isolate(); |
6939 v8::HandleScope scope(isolate); | 7748 v8::HandleScope scope(isolate); |
6940 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); | 7749 v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); |
6941 global->Set(v8_str("f"), | 7750 global->Set(v8_str("f"), |
6942 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); | 7751 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); |
6943 LocalContext context(NULL, global); | 7752 LocalContext context(NULL, global); |
6944 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); | 7753 args_fun = context->Global() |
6945 v8_compile("f(1, 2, 3)")->Run(); | 7754 ->Get(context.local(), v8_str("f")) |
7755 .ToLocalChecked() | |
7756 .As<Function>(); | |
7757 v8_compile("f(1, 2, 3)")->Run(context.local()).ToLocalChecked(); | |
6946 } | 7758 } |
6947 | 7759 |
6948 | 7760 |
6949 static int p_getter_count; | 7761 static int p_getter_count; |
6950 static int p_getter_count2; | 7762 static int p_getter_count2; |
6951 | 7763 |
6952 | 7764 |
6953 static void PGetter(Local<String> name, | 7765 static void PGetter(Local<Name> name, |
6954 const v8::PropertyCallbackInfo<v8::Value>& info) { | 7766 const v8::PropertyCallbackInfo<v8::Value>& info) { |
6955 ApiTestFuzzer::Fuzz(); | 7767 ApiTestFuzzer::Fuzz(); |
6956 p_getter_count++; | 7768 p_getter_count++; |
6957 v8::Handle<v8::Object> global = | 7769 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
6958 info.GetIsolate()->GetCurrentContext()->Global(); | 7770 v8::Local<v8::Object> global = context->Global(); |
6959 CHECK(info.Holder()->Equals(global->Get(v8_str("o1")))); | 7771 CHECK( |
6960 if (name->Equals(v8_str("p1"))) { | 7772 info.Holder() |
6961 CHECK(info.This()->Equals(global->Get(v8_str("o1")))); | 7773 ->Equals(context, global->Get(context, v8_str("o1")).ToLocalChecked()) |
6962 } else if (name->Equals(v8_str("p2"))) { | 7774 .FromJust()); |
6963 CHECK(info.This()->Equals(global->Get(v8_str("o2")))); | 7775 if (name->Equals(context, v8_str("p1")).FromJust()) { |
6964 } else if (name->Equals(v8_str("p3"))) { | 7776 CHECK(info.This() |
6965 CHECK(info.This()->Equals(global->Get(v8_str("o3")))); | 7777 ->Equals(context, |
6966 } else if (name->Equals(v8_str("p4"))) { | 7778 global->Get(context, v8_str("o1")).ToLocalChecked()) |
6967 CHECK(info.This()->Equals(global->Get(v8_str("o4")))); | 7779 .FromJust()); |
7780 } else if (name->Equals(context, v8_str("p2")).FromJust()) { | |
7781 CHECK(info.This() | |
7782 ->Equals(context, | |
7783 global->Get(context, v8_str("o2")).ToLocalChecked()) | |
7784 .FromJust()); | |
7785 } else if (name->Equals(context, v8_str("p3")).FromJust()) { | |
7786 CHECK(info.This() | |
7787 ->Equals(context, | |
7788 global->Get(context, v8_str("o3")).ToLocalChecked()) | |
7789 .FromJust()); | |
7790 } else if (name->Equals(context, v8_str("p4")).FromJust()) { | |
7791 CHECK(info.This() | |
7792 ->Equals(context, | |
7793 global->Get(context, v8_str("o4")).ToLocalChecked()) | |
7794 .FromJust()); | |
6968 } | 7795 } |
6969 } | 7796 } |
6970 | 7797 |
6971 | 7798 |
6972 static void RunHolderTest(v8::Handle<v8::ObjectTemplate> obj) { | 7799 static void RunHolderTest(v8::Local<v8::ObjectTemplate> obj) { |
6973 ApiTestFuzzer::Fuzz(); | 7800 ApiTestFuzzer::Fuzz(); |
6974 LocalContext context; | 7801 LocalContext context; |
6975 context->Global()->Set(v8_str("o1"), obj->NewInstance()); | 7802 CHECK(context->Global() |
7803 ->Set(context.local(), v8_str("o1"), | |
7804 obj->NewInstance(context.local()).ToLocalChecked()) | |
7805 .FromJust()); | |
6976 CompileRun( | 7806 CompileRun( |
6977 "o1.__proto__ = { };" | 7807 "o1.__proto__ = { };" |
6978 "var o2 = { __proto__: o1 };" | 7808 "var o2 = { __proto__: o1 };" |
6979 "var o3 = { __proto__: o2 };" | 7809 "var o3 = { __proto__: o2 };" |
6980 "var o4 = { __proto__: o3 };" | 7810 "var o4 = { __proto__: o3 };" |
6981 "for (var i = 0; i < 10; i++) o4.p4;" | 7811 "for (var i = 0; i < 10; i++) o4.p4;" |
6982 "for (var i = 0; i < 10; i++) o3.p3;" | 7812 "for (var i = 0; i < 10; i++) o3.p3;" |
6983 "for (var i = 0; i < 10; i++) o2.p2;" | 7813 "for (var i = 0; i < 10; i++) o2.p2;" |
6984 "for (var i = 0; i < 10; i++) o1.p1;"); | 7814 "for (var i = 0; i < 10; i++) o1.p1;"); |
6985 } | 7815 } |
6986 | 7816 |
6987 | 7817 |
6988 static void PGetter2(Local<Name> name, | 7818 static void PGetter2(Local<Name> name, |
6989 const v8::PropertyCallbackInfo<v8::Value>& info) { | 7819 const v8::PropertyCallbackInfo<v8::Value>& info) { |
6990 ApiTestFuzzer::Fuzz(); | 7820 ApiTestFuzzer::Fuzz(); |
6991 p_getter_count2++; | 7821 p_getter_count2++; |
6992 v8::Handle<v8::Object> global = | 7822 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
6993 info.GetIsolate()->GetCurrentContext()->Global(); | 7823 v8::Local<v8::Object> global = context->Global(); |
6994 CHECK(info.Holder()->Equals(global->Get(v8_str("o1")))); | 7824 CHECK( |
6995 if (name->Equals(v8_str("p1"))) { | 7825 info.Holder() |
6996 CHECK(info.This()->Equals(global->Get(v8_str("o1")))); | 7826 ->Equals(context, global->Get(context, v8_str("o1")).ToLocalChecked()) |
6997 } else if (name->Equals(v8_str("p2"))) { | 7827 .FromJust()); |
6998 CHECK(info.This()->Equals(global->Get(v8_str("o2")))); | 7828 if (name->Equals(context, v8_str("p1")).FromJust()) { |
6999 } else if (name->Equals(v8_str("p3"))) { | 7829 CHECK(info.This() |
7000 CHECK(info.This()->Equals(global->Get(v8_str("o3")))); | 7830 ->Equals(context, |
7001 } else if (name->Equals(v8_str("p4"))) { | 7831 global->Get(context, v8_str("o1")).ToLocalChecked()) |
7002 CHECK(info.This()->Equals(global->Get(v8_str("o4")))); | 7832 .FromJust()); |
7833 } else if (name->Equals(context, v8_str("p2")).FromJust()) { | |
7834 CHECK(info.This() | |
7835 ->Equals(context, | |
7836 global->Get(context, v8_str("o2")).ToLocalChecked()) | |
7837 .FromJust()); | |
7838 } else if (name->Equals(context, v8_str("p3")).FromJust()) { | |
7839 CHECK(info.This() | |
7840 ->Equals(context, | |
7841 global->Get(context, v8_str("o3")).ToLocalChecked()) | |
7842 .FromJust()); | |
7843 } else if (name->Equals(context, v8_str("p4")).FromJust()) { | |
7844 CHECK(info.This() | |
7845 ->Equals(context, | |
7846 global->Get(context, v8_str("o4")).ToLocalChecked()) | |
7847 .FromJust()); | |
7003 } | 7848 } |
7004 } | 7849 } |
7005 | 7850 |
7006 | 7851 |
7007 THREADED_TEST(GetterHolders) { | 7852 THREADED_TEST(GetterHolders) { |
7008 v8::Isolate* isolate = CcTest::isolate(); | 7853 v8::Isolate* isolate = CcTest::isolate(); |
7009 v8::HandleScope scope(isolate); | 7854 v8::HandleScope scope(isolate); |
7010 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); | 7855 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); |
7011 obj->SetAccessor(v8_str("p1"), PGetter); | 7856 obj->SetAccessor(v8_str("p1"), PGetter); |
7012 obj->SetAccessor(v8_str("p2"), PGetter); | 7857 obj->SetAccessor(v8_str("p2"), PGetter); |
7013 obj->SetAccessor(v8_str("p3"), PGetter); | 7858 obj->SetAccessor(v8_str("p3"), PGetter); |
7014 obj->SetAccessor(v8_str("p4"), PGetter); | 7859 obj->SetAccessor(v8_str("p4"), PGetter); |
7015 p_getter_count = 0; | 7860 p_getter_count = 0; |
7016 RunHolderTest(obj); | 7861 RunHolderTest(obj); |
7017 CHECK_EQ(40, p_getter_count); | 7862 CHECK_EQ(40, p_getter_count); |
7018 } | 7863 } |
7019 | 7864 |
7020 | 7865 |
7021 THREADED_TEST(PreInterceptorHolders) { | 7866 THREADED_TEST(PreInterceptorHolders) { |
7022 v8::Isolate* isolate = CcTest::isolate(); | 7867 v8::Isolate* isolate = CcTest::isolate(); |
7023 v8::HandleScope scope(isolate); | 7868 v8::HandleScope scope(isolate); |
7024 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); | 7869 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); |
7025 obj->SetHandler(v8::NamedPropertyHandlerConfiguration(PGetter2)); | 7870 obj->SetHandler(v8::NamedPropertyHandlerConfiguration(PGetter2)); |
7026 p_getter_count2 = 0; | 7871 p_getter_count2 = 0; |
7027 RunHolderTest(obj); | 7872 RunHolderTest(obj); |
7028 CHECK_EQ(40, p_getter_count2); | 7873 CHECK_EQ(40, p_getter_count2); |
7029 } | 7874 } |
7030 | 7875 |
7031 | 7876 |
7032 THREADED_TEST(ObjectInstantiation) { | 7877 THREADED_TEST(ObjectInstantiation) { |
7033 v8::Isolate* isolate = CcTest::isolate(); | 7878 v8::Isolate* isolate = CcTest::isolate(); |
7034 v8::HandleScope scope(isolate); | 7879 v8::HandleScope scope(isolate); |
7035 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); | 7880 v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
7036 templ->SetAccessor(v8_str("t"), PGetter2); | 7881 templ->SetAccessor(v8_str("t"), PGetter2); |
7037 LocalContext context; | 7882 LocalContext context; |
7038 context->Global()->Set(v8_str("o"), templ->NewInstance()); | 7883 CHECK(context->Global() |
7884 ->Set(context.local(), v8_str("o"), | |
7885 templ->NewInstance(context.local()).ToLocalChecked()) | |
7886 .FromJust()); | |
7039 for (int i = 0; i < 100; i++) { | 7887 for (int i = 0; i < 100; i++) { |
7040 v8::HandleScope inner_scope(CcTest::isolate()); | 7888 v8::HandleScope inner_scope(CcTest::isolate()); |
7041 v8::Handle<v8::Object> obj = templ->NewInstance(); | 7889 v8::Local<v8::Object> obj = |
7042 CHECK(!obj->Equals(context->Global()->Get(v8_str("o")))); | 7890 templ->NewInstance(context.local()).ToLocalChecked(); |
7043 context->Global()->Set(v8_str("o2"), obj); | 7891 CHECK(!obj->Equals(context.local(), context->Global() |
7044 v8::Handle<Value> value = | 7892 ->Get(context.local(), v8_str("o")) |
7045 CompileRun("o.__proto__ === o2.__proto__"); | 7893 .ToLocalChecked()) |
7046 CHECK(v8::True(isolate)->Equals(value)); | 7894 .FromJust()); |
7047 context->Global()->Set(v8_str("o"), obj); | 7895 CHECK( |
7896 context->Global()->Set(context.local(), v8_str("o2"), obj).FromJust()); | |
7897 v8::Local<Value> value = CompileRun("o.__proto__ === o2.__proto__"); | |
7898 CHECK(v8::True(isolate)->Equals(context.local(), value).FromJust()); | |
7899 CHECK(context->Global()->Set(context.local(), v8_str("o"), obj).FromJust()); | |
7048 } | 7900 } |
7049 } | 7901 } |
7050 | 7902 |
7051 | 7903 |
7052 static int StrCmp16(uint16_t* a, uint16_t* b) { | 7904 static int StrCmp16(uint16_t* a, uint16_t* b) { |
7053 while (true) { | 7905 while (true) { |
7054 if (*a == 0 && *b == 0) return 0; | 7906 if (*a == 0 && *b == 0) return 0; |
7055 if (*a != *b) return 0 + *a - *b; | 7907 if (*a != *b) return 0 + *a - *b; |
7056 a++; | 7908 a++; |
7057 b++; | 7909 b++; |
7058 } | 7910 } |
7059 } | 7911 } |
7060 | 7912 |
7061 | 7913 |
7062 static int StrNCmp16(uint16_t* a, uint16_t* b, int n) { | 7914 static int StrNCmp16(uint16_t* a, uint16_t* b, int n) { |
7063 while (true) { | 7915 while (true) { |
7064 if (n-- == 0) return 0; | 7916 if (n-- == 0) return 0; |
7065 if (*a == 0 && *b == 0) return 0; | 7917 if (*a == 0 && *b == 0) return 0; |
7066 if (*a != *b) return 0 + *a - *b; | 7918 if (*a != *b) return 0 + *a - *b; |
7067 a++; | 7919 a++; |
7068 b++; | 7920 b++; |
7069 } | 7921 } |
7070 } | 7922 } |
7071 | 7923 |
7072 | 7924 |
7073 int GetUtf8Length(Handle<String> str) { | 7925 int GetUtf8Length(Local<String> str) { |
7074 int len = str->Utf8Length(); | 7926 int len = str->Utf8Length(); |
7075 if (len < 0) { | 7927 if (len < 0) { |
7076 i::Handle<i::String> istr(v8::Utils::OpenHandle(*str)); | 7928 i::Handle<i::String> istr(v8::Utils::OpenHandle(*str)); |
7077 i::String::Flatten(istr); | 7929 i::String::Flatten(istr); |
7078 len = str->Utf8Length(); | 7930 len = str->Utf8Length(); |
7079 } | 7931 } |
7080 return len; | 7932 return len; |
7081 } | 7933 } |
7082 | 7934 |
7083 | 7935 |
7084 THREADED_TEST(StringWrite) { | 7936 THREADED_TEST(StringWrite) { |
7085 LocalContext context; | 7937 LocalContext context; |
7086 v8::HandleScope scope(context->GetIsolate()); | 7938 v8::HandleScope scope(context->GetIsolate()); |
7087 v8::Handle<String> str = v8_str("abcde"); | 7939 v8::Local<String> str = v8_str("abcde"); |
7088 // abc<Icelandic eth><Unicode snowman>. | 7940 // abc<Icelandic eth><Unicode snowman>. |
7089 v8::Handle<String> str2 = v8_str("abc\303\260\342\230\203"); | 7941 v8::Local<String> str2 = v8_str("abc\303\260\342\230\203"); |
7090 v8::Handle<String> str3 = v8::String::NewFromUtf8( | 7942 v8::Local<String> str3 = |
7091 context->GetIsolate(), "abc\0def", v8::String::kNormalString, 7); | 7943 v8::String::NewFromUtf8(context->GetIsolate(), "abc\0def", |
7944 v8::NewStringType::kNormal, 7) | |
7945 .ToLocalChecked(); | |
7092 // "ab" + lead surrogate + "cd" + trail surrogate + "ef" | 7946 // "ab" + lead surrogate + "cd" + trail surrogate + "ef" |
7093 uint16_t orphans[8] = { 0x61, 0x62, 0xd800, 0x63, 0x64, 0xdc00, 0x65, 0x66 }; | 7947 uint16_t orphans[8] = { 0x61, 0x62, 0xd800, 0x63, 0x64, 0xdc00, 0x65, 0x66 }; |
7094 v8::Handle<String> orphans_str = v8::String::NewFromTwoByte( | 7948 v8::Local<String> orphans_str = |
7095 context->GetIsolate(), orphans, v8::String::kNormalString, 8); | 7949 v8::String::NewFromTwoByte(context->GetIsolate(), orphans, |
7950 v8::NewStringType::kNormal, 8) | |
7951 .ToLocalChecked(); | |
7096 // single lead surrogate | 7952 // single lead surrogate |
7097 uint16_t lead[1] = { 0xd800 }; | 7953 uint16_t lead[1] = { 0xd800 }; |
7098 v8::Handle<String> lead_str = v8::String::NewFromTwoByte( | 7954 v8::Local<String> lead_str = |
7099 context->GetIsolate(), lead, v8::String::kNormalString, 1); | 7955 v8::String::NewFromTwoByte(context->GetIsolate(), lead, |
7956 v8::NewStringType::kNormal, 1) | |
7957 .ToLocalChecked(); | |
7100 // single trail surrogate | 7958 // single trail surrogate |
7101 uint16_t trail[1] = { 0xdc00 }; | 7959 uint16_t trail[1] = { 0xdc00 }; |
7102 v8::Handle<String> trail_str = v8::String::NewFromTwoByte( | 7960 v8::Local<String> trail_str = |
7103 context->GetIsolate(), trail, v8::String::kNormalString, 1); | 7961 v8::String::NewFromTwoByte(context->GetIsolate(), trail, |
7962 v8::NewStringType::kNormal, 1) | |
7963 .ToLocalChecked(); | |
7104 // surrogate pair | 7964 // surrogate pair |
7105 uint16_t pair[2] = { 0xd800, 0xdc00 }; | 7965 uint16_t pair[2] = { 0xd800, 0xdc00 }; |
7106 v8::Handle<String> pair_str = v8::String::NewFromTwoByte( | 7966 v8::Local<String> pair_str = |
7107 context->GetIsolate(), pair, v8::String::kNormalString, 2); | 7967 v8::String::NewFromTwoByte(context->GetIsolate(), pair, |
7968 v8::NewStringType::kNormal, 2) | |
7969 .ToLocalChecked(); | |
7108 const int kStride = 4; // Must match stride in for loops in JS below. | 7970 const int kStride = 4; // Must match stride in for loops in JS below. |
7109 CompileRun( | 7971 CompileRun( |
7110 "var left = '';" | 7972 "var left = '';" |
7111 "for (var i = 0; i < 0xd800; i += 4) {" | 7973 "for (var i = 0; i < 0xd800; i += 4) {" |
7112 " left = left + String.fromCharCode(i);" | 7974 " left = left + String.fromCharCode(i);" |
7113 "}"); | 7975 "}"); |
7114 CompileRun( | 7976 CompileRun( |
7115 "var right = '';" | 7977 "var right = '';" |
7116 "for (var i = 0; i < 0xd800; i += 4) {" | 7978 "for (var i = 0; i < 0xd800; i += 4) {" |
7117 " right = String.fromCharCode(i) + right;" | 7979 " right = String.fromCharCode(i) + right;" |
7118 "}"); | 7980 "}"); |
7119 v8::Handle<v8::Object> global = context->Global(); | 7981 v8::Local<v8::Object> global = context->Global(); |
7120 Handle<String> left_tree = global->Get(v8_str("left")).As<String>(); | 7982 Local<String> left_tree = global->Get(context.local(), v8_str("left")) |
7121 Handle<String> right_tree = global->Get(v8_str("right")).As<String>(); | 7983 .ToLocalChecked() |
7984 .As<String>(); | |
7985 Local<String> right_tree = global->Get(context.local(), v8_str("right")) | |
7986 .ToLocalChecked() | |
7987 .As<String>(); | |
7122 | 7988 |
7123 CHECK_EQ(5, str2->Length()); | 7989 CHECK_EQ(5, str2->Length()); |
7124 CHECK_EQ(0xd800 / kStride, left_tree->Length()); | 7990 CHECK_EQ(0xd800 / kStride, left_tree->Length()); |
7125 CHECK_EQ(0xd800 / kStride, right_tree->Length()); | 7991 CHECK_EQ(0xd800 / kStride, right_tree->Length()); |
7126 | 7992 |
7127 char buf[100]; | 7993 char buf[100]; |
7128 char utf8buf[0xd800 * 3]; | 7994 char utf8buf[0xd800 * 3]; |
7129 uint16_t wbuf[100]; | 7995 uint16_t wbuf[100]; |
7130 int len; | 7996 int len; |
7131 int charlen; | 7997 int charlen; |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7387 CHECK_EQ(0, str->WriteUtf8(NULL, 0, 0, String::NO_NULL_TERMINATION)); | 8253 CHECK_EQ(0, str->WriteUtf8(NULL, 0, 0, String::NO_NULL_TERMINATION)); |
7388 CHECK_EQ(0, str->Write(NULL, 0, 0, String::NO_NULL_TERMINATION)); | 8254 CHECK_EQ(0, str->Write(NULL, 0, 0, String::NO_NULL_TERMINATION)); |
7389 } | 8255 } |
7390 | 8256 |
7391 | 8257 |
7392 static void Utf16Helper( | 8258 static void Utf16Helper( |
7393 LocalContext& context, // NOLINT | 8259 LocalContext& context, // NOLINT |
7394 const char* name, | 8260 const char* name, |
7395 const char* lengths_name, | 8261 const char* lengths_name, |
7396 int len) { | 8262 int len) { |
7397 Local<v8::Array> a = | 8263 Local<v8::Array> a = Local<v8::Array>::Cast( |
7398 Local<v8::Array>::Cast(context->Global()->Get(v8_str(name))); | 8264 context->Global()->Get(context.local(), v8_str(name)).ToLocalChecked()); |
7399 Local<v8::Array> alens = | 8265 Local<v8::Array> alens = |
7400 Local<v8::Array>::Cast(context->Global()->Get(v8_str(lengths_name))); | 8266 Local<v8::Array>::Cast(context->Global() |
8267 ->Get(context.local(), v8_str(lengths_name)) | |
8268 .ToLocalChecked()); | |
7401 for (int i = 0; i < len; i++) { | 8269 for (int i = 0; i < len; i++) { |
7402 Local<v8::String> string = | 8270 Local<v8::String> string = |
7403 Local<v8::String>::Cast(a->Get(i)); | 8271 Local<v8::String>::Cast(a->Get(context.local(), i).ToLocalChecked()); |
7404 Local<v8::Number> expected_len = | 8272 Local<v8::Number> expected_len = Local<v8::Number>::Cast( |
7405 Local<v8::Number>::Cast(alens->Get(i)); | 8273 alens->Get(context.local(), i).ToLocalChecked()); |
7406 int length = GetUtf8Length(string); | 8274 int length = GetUtf8Length(string); |
7407 CHECK_EQ(static_cast<int>(expected_len->Value()), length); | 8275 CHECK_EQ(static_cast<int>(expected_len->Value()), length); |
7408 } | 8276 } |
7409 } | 8277 } |
7410 | 8278 |
7411 | 8279 |
7412 THREADED_TEST(Utf16) { | 8280 THREADED_TEST(Utf16) { |
7413 LocalContext context; | 8281 LocalContext context; |
7414 v8::HandleScope scope(context->GetIsolate()); | 8282 v8::HandleScope scope(context->GetIsolate()); |
7415 CompileRun( | 8283 CompileRun( |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7451 // The 'm's that end with 0xd8.. are 1, 4 and 7 | 8319 // The 'm's that end with 0xd8.. are 1, 4 and 7 |
7452 " if ((m % 3) == 1 && n >= 6) utf -= 2;" | 8320 " if ((m % 3) == 1 && n >= 6) utf -= 2;" |
7453 " a2lens.push(utf);" | 8321 " a2lens.push(utf);" |
7454 " }" | 8322 " }" |
7455 "}"); | 8323 "}"); |
7456 Utf16Helper(context, "a", "alens", 9); | 8324 Utf16Helper(context, "a", "alens", 9); |
7457 Utf16Helper(context, "a2", "a2lens", 81); | 8325 Utf16Helper(context, "a2", "a2lens", 81); |
7458 } | 8326 } |
7459 | 8327 |
7460 | 8328 |
7461 static bool SameSymbol(Handle<String> s1, Handle<String> s2) { | 8329 static bool SameSymbol(Local<String> s1, Local<String> s2) { |
7462 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1)); | 8330 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1)); |
7463 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2)); | 8331 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2)); |
7464 return *is1 == *is2; | 8332 return *is1 == *is2; |
7465 } | 8333 } |
7466 | 8334 |
7467 | 8335 |
7468 THREADED_TEST(Utf16Symbol) { | 8336 THREADED_TEST(Utf16Symbol) { |
7469 LocalContext context; | 8337 LocalContext context; |
7470 v8::HandleScope scope(context->GetIsolate()); | 8338 v8::HandleScope scope(context->GetIsolate()); |
7471 | 8339 |
7472 Handle<String> symbol1 = v8::String::NewFromUtf8( | 8340 Local<String> symbol1 = |
7473 context->GetIsolate(), "abc", v8::String::kInternalizedString); | 8341 v8::String::NewFromUtf8(context->GetIsolate(), "abc", |
7474 Handle<String> symbol2 = v8::String::NewFromUtf8( | 8342 v8::NewStringType::kInternalized) |
7475 context->GetIsolate(), "abc", v8::String::kInternalizedString); | 8343 .ToLocalChecked(); |
8344 Local<String> symbol2 = | |
8345 v8::String::NewFromUtf8(context->GetIsolate(), "abc", | |
8346 v8::NewStringType::kInternalized) | |
8347 .ToLocalChecked(); | |
7476 CHECK(SameSymbol(symbol1, symbol2)); | 8348 CHECK(SameSymbol(symbol1, symbol2)); |
7477 | 8349 |
7478 CompileRun( | 8350 CompileRun( |
7479 "var sym0 = 'benedictus';" | 8351 "var sym0 = 'benedictus';" |
7480 "var sym0b = 'S\303\270ren';" | 8352 "var sym0b = 'S\303\270ren';" |
7481 "var sym1 = '\355\240\201\355\260\207';" | 8353 "var sym1 = '\355\240\201\355\260\207';" |
7482 "var sym2 = '\360\220\220\210';" | 8354 "var sym2 = '\360\220\220\210';" |
7483 "var sym3 = 'x\355\240\201\355\260\207';" | 8355 "var sym3 = 'x\355\240\201\355\260\207';" |
7484 "var sym4 = 'x\360\220\220\210';" | 8356 "var sym4 = 'x\360\220\220\210';" |
7485 "if (sym1.length != 2) throw sym1;" | 8357 "if (sym1.length != 2) throw sym1;" |
7486 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);" | 8358 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);" |
7487 "if (sym2.length != 2) throw sym2;" | 8359 "if (sym2.length != 2) throw sym2;" |
7488 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);" | 8360 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);" |
7489 "if (sym3.length != 3) throw sym3;" | 8361 "if (sym3.length != 3) throw sym3;" |
7490 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);" | 8362 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);" |
7491 "if (sym4.length != 3) throw sym4;" | 8363 "if (sym4.length != 3) throw sym4;" |
7492 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);"); | 8364 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);"); |
7493 Handle<String> sym0 = v8::String::NewFromUtf8( | 8365 Local<String> sym0 = |
7494 context->GetIsolate(), "benedictus", v8::String::kInternalizedString); | 8366 v8::String::NewFromUtf8(context->GetIsolate(), "benedictus", |
7495 Handle<String> sym0b = v8::String::NewFromUtf8( | 8367 v8::NewStringType::kInternalized) |
7496 context->GetIsolate(), "S\303\270ren", v8::String::kInternalizedString); | 8368 .ToLocalChecked(); |
7497 Handle<String> sym1 = | 8369 Local<String> sym0b = |
8370 v8::String::NewFromUtf8(context->GetIsolate(), "S\303\270ren", | |
8371 v8::NewStringType::kInternalized) | |
8372 .ToLocalChecked(); | |
8373 Local<String> sym1 = | |
7498 v8::String::NewFromUtf8(context->GetIsolate(), "\355\240\201\355\260\207", | 8374 v8::String::NewFromUtf8(context->GetIsolate(), "\355\240\201\355\260\207", |
7499 v8::String::kInternalizedString); | 8375 v8::NewStringType::kInternalized) |
7500 Handle<String> sym2 = | 8376 .ToLocalChecked(); |
8377 Local<String> sym2 = | |
7501 v8::String::NewFromUtf8(context->GetIsolate(), "\360\220\220\210", | 8378 v8::String::NewFromUtf8(context->GetIsolate(), "\360\220\220\210", |
7502 v8::String::kInternalizedString); | 8379 v8::NewStringType::kInternalized) |
7503 Handle<String> sym3 = v8::String::NewFromUtf8( | 8380 .ToLocalChecked(); |
7504 context->GetIsolate(), "x\355\240\201\355\260\207", | 8381 Local<String> sym3 = v8::String::NewFromUtf8(context->GetIsolate(), |
7505 v8::String::kInternalizedString); | 8382 "x\355\240\201\355\260\207", |
7506 Handle<String> sym4 = | 8383 v8::NewStringType::kInternalized) |
8384 .ToLocalChecked(); | |
8385 Local<String> sym4 = | |
7507 v8::String::NewFromUtf8(context->GetIsolate(), "x\360\220\220\210", | 8386 v8::String::NewFromUtf8(context->GetIsolate(), "x\360\220\220\210", |
7508 v8::String::kInternalizedString); | 8387 v8::NewStringType::kInternalized) |
8388 .ToLocalChecked(); | |
7509 v8::Local<v8::Object> global = context->Global(); | 8389 v8::Local<v8::Object> global = context->Global(); |
7510 Local<Value> s0 = global->Get(v8_str("sym0")); | 8390 Local<Value> s0 = |
7511 Local<Value> s0b = global->Get(v8_str("sym0b")); | 8391 global->Get(context.local(), v8_str("sym0")).ToLocalChecked(); |
7512 Local<Value> s1 = global->Get(v8_str("sym1")); | 8392 Local<Value> s0b = |
7513 Local<Value> s2 = global->Get(v8_str("sym2")); | 8393 global->Get(context.local(), v8_str("sym0b")).ToLocalChecked(); |
7514 Local<Value> s3 = global->Get(v8_str("sym3")); | 8394 Local<Value> s1 = |
7515 Local<Value> s4 = global->Get(v8_str("sym4")); | 8395 global->Get(context.local(), v8_str("sym1")).ToLocalChecked(); |
7516 CHECK(SameSymbol(sym0, Handle<String>::Cast(s0))); | 8396 Local<Value> s2 = |
7517 CHECK(SameSymbol(sym0b, Handle<String>::Cast(s0b))); | 8397 global->Get(context.local(), v8_str("sym2")).ToLocalChecked(); |
7518 CHECK(SameSymbol(sym1, Handle<String>::Cast(s1))); | 8398 Local<Value> s3 = |
7519 CHECK(SameSymbol(sym2, Handle<String>::Cast(s2))); | 8399 global->Get(context.local(), v8_str("sym3")).ToLocalChecked(); |
7520 CHECK(SameSymbol(sym3, Handle<String>::Cast(s3))); | 8400 Local<Value> s4 = |
7521 CHECK(SameSymbol(sym4, Handle<String>::Cast(s4))); | 8401 global->Get(context.local(), v8_str("sym4")).ToLocalChecked(); |
8402 CHECK(SameSymbol(sym0, Local<String>::Cast(s0))); | |
8403 CHECK(SameSymbol(sym0b, Local<String>::Cast(s0b))); | |
8404 CHECK(SameSymbol(sym1, Local<String>::Cast(s1))); | |
8405 CHECK(SameSymbol(sym2, Local<String>::Cast(s2))); | |
8406 CHECK(SameSymbol(sym3, Local<String>::Cast(s3))); | |
8407 CHECK(SameSymbol(sym4, Local<String>::Cast(s4))); | |
7522 } | 8408 } |
7523 | 8409 |
7524 | 8410 |
7525 THREADED_TEST(Utf16MissingTrailing) { | 8411 THREADED_TEST(Utf16MissingTrailing) { |
7526 LocalContext context; | 8412 LocalContext context; |
7527 v8::HandleScope scope(context->GetIsolate()); | 8413 v8::HandleScope scope(context->GetIsolate()); |
7528 | 8414 |
7529 // Make sure it will go past the buffer, so it will call `WriteUtf16Slow` | 8415 // Make sure it will go past the buffer, so it will call `WriteUtf16Slow` |
7530 int size = 1024 * 64; | 8416 int size = 1024 * 64; |
7531 uint8_t* buffer = new uint8_t[size]; | 8417 uint8_t* buffer = new uint8_t[size]; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7571 | 8457 |
7572 delete[] buffer; | 8458 delete[] buffer; |
7573 } | 8459 } |
7574 | 8460 |
7575 | 8461 |
7576 THREADED_TEST(ToArrayIndex) { | 8462 THREADED_TEST(ToArrayIndex) { |
7577 LocalContext context; | 8463 LocalContext context; |
7578 v8::Isolate* isolate = context->GetIsolate(); | 8464 v8::Isolate* isolate = context->GetIsolate(); |
7579 v8::HandleScope scope(isolate); | 8465 v8::HandleScope scope(isolate); |
7580 | 8466 |
7581 v8::Handle<String> str = v8_str("42"); | 8467 v8::Local<String> str = v8_str("42"); |
7582 v8::Handle<v8::Uint32> index = str->ToArrayIndex(); | 8468 v8::MaybeLocal<v8::Uint32> index = str->ToArrayIndex(context.local()); |
7583 CHECK(!index.IsEmpty()); | 8469 CHECK(!index.IsEmpty()); |
7584 CHECK_EQ(42.0, index->Uint32Value()); | 8470 CHECK_EQ(42.0, |
8471 index.ToLocalChecked()->Uint32Value(context.local()).FromJust()); | |
7585 str = v8_str("42asdf"); | 8472 str = v8_str("42asdf"); |
7586 index = str->ToArrayIndex(); | 8473 index = str->ToArrayIndex(context.local()); |
7587 CHECK(index.IsEmpty()); | 8474 CHECK(index.IsEmpty()); |
7588 str = v8_str("-42"); | 8475 str = v8_str("-42"); |
7589 index = str->ToArrayIndex(); | 8476 index = str->ToArrayIndex(context.local()); |
7590 CHECK(index.IsEmpty()); | 8477 CHECK(index.IsEmpty()); |
7591 str = v8_str("4294967294"); | 8478 str = v8_str("4294967294"); |
7592 index = str->ToArrayIndex(); | 8479 index = str->ToArrayIndex(context.local()); |
7593 CHECK(!index.IsEmpty()); | 8480 CHECK(!index.IsEmpty()); |
7594 CHECK_EQ(4294967294.0, index->Uint32Value()); | 8481 CHECK_EQ(4294967294.0, |
7595 v8::Handle<v8::Number> num = v8::Number::New(isolate, 1); | 8482 index.ToLocalChecked()->Uint32Value(context.local()).FromJust()); |
7596 index = num->ToArrayIndex(); | 8483 v8::Local<v8::Number> num = v8::Number::New(isolate, 1); |
8484 index = num->ToArrayIndex(context.local()); | |
7597 CHECK(!index.IsEmpty()); | 8485 CHECK(!index.IsEmpty()); |
7598 CHECK_EQ(1.0, index->Uint32Value()); | 8486 CHECK_EQ(1.0, |
8487 index.ToLocalChecked()->Uint32Value(context.local()).FromJust()); | |
7599 num = v8::Number::New(isolate, -1); | 8488 num = v8::Number::New(isolate, -1); |
7600 index = num->ToArrayIndex(); | 8489 index = num->ToArrayIndex(context.local()); |
7601 CHECK(index.IsEmpty()); | 8490 CHECK(index.IsEmpty()); |
7602 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | 8491 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
7603 index = obj->ToArrayIndex(); | 8492 index = obj->ToArrayIndex(context.local()); |
7604 CHECK(index.IsEmpty()); | 8493 CHECK(index.IsEmpty()); |
7605 } | 8494 } |
7606 | 8495 |
7607 | 8496 |
7608 THREADED_TEST(ErrorConstruction) { | 8497 THREADED_TEST(ErrorConstruction) { |
7609 LocalContext context; | 8498 LocalContext context; |
7610 v8::HandleScope scope(context->GetIsolate()); | 8499 v8::HandleScope scope(context->GetIsolate()); |
7611 | 8500 |
7612 v8::Handle<String> foo = v8_str("foo"); | 8501 v8::Local<String> foo = v8_str("foo"); |
7613 v8::Handle<String> message = v8_str("message"); | 8502 v8::Local<String> message = v8_str("message"); |
7614 v8::Handle<Value> range_error = v8::Exception::RangeError(foo); | 8503 v8::Local<Value> range_error = v8::Exception::RangeError(foo); |
7615 CHECK(range_error->IsObject()); | 8504 CHECK(range_error->IsObject()); |
7616 CHECK(range_error.As<v8::Object>()->Get(message)->Equals(foo)); | 8505 CHECK(range_error.As<v8::Object>() |
7617 v8::Handle<Value> reference_error = v8::Exception::ReferenceError(foo); | 8506 ->Get(context.local(), message) |
8507 .ToLocalChecked() | |
8508 ->Equals(context.local(), foo) | |
8509 .FromJust()); | |
8510 v8::Local<Value> reference_error = v8::Exception::ReferenceError(foo); | |
7618 CHECK(reference_error->IsObject()); | 8511 CHECK(reference_error->IsObject()); |
7619 CHECK(reference_error.As<v8::Object>()->Get(message)->Equals(foo)); | 8512 CHECK(reference_error.As<v8::Object>() |
7620 v8::Handle<Value> syntax_error = v8::Exception::SyntaxError(foo); | 8513 ->Get(context.local(), message) |
8514 .ToLocalChecked() | |
8515 ->Equals(context.local(), foo) | |
8516 .FromJust()); | |
8517 v8::Local<Value> syntax_error = v8::Exception::SyntaxError(foo); | |
7621 CHECK(syntax_error->IsObject()); | 8518 CHECK(syntax_error->IsObject()); |
7622 CHECK(syntax_error.As<v8::Object>()->Get(message)->Equals(foo)); | 8519 CHECK(syntax_error.As<v8::Object>() |
7623 v8::Handle<Value> type_error = v8::Exception::TypeError(foo); | 8520 ->Get(context.local(), message) |
8521 .ToLocalChecked() | |
8522 ->Equals(context.local(), foo) | |
8523 .FromJust()); | |
8524 v8::Local<Value> type_error = v8::Exception::TypeError(foo); | |
7624 CHECK(type_error->IsObject()); | 8525 CHECK(type_error->IsObject()); |
7625 CHECK(type_error.As<v8::Object>()->Get(message)->Equals(foo)); | 8526 CHECK(type_error.As<v8::Object>() |
7626 v8::Handle<Value> error = v8::Exception::Error(foo); | 8527 ->Get(context.local(), message) |
8528 .ToLocalChecked() | |
8529 ->Equals(context.local(), foo) | |
8530 .FromJust()); | |
8531 v8::Local<Value> error = v8::Exception::Error(foo); | |
7627 CHECK(error->IsObject()); | 8532 CHECK(error->IsObject()); |
7628 CHECK(error.As<v8::Object>()->Get(message)->Equals(foo)); | 8533 CHECK(error.As<v8::Object>() |
8534 ->Get(context.local(), message) | |
8535 .ToLocalChecked() | |
8536 ->Equals(context.local(), foo) | |
8537 .FromJust()); | |
7629 } | 8538 } |
7630 | 8539 |
7631 | 8540 |
7632 static void ThrowV8Exception(const v8::FunctionCallbackInfo<v8::Value>& info) { | 8541 static void ThrowV8Exception(const v8::FunctionCallbackInfo<v8::Value>& info) { |
7633 ApiTestFuzzer::Fuzz(); | 8542 ApiTestFuzzer::Fuzz(); |
7634 v8::Handle<String> foo = v8_str("foo"); | 8543 v8::Local<String> foo = v8_str("foo"); |
7635 v8::Handle<String> message = v8_str("message"); | 8544 v8::Local<String> message = v8_str("message"); |
7636 v8::Handle<Value> error = v8::Exception::Error(foo); | 8545 v8::Local<Value> error = v8::Exception::Error(foo); |
7637 CHECK(error->IsObject()); | 8546 CHECK(error->IsObject()); |
7638 CHECK(error.As<v8::Object>()->Get(message)->Equals(foo)); | 8547 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
8548 CHECK(error.As<v8::Object>() | |
8549 ->Get(context, message) | |
8550 .ToLocalChecked() | |
8551 ->Equals(context, foo) | |
8552 .FromJust()); | |
7639 info.GetIsolate()->ThrowException(error); | 8553 info.GetIsolate()->ThrowException(error); |
7640 info.GetReturnValue().SetUndefined(); | 8554 info.GetReturnValue().SetUndefined(); |
7641 } | 8555 } |
7642 | 8556 |
7643 | 8557 |
7644 THREADED_TEST(ExceptionCreateMessage) { | 8558 THREADED_TEST(ExceptionCreateMessage) { |
7645 LocalContext context; | 8559 LocalContext context; |
7646 v8::HandleScope scope(context->GetIsolate()); | 8560 v8::HandleScope scope(context->GetIsolate()); |
7647 v8::Handle<String> foo_str = v8_str("foo"); | 8561 v8::Local<String> foo_str = v8_str("foo"); |
7648 v8::Handle<String> message_str = v8_str("message"); | 8562 v8::Local<String> message_str = v8_str("message"); |
7649 | 8563 |
7650 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 8564 context->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(true); |
7651 | 8565 |
7652 Local<v8::FunctionTemplate> fun = | 8566 Local<v8::FunctionTemplate> fun = |
7653 v8::FunctionTemplate::New(context->GetIsolate(), ThrowV8Exception); | 8567 v8::FunctionTemplate::New(context->GetIsolate(), ThrowV8Exception); |
7654 v8::Local<v8::Object> global = context->Global(); | 8568 v8::Local<v8::Object> global = context->Global(); |
7655 global->Set(v8_str("throwV8Exception"), fun->GetFunction()); | 8569 CHECK(global->Set(context.local(), v8_str("throwV8Exception"), |
8570 fun->GetFunction(context.local()).ToLocalChecked()) | |
8571 .FromJust()); | |
7656 | 8572 |
7657 TryCatch try_catch(context->GetIsolate()); | 8573 TryCatch try_catch(context->GetIsolate()); |
7658 CompileRun( | 8574 CompileRun( |
7659 "function f1() {\n" | 8575 "function f1() {\n" |
7660 " throwV8Exception();\n" | 8576 " throwV8Exception();\n" |
7661 "};\n" | 8577 "};\n" |
7662 "f1();"); | 8578 "f1();"); |
7663 CHECK(try_catch.HasCaught()); | 8579 CHECK(try_catch.HasCaught()); |
7664 | 8580 |
7665 v8::Handle<v8::Value> error = try_catch.Exception(); | 8581 v8::Local<v8::Value> error = try_catch.Exception(); |
7666 CHECK(error->IsObject()); | 8582 CHECK(error->IsObject()); |
7667 CHECK(error.As<v8::Object>()->Get(message_str)->Equals(foo_str)); | 8583 CHECK(error.As<v8::Object>() |
8584 ->Get(context.local(), message_str) | |
8585 .ToLocalChecked() | |
8586 ->Equals(context.local(), foo_str) | |
8587 .FromJust()); | |
7668 | 8588 |
7669 v8::Handle<v8::Message> message = v8::Exception::CreateMessage(error); | 8589 v8::Local<v8::Message> message = v8::Exception::CreateMessage(error); |
7670 CHECK(!message.IsEmpty()); | 8590 CHECK(!message.IsEmpty()); |
7671 CHECK_EQ(2, message->GetLineNumber()); | 8591 CHECK_EQ(2, message->GetLineNumber(context.local()).FromJust()); |
7672 CHECK_EQ(2, message->GetStartColumn()); | 8592 CHECK_EQ(2, message->GetStartColumn(context.local()).FromJust()); |
7673 | 8593 |
7674 v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace(); | 8594 v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace(); |
7675 CHECK(!stackTrace.IsEmpty()); | 8595 CHECK(!stackTrace.IsEmpty()); |
7676 CHECK_EQ(2, stackTrace->GetFrameCount()); | 8596 CHECK_EQ(2, stackTrace->GetFrameCount()); |
7677 | 8597 |
7678 stackTrace = v8::Exception::GetStackTrace(error); | 8598 stackTrace = v8::Exception::GetStackTrace(error); |
7679 CHECK(!stackTrace.IsEmpty()); | 8599 CHECK(!stackTrace.IsEmpty()); |
7680 CHECK_EQ(2, stackTrace->GetFrameCount()); | 8600 CHECK_EQ(2, stackTrace->GetFrameCount()); |
7681 | 8601 |
7682 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 8602 context->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(false); |
7683 | 8603 |
7684 // Now check message location when SetCaptureStackTraceForUncaughtExceptions | 8604 // Now check message location when SetCaptureStackTraceForUncaughtExceptions |
7685 // is false. | 8605 // is false. |
7686 try_catch.Reset(); | 8606 try_catch.Reset(); |
7687 | 8607 |
7688 CompileRun( | 8608 CompileRun( |
7689 "function f2() {\n" | 8609 "function f2() {\n" |
7690 " return throwV8Exception();\n" | 8610 " return throwV8Exception();\n" |
7691 "};\n" | 8611 "};\n" |
7692 "f2();"); | 8612 "f2();"); |
7693 CHECK(try_catch.HasCaught()); | 8613 CHECK(try_catch.HasCaught()); |
7694 | 8614 |
7695 error = try_catch.Exception(); | 8615 error = try_catch.Exception(); |
7696 CHECK(error->IsObject()); | 8616 CHECK(error->IsObject()); |
7697 CHECK(error.As<v8::Object>()->Get(message_str)->Equals(foo_str)); | 8617 CHECK(error.As<v8::Object>() |
8618 ->Get(context.local(), message_str) | |
8619 .ToLocalChecked() | |
8620 ->Equals(context.local(), foo_str) | |
8621 .FromJust()); | |
7698 | 8622 |
7699 message = v8::Exception::CreateMessage(error); | 8623 message = v8::Exception::CreateMessage(error); |
7700 CHECK(!message.IsEmpty()); | 8624 CHECK(!message.IsEmpty()); |
7701 CHECK_EQ(2, message->GetLineNumber()); | 8625 CHECK_EQ(2, message->GetLineNumber(context.local()).FromJust()); |
7702 CHECK_EQ(9, message->GetStartColumn()); | 8626 CHECK_EQ(9, message->GetStartColumn(context.local()).FromJust()); |
7703 | 8627 |
7704 // Should be empty stack trace. | 8628 // Should be empty stack trace. |
7705 stackTrace = message->GetStackTrace(); | 8629 stackTrace = message->GetStackTrace(); |
7706 CHECK(stackTrace.IsEmpty()); | 8630 CHECK(stackTrace.IsEmpty()); |
7707 CHECK(v8::Exception::GetStackTrace(error).IsEmpty()); | 8631 CHECK(v8::Exception::GetStackTrace(error).IsEmpty()); |
7708 } | 8632 } |
7709 | 8633 |
7710 | 8634 |
7711 THREADED_TEST(ExceptionCreateMessageLength) { | 8635 THREADED_TEST(ExceptionCreateMessageLength) { |
7712 LocalContext context; | 8636 LocalContext context; |
(...skipping 15 matching lines...) Expand all Loading... | |
7728 const v8::PropertyCallbackInfo<v8::Value>& info) { | 8652 const v8::PropertyCallbackInfo<v8::Value>& info) { |
7729 ApiTestFuzzer::Fuzz(); | 8653 ApiTestFuzzer::Fuzz(); |
7730 info.GetReturnValue().Set(v8_num(10)); | 8654 info.GetReturnValue().Set(v8_num(10)); |
7731 } | 8655 } |
7732 | 8656 |
7733 | 8657 |
7734 static void YSetter(Local<String> name, | 8658 static void YSetter(Local<String> name, |
7735 Local<Value> value, | 8659 Local<Value> value, |
7736 const v8::PropertyCallbackInfo<void>& info) { | 8660 const v8::PropertyCallbackInfo<void>& info) { |
7737 Local<Object> this_obj = Local<Object>::Cast(info.This()); | 8661 Local<Object> this_obj = Local<Object>::Cast(info.This()); |
7738 if (this_obj->Has(name)) this_obj->Delete(name); | 8662 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); |
7739 this_obj->Set(name, value); | 8663 if (this_obj->Has(context, name).FromJust()) |
8664 this_obj->Delete(context, name).FromJust(); | |
8665 CHECK(this_obj->Set(context, name, value).FromJust()); | |
7740 } | 8666 } |
7741 | 8667 |
7742 | 8668 |
7743 THREADED_TEST(DeleteAccessor) { | 8669 THREADED_TEST(DeleteAccessor) { |
7744 v8::Isolate* isolate = CcTest::isolate(); | 8670 v8::Isolate* isolate = CcTest::isolate(); |
7745 v8::HandleScope scope(isolate); | 8671 v8::HandleScope scope(isolate); |
7746 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); | 8672 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); |
7747 obj->SetAccessor(v8_str("y"), YGetter, YSetter); | 8673 obj->SetAccessor(v8_str("y"), YGetter, YSetter); |
7748 LocalContext context; | 8674 LocalContext context; |
7749 v8::Handle<v8::Object> holder = obj->NewInstance(); | 8675 v8::Local<v8::Object> holder = |
7750 context->Global()->Set(v8_str("holder"), holder); | 8676 obj->NewInstance(context.local()).ToLocalChecked(); |
7751 v8::Handle<Value> result = CompileRun( | 8677 CHECK(context->Global() |
7752 "holder.y = 11; holder.y = 12; holder.y"); | 8678 ->Set(context.local(), v8_str("holder"), holder) |
7753 CHECK_EQ(12u, result->Uint32Value()); | 8679 .FromJust()); |
8680 v8::Local<Value> result = | |
8681 CompileRun("holder.y = 11; holder.y = 12; holder.y"); | |
8682 CHECK_EQ(12u, result->Uint32Value(context.local()).FromJust()); | |
7754 } | 8683 } |
7755 | 8684 |
7756 | 8685 |
7757 THREADED_TEST(TypeSwitch) { | 8686 THREADED_TEST(TypeSwitch) { |
7758 v8::Isolate* isolate = CcTest::isolate(); | 8687 v8::Isolate* isolate = CcTest::isolate(); |
7759 v8::HandleScope scope(isolate); | 8688 v8::HandleScope scope(isolate); |
7760 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(isolate); | 8689 v8::Local<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(isolate); |
7761 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate); | 8690 v8::Local<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate); |
7762 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(isolate); | 8691 v8::Local<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(isolate); |
7763 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 }; | 8692 v8::Local<v8::FunctionTemplate> templs[3] = {templ1, templ2, templ3}; |
7764 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); | 8693 v8::Local<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); |
7765 LocalContext context; | 8694 LocalContext context; |
7766 v8::Handle<v8::Object> obj0 = v8::Object::New(isolate); | 8695 v8::Local<v8::Object> obj0 = v8::Object::New(isolate); |
7767 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance(); | 8696 v8::Local<v8::Object> obj1 = templ1->GetFunction(context.local()) |
7768 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance(); | 8697 .ToLocalChecked() |
7769 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance(); | 8698 ->NewInstance(context.local()) |
8699 .ToLocalChecked(); | |
8700 v8::Local<v8::Object> obj2 = templ2->GetFunction(context.local()) | |
8701 .ToLocalChecked() | |
8702 ->NewInstance(context.local()) | |
8703 .ToLocalChecked(); | |
8704 v8::Local<v8::Object> obj3 = templ3->GetFunction(context.local()) | |
8705 .ToLocalChecked() | |
8706 ->NewInstance(context.local()) | |
8707 .ToLocalChecked(); | |
7770 for (int i = 0; i < 10; i++) { | 8708 for (int i = 0; i < 10; i++) { |
7771 CHECK_EQ(0, type_switch->match(obj0)); | 8709 CHECK_EQ(0, type_switch->match(obj0)); |
7772 CHECK_EQ(1, type_switch->match(obj1)); | 8710 CHECK_EQ(1, type_switch->match(obj1)); |
7773 CHECK_EQ(2, type_switch->match(obj2)); | 8711 CHECK_EQ(2, type_switch->match(obj2)); |
7774 CHECK_EQ(3, type_switch->match(obj3)); | 8712 CHECK_EQ(3, type_switch->match(obj3)); |
7775 CHECK_EQ(3, type_switch->match(obj3)); | 8713 CHECK_EQ(3, type_switch->match(obj3)); |
7776 CHECK_EQ(2, type_switch->match(obj2)); | 8714 CHECK_EQ(2, type_switch->match(obj2)); |
7777 CHECK_EQ(1, type_switch->match(obj1)); | 8715 CHECK_EQ(1, type_switch->match(obj1)); |
7778 CHECK_EQ(0, type_switch->match(obj0)); | 8716 CHECK_EQ(0, type_switch->match(obj0)); |
7779 } | 8717 } |
7780 } | 8718 } |
7781 | 8719 |
7782 | 8720 |
7783 static int trouble_nesting = 0; | 8721 static int trouble_nesting = 0; |
7784 static void TroubleCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 8722 static void TroubleCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
7785 ApiTestFuzzer::Fuzz(); | 8723 ApiTestFuzzer::Fuzz(); |
7786 trouble_nesting++; | 8724 trouble_nesting++; |
7787 | 8725 |
7788 // Call a JS function that throws an uncaught exception. | 8726 // Call a JS function that throws an uncaught exception. |
7789 Local<v8::Object> arg_this = | 8727 Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
7790 args.GetIsolate()->GetCurrentContext()->Global(); | 8728 Local<v8::Object> arg_this = context->Global(); |
7791 Local<Value> trouble_callee = (trouble_nesting == 3) ? | 8729 Local<Value> trouble_callee = |
7792 arg_this->Get(v8_str("trouble_callee")) : | 8730 (trouble_nesting == 3) |
7793 arg_this->Get(v8_str("trouble_caller")); | 8731 ? arg_this->Get(context, v8_str("trouble_callee")).ToLocalChecked() |
8732 : arg_this->Get(context, v8_str("trouble_caller")).ToLocalChecked(); | |
7794 CHECK(trouble_callee->IsFunction()); | 8733 CHECK(trouble_callee->IsFunction()); |
7795 args.GetReturnValue().Set( | 8734 args.GetReturnValue().Set(Function::Cast(*trouble_callee) |
7796 Function::Cast(*trouble_callee)->Call(arg_this, 0, NULL)); | 8735 ->Call(context, arg_this, 0, NULL) |
8736 .FromMaybe(v8::Local<v8::Value>())); | |
7797 } | 8737 } |
7798 | 8738 |
7799 | 8739 |
7800 static int report_count = 0; | 8740 static int report_count = 0; |
7801 static void ApiUncaughtExceptionTestListener(v8::Handle<v8::Message>, | 8741 static void ApiUncaughtExceptionTestListener(v8::Local<v8::Message>, |
7802 v8::Handle<Value>) { | 8742 v8::Local<Value>) { |
7803 report_count++; | 8743 report_count++; |
7804 } | 8744 } |
7805 | 8745 |
7806 | 8746 |
7807 // Counts uncaught exceptions, but other tests running in parallel | 8747 // Counts uncaught exceptions, but other tests running in parallel |
7808 // also have uncaught exceptions. | 8748 // also have uncaught exceptions. |
7809 TEST(ApiUncaughtException) { | 8749 TEST(ApiUncaughtException) { |
7810 report_count = 0; | 8750 report_count = 0; |
7811 LocalContext env; | 8751 LocalContext env; |
7812 v8::Isolate* isolate = env->GetIsolate(); | 8752 v8::Isolate* isolate = env->GetIsolate(); |
7813 v8::HandleScope scope(isolate); | 8753 v8::HandleScope scope(isolate); |
7814 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); | 8754 isolate->AddMessageListener(ApiUncaughtExceptionTestListener); |
7815 | 8755 |
7816 Local<v8::FunctionTemplate> fun = | 8756 Local<v8::FunctionTemplate> fun = |
7817 v8::FunctionTemplate::New(isolate, TroubleCallback); | 8757 v8::FunctionTemplate::New(isolate, TroubleCallback); |
7818 v8::Local<v8::Object> global = env->Global(); | 8758 v8::Local<v8::Object> global = env->Global(); |
7819 global->Set(v8_str("trouble"), fun->GetFunction()); | 8759 CHECK(global->Set(env.local(), v8_str("trouble"), |
8760 fun->GetFunction(env.local()).ToLocalChecked()) | |
8761 .FromJust()); | |
7820 | 8762 |
7821 CompileRun( | 8763 CompileRun( |
7822 "function trouble_callee() {" | 8764 "function trouble_callee() {" |
7823 " var x = null;" | 8765 " var x = null;" |
7824 " return x.foo;" | 8766 " return x.foo;" |
7825 "};" | 8767 "};" |
7826 "function trouble_caller() {" | 8768 "function trouble_caller() {" |
7827 " trouble();" | 8769 " trouble();" |
7828 "};"); | 8770 "};"); |
7829 Local<Value> trouble = global->Get(v8_str("trouble")); | 8771 Local<Value> trouble = |
8772 global->Get(env.local(), v8_str("trouble")).ToLocalChecked(); | |
7830 CHECK(trouble->IsFunction()); | 8773 CHECK(trouble->IsFunction()); |
7831 Local<Value> trouble_callee = global->Get(v8_str("trouble_callee")); | 8774 Local<Value> trouble_callee = |
8775 global->Get(env.local(), v8_str("trouble_callee")).ToLocalChecked(); | |
7832 CHECK(trouble_callee->IsFunction()); | 8776 CHECK(trouble_callee->IsFunction()); |
7833 Local<Value> trouble_caller = global->Get(v8_str("trouble_caller")); | 8777 Local<Value> trouble_caller = |
8778 global->Get(env.local(), v8_str("trouble_caller")).ToLocalChecked(); | |
7834 CHECK(trouble_caller->IsFunction()); | 8779 CHECK(trouble_caller->IsFunction()); |
7835 Function::Cast(*trouble_caller)->Call(global, 0, NULL); | 8780 Function::Cast(*trouble_caller) |
8781 ->Call(env.local(), global, 0, NULL) | |
8782 .FromMaybe(v8::Local<v8::Value>()); | |
7836 CHECK_EQ(1, report_count); | 8783 CHECK_EQ(1, report_count); |
7837 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); | 8784 isolate->RemoveMessageListeners(ApiUncaughtExceptionTestListener); |
7838 } | 8785 } |
7839 | 8786 |
7840 | 8787 |
7841 TEST(ApiUncaughtExceptionInObjectObserve) { | 8788 TEST(ApiUncaughtExceptionInObjectObserve) { |
7842 v8::internal::FLAG_stack_size = 150; | 8789 v8::internal::FLAG_stack_size = 150; |
7843 report_count = 0; | 8790 report_count = 0; |
7844 LocalContext env; | 8791 LocalContext env; |
7845 v8::Isolate* isolate = env->GetIsolate(); | 8792 v8::Isolate* isolate = env->GetIsolate(); |
7846 v8::HandleScope scope(isolate); | 8793 v8::HandleScope scope(isolate); |
7847 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); | 8794 isolate->AddMessageListener(ApiUncaughtExceptionTestListener); |
7848 CompileRun( | 8795 CompileRun( |
7849 "var obj = {};" | 8796 "var obj = {};" |
7850 "var observe_count = 0;" | 8797 "var observe_count = 0;" |
7851 "function observer1() { ++observe_count; };" | 8798 "function observer1() { ++observe_count; };" |
7852 "function observer2() { ++observe_count; };" | 8799 "function observer2() { ++observe_count; };" |
7853 "function observer_throws() { throw new Error(); };" | 8800 "function observer_throws() { throw new Error(); };" |
7854 "function stack_overflow() { return (function f(x) { f(x+1); })(0); };" | 8801 "function stack_overflow() { return (function f(x) { f(x+1); })(0); };" |
7855 "Object.observe(obj, observer_throws.bind());" | 8802 "Object.observe(obj, observer_throws.bind());" |
7856 "Object.observe(obj, observer1);" | 8803 "Object.observe(obj, observer1);" |
7857 "Object.observe(obj, stack_overflow);" | 8804 "Object.observe(obj, stack_overflow);" |
7858 "Object.observe(obj, observer2);" | 8805 "Object.observe(obj, observer2);" |
7859 "Object.observe(obj, observer_throws.bind());" | 8806 "Object.observe(obj, observer_throws.bind());" |
7860 "obj.foo = 'bar';"); | 8807 "obj.foo = 'bar';"); |
7861 CHECK_EQ(3, report_count); | 8808 CHECK_EQ(3, report_count); |
7862 ExpectInt32("observe_count", 2); | 8809 ExpectInt32("observe_count", 2); |
7863 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); | 8810 isolate->RemoveMessageListeners(ApiUncaughtExceptionTestListener); |
7864 } | 8811 } |
7865 | 8812 |
7866 | 8813 |
7867 static const char* script_resource_name = "ExceptionInNativeScript.js"; | 8814 static const char* script_resource_name = "ExceptionInNativeScript.js"; |
7868 static void ExceptionInNativeScriptTestListener(v8::Handle<v8::Message> message, | 8815 static void ExceptionInNativeScriptTestListener(v8::Local<v8::Message> message, |
7869 v8::Handle<Value>) { | 8816 v8::Local<Value>) { |
7870 v8::Handle<v8::Value> name_val = message->GetScriptOrigin().ResourceName(); | 8817 v8::Local<v8::Value> name_val = message->GetScriptOrigin().ResourceName(); |
7871 CHECK(!name_val.IsEmpty() && name_val->IsString()); | 8818 CHECK(!name_val.IsEmpty() && name_val->IsString()); |
7872 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); | 8819 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); |
7873 CHECK_EQ(0, strcmp(script_resource_name, *name)); | 8820 CHECK_EQ(0, strcmp(script_resource_name, *name)); |
7874 CHECK_EQ(3, message->GetLineNumber()); | 8821 v8::Local<v8::Context> context = |
7875 v8::String::Utf8Value source_line(message->GetSourceLine()); | 8822 v8::Isolate::GetCurrent()->GetCurrentContext(); |
8823 CHECK_EQ(3, message->GetLineNumber(context).FromJust()); | |
8824 v8::String::Utf8Value source_line( | |
8825 message->GetSourceLine(context).ToLocalChecked()); | |
7876 CHECK_EQ(0, strcmp(" new o.foo();", *source_line)); | 8826 CHECK_EQ(0, strcmp(" new o.foo();", *source_line)); |
7877 } | 8827 } |
7878 | 8828 |
7879 | 8829 |
7880 TEST(ExceptionInNativeScript) { | 8830 TEST(ExceptionInNativeScript) { |
7881 LocalContext env; | 8831 LocalContext env; |
7882 v8::Isolate* isolate = env->GetIsolate(); | 8832 v8::Isolate* isolate = env->GetIsolate(); |
7883 v8::HandleScope scope(isolate); | 8833 v8::HandleScope scope(isolate); |
7884 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); | 8834 isolate->AddMessageListener(ExceptionInNativeScriptTestListener); |
7885 | 8835 |
7886 Local<v8::FunctionTemplate> fun = | 8836 Local<v8::FunctionTemplate> fun = |
7887 v8::FunctionTemplate::New(isolate, TroubleCallback); | 8837 v8::FunctionTemplate::New(isolate, TroubleCallback); |
7888 v8::Local<v8::Object> global = env->Global(); | 8838 v8::Local<v8::Object> global = env->Global(); |
7889 global->Set(v8_str("trouble"), fun->GetFunction()); | 8839 CHECK(global->Set(env.local(), v8_str("trouble"), |
8840 fun->GetFunction(env.local()).ToLocalChecked()) | |
8841 .FromJust()); | |
7890 | 8842 |
7891 CompileRunWithOrigin( | 8843 CompileRunWithOrigin( |
7892 "function trouble() {\n" | 8844 "function trouble() {\n" |
7893 " var o = {};\n" | 8845 " var o = {};\n" |
7894 " new o.foo();\n" | 8846 " new o.foo();\n" |
7895 "};", | 8847 "};", |
7896 script_resource_name); | 8848 script_resource_name); |
7897 Local<Value> trouble = global->Get(v8_str("trouble")); | 8849 Local<Value> trouble = |
8850 global->Get(env.local(), v8_str("trouble")).ToLocalChecked(); | |
7898 CHECK(trouble->IsFunction()); | 8851 CHECK(trouble->IsFunction()); |
7899 Function::Cast(*trouble)->Call(global, 0, NULL); | 8852 CHECK(Function::Cast(*trouble)->Call(env.local(), global, 0, NULL).IsEmpty()); |
7900 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); | 8853 isolate->RemoveMessageListeners(ExceptionInNativeScriptTestListener); |
7901 } | 8854 } |
7902 | 8855 |
7903 | 8856 |
7904 TEST(CompilationErrorUsingTryCatchHandler) { | 8857 TEST(CompilationErrorUsingTryCatchHandler) { |
7905 LocalContext env; | 8858 LocalContext env; |
7906 v8::HandleScope scope(env->GetIsolate()); | 8859 v8::HandleScope scope(env->GetIsolate()); |
7907 v8::TryCatch try_catch(env->GetIsolate()); | 8860 v8::TryCatch try_catch(env->GetIsolate()); |
7908 v8_compile("This doesn't &*&@#$&*^ compile."); | 8861 v8_compile("This doesn't &*&@#$&*^ compile."); |
7909 CHECK(*try_catch.Exception()); | 8862 CHECK(*try_catch.Exception()); |
7910 CHECK(try_catch.HasCaught()); | 8863 CHECK(try_catch.HasCaught()); |
(...skipping 17 matching lines...) Expand all Loading... | |
7928 CompileRun( | 8881 CompileRun( |
7929 "(function()" | 8882 "(function()" |
7930 " { try { throw ''; } finally { throw 0; }" | 8883 " { try { throw ''; } finally { throw 0; }" |
7931 "})()"); | 8884 "})()"); |
7932 CHECK(try_catch.HasCaught()); | 8885 CHECK(try_catch.HasCaught()); |
7933 } | 8886 } |
7934 | 8887 |
7935 | 8888 |
7936 void CEvaluate(const v8::FunctionCallbackInfo<v8::Value>& args) { | 8889 void CEvaluate(const v8::FunctionCallbackInfo<v8::Value>& args) { |
7937 v8::HandleScope scope(args.GetIsolate()); | 8890 v8::HandleScope scope(args.GetIsolate()); |
7938 CompileRun(args[0]->ToString(args.GetIsolate())); | 8891 CompileRun(args[0] |
8892 ->ToString(args.GetIsolate()->GetCurrentContext()) | |
8893 .ToLocalChecked()); | |
7939 } | 8894 } |
7940 | 8895 |
7941 | 8896 |
7942 TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) { | 8897 TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) { |
7943 v8::Isolate* isolate = CcTest::isolate(); | 8898 v8::Isolate* isolate = CcTest::isolate(); |
7944 v8::HandleScope scope(isolate); | 8899 v8::HandleScope scope(isolate); |
7945 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 8900 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
7946 templ->Set(v8_str("CEvaluate"), | 8901 templ->Set(v8_str("CEvaluate"), |
7947 v8::FunctionTemplate::New(isolate, CEvaluate)); | 8902 v8::FunctionTemplate::New(isolate, CEvaluate)); |
7948 LocalContext context(0, templ); | 8903 LocalContext context(0, templ); |
(...skipping 22 matching lines...) Expand all Loading... | |
7971 // For use within the TestSecurityHandler() test. | 8926 // For use within the TestSecurityHandler() test. |
7972 static bool g_security_callback_result = false; | 8927 static bool g_security_callback_result = false; |
7973 static bool SecurityTestCallback(Local<v8::Context> accessing_context, | 8928 static bool SecurityTestCallback(Local<v8::Context> accessing_context, |
7974 Local<v8::Object> accessed_object) { | 8929 Local<v8::Object> accessed_object) { |
7975 printf("a\n"); | 8930 printf("a\n"); |
7976 return g_security_callback_result; | 8931 return g_security_callback_result; |
7977 } | 8932 } |
7978 | 8933 |
7979 | 8934 |
7980 // SecurityHandler can't be run twice | 8935 // SecurityHandler can't be run twice |
7981 TEST(SecurityHandler) { | 8936 TEST(SecurityHandler) { |
vogelheim
2015/11/23 18:22:15
Here & below: I was having a really hard time with
| |
7982 v8::Isolate* isolate = CcTest::isolate(); | 8937 v8::Isolate* isolate = CcTest::isolate(); |
7983 v8::HandleScope scope0(isolate); | 8938 v8::HandleScope scope0(isolate); |
7984 v8::Handle<v8::ObjectTemplate> global_template = | 8939 v8::Local<v8::ObjectTemplate> global_template = |
7985 v8::ObjectTemplate::New(isolate); | 8940 v8::ObjectTemplate::New(isolate); |
7986 global_template->SetAccessCheckCallback(SecurityTestCallback); | 8941 global_template->SetAccessCheckCallback(SecurityTestCallback); |
7987 // Create an environment | 8942 // Create an environment |
7988 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template); | 8943 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
7989 context0->Enter(); | 8944 context0->Enter(); |
7990 | 8945 |
7991 v8::Handle<v8::Object> global0 = context0->Global(); | 8946 v8::Local<v8::Object> global0 = context0->Global(); |
7992 v8::Handle<Script> script0 = v8_compile("foo = 111"); | 8947 v8::Local<Script> script0 = v8_compile("foo = 111"); |
7993 script0->Run(); | 8948 script0->Run(context0).ToLocalChecked(); |
7994 global0->Set(v8_str("0"), v8_num(999)); | 8949 CHECK(global0->Set(context0, v8_str("0"), v8_num(999)).FromJust()); |
7995 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); | 8950 v8::Local<Value> foo0 = |
7996 CHECK_EQ(111, foo0->Int32Value()); | 8951 global0->Get(context0, v8_str("foo")).ToLocalChecked(); |
7997 v8::Handle<Value> z0 = global0->Get(v8_str("0")); | 8952 CHECK_EQ(111, foo0->Int32Value(context0).FromJust()); |
7998 CHECK_EQ(999, z0->Int32Value()); | 8953 v8::Local<Value> z0 = global0->Get(context0, v8_str("0")).ToLocalChecked(); |
8954 CHECK_EQ(999, z0->Int32Value(context0).FromJust()); | |
7999 | 8955 |
8000 // Create another environment, should fail security checks. | 8956 // Create another environment, should fail security checks. |
8001 v8::HandleScope scope1(isolate); | 8957 v8::HandleScope scope1(isolate); |
8002 | 8958 |
8003 v8::Handle<Context> context1 = | 8959 v8::Local<Context> context1 = Context::New(isolate, NULL, global_template); |
8004 Context::New(isolate, NULL, global_template); | |
8005 context1->Enter(); | 8960 context1->Enter(); |
8006 | 8961 |
8007 v8::Handle<v8::Object> global1 = context1->Global(); | 8962 v8::Local<v8::Object> global1 = context1->Global(); |
8008 global1->Set(v8_str("othercontext"), global0); | 8963 global1->Set(context1, v8_str("othercontext"), global0).FromJust(); |
8009 // This set will fail the security check. | 8964 // This set will fail the security check. |
8010 v8::Handle<Script> script1 = | 8965 v8::Local<Script> script1 = |
8011 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); | 8966 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); |
8012 script1->Run(); | 8967 CHECK(script1->Run(context1).IsEmpty()); |
8013 g_security_callback_result = true; | 8968 g_security_callback_result = true; |
8014 // This read will pass the security check. | 8969 // This read will pass the security check. |
8015 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); | 8970 v8::Local<Value> foo1 = |
8016 CHECK_EQ(111, foo1->Int32Value()); | 8971 global0->Get(context0, v8_str("foo")).ToLocalChecked(); |
jochen (gone - plz use gerrit)
2015/11/24 12:42:25
in line 8005/8960 context1 is entered, so we shoul
vogelheim
2015/11/26 10:57:32
Done.
| |
8972 CHECK_EQ(111, foo1->Int32Value(context0).FromJust()); | |
8017 // This read will pass the security check. | 8973 // This read will pass the security check. |
8018 v8::Handle<Value> z1 = global0->Get(v8_str("0")); | 8974 v8::Local<Value> z1 = global0->Get(context0, v8_str("0")).ToLocalChecked(); |
8019 CHECK_EQ(999, z1->Int32Value()); | 8975 CHECK_EQ(999, z1->Int32Value(context0).FromJust()); |
8020 | 8976 |
8021 // Create another environment, should pass security checks. | 8977 // Create another environment, should pass security checks. |
8022 { | 8978 { |
8023 v8::HandleScope scope2(isolate); | 8979 v8::HandleScope scope2(isolate); |
8024 LocalContext context2; | 8980 LocalContext context2; |
8025 v8::Handle<v8::Object> global2 = context2->Global(); | 8981 v8::Local<v8::Object> global2 = context2->Global(); |
8026 global2->Set(v8_str("othercontext"), global0); | 8982 CHECK(global2->Set(context2.local(), v8_str("othercontext"), global0) |
8027 v8::Handle<Script> script2 = | 8983 .FromJust()); |
8984 v8::Local<Script> script2 = | |
8028 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); | 8985 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); |
8029 script2->Run(); | 8986 script2->Run(context2.local()).ToLocalChecked(); |
8030 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); | 8987 v8::Local<Value> foo2 = |
8031 CHECK_EQ(333, foo2->Int32Value()); | 8988 global0->Get(context2.local(), v8_str("foo")).ToLocalChecked(); |
8032 v8::Handle<Value> z2 = global0->Get(v8_str("0")); | 8989 CHECK_EQ(333, foo2->Int32Value(context2.local()).FromJust()); |
8033 CHECK_EQ(888, z2->Int32Value()); | 8990 v8::Local<Value> z2 = |
8991 global0->Get(context2.local(), v8_str("0")).ToLocalChecked(); | |
8992 CHECK_EQ(888, z2->Int32Value(context2.local()).FromJust()); | |
8034 } | 8993 } |
8035 | 8994 |
8036 context1->Exit(); | 8995 context1->Exit(); |
8037 context0->Exit(); | 8996 context0->Exit(); |
8038 } | 8997 } |
8039 | 8998 |
8040 | 8999 |
8041 THREADED_TEST(SecurityChecks) { | 9000 THREADED_TEST(SecurityChecks) { |
8042 LocalContext env1; | 9001 LocalContext env1; |
8043 v8::HandleScope handle_scope(env1->GetIsolate()); | 9002 v8::HandleScope handle_scope(env1->GetIsolate()); |
8044 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9003 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8045 | 9004 |
8046 Local<Value> foo = v8_str("foo"); | 9005 Local<Value> foo = v8_str("foo"); |
8047 Local<Value> bar = v8_str("bar"); | 9006 Local<Value> bar = v8_str("bar"); |
8048 | 9007 |
8049 // Set to the same domain. | 9008 // Set to the same domain. |
8050 env1->SetSecurityToken(foo); | 9009 env1->SetSecurityToken(foo); |
8051 | 9010 |
8052 // Create a function in env1. | 9011 // Create a function in env1. |
8053 CompileRun("spy=function(){return spy;}"); | 9012 CompileRun("spy=function(){return spy;}"); |
8054 Local<Value> spy = env1->Global()->Get(v8_str("spy")); | 9013 Local<Value> spy = |
9014 env1->Global()->Get(env1.local(), v8_str("spy")).ToLocalChecked(); | |
8055 CHECK(spy->IsFunction()); | 9015 CHECK(spy->IsFunction()); |
8056 | 9016 |
8057 // Create another function accessing global objects. | 9017 // Create another function accessing global objects. |
8058 CompileRun("spy2=function(){return new this.Array();}"); | 9018 CompileRun("spy2=function(){return new this.Array();}"); |
8059 Local<Value> spy2 = env1->Global()->Get(v8_str("spy2")); | 9019 Local<Value> spy2 = |
9020 env1->Global()->Get(env1.local(), v8_str("spy2")).ToLocalChecked(); | |
8060 CHECK(spy2->IsFunction()); | 9021 CHECK(spy2->IsFunction()); |
8061 | 9022 |
8062 // Switch to env2 in the same domain and invoke spy on env2. | 9023 // Switch to env2 in the same domain and invoke spy on env2. |
8063 { | 9024 { |
8064 env2->SetSecurityToken(foo); | 9025 env2->SetSecurityToken(foo); |
8065 // Enter env2 | 9026 // Enter env2 |
8066 Context::Scope scope_env2(env2); | 9027 Context::Scope scope_env2(env2); |
8067 Local<Value> result = Function::Cast(*spy)->Call(env2->Global(), 0, NULL); | 9028 Local<Value> result = Function::Cast(*spy) |
9029 ->Call(env2, env2->Global(), 0, NULL) | |
9030 .ToLocalChecked(); | |
8068 CHECK(result->IsFunction()); | 9031 CHECK(result->IsFunction()); |
8069 } | 9032 } |
8070 | 9033 |
8071 { | 9034 { |
8072 env2->SetSecurityToken(bar); | 9035 env2->SetSecurityToken(bar); |
8073 Context::Scope scope_env2(env2); | 9036 Context::Scope scope_env2(env2); |
8074 | 9037 |
8075 // Call cross_domain_call, it should throw an exception | 9038 // Call cross_domain_call, it should throw an exception |
8076 v8::TryCatch try_catch(env1->GetIsolate()); | 9039 v8::TryCatch try_catch(env1->GetIsolate()); |
8077 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL); | 9040 CHECK(Function::Cast(*spy2)->Call(env2, env2->Global(), 0, NULL).IsEmpty()); |
8078 CHECK(try_catch.HasCaught()); | 9041 CHECK(try_catch.HasCaught()); |
8079 } | 9042 } |
8080 } | 9043 } |
8081 | 9044 |
8082 | 9045 |
8083 // Regression test case for issue 1183439. | 9046 // Regression test case for issue 1183439. |
8084 THREADED_TEST(SecurityChecksForPrototypeChain) { | 9047 THREADED_TEST(SecurityChecksForPrototypeChain) { |
8085 LocalContext current; | 9048 LocalContext current; |
8086 v8::HandleScope scope(current->GetIsolate()); | 9049 v8::HandleScope scope(current->GetIsolate()); |
8087 v8::Handle<Context> other = Context::New(current->GetIsolate()); | 9050 v8::Local<Context> other = Context::New(current->GetIsolate()); |
8088 | 9051 |
8089 // Change context to be able to get to the Object function in the | 9052 // Change context to be able to get to the Object function in the |
8090 // other context without hitting the security checks. | 9053 // other context without hitting the security checks. |
8091 v8::Local<Value> other_object; | 9054 v8::Local<Value> other_object; |
8092 { Context::Scope scope(other); | 9055 { Context::Scope scope(other); |
8093 other_object = other->Global()->Get(v8_str("Object")); | 9056 other_object = |
8094 other->Global()->Set(v8_num(42), v8_num(87)); | 9057 other->Global()->Get(other, v8_str("Object")).ToLocalChecked(); |
9058 CHECK(other->Global()->Set(other, v8_num(42), v8_num(87)).FromJust()); | |
8095 } | 9059 } |
8096 | 9060 |
8097 current->Global()->Set(v8_str("other"), other->Global()); | 9061 CHECK(current->Global() |
8098 CHECK(v8_compile("other")->Run()->Equals(other->Global())); | 9062 ->Set(current.local(), v8_str("other"), other->Global()) |
9063 .FromJust()); | |
9064 CHECK(v8_compile("other") | |
9065 ->Run(current.local()) | |
9066 .ToLocalChecked() | |
9067 ->Equals(current.local(), other->Global()) | |
9068 .FromJust()); | |
8099 | 9069 |
8100 // Make sure the security check fails here and we get an undefined | 9070 // Make sure the security check fails here and we get an undefined |
8101 // result instead of getting the Object function. Repeat in a loop | 9071 // result instead of getting the Object function. Repeat in a loop |
8102 // to make sure to exercise the IC code. | 9072 // to make sure to exercise the IC code. |
8103 v8::Local<Script> access_other0 = v8_compile("other.Object"); | 9073 v8::Local<Script> access_other0 = v8_compile("other.Object"); |
8104 v8::Local<Script> access_other1 = v8_compile("other[42]"); | 9074 v8::Local<Script> access_other1 = v8_compile("other[42]"); |
8105 for (int i = 0; i < 5; i++) { | 9075 for (int i = 0; i < 5; i++) { |
8106 CHECK(access_other0->Run().IsEmpty()); | 9076 CHECK(access_other0->Run(current.local()).IsEmpty()); |
8107 CHECK(access_other1->Run().IsEmpty()); | 9077 CHECK(access_other1->Run(current.local()).IsEmpty()); |
8108 } | 9078 } |
8109 | 9079 |
8110 // Create an object that has 'other' in its prototype chain and make | 9080 // Create an object that has 'other' in its prototype chain and make |
8111 // sure we cannot access the Object function indirectly through | 9081 // sure we cannot access the Object function indirectly through |
8112 // that. Repeat in a loop to make sure to exercise the IC code. | 9082 // that. Repeat in a loop to make sure to exercise the IC code. |
8113 v8_compile("function F() { };" | 9083 v8_compile( |
8114 "F.prototype = other;" | 9084 "function F() { };" |
8115 "var f = new F();")->Run(); | 9085 "F.prototype = other;" |
9086 "var f = new F();") | |
9087 ->Run(current.local()) | |
9088 .ToLocalChecked(); | |
8116 v8::Local<Script> access_f0 = v8_compile("f.Object"); | 9089 v8::Local<Script> access_f0 = v8_compile("f.Object"); |
8117 v8::Local<Script> access_f1 = v8_compile("f[42]"); | 9090 v8::Local<Script> access_f1 = v8_compile("f[42]"); |
8118 for (int j = 0; j < 5; j++) { | 9091 for (int j = 0; j < 5; j++) { |
8119 CHECK(access_f0->Run().IsEmpty()); | 9092 CHECK(access_f0->Run(current.local()).IsEmpty()); |
8120 CHECK(access_f1->Run().IsEmpty()); | 9093 CHECK(access_f1->Run(current.local()).IsEmpty()); |
8121 } | 9094 } |
8122 | 9095 |
8123 // Now it gets hairy: Set the prototype for the other global object | 9096 // Now it gets hairy: Set the prototype for the other global object |
8124 // to be the current global object. The prototype chain for 'f' now | 9097 // to be the current global object. The prototype chain for 'f' now |
8125 // goes through 'other' but ends up in the current global object. | 9098 // goes through 'other' but ends up in the current global object. |
8126 { Context::Scope scope(other); | 9099 { Context::Scope scope(other); |
8127 other->Global()->Set(v8_str("__proto__"), current->Global()); | 9100 CHECK(other->Global() |
9101 ->Set(other, v8_str("__proto__"), current->Global()) | |
9102 .FromJust()); | |
8128 } | 9103 } |
8129 // Set a named and an index property on the current global | 9104 // Set a named and an index property on the current global |
8130 // object. To force the lookup to go through the other global object, | 9105 // object. To force the lookup to go through the other global object, |
8131 // the properties must not exist in the other global object. | 9106 // the properties must not exist in the other global object. |
8132 current->Global()->Set(v8_str("foo"), v8_num(100)); | 9107 CHECK(current->Global() |
8133 current->Global()->Set(v8_num(99), v8_num(101)); | 9108 ->Set(current.local(), v8_str("foo"), v8_num(100)) |
9109 .FromJust()); | |
9110 CHECK(current->Global() | |
9111 ->Set(current.local(), v8_num(99), v8_num(101)) | |
9112 .FromJust()); | |
8134 // Try to read the properties from f and make sure that the access | 9113 // Try to read the properties from f and make sure that the access |
8135 // gets stopped by the security checks on the other global object. | 9114 // gets stopped by the security checks on the other global object. |
8136 Local<Script> access_f2 = v8_compile("f.foo"); | 9115 Local<Script> access_f2 = v8_compile("f.foo"); |
8137 Local<Script> access_f3 = v8_compile("f[99]"); | 9116 Local<Script> access_f3 = v8_compile("f[99]"); |
8138 for (int k = 0; k < 5; k++) { | 9117 for (int k = 0; k < 5; k++) { |
8139 CHECK(access_f2->Run().IsEmpty()); | 9118 CHECK(access_f2->Run(current.local()).IsEmpty()); |
8140 CHECK(access_f3->Run().IsEmpty()); | 9119 CHECK(access_f3->Run(current.local()).IsEmpty()); |
8141 } | 9120 } |
8142 } | 9121 } |
8143 | 9122 |
8144 | 9123 |
8145 static bool security_check_with_gc_called; | 9124 static bool security_check_with_gc_called; |
8146 | 9125 |
8147 static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context, | 9126 static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context, |
8148 Local<v8::Object> accessed_object) { | 9127 Local<v8::Object> accessed_object) { |
8149 CcTest::heap()->CollectAllGarbage(); | 9128 CcTest::heap()->CollectAllGarbage(); |
8150 security_check_with_gc_called = true; | 9129 security_check_with_gc_called = true; |
8151 return true; | 9130 return true; |
8152 } | 9131 } |
8153 | 9132 |
8154 | 9133 |
8155 TEST(SecurityTestGCAllowed) { | 9134 TEST(SecurityTestGCAllowed) { |
8156 v8::Isolate* isolate = CcTest::isolate(); | 9135 v8::Isolate* isolate = CcTest::isolate(); |
8157 v8::HandleScope handle_scope(isolate); | 9136 v8::HandleScope handle_scope(isolate); |
8158 v8::Handle<v8::ObjectTemplate> object_template = | 9137 v8::Local<v8::ObjectTemplate> object_template = |
8159 v8::ObjectTemplate::New(isolate); | 9138 v8::ObjectTemplate::New(isolate); |
8160 object_template->SetAccessCheckCallback(SecurityTestCallbackWithGC); | 9139 object_template->SetAccessCheckCallback(SecurityTestCallbackWithGC); |
8161 | 9140 |
8162 v8::Handle<Context> context = Context::New(isolate); | 9141 v8::Local<Context> context = Context::New(isolate); |
8163 v8::Context::Scope context_scope(context); | 9142 v8::Context::Scope context_scope(context); |
8164 | 9143 |
8165 context->Global()->Set(v8_str("obj"), object_template->NewInstance()); | 9144 CHECK(context->Global() |
9145 ->Set(context, v8_str("obj"), | |
9146 object_template->NewInstance(context).ToLocalChecked()) | |
9147 .FromJust()); | |
8166 | 9148 |
8167 security_check_with_gc_called = false; | 9149 security_check_with_gc_called = false; |
8168 CompileRun("obj[0] = new String(1002);"); | 9150 CompileRun("obj[0] = new String(1002);"); |
8169 CHECK(security_check_with_gc_called); | 9151 CHECK(security_check_with_gc_called); |
8170 | 9152 |
8171 security_check_with_gc_called = false; | 9153 security_check_with_gc_called = false; |
8172 CHECK(CompileRun("obj[0]")->ToString(isolate)->Equals(v8_str("1002"))); | 9154 CHECK(CompileRun("obj[0]") |
9155 ->ToString(context) | |
9156 .ToLocalChecked() | |
9157 ->Equals(context, v8_str("1002")) | |
9158 .FromJust()); | |
8173 CHECK(security_check_with_gc_called); | 9159 CHECK(security_check_with_gc_called); |
8174 } | 9160 } |
8175 | 9161 |
8176 | 9162 |
8177 THREADED_TEST(CrossDomainDelete) { | 9163 THREADED_TEST(CrossDomainDelete) { |
8178 LocalContext env1; | 9164 LocalContext env1; |
8179 v8::HandleScope handle_scope(env1->GetIsolate()); | 9165 v8::HandleScope handle_scope(env1->GetIsolate()); |
8180 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9166 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8181 | 9167 |
8182 Local<Value> foo = v8_str("foo"); | 9168 Local<Value> foo = v8_str("foo"); |
8183 Local<Value> bar = v8_str("bar"); | 9169 Local<Value> bar = v8_str("bar"); |
8184 | 9170 |
8185 // Set to the same domain. | 9171 // Set to the same domain. |
8186 env1->SetSecurityToken(foo); | 9172 env1->SetSecurityToken(foo); |
8187 env2->SetSecurityToken(foo); | 9173 env2->SetSecurityToken(foo); |
8188 | 9174 |
8189 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 9175 CHECK(env1->Global()->Set(env2, v8_str("prop"), v8_num(3)).FromJust()); |
8190 env2->Global()->Set(v8_str("env1"), env1->Global()); | 9176 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust()); |
8191 | 9177 |
8192 // Change env2 to a different domain and delete env1.prop. | 9178 // Change env2 to a different domain and delete env1.prop. |
8193 env2->SetSecurityToken(bar); | 9179 env2->SetSecurityToken(bar); |
8194 { | 9180 { |
8195 Context::Scope scope_env2(env2); | 9181 Context::Scope scope_env2(env2); |
8196 Local<Value> result = | 9182 Local<Value> result = |
8197 CompileRun("delete env1.prop"); | 9183 CompileRun("delete env1.prop"); |
8198 CHECK(result.IsEmpty()); | 9184 CHECK(result.IsEmpty()); |
8199 } | 9185 } |
8200 | 9186 |
8201 // Check that env1.prop still exists. | 9187 // Check that env1.prop still exists. |
8202 Local<Value> v = env1->Global()->Get(v8_str("prop")); | 9188 Local<Value> v = |
9189 env1->Global()->Get(env1.local(), v8_str("prop")).ToLocalChecked(); | |
8203 CHECK(v->IsNumber()); | 9190 CHECK(v->IsNumber()); |
8204 CHECK_EQ(3, v->Int32Value()); | 9191 CHECK_EQ(3, v->Int32Value(env1.local()).FromJust()); |
8205 } | 9192 } |
8206 | 9193 |
8207 | 9194 |
8208 THREADED_TEST(CrossDomainIsPropertyEnumerable) { | 9195 THREADED_TEST(CrossDomainIsPropertyEnumerable) { |
8209 LocalContext env1; | 9196 LocalContext env1; |
8210 v8::HandleScope handle_scope(env1->GetIsolate()); | 9197 v8::HandleScope handle_scope(env1->GetIsolate()); |
8211 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9198 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8212 | 9199 |
8213 Local<Value> foo = v8_str("foo"); | 9200 Local<Value> foo = v8_str("foo"); |
8214 Local<Value> bar = v8_str("bar"); | 9201 Local<Value> bar = v8_str("bar"); |
8215 | 9202 |
8216 // Set to the same domain. | 9203 // Set to the same domain. |
8217 env1->SetSecurityToken(foo); | 9204 env1->SetSecurityToken(foo); |
8218 env2->SetSecurityToken(foo); | 9205 env2->SetSecurityToken(foo); |
8219 | 9206 |
8220 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 9207 CHECK( |
8221 env2->Global()->Set(v8_str("env1"), env1->Global()); | 9208 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust()); |
9209 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust()); | |
8222 | 9210 |
8223 // env1.prop is enumerable in env2. | 9211 // env1.prop is enumerable in env2. |
8224 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); | 9212 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); |
8225 { | 9213 { |
8226 Context::Scope scope_env2(env2); | 9214 Context::Scope scope_env2(env2); |
8227 Local<Value> result = CompileRun(test); | 9215 Local<Value> result = CompileRun(test); |
8228 CHECK(result->IsTrue()); | 9216 CHECK(result->IsTrue()); |
8229 } | 9217 } |
8230 | 9218 |
8231 // Change env2 to a different domain and test again. | 9219 // Change env2 to a different domain and test again. |
8232 env2->SetSecurityToken(bar); | 9220 env2->SetSecurityToken(bar); |
8233 { | 9221 { |
8234 Context::Scope scope_env2(env2); | 9222 Context::Scope scope_env2(env2); |
8235 Local<Value> result = CompileRun(test); | 9223 Local<Value> result = CompileRun(test); |
8236 CHECK(result.IsEmpty()); | 9224 CHECK(result.IsEmpty()); |
8237 } | 9225 } |
8238 } | 9226 } |
8239 | 9227 |
8240 | 9228 |
8241 THREADED_TEST(CrossDomainFor) { | 9229 THREADED_TEST(CrossDomainFor) { |
8242 LocalContext env1; | 9230 LocalContext env1; |
8243 v8::HandleScope handle_scope(env1->GetIsolate()); | 9231 v8::HandleScope handle_scope(env1->GetIsolate()); |
8244 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9232 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8245 | 9233 |
8246 Local<Value> foo = v8_str("foo"); | 9234 Local<Value> foo = v8_str("foo"); |
8247 Local<Value> bar = v8_str("bar"); | 9235 Local<Value> bar = v8_str("bar"); |
8248 | 9236 |
8249 // Set to the same domain. | 9237 // Set to the same domain. |
8250 env1->SetSecurityToken(foo); | 9238 env1->SetSecurityToken(foo); |
8251 env2->SetSecurityToken(foo); | 9239 env2->SetSecurityToken(foo); |
8252 | 9240 |
8253 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 9241 CHECK( |
8254 env2->Global()->Set(v8_str("env1"), env1->Global()); | 9242 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust()); |
9243 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust()); | |
8255 | 9244 |
8256 // Change env2 to a different domain and set env1's global object | 9245 // Change env2 to a different domain and set env1's global object |
8257 // as the __proto__ of an object in env2 and enumerate properties | 9246 // as the __proto__ of an object in env2 and enumerate properties |
8258 // in for-in. It shouldn't enumerate properties on env1's global | 9247 // in for-in. It shouldn't enumerate properties on env1's global |
8259 // object. | 9248 // object. |
8260 env2->SetSecurityToken(bar); | 9249 env2->SetSecurityToken(bar); |
8261 { | 9250 { |
8262 Context::Scope scope_env2(env2); | 9251 Context::Scope scope_env2(env2); |
8263 Local<Value> result = CompileRun( | 9252 Local<Value> result = CompileRun( |
8264 "(function() {" | 9253 "(function() {" |
8265 " try {" | 9254 " try {" |
8266 " for (var p in env1) {" | 9255 " for (var p in env1) {" |
8267 " if (p == 'prop') return false;" | 9256 " if (p == 'prop') return false;" |
8268 " }" | 9257 " }" |
8269 " return true;" | 9258 " return true;" |
8270 " } catch (e) {" | 9259 " } catch (e) {" |
8271 " return false;" | 9260 " return false;" |
8272 " }" | 9261 " }" |
8273 "})()"); | 9262 "})()"); |
8274 CHECK(result->IsTrue()); | 9263 CHECK(result->IsTrue()); |
8275 } | 9264 } |
8276 } | 9265 } |
8277 | 9266 |
8278 | 9267 |
8279 THREADED_TEST(CrossDomainForInOnPrototype) { | 9268 THREADED_TEST(CrossDomainForInOnPrototype) { |
8280 LocalContext env1; | 9269 LocalContext env1; |
8281 v8::HandleScope handle_scope(env1->GetIsolate()); | 9270 v8::HandleScope handle_scope(env1->GetIsolate()); |
8282 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9271 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8283 | 9272 |
8284 Local<Value> foo = v8_str("foo"); | 9273 Local<Value> foo = v8_str("foo"); |
8285 Local<Value> bar = v8_str("bar"); | 9274 Local<Value> bar = v8_str("bar"); |
8286 | 9275 |
8287 // Set to the same domain. | 9276 // Set to the same domain. |
8288 env1->SetSecurityToken(foo); | 9277 env1->SetSecurityToken(foo); |
8289 env2->SetSecurityToken(foo); | 9278 env2->SetSecurityToken(foo); |
8290 | 9279 |
8291 env1->Global()->Set(v8_str("prop"), v8_num(3)); | 9280 CHECK( |
8292 env2->Global()->Set(v8_str("env1"), env1->Global()); | 9281 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust()); |
9282 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust()); | |
8293 | 9283 |
8294 // Change env2 to a different domain and set env1's global object | 9284 // Change env2 to a different domain and set env1's global object |
8295 // as the __proto__ of an object in env2 and enumerate properties | 9285 // as the __proto__ of an object in env2 and enumerate properties |
8296 // in for-in. It shouldn't enumerate properties on env1's global | 9286 // in for-in. It shouldn't enumerate properties on env1's global |
8297 // object. | 9287 // object. |
8298 env2->SetSecurityToken(bar); | 9288 env2->SetSecurityToken(bar); |
8299 { | 9289 { |
8300 Context::Scope scope_env2(env2); | 9290 Context::Scope scope_env2(env2); |
8301 Local<Value> result = CompileRun( | 9291 Local<Value> result = CompileRun( |
8302 "(function() {" | 9292 "(function() {" |
8303 " var obj = { '__proto__': env1 };" | 9293 " var obj = { '__proto__': env1 };" |
8304 " try {" | 9294 " try {" |
8305 " for (var p in obj) {" | 9295 " for (var p in obj) {" |
8306 " if (p == 'prop') return false;" | 9296 " if (p == 'prop') return false;" |
8307 " }" | 9297 " }" |
8308 " return false;" | 9298 " return false;" |
8309 " } catch (e) {" | 9299 " } catch (e) {" |
8310 " return true;" | 9300 " return true;" |
8311 " }" | 9301 " }" |
8312 "})()"); | 9302 "})()"); |
8313 CHECK(result->IsTrue()); | 9303 CHECK(result->IsTrue()); |
8314 } | 9304 } |
8315 } | 9305 } |
8316 | 9306 |
8317 | 9307 |
8318 TEST(ContextDetachGlobal) { | 9308 TEST(ContextDetachGlobal) { |
8319 LocalContext env1; | 9309 LocalContext env1; |
8320 v8::HandleScope handle_scope(env1->GetIsolate()); | 9310 v8::HandleScope handle_scope(env1->GetIsolate()); |
8321 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9311 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8322 | 9312 |
8323 Local<v8::Object> global1 = env1->Global(); | |
8324 | 9313 |
8325 Local<Value> foo = v8_str("foo"); | 9314 Local<Value> foo = v8_str("foo"); |
8326 | 9315 |
8327 // Set to the same domain. | 9316 // Set to the same domain. |
8328 env1->SetSecurityToken(foo); | 9317 env1->SetSecurityToken(foo); |
8329 env2->SetSecurityToken(foo); | 9318 env2->SetSecurityToken(foo); |
8330 | 9319 |
8331 // Enter env2 | 9320 // Enter env2 |
8332 env2->Enter(); | 9321 env2->Enter(); |
8333 | 9322 |
8334 // Create a function in env2 and add a reference to it in env1. | 9323 // Create a function in env2 and add a reference to it in env1. |
8335 Local<v8::Object> global2 = env2->Global(); | 9324 Local<v8::Object> global2 = env2->Global(); |
8336 global2->Set(v8_str("prop"), v8::Integer::New(env2->GetIsolate(), 1)); | 9325 CHECK(global2->Set(env2, v8_str("prop"), |
9326 v8::Integer::New(env2->GetIsolate(), 1)) | |
9327 .FromJust()); | |
8337 CompileRun("function getProp() {return prop;}"); | 9328 CompileRun("function getProp() {return prop;}"); |
8338 | 9329 |
8339 env1->Global()->Set(v8_str("getProp"), | 9330 CHECK(env1->Global() |
8340 global2->Get(v8_str("getProp"))); | 9331 ->Set(env1.local(), v8_str("getProp"), |
9332 global2->Get(env2, v8_str("getProp")).ToLocalChecked()) | |
9333 .FromJust()); | |
8341 | 9334 |
8342 // Detach env2's global, and reuse the global object of env2 | 9335 // Detach env2's global, and reuse the global object of env2 |
8343 env2->Exit(); | 9336 env2->Exit(); |
8344 env2->DetachGlobal(); | 9337 env2->DetachGlobal(); |
8345 | 9338 |
8346 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), | 9339 v8::Local<Context> env3 = Context::New( |
8347 0, | 9340 env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(), global2); |
8348 v8::Handle<v8::ObjectTemplate>(), | |
8349 global2); | |
8350 env3->SetSecurityToken(v8_str("bar")); | 9341 env3->SetSecurityToken(v8_str("bar")); |
9342 | |
8351 env3->Enter(); | 9343 env3->Enter(); |
8352 | |
8353 Local<v8::Object> global3 = env3->Global(); | 9344 Local<v8::Object> global3 = env3->Global(); |
8354 CHECK(global2->Equals(global3)); | 9345 CHECK(global2->Equals(env3, global3).FromJust()); |
8355 CHECK(global3->Get(v8_str("prop"))->IsUndefined()); | 9346 CHECK(global3->Get(env3, v8_str("prop")).ToLocalChecked()->IsUndefined()); |
8356 CHECK(global3->Get(v8_str("getProp"))->IsUndefined()); | 9347 CHECK(global3->Get(env3, v8_str("getProp")).ToLocalChecked()->IsUndefined()); |
8357 global3->Set(v8_str("prop"), v8::Integer::New(env3->GetIsolate(), -1)); | 9348 CHECK(global3->Set(env3, v8_str("prop"), |
8358 global3->Set(v8_str("prop2"), v8::Integer::New(env3->GetIsolate(), 2)); | 9349 v8::Integer::New(env3->GetIsolate(), -1)) |
9350 .FromJust()); | |
9351 CHECK(global3->Set(env3, v8_str("prop2"), | |
9352 v8::Integer::New(env3->GetIsolate(), 2)) | |
9353 .FromJust()); | |
8359 env3->Exit(); | 9354 env3->Exit(); |
8360 | 9355 |
8361 // Call getProp in env1, and it should return the value 1 | 9356 // Call getProp in env1, and it should return the value 1 |
8362 { | 9357 { |
8363 Local<Value> get_prop = global1->Get(v8_str("getProp")); | 9358 Local<v8::Object> global1 = env1->Global(); |
9359 Local<Value> get_prop = | |
9360 global1->Get(env1.local(), v8_str("getProp")).ToLocalChecked(); | |
8364 CHECK(get_prop->IsFunction()); | 9361 CHECK(get_prop->IsFunction()); |
8365 v8::TryCatch try_catch(env1->GetIsolate()); | 9362 v8::TryCatch try_catch(env1->GetIsolate()); |
8366 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL); | 9363 Local<Value> r = Function::Cast(*get_prop) |
9364 ->Call(env1.local(), global1, 0, NULL) | |
9365 .ToLocalChecked(); | |
8367 CHECK(!try_catch.HasCaught()); | 9366 CHECK(!try_catch.HasCaught()); |
8368 CHECK_EQ(1, r->Int32Value()); | 9367 CHECK_EQ(1, r->Int32Value(env1.local()).FromJust()); |
8369 } | 9368 } |
8370 | 9369 |
8371 // Check that env3 is not accessible from env1 | 9370 // Check that env3 is not accessible from env1 |
8372 { | 9371 { |
8373 Local<Value> r = global3->Get(v8_str("prop2")); | 9372 v8::MaybeLocal<Value> r = global3->Get(env1.local(), v8_str("prop2")); |
8374 CHECK(r.IsEmpty()); | 9373 CHECK(r.IsEmpty()); |
8375 } | 9374 } |
8376 } | 9375 } |
8377 | 9376 |
8378 | 9377 |
8379 TEST(DetachGlobal) { | 9378 TEST(DetachGlobal) { |
8380 LocalContext env1; | 9379 LocalContext env1; |
8381 v8::HandleScope scope(env1->GetIsolate()); | 9380 v8::HandleScope scope(env1->GetIsolate()); |
8382 | 9381 |
8383 // Create second environment. | 9382 // Create second environment. |
8384 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); | 9383 v8::Local<Context> env2 = Context::New(env1->GetIsolate()); |
8385 | 9384 |
8386 Local<Value> foo = v8_str("foo"); | 9385 Local<Value> foo = v8_str("foo"); |
8387 | 9386 |
8388 // Set same security token for env1 and env2. | 9387 // Set same security token for env1 and env2. |
8389 env1->SetSecurityToken(foo); | 9388 env1->SetSecurityToken(foo); |
8390 env2->SetSecurityToken(foo); | 9389 env2->SetSecurityToken(foo); |
8391 | 9390 |
8392 // Create a property on the global object in env2. | 9391 // Create a property on the global object in env2. |
8393 { | 9392 { |
8394 v8::Context::Scope scope(env2); | 9393 v8::Context::Scope scope(env2); |
8395 env2->Global()->Set(v8_str("p"), v8::Integer::New(env2->GetIsolate(), 42)); | 9394 CHECK(env2->Global() |
9395 ->Set(env2, v8_str("p"), v8::Integer::New(env2->GetIsolate(), 42)) | |
9396 .FromJust()); | |
8396 } | 9397 } |
8397 | 9398 |
8398 // Create a reference to env2 global from env1 global. | 9399 // Create a reference to env2 global from env1 global. |
8399 env1->Global()->Set(v8_str("other"), env2->Global()); | 9400 CHECK(env1->Global() |
9401 ->Set(env1.local(), v8_str("other"), env2->Global()) | |
9402 .FromJust()); | |
8400 | 9403 |
8401 // Check that we have access to other.p in env2 from env1. | 9404 // Check that we have access to other.p in env2 from env1. |
8402 Local<Value> result = CompileRun("other.p"); | 9405 Local<Value> result = CompileRun("other.p"); |
8403 CHECK(result->IsInt32()); | 9406 CHECK(result->IsInt32()); |
8404 CHECK_EQ(42, result->Int32Value()); | 9407 CHECK_EQ(42, result->Int32Value(env1.local()).FromJust()); |
8405 | 9408 |
8406 // Hold on to global from env2 and detach global from env2. | 9409 // Hold on to global from env2 and detach global from env2. |
8407 Local<v8::Object> global2 = env2->Global(); | 9410 Local<v8::Object> global2 = env2->Global(); |
8408 env2->DetachGlobal(); | 9411 env2->DetachGlobal(); |
8409 | 9412 |
8410 // Check that the global has been detached. No other.p property can | 9413 // Check that the global has been detached. No other.p property can |
8411 // be found. | 9414 // be found. |
8412 result = CompileRun("other.p"); | 9415 result = CompileRun("other.p"); |
8413 CHECK(result.IsEmpty()); | 9416 CHECK(result.IsEmpty()); |
8414 | 9417 |
8415 // Reuse global2 for env3. | 9418 // Reuse global2 for env3. |
8416 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), | 9419 v8::Local<Context> env3 = Context::New( |
8417 0, | 9420 env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(), global2); |
8418 v8::Handle<v8::ObjectTemplate>(), | 9421 CHECK(global2->Equals(env1.local(), env3->Global()).FromJust()); |
8419 global2); | |
8420 CHECK(global2->Equals(env3->Global())); | |
8421 | 9422 |
8422 // Start by using the same security token for env3 as for env1 and env2. | 9423 // Start by using the same security token for env3 as for env1 and env2. |
8423 env3->SetSecurityToken(foo); | 9424 env3->SetSecurityToken(foo); |
8424 | 9425 |
8425 // Create a property on the global object in env3. | 9426 // Create a property on the global object in env3. |
8426 { | 9427 { |
8427 v8::Context::Scope scope(env3); | 9428 v8::Context::Scope scope(env3); |
8428 env3->Global()->Set(v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24)); | 9429 CHECK(env3->Global() |
9430 ->Set(env3, v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24)) | |
9431 .FromJust()); | |
8429 } | 9432 } |
8430 | 9433 |
8431 // Check that other.p is now the property in env3 and that we have access. | 9434 // Check that other.p is now the property in env3 and that we have access. |
8432 result = CompileRun("other.p"); | 9435 result = CompileRun("other.p"); |
8433 CHECK(result->IsInt32()); | 9436 CHECK(result->IsInt32()); |
8434 CHECK_EQ(24, result->Int32Value()); | 9437 CHECK_EQ(24, result->Int32Value(env3).FromJust()); |
8435 | 9438 |
8436 // Change security token for env3 to something different from env1 and env2. | 9439 // Change security token for env3 to something different from env1 and env2. |
8437 env3->SetSecurityToken(v8_str("bar")); | 9440 env3->SetSecurityToken(v8_str("bar")); |
8438 | 9441 |
8439 // Check that we do not have access to other.p in env1. |other| is now | 9442 // Check that we do not have access to other.p in env1. |other| is now |
8440 // the global object for env3 which has a different security token, | 9443 // the global object for env3 which has a different security token, |
8441 // so access should be blocked. | 9444 // so access should be blocked. |
8442 result = CompileRun("other.p"); | 9445 result = CompileRun("other.p"); |
8443 CHECK(result.IsEmpty()); | 9446 CHECK(result.IsEmpty()); |
8444 } | 9447 } |
8445 | 9448 |
8446 | 9449 |
8447 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) { | 9450 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) { |
9451 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext(); | |
8448 info.GetReturnValue().Set( | 9452 info.GetReturnValue().Set( |
8449 info.GetIsolate()->GetCurrentContext()->Global()->Get(v8_str("x"))); | 9453 context->Global()->Get(context, v8_str("x")).ToLocalChecked()); |
8450 } | 9454 } |
8451 | 9455 |
8452 | 9456 |
8453 TEST(DetachedAccesses) { | 9457 TEST(DetachedAccesses) { |
8454 LocalContext env1; | 9458 LocalContext env1; |
8455 v8::HandleScope scope(env1->GetIsolate()); | 9459 v8::HandleScope scope(env1->GetIsolate()); |
8456 | 9460 |
8457 // Create second environment. | 9461 // Create second environment. |
8458 Local<ObjectTemplate> inner_global_template = | 9462 Local<ObjectTemplate> inner_global_template = |
8459 FunctionTemplate::New(env1->GetIsolate())->InstanceTemplate(); | 9463 FunctionTemplate::New(env1->GetIsolate())->InstanceTemplate(); |
8460 inner_global_template ->SetAccessorProperty( | 9464 inner_global_template ->SetAccessorProperty( |
8461 v8_str("this_x"), FunctionTemplate::New(env1->GetIsolate(), GetThisX)); | 9465 v8_str("this_x"), FunctionTemplate::New(env1->GetIsolate(), GetThisX)); |
8462 v8::Local<Context> env2 = | 9466 v8::Local<Context> env2 = |
8463 Context::New(env1->GetIsolate(), NULL, inner_global_template); | 9467 Context::New(env1->GetIsolate(), NULL, inner_global_template); |
8464 | 9468 |
8465 Local<Value> foo = v8_str("foo"); | 9469 Local<Value> foo = v8_str("foo"); |
8466 | 9470 |
8467 // Set same security token for env1 and env2. | 9471 // Set same security token for env1 and env2. |
8468 env1->SetSecurityToken(foo); | 9472 env1->SetSecurityToken(foo); |
8469 env2->SetSecurityToken(foo); | 9473 env2->SetSecurityToken(foo); |
8470 | 9474 |
8471 env1->Global()->Set(v8_str("x"), v8_str("env1_x")); | 9475 CHECK(env1->Global() |
9476 ->Set(env1.local(), v8_str("x"), v8_str("env1_x")) | |
9477 .FromJust()); | |
8472 | 9478 |
8473 { | 9479 { |
8474 v8::Context::Scope scope(env2); | 9480 v8::Context::Scope scope(env2); |
8475 env2->Global()->Set(v8_str("x"), v8_str("env2_x")); | 9481 CHECK(env2->Global()->Set(env2, v8_str("x"), v8_str("env2_x")).FromJust()); |
8476 CompileRun( | 9482 CompileRun( |
8477 "function bound_x() { return x; }" | 9483 "function bound_x() { return x; }" |
8478 "function get_x() { return this.x; }" | 9484 "function get_x() { return this.x; }" |
8479 "function get_x_w() { return (function() {return this.x;})(); }"); | 9485 "function get_x_w() { return (function() {return this.x;})(); }"); |
8480 env1->Global()->Set(v8_str("bound_x"), CompileRun("bound_x")); | 9486 // SHOULD BE env2 ??? |
8481 env1->Global()->Set(v8_str("get_x"), CompileRun("get_x")); | 9487 CHECK(env1->Global() |
8482 env1->Global()->Set(v8_str("get_x_w"), CompileRun("get_x_w")); | 9488 ->Set(env1.local(), v8_str("bound_x"), CompileRun("bound_x")) |
8483 env1->Global()->Set( | 9489 .FromJust()); |
8484 v8_str("this_x"), | 9490 CHECK(env1->Global() |
8485 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get")); | 9491 ->Set(env1.local(), v8_str("get_x"), CompileRun("get_x")) |
9492 .FromJust()); | |
9493 CHECK(env1->Global() | |
9494 ->Set(env1.local(), v8_str("get_x_w"), CompileRun("get_x_w")) | |
9495 .FromJust()); | |
9496 env1->Global() | |
9497 ->Set(env1.local(), v8_str("this_x"), | |
9498 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get")) | |
9499 .FromJust(); | |
8486 } | 9500 } |
8487 | 9501 |
8488 Local<Object> env2_global = env2->Global(); | 9502 Local<Object> env2_global = env2->Global(); |
8489 env2->DetachGlobal(); | 9503 env2->DetachGlobal(); |
8490 | 9504 |
8491 Local<Value> result; | 9505 Local<Value> result; |
8492 result = CompileRun("bound_x()"); | 9506 result = CompileRun("bound_x()"); |
8493 CHECK(v8_str("env2_x")->Equals(result)); | 9507 CHECK(v8_str("env2_x")->Equals(env1.local(), result).FromJust()); |
8494 result = CompileRun("get_x()"); | 9508 result = CompileRun("get_x()"); |
8495 CHECK(result.IsEmpty()); | 9509 CHECK(result.IsEmpty()); |
8496 result = CompileRun("get_x_w()"); | 9510 result = CompileRun("get_x_w()"); |
8497 CHECK(result.IsEmpty()); | 9511 CHECK(result.IsEmpty()); |
8498 result = CompileRun("this_x()"); | 9512 result = CompileRun("this_x()"); |
8499 CHECK(v8_str("env2_x")->Equals(result)); | 9513 CHECK(v8_str("env2_x")->Equals(env1.local(), result).FromJust()); |
8500 | 9514 |
8501 // Reattach env2's proxy | 9515 // Reattach env2's proxy |
8502 env2 = Context::New(env1->GetIsolate(), | 9516 env2 = Context::New(env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(), |
8503 0, | |
8504 v8::Handle<v8::ObjectTemplate>(), | |
8505 env2_global); | 9517 env2_global); |
8506 env2->SetSecurityToken(foo); | 9518 env2->SetSecurityToken(foo); |
8507 { | 9519 { |
8508 v8::Context::Scope scope(env2); | 9520 v8::Context::Scope scope(env2); |
8509 env2->Global()->Set(v8_str("x"), v8_str("env3_x")); | 9521 CHECK(env2->Global()->Set(env2, v8_str("x"), v8_str("env3_x")).FromJust()); |
8510 env2->Global()->Set(v8_str("env1"), env1->Global()); | 9522 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust()); |
8511 result = CompileRun( | 9523 result = CompileRun( |
8512 "results = [];" | 9524 "results = [];" |
8513 "for (var i = 0; i < 4; i++ ) {" | 9525 "for (var i = 0; i < 4; i++ ) {" |
8514 " results.push(env1.bound_x());" | 9526 " results.push(env1.bound_x());" |
8515 " results.push(env1.get_x());" | 9527 " results.push(env1.get_x());" |
8516 " results.push(env1.get_x_w());" | 9528 " results.push(env1.get_x_w());" |
8517 " results.push(env1.this_x());" | 9529 " results.push(env1.this_x());" |
8518 "}" | 9530 "}" |
8519 "results"); | 9531 "results"); |
8520 Local<v8::Array> results = Local<v8::Array>::Cast(result); | 9532 Local<v8::Array> results = Local<v8::Array>::Cast(result); |
8521 CHECK_EQ(16u, results->Length()); | 9533 CHECK_EQ(16u, results->Length()); |
8522 for (int i = 0; i < 16; i += 4) { | 9534 for (int i = 0; i < 16; i += 4) { |
8523 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); | 9535 CHECK(v8_str("env2_x") |
8524 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); | 9536 ->Equals(env2, results->Get(env2, i + 0).ToLocalChecked()) |
8525 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); | 9537 .FromJust()); |
8526 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); | 9538 CHECK(v8_str("env1_x") |
9539 ->Equals(env2, results->Get(env2, i + 1).ToLocalChecked()) | |
9540 .FromJust()); | |
9541 CHECK(v8_str("env3_x") | |
9542 ->Equals(env2, results->Get(env2, i + 2).ToLocalChecked()) | |
9543 .FromJust()); | |
9544 CHECK(v8_str("env2_x") | |
9545 ->Equals(env2, results->Get(env2, i + 3).ToLocalChecked()) | |
9546 .FromJust()); | |
8527 } | 9547 } |
8528 } | 9548 } |
8529 | 9549 |
8530 result = CompileRun( | 9550 result = CompileRun( |
8531 "results = [];" | 9551 "results = [];" |
8532 "for (var i = 0; i < 4; i++ ) {" | 9552 "for (var i = 0; i < 4; i++ ) {" |
8533 " results.push(bound_x());" | 9553 " results.push(bound_x());" |
8534 " results.push(get_x());" | 9554 " results.push(get_x());" |
8535 " results.push(get_x_w());" | 9555 " results.push(get_x_w());" |
8536 " results.push(this_x());" | 9556 " results.push(this_x());" |
8537 "}" | 9557 "}" |
8538 "results"); | 9558 "results"); |
8539 Local<v8::Array> results = Local<v8::Array>::Cast(result); | 9559 Local<v8::Array> results = Local<v8::Array>::Cast(result); |
8540 CHECK_EQ(16u, results->Length()); | 9560 CHECK_EQ(16u, results->Length()); |
8541 for (int i = 0; i < 16; i += 4) { | 9561 for (int i = 0; i < 16; i += 4) { |
8542 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); | 9562 CHECK(v8_str("env2_x") |
8543 CHECK(v8_str("env3_x")->Equals(results->Get(i + 1))); | 9563 ->Equals(env1.local(), |
8544 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); | 9564 results->Get(env1.local(), i + 0).ToLocalChecked()) |
8545 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); | 9565 .FromJust()); |
9566 CHECK(v8_str("env3_x") | |
9567 ->Equals(env1.local(), | |
9568 results->Get(env1.local(), i + 1).ToLocalChecked()) | |
9569 .FromJust()); | |
9570 CHECK(v8_str("env3_x") | |
9571 ->Equals(env1.local(), | |
9572 results->Get(env1.local(), i + 2).ToLocalChecked()) | |
9573 .FromJust()); | |
9574 CHECK(v8_str("env2_x") | |
9575 ->Equals(env1.local(), | |
9576 results->Get(env1.local(), i + 3).ToLocalChecked()) | |
9577 .FromJust()); | |
8546 } | 9578 } |
8547 | 9579 |
8548 result = CompileRun( | 9580 result = CompileRun( |
8549 "results = [];" | 9581 "results = [];" |
8550 "for (var i = 0; i < 4; i++ ) {" | 9582 "for (var i = 0; i < 4; i++ ) {" |
8551 " results.push(this.bound_x());" | 9583 " results.push(this.bound_x());" |
8552 " results.push(this.get_x());" | 9584 " results.push(this.get_x());" |
8553 " results.push(this.get_x_w());" | 9585 " results.push(this.get_x_w());" |
8554 " results.push(this.this_x());" | 9586 " results.push(this.this_x());" |
8555 "}" | 9587 "}" |
8556 "results"); | 9588 "results"); |
8557 results = Local<v8::Array>::Cast(result); | 9589 results = Local<v8::Array>::Cast(result); |
8558 CHECK_EQ(16u, results->Length()); | 9590 CHECK_EQ(16u, results->Length()); |
8559 for (int i = 0; i < 16; i += 4) { | 9591 for (int i = 0; i < 16; i += 4) { |
8560 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); | 9592 CHECK(v8_str("env2_x") |
8561 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); | 9593 ->Equals(env1.local(), |
8562 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); | 9594 results->Get(env1.local(), i + 0).ToLocalChecked()) |
8563 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); | 9595 .FromJust()); |
9596 CHECK(v8_str("env1_x") | |
9597 ->Equals(env1.local(), | |
9598 results->Get(env1.local(), i + 1).ToLocalChecked()) | |
9599 .FromJust()); | |
9600 CHECK(v8_str("env3_x") | |
9601 ->Equals(env1.local(), | |
9602 results->Get(env1.local(), i + 2).ToLocalChecked()) | |
9603 .FromJust()); | |
9604 CHECK(v8_str("env2_x") | |
9605 ->Equals(env1.local(), | |
9606 results->Get(env1.local(), i + 3).ToLocalChecked()) | |
9607 .FromJust()); | |
8564 } | 9608 } |
8565 } | 9609 } |
8566 | 9610 |
8567 | 9611 |
8568 static bool allowed_access = false; | 9612 static bool allowed_access = false; |
8569 static bool AccessBlocker(Local<v8::Context> accessing_context, | 9613 static bool AccessBlocker(Local<v8::Context> accessing_context, |
8570 Local<v8::Object> accessed_object) { | 9614 Local<v8::Object> accessed_object) { |
8571 return CcTest::isolate()->GetCurrentContext()->Global()->Equals( | 9615 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); |
8572 accessed_object) || | 9616 return context->Global()->Equals(context, accessed_object).FromJust() || |
8573 allowed_access; | 9617 allowed_access; |
8574 } | 9618 } |
8575 | 9619 |
8576 | 9620 |
8577 static int g_echo_value = -1; | 9621 static int g_echo_value = -1; |
8578 | 9622 |
8579 | 9623 |
8580 static void EchoGetter( | 9624 static void EchoGetter( |
8581 Local<String> name, | 9625 Local<String> name, |
8582 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9626 const v8::PropertyCallbackInfo<v8::Value>& info) { |
8583 info.GetReturnValue().Set(v8_num(g_echo_value)); | 9627 info.GetReturnValue().Set(v8_num(g_echo_value)); |
8584 } | 9628 } |
8585 | 9629 |
8586 | 9630 |
8587 static void EchoSetter(Local<String> name, | 9631 static void EchoSetter(Local<String> name, Local<Value> value, |
8588 Local<Value> value, | 9632 const v8::PropertyCallbackInfo<void>& args) { |
8589 const v8::PropertyCallbackInfo<void>&) { | |
8590 if (value->IsNumber()) | 9633 if (value->IsNumber()) |
8591 g_echo_value = value->Int32Value(); | 9634 g_echo_value = |
9635 value->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust(); | |
8592 } | 9636 } |
8593 | 9637 |
8594 | 9638 |
8595 static void UnreachableGetter( | 9639 static void UnreachableGetter( |
8596 Local<String> name, | 9640 Local<String> name, |
8597 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9641 const v8::PropertyCallbackInfo<v8::Value>& info) { |
8598 CHECK(false); // This function should not be called.. | 9642 CHECK(false); // This function should not be called.. |
8599 } | 9643 } |
8600 | 9644 |
8601 | 9645 |
8602 static void UnreachableSetter(Local<String>, | 9646 static void UnreachableSetter(Local<String>, |
8603 Local<Value>, | 9647 Local<Value>, |
8604 const v8::PropertyCallbackInfo<void>&) { | 9648 const v8::PropertyCallbackInfo<void>&) { |
8605 CHECK(false); // This function should nto be called. | 9649 CHECK(false); // This function should nto be called. |
8606 } | 9650 } |
8607 | 9651 |
8608 | 9652 |
8609 static void UnreachableFunction( | 9653 static void UnreachableFunction( |
8610 const v8::FunctionCallbackInfo<v8::Value>& info) { | 9654 const v8::FunctionCallbackInfo<v8::Value>& info) { |
8611 CHECK(false); // This function should not be called.. | 9655 CHECK(false); // This function should not be called.. |
8612 } | 9656 } |
8613 | 9657 |
8614 | 9658 |
8615 TEST(AccessControl) { | 9659 TEST(AccessControl) { |
8616 v8::Isolate* isolate = CcTest::isolate(); | 9660 v8::Isolate* isolate = CcTest::isolate(); |
8617 v8::HandleScope handle_scope(isolate); | 9661 v8::HandleScope handle_scope(isolate); |
8618 v8::Handle<v8::ObjectTemplate> global_template = | 9662 v8::Local<v8::ObjectTemplate> global_template = |
8619 v8::ObjectTemplate::New(isolate); | 9663 v8::ObjectTemplate::New(isolate); |
8620 | 9664 |
8621 global_template->SetAccessCheckCallback(AccessBlocker); | 9665 global_template->SetAccessCheckCallback(AccessBlocker); |
8622 | 9666 |
8623 // Add an accessor accessible by cross-domain JS code. | 9667 // Add an accessor accessible by cross-domain JS code. |
8624 global_template->SetAccessor( | 9668 global_template->SetAccessor( |
8625 v8_str("accessible_prop"), | 9669 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Local<Value>(), |
8626 EchoGetter, EchoSetter, | |
8627 v8::Handle<Value>(), | |
8628 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 9670 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
8629 | 9671 |
8630 | 9672 |
8631 // Add an accessor that is not accessible by cross-domain JS code. | 9673 // Add an accessor that is not accessible by cross-domain JS code. |
8632 global_template->SetAccessor(v8_str("blocked_prop"), | 9674 global_template->SetAccessor(v8_str("blocked_prop"), UnreachableGetter, |
8633 UnreachableGetter, UnreachableSetter, | 9675 UnreachableSetter, v8::Local<Value>(), |
8634 v8::Handle<Value>(), | |
8635 v8::DEFAULT); | 9676 v8::DEFAULT); |
8636 | 9677 |
8637 global_template->SetAccessorProperty( | 9678 global_template->SetAccessorProperty( |
8638 v8_str("blocked_js_prop"), | 9679 v8_str("blocked_js_prop"), |
8639 v8::FunctionTemplate::New(isolate, UnreachableFunction), | 9680 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
8640 v8::FunctionTemplate::New(isolate, UnreachableFunction), | 9681 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
8641 v8::None, | 9682 v8::None, |
8642 v8::DEFAULT); | 9683 v8::DEFAULT); |
8643 | 9684 |
8644 // Create an environment | 9685 // Create an environment |
8645 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); | 9686 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
8646 context0->Enter(); | 9687 context0->Enter(); |
8647 | 9688 |
8648 v8::Handle<v8::Object> global0 = context0->Global(); | 9689 v8::Local<v8::Object> global0 = context0->Global(); |
8649 | 9690 |
8650 // Define a property with JS getter and setter. | 9691 // Define a property with JS getter and setter. |
8651 CompileRun( | 9692 CompileRun( |
8652 "function getter() { return 'getter'; };\n" | 9693 "function getter() { return 'getter'; };\n" |
8653 "function setter() { return 'setter'; }\n" | 9694 "function setter() { return 'setter'; }\n" |
8654 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); | 9695 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); |
8655 | 9696 |
8656 Local<Value> getter = global0->Get(v8_str("getter")); | 9697 Local<Value> getter = |
8657 Local<Value> setter = global0->Get(v8_str("setter")); | 9698 global0->Get(context0, v8_str("getter")).ToLocalChecked(); |
9699 Local<Value> setter = | |
9700 global0->Get(context0, v8_str("setter")).ToLocalChecked(); | |
8658 | 9701 |
8659 // And define normal element. | 9702 // And define normal element. |
8660 global0->Set(239, v8_str("239")); | 9703 CHECK(global0->Set(context0, 239, v8_str("239")).FromJust()); |
8661 | 9704 |
8662 // Define an element with JS getter and setter. | 9705 // Define an element with JS getter and setter. |
8663 CompileRun( | 9706 CompileRun( |
8664 "function el_getter() { return 'el_getter'; };\n" | 9707 "function el_getter() { return 'el_getter'; };\n" |
8665 "function el_setter() { return 'el_setter'; };\n" | 9708 "function el_setter() { return 'el_setter'; };\n" |
8666 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); | 9709 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); |
8667 | 9710 |
8668 Local<Value> el_getter = global0->Get(v8_str("el_getter")); | 9711 Local<Value> el_getter = |
8669 Local<Value> el_setter = global0->Get(v8_str("el_setter")); | 9712 global0->Get(context0, v8_str("el_getter")).ToLocalChecked(); |
9713 Local<Value> el_setter = | |
9714 global0->Get(context0, v8_str("el_setter")).ToLocalChecked(); | |
8670 | 9715 |
8671 v8::HandleScope scope1(isolate); | 9716 v8::HandleScope scope1(isolate); |
8672 | 9717 |
8673 v8::Local<Context> context1 = Context::New(isolate); | 9718 v8::Local<Context> context1 = Context::New(isolate); |
8674 context1->Enter(); | 9719 context1->Enter(); |
8675 | 9720 |
8676 v8::Handle<v8::Object> global1 = context1->Global(); | 9721 v8::Local<v8::Object> global1 = context1->Global(); |
8677 global1->Set(v8_str("other"), global0); | 9722 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust()); |
8678 | 9723 |
8679 // Access blocked property. | 9724 // Access blocked property. |
8680 CompileRun("other.blocked_prop = 1"); | 9725 CompileRun("other.blocked_prop = 1"); |
8681 | 9726 |
8682 CHECK(CompileRun("other.blocked_prop").IsEmpty()); | 9727 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
8683 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") | 9728 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") |
8684 .IsEmpty()); | 9729 .IsEmpty()); |
8685 CHECK( | 9730 CHECK( |
8686 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty()); | 9731 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty()); |
8687 | 9732 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8724 | 9769 |
8725 allowed_access = true; | 9770 allowed_access = true; |
8726 | 9771 |
8727 ExpectString("other[42]", "el_getter"); | 9772 ExpectString("other[42]", "el_getter"); |
8728 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); | 9773 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); |
8729 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); | 9774 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); |
8730 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); | 9775 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); |
8731 | 9776 |
8732 allowed_access = false; | 9777 allowed_access = false; |
8733 | 9778 |
8734 v8::Handle<Value> value; | 9779 v8::Local<Value> value; |
8735 | 9780 |
8736 // Access accessible property | 9781 // Access accessible property |
8737 value = CompileRun("other.accessible_prop = 3"); | 9782 value = CompileRun("other.accessible_prop = 3"); |
8738 CHECK(value->IsNumber()); | 9783 CHECK(value->IsNumber()); |
8739 CHECK_EQ(3, value->Int32Value()); | 9784 CHECK_EQ(3, value->Int32Value(context1).FromJust()); |
8740 CHECK_EQ(3, g_echo_value); | 9785 CHECK_EQ(3, g_echo_value); |
8741 | 9786 |
8742 value = CompileRun("other.accessible_prop"); | 9787 value = CompileRun("other.accessible_prop"); |
8743 CHECK(value->IsNumber()); | 9788 CHECK(value->IsNumber()); |
8744 CHECK_EQ(3, value->Int32Value()); | 9789 CHECK_EQ(3, value->Int32Value(context1).FromJust()); |
8745 | 9790 |
8746 value = CompileRun( | 9791 value = CompileRun( |
8747 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); | 9792 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); |
8748 CHECK(value->IsNumber()); | 9793 CHECK(value->IsNumber()); |
8749 CHECK_EQ(3, value->Int32Value()); | 9794 CHECK_EQ(3, value->Int32Value(context1).FromJust()); |
8750 | 9795 |
8751 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); | 9796 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); |
8752 CHECK(value->IsTrue()); | 9797 CHECK(value->IsTrue()); |
8753 | 9798 |
8754 // Enumeration doesn't enumerate accessors from inaccessible objects in | 9799 // Enumeration doesn't enumerate accessors from inaccessible objects in |
8755 // the prototype chain even if the accessors are in themselves accessible. | 9800 // the prototype chain even if the accessors are in themselves accessible. |
8756 value = CompileRun( | 9801 value = CompileRun( |
8757 "(function() {" | 9802 "(function() {" |
8758 " var obj = { '__proto__': other };" | 9803 " var obj = { '__proto__': other };" |
8759 " try {" | 9804 " try {" |
8760 " for (var p in obj) {" | 9805 " for (var p in obj) {" |
8761 " if (p == 'accessible_prop' ||" | 9806 " if (p == 'accessible_prop' ||" |
8762 " p == 'blocked_js_prop' ||" | 9807 " p == 'blocked_js_prop' ||" |
8763 " p == 'blocked_js_prop') {" | 9808 " p == 'blocked_js_prop') {" |
8764 " return false;" | 9809 " return false;" |
8765 " }" | 9810 " }" |
8766 " }" | 9811 " }" |
8767 " return false;" | 9812 " return false;" |
8768 " } catch (e) {" | 9813 " } catch (e) {" |
8769 " return true;" | 9814 " return true;" |
8770 " }" | 9815 " }" |
8771 "})()"); | 9816 "})()"); |
8772 CHECK(value->IsTrue()); | 9817 CHECK(value->IsTrue()); |
8773 | 9818 |
8774 // Test that preventExtensions fails on a non-accessible object even if that | 9819 // Test that preventExtensions fails on a non-accessible object even if that |
8775 // object is already non-extensible. | 9820 // object is already non-extensible. |
8776 global1->Set(v8_str("checked_object"), global_template->NewInstance()); | 9821 CHECK(global1->Set(context1, v8_str("checked_object"), |
9822 global_template->NewInstance(context1).ToLocalChecked()) | |
9823 .FromJust()); | |
8777 allowed_access = true; | 9824 allowed_access = true; |
8778 CompileRun("Object.preventExtensions(checked_object)"); | 9825 CompileRun("Object.preventExtensions(checked_object)"); |
8779 ExpectFalse("Object.isExtensible(checked_object)"); | 9826 ExpectFalse("Object.isExtensible(checked_object)"); |
8780 allowed_access = false; | 9827 allowed_access = false; |
8781 CHECK(CompileRun("Object.preventExtensions(checked_object)").IsEmpty()); | 9828 CHECK(CompileRun("Object.preventExtensions(checked_object)").IsEmpty()); |
8782 | 9829 |
8783 context1->Exit(); | 9830 context1->Exit(); |
8784 context0->Exit(); | 9831 context0->Exit(); |
8785 } | 9832 } |
8786 | 9833 |
8787 | 9834 |
8788 TEST(AccessControlES5) { | 9835 TEST(AccessControlES5) { |
8789 v8::Isolate* isolate = CcTest::isolate(); | 9836 v8::Isolate* isolate = CcTest::isolate(); |
8790 v8::HandleScope handle_scope(isolate); | 9837 v8::HandleScope handle_scope(isolate); |
8791 v8::Handle<v8::ObjectTemplate> global_template = | 9838 v8::Local<v8::ObjectTemplate> global_template = |
8792 v8::ObjectTemplate::New(isolate); | 9839 v8::ObjectTemplate::New(isolate); |
8793 | 9840 |
8794 global_template->SetAccessCheckCallback(AccessBlocker); | 9841 global_template->SetAccessCheckCallback(AccessBlocker); |
8795 | 9842 |
8796 // Add accessible accessor. | 9843 // Add accessible accessor. |
8797 global_template->SetAccessor( | 9844 global_template->SetAccessor( |
8798 v8_str("accessible_prop"), | 9845 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Local<Value>(), |
8799 EchoGetter, EchoSetter, | |
8800 v8::Handle<Value>(), | |
8801 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 9846 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
8802 | 9847 |
8803 | 9848 |
8804 // Add an accessor that is not accessible by cross-domain JS code. | 9849 // Add an accessor that is not accessible by cross-domain JS code. |
8805 global_template->SetAccessor(v8_str("blocked_prop"), | 9850 global_template->SetAccessor(v8_str("blocked_prop"), UnreachableGetter, |
8806 UnreachableGetter, UnreachableSetter, | 9851 UnreachableSetter, v8::Local<Value>(), |
8807 v8::Handle<Value>(), | |
8808 v8::DEFAULT); | 9852 v8::DEFAULT); |
8809 | 9853 |
8810 // Create an environment | 9854 // Create an environment |
8811 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); | 9855 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
8812 context0->Enter(); | 9856 context0->Enter(); |
8813 | 9857 |
8814 v8::Handle<v8::Object> global0 = context0->Global(); | 9858 v8::Local<v8::Object> global0 = context0->Global(); |
8815 | 9859 |
8816 v8::Local<Context> context1 = Context::New(isolate); | 9860 v8::Local<Context> context1 = Context::New(isolate); |
8817 context1->Enter(); | 9861 context1->Enter(); |
8818 v8::Handle<v8::Object> global1 = context1->Global(); | 9862 v8::Local<v8::Object> global1 = context1->Global(); |
8819 global1->Set(v8_str("other"), global0); | 9863 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust()); |
8820 | 9864 |
8821 // Regression test for issue 1154. | 9865 // Regression test for issue 1154. |
8822 CHECK(CompileRun("Object.keys(other).length == 0")->BooleanValue()); | 9866 CHECK(CompileRun("Object.keys(other).length == 0") |
9867 ->BooleanValue(context1) | |
9868 .FromJust()); | |
8823 CHECK(CompileRun("other.blocked_prop").IsEmpty()); | 9869 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
8824 | 9870 |
8825 // Regression test for issue 1027. | 9871 // Regression test for issue 1027. |
8826 CompileRun("Object.defineProperty(\n" | 9872 CompileRun("Object.defineProperty(\n" |
8827 " other, 'blocked_prop', {configurable: false})"); | 9873 " other, 'blocked_prop', {configurable: false})"); |
8828 CHECK(CompileRun("other.blocked_prop").IsEmpty()); | 9874 CHECK(CompileRun("other.blocked_prop").IsEmpty()); |
8829 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") | 9875 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") |
8830 .IsEmpty()); | 9876 .IsEmpty()); |
8831 | 9877 |
8832 // Regression test for issue 1171. | 9878 // Regression test for issue 1171. |
(...skipping 26 matching lines...) Expand all Loading... | |
8859 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context, | 9905 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context, |
8860 Local<v8::Object> global) { | 9906 Local<v8::Object> global) { |
8861 i::PrintF("Access blocked.\n"); | 9907 i::PrintF("Access blocked.\n"); |
8862 return false; | 9908 return false; |
8863 } | 9909 } |
8864 | 9910 |
8865 | 9911 |
8866 THREADED_TEST(AccessControlGetOwnPropertyNames) { | 9912 THREADED_TEST(AccessControlGetOwnPropertyNames) { |
8867 v8::Isolate* isolate = CcTest::isolate(); | 9913 v8::Isolate* isolate = CcTest::isolate(); |
8868 v8::HandleScope handle_scope(isolate); | 9914 v8::HandleScope handle_scope(isolate); |
8869 v8::Handle<v8::ObjectTemplate> obj_template = | 9915 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); |
8870 v8::ObjectTemplate::New(isolate); | |
8871 | 9916 |
8872 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 9917 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
8873 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 9918 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
8874 | 9919 |
8875 // Add an accessor accessible by cross-domain JS code. | 9920 // Add an accessor accessible by cross-domain JS code. |
8876 obj_template->SetAccessor( | 9921 obj_template->SetAccessor( |
8877 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Handle<Value>(), | 9922 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Local<Value>(), |
8878 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 9923 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
8879 | 9924 |
8880 // Create an environment | 9925 // Create an environment |
8881 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); | 9926 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
8882 context0->Enter(); | 9927 context0->Enter(); |
8883 | 9928 |
8884 v8::Handle<v8::Object> global0 = context0->Global(); | 9929 v8::Local<v8::Object> global0 = context0->Global(); |
8885 | 9930 |
8886 v8::HandleScope scope1(CcTest::isolate()); | 9931 v8::HandleScope scope1(CcTest::isolate()); |
8887 | 9932 |
8888 v8::Local<Context> context1 = Context::New(isolate); | 9933 v8::Local<Context> context1 = Context::New(isolate); |
8889 context1->Enter(); | 9934 context1->Enter(); |
8890 | 9935 |
8891 v8::Handle<v8::Object> global1 = context1->Global(); | 9936 v8::Local<v8::Object> global1 = context1->Global(); |
8892 global1->Set(v8_str("other"), global0); | 9937 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust()); |
8893 global1->Set(v8_str("object"), obj_template->NewInstance()); | 9938 CHECK(global1->Set(context1, v8_str("object"), |
9939 obj_template->NewInstance(context1).ToLocalChecked()) | |
9940 .FromJust()); | |
8894 | 9941 |
8895 v8::Handle<Value> value; | 9942 v8::Local<Value> value; |
8896 | 9943 |
8897 // Attempt to get the property names of the other global object and | 9944 // Attempt to get the property names of the other global object and |
8898 // of an object that requires access checks. Accessing the other | 9945 // of an object that requires access checks. Accessing the other |
8899 // global object should be blocked by access checks on the global | 9946 // global object should be blocked by access checks on the global |
8900 // proxy object. Accessing the object that requires access checks | 9947 // proxy object. Accessing the object that requires access checks |
8901 // is blocked by the access checks on the object itself. | 9948 // is blocked by the access checks on the object itself. |
8902 value = CompileRun( | 9949 value = CompileRun( |
8903 "var names = Object.getOwnPropertyNames(other);" | 9950 "var names = Object.getOwnPropertyNames(other);" |
8904 "names.length == 1 && names[0] == 'accessible_prop';"); | 9951 "names.length == 1 && names[0] == 'accessible_prop';"); |
8905 CHECK(value->BooleanValue()); | 9952 CHECK(value->BooleanValue(context1).FromJust()); |
8906 | 9953 |
8907 value = CompileRun( | 9954 value = CompileRun( |
8908 "var names = Object.getOwnPropertyNames(object);" | 9955 "var names = Object.getOwnPropertyNames(object);" |
8909 "names.length == 1 && names[0] == 'accessible_prop';"); | 9956 "names.length == 1 && names[0] == 'accessible_prop';"); |
8910 CHECK(value->BooleanValue()); | 9957 CHECK(value->BooleanValue(context1).FromJust()); |
8911 | 9958 |
8912 context1->Exit(); | 9959 context1->Exit(); |
8913 context0->Exit(); | 9960 context0->Exit(); |
8914 } | 9961 } |
8915 | 9962 |
8916 | 9963 |
8917 TEST(Regress470113) { | 9964 TEST(Regress470113) { |
8918 v8::Isolate* isolate = CcTest::isolate(); | 9965 v8::Isolate* isolate = CcTest::isolate(); |
8919 v8::HandleScope handle_scope(isolate); | 9966 v8::HandleScope handle_scope(isolate); |
8920 v8::Handle<v8::ObjectTemplate> obj_template = | 9967 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); |
8921 v8::ObjectTemplate::New(isolate); | |
8922 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 9968 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
8923 LocalContext env; | 9969 LocalContext env; |
8924 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); | 9970 CHECK(env->Global() |
9971 ->Set(env.local(), v8_str("prohibited"), | |
9972 obj_template->NewInstance(env.local()).ToLocalChecked()) | |
9973 .FromJust()); | |
8925 | 9974 |
8926 { | 9975 { |
8927 v8::TryCatch try_catch(isolate); | 9976 v8::TryCatch try_catch(isolate); |
8928 CompileRun( | 9977 CompileRun( |
8929 "'use strict';\n" | 9978 "'use strict';\n" |
8930 "class C extends Object {\n" | 9979 "class C extends Object {\n" |
8931 " m() { super.powned = 'Powned!'; }\n" | 9980 " m() { super.powned = 'Powned!'; }\n" |
8932 "}\n" | 9981 "}\n" |
8933 "let c = new C();\n" | 9982 "let c = new C();\n" |
8934 "c.m.call(prohibited)"); | 9983 "c.m.call(prohibited)"); |
8935 | 9984 |
8936 CHECK(try_catch.HasCaught()); | 9985 CHECK(try_catch.HasCaught()); |
8937 } | 9986 } |
8938 } | 9987 } |
8939 | 9988 |
8940 | 9989 |
8941 static void ConstTenGetter(Local<String> name, | 9990 static void ConstTenGetter(Local<String> name, |
8942 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9991 const v8::PropertyCallbackInfo<v8::Value>& info) { |
8943 info.GetReturnValue().Set(v8_num(10)); | 9992 info.GetReturnValue().Set(v8_num(10)); |
8944 } | 9993 } |
8945 | 9994 |
8946 | 9995 |
8947 THREADED_TEST(CrossDomainAccessors) { | 9996 THREADED_TEST(CrossDomainAccessors) { |
8948 v8::Isolate* isolate = CcTest::isolate(); | 9997 v8::Isolate* isolate = CcTest::isolate(); |
8949 v8::HandleScope handle_scope(isolate); | 9998 v8::HandleScope handle_scope(isolate); |
8950 | 9999 |
8951 v8::Handle<v8::FunctionTemplate> func_template = | 10000 v8::Local<v8::FunctionTemplate> func_template = |
8952 v8::FunctionTemplate::New(isolate); | 10001 v8::FunctionTemplate::New(isolate); |
8953 | 10002 |
8954 v8::Handle<v8::ObjectTemplate> global_template = | 10003 v8::Local<v8::ObjectTemplate> global_template = |
8955 func_template->InstanceTemplate(); | 10004 func_template->InstanceTemplate(); |
8956 | 10005 |
8957 v8::Handle<v8::ObjectTemplate> proto_template = | 10006 v8::Local<v8::ObjectTemplate> proto_template = |
8958 func_template->PrototypeTemplate(); | 10007 func_template->PrototypeTemplate(); |
8959 | 10008 |
8960 // Add an accessor to proto that's accessible by cross-domain JS code. | 10009 // Add an accessor to proto that's accessible by cross-domain JS code. |
8961 proto_template->SetAccessor(v8_str("accessible"), | 10010 proto_template->SetAccessor(v8_str("accessible"), ConstTenGetter, 0, |
8962 ConstTenGetter, 0, | 10011 v8::Local<Value>(), v8::ALL_CAN_READ); |
8963 v8::Handle<Value>(), | |
8964 v8::ALL_CAN_READ); | |
8965 | 10012 |
8966 // Add an accessor that is not accessible by cross-domain JS code. | 10013 // Add an accessor that is not accessible by cross-domain JS code. |
8967 global_template->SetAccessor(v8_str("unreachable"), | 10014 global_template->SetAccessor(v8_str("unreachable"), UnreachableGetter, 0, |
8968 UnreachableGetter, 0, | 10015 v8::Local<Value>(), v8::DEFAULT); |
8969 v8::Handle<Value>(), | |
8970 v8::DEFAULT); | |
8971 | 10016 |
8972 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); | 10017 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
8973 context0->Enter(); | 10018 context0->Enter(); |
8974 | 10019 |
8975 Local<v8::Object> global = context0->Global(); | 10020 Local<v8::Object> global = context0->Global(); |
8976 // Add a normal property that shadows 'accessible' | 10021 // Add a normal property that shadows 'accessible' |
8977 global->Set(v8_str("accessible"), v8_num(11)); | 10022 CHECK(global->Set(context0, v8_str("accessible"), v8_num(11)).FromJust()); |
8978 | 10023 |
8979 // Enter a new context. | 10024 // Enter a new context. |
8980 v8::HandleScope scope1(CcTest::isolate()); | 10025 v8::HandleScope scope1(CcTest::isolate()); |
8981 v8::Local<Context> context1 = Context::New(isolate); | 10026 v8::Local<Context> context1 = Context::New(isolate); |
8982 context1->Enter(); | 10027 context1->Enter(); |
8983 | 10028 |
8984 v8::Handle<v8::Object> global1 = context1->Global(); | 10029 v8::Local<v8::Object> global1 = context1->Global(); |
8985 global1->Set(v8_str("other"), global); | 10030 CHECK(global1->Set(context1, v8_str("other"), global).FromJust()); |
8986 | 10031 |
8987 // Should return 10, instead of 11 | 10032 // Should return 10, instead of 11 |
8988 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); | 10033 v8::Local<Value> value = |
10034 v8_compile("other.accessible")->Run(context1).ToLocalChecked(); | |
8989 CHECK(value->IsNumber()); | 10035 CHECK(value->IsNumber()); |
8990 CHECK_EQ(10, value->Int32Value()); | 10036 CHECK_EQ(10, value->Int32Value(context1).FromJust()); |
8991 | 10037 |
8992 value = v8_compile("other.unreachable")->Run(); | 10038 v8::MaybeLocal<v8::Value> maybe_value = |
8993 CHECK(value.IsEmpty()); | 10039 v8_compile("other.unreachable")->Run(context1); |
10040 CHECK(maybe_value.IsEmpty()); | |
8994 | 10041 |
8995 context1->Exit(); | 10042 context1->Exit(); |
8996 context0->Exit(); | 10043 context0->Exit(); |
8997 } | 10044 } |
8998 | 10045 |
8999 | 10046 |
9000 static int access_count = 0; | 10047 static int access_count = 0; |
9001 | 10048 |
9002 static bool AccessCounter(Local<v8::Context> accessing_context, | 10049 static bool AccessCounter(Local<v8::Context> accessing_context, |
9003 Local<v8::Object> accessed_object) { | 10050 Local<v8::Object> accessed_object) { |
9004 access_count++; | 10051 access_count++; |
9005 return true; | 10052 return true; |
9006 } | 10053 } |
9007 | 10054 |
9008 | 10055 |
9009 // This one is too easily disturbed by other tests. | 10056 // This one is too easily disturbed by other tests. |
9010 TEST(AccessControlIC) { | 10057 TEST(AccessControlIC) { |
9011 access_count = 0; | 10058 access_count = 0; |
9012 | 10059 |
9013 v8::Isolate* isolate = CcTest::isolate(); | 10060 v8::Isolate* isolate = CcTest::isolate(); |
9014 v8::HandleScope handle_scope(isolate); | 10061 v8::HandleScope handle_scope(isolate); |
9015 | 10062 |
9016 // Create an environment. | 10063 // Create an environment. |
9017 v8::Local<Context> context0 = Context::New(isolate); | 10064 v8::Local<Context> context0 = Context::New(isolate); |
9018 context0->Enter(); | 10065 context0->Enter(); |
9019 | 10066 |
9020 // Create an object that requires access-check functions to be | 10067 // Create an object that requires access-check functions to be |
9021 // called for cross-domain access. | 10068 // called for cross-domain access. |
9022 v8::Handle<v8::ObjectTemplate> object_template = | 10069 v8::Local<v8::ObjectTemplate> object_template = |
9023 v8::ObjectTemplate::New(isolate); | 10070 v8::ObjectTemplate::New(isolate); |
9024 object_template->SetAccessCheckCallback(AccessCounter); | 10071 object_template->SetAccessCheckCallback(AccessCounter); |
9025 Local<v8::Object> object = object_template->NewInstance(); | 10072 Local<v8::Object> object = |
10073 object_template->NewInstance(context0).ToLocalChecked(); | |
9026 | 10074 |
9027 v8::HandleScope scope1(isolate); | 10075 v8::HandleScope scope1(isolate); |
9028 | 10076 |
9029 // Create another environment. | 10077 // Create another environment. |
9030 v8::Local<Context> context1 = Context::New(isolate); | 10078 v8::Local<Context> context1 = Context::New(isolate); |
9031 context1->Enter(); | 10079 context1->Enter(); |
9032 | 10080 |
9033 // Make easy access to the object from the other environment. | 10081 // Make easy access to the object from the other environment. |
9034 v8::Handle<v8::Object> global1 = context1->Global(); | 10082 v8::Local<v8::Object> global1 = context1->Global(); |
9035 global1->Set(v8_str("obj"), object); | 10083 CHECK(global1->Set(context1, v8_str("obj"), object).FromJust()); |
9036 | 10084 |
9037 v8::Handle<Value> value; | 10085 v8::Local<Value> value; |
9038 | 10086 |
9039 // Check that the named access-control function is called every time. | 10087 // Check that the named access-control function is called every time. |
9040 CompileRun("function testProp(obj) {" | 10088 CompileRun("function testProp(obj) {" |
9041 " for (var i = 0; i < 10; i++) obj.prop = 1;" | 10089 " for (var i = 0; i < 10; i++) obj.prop = 1;" |
9042 " for (var j = 0; j < 10; j++) obj.prop;" | 10090 " for (var j = 0; j < 10; j++) obj.prop;" |
9043 " return obj.prop" | 10091 " return obj.prop" |
9044 "}"); | 10092 "}"); |
9045 value = CompileRun("testProp(obj)"); | 10093 value = CompileRun("testProp(obj)"); |
9046 CHECK(value->IsNumber()); | 10094 CHECK(value->IsNumber()); |
9047 CHECK_EQ(1, value->Int32Value()); | 10095 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9048 CHECK_EQ(21, access_count); | 10096 CHECK_EQ(21, access_count); |
9049 | 10097 |
9050 // Check that the named access-control function is called every time. | 10098 // Check that the named access-control function is called every time. |
9051 CompileRun("var p = 'prop';" | 10099 CompileRun("var p = 'prop';" |
9052 "function testKeyed(obj) {" | 10100 "function testKeyed(obj) {" |
9053 " for (var i = 0; i < 10; i++) obj[p] = 1;" | 10101 " for (var i = 0; i < 10; i++) obj[p] = 1;" |
9054 " for (var j = 0; j < 10; j++) obj[p];" | 10102 " for (var j = 0; j < 10; j++) obj[p];" |
9055 " return obj[p];" | 10103 " return obj[p];" |
9056 "}"); | 10104 "}"); |
9057 // Use obj which requires access checks. No inline caching is used | 10105 // Use obj which requires access checks. No inline caching is used |
9058 // in that case. | 10106 // in that case. |
9059 value = CompileRun("testKeyed(obj)"); | 10107 value = CompileRun("testKeyed(obj)"); |
9060 CHECK(value->IsNumber()); | 10108 CHECK(value->IsNumber()); |
9061 CHECK_EQ(1, value->Int32Value()); | 10109 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9062 CHECK_EQ(42, access_count); | 10110 CHECK_EQ(42, access_count); |
9063 // Force the inline caches into generic state and try again. | 10111 // Force the inline caches into generic state and try again. |
9064 CompileRun("testKeyed({ a: 0 })"); | 10112 CompileRun("testKeyed({ a: 0 })"); |
9065 CompileRun("testKeyed({ b: 0 })"); | 10113 CompileRun("testKeyed({ b: 0 })"); |
9066 value = CompileRun("testKeyed(obj)"); | 10114 value = CompileRun("testKeyed(obj)"); |
9067 CHECK(value->IsNumber()); | 10115 CHECK(value->IsNumber()); |
9068 CHECK_EQ(1, value->Int32Value()); | 10116 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9069 CHECK_EQ(63, access_count); | 10117 CHECK_EQ(63, access_count); |
9070 | 10118 |
9071 // Check that the indexed access-control function is called every time. | 10119 // Check that the indexed access-control function is called every time. |
9072 access_count = 0; | 10120 access_count = 0; |
9073 | 10121 |
9074 CompileRun("function testIndexed(obj) {" | 10122 CompileRun("function testIndexed(obj) {" |
9075 " for (var i = 0; i < 10; i++) obj[0] = 1;" | 10123 " for (var i = 0; i < 10; i++) obj[0] = 1;" |
9076 " for (var j = 0; j < 10; j++) obj[0];" | 10124 " for (var j = 0; j < 10; j++) obj[0];" |
9077 " return obj[0]" | 10125 " return obj[0]" |
9078 "}"); | 10126 "}"); |
9079 value = CompileRun("testIndexed(obj)"); | 10127 value = CompileRun("testIndexed(obj)"); |
9080 CHECK(value->IsNumber()); | 10128 CHECK(value->IsNumber()); |
9081 CHECK_EQ(1, value->Int32Value()); | 10129 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9082 CHECK_EQ(21, access_count); | 10130 CHECK_EQ(21, access_count); |
9083 // Force the inline caches into generic state. | 10131 // Force the inline caches into generic state. |
9084 CompileRun("testIndexed(new Array(1))"); | 10132 CompileRun("testIndexed(new Array(1))"); |
9085 // Test that the indexed access check is called. | 10133 // Test that the indexed access check is called. |
9086 value = CompileRun("testIndexed(obj)"); | 10134 value = CompileRun("testIndexed(obj)"); |
9087 CHECK(value->IsNumber()); | 10135 CHECK(value->IsNumber()); |
9088 CHECK_EQ(1, value->Int32Value()); | 10136 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9089 CHECK_EQ(42, access_count); | 10137 CHECK_EQ(42, access_count); |
9090 | 10138 |
9091 access_count = 0; | 10139 access_count = 0; |
9092 // Check that the named access check is called when invoking | 10140 // Check that the named access check is called when invoking |
9093 // functions on an object that requires access checks. | 10141 // functions on an object that requires access checks. |
9094 CompileRun("obj.f = function() {}"); | 10142 CompileRun("obj.f = function() {}"); |
9095 CompileRun("function testCallNormal(obj) {" | 10143 CompileRun("function testCallNormal(obj) {" |
9096 " for (var i = 0; i < 10; i++) obj.f();" | 10144 " for (var i = 0; i < 10; i++) obj.f();" |
9097 "}"); | 10145 "}"); |
9098 CompileRun("testCallNormal(obj)"); | 10146 CompileRun("testCallNormal(obj)"); |
9099 printf("%i\n", access_count); | 10147 printf("%i\n", access_count); |
9100 CHECK_EQ(11, access_count); | 10148 CHECK_EQ(11, access_count); |
9101 | 10149 |
9102 // Force obj into slow case. | 10150 // Force obj into slow case. |
9103 value = CompileRun("delete obj.prop"); | 10151 value = CompileRun("delete obj.prop"); |
9104 CHECK(value->BooleanValue()); | 10152 CHECK(value->BooleanValue(context1).FromJust()); |
9105 // Force inline caches into dictionary probing mode. | 10153 // Force inline caches into dictionary probing mode. |
9106 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);"); | 10154 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);"); |
9107 // Test that the named access check is called. | 10155 // Test that the named access check is called. |
9108 value = CompileRun("testProp(obj);"); | 10156 value = CompileRun("testProp(obj);"); |
9109 CHECK(value->IsNumber()); | 10157 CHECK(value->IsNumber()); |
9110 CHECK_EQ(1, value->Int32Value()); | 10158 CHECK_EQ(1, value->Int32Value(context1).FromJust()); |
9111 CHECK_EQ(33, access_count); | 10159 CHECK_EQ(33, access_count); |
9112 | 10160 |
9113 // Force the call inline cache into dictionary probing mode. | 10161 // Force the call inline cache into dictionary probing mode. |
9114 CompileRun("o.f = function() {}; testCallNormal(o)"); | 10162 CompileRun("o.f = function() {}; testCallNormal(o)"); |
9115 // Test that the named access check is still called for each | 10163 // Test that the named access check is still called for each |
9116 // invocation of the function. | 10164 // invocation of the function. |
9117 value = CompileRun("testCallNormal(obj)"); | 10165 value = CompileRun("testCallNormal(obj)"); |
9118 CHECK_EQ(43, access_count); | 10166 CHECK_EQ(43, access_count); |
9119 | 10167 |
9120 context1->Exit(); | 10168 context1->Exit(); |
(...skipping 16 matching lines...) Expand all Loading... | |
9137 v8::Isolate* isolate = context->GetIsolate(); | 10185 v8::Isolate* isolate = context->GetIsolate(); |
9138 v8::HandleScope handle_scope(isolate); | 10186 v8::HandleScope handle_scope(isolate); |
9139 | 10187 |
9140 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 10188 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9141 Local<ObjectTemplate> instance = t->InstanceTemplate(); | 10189 Local<ObjectTemplate> instance = t->InstanceTemplate(); |
9142 | 10190 |
9143 instance->Set(v8_str("x"), v8_num(42)); | 10191 instance->Set(v8_str("x"), v8_num(42)); |
9144 instance->Set(v8_str("f"), | 10192 instance->Set(v8_str("f"), |
9145 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); | 10193 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); |
9146 | 10194 |
9147 Local<Value> o = t->GetFunction()->NewInstance(); | 10195 Local<Value> o = t->GetFunction(context.local()) |
10196 .ToLocalChecked() | |
10197 ->NewInstance(context.local()) | |
10198 .ToLocalChecked(); | |
9148 | 10199 |
9149 context->Global()->Set(v8_str("i"), o); | 10200 CHECK(context->Global()->Set(context.local(), v8_str("i"), o).FromJust()); |
9150 Local<Value> value = CompileRun("i.x"); | 10201 Local<Value> value = CompileRun("i.x"); |
9151 CHECK_EQ(42, value->Int32Value()); | 10202 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
9152 | 10203 |
9153 value = CompileRun("i.f()"); | 10204 value = CompileRun("i.f()"); |
9154 CHECK_EQ(12, value->Int32Value()); | 10205 CHECK_EQ(12, value->Int32Value(context.local()).FromJust()); |
9155 } | 10206 } |
9156 | 10207 |
9157 | 10208 |
9158 static void GlobalObjectInstancePropertiesGet( | 10209 static void GlobalObjectInstancePropertiesGet( |
9159 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>&) { | 10210 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>&) { |
9160 ApiTestFuzzer::Fuzz(); | 10211 ApiTestFuzzer::Fuzz(); |
9161 } | 10212 } |
9162 | 10213 |
9163 | 10214 |
9164 THREADED_TEST(GlobalObjectInstanceProperties) { | 10215 THREADED_TEST(GlobalObjectInstanceProperties) { |
(...skipping 27 matching lines...) Expand all Loading... | |
9192 "try { wrapper(true); } catch (e) { thrown = 1; };" | 10243 "try { wrapper(true); } catch (e) { thrown = 1; };" |
9193 "thrown"; | 10244 "thrown"; |
9194 | 10245 |
9195 { | 10246 { |
9196 LocalContext env(NULL, instance_template); | 10247 LocalContext env(NULL, instance_template); |
9197 // Hold on to the global object so it can be used again in another | 10248 // Hold on to the global object so it can be used again in another |
9198 // environment initialization. | 10249 // environment initialization. |
9199 global_object = env->Global(); | 10250 global_object = env->Global(); |
9200 | 10251 |
9201 Local<Value> value = CompileRun("x"); | 10252 Local<Value> value = CompileRun("x"); |
9202 CHECK_EQ(42, value->Int32Value()); | 10253 CHECK_EQ(42, value->Int32Value(env.local()).FromJust()); |
9203 value = CompileRun("f()"); | 10254 value = CompileRun("f()"); |
9204 CHECK_EQ(12, value->Int32Value()); | 10255 CHECK_EQ(12, value->Int32Value(env.local()).FromJust()); |
9205 value = CompileRun(script); | 10256 value = CompileRun(script); |
9206 CHECK_EQ(1, value->Int32Value()); | 10257 CHECK_EQ(1, value->Int32Value(env.local()).FromJust()); |
9207 } | 10258 } |
9208 | 10259 |
9209 { | 10260 { |
9210 // Create new environment reusing the global object. | 10261 // Create new environment reusing the global object. |
9211 LocalContext env(NULL, instance_template, global_object); | 10262 LocalContext env(NULL, instance_template, global_object); |
9212 Local<Value> value = CompileRun("x"); | 10263 Local<Value> value = CompileRun("x"); |
9213 CHECK_EQ(42, value->Int32Value()); | 10264 CHECK_EQ(42, value->Int32Value(env.local()).FromJust()); |
9214 value = CompileRun("f()"); | 10265 value = CompileRun("f()"); |
9215 CHECK_EQ(12, value->Int32Value()); | 10266 CHECK_EQ(12, value->Int32Value(env.local()).FromJust()); |
9216 value = CompileRun(script); | 10267 value = CompileRun(script); |
9217 CHECK_EQ(1, value->Int32Value()); | 10268 CHECK_EQ(1, value->Int32Value(env.local()).FromJust()); |
9218 } | 10269 } |
9219 } | 10270 } |
9220 | 10271 |
9221 | 10272 |
9222 THREADED_TEST(CallKnownGlobalReceiver) { | 10273 THREADED_TEST(CallKnownGlobalReceiver) { |
9223 v8::Isolate* isolate = CcTest::isolate(); | 10274 v8::Isolate* isolate = CcTest::isolate(); |
9224 v8::HandleScope handle_scope(isolate); | 10275 v8::HandleScope handle_scope(isolate); |
9225 | 10276 |
9226 Local<Value> global_object; | 10277 Local<Value> global_object; |
9227 | 10278 |
(...skipping 19 matching lines...) Expand all Loading... | |
9247 LocalContext env(NULL, instance_template); | 10298 LocalContext env(NULL, instance_template); |
9248 // Hold on to the global object so it can be used again in another | 10299 // Hold on to the global object so it can be used again in another |
9249 // environment initialization. | 10300 // environment initialization. |
9250 global_object = env->Global(); | 10301 global_object = env->Global(); |
9251 foo = CompileRun(script); | 10302 foo = CompileRun(script); |
9252 } | 10303 } |
9253 | 10304 |
9254 { | 10305 { |
9255 // Create new environment reusing the global object. | 10306 // Create new environment reusing the global object. |
9256 LocalContext env(NULL, instance_template, global_object); | 10307 LocalContext env(NULL, instance_template, global_object); |
9257 env->Global()->Set(v8_str("foo"), foo); | 10308 CHECK(env->Global()->Set(env.local(), v8_str("foo"), foo).FromJust()); |
9258 CompileRun("foo()"); | 10309 CompileRun("foo()"); |
9259 } | 10310 } |
9260 } | 10311 } |
9261 | 10312 |
9262 | 10313 |
9263 static void ShadowFunctionCallback( | 10314 static void ShadowFunctionCallback( |
9264 const v8::FunctionCallbackInfo<v8::Value>& args) { | 10315 const v8::FunctionCallbackInfo<v8::Value>& args) { |
9265 ApiTestFuzzer::Fuzz(); | 10316 ApiTestFuzzer::Fuzz(); |
9266 args.GetReturnValue().Set(v8_num(42)); | 10317 args.GetReturnValue().Set(v8_num(42)); |
9267 } | 10318 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9314 Local<ObjectTemplate> instance = t->InstanceTemplate(); | 10365 Local<ObjectTemplate> instance = t->InstanceTemplate(); |
9315 | 10366 |
9316 proto->Set(v8_str("f"), | 10367 proto->Set(v8_str("f"), |
9317 v8::FunctionTemplate::New(isolate, | 10368 v8::FunctionTemplate::New(isolate, |
9318 ShadowFunctionCallback, | 10369 ShadowFunctionCallback, |
9319 Local<Value>())); | 10370 Local<Value>())); |
9320 proto->Set(v8_str("x"), v8_num(12)); | 10371 proto->Set(v8_str("x"), v8_num(12)); |
9321 | 10372 |
9322 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); | 10373 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); |
9323 | 10374 |
9324 Local<Value> o = t->GetFunction()->NewInstance(); | 10375 Local<Value> o = t->GetFunction(context.local()) |
9325 context->Global()->Set(v8_str("__proto__"), o); | 10376 .ToLocalChecked() |
10377 ->NewInstance(context.local()) | |
10378 .ToLocalChecked(); | |
10379 CHECK(context->Global() | |
10380 ->Set(context.local(), v8_str("__proto__"), o) | |
10381 .FromJust()); | |
9326 | 10382 |
9327 Local<Value> value = | 10383 Local<Value> value = |
9328 CompileRun("this.propertyIsEnumerable(0)"); | 10384 CompileRun("this.propertyIsEnumerable(0)"); |
9329 CHECK(value->IsBoolean()); | 10385 CHECK(value->IsBoolean()); |
9330 CHECK(!value->BooleanValue()); | 10386 CHECK(!value->BooleanValue(context.local()).FromJust()); |
9331 | 10387 |
9332 value = CompileRun("x"); | 10388 value = CompileRun("x"); |
9333 CHECK_EQ(12, value->Int32Value()); | 10389 CHECK_EQ(12, value->Int32Value(context.local()).FromJust()); |
9334 | 10390 |
9335 value = CompileRun("f()"); | 10391 value = CompileRun("f()"); |
9336 CHECK_EQ(42, value->Int32Value()); | 10392 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
9337 | 10393 |
9338 CompileRun("y = 43"); | 10394 CompileRun("y = 43"); |
9339 CHECK_EQ(1, shadow_y_setter_call_count); | 10395 CHECK_EQ(1, shadow_y_setter_call_count); |
9340 value = CompileRun("y"); | 10396 value = CompileRun("y"); |
9341 CHECK_EQ(1, shadow_y_getter_call_count); | 10397 CHECK_EQ(1, shadow_y_getter_call_count); |
9342 CHECK_EQ(42, value->Int32Value()); | 10398 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
9343 } | 10399 } |
9344 | 10400 |
9345 | 10401 |
9346 THREADED_TEST(HiddenPrototype) { | 10402 THREADED_TEST(HiddenPrototype) { |
9347 LocalContext context; | 10403 LocalContext context; |
9348 v8::Isolate* isolate = context->GetIsolate(); | 10404 v8::Isolate* isolate = context->GetIsolate(); |
9349 v8::HandleScope handle_scope(isolate); | 10405 v8::HandleScope handle_scope(isolate); |
9350 | 10406 |
9351 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); | 10407 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
9352 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 10408 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9353 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 10409 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9354 t1->SetHiddenPrototype(true); | 10410 t1->SetHiddenPrototype(true); |
9355 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); | 10411 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); |
9356 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); | 10412 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9357 t2->SetHiddenPrototype(true); | 10413 t2->SetHiddenPrototype(true); |
9358 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); | 10414 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); |
9359 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); | 10415 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
9360 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); | 10416 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); |
9361 | 10417 |
9362 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); | 10418 Local<v8::Object> o0 = t0->GetFunction(context.local()) |
9363 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10419 .ToLocalChecked() |
9364 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 10420 ->NewInstance(context.local()) |
9365 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 10421 .ToLocalChecked(); |
10422 Local<v8::Object> o1 = t1->GetFunction(context.local()) | |
10423 .ToLocalChecked() | |
10424 ->NewInstance(context.local()) | |
10425 .ToLocalChecked(); | |
10426 Local<v8::Object> o2 = t2->GetFunction(context.local()) | |
10427 .ToLocalChecked() | |
10428 ->NewInstance(context.local()) | |
10429 .ToLocalChecked(); | |
10430 Local<v8::Object> o3 = t3->GetFunction(context.local()) | |
10431 .ToLocalChecked() | |
10432 ->NewInstance(context.local()) | |
10433 .ToLocalChecked(); | |
9366 | 10434 |
9367 // Setting the prototype on an object skips hidden prototypes. | 10435 // Setting the prototype on an object skips hidden prototypes. |
9368 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10436 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) |
9369 o0->Set(v8_str("__proto__"), o1); | 10437 .ToLocalChecked() |
9370 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10438 ->Int32Value(context.local()) |
9371 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10439 .FromJust()); |
9372 o0->Set(v8_str("__proto__"), o2); | 10440 CHECK(o0->Set(context.local(), v8_str("__proto__"), o1).FromJust()); |
9373 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10441 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) |
9374 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10442 .ToLocalChecked() |
9375 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); | 10443 ->Int32Value(context.local()) |
9376 o0->Set(v8_str("__proto__"), o3); | 10444 .FromJust()); |
9377 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10445 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) |
9378 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10446 .ToLocalChecked() |
9379 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); | 10447 ->Int32Value(context.local()) |
9380 CHECK_EQ(3, o0->Get(v8_str("u"))->Int32Value()); | 10448 .FromJust()); |
10449 CHECK(o0->Set(context.local(), v8_str("__proto__"), o2).FromJust()); | |
10450 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) | |
10451 .ToLocalChecked() | |
10452 ->Int32Value(context.local()) | |
10453 .FromJust()); | |
10454 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) | |
10455 .ToLocalChecked() | |
10456 ->Int32Value(context.local()) | |
10457 .FromJust()); | |
10458 CHECK_EQ(2, o0->Get(context.local(), v8_str("z")) | |
10459 .ToLocalChecked() | |
10460 ->Int32Value(context.local()) | |
10461 .FromJust()); | |
10462 CHECK(o0->Set(context.local(), v8_str("__proto__"), o3).FromJust()); | |
10463 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) | |
10464 .ToLocalChecked() | |
10465 ->Int32Value(context.local()) | |
10466 .FromJust()); | |
10467 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) | |
10468 .ToLocalChecked() | |
10469 ->Int32Value(context.local()) | |
10470 .FromJust()); | |
10471 CHECK_EQ(2, o0->Get(context.local(), v8_str("z")) | |
10472 .ToLocalChecked() | |
10473 ->Int32Value(context.local()) | |
10474 .FromJust()); | |
10475 CHECK_EQ(3, o0->Get(context.local(), v8_str("u")) | |
10476 .ToLocalChecked() | |
10477 ->Int32Value(context.local()) | |
10478 .FromJust()); | |
9381 | 10479 |
9382 // Getting the prototype of o0 should get the first visible one | 10480 // Getting the prototype of o0 should get the first visible one |
9383 // which is o3. Therefore, z should not be defined on the prototype | 10481 // which is o3. Therefore, z should not be defined on the prototype |
9384 // object. | 10482 // object. |
9385 Local<Value> proto = o0->Get(v8_str("__proto__")); | 10483 Local<Value> proto = |
10484 o0->Get(context.local(), v8_str("__proto__")).ToLocalChecked(); | |
9386 CHECK(proto->IsObject()); | 10485 CHECK(proto->IsObject()); |
9387 CHECK(proto.As<v8::Object>()->Get(v8_str("z"))->IsUndefined()); | 10486 CHECK(proto.As<v8::Object>() |
10487 ->Get(context.local(), v8_str("z")) | |
10488 .ToLocalChecked() | |
10489 ->IsUndefined()); | |
9388 } | 10490 } |
9389 | 10491 |
9390 | 10492 |
9391 THREADED_TEST(HiddenPrototypeSet) { | 10493 THREADED_TEST(HiddenPrototypeSet) { |
9392 LocalContext context; | 10494 LocalContext context; |
9393 v8::Isolate* isolate = context->GetIsolate(); | 10495 v8::Isolate* isolate = context->GetIsolate(); |
9394 v8::HandleScope handle_scope(isolate); | 10496 v8::HandleScope handle_scope(isolate); |
9395 | 10497 |
9396 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(isolate); | 10498 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(isolate); |
9397 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(isolate); | 10499 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(isolate); |
9398 ht->SetHiddenPrototype(true); | 10500 ht->SetHiddenPrototype(true); |
9399 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(isolate); | 10501 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(isolate); |
9400 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 10502 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9401 | 10503 |
9402 Local<v8::Object> o = ot->GetFunction()->NewInstance(); | 10504 Local<v8::Object> o = ot->GetFunction(context.local()) |
9403 Local<v8::Object> h = ht->GetFunction()->NewInstance(); | 10505 .ToLocalChecked() |
9404 Local<v8::Object> p = pt->GetFunction()->NewInstance(); | 10506 ->NewInstance(context.local()) |
9405 o->Set(v8_str("__proto__"), h); | 10507 .ToLocalChecked(); |
9406 h->Set(v8_str("__proto__"), p); | 10508 Local<v8::Object> h = ht->GetFunction(context.local()) |
10509 .ToLocalChecked() | |
10510 ->NewInstance(context.local()) | |
10511 .ToLocalChecked(); | |
10512 Local<v8::Object> p = pt->GetFunction(context.local()) | |
10513 .ToLocalChecked() | |
10514 ->NewInstance(context.local()) | |
10515 .ToLocalChecked(); | |
10516 CHECK(o->Set(context.local(), v8_str("__proto__"), h).FromJust()); | |
10517 CHECK(h->Set(context.local(), v8_str("__proto__"), p).FromJust()); | |
9407 | 10518 |
9408 // Setting a property that exists on the hidden prototype goes there. | 10519 // Setting a property that exists on the hidden prototype goes there. |
9409 o->Set(v8_str("x"), v8_num(7)); | 10520 CHECK(o->Set(context.local(), v8_str("x"), v8_num(7)).FromJust()); |
9410 CHECK_EQ(7, o->Get(v8_str("x"))->Int32Value()); | 10521 CHECK_EQ(7, o->Get(context.local(), v8_str("x")) |
9411 CHECK_EQ(7, h->Get(v8_str("x"))->Int32Value()); | 10522 .ToLocalChecked() |
9412 CHECK(p->Get(v8_str("x"))->IsUndefined()); | 10523 ->Int32Value(context.local()) |
10524 .FromJust()); | |
10525 CHECK_EQ(7, h->Get(context.local(), v8_str("x")) | |
10526 .ToLocalChecked() | |
10527 ->Int32Value(context.local()) | |
10528 .FromJust()); | |
10529 CHECK(p->Get(context.local(), v8_str("x")).ToLocalChecked()->IsUndefined()); | |
9413 | 10530 |
9414 // Setting a new property should not be forwarded to the hidden prototype. | 10531 // Setting a new property should not be forwarded to the hidden prototype. |
9415 o->Set(v8_str("y"), v8_num(6)); | 10532 CHECK(o->Set(context.local(), v8_str("y"), v8_num(6)).FromJust()); |
9416 CHECK_EQ(6, o->Get(v8_str("y"))->Int32Value()); | 10533 CHECK_EQ(6, o->Get(context.local(), v8_str("y")) |
9417 CHECK(h->Get(v8_str("y"))->IsUndefined()); | 10534 .ToLocalChecked() |
9418 CHECK(p->Get(v8_str("y"))->IsUndefined()); | 10535 ->Int32Value(context.local()) |
10536 .FromJust()); | |
10537 CHECK(h->Get(context.local(), v8_str("y")).ToLocalChecked()->IsUndefined()); | |
10538 CHECK(p->Get(context.local(), v8_str("y")).ToLocalChecked()->IsUndefined()); | |
9419 | 10539 |
9420 // Setting a property that only exists on a prototype of the hidden prototype | 10540 // Setting a property that only exists on a prototype of the hidden prototype |
9421 // is treated normally again. | 10541 // is treated normally again. |
9422 p->Set(v8_str("z"), v8_num(8)); | 10542 CHECK(p->Set(context.local(), v8_str("z"), v8_num(8)).FromJust()); |
9423 CHECK_EQ(8, o->Get(v8_str("z"))->Int32Value()); | 10543 CHECK_EQ(8, o->Get(context.local(), v8_str("z")) |
9424 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); | 10544 .ToLocalChecked() |
9425 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); | 10545 ->Int32Value(context.local()) |
9426 o->Set(v8_str("z"), v8_num(9)); | 10546 .FromJust()); |
9427 CHECK_EQ(9, o->Get(v8_str("z"))->Int32Value()); | 10547 CHECK_EQ(8, h->Get(context.local(), v8_str("z")) |
9428 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); | 10548 .ToLocalChecked() |
9429 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); | 10549 ->Int32Value(context.local()) |
10550 .FromJust()); | |
10551 CHECK_EQ(8, p->Get(context.local(), v8_str("z")) | |
10552 .ToLocalChecked() | |
10553 ->Int32Value(context.local()) | |
10554 .FromJust()); | |
10555 CHECK(o->Set(context.local(), v8_str("z"), v8_num(9)).FromJust()); | |
10556 CHECK_EQ(9, o->Get(context.local(), v8_str("z")) | |
10557 .ToLocalChecked() | |
10558 ->Int32Value(context.local()) | |
10559 .FromJust()); | |
10560 CHECK_EQ(8, h->Get(context.local(), v8_str("z")) | |
10561 .ToLocalChecked() | |
10562 ->Int32Value(context.local()) | |
10563 .FromJust()); | |
10564 CHECK_EQ(8, p->Get(context.local(), v8_str("z")) | |
10565 .ToLocalChecked() | |
10566 ->Int32Value(context.local()) | |
10567 .FromJust()); | |
9430 } | 10568 } |
9431 | 10569 |
9432 | 10570 |
9433 // Regression test for issue 2457. | 10571 // Regression test for issue 2457. |
9434 THREADED_TEST(HiddenPrototypeIdentityHash) { | 10572 THREADED_TEST(HiddenPrototypeIdentityHash) { |
9435 LocalContext context; | 10573 LocalContext context; |
9436 v8::HandleScope handle_scope(context->GetIsolate()); | 10574 v8::HandleScope handle_scope(context->GetIsolate()); |
9437 | 10575 |
9438 Handle<FunctionTemplate> t = FunctionTemplate::New(context->GetIsolate()); | 10576 Local<FunctionTemplate> t = FunctionTemplate::New(context->GetIsolate()); |
9439 t->SetHiddenPrototype(true); | 10577 t->SetHiddenPrototype(true); |
9440 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75)); | 10578 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75)); |
9441 Handle<Object> p = t->GetFunction()->NewInstance(); | 10579 Local<Object> p = t->GetFunction(context.local()) |
9442 Handle<Object> o = Object::New(context->GetIsolate()); | 10580 .ToLocalChecked() |
9443 o->SetPrototype(p); | 10581 ->NewInstance(context.local()) |
10582 .ToLocalChecked(); | |
10583 Local<Object> o = Object::New(context->GetIsolate()); | |
10584 CHECK(o->SetPrototype(context.local(), p).FromJust()); | |
9444 | 10585 |
9445 int hash = o->GetIdentityHash(); | 10586 int hash = o->GetIdentityHash(); |
9446 USE(hash); | 10587 USE(hash); |
9447 o->Set(v8_str("foo"), v8_num(42)); | 10588 CHECK(o->Set(context.local(), v8_str("foo"), v8_num(42)).FromJust()); |
9448 DCHECK_EQ(hash, o->GetIdentityHash()); | 10589 DCHECK_EQ(hash, o->GetIdentityHash()); |
9449 } | 10590 } |
9450 | 10591 |
9451 | 10592 |
9452 THREADED_TEST(SetPrototype) { | 10593 THREADED_TEST(SetPrototype) { |
9453 LocalContext context; | 10594 LocalContext context; |
9454 v8::Isolate* isolate = context->GetIsolate(); | 10595 v8::Isolate* isolate = context->GetIsolate(); |
9455 v8::HandleScope handle_scope(isolate); | 10596 v8::HandleScope handle_scope(isolate); |
9456 | 10597 |
9457 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); | 10598 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
9458 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 10599 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9459 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 10600 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9460 t1->SetHiddenPrototype(true); | 10601 t1->SetHiddenPrototype(true); |
9461 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); | 10602 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); |
9462 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); | 10603 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9463 t2->SetHiddenPrototype(true); | 10604 t2->SetHiddenPrototype(true); |
9464 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); | 10605 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); |
9465 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); | 10606 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
9466 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); | 10607 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); |
9467 | 10608 |
9468 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); | 10609 Local<v8::Object> o0 = t0->GetFunction(context.local()) |
9469 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10610 .ToLocalChecked() |
9470 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 10611 ->NewInstance(context.local()) |
9471 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 10612 .ToLocalChecked(); |
10613 Local<v8::Object> o1 = t1->GetFunction(context.local()) | |
10614 .ToLocalChecked() | |
10615 ->NewInstance(context.local()) | |
10616 .ToLocalChecked(); | |
10617 Local<v8::Object> o2 = t2->GetFunction(context.local()) | |
10618 .ToLocalChecked() | |
10619 ->NewInstance(context.local()) | |
10620 .ToLocalChecked(); | |
10621 Local<v8::Object> o3 = t3->GetFunction(context.local()) | |
10622 .ToLocalChecked() | |
10623 ->NewInstance(context.local()) | |
10624 .ToLocalChecked(); | |
9472 | 10625 |
9473 // Setting the prototype on an object does not skip hidden prototypes. | 10626 // Setting the prototype on an object does not skip hidden prototypes. |
9474 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10627 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) |
9475 CHECK(o0->SetPrototype(o1)); | 10628 .ToLocalChecked() |
9476 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10629 ->Int32Value(context.local()) |
9477 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10630 .FromJust()); |
9478 CHECK(o1->SetPrototype(o2)); | 10631 CHECK(o0->SetPrototype(context.local(), o1).FromJust()); |
9479 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10632 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) |
9480 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10633 .ToLocalChecked() |
9481 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); | 10634 ->Int32Value(context.local()) |
9482 CHECK(o2->SetPrototype(o3)); | 10635 .FromJust()); |
9483 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 10636 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) |
9484 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); | 10637 .ToLocalChecked() |
9485 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); | 10638 ->Int32Value(context.local()) |
9486 CHECK_EQ(3, o0->Get(v8_str("u"))->Int32Value()); | 10639 .FromJust()); |
10640 CHECK(o1->SetPrototype(context.local(), o2).FromJust()); | |
10641 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) | |
10642 .ToLocalChecked() | |
10643 ->Int32Value(context.local()) | |
10644 .FromJust()); | |
10645 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) | |
10646 .ToLocalChecked() | |
10647 ->Int32Value(context.local()) | |
10648 .FromJust()); | |
10649 CHECK_EQ(2, o0->Get(context.local(), v8_str("z")) | |
10650 .ToLocalChecked() | |
10651 ->Int32Value(context.local()) | |
10652 .FromJust()); | |
10653 CHECK(o2->SetPrototype(context.local(), o3).FromJust()); | |
10654 CHECK_EQ(0, o0->Get(context.local(), v8_str("x")) | |
10655 .ToLocalChecked() | |
10656 ->Int32Value(context.local()) | |
10657 .FromJust()); | |
10658 CHECK_EQ(1, o0->Get(context.local(), v8_str("y")) | |
10659 .ToLocalChecked() | |
10660 ->Int32Value(context.local()) | |
10661 .FromJust()); | |
10662 CHECK_EQ(2, o0->Get(context.local(), v8_str("z")) | |
10663 .ToLocalChecked() | |
10664 ->Int32Value(context.local()) | |
10665 .FromJust()); | |
10666 CHECK_EQ(3, o0->Get(context.local(), v8_str("u")) | |
10667 .ToLocalChecked() | |
10668 ->Int32Value(context.local()) | |
10669 .FromJust()); | |
9487 | 10670 |
9488 // Getting the prototype of o0 should get the first visible one | 10671 // Getting the prototype of o0 should get the first visible one |
9489 // which is o3. Therefore, z should not be defined on the prototype | 10672 // which is o3. Therefore, z should not be defined on the prototype |
9490 // object. | 10673 // object. |
9491 Local<Value> proto = o0->Get(v8_str("__proto__")); | 10674 Local<Value> proto = |
10675 o0->Get(context.local(), v8_str("__proto__")).ToLocalChecked(); | |
9492 CHECK(proto->IsObject()); | 10676 CHECK(proto->IsObject()); |
9493 CHECK(proto.As<v8::Object>()->Equals(o3)); | 10677 CHECK(proto.As<v8::Object>()->Equals(context.local(), o3).FromJust()); |
9494 | 10678 |
9495 // However, Object::GetPrototype ignores hidden prototype. | 10679 // However, Object::GetPrototype ignores hidden prototype. |
9496 Local<Value> proto0 = o0->GetPrototype(); | 10680 Local<Value> proto0 = o0->GetPrototype(); |
9497 CHECK(proto0->IsObject()); | 10681 CHECK(proto0->IsObject()); |
9498 CHECK(proto0.As<v8::Object>()->Equals(o1)); | 10682 CHECK(proto0.As<v8::Object>()->Equals(context.local(), o1).FromJust()); |
9499 | 10683 |
9500 Local<Value> proto1 = o1->GetPrototype(); | 10684 Local<Value> proto1 = o1->GetPrototype(); |
9501 CHECK(proto1->IsObject()); | 10685 CHECK(proto1->IsObject()); |
9502 CHECK(proto1.As<v8::Object>()->Equals(o2)); | 10686 CHECK(proto1.As<v8::Object>()->Equals(context.local(), o2).FromJust()); |
9503 | 10687 |
9504 Local<Value> proto2 = o2->GetPrototype(); | 10688 Local<Value> proto2 = o2->GetPrototype(); |
9505 CHECK(proto2->IsObject()); | 10689 CHECK(proto2->IsObject()); |
9506 CHECK(proto2.As<v8::Object>()->Equals(o3)); | 10690 CHECK(proto2.As<v8::Object>()->Equals(context.local(), o3).FromJust()); |
9507 } | 10691 } |
9508 | 10692 |
9509 | 10693 |
9510 // Getting property names of an object with a prototype chain that | 10694 // Getting property names of an object with a prototype chain that |
9511 // triggers dictionary elements in GetOwnPropertyNames() shouldn't | 10695 // triggers dictionary elements in GetOwnPropertyNames() shouldn't |
9512 // crash the runtime. | 10696 // crash the runtime. |
9513 THREADED_TEST(Regress91517) { | 10697 THREADED_TEST(Regress91517) { |
9514 i::FLAG_allow_natives_syntax = true; | 10698 i::FLAG_allow_natives_syntax = true; |
9515 LocalContext context; | 10699 LocalContext context; |
9516 v8::Isolate* isolate = context->GetIsolate(); | 10700 v8::Isolate* isolate = context->GetIsolate(); |
(...skipping 13 matching lines...) Expand all Loading... | |
9530 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); | 10714 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); |
9531 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); | 10715 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); |
9532 | 10716 |
9533 // Force dictionary-based properties. | 10717 // Force dictionary-based properties. |
9534 i::ScopedVector<char> name_buf(1024); | 10718 i::ScopedVector<char> name_buf(1024); |
9535 for (int i = 1; i <= 1000; i++) { | 10719 for (int i = 1; i <= 1000; i++) { |
9536 i::SNPrintF(name_buf, "sdf%d", i); | 10720 i::SNPrintF(name_buf, "sdf%d", i); |
9537 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); | 10721 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); |
9538 } | 10722 } |
9539 | 10723 |
9540 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10724 Local<v8::Object> o1 = t1->GetFunction(context.local()) |
9541 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 10725 .ToLocalChecked() |
9542 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 10726 ->NewInstance(context.local()) |
9543 Local<v8::Object> o4 = t4->GetFunction()->NewInstance(); | 10727 .ToLocalChecked(); |
10728 Local<v8::Object> o2 = t2->GetFunction(context.local()) | |
10729 .ToLocalChecked() | |
10730 ->NewInstance(context.local()) | |
10731 .ToLocalChecked(); | |
10732 Local<v8::Object> o3 = t3->GetFunction(context.local()) | |
10733 .ToLocalChecked() | |
10734 ->NewInstance(context.local()) | |
10735 .ToLocalChecked(); | |
10736 Local<v8::Object> o4 = t4->GetFunction(context.local()) | |
10737 .ToLocalChecked() | |
10738 ->NewInstance(context.local()) | |
10739 .ToLocalChecked(); | |
9544 | 10740 |
9545 // Create prototype chain of hidden prototypes. | 10741 // Create prototype chain of hidden prototypes. |
9546 CHECK(o4->SetPrototype(o3)); | 10742 CHECK(o4->SetPrototype(context.local(), o3).FromJust()); |
9547 CHECK(o3->SetPrototype(o2)); | 10743 CHECK(o3->SetPrototype(context.local(), o2).FromJust()); |
9548 CHECK(o2->SetPrototype(o1)); | 10744 CHECK(o2->SetPrototype(context.local(), o1).FromJust()); |
9549 | 10745 |
9550 // Call the runtime version of GetOwnPropertyNames() on the natively | 10746 // Call the runtime version of GetOwnPropertyNames() on the natively |
9551 // created object through JavaScript. | 10747 // created object through JavaScript. |
9552 context->Global()->Set(v8_str("obj"), o4); | 10748 CHECK(context->Global()->Set(context.local(), v8_str("obj"), o4).FromJust()); |
9553 // PROPERTY_ATTRIBUTES_NONE = 0 | 10749 // PROPERTY_ATTRIBUTES_NONE = 0 |
9554 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); | 10750 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); |
9555 | 10751 |
9556 ExpectInt32("names.length", 1006); | 10752 ExpectInt32("names.length", 1006); |
9557 ExpectTrue("names.indexOf(\"baz\") >= 0"); | 10753 ExpectTrue("names.indexOf(\"baz\") >= 0"); |
9558 ExpectTrue("names.indexOf(\"boo\") >= 0"); | 10754 ExpectTrue("names.indexOf(\"boo\") >= 0"); |
9559 ExpectTrue("names.indexOf(\"foo\") >= 0"); | 10755 ExpectTrue("names.indexOf(\"foo\") >= 0"); |
9560 ExpectTrue("names.indexOf(\"fuz1\") >= 0"); | 10756 ExpectTrue("names.indexOf(\"fuz1\") >= 0"); |
9561 ExpectTrue("names.indexOf(\"fuz2\") >= 0"); | 10757 ExpectTrue("names.indexOf(\"fuz2\") >= 0"); |
9562 ExpectFalse("names[1005] == undefined"); | 10758 ExpectFalse("names[1005] == undefined"); |
(...skipping 14 matching lines...) Expand all Loading... | |
9577 Local<v8::ObjectTemplate> i1 = t1->InstanceTemplate(); | 10773 Local<v8::ObjectTemplate> i1 = t1->InstanceTemplate(); |
9578 i1->SetAccessor(v8_str("foo"), | 10774 i1->SetAccessor(v8_str("foo"), |
9579 SimpleAccessorGetter, SimpleAccessorSetter); | 10775 SimpleAccessorGetter, SimpleAccessorSetter); |
9580 i1->SetAccessor(v8_str("bar"), | 10776 i1->SetAccessor(v8_str("bar"), |
9581 SimpleAccessorGetter, SimpleAccessorSetter); | 10777 SimpleAccessorGetter, SimpleAccessorSetter); |
9582 i1->SetAccessor(v8_str("baz"), | 10778 i1->SetAccessor(v8_str("baz"), |
9583 SimpleAccessorGetter, SimpleAccessorSetter); | 10779 SimpleAccessorGetter, SimpleAccessorSetter); |
9584 i1->Set(v8_str("n1"), v8_num(1)); | 10780 i1->Set(v8_str("n1"), v8_num(1)); |
9585 i1->Set(v8_str("n2"), v8_num(2)); | 10781 i1->Set(v8_str("n2"), v8_num(2)); |
9586 | 10782 |
9587 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10783 Local<v8::Object> o1 = t1->GetFunction(context.local()) |
10784 .ToLocalChecked() | |
10785 ->NewInstance(context.local()) | |
10786 .ToLocalChecked(); | |
9588 Local<v8::FunctionTemplate> t2 = | 10787 Local<v8::FunctionTemplate> t2 = |
9589 v8::FunctionTemplate::New(context->GetIsolate()); | 10788 v8::FunctionTemplate::New(context->GetIsolate()); |
9590 t2->SetHiddenPrototype(true); | 10789 t2->SetHiddenPrototype(true); |
9591 | 10790 |
9592 // Inherit from t1 and mark prototype as hidden. | 10791 // Inherit from t1 and mark prototype as hidden. |
9593 t2->Inherit(t1); | 10792 t2->Inherit(t1); |
9594 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4)); | 10793 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4)); |
9595 | 10794 |
9596 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 10795 Local<v8::Object> o2 = t2->GetFunction(context.local()) |
9597 CHECK(o2->SetPrototype(o1)); | 10796 .ToLocalChecked() |
10797 ->NewInstance(context.local()) | |
10798 .ToLocalChecked(); | |
10799 CHECK(o2->SetPrototype(context.local(), o1).FromJust()); | |
9598 | 10800 |
9599 v8::Local<v8::Symbol> sym = | 10801 v8::Local<v8::Symbol> sym = |
9600 v8::Symbol::New(context->GetIsolate(), v8_str("s1")); | 10802 v8::Symbol::New(context->GetIsolate(), v8_str("s1")); |
9601 o1->Set(sym, v8_num(3)); | 10803 CHECK(o1->Set(context.local(), sym, v8_num(3)).FromJust()); |
9602 o1->SetPrivate(context.local(), | 10804 o1->SetPrivate(context.local(), |
9603 v8::Private::New(context->GetIsolate(), v8_str("h1")), | 10805 v8::Private::New(context->GetIsolate(), v8_str("h1")), |
9604 v8::Integer::New(context->GetIsolate(), 2013)) | 10806 v8::Integer::New(context->GetIsolate(), 2013)) |
9605 .FromJust(); | 10807 .FromJust(); |
9606 | 10808 |
9607 // Call the runtime version of GetOwnPropertyNames() on | 10809 // Call the runtime version of GetOwnPropertyNames() on |
9608 // the natively created object through JavaScript. | 10810 // the natively created object through JavaScript. |
9609 context->Global()->Set(v8_str("obj"), o2); | 10811 CHECK(context->Global()->Set(context.local(), v8_str("obj"), o2).FromJust()); |
9610 context->Global()->Set(v8_str("sym"), sym); | 10812 CHECK(context->Global()->Set(context.local(), v8_str("sym"), sym).FromJust()); |
9611 // PROPERTY_ATTRIBUTES_NONE = 0 | 10813 // PROPERTY_ATTRIBUTES_NONE = 0 |
9612 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); | 10814 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); |
9613 | 10815 |
9614 ExpectInt32("names.length", 7); | 10816 ExpectInt32("names.length", 7); |
9615 ExpectTrue("names.indexOf(\"foo\") >= 0"); | 10817 ExpectTrue("names.indexOf(\"foo\") >= 0"); |
9616 ExpectTrue("names.indexOf(\"bar\") >= 0"); | 10818 ExpectTrue("names.indexOf(\"bar\") >= 0"); |
9617 ExpectTrue("names.indexOf(\"baz\") >= 0"); | 10819 ExpectTrue("names.indexOf(\"baz\") >= 0"); |
9618 ExpectTrue("names.indexOf(\"n1\") >= 0"); | 10820 ExpectTrue("names.indexOf(\"n1\") >= 0"); |
9619 ExpectTrue("names.indexOf(\"n2\") >= 0"); | 10821 ExpectTrue("names.indexOf(\"n2\") >= 0"); |
9620 ExpectTrue("names.indexOf(sym) >= 0"); | 10822 ExpectTrue("names.indexOf(sym) >= 0"); |
9621 ExpectTrue("names.indexOf(\"mine\") >= 0"); | 10823 ExpectTrue("names.indexOf(\"mine\") >= 0"); |
9622 } | 10824 } |
9623 | 10825 |
9624 | 10826 |
9625 THREADED_TEST(FunctionReadOnlyPrototype) { | 10827 THREADED_TEST(FunctionReadOnlyPrototype) { |
9626 LocalContext context; | 10828 LocalContext context; |
9627 v8::Isolate* isolate = context->GetIsolate(); | 10829 v8::Isolate* isolate = context->GetIsolate(); |
9628 v8::HandleScope handle_scope(isolate); | 10830 v8::HandleScope handle_scope(isolate); |
9629 | 10831 |
9630 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 10832 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9631 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 10833 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
9632 t1->ReadOnlyPrototype(); | 10834 t1->ReadOnlyPrototype(); |
9633 context->Global()->Set(v8_str("func1"), t1->GetFunction()); | 10835 CHECK(context->Global() |
10836 ->Set(context.local(), v8_str("func1"), | |
10837 t1->GetFunction(context.local()).ToLocalChecked()) | |
10838 .FromJust()); | |
9634 // Configured value of ReadOnly flag. | 10839 // Configured value of ReadOnly flag. |
9635 CHECK(CompileRun( | 10840 CHECK( |
9636 "(function() {" | 10841 CompileRun( |
9637 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" | 10842 "(function() {" |
9638 " return (descriptor['writable'] == false);" | 10843 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" |
9639 "})()")->BooleanValue()); | 10844 " return (descriptor['writable'] == false);" |
9640 CHECK_EQ(42, CompileRun("func1.prototype.x")->Int32Value()); | 10845 "})()") |
9641 CHECK_EQ(42, | 10846 ->BooleanValue(context.local()) |
9642 CompileRun("func1.prototype = {}; func1.prototype.x")->Int32Value()); | 10847 .FromJust()); |
10848 CHECK_EQ( | |
10849 42, | |
10850 CompileRun("func1.prototype.x")->Int32Value(context.local()).FromJust()); | |
10851 CHECK_EQ(42, CompileRun("func1.prototype = {}; func1.prototype.x") | |
10852 ->Int32Value(context.local()) | |
10853 .FromJust()); | |
9643 | 10854 |
9644 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); | 10855 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9645 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 10856 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
9646 context->Global()->Set(v8_str("func2"), t2->GetFunction()); | 10857 CHECK(context->Global() |
10858 ->Set(context.local(), v8_str("func2"), | |
10859 t2->GetFunction(context.local()).ToLocalChecked()) | |
10860 .FromJust()); | |
9647 // Default value of ReadOnly flag. | 10861 // Default value of ReadOnly flag. |
9648 CHECK(CompileRun( | 10862 CHECK( |
9649 "(function() {" | 10863 CompileRun( |
9650 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" | 10864 "(function() {" |
9651 " return (descriptor['writable'] == true);" | 10865 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" |
9652 "})()")->BooleanValue()); | 10866 " return (descriptor['writable'] == true);" |
9653 CHECK_EQ(42, CompileRun("func2.prototype.x")->Int32Value()); | 10867 "})()") |
10868 ->BooleanValue(context.local()) | |
10869 .FromJust()); | |
10870 CHECK_EQ( | |
10871 42, | |
10872 CompileRun("func2.prototype.x")->Int32Value(context.local()).FromJust()); | |
9654 } | 10873 } |
9655 | 10874 |
9656 | 10875 |
9657 THREADED_TEST(SetPrototypeThrows) { | 10876 THREADED_TEST(SetPrototypeThrows) { |
9658 LocalContext context; | 10877 LocalContext context; |
9659 v8::Isolate* isolate = context->GetIsolate(); | 10878 v8::Isolate* isolate = context->GetIsolate(); |
9660 v8::HandleScope handle_scope(isolate); | 10879 v8::HandleScope handle_scope(isolate); |
9661 | 10880 |
9662 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 10881 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9663 | 10882 |
9664 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); | 10883 Local<v8::Object> o0 = t->GetFunction(context.local()) |
9665 Local<v8::Object> o1 = t->GetFunction()->NewInstance(); | 10884 .ToLocalChecked() |
10885 ->NewInstance(context.local()) | |
10886 .ToLocalChecked(); | |
10887 Local<v8::Object> o1 = t->GetFunction(context.local()) | |
10888 .ToLocalChecked() | |
10889 ->NewInstance(context.local()) | |
10890 .ToLocalChecked(); | |
9666 | 10891 |
9667 CHECK(o0->SetPrototype(o1)); | 10892 CHECK(o0->SetPrototype(context.local(), o1).FromJust()); |
9668 // If setting the prototype leads to the cycle, SetPrototype should | 10893 // If setting the prototype leads to the cycle, SetPrototype should |
9669 // return false and keep VM in sane state. | 10894 // return false and keep VM in sane state. |
9670 v8::TryCatch try_catch(isolate); | 10895 v8::TryCatch try_catch(isolate); |
9671 CHECK(!o1->SetPrototype(o0)); | 10896 CHECK(o1->SetPrototype(context.local(), o0).IsNothing()); |
9672 CHECK(!try_catch.HasCaught()); | 10897 CHECK(!try_catch.HasCaught()); |
9673 DCHECK(!CcTest::i_isolate()->has_pending_exception()); | 10898 DCHECK(!CcTest::i_isolate()->has_pending_exception()); |
9674 | 10899 |
9675 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()")->Int32Value()); | 10900 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()") |
10901 ->Int32Value(context.local()) | |
10902 .FromJust()); | |
9676 } | 10903 } |
9677 | 10904 |
9678 | 10905 |
9679 THREADED_TEST(FunctionRemovePrototype) { | 10906 THREADED_TEST(FunctionRemovePrototype) { |
9680 LocalContext context; | 10907 LocalContext context; |
9681 v8::Isolate* isolate = context->GetIsolate(); | 10908 v8::Isolate* isolate = context->GetIsolate(); |
9682 v8::HandleScope handle_scope(isolate); | 10909 v8::HandleScope handle_scope(isolate); |
9683 | 10910 |
9684 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); | 10911 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9685 t1->RemovePrototype(); | 10912 t1->RemovePrototype(); |
9686 Local<v8::Function> fun = t1->GetFunction(); | 10913 Local<v8::Function> fun = t1->GetFunction(context.local()).ToLocalChecked(); |
9687 context->Global()->Set(v8_str("fun"), fun); | 10914 CHECK(context->Global()->Set(context.local(), v8_str("fun"), fun).FromJust()); |
9688 CHECK(!CompileRun("'prototype' in fun")->BooleanValue()); | 10915 CHECK(!CompileRun("'prototype' in fun") |
10916 ->BooleanValue(context.local()) | |
10917 .FromJust()); | |
9689 | 10918 |
9690 v8::TryCatch try_catch(isolate); | 10919 v8::TryCatch try_catch(isolate); |
9691 CompileRun("new fun()"); | 10920 CompileRun("new fun()"); |
9692 CHECK(try_catch.HasCaught()); | 10921 CHECK(try_catch.HasCaught()); |
9693 | 10922 |
9694 try_catch.Reset(); | 10923 try_catch.Reset(); |
9695 fun->NewInstance(); | 10924 CHECK(fun->NewInstance(context.local()).IsEmpty()); |
9696 CHECK(try_catch.HasCaught()); | 10925 CHECK(try_catch.HasCaught()); |
9697 } | 10926 } |
9698 | 10927 |
9699 | 10928 |
9700 THREADED_TEST(GetterSetterExceptions) { | 10929 THREADED_TEST(GetterSetterExceptions) { |
9701 LocalContext context; | 10930 LocalContext context; |
9702 v8::Isolate* isolate = context->GetIsolate(); | 10931 v8::Isolate* isolate = context->GetIsolate(); |
9703 v8::HandleScope handle_scope(isolate); | 10932 v8::HandleScope handle_scope(isolate); |
9704 CompileRun( | 10933 CompileRun( |
9705 "function Foo() { };" | 10934 "function Foo() { };" |
9706 "function Throw() { throw 5; };" | 10935 "function Throw() { throw 5; };" |
9707 "var x = { };" | 10936 "var x = { };" |
9708 "x.__defineSetter__('set', Throw);" | 10937 "x.__defineSetter__('set', Throw);" |
9709 "x.__defineGetter__('get', Throw);"); | 10938 "x.__defineGetter__('get', Throw);"); |
9710 Local<v8::Object> x = | 10939 Local<v8::Object> x = Local<v8::Object>::Cast( |
9711 Local<v8::Object>::Cast(context->Global()->Get(v8_str("x"))); | 10940 context->Global()->Get(context.local(), v8_str("x")).ToLocalChecked()); |
9712 v8::TryCatch try_catch(isolate); | 10941 v8::TryCatch try_catch(isolate); |
9713 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); | 10942 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8)) |
9714 x->Get(v8_str("get")); | 10943 .IsNothing()); |
9715 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); | 10944 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty()); |
9716 x->Get(v8_str("get")); | 10945 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8)) |
9717 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); | 10946 .IsNothing()); |
9718 x->Get(v8_str("get")); | 10947 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty()); |
9719 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); | 10948 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8)) |
9720 x->Get(v8_str("get")); | 10949 .IsNothing()); |
10950 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty()); | |
10951 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8)) | |
10952 .IsNothing()); | |
10953 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty()); | |
9721 } | 10954 } |
9722 | 10955 |
9723 | 10956 |
9724 THREADED_TEST(Constructor) { | 10957 THREADED_TEST(Constructor) { |
9725 LocalContext context; | 10958 LocalContext context; |
9726 v8::Isolate* isolate = context->GetIsolate(); | 10959 v8::Isolate* isolate = context->GetIsolate(); |
9727 v8::HandleScope handle_scope(isolate); | 10960 v8::HandleScope handle_scope(isolate); |
9728 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 10961 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
9729 templ->SetClassName(v8_str("Fun")); | 10962 templ->SetClassName(v8_str("Fun")); |
9730 Local<Function> cons = templ->GetFunction(); | 10963 Local<Function> cons = templ->GetFunction(context.local()).ToLocalChecked(); |
9731 context->Global()->Set(v8_str("Fun"), cons); | 10964 CHECK( |
9732 Local<v8::Object> inst = cons->NewInstance(); | 10965 context->Global()->Set(context.local(), v8_str("Fun"), cons).FromJust()); |
10966 Local<v8::Object> inst = cons->NewInstance(context.local()).ToLocalChecked(); | |
9733 i::Handle<i::JSReceiver> obj(v8::Utils::OpenHandle(*inst)); | 10967 i::Handle<i::JSReceiver> obj(v8::Utils::OpenHandle(*inst)); |
9734 CHECK(obj->IsJSObject()); | 10968 CHECK(obj->IsJSObject()); |
9735 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); | 10969 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); |
9736 CHECK(value->BooleanValue()); | 10970 CHECK(value->BooleanValue(context.local()).FromJust()); |
9737 } | 10971 } |
9738 | 10972 |
9739 | 10973 |
9740 static void ConstructorCallback( | 10974 static void ConstructorCallback( |
9741 const v8::FunctionCallbackInfo<v8::Value>& args) { | 10975 const v8::FunctionCallbackInfo<v8::Value>& args) { |
9742 ApiTestFuzzer::Fuzz(); | 10976 ApiTestFuzzer::Fuzz(); |
9743 Local<Object> This; | 10977 Local<Object> This; |
9744 | 10978 |
10979 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); | |
9745 if (args.IsConstructCall()) { | 10980 if (args.IsConstructCall()) { |
9746 Local<Object> Holder = args.Holder(); | 10981 Local<Object> Holder = args.Holder(); |
9747 This = Object::New(args.GetIsolate()); | 10982 This = Object::New(args.GetIsolate()); |
9748 Local<Value> proto = Holder->GetPrototype(); | 10983 Local<Value> proto = Holder->GetPrototype(); |
9749 if (proto->IsObject()) { | 10984 if (proto->IsObject()) { |
9750 This->SetPrototype(proto); | 10985 This->SetPrototype(context, proto).FromJust(); |
9751 } | 10986 } |
9752 } else { | 10987 } else { |
9753 This = args.This(); | 10988 This = args.This(); |
9754 } | 10989 } |
9755 | 10990 |
9756 This->Set(v8_str("a"), args[0]); | 10991 This->Set(context, v8_str("a"), args[0]).FromJust(); |
9757 args.GetReturnValue().Set(This); | 10992 args.GetReturnValue().Set(This); |
9758 } | 10993 } |
9759 | 10994 |
9760 | 10995 |
9761 static void FakeConstructorCallback( | 10996 static void FakeConstructorCallback( |
9762 const v8::FunctionCallbackInfo<v8::Value>& args) { | 10997 const v8::FunctionCallbackInfo<v8::Value>& args) { |
9763 ApiTestFuzzer::Fuzz(); | 10998 ApiTestFuzzer::Fuzz(); |
9764 args.GetReturnValue().Set(args[0]); | 10999 args.GetReturnValue().Set(args[0]); |
9765 } | 11000 } |
9766 | 11001 |
9767 | 11002 |
9768 THREADED_TEST(ConstructorForObject) { | 11003 THREADED_TEST(ConstructorForObject) { |
9769 LocalContext context; | 11004 LocalContext context; |
9770 v8::Isolate* isolate = context->GetIsolate(); | 11005 v8::Isolate* isolate = context->GetIsolate(); |
9771 v8::HandleScope handle_scope(isolate); | 11006 v8::HandleScope handle_scope(isolate); |
9772 | 11007 |
9773 { | 11008 { |
9774 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11009 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
9775 instance_template->SetCallAsFunctionHandler(ConstructorCallback); | 11010 instance_template->SetCallAsFunctionHandler(ConstructorCallback); |
9776 Local<Object> instance = instance_template->NewInstance(); | 11011 Local<Object> instance = |
9777 context->Global()->Set(v8_str("obj"), instance); | 11012 instance_template->NewInstance(context.local()).ToLocalChecked(); |
11013 CHECK(context->Global() | |
11014 ->Set(context.local(), v8_str("obj"), instance) | |
11015 .FromJust()); | |
9778 v8::TryCatch try_catch(isolate); | 11016 v8::TryCatch try_catch(isolate); |
9779 Local<Value> value; | 11017 Local<Value> value; |
9780 CHECK(!try_catch.HasCaught()); | 11018 CHECK(!try_catch.HasCaught()); |
9781 | 11019 |
9782 // Call the Object's constructor with a 32-bit signed integer. | 11020 // Call the Object's constructor with a 32-bit signed integer. |
9783 value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); | 11021 value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); |
9784 CHECK(!try_catch.HasCaught()); | 11022 CHECK(!try_catch.HasCaught()); |
9785 CHECK(value->IsInt32()); | 11023 CHECK(value->IsInt32()); |
9786 CHECK_EQ(28, value->Int32Value()); | 11024 CHECK_EQ(28, value->Int32Value(context.local()).FromJust()); |
9787 | 11025 |
9788 Local<Value> args1[] = {v8_num(28)}; | 11026 Local<Value> args1[] = {v8_num(28)}; |
9789 Local<Value> value_obj1 = instance->CallAsConstructor(1, args1); | 11027 Local<Value> value_obj1 = |
11028 instance->CallAsConstructor(context.local(), 1, args1).ToLocalChecked(); | |
9790 CHECK(value_obj1->IsObject()); | 11029 CHECK(value_obj1->IsObject()); |
9791 Local<Object> object1 = Local<Object>::Cast(value_obj1); | 11030 Local<Object> object1 = Local<Object>::Cast(value_obj1); |
9792 value = object1->Get(v8_str("a")); | 11031 value = object1->Get(context.local(), v8_str("a")).ToLocalChecked(); |
9793 CHECK(value->IsInt32()); | 11032 CHECK(value->IsInt32()); |
9794 CHECK(!try_catch.HasCaught()); | 11033 CHECK(!try_catch.HasCaught()); |
9795 CHECK_EQ(28, value->Int32Value()); | 11034 CHECK_EQ(28, value->Int32Value(context.local()).FromJust()); |
9796 | 11035 |
9797 // Call the Object's constructor with a String. | 11036 // Call the Object's constructor with a String. |
9798 value = | 11037 value = |
9799 CompileRun("(function() { var o = new obj('tipli'); return o.a; })()"); | 11038 CompileRun("(function() { var o = new obj('tipli'); return o.a; })()"); |
9800 CHECK(!try_catch.HasCaught()); | 11039 CHECK(!try_catch.HasCaught()); |
9801 CHECK(value->IsString()); | 11040 CHECK(value->IsString()); |
9802 String::Utf8Value string_value1(value->ToString(isolate)); | 11041 String::Utf8Value string_value1( |
11042 value->ToString(context.local()).ToLocalChecked()); | |
9803 CHECK_EQ(0, strcmp("tipli", *string_value1)); | 11043 CHECK_EQ(0, strcmp("tipli", *string_value1)); |
9804 | 11044 |
9805 Local<Value> args2[] = {v8_str("tipli")}; | 11045 Local<Value> args2[] = {v8_str("tipli")}; |
9806 Local<Value> value_obj2 = instance->CallAsConstructor(1, args2); | 11046 Local<Value> value_obj2 = |
11047 instance->CallAsConstructor(context.local(), 1, args2).ToLocalChecked(); | |
9807 CHECK(value_obj2->IsObject()); | 11048 CHECK(value_obj2->IsObject()); |
9808 Local<Object> object2 = Local<Object>::Cast(value_obj2); | 11049 Local<Object> object2 = Local<Object>::Cast(value_obj2); |
9809 value = object2->Get(v8_str("a")); | 11050 value = object2->Get(context.local(), v8_str("a")).ToLocalChecked(); |
9810 CHECK(!try_catch.HasCaught()); | 11051 CHECK(!try_catch.HasCaught()); |
9811 CHECK(value->IsString()); | 11052 CHECK(value->IsString()); |
9812 String::Utf8Value string_value2(value->ToString(isolate)); | 11053 String::Utf8Value string_value2( |
11054 value->ToString(context.local()).ToLocalChecked()); | |
9813 CHECK_EQ(0, strcmp("tipli", *string_value2)); | 11055 CHECK_EQ(0, strcmp("tipli", *string_value2)); |
9814 | 11056 |
9815 // Call the Object's constructor with a Boolean. | 11057 // Call the Object's constructor with a Boolean. |
9816 value = CompileRun("(function() { var o = new obj(true); return o.a; })()"); | 11058 value = CompileRun("(function() { var o = new obj(true); return o.a; })()"); |
9817 CHECK(!try_catch.HasCaught()); | 11059 CHECK(!try_catch.HasCaught()); |
9818 CHECK(value->IsBoolean()); | 11060 CHECK(value->IsBoolean()); |
9819 CHECK_EQ(true, value->BooleanValue()); | 11061 CHECK_EQ(true, value->BooleanValue(context.local()).FromJust()); |
9820 | 11062 |
9821 Handle<Value> args3[] = {v8::True(isolate)}; | 11063 Local<Value> args3[] = {v8::True(isolate)}; |
9822 Local<Value> value_obj3 = instance->CallAsConstructor(1, args3); | 11064 Local<Value> value_obj3 = |
11065 instance->CallAsConstructor(context.local(), 1, args3).ToLocalChecked(); | |
9823 CHECK(value_obj3->IsObject()); | 11066 CHECK(value_obj3->IsObject()); |
9824 Local<Object> object3 = Local<Object>::Cast(value_obj3); | 11067 Local<Object> object3 = Local<Object>::Cast(value_obj3); |
9825 value = object3->Get(v8_str("a")); | 11068 value = object3->Get(context.local(), v8_str("a")).ToLocalChecked(); |
9826 CHECK(!try_catch.HasCaught()); | 11069 CHECK(!try_catch.HasCaught()); |
9827 CHECK(value->IsBoolean()); | 11070 CHECK(value->IsBoolean()); |
9828 CHECK_EQ(true, value->BooleanValue()); | 11071 CHECK_EQ(true, value->BooleanValue(context.local()).FromJust()); |
9829 | 11072 |
9830 // Call the Object's constructor with undefined. | 11073 // Call the Object's constructor with undefined. |
9831 Handle<Value> args4[] = {v8::Undefined(isolate)}; | 11074 Local<Value> args4[] = {v8::Undefined(isolate)}; |
9832 Local<Value> value_obj4 = instance->CallAsConstructor(1, args4); | 11075 Local<Value> value_obj4 = |
11076 instance->CallAsConstructor(context.local(), 1, args4).ToLocalChecked(); | |
9833 CHECK(value_obj4->IsObject()); | 11077 CHECK(value_obj4->IsObject()); |
9834 Local<Object> object4 = Local<Object>::Cast(value_obj4); | 11078 Local<Object> object4 = Local<Object>::Cast(value_obj4); |
9835 value = object4->Get(v8_str("a")); | 11079 value = object4->Get(context.local(), v8_str("a")).ToLocalChecked(); |
9836 CHECK(!try_catch.HasCaught()); | 11080 CHECK(!try_catch.HasCaught()); |
9837 CHECK(value->IsUndefined()); | 11081 CHECK(value->IsUndefined()); |
9838 | 11082 |
9839 // Call the Object's constructor with null. | 11083 // Call the Object's constructor with null. |
9840 Handle<Value> args5[] = {v8::Null(isolate)}; | 11084 Local<Value> args5[] = {v8::Null(isolate)}; |
9841 Local<Value> value_obj5 = instance->CallAsConstructor(1, args5); | 11085 Local<Value> value_obj5 = |
11086 instance->CallAsConstructor(context.local(), 1, args5).ToLocalChecked(); | |
9842 CHECK(value_obj5->IsObject()); | 11087 CHECK(value_obj5->IsObject()); |
9843 Local<Object> object5 = Local<Object>::Cast(value_obj5); | 11088 Local<Object> object5 = Local<Object>::Cast(value_obj5); |
9844 value = object5->Get(v8_str("a")); | 11089 value = object5->Get(context.local(), v8_str("a")).ToLocalChecked(); |
9845 CHECK(!try_catch.HasCaught()); | 11090 CHECK(!try_catch.HasCaught()); |
9846 CHECK(value->IsNull()); | 11091 CHECK(value->IsNull()); |
9847 } | 11092 } |
9848 | 11093 |
9849 // Check exception handling when there is no constructor set for the Object. | 11094 // Check exception handling when there is no constructor set for the Object. |
9850 { | 11095 { |
9851 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11096 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
9852 Local<Object> instance = instance_template->NewInstance(); | 11097 Local<Object> instance = |
9853 context->Global()->Set(v8_str("obj2"), instance); | 11098 instance_template->NewInstance(context.local()).ToLocalChecked(); |
11099 CHECK(context->Global() | |
11100 ->Set(context.local(), v8_str("obj2"), instance) | |
11101 .FromJust()); | |
9854 v8::TryCatch try_catch(isolate); | 11102 v8::TryCatch try_catch(isolate); |
9855 Local<Value> value; | 11103 Local<Value> value; |
9856 CHECK(!try_catch.HasCaught()); | 11104 CHECK(!try_catch.HasCaught()); |
9857 | 11105 |
9858 value = CompileRun("new obj2(28)"); | 11106 value = CompileRun("new obj2(28)"); |
9859 CHECK(try_catch.HasCaught()); | 11107 CHECK(try_catch.HasCaught()); |
9860 String::Utf8Value exception_value1(try_catch.Exception()); | 11108 String::Utf8Value exception_value1(try_catch.Exception()); |
9861 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); | 11109 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); |
9862 try_catch.Reset(); | 11110 try_catch.Reset(); |
9863 | 11111 |
9864 Local<Value> args[] = {v8_num(29)}; | 11112 Local<Value> args[] = {v8_num(29)}; |
9865 value = instance->CallAsConstructor(1, args); | 11113 CHECK(instance->CallAsConstructor(context.local(), 1, args).IsEmpty()); |
9866 CHECK(try_catch.HasCaught()); | 11114 CHECK(try_catch.HasCaught()); |
9867 String::Utf8Value exception_value2(try_catch.Exception()); | 11115 String::Utf8Value exception_value2(try_catch.Exception()); |
9868 CHECK_EQ(0, | 11116 CHECK_EQ(0, |
9869 strcmp("TypeError: object is not a function", *exception_value2)); | 11117 strcmp("TypeError: object is not a function", *exception_value2)); |
9870 try_catch.Reset(); | 11118 try_catch.Reset(); |
9871 } | 11119 } |
9872 | 11120 |
9873 // Check the case when constructor throws exception. | 11121 // Check the case when constructor throws exception. |
9874 { | 11122 { |
9875 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11123 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
9876 instance_template->SetCallAsFunctionHandler(ThrowValue); | 11124 instance_template->SetCallAsFunctionHandler(ThrowValue); |
9877 Local<Object> instance = instance_template->NewInstance(); | 11125 Local<Object> instance = |
9878 context->Global()->Set(v8_str("obj3"), instance); | 11126 instance_template->NewInstance(context.local()).ToLocalChecked(); |
11127 CHECK(context->Global() | |
11128 ->Set(context.local(), v8_str("obj3"), instance) | |
11129 .FromJust()); | |
9879 v8::TryCatch try_catch(isolate); | 11130 v8::TryCatch try_catch(isolate); |
9880 Local<Value> value; | 11131 Local<Value> value; |
9881 CHECK(!try_catch.HasCaught()); | 11132 CHECK(!try_catch.HasCaught()); |
9882 | 11133 |
9883 value = CompileRun("new obj3(22)"); | 11134 value = CompileRun("new obj3(22)"); |
9884 CHECK(try_catch.HasCaught()); | 11135 CHECK(try_catch.HasCaught()); |
9885 String::Utf8Value exception_value1(try_catch.Exception()); | 11136 String::Utf8Value exception_value1(try_catch.Exception()); |
9886 CHECK_EQ(0, strcmp("22", *exception_value1)); | 11137 CHECK_EQ(0, strcmp("22", *exception_value1)); |
9887 try_catch.Reset(); | 11138 try_catch.Reset(); |
9888 | 11139 |
9889 Local<Value> args[] = {v8_num(23)}; | 11140 Local<Value> args[] = {v8_num(23)}; |
9890 value = instance->CallAsConstructor(1, args); | 11141 CHECK(instance->CallAsConstructor(context.local(), 1, args).IsEmpty()); |
9891 CHECK(try_catch.HasCaught()); | 11142 CHECK(try_catch.HasCaught()); |
9892 String::Utf8Value exception_value2(try_catch.Exception()); | 11143 String::Utf8Value exception_value2(try_catch.Exception()); |
9893 CHECK_EQ(0, strcmp("23", *exception_value2)); | 11144 CHECK_EQ(0, strcmp("23", *exception_value2)); |
9894 try_catch.Reset(); | 11145 try_catch.Reset(); |
9895 } | 11146 } |
9896 | 11147 |
9897 // Check whether constructor returns with an object or non-object. | 11148 // Check whether constructor returns with an object or non-object. |
9898 { | 11149 { |
9899 Local<FunctionTemplate> function_template = | 11150 Local<FunctionTemplate> function_template = |
9900 FunctionTemplate::New(isolate, FakeConstructorCallback); | 11151 FunctionTemplate::New(isolate, FakeConstructorCallback); |
9901 Local<Function> function = function_template->GetFunction(); | 11152 Local<Function> function = |
11153 function_template->GetFunction(context.local()).ToLocalChecked(); | |
9902 Local<Object> instance1 = function; | 11154 Local<Object> instance1 = function; |
9903 context->Global()->Set(v8_str("obj4"), instance1); | 11155 CHECK(context->Global() |
11156 ->Set(context.local(), v8_str("obj4"), instance1) | |
11157 .FromJust()); | |
9904 v8::TryCatch try_catch(isolate); | 11158 v8::TryCatch try_catch(isolate); |
9905 Local<Value> value; | 11159 Local<Value> value; |
9906 CHECK(!try_catch.HasCaught()); | 11160 CHECK(!try_catch.HasCaught()); |
9907 | 11161 |
9908 CHECK(instance1->IsObject()); | 11162 CHECK(instance1->IsObject()); |
9909 CHECK(instance1->IsFunction()); | 11163 CHECK(instance1->IsFunction()); |
9910 | 11164 |
9911 value = CompileRun("new obj4(28)"); | 11165 value = CompileRun("new obj4(28)"); |
9912 CHECK(!try_catch.HasCaught()); | 11166 CHECK(!try_catch.HasCaught()); |
9913 CHECK(value->IsObject()); | 11167 CHECK(value->IsObject()); |
9914 | 11168 |
9915 Local<Value> args1[] = {v8_num(28)}; | 11169 Local<Value> args1[] = {v8_num(28)}; |
9916 value = instance1->CallAsConstructor(1, args1); | 11170 value = instance1->CallAsConstructor(context.local(), 1, args1) |
11171 .ToLocalChecked(); | |
9917 CHECK(!try_catch.HasCaught()); | 11172 CHECK(!try_catch.HasCaught()); |
9918 CHECK(value->IsObject()); | 11173 CHECK(value->IsObject()); |
9919 | 11174 |
9920 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11175 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
9921 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback); | 11176 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback); |
9922 Local<Object> instance2 = instance_template->NewInstance(); | 11177 Local<Object> instance2 = |
9923 context->Global()->Set(v8_str("obj5"), instance2); | 11178 instance_template->NewInstance(context.local()).ToLocalChecked(); |
11179 CHECK(context->Global() | |
11180 ->Set(context.local(), v8_str("obj5"), instance2) | |
11181 .FromJust()); | |
9924 CHECK(!try_catch.HasCaught()); | 11182 CHECK(!try_catch.HasCaught()); |
9925 | 11183 |
9926 CHECK(instance2->IsObject()); | 11184 CHECK(instance2->IsObject()); |
9927 CHECK(instance2->IsFunction()); | 11185 CHECK(instance2->IsFunction()); |
9928 | 11186 |
9929 value = CompileRun("new obj5(28)"); | 11187 value = CompileRun("new obj5(28)"); |
9930 CHECK(!try_catch.HasCaught()); | 11188 CHECK(!try_catch.HasCaught()); |
9931 CHECK(!value->IsObject()); | 11189 CHECK(!value->IsObject()); |
9932 | 11190 |
9933 Local<Value> args2[] = {v8_num(28)}; | 11191 Local<Value> args2[] = {v8_num(28)}; |
9934 value = instance2->CallAsConstructor(1, args2); | 11192 value = instance2->CallAsConstructor(context.local(), 1, args2) |
11193 .ToLocalChecked(); | |
9935 CHECK(!try_catch.HasCaught()); | 11194 CHECK(!try_catch.HasCaught()); |
9936 CHECK(!value->IsObject()); | 11195 CHECK(!value->IsObject()); |
9937 } | 11196 } |
9938 } | 11197 } |
9939 | 11198 |
9940 | 11199 |
9941 THREADED_TEST(FunctionDescriptorException) { | 11200 THREADED_TEST(FunctionDescriptorException) { |
9942 LocalContext context; | 11201 LocalContext context; |
9943 v8::Isolate* isolate = context->GetIsolate(); | 11202 v8::Isolate* isolate = context->GetIsolate(); |
9944 v8::HandleScope handle_scope(isolate); | 11203 v8::HandleScope handle_scope(isolate); |
9945 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 11204 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
9946 templ->SetClassName(v8_str("Fun")); | 11205 templ->SetClassName(v8_str("Fun")); |
9947 Local<Function> cons = templ->GetFunction(); | 11206 Local<Function> cons = templ->GetFunction(context.local()).ToLocalChecked(); |
9948 context->Global()->Set(v8_str("Fun"), cons); | 11207 CHECK( |
11208 context->Global()->Set(context.local(), v8_str("Fun"), cons).FromJust()); | |
9949 Local<Value> value = CompileRun( | 11209 Local<Value> value = CompileRun( |
9950 "function test() {" | 11210 "function test() {" |
9951 " try {" | 11211 " try {" |
9952 " (new Fun()).blah()" | 11212 " (new Fun()).blah()" |
9953 " } catch (e) {" | 11213 " } catch (e) {" |
9954 " var str = String(e);" | 11214 " var str = String(e);" |
9955 // " if (str.indexOf('TypeError') == -1) return 1;" | 11215 // " if (str.indexOf('TypeError') == -1) return 1;" |
9956 // " if (str.indexOf('[object Fun]') != -1) return 2;" | 11216 // " if (str.indexOf('[object Fun]') != -1) return 2;" |
9957 // " if (str.indexOf('#<Fun>') == -1) return 3;" | 11217 // " if (str.indexOf('#<Fun>') == -1) return 3;" |
9958 " return 0;" | 11218 " return 0;" |
9959 " }" | 11219 " }" |
9960 " return 4;" | 11220 " return 4;" |
9961 "}" | 11221 "}" |
9962 "test();"); | 11222 "test();"); |
9963 CHECK_EQ(0, value->Int32Value()); | 11223 CHECK_EQ(0, value->Int32Value(context.local()).FromJust()); |
9964 } | 11224 } |
9965 | 11225 |
9966 | 11226 |
9967 THREADED_TEST(EvalAliasedDynamic) { | 11227 THREADED_TEST(EvalAliasedDynamic) { |
9968 LocalContext current; | 11228 LocalContext current; |
9969 v8::HandleScope scope(current->GetIsolate()); | 11229 v8::HandleScope scope(current->GetIsolate()); |
9970 | 11230 |
9971 // Tests where aliased eval can only be resolved dynamically. | 11231 // Tests where aliased eval can only be resolved dynamically. |
9972 Local<Script> script = v8_compile( | 11232 Local<Script> script = v8_compile( |
9973 "function f(x) { " | 11233 "function f(x) { " |
9974 " var foo = 2;" | 11234 " var foo = 2;" |
9975 " with (x) { return eval('foo'); }" | 11235 " with (x) { return eval('foo'); }" |
9976 "}" | 11236 "}" |
9977 "foo = 0;" | 11237 "foo = 0;" |
9978 "result1 = f(new Object());" | 11238 "result1 = f(new Object());" |
9979 "result2 = f(this);" | 11239 "result2 = f(this);" |
9980 "var x = new Object();" | 11240 "var x = new Object();" |
9981 "x.eval = function(x) { return 1; };" | 11241 "x.eval = function(x) { return 1; };" |
9982 "result3 = f(x);"); | 11242 "result3 = f(x);"); |
9983 script->Run(); | 11243 script->Run(current.local()).ToLocalChecked(); |
9984 CHECK_EQ(2, current->Global()->Get(v8_str("result1"))->Int32Value()); | 11244 CHECK_EQ(2, current->Global() |
9985 CHECK_EQ(0, current->Global()->Get(v8_str("result2"))->Int32Value()); | 11245 ->Get(current.local(), v8_str("result1")) |
9986 CHECK_EQ(1, current->Global()->Get(v8_str("result3"))->Int32Value()); | 11246 .ToLocalChecked() |
11247 ->Int32Value(current.local()) | |
11248 .FromJust()); | |
11249 CHECK_EQ(0, current->Global() | |
11250 ->Get(current.local(), v8_str("result2")) | |
11251 .ToLocalChecked() | |
11252 ->Int32Value(current.local()) | |
11253 .FromJust()); | |
11254 CHECK_EQ(1, current->Global() | |
11255 ->Get(current.local(), v8_str("result3")) | |
11256 .ToLocalChecked() | |
11257 ->Int32Value(current.local()) | |
11258 .FromJust()); | |
9987 | 11259 |
9988 v8::TryCatch try_catch(current->GetIsolate()); | 11260 v8::TryCatch try_catch(current->GetIsolate()); |
9989 script = v8_compile( | 11261 script = v8_compile( |
9990 "function f(x) { " | 11262 "function f(x) { " |
9991 " var bar = 2;" | 11263 " var bar = 2;" |
9992 " with (x) { return eval('bar'); }" | 11264 " with (x) { return eval('bar'); }" |
9993 "}" | 11265 "}" |
9994 "result4 = f(this)"); | 11266 "result4 = f(this)"); |
9995 script->Run(); | 11267 script->Run(current.local()).ToLocalChecked(); |
9996 CHECK(!try_catch.HasCaught()); | 11268 CHECK(!try_catch.HasCaught()); |
9997 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value()); | 11269 CHECK_EQ(2, current->Global() |
11270 ->Get(current.local(), v8_str("result4")) | |
11271 .ToLocalChecked() | |
11272 ->Int32Value(current.local()) | |
11273 .FromJust()); | |
9998 | 11274 |
9999 try_catch.Reset(); | 11275 try_catch.Reset(); |
10000 } | 11276 } |
10001 | 11277 |
10002 | 11278 |
10003 THREADED_TEST(CrossEval) { | 11279 THREADED_TEST(CrossEval) { |
10004 v8::HandleScope scope(CcTest::isolate()); | 11280 v8::HandleScope scope(CcTest::isolate()); |
10005 LocalContext other; | 11281 LocalContext other; |
10006 LocalContext current; | 11282 LocalContext current; |
10007 | 11283 |
10008 Local<String> token = v8_str("<security token>"); | 11284 Local<String> token = v8_str("<security token>"); |
10009 other->SetSecurityToken(token); | 11285 other->SetSecurityToken(token); |
10010 current->SetSecurityToken(token); | 11286 current->SetSecurityToken(token); |
10011 | 11287 |
10012 // Set up reference from current to other. | 11288 // Set up reference from current to other. |
10013 current->Global()->Set(v8_str("other"), other->Global()); | 11289 CHECK(current->Global() |
11290 ->Set(current.local(), v8_str("other"), other->Global()) | |
11291 .FromJust()); | |
10014 | 11292 |
10015 // Check that new variables are introduced in other context. | 11293 // Check that new variables are introduced in other context. |
10016 Local<Script> script = v8_compile("other.eval('var foo = 1234')"); | 11294 Local<Script> script = v8_compile("other.eval('var foo = 1234')"); |
10017 script->Run(); | 11295 script->Run(current.local()).ToLocalChecked(); |
10018 Local<Value> foo = other->Global()->Get(v8_str("foo")); | 11296 Local<Value> foo = other->Global()->Get(v8_str("foo")); |
10019 CHECK_EQ(1234, foo->Int32Value()); | 11297 CHECK_EQ(1234, foo->Int32Value(other.local()).FromJust()); |
10020 CHECK(!current->Global()->Has(v8_str("foo"))); | 11298 CHECK(!current->Global()->Has(v8_str("foo"))); |
10021 | 11299 |
10022 // Check that writing to non-existing properties introduces them in | 11300 // Check that writing to non-existing properties introduces them in |
10023 // the other context. | 11301 // the other context. |
10024 script = v8_compile("other.eval('na = 1234')"); | 11302 script = v8_compile("other.eval('na = 1234')"); |
10025 script->Run(); | 11303 script->Run(); |
10026 CHECK_EQ(1234, other->Global()->Get(v8_str("na"))->Int32Value()); | 11304 CHECK_EQ( |
11305 1234, | |
11306 other->Global()->Get(v8_str("na"))->Int32Value(other.local()).FromJust()); | |
10027 CHECK(!current->Global()->Has(v8_str("na"))); | 11307 CHECK(!current->Global()->Has(v8_str("na"))); |
10028 | 11308 |
10029 // Check that global variables in current context are not visible in other | 11309 // Check that global variables in current context are not visible in other |
10030 // context. | 11310 // context. |
10031 v8::TryCatch try_catch(CcTest::isolate()); | 11311 v8::TryCatch try_catch(CcTest::isolate()); |
10032 script = v8_compile("var bar = 42; other.eval('bar');"); | 11312 script = v8_compile("var bar = 42; other.eval('bar');"); |
10033 Local<Value> result = script->Run(); | 11313 Local<Value> result = script->Run(); |
10034 CHECK(try_catch.HasCaught()); | 11314 CHECK(try_catch.HasCaught()); |
10035 try_catch.Reset(); | 11315 try_catch.Reset(); |
10036 | 11316 |
10037 // Check that local variables in current context are not visible in other | 11317 // Check that local variables in current context are not visible in other |
10038 // context. | 11318 // context. |
10039 script = v8_compile( | 11319 script = v8_compile( |
10040 "(function() { " | 11320 "(function() { " |
10041 " var baz = 87;" | 11321 " var baz = 87;" |
10042 " return other.eval('baz');" | 11322 " return other.eval('baz');" |
10043 "})();"); | 11323 "})();"); |
10044 result = script->Run(); | 11324 result = script->Run(); |
10045 CHECK(try_catch.HasCaught()); | 11325 CHECK(try_catch.HasCaught()); |
10046 try_catch.Reset(); | 11326 try_catch.Reset(); |
10047 | 11327 |
10048 // Check that global variables in the other environment are visible | 11328 // Check that global variables in the other environment are visible |
10049 // when evaluting code. | 11329 // when evaluting code. |
10050 other->Global()->Set(v8_str("bis"), v8_num(1234)); | 11330 CHECK(other->Global() |
11331 ->Set(other.local(), v8_str("bis"), v8_num(1234)) | |
11332 .FromJust()); | |
10051 script = v8_compile("other.eval('bis')"); | 11333 script = v8_compile("other.eval('bis')"); |
10052 CHECK_EQ(1234, script->Run()->Int32Value()); | 11334 CHECK_EQ(1234, script->Run()->Int32Value(other.local()).FromJust()); |
10053 CHECK(!try_catch.HasCaught()); | 11335 CHECK(!try_catch.HasCaught()); |
10054 | 11336 |
10055 // Check that the 'this' pointer points to the global object evaluating | 11337 // Check that the 'this' pointer points to the global object evaluating |
10056 // code. | 11338 // code. |
10057 other->Global()->Set(v8_str("t"), other->Global()); | 11339 CHECK(other->Global() |
11340 ->Set(other.local(), v8_str("t"), other->Global()) | |
11341 .FromJust()); | |
10058 script = v8_compile("other.eval('this == t')"); | 11342 script = v8_compile("other.eval('this == t')"); |
10059 result = script->Run(); | 11343 result = script->Run(); |
10060 CHECK(result->IsTrue()); | 11344 CHECK(result->IsTrue()); |
10061 CHECK(!try_catch.HasCaught()); | 11345 CHECK(!try_catch.HasCaught()); |
10062 | 11346 |
10063 // Check that variables introduced in with-statement are not visible in | 11347 // Check that variables introduced in with-statement are not visible in |
10064 // other context. | 11348 // other context. |
10065 script = v8_compile("with({x:2}){other.eval('x')}"); | 11349 script = v8_compile("with({x:2}){other.eval('x')}"); |
10066 result = script->Run(); | 11350 result = script->Run(); |
10067 CHECK(try_catch.HasCaught()); | 11351 CHECK(try_catch.HasCaught()); |
(...skipping 11 matching lines...) Expand all Loading... | |
10079 // its global proxy works. | 11363 // its global proxy works. |
10080 THREADED_TEST(EvalInDetachedGlobal) { | 11364 THREADED_TEST(EvalInDetachedGlobal) { |
10081 v8::Isolate* isolate = CcTest::isolate(); | 11365 v8::Isolate* isolate = CcTest::isolate(); |
10082 v8::HandleScope scope(isolate); | 11366 v8::HandleScope scope(isolate); |
10083 | 11367 |
10084 v8::Local<Context> context0 = Context::New(isolate); | 11368 v8::Local<Context> context0 = Context::New(isolate); |
10085 v8::Local<Context> context1 = Context::New(isolate); | 11369 v8::Local<Context> context1 = Context::New(isolate); |
10086 | 11370 |
10087 // Set up function in context0 that uses eval from context0. | 11371 // Set up function in context0 that uses eval from context0. |
10088 context0->Enter(); | 11372 context0->Enter(); |
10089 v8::Handle<v8::Value> fun = CompileRun( | 11373 v8::Local<v8::Value> fun = CompileRun( |
10090 "var x = 42;" | 11374 "var x = 42;" |
10091 "(function() {" | 11375 "(function() {" |
10092 " var e = eval;" | 11376 " var e = eval;" |
10093 " return function(s) { return e(s); }" | 11377 " return function(s) { return e(s); }" |
10094 "})()"); | 11378 "})()"); |
10095 context0->Exit(); | 11379 context0->Exit(); |
10096 | 11380 |
10097 // Put the function into context1 and call it before and after | 11381 // Put the function into context1 and call it before and after |
10098 // detaching the global. Before detaching, the call succeeds and | 11382 // detaching the global. Before detaching, the call succeeds and |
10099 // after detaching and exception is thrown. | 11383 // after detaching and exception is thrown. |
10100 context1->Enter(); | 11384 context1->Enter(); |
10101 context1->Global()->Set(v8_str("fun"), fun); | 11385 CHECK(context1->Global()->Set(context1, v8_str("fun"), fun).FromJust()); |
10102 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); | 11386 v8::Local<v8::Value> x_value = CompileRun("fun('x')"); |
10103 CHECK_EQ(42, x_value->Int32Value()); | 11387 CHECK_EQ(42, x_value->Int32Value(context1).FromJust()); |
10104 context0->DetachGlobal(); | 11388 context0->DetachGlobal(); |
10105 v8::TryCatch catcher(isolate); | 11389 v8::TryCatch catcher(isolate); |
10106 x_value = CompileRun("fun('x')"); | 11390 x_value = CompileRun("fun('x')"); |
10107 CHECK_EQ(42, x_value->Int32Value()); | 11391 CHECK_EQ(42, x_value->Int32Value(context1).FromJust()); |
10108 context1->Exit(); | 11392 context1->Exit(); |
10109 } | 11393 } |
10110 | 11394 |
10111 | 11395 |
10112 THREADED_TEST(CrossLazyLoad) { | 11396 THREADED_TEST(CrossLazyLoad) { |
10113 v8::HandleScope scope(CcTest::isolate()); | 11397 v8::HandleScope scope(CcTest::isolate()); |
10114 LocalContext other; | 11398 LocalContext other; |
10115 LocalContext current; | 11399 LocalContext current; |
10116 | 11400 |
10117 Local<String> token = v8_str("<security token>"); | 11401 Local<String> token = v8_str("<security token>"); |
10118 other->SetSecurityToken(token); | 11402 other->SetSecurityToken(token); |
10119 current->SetSecurityToken(token); | 11403 current->SetSecurityToken(token); |
10120 | 11404 |
10121 // Set up reference from current to other. | 11405 // Set up reference from current to other. |
10122 current->Global()->Set(v8_str("other"), other->Global()); | 11406 CHECK(current->Global() |
11407 ->Set(current.local(), v8_str("other"), other->Global()) | |
11408 .FromJust()); | |
10123 | 11409 |
10124 // Trigger lazy loading in other context. | 11410 // Trigger lazy loading in other context. |
10125 Local<Script> script = v8_compile("other.eval('new Date(42)')"); | 11411 Local<Script> script = v8_compile("other.eval('new Date(42)')"); |
10126 Local<Value> value = script->Run(); | 11412 Local<Value> value = script->Run(); |
10127 CHECK_EQ(42.0, value->NumberValue()); | 11413 CHECK_EQ(42.0, value->NumberValue()); |
10128 } | 11414 } |
10129 | 11415 |
10130 | 11416 |
10131 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { | 11417 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { |
10132 ApiTestFuzzer::Fuzz(); | 11418 ApiTestFuzzer::Fuzz(); |
10133 if (args.IsConstructCall()) { | 11419 if (args.IsConstructCall()) { |
10134 if (args[0]->IsInt32()) { | 11420 if (args[0]->IsInt32()) { |
10135 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); | 11421 args.GetReturnValue().Set( |
11422 v8_num(-args[0] | |
11423 ->Int32Value(args.GetIsolate()->GetCurrentContext()) | |
11424 .FromJust())); | |
10136 return; | 11425 return; |
10137 } | 11426 } |
10138 } | 11427 } |
10139 | 11428 |
10140 args.GetReturnValue().Set(args[0]); | 11429 args.GetReturnValue().Set(args[0]); |
10141 } | 11430 } |
10142 | 11431 |
10143 | 11432 |
10144 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 11433 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { |
10145 args.GetReturnValue().Set(args.This()); | 11434 args.GetReturnValue().Set(args.This()); |
10146 } | 11435 } |
10147 | 11436 |
10148 | 11437 |
10149 // Test that a call handler can be set for objects which will allow | 11438 // Test that a call handler can be set for objects which will allow |
10150 // non-function objects created through the API to be called as | 11439 // non-function objects created through the API to be called as |
10151 // functions. | 11440 // functions. |
10152 THREADED_TEST(CallAsFunction) { | 11441 THREADED_TEST(CallAsFunction) { |
10153 LocalContext context; | 11442 LocalContext context; |
10154 v8::Isolate* isolate = context->GetIsolate(); | 11443 v8::Isolate* isolate = context->GetIsolate(); |
10155 v8::HandleScope scope(isolate); | 11444 v8::HandleScope scope(isolate); |
10156 | 11445 |
10157 { | 11446 { |
10158 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 11447 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10159 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 11448 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10160 instance_template->SetCallAsFunctionHandler(call_as_function); | 11449 instance_template->SetCallAsFunctionHandler(call_as_function); |
10161 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 11450 Local<v8::Object> instance = t->GetFunction(context.local()) |
10162 context->Global()->Set(v8_str("obj"), instance); | 11451 .ToLocalChecked() |
11452 ->NewInstance(context.local()) | |
11453 .ToLocalChecked(); | |
11454 CHECK(context->Global() | |
11455 ->Set(context.local(), v8_str("obj"), instance) | |
11456 .FromJust()); | |
10163 v8::TryCatch try_catch(isolate); | 11457 v8::TryCatch try_catch(isolate); |
10164 Local<Value> value; | 11458 Local<Value> value; |
10165 CHECK(!try_catch.HasCaught()); | 11459 CHECK(!try_catch.HasCaught()); |
10166 | 11460 |
10167 value = CompileRun("obj(42)"); | 11461 value = CompileRun("obj(42)"); |
10168 CHECK(!try_catch.HasCaught()); | 11462 CHECK(!try_catch.HasCaught()); |
10169 CHECK_EQ(42, value->Int32Value()); | 11463 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
10170 | 11464 |
10171 value = CompileRun("(function(o){return o(49)})(obj)"); | 11465 value = CompileRun("(function(o){return o(49)})(obj)"); |
10172 CHECK(!try_catch.HasCaught()); | 11466 CHECK(!try_catch.HasCaught()); |
10173 CHECK_EQ(49, value->Int32Value()); | 11467 CHECK_EQ(49, value->Int32Value(context.local()).FromJust()); |
10174 | 11468 |
10175 // test special case of call as function | 11469 // test special case of call as function |
10176 value = CompileRun("[obj]['0'](45)"); | 11470 value = CompileRun("[obj]['0'](45)"); |
10177 CHECK(!try_catch.HasCaught()); | 11471 CHECK(!try_catch.HasCaught()); |
10178 CHECK_EQ(45, value->Int32Value()); | 11472 CHECK_EQ(45, value->Int32Value(context.local()).FromJust()); |
10179 | 11473 |
10180 value = CompileRun( | 11474 value = CompileRun( |
10181 "obj.call = Function.prototype.call;" | 11475 "obj.call = Function.prototype.call;" |
10182 "obj.call(null, 87)"); | 11476 "obj.call(null, 87)"); |
10183 CHECK(!try_catch.HasCaught()); | 11477 CHECK(!try_catch.HasCaught()); |
10184 CHECK_EQ(87, value->Int32Value()); | 11478 CHECK_EQ(87, value->Int32Value(context.local()).FromJust()); |
10185 | 11479 |
10186 // Regression tests for bug #1116356: Calling call through call/apply | 11480 // Regression tests for bug #1116356: Calling call through call/apply |
10187 // must work for non-function receivers. | 11481 // must work for non-function receivers. |
10188 const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])"; | 11482 const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])"; |
10189 value = CompileRun(apply_99); | 11483 value = CompileRun(apply_99); |
10190 CHECK(!try_catch.HasCaught()); | 11484 CHECK(!try_catch.HasCaught()); |
10191 CHECK_EQ(99, value->Int32Value()); | 11485 CHECK_EQ(99, value->Int32Value(context.local()).FromJust()); |
10192 | 11486 |
10193 const char* call_17 = "Function.prototype.call.call(obj, this, 17)"; | 11487 const char* call_17 = "Function.prototype.call.call(obj, this, 17)"; |
10194 value = CompileRun(call_17); | 11488 value = CompileRun(call_17); |
10195 CHECK(!try_catch.HasCaught()); | 11489 CHECK(!try_catch.HasCaught()); |
10196 CHECK_EQ(17, value->Int32Value()); | 11490 CHECK_EQ(17, value->Int32Value(context.local()).FromJust()); |
10197 | 11491 |
10198 // Check that the call-as-function handler can be called through | 11492 // Check that the call-as-function handler can be called through |
10199 // new. | 11493 // new. |
10200 value = CompileRun("new obj(43)"); | 11494 value = CompileRun("new obj(43)"); |
10201 CHECK(!try_catch.HasCaught()); | 11495 CHECK(!try_catch.HasCaught()); |
10202 CHECK_EQ(-43, value->Int32Value()); | 11496 CHECK_EQ(-43, value->Int32Value(context.local()).FromJust()); |
10203 | 11497 |
10204 // Check that the call-as-function handler can be called through | 11498 // Check that the call-as-function handler can be called through |
10205 // the API. | 11499 // the API. |
10206 v8::Handle<Value> args[] = {v8_num(28)}; | 11500 v8::Local<Value> args[] = {v8_num(28)}; |
10207 value = instance->CallAsFunction(instance, 1, args); | 11501 value = instance->CallAsFunction(instance, 1, args); |
10208 CHECK(!try_catch.HasCaught()); | 11502 CHECK(!try_catch.HasCaught()); |
10209 CHECK_EQ(28, value->Int32Value()); | 11503 CHECK_EQ(28, value->Int32Value(context.local()).FromJust()); |
10210 } | 11504 } |
10211 | 11505 |
10212 { | 11506 { |
10213 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 11507 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10214 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); | 11508 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); |
10215 USE(instance_template); | 11509 USE(instance_template); |
10216 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 11510 Local<v8::Object> instance = t->GetFunction(context.local()) |
10217 context->Global()->Set(v8_str("obj2"), instance); | 11511 .ToLocalChecked() |
11512 ->NewInstance(context.local()) | |
11513 .ToLocalChecked(); | |
11514 CHECK(context->Global() | |
11515 ->Set(context.local(), v8_str("obj2"), instance) | |
11516 .FromJust()); | |
10218 v8::TryCatch try_catch(isolate); | 11517 v8::TryCatch try_catch(isolate); |
10219 Local<Value> value; | 11518 Local<Value> value; |
10220 CHECK(!try_catch.HasCaught()); | 11519 CHECK(!try_catch.HasCaught()); |
10221 | 11520 |
10222 // Call an object without call-as-function handler through the JS | 11521 // Call an object without call-as-function handler through the JS |
10223 value = CompileRun("obj2(28)"); | 11522 value = CompileRun("obj2(28)"); |
10224 CHECK(value.IsEmpty()); | 11523 CHECK(value.IsEmpty()); |
10225 CHECK(try_catch.HasCaught()); | 11524 CHECK(try_catch.HasCaught()); |
10226 String::Utf8Value exception_value1(try_catch.Exception()); | 11525 String::Utf8Value exception_value1(try_catch.Exception()); |
10227 // TODO(verwaest): Better message | 11526 // TODO(verwaest): Better message |
10228 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); | 11527 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); |
10229 try_catch.Reset(); | 11528 try_catch.Reset(); |
10230 | 11529 |
10231 // Call an object without call-as-function handler through the API | 11530 // Call an object without call-as-function handler through the API |
10232 value = CompileRun("obj2(28)"); | 11531 value = CompileRun("obj2(28)"); |
10233 v8::Handle<Value> args[] = {v8_num(28)}; | 11532 v8::Local<Value> args[] = {v8_num(28)}; |
10234 value = instance->CallAsFunction(instance, 1, args); | 11533 value = instance->CallAsFunction(instance, 1, args); |
10235 CHECK(value.IsEmpty()); | 11534 CHECK(value.IsEmpty()); |
10236 CHECK(try_catch.HasCaught()); | 11535 CHECK(try_catch.HasCaught()); |
10237 String::Utf8Value exception_value2(try_catch.Exception()); | 11536 String::Utf8Value exception_value2(try_catch.Exception()); |
10238 CHECK_EQ(0, | 11537 CHECK_EQ(0, |
10239 strcmp("TypeError: object is not a function", *exception_value2)); | 11538 strcmp("TypeError: object is not a function", *exception_value2)); |
10240 try_catch.Reset(); | 11539 try_catch.Reset(); |
10241 } | 11540 } |
10242 | 11541 |
10243 { | 11542 { |
10244 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 11543 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10245 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 11544 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10246 instance_template->SetCallAsFunctionHandler(ThrowValue); | 11545 instance_template->SetCallAsFunctionHandler(ThrowValue); |
10247 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 11546 Local<v8::Object> instance = t->GetFunction(context.local()) |
10248 context->Global()->Set(v8_str("obj3"), instance); | 11547 .ToLocalChecked() |
11548 ->NewInstance(context.local()) | |
11549 .ToLocalChecked(); | |
11550 CHECK(context->Global() | |
11551 ->Set(context.local(), v8_str("obj3"), instance) | |
11552 .FromJust()); | |
10249 v8::TryCatch try_catch(isolate); | 11553 v8::TryCatch try_catch(isolate); |
10250 Local<Value> value; | 11554 Local<Value> value; |
10251 CHECK(!try_catch.HasCaught()); | 11555 CHECK(!try_catch.HasCaught()); |
10252 | 11556 |
10253 // Catch the exception which is thrown by call-as-function handler | 11557 // Catch the exception which is thrown by call-as-function handler |
10254 value = CompileRun("obj3(22)"); | 11558 value = CompileRun("obj3(22)"); |
10255 CHECK(try_catch.HasCaught()); | 11559 CHECK(try_catch.HasCaught()); |
10256 String::Utf8Value exception_value1(try_catch.Exception()); | 11560 String::Utf8Value exception_value1(try_catch.Exception()); |
10257 CHECK_EQ(0, strcmp("22", *exception_value1)); | 11561 CHECK_EQ(0, strcmp("22", *exception_value1)); |
10258 try_catch.Reset(); | 11562 try_catch.Reset(); |
10259 | 11563 |
10260 v8::Handle<Value> args[] = {v8_num(23)}; | 11564 v8::Local<Value> args[] = {v8_num(23)}; |
10261 value = instance->CallAsFunction(instance, 1, args); | 11565 value = instance->CallAsFunction(instance, 1, args); |
10262 CHECK(try_catch.HasCaught()); | 11566 CHECK(try_catch.HasCaught()); |
10263 String::Utf8Value exception_value2(try_catch.Exception()); | 11567 String::Utf8Value exception_value2(try_catch.Exception()); |
10264 CHECK_EQ(0, strcmp("23", *exception_value2)); | 11568 CHECK_EQ(0, strcmp("23", *exception_value2)); |
10265 try_catch.Reset(); | 11569 try_catch.Reset(); |
10266 } | 11570 } |
10267 | 11571 |
10268 { | 11572 { |
10269 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); | 11573 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10270 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 11574 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10271 instance_template->SetCallAsFunctionHandler(ReturnThis); | 11575 instance_template->SetCallAsFunctionHandler(ReturnThis); |
10272 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 11576 Local<v8::Object> instance = t->GetFunction(context.local()) |
11577 .ToLocalChecked() | |
11578 ->NewInstance(context.local()) | |
11579 .ToLocalChecked(); | |
10273 | 11580 |
10274 Local<v8::Value> a1 = | 11581 Local<v8::Value> a1 = |
10275 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL); | 11582 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL); |
10276 CHECK(a1->StrictEquals(instance)); | 11583 CHECK(a1->StrictEquals(instance)); |
10277 Local<v8::Value> a2 = instance->CallAsFunction(v8::Null(isolate), 0, NULL); | 11584 Local<v8::Value> a2 = instance->CallAsFunction(v8::Null(isolate), 0, NULL); |
10278 CHECK(a2->StrictEquals(instance)); | 11585 CHECK(a2->StrictEquals(instance)); |
10279 Local<v8::Value> a3 = instance->CallAsFunction(v8_num(42), 0, NULL); | 11586 Local<v8::Value> a3 = instance->CallAsFunction(v8_num(42), 0, NULL); |
10280 CHECK(a3->StrictEquals(instance)); | 11587 CHECK(a3->StrictEquals(instance)); |
10281 Local<v8::Value> a4 = instance->CallAsFunction(v8_str("hello"), 0, NULL); | 11588 Local<v8::Value> a4 = instance->CallAsFunction(v8_str("hello"), 0, NULL); |
10282 CHECK(a4->StrictEquals(instance)); | 11589 CHECK(a4->StrictEquals(instance)); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10336 | 11643 |
10337 // Check whether a non-function object is callable. | 11644 // Check whether a non-function object is callable. |
10338 THREADED_TEST(CallableObject) { | 11645 THREADED_TEST(CallableObject) { |
10339 LocalContext context; | 11646 LocalContext context; |
10340 v8::Isolate* isolate = context->GetIsolate(); | 11647 v8::Isolate* isolate = context->GetIsolate(); |
10341 v8::HandleScope scope(isolate); | 11648 v8::HandleScope scope(isolate); |
10342 | 11649 |
10343 { | 11650 { |
10344 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11651 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
10345 instance_template->SetCallAsFunctionHandler(call_as_function); | 11652 instance_template->SetCallAsFunctionHandler(call_as_function); |
10346 Local<Object> instance = instance_template->NewInstance(); | 11653 Local<Object> instance = |
11654 instance_template->NewInstance(context.local()).ToLocalChecked(); | |
10347 v8::TryCatch try_catch(isolate); | 11655 v8::TryCatch try_catch(isolate); |
10348 | 11656 |
10349 CHECK(instance->IsCallable()); | 11657 CHECK(instance->IsCallable()); |
10350 CHECK(!try_catch.HasCaught()); | 11658 CHECK(!try_catch.HasCaught()); |
10351 } | 11659 } |
10352 | 11660 |
10353 { | 11661 { |
10354 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); | 11662 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); |
10355 Local<Object> instance = instance_template->NewInstance(); | 11663 Local<Object> instance = |
11664 instance_template->NewInstance(context.local()).ToLocalChecked(); | |
10356 v8::TryCatch try_catch(isolate); | 11665 v8::TryCatch try_catch(isolate); |
10357 | 11666 |
10358 CHECK(!instance->IsCallable()); | 11667 CHECK(!instance->IsCallable()); |
10359 CHECK(!try_catch.HasCaught()); | 11668 CHECK(!try_catch.HasCaught()); |
10360 } | 11669 } |
10361 | 11670 |
10362 { | 11671 { |
10363 Local<FunctionTemplate> function_template = | 11672 Local<FunctionTemplate> function_template = |
10364 FunctionTemplate::New(isolate, call_as_function); | 11673 FunctionTemplate::New(isolate, call_as_function); |
10365 Local<Function> function = function_template->GetFunction(); | 11674 Local<Function> function = |
11675 function_template->GetFunction(context.local()).ToLocalChecked(); | |
10366 Local<Object> instance = function; | 11676 Local<Object> instance = function; |
10367 v8::TryCatch try_catch(isolate); | 11677 v8::TryCatch try_catch(isolate); |
10368 | 11678 |
10369 CHECK(instance->IsCallable()); | 11679 CHECK(instance->IsCallable()); |
10370 CHECK(!try_catch.HasCaught()); | 11680 CHECK(!try_catch.HasCaught()); |
10371 } | 11681 } |
10372 | 11682 |
10373 { | 11683 { |
10374 Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate); | 11684 Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate); |
10375 Local<Function> function = function_template->GetFunction(); | 11685 Local<Function> function = |
11686 function_template->GetFunction(context.local()).ToLocalChecked(); | |
10376 Local<Object> instance = function; | 11687 Local<Object> instance = function; |
10377 v8::TryCatch try_catch(isolate); | 11688 v8::TryCatch try_catch(isolate); |
10378 | 11689 |
10379 CHECK(instance->IsCallable()); | 11690 CHECK(instance->IsCallable()); |
10380 CHECK(!try_catch.HasCaught()); | 11691 CHECK(!try_catch.HasCaught()); |
10381 } | 11692 } |
10382 } | 11693 } |
10383 | 11694 |
10384 | 11695 |
10385 static int Recurse(v8::Isolate* isolate, int depth, int iterations) { | 11696 static int Recurse(v8::Isolate* isolate, int depth, int iterations) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10436 } | 11747 } |
10437 | 11748 |
10438 static void FastApiCallback_TrivialSignature( | 11749 static void FastApiCallback_TrivialSignature( |
10439 const v8::FunctionCallbackInfo<v8::Value>& args) { | 11750 const v8::FunctionCallbackInfo<v8::Value>& args) { |
10440 ApiTestFuzzer::Fuzz(); | 11751 ApiTestFuzzer::Fuzz(); |
10441 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature)); | 11752 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature)); |
10442 v8::Isolate* isolate = CcTest::isolate(); | 11753 v8::Isolate* isolate = CcTest::isolate(); |
10443 CHECK_EQ(isolate, args.GetIsolate()); | 11754 CHECK_EQ(isolate, args.GetIsolate()); |
10444 CHECK(args.This()->Equals(args.Holder())); | 11755 CHECK(args.This()->Equals(args.Holder())); |
10445 CHECK(args.Data()->Equals(v8_str("method_data"))); | 11756 CHECK(args.Data()->Equals(v8_str("method_data"))); |
10446 args.GetReturnValue().Set(args[0]->Int32Value() + 1); | 11757 args.GetReturnValue().Set( |
11758 args[0]->Int32Value(isolate->GetCurrentContext()).FromJust() + 1); | |
10447 } | 11759 } |
10448 | 11760 |
10449 static void FastApiCallback_SimpleSignature( | 11761 static void FastApiCallback_SimpleSignature( |
10450 const v8::FunctionCallbackInfo<v8::Value>& args) { | 11762 const v8::FunctionCallbackInfo<v8::Value>& args) { |
10451 ApiTestFuzzer::Fuzz(); | 11763 ApiTestFuzzer::Fuzz(); |
10452 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature)); | 11764 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature)); |
10453 v8::Isolate* isolate = CcTest::isolate(); | 11765 v8::Isolate* isolate = CcTest::isolate(); |
10454 CHECK_EQ(isolate, args.GetIsolate()); | 11766 CHECK_EQ(isolate, args.GetIsolate()); |
10455 CHECK(args.This()->GetPrototype()->Equals(args.Holder())); | 11767 CHECK(args.This()->GetPrototype()->Equals(args.Holder())); |
10456 CHECK(args.Data()->Equals(v8_str("method_data"))); | 11768 CHECK(args.Data()->Equals(v8_str("method_data"))); |
10457 // Note, we're using HasRealNamedProperty instead of Has to avoid | 11769 // Note, we're using HasRealNamedProperty instead of Has to avoid |
10458 // invoking the interceptor again. | 11770 // invoking the interceptor again. |
10459 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo"))); | 11771 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo"))); |
10460 args.GetReturnValue().Set(args[0]->Int32Value() + 1); | 11772 args.GetReturnValue().Set( |
11773 args[0]->Int32Value(isolate->GetCurrentContext()).FromJust() + 1); | |
10461 } | 11774 } |
10462 | 11775 |
10463 | 11776 |
10464 // Helper to maximize the odds of object moving. | 11777 // Helper to maximize the odds of object moving. |
10465 static void GenerateSomeGarbage() { | 11778 static void GenerateSomeGarbage() { |
10466 CompileRun( | 11779 CompileRun( |
10467 "var garbage;" | 11780 "var garbage;" |
10468 "for (var i = 0; i < 1000; i++) {" | 11781 "for (var i = 0; i < 1000; i++) {" |
10469 " garbage = [1/i, \"garbage\" + i, garbage, {foo: garbage}];" | 11782 " garbage = [1/i, \"garbage\" + i, garbage, {foo: garbage}];" |
10470 "}" | 11783 "}" |
10471 "garbage = undefined;"); | 11784 "garbage = undefined;"); |
10472 } | 11785 } |
10473 | 11786 |
10474 | 11787 |
10475 void DirectApiCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 11788 void DirectApiCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
10476 static int count = 0; | 11789 static int count = 0; |
10477 if (count++ % 3 == 0) { | 11790 if (count++ % 3 == 0) { |
10478 CcTest::heap()->CollectAllGarbage(); | 11791 CcTest::heap()->CollectAllGarbage(); |
10479 // This should move the stub | 11792 // This should move the stub |
10480 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed | 11793 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed |
10481 } | 11794 } |
10482 } | 11795 } |
10483 | 11796 |
10484 | 11797 |
10485 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { | 11798 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { |
10486 LocalContext context; | 11799 LocalContext context; |
10487 v8::Isolate* isolate = context->GetIsolate(); | 11800 v8::Isolate* isolate = context->GetIsolate(); |
10488 v8::HandleScope scope(isolate); | 11801 v8::HandleScope scope(isolate); |
10489 v8::Handle<v8::ObjectTemplate> nativeobject_templ = | 11802 v8::Local<v8::ObjectTemplate> nativeobject_templ = |
10490 v8::ObjectTemplate::New(isolate); | 11803 v8::ObjectTemplate::New(isolate); |
10491 nativeobject_templ->Set(isolate, "callback", | 11804 nativeobject_templ->Set(isolate, "callback", |
10492 v8::FunctionTemplate::New(isolate, | 11805 v8::FunctionTemplate::New(isolate, |
10493 DirectApiCallback)); | 11806 DirectApiCallback)); |
10494 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); | 11807 v8::Local<v8::Object> nativeobject_obj = |
10495 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); | 11808 nativeobject_templ->NewInstance(context.local()).ToLocalChecked(); |
11809 CHECK(context->Global() | |
11810 ->Set(context.local(), v8_str("nativeobject"), nativeobject_obj) | |
11811 .FromJust()); | |
10496 // call the api function multiple times to ensure direct call stub creation. | 11812 // call the api function multiple times to ensure direct call stub creation. |
10497 CompileRun( | 11813 CompileRun( |
10498 "function f() {" | 11814 "function f() {" |
10499 " for (var i = 1; i <= 30; i++) {" | 11815 " for (var i = 1; i <= 30; i++) {" |
10500 " nativeobject.callback();" | 11816 " nativeobject.callback();" |
10501 " }" | 11817 " }" |
10502 "}" | 11818 "}" |
10503 "f();"); | 11819 "f();"); |
10504 } | 11820 } |
10505 | 11821 |
10506 | 11822 |
10507 void ThrowingDirectApiCallback( | 11823 void ThrowingDirectApiCallback( |
10508 const v8::FunctionCallbackInfo<v8::Value>& args) { | 11824 const v8::FunctionCallbackInfo<v8::Value>& args) { |
10509 args.GetIsolate()->ThrowException(v8_str("g")); | 11825 args.GetIsolate()->ThrowException(v8_str("g")); |
10510 } | 11826 } |
10511 | 11827 |
10512 | 11828 |
10513 THREADED_TEST(CallICFastApi_DirectCall_Throw) { | 11829 THREADED_TEST(CallICFastApi_DirectCall_Throw) { |
10514 LocalContext context; | 11830 LocalContext context; |
10515 v8::Isolate* isolate = context->GetIsolate(); | 11831 v8::Isolate* isolate = context->GetIsolate(); |
10516 v8::HandleScope scope(isolate); | 11832 v8::HandleScope scope(isolate); |
10517 v8::Handle<v8::ObjectTemplate> nativeobject_templ = | 11833 v8::Local<v8::ObjectTemplate> nativeobject_templ = |
10518 v8::ObjectTemplate::New(isolate); | 11834 v8::ObjectTemplate::New(isolate); |
10519 nativeobject_templ->Set(isolate, "callback", | 11835 nativeobject_templ->Set(isolate, "callback", |
10520 v8::FunctionTemplate::New(isolate, | 11836 v8::FunctionTemplate::New(isolate, |
10521 ThrowingDirectApiCallback)); | 11837 ThrowingDirectApiCallback)); |
10522 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); | 11838 v8::Local<v8::Object> nativeobject_obj = |
10523 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); | 11839 nativeobject_templ->NewInstance(context.local()).ToLocalChecked(); |
11840 CHECK(context->Global() | |
11841 ->Set(context.local(), v8_str("nativeobject"), nativeobject_obj) | |
11842 .FromJust()); | |
10524 // call the api function multiple times to ensure direct call stub creation. | 11843 // call the api function multiple times to ensure direct call stub creation. |
10525 v8::Handle<Value> result = CompileRun( | 11844 v8::Local<Value> result = CompileRun( |
10526 "var result = '';" | 11845 "var result = '';" |
10527 "function f() {" | 11846 "function f() {" |
10528 " for (var i = 1; i <= 5; i++) {" | 11847 " for (var i = 1; i <= 5; i++) {" |
10529 " try { nativeobject.callback(); } catch (e) { result += e; }" | 11848 " try { nativeobject.callback(); } catch (e) { result += e; }" |
10530 " }" | 11849 " }" |
10531 "}" | 11850 "}" |
10532 "f(); result;"); | 11851 "f(); result;"); |
10533 CHECK(v8_str("ggggg")->Equals(result)); | 11852 CHECK(v8_str("ggggg")->Equals(result)); |
10534 } | 11853 } |
10535 | 11854 |
10536 | 11855 |
10537 static int p_getter_count_3; | 11856 static int p_getter_count_3; |
10538 | 11857 |
10539 | 11858 |
10540 static Handle<Value> DoDirectGetter() { | 11859 static Local<Value> DoDirectGetter() { |
10541 if (++p_getter_count_3 % 3 == 0) { | 11860 if (++p_getter_count_3 % 3 == 0) { |
10542 CcTest::heap()->CollectAllGarbage(); | 11861 CcTest::heap()->CollectAllGarbage(); |
10543 GenerateSomeGarbage(); | 11862 GenerateSomeGarbage(); |
10544 } | 11863 } |
10545 return v8_str("Direct Getter Result"); | 11864 return v8_str("Direct Getter Result"); |
10546 } | 11865 } |
10547 | 11866 |
10548 | 11867 |
10549 static void DirectGetterCallback( | 11868 static void DirectGetterCallback( |
10550 Local<String> name, | 11869 Local<String> name, |
10551 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11870 const v8::PropertyCallbackInfo<v8::Value>& info) { |
10552 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback)); | 11871 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback)); |
10553 info.GetReturnValue().Set(DoDirectGetter()); | 11872 info.GetReturnValue().Set(DoDirectGetter()); |
10554 } | 11873 } |
10555 | 11874 |
10556 | 11875 |
10557 template<typename Accessor> | 11876 template<typename Accessor> |
10558 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) { | 11877 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) { |
10559 LocalContext context; | 11878 LocalContext context; |
10560 v8::Isolate* isolate = context->GetIsolate(); | 11879 v8::Isolate* isolate = context->GetIsolate(); |
10561 v8::HandleScope scope(isolate); | 11880 v8::HandleScope scope(isolate); |
10562 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); | 11881 v8::Local<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); |
10563 obj->SetAccessor(v8_str("p1"), accessor); | 11882 obj->SetAccessor(v8_str("p1"), accessor); |
10564 context->Global()->Set(v8_str("o1"), obj->NewInstance()); | 11883 CHECK(context->Global() |
11884 ->Set(context.local(), v8_str("o1"), | |
11885 obj->NewInstance(context.local()).ToLocalChecked()) | |
11886 .FromJust()); | |
10565 p_getter_count_3 = 0; | 11887 p_getter_count_3 = 0; |
10566 v8::Handle<v8::Value> result = CompileRun( | 11888 v8::Local<v8::Value> result = CompileRun( |
10567 "function f() {" | 11889 "function f() {" |
10568 " for (var i = 0; i < 30; i++) o1.p1;" | 11890 " for (var i = 0; i < 30; i++) o1.p1;" |
10569 " return o1.p1" | 11891 " return o1.p1" |
10570 "}" | 11892 "}" |
10571 "f();"); | 11893 "f();"); |
10572 CHECK(v8_str("Direct Getter Result")->Equals(result)); | 11894 CHECK(v8_str("Direct Getter Result")->Equals(result)); |
10573 CHECK_EQ(31, p_getter_count_3); | 11895 CHECK_EQ(31, p_getter_count_3); |
10574 } | 11896 } |
10575 | 11897 |
10576 | 11898 |
10577 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { | 11899 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { |
10578 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback); | 11900 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback); |
10579 } | 11901 } |
10580 | 11902 |
10581 | 11903 |
10582 void ThrowingDirectGetterCallback( | 11904 void ThrowingDirectGetterCallback( |
10583 Local<String> name, | 11905 Local<String> name, |
10584 const v8::PropertyCallbackInfo<v8::Value>& info) { | 11906 const v8::PropertyCallbackInfo<v8::Value>& info) { |
10585 info.GetIsolate()->ThrowException(v8_str("g")); | 11907 info.GetIsolate()->ThrowException(v8_str("g")); |
10586 } | 11908 } |
10587 | 11909 |
10588 | 11910 |
10589 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { | 11911 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { |
10590 LocalContext context; | 11912 LocalContext context; |
10591 v8::Isolate* isolate = context->GetIsolate(); | 11913 v8::Isolate* isolate = context->GetIsolate(); |
10592 v8::HandleScope scope(isolate); | 11914 v8::HandleScope scope(isolate); |
10593 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); | 11915 v8::Local<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); |
10594 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback); | 11916 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback); |
10595 context->Global()->Set(v8_str("o1"), obj->NewInstance()); | 11917 CHECK(context->Global() |
10596 v8::Handle<Value> result = CompileRun( | 11918 ->Set(context.local(), v8_str("o1"), |
11919 obj->NewInstance(context.local()).ToLocalChecked()) | |
11920 .FromJust()); | |
11921 v8::Local<Value> result = CompileRun( | |
10597 "var result = '';" | 11922 "var result = '';" |
10598 "for (var i = 0; i < 5; i++) {" | 11923 "for (var i = 0; i < 5; i++) {" |
10599 " try { o1.p1; } catch (e) { result += e; }" | 11924 " try { o1.p1; } catch (e) { result += e; }" |
10600 "}" | 11925 "}" |
10601 "result;"); | 11926 "result;"); |
10602 CHECK(v8_str("ggggg")->Equals(result)); | 11927 CHECK(v8_str("ggggg")->Equals(result)); |
10603 } | 11928 } |
10604 | 11929 |
10605 | 11930 |
10606 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { | 11931 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { |
10607 int interceptor_call_count = 0; | 11932 int interceptor_call_count = 0; |
10608 v8::Isolate* isolate = CcTest::isolate(); | 11933 v8::Isolate* isolate = CcTest::isolate(); |
10609 v8::HandleScope scope(isolate); | 11934 v8::HandleScope scope(isolate); |
10610 v8::Handle<v8::FunctionTemplate> fun_templ = | 11935 v8::Local<v8::FunctionTemplate> fun_templ = |
10611 v8::FunctionTemplate::New(isolate); | 11936 v8::FunctionTemplate::New(isolate); |
10612 v8::Handle<v8::FunctionTemplate> method_templ = | 11937 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10613 v8::FunctionTemplate::New(isolate, | 11938 isolate, FastApiCallback_TrivialSignature, v8_str("method_data"), |
10614 FastApiCallback_TrivialSignature, | 11939 v8::Local<v8::Signature>()); |
10615 v8_str("method_data"), | 11940 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10616 v8::Handle<v8::Signature>()); | |
10617 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | |
10618 proto_templ->Set(v8_str("method"), method_templ); | 11941 proto_templ->Set(v8_str("method"), method_templ); |
10619 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11942 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10620 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 11943 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10621 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11944 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10622 v8::External::New(isolate, &interceptor_call_count))); | 11945 v8::External::New(isolate, &interceptor_call_count))); |
10623 LocalContext context; | 11946 LocalContext context; |
10624 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11947 v8::Local<v8::Function> fun = |
11948 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10625 GenerateSomeGarbage(); | 11949 GenerateSomeGarbage(); |
10626 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11950 CHECK(context->Global() |
11951 ->Set(context.local(), v8_str("o"), | |
11952 fun->NewInstance(context.local()).ToLocalChecked()) | |
11953 .FromJust()); | |
10627 CompileRun( | 11954 CompileRun( |
10628 "var result = 0;" | 11955 "var result = 0;" |
10629 "for (var i = 0; i < 100; i++) {" | 11956 "for (var i = 0; i < 100; i++) {" |
10630 " result = o.method(41);" | 11957 " result = o.method(41);" |
10631 "}"); | 11958 "}"); |
10632 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 11959 CHECK_EQ(42, context->Global() |
11960 ->Get(v8_str("result")) | |
11961 ->Int32Value(context.local()) | |
11962 .FromJust()); | |
10633 CHECK_EQ(100, interceptor_call_count); | 11963 CHECK_EQ(100, interceptor_call_count); |
10634 } | 11964 } |
10635 | 11965 |
10636 | 11966 |
10637 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { | 11967 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
10638 int interceptor_call_count = 0; | 11968 int interceptor_call_count = 0; |
10639 v8::Isolate* isolate = CcTest::isolate(); | 11969 v8::Isolate* isolate = CcTest::isolate(); |
10640 v8::HandleScope scope(isolate); | 11970 v8::HandleScope scope(isolate); |
10641 v8::Handle<v8::FunctionTemplate> fun_templ = | 11971 v8::Local<v8::FunctionTemplate> fun_templ = |
10642 v8::FunctionTemplate::New(isolate); | 11972 v8::FunctionTemplate::New(isolate); |
10643 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 11973 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10644 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 11974 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10645 v8::Signature::New(isolate, fun_templ)); | 11975 v8::Signature::New(isolate, fun_templ)); |
10646 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 11976 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10647 proto_templ->Set(v8_str("method"), method_templ); | 11977 proto_templ->Set(v8_str("method"), method_templ); |
10648 fun_templ->SetHiddenPrototype(true); | 11978 fun_templ->SetHiddenPrototype(true); |
10649 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11979 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10650 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 11980 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10651 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11981 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10652 v8::External::New(isolate, &interceptor_call_count))); | 11982 v8::External::New(isolate, &interceptor_call_count))); |
10653 LocalContext context; | 11983 LocalContext context; |
10654 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11984 v8::Local<v8::Function> fun = |
11985 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10655 GenerateSomeGarbage(); | 11986 GenerateSomeGarbage(); |
10656 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11987 CHECK(context->Global() |
11988 ->Set(context.local(), v8_str("o"), | |
11989 fun->NewInstance(context.local()).ToLocalChecked()) | |
11990 .FromJust()); | |
10657 CompileRun( | 11991 CompileRun( |
10658 "o.foo = 17;" | 11992 "o.foo = 17;" |
10659 "var receiver = {};" | 11993 "var receiver = {};" |
10660 "receiver.__proto__ = o;" | 11994 "receiver.__proto__ = o;" |
10661 "var result = 0;" | 11995 "var result = 0;" |
10662 "for (var i = 0; i < 100; i++) {" | 11996 "for (var i = 0; i < 100; i++) {" |
10663 " result = receiver.method(41);" | 11997 " result = receiver.method(41);" |
10664 "}"); | 11998 "}"); |
10665 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 11999 CHECK_EQ(42, context->Global() |
12000 ->Get(v8_str("result")) | |
12001 ->Int32Value(context.local()) | |
12002 .FromJust()); | |
10666 CHECK_EQ(100, interceptor_call_count); | 12003 CHECK_EQ(100, interceptor_call_count); |
10667 } | 12004 } |
10668 | 12005 |
10669 | 12006 |
10670 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { | 12007 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
10671 int interceptor_call_count = 0; | 12008 int interceptor_call_count = 0; |
10672 v8::Isolate* isolate = CcTest::isolate(); | 12009 v8::Isolate* isolate = CcTest::isolate(); |
10673 v8::HandleScope scope(isolate); | 12010 v8::HandleScope scope(isolate); |
10674 v8::Handle<v8::FunctionTemplate> fun_templ = | 12011 v8::Local<v8::FunctionTemplate> fun_templ = |
10675 v8::FunctionTemplate::New(isolate); | 12012 v8::FunctionTemplate::New(isolate); |
10676 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12013 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10677 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12014 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10678 v8::Signature::New(isolate, fun_templ)); | 12015 v8::Signature::New(isolate, fun_templ)); |
10679 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12016 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10680 proto_templ->Set(v8_str("method"), method_templ); | 12017 proto_templ->Set(v8_str("method"), method_templ); |
10681 fun_templ->SetHiddenPrototype(true); | 12018 fun_templ->SetHiddenPrototype(true); |
10682 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12019 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10683 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 12020 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10684 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12021 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10685 v8::External::New(isolate, &interceptor_call_count))); | 12022 v8::External::New(isolate, &interceptor_call_count))); |
10686 LocalContext context; | 12023 LocalContext context; |
10687 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12024 v8::Local<v8::Function> fun = |
12025 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10688 GenerateSomeGarbage(); | 12026 GenerateSomeGarbage(); |
10689 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12027 CHECK(context->Global() |
12028 ->Set(context.local(), v8_str("o"), | |
12029 fun->NewInstance(context.local()).ToLocalChecked()) | |
12030 .FromJust()); | |
10690 CompileRun( | 12031 CompileRun( |
10691 "o.foo = 17;" | 12032 "o.foo = 17;" |
10692 "var receiver = {};" | 12033 "var receiver = {};" |
10693 "receiver.__proto__ = o;" | 12034 "receiver.__proto__ = o;" |
10694 "var result = 0;" | 12035 "var result = 0;" |
10695 "var saved_result = 0;" | 12036 "var saved_result = 0;" |
10696 "for (var i = 0; i < 100; i++) {" | 12037 "for (var i = 0; i < 100; i++) {" |
10697 " result = receiver.method(41);" | 12038 " result = receiver.method(41);" |
10698 " if (i == 50) {" | 12039 " if (i == 50) {" |
10699 " saved_result = result;" | 12040 " saved_result = result;" |
10700 " receiver = {method: function(x) { return x - 1 }};" | 12041 " receiver = {method: function(x) { return x - 1 }};" |
10701 " }" | 12042 " }" |
10702 "}"); | 12043 "}"); |
10703 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 12044 CHECK_EQ(40, context->Global() |
10704 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12045 ->Get(v8_str("result")) |
12046 ->Int32Value(context.local()) | |
12047 .FromJust()); | |
12048 CHECK_EQ(42, context->Global() | |
12049 ->Get(v8_str("saved_result")) | |
12050 ->Int32Value(context.local()) | |
12051 .FromJust()); | |
10705 CHECK_GE(interceptor_call_count, 50); | 12052 CHECK_GE(interceptor_call_count, 50); |
10706 } | 12053 } |
10707 | 12054 |
10708 | 12055 |
10709 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { | 12056 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { |
10710 int interceptor_call_count = 0; | 12057 int interceptor_call_count = 0; |
10711 v8::Isolate* isolate = CcTest::isolate(); | 12058 v8::Isolate* isolate = CcTest::isolate(); |
10712 v8::HandleScope scope(isolate); | 12059 v8::HandleScope scope(isolate); |
10713 v8::Handle<v8::FunctionTemplate> fun_templ = | 12060 v8::Local<v8::FunctionTemplate> fun_templ = |
10714 v8::FunctionTemplate::New(isolate); | 12061 v8::FunctionTemplate::New(isolate); |
10715 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12062 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10716 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12063 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10717 v8::Signature::New(isolate, fun_templ)); | 12064 v8::Signature::New(isolate, fun_templ)); |
10718 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12065 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10719 proto_templ->Set(v8_str("method"), method_templ); | 12066 proto_templ->Set(v8_str("method"), method_templ); |
10720 fun_templ->SetHiddenPrototype(true); | 12067 fun_templ->SetHiddenPrototype(true); |
10721 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12068 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10722 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 12069 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10723 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12070 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10724 v8::External::New(isolate, &interceptor_call_count))); | 12071 v8::External::New(isolate, &interceptor_call_count))); |
10725 LocalContext context; | 12072 LocalContext context; |
10726 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12073 v8::Local<v8::Function> fun = |
12074 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10727 GenerateSomeGarbage(); | 12075 GenerateSomeGarbage(); |
10728 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12076 CHECK(context->Global() |
12077 ->Set(context.local(), v8_str("o"), | |
12078 fun->NewInstance(context.local()).ToLocalChecked()) | |
12079 .FromJust()); | |
10729 CompileRun( | 12080 CompileRun( |
10730 "o.foo = 17;" | 12081 "o.foo = 17;" |
10731 "var receiver = {};" | 12082 "var receiver = {};" |
10732 "receiver.__proto__ = o;" | 12083 "receiver.__proto__ = o;" |
10733 "var result = 0;" | 12084 "var result = 0;" |
10734 "var saved_result = 0;" | 12085 "var saved_result = 0;" |
10735 "for (var i = 0; i < 100; i++) {" | 12086 "for (var i = 0; i < 100; i++) {" |
10736 " result = receiver.method(41);" | 12087 " result = receiver.method(41);" |
10737 " if (i == 50) {" | 12088 " if (i == 50) {" |
10738 " saved_result = result;" | 12089 " saved_result = result;" |
10739 " o.method = function(x) { return x - 1 };" | 12090 " o.method = function(x) { return x - 1 };" |
10740 " }" | 12091 " }" |
10741 "}"); | 12092 "}"); |
10742 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 12093 CHECK_EQ(40, context->Global() |
10743 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12094 ->Get(v8_str("result")) |
12095 ->Int32Value(context.local()) | |
12096 .FromJust()); | |
12097 CHECK_EQ(42, context->Global() | |
12098 ->Get(v8_str("saved_result")) | |
12099 ->Int32Value(context.local()) | |
12100 .FromJust()); | |
10744 CHECK_GE(interceptor_call_count, 50); | 12101 CHECK_GE(interceptor_call_count, 50); |
10745 } | 12102 } |
10746 | 12103 |
10747 | 12104 |
10748 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { | 12105 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { |
10749 int interceptor_call_count = 0; | 12106 int interceptor_call_count = 0; |
10750 v8::Isolate* isolate = CcTest::isolate(); | 12107 v8::Isolate* isolate = CcTest::isolate(); |
10751 v8::HandleScope scope(isolate); | 12108 v8::HandleScope scope(isolate); |
10752 v8::Handle<v8::FunctionTemplate> fun_templ = | 12109 v8::Local<v8::FunctionTemplate> fun_templ = |
10753 v8::FunctionTemplate::New(isolate); | 12110 v8::FunctionTemplate::New(isolate); |
10754 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12111 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10755 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12112 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10756 v8::Signature::New(isolate, fun_templ)); | 12113 v8::Signature::New(isolate, fun_templ)); |
10757 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12114 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10758 proto_templ->Set(v8_str("method"), method_templ); | 12115 proto_templ->Set(v8_str("method"), method_templ); |
10759 fun_templ->SetHiddenPrototype(true); | 12116 fun_templ->SetHiddenPrototype(true); |
10760 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12117 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10761 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 12118 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10762 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12119 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10763 v8::External::New(isolate, &interceptor_call_count))); | 12120 v8::External::New(isolate, &interceptor_call_count))); |
10764 LocalContext context; | 12121 LocalContext context; |
10765 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12122 v8::Local<v8::Function> fun = |
12123 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10766 GenerateSomeGarbage(); | 12124 GenerateSomeGarbage(); |
10767 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12125 CHECK(context->Global() |
12126 ->Set(context.local(), v8_str("o"), | |
12127 fun->NewInstance(context.local()).ToLocalChecked()) | |
12128 .FromJust()); | |
10768 v8::TryCatch try_catch(isolate); | 12129 v8::TryCatch try_catch(isolate); |
10769 CompileRun( | 12130 CompileRun( |
10770 "o.foo = 17;" | 12131 "o.foo = 17;" |
10771 "var receiver = {};" | 12132 "var receiver = {};" |
10772 "receiver.__proto__ = o;" | 12133 "receiver.__proto__ = o;" |
10773 "var result = 0;" | 12134 "var result = 0;" |
10774 "var saved_result = 0;" | 12135 "var saved_result = 0;" |
10775 "for (var i = 0; i < 100; i++) {" | 12136 "for (var i = 0; i < 100; i++) {" |
10776 " result = receiver.method(41);" | 12137 " result = receiver.method(41);" |
10777 " if (i == 50) {" | 12138 " if (i == 50) {" |
10778 " saved_result = result;" | 12139 " saved_result = result;" |
10779 " receiver = 333;" | 12140 " receiver = 333;" |
10780 " }" | 12141 " }" |
10781 "}"); | 12142 "}"); |
10782 CHECK(try_catch.HasCaught()); | 12143 CHECK(try_catch.HasCaught()); |
10783 // TODO(verwaest): Adjust message. | 12144 // TODO(verwaest): Adjust message. |
10784 CHECK(v8_str("TypeError: receiver.method is not a function") | 12145 CHECK(v8_str("TypeError: receiver.method is not a function") |
10785 ->Equals(try_catch.Exception()->ToString(isolate))); | 12146 ->Equals(try_catch.Exception()->ToString(isolate))); |
10786 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12147 CHECK_EQ(42, context->Global() |
12148 ->Get(v8_str("saved_result")) | |
12149 ->Int32Value(context.local()) | |
12150 .FromJust()); | |
10787 CHECK_GE(interceptor_call_count, 50); | 12151 CHECK_GE(interceptor_call_count, 50); |
10788 } | 12152 } |
10789 | 12153 |
10790 | 12154 |
10791 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { | 12155 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { |
10792 int interceptor_call_count = 0; | 12156 int interceptor_call_count = 0; |
10793 v8::Isolate* isolate = CcTest::isolate(); | 12157 v8::Isolate* isolate = CcTest::isolate(); |
10794 v8::HandleScope scope(isolate); | 12158 v8::HandleScope scope(isolate); |
10795 v8::Handle<v8::FunctionTemplate> fun_templ = | 12159 v8::Local<v8::FunctionTemplate> fun_templ = |
10796 v8::FunctionTemplate::New(isolate); | 12160 v8::FunctionTemplate::New(isolate); |
10797 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12161 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10798 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12162 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10799 v8::Signature::New(isolate, fun_templ)); | 12163 v8::Signature::New(isolate, fun_templ)); |
10800 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12164 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10801 proto_templ->Set(v8_str("method"), method_templ); | 12165 proto_templ->Set(v8_str("method"), method_templ); |
10802 fun_templ->SetHiddenPrototype(true); | 12166 fun_templ->SetHiddenPrototype(true); |
10803 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12167 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
10804 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 12168 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
10805 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12169 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
10806 v8::External::New(isolate, &interceptor_call_count))); | 12170 v8::External::New(isolate, &interceptor_call_count))); |
10807 LocalContext context; | 12171 LocalContext context; |
10808 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12172 v8::Local<v8::Function> fun = |
12173 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10809 GenerateSomeGarbage(); | 12174 GenerateSomeGarbage(); |
10810 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12175 CHECK(context->Global() |
12176 ->Set(context.local(), v8_str("o"), | |
12177 fun->NewInstance(context.local()).ToLocalChecked()) | |
12178 .FromJust()); | |
10811 v8::TryCatch try_catch(isolate); | 12179 v8::TryCatch try_catch(isolate); |
10812 CompileRun( | 12180 CompileRun( |
10813 "o.foo = 17;" | 12181 "o.foo = 17;" |
10814 "var receiver = {};" | 12182 "var receiver = {};" |
10815 "receiver.__proto__ = o;" | 12183 "receiver.__proto__ = o;" |
10816 "var result = 0;" | 12184 "var result = 0;" |
10817 "var saved_result = 0;" | 12185 "var saved_result = 0;" |
10818 "for (var i = 0; i < 100; i++) {" | 12186 "for (var i = 0; i < 100; i++) {" |
10819 " result = receiver.method(41);" | 12187 " result = receiver.method(41);" |
10820 " if (i == 50) {" | 12188 " if (i == 50) {" |
10821 " saved_result = result;" | 12189 " saved_result = result;" |
10822 " receiver = {method: receiver.method};" | 12190 " receiver = {method: receiver.method};" |
10823 " }" | 12191 " }" |
10824 "}"); | 12192 "}"); |
10825 CHECK(try_catch.HasCaught()); | 12193 CHECK(try_catch.HasCaught()); |
10826 CHECK(v8_str("TypeError: Illegal invocation") | 12194 CHECK(v8_str("TypeError: Illegal invocation") |
10827 ->Equals(try_catch.Exception()->ToString(isolate))); | 12195 ->Equals(try_catch.Exception()->ToString(isolate))); |
10828 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12196 CHECK_EQ(42, context->Global() |
12197 ->Get(v8_str("saved_result")) | |
12198 ->Int32Value(context.local()) | |
12199 .FromJust()); | |
10829 CHECK_GE(interceptor_call_count, 50); | 12200 CHECK_GE(interceptor_call_count, 50); |
10830 } | 12201 } |
10831 | 12202 |
10832 | 12203 |
10833 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { | 12204 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { |
10834 v8::Isolate* isolate = CcTest::isolate(); | 12205 v8::Isolate* isolate = CcTest::isolate(); |
10835 v8::HandleScope scope(isolate); | 12206 v8::HandleScope scope(isolate); |
10836 v8::Handle<v8::FunctionTemplate> fun_templ = | 12207 v8::Local<v8::FunctionTemplate> fun_templ = |
10837 v8::FunctionTemplate::New(isolate); | 12208 v8::FunctionTemplate::New(isolate); |
10838 v8::Handle<v8::FunctionTemplate> method_templ = | 12209 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10839 v8::FunctionTemplate::New(isolate, | 12210 isolate, FastApiCallback_TrivialSignature, v8_str("method_data"), |
10840 FastApiCallback_TrivialSignature, | 12211 v8::Local<v8::Signature>()); |
10841 v8_str("method_data"), | 12212 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10842 v8::Handle<v8::Signature>()); | |
10843 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | |
10844 proto_templ->Set(v8_str("method"), method_templ); | 12213 proto_templ->Set(v8_str("method"), method_templ); |
10845 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12214 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
10846 USE(templ); | 12215 USE(templ); |
10847 LocalContext context; | 12216 LocalContext context; |
10848 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12217 v8::Local<v8::Function> fun = |
12218 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10849 GenerateSomeGarbage(); | 12219 GenerateSomeGarbage(); |
10850 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12220 CHECK(context->Global() |
12221 ->Set(context.local(), v8_str("o"), | |
12222 fun->NewInstance(context.local()).ToLocalChecked()) | |
12223 .FromJust()); | |
10851 CompileRun( | 12224 CompileRun( |
10852 "var result = 0;" | 12225 "var result = 0;" |
10853 "for (var i = 0; i < 100; i++) {" | 12226 "for (var i = 0; i < 100; i++) {" |
10854 " result = o.method(41);" | 12227 " result = o.method(41);" |
10855 "}"); | 12228 "}"); |
10856 | 12229 |
10857 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 12230 CHECK_EQ(42, context->Global() |
12231 ->Get(v8_str("result")) | |
12232 ->Int32Value(context.local()) | |
12233 .FromJust()); | |
10858 } | 12234 } |
10859 | 12235 |
10860 | 12236 |
10861 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { | 12237 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { |
10862 v8::Isolate* isolate = CcTest::isolate(); | 12238 v8::Isolate* isolate = CcTest::isolate(); |
10863 v8::HandleScope scope(isolate); | 12239 v8::HandleScope scope(isolate); |
10864 v8::Handle<v8::FunctionTemplate> fun_templ = | 12240 v8::Local<v8::FunctionTemplate> fun_templ = |
10865 v8::FunctionTemplate::New(isolate); | 12241 v8::FunctionTemplate::New(isolate); |
10866 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12242 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10867 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12243 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10868 v8::Signature::New(isolate, fun_templ)); | 12244 v8::Signature::New(isolate, fun_templ)); |
10869 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12245 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10870 proto_templ->Set(v8_str("method"), method_templ); | 12246 proto_templ->Set(v8_str("method"), method_templ); |
10871 fun_templ->SetHiddenPrototype(true); | 12247 fun_templ->SetHiddenPrototype(true); |
10872 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12248 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
10873 CHECK(!templ.IsEmpty()); | 12249 CHECK(!templ.IsEmpty()); |
10874 LocalContext context; | 12250 LocalContext context; |
10875 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12251 v8::Local<v8::Function> fun = |
12252 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10876 GenerateSomeGarbage(); | 12253 GenerateSomeGarbage(); |
10877 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12254 CHECK(context->Global() |
12255 ->Set(context.local(), v8_str("o"), | |
12256 fun->NewInstance(context.local()).ToLocalChecked()) | |
12257 .FromJust()); | |
10878 CompileRun( | 12258 CompileRun( |
10879 "o.foo = 17;" | 12259 "o.foo = 17;" |
10880 "var receiver = {};" | 12260 "var receiver = {};" |
10881 "receiver.__proto__ = o;" | 12261 "receiver.__proto__ = o;" |
10882 "var result = 0;" | 12262 "var result = 0;" |
10883 "for (var i = 0; i < 100; i++) {" | 12263 "for (var i = 0; i < 100; i++) {" |
10884 " result = receiver.method(41);" | 12264 " result = receiver.method(41);" |
10885 "}"); | 12265 "}"); |
10886 | 12266 |
10887 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 12267 CHECK_EQ(42, context->Global() |
12268 ->Get(v8_str("result")) | |
12269 ->Int32Value(context.local()) | |
12270 .FromJust()); | |
10888 } | 12271 } |
10889 | 12272 |
10890 | 12273 |
10891 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { | 12274 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
10892 v8::Isolate* isolate = CcTest::isolate(); | 12275 v8::Isolate* isolate = CcTest::isolate(); |
10893 v8::HandleScope scope(isolate); | 12276 v8::HandleScope scope(isolate); |
10894 v8::Handle<v8::FunctionTemplate> fun_templ = | 12277 v8::Local<v8::FunctionTemplate> fun_templ = |
10895 v8::FunctionTemplate::New(isolate); | 12278 v8::FunctionTemplate::New(isolate); |
10896 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12279 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10897 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12280 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10898 v8::Signature::New(isolate, fun_templ)); | 12281 v8::Signature::New(isolate, fun_templ)); |
10899 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12282 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10900 proto_templ->Set(v8_str("method"), method_templ); | 12283 proto_templ->Set(v8_str("method"), method_templ); |
10901 fun_templ->SetHiddenPrototype(true); | 12284 fun_templ->SetHiddenPrototype(true); |
10902 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12285 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
10903 CHECK(!templ.IsEmpty()); | 12286 CHECK(!templ.IsEmpty()); |
10904 LocalContext context; | 12287 LocalContext context; |
10905 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12288 v8::Local<v8::Function> fun = |
12289 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10906 GenerateSomeGarbage(); | 12290 GenerateSomeGarbage(); |
10907 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12291 CHECK(context->Global() |
12292 ->Set(context.local(), v8_str("o"), | |
12293 fun->NewInstance(context.local()).ToLocalChecked()) | |
12294 .FromJust()); | |
10908 CompileRun( | 12295 CompileRun( |
10909 "o.foo = 17;" | 12296 "o.foo = 17;" |
10910 "var receiver = {};" | 12297 "var receiver = {};" |
10911 "receiver.__proto__ = o;" | 12298 "receiver.__proto__ = o;" |
10912 "var result = 0;" | 12299 "var result = 0;" |
10913 "var saved_result = 0;" | 12300 "var saved_result = 0;" |
10914 "for (var i = 0; i < 100; i++) {" | 12301 "for (var i = 0; i < 100; i++) {" |
10915 " result = receiver.method(41);" | 12302 " result = receiver.method(41);" |
10916 " if (i == 50) {" | 12303 " if (i == 50) {" |
10917 " saved_result = result;" | 12304 " saved_result = result;" |
10918 " receiver = {method: function(x) { return x - 1 }};" | 12305 " receiver = {method: function(x) { return x - 1 }};" |
10919 " }" | 12306 " }" |
10920 "}"); | 12307 "}"); |
10921 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 12308 CHECK_EQ(40, context->Global() |
10922 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12309 ->Get(v8_str("result")) |
12310 ->Int32Value(context.local()) | |
12311 .FromJust()); | |
12312 CHECK_EQ(42, context->Global() | |
12313 ->Get(v8_str("saved_result")) | |
12314 ->Int32Value(context.local()) | |
12315 .FromJust()); | |
10923 } | 12316 } |
10924 | 12317 |
10925 | 12318 |
10926 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { | 12319 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { |
10927 v8::Isolate* isolate = CcTest::isolate(); | 12320 v8::Isolate* isolate = CcTest::isolate(); |
10928 v8::HandleScope scope(isolate); | 12321 v8::HandleScope scope(isolate); |
10929 v8::Handle<v8::FunctionTemplate> fun_templ = | 12322 v8::Local<v8::FunctionTemplate> fun_templ = |
10930 v8::FunctionTemplate::New(isolate); | 12323 v8::FunctionTemplate::New(isolate); |
10931 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12324 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10932 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12325 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10933 v8::Signature::New(isolate, fun_templ)); | 12326 v8::Signature::New(isolate, fun_templ)); |
10934 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12327 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10935 proto_templ->Set(v8_str("method"), method_templ); | 12328 proto_templ->Set(v8_str("method"), method_templ); |
10936 fun_templ->SetHiddenPrototype(true); | 12329 fun_templ->SetHiddenPrototype(true); |
10937 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12330 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
10938 CHECK(!templ.IsEmpty()); | 12331 CHECK(!templ.IsEmpty()); |
10939 LocalContext context; | 12332 LocalContext context; |
10940 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12333 v8::Local<v8::Function> fun = |
12334 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10941 GenerateSomeGarbage(); | 12335 GenerateSomeGarbage(); |
10942 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12336 CHECK(context->Global() |
12337 ->Set(context.local(), v8_str("o"), | |
12338 fun->NewInstance(context.local()).ToLocalChecked()) | |
12339 .FromJust()); | |
10943 v8::TryCatch try_catch(isolate); | 12340 v8::TryCatch try_catch(isolate); |
10944 CompileRun( | 12341 CompileRun( |
10945 "o.foo = 17;" | 12342 "o.foo = 17;" |
10946 "var receiver = {};" | 12343 "var receiver = {};" |
10947 "receiver.__proto__ = o;" | 12344 "receiver.__proto__ = o;" |
10948 "var result = 0;" | 12345 "var result = 0;" |
10949 "var saved_result = 0;" | 12346 "var saved_result = 0;" |
10950 "for (var i = 0; i < 100; i++) {" | 12347 "for (var i = 0; i < 100; i++) {" |
10951 " result = receiver.method(41);" | 12348 " result = receiver.method(41);" |
10952 " if (i == 50) {" | 12349 " if (i == 50) {" |
10953 " saved_result = result;" | 12350 " saved_result = result;" |
10954 " receiver = 333;" | 12351 " receiver = 333;" |
10955 " }" | 12352 " }" |
10956 "}"); | 12353 "}"); |
10957 CHECK(try_catch.HasCaught()); | 12354 CHECK(try_catch.HasCaught()); |
10958 // TODO(verwaest): Adjust message. | 12355 // TODO(verwaest): Adjust message. |
10959 CHECK(v8_str("TypeError: receiver.method is not a function") | 12356 CHECK(v8_str("TypeError: receiver.method is not a function") |
10960 ->Equals(try_catch.Exception()->ToString(isolate))); | 12357 ->Equals(try_catch.Exception()->ToString(isolate))); |
10961 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12358 CHECK_EQ(42, context->Global() |
12359 ->Get(v8_str("saved_result")) | |
12360 ->Int32Value(context.local()) | |
12361 .FromJust()); | |
10962 } | 12362 } |
10963 | 12363 |
10964 | 12364 |
10965 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { | 12365 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { |
10966 v8::Isolate* isolate = CcTest::isolate(); | 12366 v8::Isolate* isolate = CcTest::isolate(); |
10967 v8::HandleScope scope(isolate); | 12367 v8::HandleScope scope(isolate); |
10968 v8::Handle<v8::FunctionTemplate> fun_templ = | 12368 v8::Local<v8::FunctionTemplate> fun_templ = |
10969 v8::FunctionTemplate::New(isolate); | 12369 v8::FunctionTemplate::New(isolate); |
10970 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12370 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
10971 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), | 12371 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
10972 v8::Signature::New(isolate, fun_templ)); | 12372 v8::Signature::New(isolate, fun_templ)); |
10973 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12373 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
10974 proto_templ->Set(v8_str("method"), method_templ); | 12374 proto_templ->Set(v8_str("method"), method_templ); |
10975 fun_templ->SetHiddenPrototype(true); | 12375 fun_templ->SetHiddenPrototype(true); |
10976 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12376 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
10977 CHECK(!templ.IsEmpty()); | 12377 CHECK(!templ.IsEmpty()); |
10978 LocalContext context; | 12378 LocalContext context; |
10979 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12379 v8::Local<v8::Function> fun = |
12380 fun_templ->GetFunction(context.local()).ToLocalChecked(); | |
10980 GenerateSomeGarbage(); | 12381 GenerateSomeGarbage(); |
10981 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12382 CHECK(context->Global() |
12383 ->Set(context.local(), v8_str("o"), | |
12384 fun->NewInstance(context.local()).ToLocalChecked()) | |
12385 .FromJust()); | |
10982 v8::TryCatch try_catch(isolate); | 12386 v8::TryCatch try_catch(isolate); |
10983 CompileRun( | 12387 CompileRun( |
10984 "o.foo = 17;" | 12388 "o.foo = 17;" |
10985 "var receiver = {};" | 12389 "var receiver = {};" |
10986 "receiver.__proto__ = o;" | 12390 "receiver.__proto__ = o;" |
10987 "var result = 0;" | 12391 "var result = 0;" |
10988 "var saved_result = 0;" | 12392 "var saved_result = 0;" |
10989 "for (var i = 0; i < 100; i++) {" | 12393 "for (var i = 0; i < 100; i++) {" |
10990 " result = receiver.method(41);" | 12394 " result = receiver.method(41);" |
10991 " if (i == 50) {" | 12395 " if (i == 50) {" |
10992 " saved_result = result;" | 12396 " saved_result = result;" |
10993 " receiver = Object.create(receiver);" | 12397 " receiver = Object.create(receiver);" |
10994 " }" | 12398 " }" |
10995 "}"); | 12399 "}"); |
10996 CHECK(try_catch.HasCaught()); | 12400 CHECK(try_catch.HasCaught()); |
10997 CHECK(v8_str("TypeError: Illegal invocation") | 12401 CHECK(v8_str("TypeError: Illegal invocation") |
10998 ->Equals(try_catch.Exception()->ToString(isolate))); | 12402 ->Equals(try_catch.Exception()->ToString(isolate))); |
10999 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12403 CHECK_EQ(42, context->Global() |
12404 ->Get(v8_str("saved_result")) | |
12405 ->Int32Value(context.local()) | |
12406 .FromJust()); | |
11000 } | 12407 } |
11001 | 12408 |
11002 | 12409 |
11003 static void ThrowingGetter(Local<String> name, | 12410 static void ThrowingGetter(Local<String> name, |
11004 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12411 const v8::PropertyCallbackInfo<v8::Value>& info) { |
11005 ApiTestFuzzer::Fuzz(); | 12412 ApiTestFuzzer::Fuzz(); |
11006 info.GetIsolate()->ThrowException(Handle<Value>()); | 12413 info.GetIsolate()->ThrowException(Local<Value>()); |
11007 info.GetReturnValue().SetUndefined(); | 12414 info.GetReturnValue().SetUndefined(); |
11008 } | 12415 } |
11009 | 12416 |
11010 | 12417 |
11011 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { | 12418 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { |
11012 LocalContext context; | 12419 LocalContext context; |
11013 HandleScope scope(context->GetIsolate()); | 12420 HandleScope scope(context->GetIsolate()); |
11014 | 12421 |
11015 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); | 12422 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
11016 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 12423 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
11017 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter); | 12424 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter); |
11018 | 12425 |
11019 Local<Object> instance = templ->GetFunction()->NewInstance(); | 12426 Local<Object> instance = templ->GetFunction(context.local()) |
12427 .ToLocalChecked() | |
12428 ->NewInstance(context.local()) | |
12429 .ToLocalChecked(); | |
11020 | 12430 |
11021 Local<Object> another = Object::New(context->GetIsolate()); | 12431 Local<Object> another = Object::New(context->GetIsolate()); |
11022 another->SetPrototype(instance); | 12432 another->SetPrototype(instance); |
11023 | 12433 |
11024 Local<Object> with_js_getter = CompileRun( | 12434 Local<Object> with_js_getter = CompileRun( |
11025 "o = {};\n" | 12435 "o = {};\n" |
11026 "o.__defineGetter__('f', function() { throw undefined; });\n" | 12436 "o.__defineGetter__('f', function() { throw undefined; });\n" |
11027 "o\n").As<Object>(); | 12437 "o\n").As<Object>(); |
11028 CHECK(!with_js_getter.IsEmpty()); | 12438 CHECK(!with_js_getter.IsEmpty()); |
11029 | 12439 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11087 CompileRun("throw 'from JS';"); | 12497 CompileRun("throw 'from JS';"); |
11088 CHECK(try_catch.HasCaught()); | 12498 CHECK(try_catch.HasCaught()); |
11089 CHECK(!CcTest::i_isolate()->has_pending_exception()); | 12499 CHECK(!CcTest::i_isolate()->has_pending_exception()); |
11090 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); | 12500 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); |
11091 } | 12501 } |
11092 | 12502 |
11093 | 12503 |
11094 static int call_depth; | 12504 static int call_depth; |
11095 | 12505 |
11096 | 12506 |
11097 static void WithTryCatch(Handle<Message> message, Handle<Value> data) { | 12507 static void WithTryCatch(Local<Message> message, Local<Value> data) { |
11098 TryCatch try_catch(CcTest::isolate()); | 12508 TryCatch try_catch(CcTest::isolate()); |
11099 } | 12509 } |
11100 | 12510 |
11101 | 12511 |
11102 static void ThrowFromJS(Handle<Message> message, Handle<Value> data) { | 12512 static void ThrowFromJS(Local<Message> message, Local<Value> data) { |
11103 if (--call_depth) CompileRun("throw 'ThrowInJS';"); | 12513 if (--call_depth) CompileRun("throw 'ThrowInJS';"); |
11104 } | 12514 } |
11105 | 12515 |
11106 | 12516 |
11107 static void ThrowViaApi(Handle<Message> message, Handle<Value> data) { | 12517 static void ThrowViaApi(Local<Message> message, Local<Value> data) { |
11108 if (--call_depth) CcTest::isolate()->ThrowException(v8_str("ThrowViaApi")); | 12518 if (--call_depth) CcTest::isolate()->ThrowException(v8_str("ThrowViaApi")); |
11109 } | 12519 } |
11110 | 12520 |
11111 | 12521 |
11112 static void WebKitLike(Handle<Message> message, Handle<Value> data) { | 12522 static void WebKitLike(Local<Message> message, Local<Value> data) { |
11113 Handle<String> errorMessageString = message->Get(); | 12523 Local<String> errorMessageString = message->Get(); |
11114 CHECK(!errorMessageString.IsEmpty()); | 12524 CHECK(!errorMessageString.IsEmpty()); |
11115 message->GetStackTrace(); | 12525 message->GetStackTrace(); |
11116 message->GetScriptOrigin().ResourceName(); | 12526 message->GetScriptOrigin().ResourceName(); |
11117 } | 12527 } |
11118 | 12528 |
11119 | 12529 |
11120 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) { | 12530 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) { |
11121 LocalContext context; | 12531 LocalContext context; |
11122 v8::Isolate* isolate = context->GetIsolate(); | 12532 v8::Isolate* isolate = context->GetIsolate(); |
11123 HandleScope scope(isolate); | 12533 HandleScope scope(isolate); |
11124 | 12534 |
11125 Local<Function> func = | 12535 Local<Function> func = |
11126 FunctionTemplate::New(isolate, | 12536 FunctionTemplate::New(isolate, ThrowingCallbackWithTryCatch) |
11127 ThrowingCallbackWithTryCatch)->GetFunction(); | 12537 ->GetFunction(context.local()) |
11128 context->Global()->Set(v8_str("func"), func); | 12538 .ToLocalChecked(); |
12539 CHECK( | |
12540 context->Global()->Set(context.local(), v8_str("func"), func).FromJust()); | |
11129 | 12541 |
11130 MessageCallback callbacks[] = | 12542 MessageCallback callbacks[] = |
11131 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch }; | 12543 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch }; |
11132 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) { | 12544 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) { |
11133 MessageCallback callback = callbacks[i]; | 12545 MessageCallback callback = callbacks[i]; |
11134 if (callback != NULL) { | 12546 if (callback != NULL) { |
11135 V8::AddMessageListener(callback); | 12547 V8::AddMessageListener(callback); |
11136 } | 12548 } |
11137 // Some small number to control number of times message handler should | 12549 // Some small number to control number of times message handler should |
11138 // throw an exception. | 12550 // throw an exception. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11182 // instances. | 12594 // instances. |
11183 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter); | 12595 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter); |
11184 // Add 'g' twice. The 'g' added last should get called for instances. | 12596 // Add 'g' twice. The 'g' added last should get called for instances. |
11185 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter); | 12597 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter); |
11186 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter); | 12598 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter); |
11187 | 12599 |
11188 // Add 'h' as an accessor to the proto template with ReadOnly attributes | 12600 // Add 'h' as an accessor to the proto template with ReadOnly attributes |
11189 // so 'h' can be shadowed on the instance object. | 12601 // so 'h' can be shadowed on the instance object. |
11190 Local<ObjectTemplate> child_proto_templ = child_templ->PrototypeTemplate(); | 12602 Local<ObjectTemplate> child_proto_templ = child_templ->PrototypeTemplate(); |
11191 child_proto_templ->SetAccessor(v8_str("h"), ParentGetter, 0, | 12603 child_proto_templ->SetAccessor(v8_str("h"), ParentGetter, 0, |
11192 v8::Handle<Value>(), v8::DEFAULT, v8::ReadOnly); | 12604 v8::Local<Value>(), v8::DEFAULT, v8::ReadOnly); |
11193 | 12605 |
11194 // Add 'i' as an accessor to the instance template with ReadOnly attributes | 12606 // Add 'i' as an accessor to the instance template with ReadOnly attributes |
11195 // but the attribute does not have effect because it is duplicated with | 12607 // but the attribute does not have effect because it is duplicated with |
11196 // NULL setter. | 12608 // NULL setter. |
11197 child_instance_templ->SetAccessor(v8_str("i"), ChildGetter, 0, | 12609 child_instance_templ->SetAccessor(v8_str("i"), ChildGetter, 0, |
11198 v8::Handle<Value>(), v8::DEFAULT, v8::ReadOnly); | 12610 v8::Local<Value>(), v8::DEFAULT, |
11199 | 12611 v8::ReadOnly); |
11200 | 12612 |
11201 | 12613 |
11202 // Instantiate the child template. | 12614 // Instantiate the child template. |
11203 Local<v8::Object> instance = child_templ->GetFunction()->NewInstance(); | 12615 Local<v8::Object> instance = child_templ->GetFunction(context.local()) |
12616 .ToLocalChecked() | |
12617 ->NewInstance(context.local()) | |
12618 .ToLocalChecked(); | |
11204 | 12619 |
11205 // Check that the child function overrides the parent one. | 12620 // Check that the child function overrides the parent one. |
11206 context->Global()->Set(v8_str("o"), instance); | 12621 CHECK(context->Global() |
12622 ->Set(context.local(), v8_str("o"), instance) | |
12623 .FromJust()); | |
11207 Local<Value> value = v8_compile("o.f")->Run(); | 12624 Local<Value> value = v8_compile("o.f")->Run(); |
11208 // Check that the 'g' that was added last is hit. | 12625 // Check that the 'g' that was added last is hit. |
11209 CHECK_EQ(42, value->Int32Value()); | 12626 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
11210 value = v8_compile("o.g")->Run(); | 12627 value = v8_compile("o.g")->Run(); |
11211 CHECK_EQ(42, value->Int32Value()); | 12628 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
11212 | 12629 |
11213 // Check that 'h' cannot be shadowed. | 12630 // Check that 'h' cannot be shadowed. |
11214 value = v8_compile("o.h = 3; o.h")->Run(); | 12631 value = v8_compile("o.h = 3; o.h")->Run(); |
11215 CHECK_EQ(1, value->Int32Value()); | 12632 CHECK_EQ(1, value->Int32Value(context.local()).FromJust()); |
11216 | 12633 |
11217 // Check that 'i' cannot be shadowed or changed. | 12634 // Check that 'i' cannot be shadowed or changed. |
11218 value = v8_compile("o.i = 3; o.i")->Run(); | 12635 value = v8_compile("o.i = 3; o.i")->Run(); |
11219 CHECK_EQ(42, value->Int32Value()); | 12636 CHECK_EQ(42, value->Int32Value(context.local()).FromJust()); |
11220 } | 12637 } |
11221 | 12638 |
11222 | 12639 |
11223 static void IsConstructHandler( | 12640 static void IsConstructHandler( |
11224 const v8::FunctionCallbackInfo<v8::Value>& args) { | 12641 const v8::FunctionCallbackInfo<v8::Value>& args) { |
11225 ApiTestFuzzer::Fuzz(); | 12642 ApiTestFuzzer::Fuzz(); |
11226 args.GetReturnValue().Set(args.IsConstructCall()); | 12643 args.GetReturnValue().Set(args.IsConstructCall()); |
11227 } | 12644 } |
11228 | 12645 |
11229 | 12646 |
11230 THREADED_TEST(IsConstructCall) { | 12647 THREADED_TEST(IsConstructCall) { |
11231 v8::Isolate* isolate = CcTest::isolate(); | 12648 v8::Isolate* isolate = CcTest::isolate(); |
11232 v8::HandleScope scope(isolate); | 12649 v8::HandleScope scope(isolate); |
11233 | 12650 |
11234 // Function template with call handler. | 12651 // Function template with call handler. |
11235 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 12652 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
11236 templ->SetCallHandler(IsConstructHandler); | 12653 templ->SetCallHandler(IsConstructHandler); |
11237 | 12654 |
11238 LocalContext context; | 12655 LocalContext context; |
11239 | 12656 |
11240 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 12657 CHECK(context->Global() |
12658 ->Set(context.local(), v8_str("f"), | |
12659 templ->GetFunction(context.local()).ToLocalChecked()) | |
12660 .FromJust()); | |
11241 Local<Value> value = v8_compile("f()")->Run(); | 12661 Local<Value> value = v8_compile("f()")->Run(); |
11242 CHECK(!value->BooleanValue()); | 12662 CHECK(!value->BooleanValue()); |
11243 value = v8_compile("new f()")->Run(); | 12663 value = v8_compile("new f()")->Run(); |
11244 CHECK(value->BooleanValue()); | 12664 CHECK(value->BooleanValue()); |
11245 } | 12665 } |
11246 | 12666 |
11247 | 12667 |
11248 THREADED_TEST(ObjectProtoToString) { | 12668 THREADED_TEST(ObjectProtoToString) { |
11249 v8::Isolate* isolate = CcTest::isolate(); | 12669 v8::Isolate* isolate = CcTest::isolate(); |
11250 v8::HandleScope scope(isolate); | 12670 v8::HandleScope scope(isolate); |
11251 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); | 12671 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
11252 templ->SetClassName(v8_str("MyClass")); | 12672 templ->SetClassName(v8_str("MyClass")); |
11253 | 12673 |
11254 LocalContext context; | 12674 LocalContext context; |
11255 | 12675 |
11256 Local<String> customized_tostring = v8_str("customized toString"); | 12676 Local<String> customized_tostring = v8_str("customized toString"); |
11257 | 12677 |
11258 // Replace Object.prototype.toString | 12678 // Replace Object.prototype.toString |
11259 v8_compile("Object.prototype.toString = function() {" | 12679 v8_compile("Object.prototype.toString = function() {" |
11260 " return 'customized toString';" | 12680 " return 'customized toString';" |
11261 "}")->Run(); | 12681 "}")->Run(); |
11262 | 12682 |
11263 // Normal ToString call should call replaced Object.prototype.toString | 12683 // Normal ToString call should call replaced Object.prototype.toString |
11264 Local<v8::Object> instance = templ->GetFunction()->NewInstance(); | 12684 Local<v8::Object> instance = templ->GetFunction(context.local()) |
12685 .ToLocalChecked() | |
12686 ->NewInstance(context.local()) | |
12687 .ToLocalChecked(); | |
11265 Local<String> value = instance->ToString(isolate); | 12688 Local<String> value = instance->ToString(isolate); |
11266 CHECK(value->IsString() && value->Equals(customized_tostring)); | 12689 CHECK(value->IsString() && value->Equals(customized_tostring)); |
11267 | 12690 |
11268 // ObjectProtoToString should not call replace toString function. | 12691 // ObjectProtoToString should not call replace toString function. |
11269 value = instance->ObjectProtoToString(); | 12692 value = instance->ObjectProtoToString(); |
11270 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); | 12693 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); |
11271 | 12694 |
11272 // Check global | 12695 // Check global |
11273 value = context->Global()->ObjectProtoToString(); | 12696 value = context->Global()->ObjectProtoToString(); |
11274 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); | 12697 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); |
(...skipping 16 matching lines...) Expand all Loading... | |
11291 | 12714 |
11292 Local<String> customized_tostring = v8_str("customized toString"); | 12715 Local<String> customized_tostring = v8_str("customized toString"); |
11293 | 12716 |
11294 // Replace Object.prototype.toString | 12717 // Replace Object.prototype.toString |
11295 CompileRun( | 12718 CompileRun( |
11296 "Object.prototype.toString = function() {" | 12719 "Object.prototype.toString = function() {" |
11297 " return 'customized toString';" | 12720 " return 'customized toString';" |
11298 "}"); | 12721 "}"); |
11299 | 12722 |
11300 // Normal ToString call should call replaced Object.prototype.toString | 12723 // Normal ToString call should call replaced Object.prototype.toString |
11301 Local<v8::Object> instance = templ->GetFunction()->NewInstance(); | 12724 Local<v8::Object> instance = templ->GetFunction(context.local()) |
12725 .ToLocalChecked() | |
12726 ->NewInstance(context.local()) | |
12727 .ToLocalChecked(); | |
11302 Local<String> value = instance->ToString(isolate); | 12728 Local<String> value = instance->ToString(isolate); |
11303 CHECK(value->IsString() && value->Equals(customized_tostring)); | 12729 CHECK(value->IsString() && value->Equals(customized_tostring)); |
11304 | 12730 |
11305 // ObjectProtoToString should not call replace toString function. | 12731 // ObjectProtoToString should not call replace toString function. |
11306 value = instance->ObjectProtoToString(); | 12732 value = instance->ObjectProtoToString(); |
11307 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); | 12733 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); |
11308 | 12734 |
11309 // Check global | 12735 // Check global |
11310 value = context->Global()->ObjectProtoToString(); | 12736 value = context->Global()->ObjectProtoToString(); |
11311 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); | 12737 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
11634 | 13060 |
11635 static void ThrowInJS(const v8::FunctionCallbackInfo<v8::Value>& args) { | 13061 static void ThrowInJS(const v8::FunctionCallbackInfo<v8::Value>& args) { |
11636 v8::Isolate* isolate = args.GetIsolate(); | 13062 v8::Isolate* isolate = args.GetIsolate(); |
11637 CHECK(v8::Locker::IsLocked(isolate)); | 13063 CHECK(v8::Locker::IsLocked(isolate)); |
11638 ApiTestFuzzer::Fuzz(); | 13064 ApiTestFuzzer::Fuzz(); |
11639 v8::Unlocker unlocker(isolate); | 13065 v8::Unlocker unlocker(isolate); |
11640 const char* code = "throw 7;"; | 13066 const char* code = "throw 7;"; |
11641 { | 13067 { |
11642 v8::Locker nested_locker(isolate); | 13068 v8::Locker nested_locker(isolate); |
11643 v8::HandleScope scope(isolate); | 13069 v8::HandleScope scope(isolate); |
11644 v8::Handle<Value> exception; | 13070 v8::Local<Value> exception; |
11645 { | 13071 { |
11646 v8::TryCatch try_catch(isolate); | 13072 v8::TryCatch try_catch(isolate); |
11647 v8::Handle<Value> value = CompileRun(code); | 13073 v8::Local<Value> value = CompileRun(code); |
11648 CHECK(value.IsEmpty()); | 13074 CHECK(value.IsEmpty()); |
11649 CHECK(try_catch.HasCaught()); | 13075 CHECK(try_catch.HasCaught()); |
11650 // Make sure to wrap the exception in a new handle because | 13076 // Make sure to wrap the exception in a new handle because |
11651 // the handle returned from the TryCatch is destroyed | 13077 // the handle returned from the TryCatch is destroyed |
11652 // when the TryCatch is destroyed. | 13078 // when the TryCatch is destroyed. |
11653 exception = Local<Value>::New(isolate, try_catch.Exception()); | 13079 exception = Local<Value>::New(isolate, try_catch.Exception()); |
11654 } | 13080 } |
11655 args.GetIsolate()->ThrowException(exception); | 13081 args.GetIsolate()->ThrowException(exception); |
11656 } | 13082 } |
11657 } | 13083 } |
11658 | 13084 |
11659 | 13085 |
11660 static void ThrowInJSNoCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { | 13086 static void ThrowInJSNoCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { |
11661 CHECK(v8::Locker::IsLocked(CcTest::isolate())); | 13087 CHECK(v8::Locker::IsLocked(CcTest::isolate())); |
11662 ApiTestFuzzer::Fuzz(); | 13088 ApiTestFuzzer::Fuzz(); |
11663 v8::Unlocker unlocker(CcTest::isolate()); | 13089 v8::Unlocker unlocker(CcTest::isolate()); |
11664 const char* code = "throw 7;"; | 13090 const char* code = "throw 7;"; |
11665 { | 13091 { |
11666 v8::Locker nested_locker(CcTest::isolate()); | 13092 v8::Locker nested_locker(CcTest::isolate()); |
11667 v8::HandleScope scope(args.GetIsolate()); | 13093 v8::HandleScope scope(args.GetIsolate()); |
11668 v8::Handle<Value> value = CompileRun(code); | 13094 v8::Local<Value> value = CompileRun(code); |
11669 CHECK(value.IsEmpty()); | 13095 CHECK(value.IsEmpty()); |
11670 args.GetReturnValue().Set(v8_str("foo")); | 13096 args.GetReturnValue().Set(v8_str("foo")); |
11671 } | 13097 } |
11672 } | 13098 } |
11673 | 13099 |
11674 | 13100 |
11675 // These are locking tests that don't need to be run again | 13101 // These are locking tests that don't need to be run again |
11676 // as part of the locking aggregation tests. | 13102 // as part of the locking aggregation tests. |
11677 TEST(NestedLockers) { | 13103 TEST(NestedLockers) { |
11678 v8::Isolate* isolate = CcTest::isolate(); | 13104 v8::Isolate* isolate = CcTest::isolate(); |
11679 v8::Locker locker(isolate); | 13105 v8::Locker locker(isolate); |
11680 CHECK(v8::Locker::IsLocked(isolate)); | 13106 CHECK(v8::Locker::IsLocked(isolate)); |
11681 LocalContext env; | 13107 LocalContext env; |
11682 v8::HandleScope scope(env->GetIsolate()); | 13108 v8::HandleScope scope(env->GetIsolate()); |
11683 Local<v8::FunctionTemplate> fun_templ = | 13109 Local<v8::FunctionTemplate> fun_templ = |
11684 v8::FunctionTemplate::New(isolate, ThrowInJS); | 13110 v8::FunctionTemplate::New(isolate, ThrowInJS); |
11685 Local<Function> fun = fun_templ->GetFunction(); | 13111 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
11686 env->Global()->Set(v8_str("throw_in_js"), fun); | 13112 CHECK(env->Global()->Set(env.local(), v8_str("throw_in_js"), fun).FromJust()); |
11687 Local<Script> script = v8_compile("(function () {" | 13113 Local<Script> script = v8_compile("(function () {" |
11688 " try {" | 13114 " try {" |
11689 " throw_in_js();" | 13115 " throw_in_js();" |
11690 " return 42;" | 13116 " return 42;" |
11691 " } catch (e) {" | 13117 " } catch (e) {" |
11692 " return e * 13;" | 13118 " return e * 13;" |
11693 " }" | 13119 " }" |
11694 "})();"); | 13120 "})();"); |
11695 CHECK_EQ(91, script->Run()->Int32Value()); | 13121 CHECK_EQ(91, script->Run()->Int32Value(env.local()).FromJust()); |
11696 } | 13122 } |
11697 | 13123 |
11698 | 13124 |
11699 // These are locking tests that don't need to be run again | 13125 // These are locking tests that don't need to be run again |
11700 // as part of the locking aggregation tests. | 13126 // as part of the locking aggregation tests. |
11701 TEST(NestedLockersNoTryCatch) { | 13127 TEST(NestedLockersNoTryCatch) { |
11702 v8::Locker locker(CcTest::isolate()); | 13128 v8::Locker locker(CcTest::isolate()); |
11703 LocalContext env; | 13129 LocalContext env; |
11704 v8::HandleScope scope(env->GetIsolate()); | 13130 v8::HandleScope scope(env->GetIsolate()); |
11705 Local<v8::FunctionTemplate> fun_templ = | 13131 Local<v8::FunctionTemplate> fun_templ = |
11706 v8::FunctionTemplate::New(env->GetIsolate(), ThrowInJSNoCatch); | 13132 v8::FunctionTemplate::New(env->GetIsolate(), ThrowInJSNoCatch); |
11707 Local<Function> fun = fun_templ->GetFunction(); | 13133 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
11708 env->Global()->Set(v8_str("throw_in_js"), fun); | 13134 CHECK(env->Global()->Set(env.local(), v8_str("throw_in_js"), fun).FromJust()); |
11709 Local<Script> script = v8_compile("(function () {" | 13135 Local<Script> script = v8_compile("(function () {" |
11710 " try {" | 13136 " try {" |
11711 " throw_in_js();" | 13137 " throw_in_js();" |
11712 " return 42;" | 13138 " return 42;" |
11713 " } catch (e) {" | 13139 " } catch (e) {" |
11714 " return e * 13;" | 13140 " return e * 13;" |
11715 " }" | 13141 " }" |
11716 "})();"); | 13142 "})();"); |
11717 CHECK_EQ(91, script->Run()->Int32Value()); | 13143 CHECK_EQ(91, script->Run()->Int32Value(env.local()).FromJust()); |
11718 } | 13144 } |
11719 | 13145 |
11720 | 13146 |
11721 THREADED_TEST(RecursiveLocking) { | 13147 THREADED_TEST(RecursiveLocking) { |
11722 v8::Locker locker(CcTest::isolate()); | 13148 v8::Locker locker(CcTest::isolate()); |
11723 { | 13149 { |
11724 v8::Locker locker2(CcTest::isolate()); | 13150 v8::Locker locker2(CcTest::isolate()); |
11725 CHECK(v8::Locker::IsLocked(CcTest::isolate())); | 13151 CHECK(v8::Locker::IsLocked(CcTest::isolate())); |
11726 } | 13152 } |
11727 } | 13153 } |
11728 | 13154 |
11729 | 13155 |
11730 static void UnlockForAMoment(const v8::FunctionCallbackInfo<v8::Value>& args) { | 13156 static void UnlockForAMoment(const v8::FunctionCallbackInfo<v8::Value>& args) { |
11731 ApiTestFuzzer::Fuzz(); | 13157 ApiTestFuzzer::Fuzz(); |
11732 v8::Unlocker unlocker(CcTest::isolate()); | 13158 v8::Unlocker unlocker(CcTest::isolate()); |
11733 } | 13159 } |
11734 | 13160 |
11735 | 13161 |
11736 THREADED_TEST(LockUnlockLock) { | 13162 THREADED_TEST(LockUnlockLock) { |
11737 { | 13163 { |
11738 v8::Locker locker(CcTest::isolate()); | 13164 v8::Locker locker(CcTest::isolate()); |
11739 v8::HandleScope scope(CcTest::isolate()); | 13165 v8::HandleScope scope(CcTest::isolate()); |
11740 LocalContext env; | 13166 LocalContext env; |
11741 Local<v8::FunctionTemplate> fun_templ = | 13167 Local<v8::FunctionTemplate> fun_templ = |
11742 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); | 13168 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); |
11743 Local<Function> fun = fun_templ->GetFunction(); | 13169 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
11744 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); | 13170 CHECK(env->Global() |
13171 ->Set(env.local(), v8_str("unlock_for_a_moment"), fun) | |
13172 .FromJust()); | |
11745 Local<Script> script = v8_compile("(function () {" | 13173 Local<Script> script = v8_compile("(function () {" |
11746 " unlock_for_a_moment();" | 13174 " unlock_for_a_moment();" |
11747 " return 42;" | 13175 " return 42;" |
11748 "})();"); | 13176 "})();"); |
11749 CHECK_EQ(42, script->Run()->Int32Value()); | 13177 CHECK_EQ(42, script->Run()->Int32Value(env.local()).FromJust()); |
11750 } | 13178 } |
11751 { | 13179 { |
11752 v8::Locker locker(CcTest::isolate()); | 13180 v8::Locker locker(CcTest::isolate()); |
11753 v8::HandleScope scope(CcTest::isolate()); | 13181 v8::HandleScope scope(CcTest::isolate()); |
11754 LocalContext env; | 13182 LocalContext env; |
11755 Local<v8::FunctionTemplate> fun_templ = | 13183 Local<v8::FunctionTemplate> fun_templ = |
11756 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); | 13184 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); |
11757 Local<Function> fun = fun_templ->GetFunction(); | 13185 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
11758 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); | 13186 CHECK(env->Global() |
13187 ->Set(env.local(), v8_str("unlock_for_a_moment"), fun) | |
13188 .FromJust()); | |
11759 Local<Script> script = v8_compile("(function () {" | 13189 Local<Script> script = v8_compile("(function () {" |
11760 " unlock_for_a_moment();" | 13190 " unlock_for_a_moment();" |
11761 " return 42;" | 13191 " return 42;" |
11762 "})();"); | 13192 "})();"); |
11763 CHECK_EQ(42, script->Run()->Int32Value()); | 13193 CHECK_EQ(42, script->Run()->Int32Value(env.local()).FromJust()); |
11764 } | 13194 } |
11765 } | 13195 } |
11766 | 13196 |
11767 | 13197 |
11768 static int GetGlobalObjectsCount() { | 13198 static int GetGlobalObjectsCount() { |
11769 int count = 0; | 13199 int count = 0; |
11770 i::HeapIterator it(CcTest::heap()); | 13200 i::HeapIterator it(CcTest::heap()); |
11771 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) | 13201 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) |
11772 if (object->IsJSGlobalObject()) { | 13202 if (object->IsJSGlobalObject()) { |
11773 i::JSGlobalObject* g = i::JSGlobalObject::cast(object); | 13203 i::JSGlobalObject* g = i::JSGlobalObject::cast(object); |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12022 CompileRun(source); | 13452 CompileRun(source); |
12023 } | 13453 } |
12024 { v8::HandleScope scope(CcTest::isolate()); | 13454 { v8::HandleScope scope(CcTest::isolate()); |
12025 LocalContext context; | 13455 LocalContext context; |
12026 CompileRun(source); | 13456 CompileRun(source); |
12027 } | 13457 } |
12028 } | 13458 } |
12029 } | 13459 } |
12030 | 13460 |
12031 | 13461 |
12032 static v8::Handle<Value> NestedScope(v8::Local<Context> env) { | 13462 static v8::Local<Value> NestedScope(v8::Local<Context> env) { |
12033 v8::EscapableHandleScope inner(env->GetIsolate()); | 13463 v8::EscapableHandleScope inner(env->GetIsolate()); |
12034 env->Enter(); | 13464 env->Enter(); |
12035 v8::Local<Value> three = v8_num(3); | 13465 v8::Local<Value> three = v8_num(3); |
12036 v8::Local<Value> value = inner.Escape(three); | 13466 v8::Local<Value> value = inner.Escape(three); |
12037 env->Exit(); | 13467 env->Exit(); |
12038 return value; | 13468 return value; |
12039 } | 13469 } |
12040 | 13470 |
12041 | 13471 |
12042 THREADED_TEST(NestedHandleScopeAndContexts) { | 13472 THREADED_TEST(NestedHandleScopeAndContexts) { |
12043 v8::Isolate* isolate = CcTest::isolate(); | 13473 v8::Isolate* isolate = CcTest::isolate(); |
12044 v8::HandleScope outer(isolate); | 13474 v8::HandleScope outer(isolate); |
12045 v8::Local<Context> env = Context::New(isolate); | 13475 v8::Local<Context> env = Context::New(isolate); |
12046 env->Enter(); | 13476 env->Enter(); |
12047 v8::Handle<Value> value = NestedScope(env); | 13477 v8::Local<Value> value = NestedScope(env); |
12048 v8::Handle<String> str(value->ToString(isolate)); | 13478 v8::Local<String> str(value->ToString(isolate)); |
12049 CHECK(!str.IsEmpty()); | 13479 CHECK(!str.IsEmpty()); |
12050 env->Exit(); | 13480 env->Exit(); |
12051 } | 13481 } |
12052 | 13482 |
12053 | 13483 |
12054 static bool MatchPointers(void* key1, void* key2) { | 13484 static bool MatchPointers(void* key1, void* key2) { |
12055 return key1 == key2; | 13485 return key1 == key2; |
12056 } | 13486 } |
12057 | 13487 |
12058 | 13488 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12285 } | 13715 } |
12286 | 13716 |
12287 | 13717 |
12288 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { | 13718 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { |
12289 v8::HandleScope outer(isolate); | 13719 v8::HandleScope outer(isolate); |
12290 v8::Local<Context> env = Context::New(isolate); | 13720 v8::Local<Context> env = Context::New(isolate); |
12291 env->Enter(); | 13721 env->Enter(); |
12292 | 13722 |
12293 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); | 13723 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); |
12294 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback)); | 13724 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback)); |
12295 env->Global()->Set(v8_str("obj"), t->NewInstance()); | 13725 CHECK(env->Global() |
13726 ->Set(env, v8_str("obj"), t->NewInstance(env).ToLocalChecked()) | |
13727 .FromJust()); | |
12296 | 13728 |
12297 const char* script = | 13729 const char* script = |
12298 "function bar() {\n" | 13730 "function bar() {\n" |
12299 " var sum = 0;\n" | 13731 " var sum = 0;\n" |
12300 " for (i = 0; i < 100; ++i)\n" | 13732 " for (i = 0; i < 100; ++i)\n" |
12301 " sum = foo(i);\n" | 13733 " sum = foo(i);\n" |
12302 " return sum;\n" | 13734 " return sum;\n" |
12303 "}\n" | 13735 "}\n" |
12304 "function foo(i) { return i * i; }\n" | 13736 "function foo(i) { return i * i; }\n" |
12305 "// Invoke on the runtime function.\n" | 13737 "// Invoke on the runtime function.\n" |
12306 "obj.asdf()"; | 13738 "obj.asdf()"; |
12307 CompileRun(script); | 13739 CompileRun(script); |
12308 bar_func_ = i::Handle<i::JSFunction>::cast( | 13740 bar_func_ = i::Handle<i::JSFunction>::cast( |
12309 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar")))); | 13741 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar")))); |
12310 DCHECK(!bar_func_.is_null()); | 13742 DCHECK(!bar_func_.is_null()); |
12311 | 13743 |
12312 foo_func_ = | 13744 foo_func_ = |
12313 i::Handle<i::JSFunction>::cast( | 13745 i::Handle<i::JSFunction>::cast( |
12314 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo")))); | 13746 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo")))); |
12315 DCHECK(!foo_func_.is_null()); | 13747 DCHECK(!foo_func_.is_null()); |
12316 | 13748 |
12317 v8::Handle<v8::Value> value = CompileRun("bar();"); | 13749 v8::Local<v8::Value> value = CompileRun("bar();"); |
12318 CHECK(value->IsNumber()); | 13750 CHECK(value->IsNumber()); |
12319 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); | 13751 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); |
12320 | 13752 |
12321 // Test the optimized codegen path. | 13753 // Test the optimized codegen path. |
12322 value = CompileRun("%OptimizeFunctionOnNextCall(foo);" | 13754 value = CompileRun("%OptimizeFunctionOnNextCall(foo);" |
12323 "bar();"); | 13755 "bar();"); |
12324 CHECK(value->IsNumber()); | 13756 CHECK(value->IsNumber()); |
12325 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); | 13757 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); |
12326 | 13758 |
12327 env->Exit(); | 13759 env->Exit(); |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
12672 LocalContext context; | 14104 LocalContext context; |
12673 v8::Isolate* isolate = context->GetIsolate(); | 14105 v8::Isolate* isolate = context->GetIsolate(); |
12674 v8::HandleScope outer(isolate); | 14106 v8::HandleScope outer(isolate); |
12675 static v8::Persistent<v8::ObjectTemplate> templ; | 14107 static v8::Persistent<v8::ObjectTemplate> templ; |
12676 if (templ.IsEmpty()) { | 14108 if (templ.IsEmpty()) { |
12677 v8::EscapableHandleScope inner(isolate); | 14109 v8::EscapableHandleScope inner(isolate); |
12678 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(isolate); | 14110 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(isolate); |
12679 local->SetInternalFieldCount(1); | 14111 local->SetInternalFieldCount(1); |
12680 templ.Reset(isolate, inner.Escape(local)); | 14112 templ.Reset(isolate, inner.Escape(local)); |
12681 } | 14113 } |
12682 v8::Handle<v8::Object> result = | 14114 v8::Local<v8::Object> result = |
12683 v8::Local<v8::ObjectTemplate>::New(isolate, templ)->NewInstance(); | 14115 v8::Local<v8::ObjectTemplate>::New(isolate, templ) |
14116 ->NewInstance(context.local()) | |
14117 .ToLocalChecked(); | |
12684 CHECK_EQ(1, result->InternalFieldCount()); | 14118 CHECK_EQ(1, result->InternalFieldCount()); |
12685 } | 14119 } |
12686 | 14120 |
12687 | 14121 |
12688 // If part of the threaded tests, this test makes ThreadingTest fail | 14122 // If part of the threaded tests, this test makes ThreadingTest fail |
12689 // on mac. | 14123 // on mac. |
12690 TEST(CatchStackOverflow) { | 14124 TEST(CatchStackOverflow) { |
12691 LocalContext context; | 14125 LocalContext context; |
12692 v8::HandleScope scope(context->GetIsolate()); | 14126 v8::HandleScope scope(context->GetIsolate()); |
12693 v8::TryCatch try_catch(context->GetIsolate()); | 14127 v8::TryCatch try_catch(context->GetIsolate()); |
12694 v8::Handle<v8::Value> result = CompileRun( | 14128 v8::Local<v8::Value> result = CompileRun( |
12695 "function f() {" | 14129 "function f() {" |
12696 " return f();" | 14130 " return f();" |
12697 "}" | 14131 "}" |
12698 "" | 14132 "" |
12699 "f();"); | 14133 "f();"); |
12700 CHECK(result.IsEmpty()); | 14134 CHECK(result.IsEmpty()); |
12701 } | 14135 } |
12702 | 14136 |
12703 | 14137 |
12704 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, | 14138 static void CheckTryCatchSourceInfo(v8::Local<v8::Script> script, |
12705 const char* resource_name, | 14139 const char* resource_name, |
12706 int line_offset) { | 14140 int line_offset) { |
12707 v8::HandleScope scope(CcTest::isolate()); | 14141 v8::HandleScope scope(CcTest::isolate()); |
12708 v8::TryCatch try_catch(CcTest::isolate()); | 14142 v8::TryCatch try_catch(CcTest::isolate()); |
12709 v8::Handle<v8::Value> result = script->Run(); | 14143 v8::Local<v8::Value> result = script->Run(); |
12710 CHECK(result.IsEmpty()); | 14144 CHECK(result.IsEmpty()); |
12711 CHECK(try_catch.HasCaught()); | 14145 CHECK(try_catch.HasCaught()); |
12712 v8::Handle<v8::Message> message = try_catch.Message(); | 14146 v8::Local<v8::Message> message = try_catch.Message(); |
12713 CHECK(!message.IsEmpty()); | 14147 CHECK(!message.IsEmpty()); |
12714 CHECK_EQ(10 + line_offset, message->GetLineNumber()); | 14148 CHECK_EQ(10 + line_offset, message->GetLineNumber()); |
12715 CHECK_EQ(91, message->GetStartPosition()); | 14149 CHECK_EQ(91, message->GetStartPosition()); |
12716 CHECK_EQ(92, message->GetEndPosition()); | 14150 CHECK_EQ(92, message->GetEndPosition()); |
12717 CHECK_EQ(2, message->GetStartColumn()); | 14151 CHECK_EQ(2, message->GetStartColumn()); |
12718 CHECK_EQ(3, message->GetEndColumn()); | 14152 CHECK_EQ(3, message->GetEndColumn()); |
12719 v8::String::Utf8Value line(message->GetSourceLine()); | 14153 v8::String::Utf8Value line(message->GetSourceLine()); |
12720 CHECK_EQ(0, strcmp(" throw 'nirk';", *line)); | 14154 CHECK_EQ(0, strcmp(" throw 'nirk';", *line)); |
12721 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); | 14155 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); |
12722 CHECK_EQ(0, strcmp(resource_name, *name)); | 14156 CHECK_EQ(0, strcmp(resource_name, *name)); |
(...skipping 12 matching lines...) Expand all Loading... | |
12735 " return Baz();\n" | 14169 " return Baz();\n" |
12736 "}\n" | 14170 "}\n" |
12737 "\n" | 14171 "\n" |
12738 "function Baz() {\n" | 14172 "function Baz() {\n" |
12739 " throw 'nirk';\n" | 14173 " throw 'nirk';\n" |
12740 "}\n" | 14174 "}\n" |
12741 "\n" | 14175 "\n" |
12742 "Foo();\n"); | 14176 "Foo();\n"); |
12743 | 14177 |
12744 const char* resource_name; | 14178 const char* resource_name; |
12745 v8::Handle<v8::Script> script; | 14179 v8::Local<v8::Script> script; |
12746 resource_name = "test.js"; | 14180 resource_name = "test.js"; |
12747 script = CompileWithOrigin(source, resource_name); | 14181 script = CompileWithOrigin(source, resource_name); |
12748 CheckTryCatchSourceInfo(script, resource_name, 0); | 14182 CheckTryCatchSourceInfo(script, resource_name, 0); |
12749 | 14183 |
12750 resource_name = "test1.js"; | 14184 resource_name = "test1.js"; |
12751 v8::ScriptOrigin origin1( | 14185 v8::ScriptOrigin origin1(v8_str(resource_name)); |
12752 v8::String::NewFromUtf8(context->GetIsolate(), resource_name)); | |
12753 script = v8::Script::Compile(source, &origin1); | 14186 script = v8::Script::Compile(source, &origin1); |
12754 CheckTryCatchSourceInfo(script, resource_name, 0); | 14187 CheckTryCatchSourceInfo(script, resource_name, 0); |
12755 | 14188 |
12756 resource_name = "test2.js"; | 14189 resource_name = "test2.js"; |
12757 v8::ScriptOrigin origin2( | 14190 v8::ScriptOrigin origin2(v8_str(resource_name), |
12758 v8::String::NewFromUtf8(context->GetIsolate(), resource_name), | 14191 v8::Integer::New(context->GetIsolate(), 7)); |
12759 v8::Integer::New(context->GetIsolate(), 7)); | |
12760 script = v8::Script::Compile(source, &origin2); | 14192 script = v8::Script::Compile(source, &origin2); |
12761 CheckTryCatchSourceInfo(script, resource_name, 7); | 14193 CheckTryCatchSourceInfo(script, resource_name, 7); |
12762 } | 14194 } |
12763 | 14195 |
12764 | 14196 |
12765 THREADED_TEST(TryCatchSourceInfoForEOSError) { | 14197 THREADED_TEST(TryCatchSourceInfoForEOSError) { |
12766 LocalContext context; | 14198 LocalContext context; |
12767 v8::HandleScope scope(context->GetIsolate()); | 14199 v8::HandleScope scope(context->GetIsolate()); |
12768 v8::TryCatch try_catch(context->GetIsolate()); | 14200 v8::TryCatch try_catch(context->GetIsolate()); |
12769 v8::Script::Compile(v8_str("!\n")); | 14201 v8::Script::Compile(v8_str("!\n")); |
12770 CHECK(try_catch.HasCaught()); | 14202 CHECK(try_catch.HasCaught()); |
12771 v8::Handle<v8::Message> message = try_catch.Message(); | 14203 v8::Local<v8::Message> message = try_catch.Message(); |
12772 CHECK_EQ(1, message->GetLineNumber()); | 14204 CHECK_EQ(1, message->GetLineNumber()); |
12773 CHECK_EQ(0, message->GetStartColumn()); | 14205 CHECK_EQ(0, message->GetStartColumn()); |
12774 } | 14206 } |
12775 | 14207 |
12776 | 14208 |
12777 THREADED_TEST(CompilationCache) { | 14209 THREADED_TEST(CompilationCache) { |
12778 LocalContext context; | 14210 LocalContext context; |
12779 v8::HandleScope scope(context->GetIsolate()); | 14211 v8::HandleScope scope(context->GetIsolate()); |
12780 v8::Handle<v8::String> source0 = | 14212 v8::Local<v8::String> source0 = v8_str("1234"); |
12781 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); | 14213 v8::Local<v8::String> source1 = v8_str("1234"); |
12782 v8::Handle<v8::String> source1 = | 14214 v8::Local<v8::Script> script0 = CompileWithOrigin(source0, "test.js"); |
12783 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); | 14215 v8::Local<v8::Script> script1 = CompileWithOrigin(source1, "test.js"); |
12784 v8::Handle<v8::Script> script0 = CompileWithOrigin(source0, "test.js"); | 14216 v8::Local<v8::Script> script2 = |
12785 v8::Handle<v8::Script> script1 = CompileWithOrigin(source1, "test.js"); | |
12786 v8::Handle<v8::Script> script2 = | |
12787 v8::Script::Compile(source0); // different origin | 14217 v8::Script::Compile(source0); // different origin |
12788 CHECK_EQ(1234, script0->Run()->Int32Value()); | 14218 CHECK_EQ(1234, script0->Run()->Int32Value(context.local()).FromJust()); |
12789 CHECK_EQ(1234, script1->Run()->Int32Value()); | 14219 CHECK_EQ(1234, script1->Run()->Int32Value(context.local()).FromJust()); |
12790 CHECK_EQ(1234, script2->Run()->Int32Value()); | 14220 CHECK_EQ(1234, script2->Run()->Int32Value(context.local()).FromJust()); |
12791 } | 14221 } |
12792 | 14222 |
12793 | 14223 |
12794 static void FunctionNameCallback( | 14224 static void FunctionNameCallback( |
12795 const v8::FunctionCallbackInfo<v8::Value>& args) { | 14225 const v8::FunctionCallbackInfo<v8::Value>& args) { |
12796 ApiTestFuzzer::Fuzz(); | 14226 ApiTestFuzzer::Fuzz(); |
12797 args.GetReturnValue().Set(v8_num(42)); | 14227 args.GetReturnValue().Set(v8_num(42)); |
12798 } | 14228 } |
12799 | 14229 |
12800 | 14230 |
12801 THREADED_TEST(CallbackFunctionName) { | 14231 THREADED_TEST(CallbackFunctionName) { |
12802 LocalContext context; | 14232 LocalContext context; |
12803 v8::Isolate* isolate = context->GetIsolate(); | 14233 v8::Isolate* isolate = context->GetIsolate(); |
12804 v8::HandleScope scope(isolate); | 14234 v8::HandleScope scope(isolate); |
12805 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); | 14235 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); |
12806 t->Set(v8_str("asdf"), | 14236 t->Set(v8_str("asdf"), |
12807 v8::FunctionTemplate::New(isolate, FunctionNameCallback)); | 14237 v8::FunctionTemplate::New(isolate, FunctionNameCallback)); |
12808 context->Global()->Set(v8_str("obj"), t->NewInstance()); | 14238 CHECK(context->Global() |
12809 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name"); | 14239 ->Set(context.local(), v8_str("obj"), |
14240 t->NewInstance(context.local()).ToLocalChecked()) | |
14241 .FromJust()); | |
14242 v8::Local<v8::Value> value = CompileRun("obj.asdf.name"); | |
12810 CHECK(value->IsString()); | 14243 CHECK(value->IsString()); |
12811 v8::String::Utf8Value name(value); | 14244 v8::String::Utf8Value name(value); |
12812 CHECK_EQ(0, strcmp("asdf", *name)); | 14245 CHECK_EQ(0, strcmp("asdf", *name)); |
12813 } | 14246 } |
12814 | 14247 |
12815 | 14248 |
12816 THREADED_TEST(DateAccess) { | 14249 THREADED_TEST(DateAccess) { |
12817 LocalContext context; | 14250 LocalContext context; |
12818 v8::HandleScope scope(context->GetIsolate()); | 14251 v8::HandleScope scope(context->GetIsolate()); |
12819 v8::Handle<v8::Value> date = | 14252 v8::Local<v8::Value> date = |
12820 v8::Date::New(context->GetIsolate(), 1224744689038.0); | 14253 v8::Date::New(context->GetIsolate(), 1224744689038.0); |
12821 CHECK(date->IsDate()); | 14254 CHECK(date->IsDate()); |
12822 CHECK_EQ(1224744689038.0, date.As<v8::Date>()->ValueOf()); | 14255 CHECK_EQ(1224744689038.0, date.As<v8::Date>()->ValueOf()); |
12823 } | 14256 } |
12824 | 14257 |
12825 | 14258 |
12826 void CheckProperties(v8::Isolate* isolate, v8::Handle<v8::Value> val, | 14259 void CheckProperties(v8::Isolate* isolate, v8::Local<v8::Value> val, |
12827 unsigned elmc, const char* elmv[]) { | 14260 unsigned elmc, const char* elmv[]) { |
12828 v8::Handle<v8::Object> obj = val.As<v8::Object>(); | 14261 v8::Local<v8::Object> obj = val.As<v8::Object>(); |
12829 v8::Handle<v8::Array> props = obj->GetPropertyNames(); | 14262 v8::Local<v8::Array> props = obj->GetPropertyNames(); |
12830 CHECK_EQ(elmc, props->Length()); | 14263 CHECK_EQ(elmc, props->Length()); |
12831 for (unsigned i = 0; i < elmc; i++) { | 14264 for (unsigned i = 0; i < elmc; i++) { |
12832 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); | 14265 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); |
12833 CHECK_EQ(0, strcmp(elmv[i], *elm)); | 14266 CHECK_EQ(0, strcmp(elmv[i], *elm)); |
12834 } | 14267 } |
12835 } | 14268 } |
12836 | 14269 |
12837 | 14270 |
12838 void CheckOwnProperties(v8::Isolate* isolate, v8::Handle<v8::Value> val, | 14271 void CheckOwnProperties(v8::Isolate* isolate, v8::Local<v8::Value> val, |
12839 unsigned elmc, const char* elmv[]) { | 14272 unsigned elmc, const char* elmv[]) { |
12840 v8::Handle<v8::Object> obj = val.As<v8::Object>(); | 14273 v8::Local<v8::Object> obj = val.As<v8::Object>(); |
12841 v8::Handle<v8::Array> props = obj->GetOwnPropertyNames(); | 14274 v8::Local<v8::Array> props = obj->GetOwnPropertyNames(); |
12842 CHECK_EQ(elmc, props->Length()); | 14275 CHECK_EQ(elmc, props->Length()); |
12843 for (unsigned i = 0; i < elmc; i++) { | 14276 for (unsigned i = 0; i < elmc; i++) { |
12844 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); | 14277 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); |
12845 CHECK_EQ(0, strcmp(elmv[i], *elm)); | 14278 CHECK_EQ(0, strcmp(elmv[i], *elm)); |
12846 } | 14279 } |
12847 } | 14280 } |
12848 | 14281 |
12849 | 14282 |
12850 THREADED_TEST(PropertyEnumeration) { | 14283 THREADED_TEST(PropertyEnumeration) { |
12851 LocalContext context; | 14284 LocalContext context; |
12852 v8::Isolate* isolate = context->GetIsolate(); | 14285 v8::Isolate* isolate = context->GetIsolate(); |
12853 v8::HandleScope scope(isolate); | 14286 v8::HandleScope scope(isolate); |
12854 v8::Handle<v8::Value> obj = CompileRun( | 14287 v8::Local<v8::Value> obj = CompileRun( |
12855 "var result = [];" | 14288 "var result = [];" |
12856 "result[0] = {};" | 14289 "result[0] = {};" |
12857 "result[1] = {a: 1, b: 2};" | 14290 "result[1] = {a: 1, b: 2};" |
12858 "result[2] = [1, 2, 3];" | 14291 "result[2] = [1, 2, 3];" |
12859 "var proto = {x: 1, y: 2, z: 3};" | 14292 "var proto = {x: 1, y: 2, z: 3};" |
12860 "var x = { __proto__: proto, w: 0, z: 1 };" | 14293 "var x = { __proto__: proto, w: 0, z: 1 };" |
12861 "result[3] = x;" | 14294 "result[3] = x;" |
12862 "result;"); | 14295 "result;"); |
12863 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); | 14296 v8::Local<v8::Array> elms = obj.As<v8::Array>(); |
12864 CHECK_EQ(4u, elms->Length()); | 14297 CHECK_EQ(4u, elms->Length()); |
12865 int elmc0 = 0; | 14298 int elmc0 = 0; |
12866 const char** elmv0 = NULL; | 14299 const char** elmv0 = NULL; |
12867 CheckProperties( | 14300 CheckProperties( |
12868 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14301 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
12869 CheckOwnProperties( | 14302 CheckOwnProperties( |
12870 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14303 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
12871 int elmc1 = 2; | 14304 int elmc1 = 2; |
12872 const char* elmv1[] = {"a", "b"}; | 14305 const char* elmv1[] = {"a", "b"}; |
12873 CheckProperties( | 14306 CheckProperties( |
(...skipping 14 matching lines...) Expand all Loading... | |
12888 const char* elmv4[] = {"w", "z"}; | 14321 const char* elmv4[] = {"w", "z"}; |
12889 CheckOwnProperties( | 14322 CheckOwnProperties( |
12890 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4); | 14323 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4); |
12891 } | 14324 } |
12892 | 14325 |
12893 | 14326 |
12894 THREADED_TEST(PropertyEnumeration2) { | 14327 THREADED_TEST(PropertyEnumeration2) { |
12895 LocalContext context; | 14328 LocalContext context; |
12896 v8::Isolate* isolate = context->GetIsolate(); | 14329 v8::Isolate* isolate = context->GetIsolate(); |
12897 v8::HandleScope scope(isolate); | 14330 v8::HandleScope scope(isolate); |
12898 v8::Handle<v8::Value> obj = CompileRun( | 14331 v8::Local<v8::Value> obj = CompileRun( |
12899 "var result = [];" | 14332 "var result = [];" |
12900 "result[0] = {};" | 14333 "result[0] = {};" |
12901 "result[1] = {a: 1, b: 2};" | 14334 "result[1] = {a: 1, b: 2};" |
12902 "result[2] = [1, 2, 3];" | 14335 "result[2] = [1, 2, 3];" |
12903 "var proto = {x: 1, y: 2, z: 3};" | 14336 "var proto = {x: 1, y: 2, z: 3};" |
12904 "var x = { __proto__: proto, w: 0, z: 1 };" | 14337 "var x = { __proto__: proto, w: 0, z: 1 };" |
12905 "result[3] = x;" | 14338 "result[3] = x;" |
12906 "result;"); | 14339 "result;"); |
12907 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); | 14340 v8::Local<v8::Array> elms = obj.As<v8::Array>(); |
12908 CHECK_EQ(4u, elms->Length()); | 14341 CHECK_EQ(4u, elms->Length()); |
12909 int elmc0 = 0; | 14342 int elmc0 = 0; |
12910 const char** elmv0 = NULL; | 14343 const char** elmv0 = NULL; |
12911 CheckProperties(isolate, | 14344 CheckProperties(isolate, |
12912 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); | 14345 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); |
12913 | 14346 |
12914 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); | 14347 v8::Local<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); |
12915 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); | 14348 v8::Local<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); |
12916 CHECK_EQ(0u, props->Length()); | 14349 CHECK_EQ(0u, props->Length()); |
12917 for (uint32_t i = 0; i < props->Length(); i++) { | 14350 for (uint32_t i = 0; i < props->Length(); i++) { |
12918 printf("p[%u]\n", i); | 14351 printf("p[%u]\n", i); |
12919 } | 14352 } |
12920 } | 14353 } |
12921 | 14354 |
12922 | 14355 |
12923 THREADED_TEST(AccessChecksReenabledCorrectly) { | 14356 THREADED_TEST(AccessChecksReenabledCorrectly) { |
12924 LocalContext context; | 14357 LocalContext context; |
12925 v8::Isolate* isolate = context->GetIsolate(); | 14358 v8::Isolate* isolate = context->GetIsolate(); |
(...skipping 10 matching lines...) Expand all Loading... | |
12936 for (char j = '0'; j <= '9'; j++) { | 14369 for (char j = '0'; j <= '9'; j++) { |
12937 buf[1] = j; | 14370 buf[1] = j; |
12938 for (char k = '0'; k <= '9'; k++) { | 14371 for (char k = '0'; k <= '9'; k++) { |
12939 buf[2] = k; | 14372 buf[2] = k; |
12940 buf[3] = 0; | 14373 buf[3] = 0; |
12941 templ->Set(v8_str(buf), v8::Number::New(isolate, k)); | 14374 templ->Set(v8_str(buf), v8::Number::New(isolate, k)); |
12942 } | 14375 } |
12943 } | 14376 } |
12944 } | 14377 } |
12945 | 14378 |
12946 Local<v8::Object> instance_1 = templ->NewInstance(); | 14379 Local<v8::Object> instance_1 = |
12947 context->Global()->Set(v8_str("obj_1"), instance_1); | 14380 templ->NewInstance(context.local()).ToLocalChecked(); |
14381 CHECK(context->Global() | |
14382 ->Set(context.local(), v8_str("obj_1"), instance_1) | |
14383 .FromJust()); | |
12948 | 14384 |
12949 Local<Value> value_1 = CompileRun("obj_1.a"); | 14385 Local<Value> value_1 = CompileRun("obj_1.a"); |
12950 CHECK(value_1.IsEmpty()); | 14386 CHECK(value_1.IsEmpty()); |
12951 | 14387 |
12952 Local<v8::Object> instance_2 = templ->NewInstance(); | 14388 Local<v8::Object> instance_2 = |
12953 context->Global()->Set(v8_str("obj_2"), instance_2); | 14389 templ->NewInstance(context.local()).ToLocalChecked(); |
14390 CHECK(context->Global() | |
14391 ->Set(context.local(), v8_str("obj_2"), instance_2) | |
14392 .FromJust()); | |
12954 | 14393 |
12955 Local<Value> value_2 = CompileRun("obj_2.a"); | 14394 Local<Value> value_2 = CompileRun("obj_2.a"); |
12956 CHECK(value_2.IsEmpty()); | 14395 CHECK(value_2.IsEmpty()); |
12957 } | 14396 } |
12958 | 14397 |
12959 | 14398 |
12960 // Tests that ScriptData can be serialized and deserialized. | 14399 // Tests that ScriptData can be serialized and deserialized. |
12961 TEST(PreCompileSerialization) { | 14400 TEST(PreCompileSerialization) { |
12962 v8::V8::Initialize(); | 14401 v8::V8::Initialize(); |
12963 LocalContext env; | 14402 LocalContext env; |
(...skipping 25 matching lines...) Expand all Loading... | |
12989 // This tests that we do not allow dictionary load/call inline caches | 14428 // This tests that we do not allow dictionary load/call inline caches |
12990 // to use functions that have not yet been compiled. The potential | 14429 // to use functions that have not yet been compiled. The potential |
12991 // problem of loading a function that has not yet been compiled can | 14430 // problem of loading a function that has not yet been compiled can |
12992 // arise because we share code between contexts via the compilation | 14431 // arise because we share code between contexts via the compilation |
12993 // cache. | 14432 // cache. |
12994 THREADED_TEST(DictionaryICLoadedFunction) { | 14433 THREADED_TEST(DictionaryICLoadedFunction) { |
12995 v8::HandleScope scope(CcTest::isolate()); | 14434 v8::HandleScope scope(CcTest::isolate()); |
12996 // Test LoadIC. | 14435 // Test LoadIC. |
12997 for (int i = 0; i < 2; i++) { | 14436 for (int i = 0; i < 2; i++) { |
12998 LocalContext context; | 14437 LocalContext context; |
12999 context->Global()->Set(v8_str("tmp"), v8::True(CcTest::isolate())); | 14438 CHECK(context->Global() |
14439 ->Set(context.local(), v8_str("tmp"), v8::True(CcTest::isolate())) | |
14440 .FromJust()); | |
13000 context->Global()->Delete(v8_str("tmp")); | 14441 context->Global()->Delete(v8_str("tmp")); |
13001 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');"); | 14442 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');"); |
13002 } | 14443 } |
13003 // Test CallIC. | 14444 // Test CallIC. |
13004 for (int i = 0; i < 2; i++) { | 14445 for (int i = 0; i < 2; i++) { |
13005 LocalContext context; | 14446 LocalContext context; |
13006 context->Global()->Set(v8_str("tmp"), v8::True(CcTest::isolate())); | 14447 CHECK(context->Global() |
14448 ->Set(context.local(), v8_str("tmp"), v8::True(CcTest::isolate())) | |
14449 .FromJust()); | |
13007 context->Global()->Delete(v8_str("tmp")); | 14450 context->Global()->Delete(v8_str("tmp")); |
13008 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); | 14451 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); |
13009 } | 14452 } |
13010 } | 14453 } |
13011 | 14454 |
13012 | 14455 |
13013 // Test that cross-context new calls use the context of the callee to | 14456 // Test that cross-context new calls use the context of the callee to |
13014 // create the new JavaScript object. | 14457 // create the new JavaScript object. |
13015 THREADED_TEST(CrossContextNew) { | 14458 THREADED_TEST(CrossContextNew) { |
13016 v8::Isolate* isolate = CcTest::isolate(); | 14459 v8::Isolate* isolate = CcTest::isolate(); |
13017 v8::HandleScope scope(isolate); | 14460 v8::HandleScope scope(isolate); |
13018 v8::Local<Context> context0 = Context::New(isolate); | 14461 v8::Local<Context> context0 = Context::New(isolate); |
13019 v8::Local<Context> context1 = Context::New(isolate); | 14462 v8::Local<Context> context1 = Context::New(isolate); |
13020 | 14463 |
13021 // Allow cross-domain access. | 14464 // Allow cross-domain access. |
13022 Local<String> token = v8_str("<security token>"); | 14465 Local<String> token = v8_str("<security token>"); |
13023 context0->SetSecurityToken(token); | 14466 context0->SetSecurityToken(token); |
13024 context1->SetSecurityToken(token); | 14467 context1->SetSecurityToken(token); |
13025 | 14468 |
13026 // Set an 'x' property on the Object prototype and define a | 14469 // Set an 'x' property on the Object prototype and define a |
13027 // constructor function in context0. | 14470 // constructor function in context0. |
13028 context0->Enter(); | 14471 context0->Enter(); |
13029 CompileRun("Object.prototype.x = 42; function C() {};"); | 14472 CompileRun("Object.prototype.x = 42; function C() {};"); |
13030 context0->Exit(); | 14473 context0->Exit(); |
13031 | 14474 |
13032 // Call the constructor function from context0 and check that the | 14475 // Call the constructor function from context0 and check that the |
13033 // result has the 'x' property. | 14476 // result has the 'x' property. |
13034 context1->Enter(); | 14477 context1->Enter(); |
13035 context1->Global()->Set(v8_str("other"), context0->Global()); | 14478 CHECK(context1->Global() |
14479 ->Set(context1, v8_str("other"), context0->Global()) | |
14480 .FromJust()); | |
13036 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); | 14481 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); |
13037 CHECK(value->IsInt32()); | 14482 CHECK(value->IsInt32()); |
13038 CHECK_EQ(42, value->Int32Value()); | 14483 CHECK_EQ(42, value->Int32Value(context1).FromJust()); |
13039 context1->Exit(); | 14484 context1->Exit(); |
13040 } | 14485 } |
13041 | 14486 |
13042 | 14487 |
13043 // Verify that we can clone an object | 14488 // Verify that we can clone an object |
13044 TEST(ObjectClone) { | 14489 TEST(ObjectClone) { |
13045 LocalContext env; | 14490 LocalContext env; |
13046 v8::Isolate* isolate = env->GetIsolate(); | 14491 v8::Isolate* isolate = env->GetIsolate(); |
13047 v8::HandleScope scope(isolate); | 14492 v8::HandleScope scope(isolate); |
13048 | 14493 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13139 i::Vector<const uint16_t>(two_byte_string, | 14584 i::Vector<const uint16_t>(two_byte_string, |
13140 i::StrLength(c_string))); | 14585 i::StrLength(c_string))); |
13141 | 14586 |
13142 Local<String> lhs( | 14587 Local<String> lhs( |
13143 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( | 14588 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( |
13144 &one_byte_resource).ToHandleChecked())); | 14589 &one_byte_resource).ToHandleChecked())); |
13145 Local<String> rhs( | 14590 Local<String> rhs( |
13146 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( | 14591 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( |
13147 &one_byte_resource).ToHandleChecked())); | 14592 &one_byte_resource).ToHandleChecked())); |
13148 | 14593 |
13149 env->Global()->Set(v8_str("lhs"), lhs); | 14594 CHECK(env->Global()->Set(env.local(), v8_str("lhs"), lhs).FromJust()); |
13150 env->Global()->Set(v8_str("rhs"), rhs); | 14595 CHECK(env->Global()->Set(env.local(), v8_str("rhs"), rhs).FromJust()); |
13151 | 14596 |
13152 CompileRun( | 14597 CompileRun( |
13153 "var cons = lhs + rhs;" | 14598 "var cons = lhs + rhs;" |
13154 "var slice = lhs.substring(1, lhs.length - 1);" | 14599 "var slice = lhs.substring(1, lhs.length - 1);" |
13155 "var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);"); | 14600 "var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);"); |
13156 | 14601 |
13157 CHECK(lhs->IsOneByte()); | 14602 CHECK(lhs->IsOneByte()); |
13158 CHECK(rhs->IsOneByte()); | 14603 CHECK(rhs->IsOneByte()); |
13159 | 14604 |
13160 MorphAString(*v8::Utils::OpenHandle(*lhs), &one_byte_resource, | 14605 MorphAString(*v8::Utils::OpenHandle(*lhs), &one_byte_resource, |
13161 &uc16_resource); | 14606 &uc16_resource); |
13162 MorphAString(*v8::Utils::OpenHandle(*rhs), &one_byte_resource, | 14607 MorphAString(*v8::Utils::OpenHandle(*rhs), &one_byte_resource, |
13163 &uc16_resource); | 14608 &uc16_resource); |
13164 | 14609 |
13165 // This should UTF-8 without flattening, since everything is ASCII. | 14610 // This should UTF-8 without flattening, since everything is ASCII. |
13166 Handle<String> cons = v8_compile("cons")->Run().As<String>(); | 14611 Local<String> cons = v8_compile("cons")->Run().As<String>(); |
13167 CHECK_EQ(128, cons->Utf8Length()); | 14612 CHECK_EQ(128, cons->Utf8Length()); |
13168 int nchars = -1; | 14613 int nchars = -1; |
13169 CHECK_EQ(129, cons->WriteUtf8(utf_buffer, -1, &nchars)); | 14614 CHECK_EQ(129, cons->WriteUtf8(utf_buffer, -1, &nchars)); |
13170 CHECK_EQ(128, nchars); | 14615 CHECK_EQ(128, nchars); |
13171 CHECK_EQ(0, strcmp( | 14616 CHECK_EQ(0, strcmp( |
13172 utf_buffer, | 14617 utf_buffer, |
13173 "Now is the time for all good men to come to the aid of the party" | 14618 "Now is the time for all good men to come to the aid of the party" |
13174 "Now is the time for all good men to come to the aid of the party")); | 14619 "Now is the time for all good men to come to the aid of the party")); |
13175 | 14620 |
13176 // Now do some stuff to make sure the strings are flattened, etc. | 14621 // Now do some stuff to make sure the strings are flattened, etc. |
13177 CompileRun( | 14622 CompileRun( |
13178 "/[^a-z]/.test(cons);" | 14623 "/[^a-z]/.test(cons);" |
13179 "/[^a-z]/.test(slice);" | 14624 "/[^a-z]/.test(slice);" |
13180 "/[^a-z]/.test(slice_on_cons);"); | 14625 "/[^a-z]/.test(slice_on_cons);"); |
13181 const char* expected_cons = | 14626 const char* expected_cons = |
13182 "Now is the time for all good men to come to the aid of the party" | 14627 "Now is the time for all good men to come to the aid of the party" |
13183 "Now is the time for all good men to come to the aid of the party"; | 14628 "Now is the time for all good men to come to the aid of the party"; |
13184 const char* expected_slice = | 14629 const char* expected_slice = |
13185 "ow is the time for all good men to come to the aid of the part"; | 14630 "ow is the time for all good men to come to the aid of the part"; |
13186 const char* expected_slice_on_cons = | 14631 const char* expected_slice_on_cons = |
13187 "ow is the time for all good men to come to the aid of the party" | 14632 "ow is the time for all good men to come to the aid of the party" |
13188 "Now is the time for all good men to come to the aid of the part"; | 14633 "Now is the time for all good men to come to the aid of the part"; |
13189 CHECK(String::NewFromUtf8(env->GetIsolate(), expected_cons) | 14634 CHECK(v8_str(expected_cons)->Equals(env->Global()->Get(v8_str("cons")))); |
13190 ->Equals(env->Global()->Get(v8_str("cons")))); | 14635 CHECK(v8_str(expected_slice)->Equals(env->Global()->Get(v8_str("slice")))); |
13191 CHECK(String::NewFromUtf8(env->GetIsolate(), expected_slice) | 14636 CHECK(v8_str(expected_slice_on_cons) |
13192 ->Equals(env->Global()->Get(v8_str("slice")))); | |
13193 CHECK(String::NewFromUtf8(env->GetIsolate(), expected_slice_on_cons) | |
13194 ->Equals(env->Global()->Get(v8_str("slice_on_cons")))); | 14637 ->Equals(env->Global()->Get(v8_str("slice_on_cons")))); |
13195 } | 14638 } |
13196 i::DeleteArray(two_byte_string); | 14639 i::DeleteArray(two_byte_string); |
13197 } | 14640 } |
13198 | 14641 |
13199 | 14642 |
13200 TEST(CompileExternalTwoByteSource) { | 14643 TEST(CompileExternalTwoByteSource) { |
13201 LocalContext context; | 14644 LocalContext context; |
13202 v8::HandleScope scope(context->GetIsolate()); | 14645 v8::HandleScope scope(context->GetIsolate()); |
13203 | 14646 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13297 } | 14740 } |
13298 | 14741 |
13299 #endif // V8_INTERPRETED_REGEXP | 14742 #endif // V8_INTERPRETED_REGEXP |
13300 | 14743 |
13301 | 14744 |
13302 // Test that we cannot set a property on the global object if there | 14745 // Test that we cannot set a property on the global object if there |
13303 // is a read-only property in the prototype chain. | 14746 // is a read-only property in the prototype chain. |
13304 TEST(ReadOnlyPropertyInGlobalProto) { | 14747 TEST(ReadOnlyPropertyInGlobalProto) { |
13305 v8::Isolate* isolate = CcTest::isolate(); | 14748 v8::Isolate* isolate = CcTest::isolate(); |
13306 v8::HandleScope scope(isolate); | 14749 v8::HandleScope scope(isolate); |
13307 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 14750 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
13308 LocalContext context(0, templ); | 14751 LocalContext context(0, templ); |
13309 v8::Handle<v8::Object> global = context->Global(); | 14752 v8::Local<v8::Object> global = context->Global(); |
13310 v8::Handle<v8::Object> global_proto = | 14753 v8::Local<v8::Object> global_proto = |
13311 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); | 14754 v8::Local<v8::Object>::Cast(global->Get(v8_str("__proto__"))); |
13312 global_proto->ForceSet(v8_str("x"), v8::Integer::New(isolate, 0), | 14755 global_proto->ForceSet(v8_str("x"), v8::Integer::New(isolate, 0), |
13313 v8::ReadOnly); | 14756 v8::ReadOnly); |
13314 global_proto->ForceSet(v8_str("y"), v8::Integer::New(isolate, 0), | 14757 global_proto->ForceSet(v8_str("y"), v8::Integer::New(isolate, 0), |
13315 v8::ReadOnly); | 14758 v8::ReadOnly); |
13316 // Check without 'eval' or 'with'. | 14759 // Check without 'eval' or 'with'. |
13317 v8::Handle<v8::Value> res = | 14760 v8::Local<v8::Value> res = |
13318 CompileRun("function f() { x = 42; return x; }; f()"); | 14761 CompileRun("function f() { x = 42; return x; }; f()"); |
13319 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); | 14762 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); |
13320 // Check with 'eval'. | 14763 // Check with 'eval'. |
13321 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); | 14764 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); |
13322 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); | 14765 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); |
13323 // Check with 'with'. | 14766 // Check with 'with'. |
13324 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); | 14767 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); |
13325 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); | 14768 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); |
13326 } | 14769 } |
13327 | 14770 |
(...skipping 30 matching lines...) Expand all Loading... | |
13358 } | 14801 } |
13359 | 14802 |
13360 | 14803 |
13361 TEST(ForceSet) { | 14804 TEST(ForceSet) { |
13362 force_set_get_count = 0; | 14805 force_set_get_count = 0; |
13363 force_set_set_count = 0; | 14806 force_set_set_count = 0; |
13364 pass_on_get = false; | 14807 pass_on_get = false; |
13365 | 14808 |
13366 v8::Isolate* isolate = CcTest::isolate(); | 14809 v8::Isolate* isolate = CcTest::isolate(); |
13367 v8::HandleScope scope(isolate); | 14810 v8::HandleScope scope(isolate); |
13368 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 14811 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
13369 v8::Handle<v8::String> access_property = | 14812 v8::Local<v8::String> access_property = v8_str("a"); |
13370 v8::String::NewFromUtf8(isolate, "a"); | |
13371 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); | 14813 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); |
13372 LocalContext context(NULL, templ); | 14814 LocalContext context(NULL, templ); |
13373 v8::Handle<v8::Object> global = context->Global(); | 14815 v8::Local<v8::Object> global = context->Global(); |
13374 | 14816 |
13375 // Ordinary properties | 14817 // Ordinary properties |
13376 v8::Handle<v8::String> simple_property = | 14818 v8::Local<v8::String> simple_property = v8_str("p"); |
13377 v8::String::NewFromUtf8(isolate, "p"); | |
13378 global->ForceSet(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly); | 14819 global->ForceSet(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly); |
13379 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 14820 CHECK_EQ( |
14821 4, global->Get(simple_property)->Int32Value(context.local()).FromJust()); | |
13380 // This should fail because the property is read-only | 14822 // This should fail because the property is read-only |
13381 global->Set(simple_property, v8::Int32::New(isolate, 5)); | 14823 global->Set(simple_property, v8::Int32::New(isolate, 5)); |
13382 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); | 14824 CHECK_EQ( |
14825 4, global->Get(simple_property)->Int32Value(context.local()).FromJust()); | |
13383 // This should succeed even though the property is read-only | 14826 // This should succeed even though the property is read-only |
13384 global->ForceSet(simple_property, v8::Int32::New(isolate, 6)); | 14827 global->ForceSet(simple_property, v8::Int32::New(isolate, 6)); |
13385 CHECK_EQ(6, global->Get(simple_property)->Int32Value()); | 14828 CHECK_EQ( |
14829 6, global->Get(simple_property)->Int32Value(context.local()).FromJust()); | |
13386 | 14830 |
13387 // Accessors | 14831 // Accessors |
13388 CHECK_EQ(0, force_set_set_count); | 14832 CHECK_EQ(0, force_set_set_count); |
13389 CHECK_EQ(0, force_set_get_count); | 14833 CHECK_EQ(0, force_set_get_count); |
13390 CHECK_EQ(3, global->Get(access_property)->Int32Value()); | 14834 CHECK_EQ( |
14835 3, global->Get(access_property)->Int32Value(context.local()).FromJust()); | |
13391 // CHECK_EQ the property shouldn't override it, just call the setter | 14836 // CHECK_EQ the property shouldn't override it, just call the setter |
13392 // which in this case does nothing. | 14837 // which in this case does nothing. |
13393 global->Set(access_property, v8::Int32::New(isolate, 7)); | 14838 global->Set(access_property, v8::Int32::New(isolate, 7)); |
13394 CHECK_EQ(3, global->Get(access_property)->Int32Value()); | 14839 CHECK_EQ( |
14840 3, global->Get(access_property)->Int32Value(context.local()).FromJust()); | |
13395 CHECK_EQ(1, force_set_set_count); | 14841 CHECK_EQ(1, force_set_set_count); |
13396 CHECK_EQ(2, force_set_get_count); | 14842 CHECK_EQ(2, force_set_get_count); |
13397 // ForceSet doesn't call the accessors for now. | 14843 // ForceSet doesn't call the accessors for now. |
13398 // TODO(verwaest): Update once blink doesn't rely on ForceSet to delete api | 14844 // TODO(verwaest): Update once blink doesn't rely on ForceSet to delete api |
13399 // accessors. | 14845 // accessors. |
13400 global->ForceSet(access_property, v8::Int32::New(isolate, 8)); | 14846 global->ForceSet(access_property, v8::Int32::New(isolate, 8)); |
13401 CHECK_EQ(8, global->Get(access_property)->Int32Value()); | 14847 CHECK_EQ( |
14848 8, global->Get(access_property)->Int32Value(context.local()).FromJust()); | |
13402 CHECK_EQ(1, force_set_set_count); | 14849 CHECK_EQ(1, force_set_set_count); |
13403 CHECK_EQ(2, force_set_get_count); | 14850 CHECK_EQ(2, force_set_get_count); |
13404 } | 14851 } |
13405 | 14852 |
13406 | 14853 |
13407 TEST(ForceSetWithInterceptor) { | 14854 TEST(ForceSetWithInterceptor) { |
13408 v8::Isolate* isolate = CcTest::isolate(); | 14855 v8::Isolate* isolate = CcTest::isolate(); |
13409 v8::HandleScope scope(isolate); | 14856 v8::HandleScope scope(isolate); |
13410 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 14857 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
13411 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 14858 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
13412 ForceSetInterceptGetter, ForceSetInterceptSetter)); | 14859 ForceSetInterceptGetter, ForceSetInterceptSetter)); |
13413 pass_on_get = true; | 14860 pass_on_get = true; |
13414 LocalContext context(NULL, templ); | 14861 LocalContext context(NULL, templ); |
13415 v8::Handle<v8::Object> global = context->Global(); | 14862 v8::Local<v8::Object> global = context->Global(); |
13416 | 14863 |
13417 force_set_get_count = 0; | 14864 force_set_get_count = 0; |
13418 force_set_set_count = 0; | 14865 force_set_set_count = 0; |
13419 pass_on_get = false; | 14866 pass_on_get = false; |
13420 | 14867 |
13421 v8::Handle<v8::String> some_property = | 14868 v8::Local<v8::String> some_property = v8_str("a"); |
13422 v8::String::NewFromUtf8(isolate, "a"); | |
13423 CHECK_EQ(0, force_set_set_count); | 14869 CHECK_EQ(0, force_set_set_count); |
13424 CHECK_EQ(0, force_set_get_count); | 14870 CHECK_EQ(0, force_set_get_count); |
13425 CHECK_EQ(3, global->Get(some_property)->Int32Value()); | 14871 CHECK_EQ(3, |
14872 global->Get(some_property)->Int32Value(context.local()).FromJust()); | |
13426 // Setting the property shouldn't override it, just call the setter | 14873 // Setting the property shouldn't override it, just call the setter |
13427 // which in this case does nothing. | 14874 // which in this case does nothing. |
13428 global->Set(some_property, v8::Int32::New(isolate, 7)); | 14875 global->Set(some_property, v8::Int32::New(isolate, 7)); |
13429 CHECK_EQ(3, global->Get(some_property)->Int32Value()); | 14876 CHECK_EQ(3, |
14877 global->Get(some_property)->Int32Value(context.local()).FromJust()); | |
13430 CHECK_EQ(1, force_set_set_count); | 14878 CHECK_EQ(1, force_set_set_count); |
13431 CHECK_EQ(2, force_set_get_count); | 14879 CHECK_EQ(2, force_set_get_count); |
13432 // Getting the property when the interceptor returns an empty handle | 14880 // Getting the property when the interceptor returns an empty handle |
13433 // should yield undefined, since the property isn't present on the | 14881 // should yield undefined, since the property isn't present on the |
13434 // object itself yet. | 14882 // object itself yet. |
13435 pass_on_get = true; | 14883 pass_on_get = true; |
13436 CHECK(global->Get(some_property)->IsUndefined()); | 14884 CHECK(global->Get(some_property)->IsUndefined()); |
13437 CHECK_EQ(1, force_set_set_count); | 14885 CHECK_EQ(1, force_set_set_count); |
13438 CHECK_EQ(3, force_set_get_count); | 14886 CHECK_EQ(3, force_set_get_count); |
13439 // Forcing the property to be set should cause the value to be | 14887 // Forcing the property to be set should cause the value to be |
13440 // set locally without calling the interceptor. | 14888 // set locally without calling the interceptor. |
13441 global->ForceSet(some_property, v8::Int32::New(isolate, 8)); | 14889 global->ForceSet(some_property, v8::Int32::New(isolate, 8)); |
13442 CHECK_EQ(8, global->Get(some_property)->Int32Value()); | 14890 CHECK_EQ(8, |
14891 global->Get(some_property)->Int32Value(context.local()).FromJust()); | |
13443 CHECK_EQ(1, force_set_set_count); | 14892 CHECK_EQ(1, force_set_set_count); |
13444 CHECK_EQ(4, force_set_get_count); | 14893 CHECK_EQ(4, force_set_get_count); |
13445 // Reenabling the interceptor should cause it to take precedence over | 14894 // Reenabling the interceptor should cause it to take precedence over |
13446 // the property | 14895 // the property |
13447 pass_on_get = false; | 14896 pass_on_get = false; |
13448 CHECK_EQ(3, global->Get(some_property)->Int32Value()); | 14897 CHECK_EQ(3, |
14898 global->Get(some_property)->Int32Value(context.local()).FromJust()); | |
13449 CHECK_EQ(1, force_set_set_count); | 14899 CHECK_EQ(1, force_set_set_count); |
13450 CHECK_EQ(5, force_set_get_count); | 14900 CHECK_EQ(5, force_set_get_count); |
13451 // The interceptor should also work for other properties | 14901 // The interceptor should also work for other properties |
13452 CHECK_EQ(3, global->Get(v8::String::NewFromUtf8(isolate, "b")) | 14902 CHECK_EQ(3, global->Get(v8_str("b"))->Int32Value(context.local()).FromJust()); |
13453 ->Int32Value()); | |
13454 CHECK_EQ(1, force_set_set_count); | 14903 CHECK_EQ(1, force_set_set_count); |
13455 CHECK_EQ(6, force_set_get_count); | 14904 CHECK_EQ(6, force_set_get_count); |
13456 } | 14905 } |
13457 | 14906 |
13458 | 14907 |
13459 TEST(CreateDataProperty) { | 14908 TEST(CreateDataProperty) { |
13460 LocalContext env; | 14909 LocalContext env; |
13461 v8::Isolate* isolate = env->GetIsolate(); | 14910 v8::Isolate* isolate = env->GetIsolate(); |
13462 v8::HandleScope handle_scope(isolate); | 14911 v8::HandleScope handle_scope(isolate); |
13463 | 14912 |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13690 } | 15139 } |
13691 | 15140 |
13692 | 15141 |
13693 // Check that a variable declaration with no explicit initialization | 15142 // Check that a variable declaration with no explicit initialization |
13694 // value does shadow an existing property in the prototype chain. | 15143 // value does shadow an existing property in the prototype chain. |
13695 THREADED_TEST(InitGlobalVarInProtoChain) { | 15144 THREADED_TEST(InitGlobalVarInProtoChain) { |
13696 LocalContext context; | 15145 LocalContext context; |
13697 v8::HandleScope scope(context->GetIsolate()); | 15146 v8::HandleScope scope(context->GetIsolate()); |
13698 // Introduce a variable in the prototype chain. | 15147 // Introduce a variable in the prototype chain. |
13699 CompileRun("__proto__.x = 42"); | 15148 CompileRun("__proto__.x = 42"); |
13700 v8::Handle<v8::Value> result = CompileRun("var x = 43; x"); | 15149 v8::Local<v8::Value> result = CompileRun("var x = 43; x"); |
13701 CHECK(!result->IsUndefined()); | 15150 CHECK(!result->IsUndefined()); |
13702 CHECK_EQ(43, result->Int32Value()); | 15151 CHECK_EQ(43, result->Int32Value(context.local()).FromJust()); |
13703 } | 15152 } |
13704 | 15153 |
13705 | 15154 |
13706 // Regression test for issue 398. | 15155 // Regression test for issue 398. |
13707 // If a function is added to an object, creating a constant function | 15156 // If a function is added to an object, creating a constant function |
13708 // field, and the result is cloned, replacing the constant function on the | 15157 // field, and the result is cloned, replacing the constant function on the |
13709 // original should not affect the clone. | 15158 // original should not affect the clone. |
13710 // See http://code.google.com/p/v8/issues/detail?id=398 | 15159 // See http://code.google.com/p/v8/issues/detail?id=398 |
13711 THREADED_TEST(ReplaceConstantFunction) { | 15160 THREADED_TEST(ReplaceConstantFunction) { |
13712 LocalContext context; | 15161 LocalContext context; |
13713 v8::Isolate* isolate = context->GetIsolate(); | 15162 v8::Isolate* isolate = context->GetIsolate(); |
13714 v8::HandleScope scope(isolate); | 15163 v8::HandleScope scope(isolate); |
13715 v8::Handle<v8::Object> obj = v8::Object::New(isolate); | 15164 v8::Local<v8::Object> obj = v8::Object::New(isolate); |
13716 v8::Handle<v8::FunctionTemplate> func_templ = | 15165 v8::Local<v8::FunctionTemplate> func_templ = |
13717 v8::FunctionTemplate::New(isolate); | 15166 v8::FunctionTemplate::New(isolate); |
13718 v8::Handle<v8::String> foo_string = | 15167 v8::Local<v8::String> foo_string = v8_str("foo"); |
13719 v8::String::NewFromUtf8(isolate, "foo"); | 15168 obj->Set(foo_string, |
13720 obj->Set(foo_string, func_templ->GetFunction()); | 15169 func_templ->GetFunction(context.local()).ToLocalChecked()); |
13721 v8::Handle<v8::Object> obj_clone = obj->Clone(); | 15170 v8::Local<v8::Object> obj_clone = obj->Clone(); |
13722 obj_clone->Set(foo_string, | 15171 obj_clone->Set(foo_string, v8_str("Hello")); |
13723 v8::String::NewFromUtf8(isolate, "Hello")); | |
13724 CHECK(!obj->Get(foo_string)->IsUndefined()); | 15172 CHECK(!obj->Get(foo_string)->IsUndefined()); |
13725 } | 15173 } |
13726 | 15174 |
13727 | 15175 |
13728 static void CheckElementValue(i::Isolate* isolate, | 15176 static void CheckElementValue(i::Isolate* isolate, |
13729 int expected, | 15177 int expected, |
13730 i::Handle<i::Object> obj, | 15178 i::Handle<i::Object> obj, |
13731 int offset) { | 15179 int offset) { |
13732 i::Object* element = | 15180 i::Object* element = |
13733 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked(); | 15181 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked(); |
13734 CHECK_EQ(expected, i::Smi::cast(element)->value()); | 15182 CHECK_EQ(expected, i::Smi::cast(element)->value()); |
13735 } | 15183 } |
13736 | 15184 |
13737 | 15185 |
13738 template <class ExternalArrayClass, class ElementType> | 15186 template <class ExternalArrayClass, class ElementType> |
13739 static void ObjectWithExternalArrayTestHelper(Handle<Context> context, | 15187 static void ObjectWithExternalArrayTestHelper(Local<Context> context, |
13740 v8::Handle<Object> obj, | 15188 v8::Local<Object> obj, |
13741 int element_count, | 15189 int element_count, |
13742 i::ExternalArrayType array_type, | 15190 i::ExternalArrayType array_type, |
13743 int64_t low, int64_t high) { | 15191 int64_t low, int64_t high) { |
13744 i::Handle<i::JSReceiver> jsobj = v8::Utils::OpenHandle(*obj); | 15192 i::Handle<i::JSReceiver> jsobj = v8::Utils::OpenHandle(*obj); |
13745 i::Isolate* isolate = jsobj->GetIsolate(); | 15193 i::Isolate* isolate = jsobj->GetIsolate(); |
13746 obj->Set(v8_str("field"), | 15194 obj->Set(v8_str("field"), |
13747 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503)); | 15195 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503)); |
13748 context->Global()->Set(v8_str("ext_array"), obj); | 15196 CHECK(context->Global()->Set(context, v8_str("ext_array"), obj).FromJust()); |
13749 v8::Handle<v8::Value> result = CompileRun("ext_array.field"); | 15197 v8::Local<v8::Value> result = CompileRun("ext_array.field"); |
13750 CHECK_EQ(1503, result->Int32Value()); | 15198 CHECK_EQ(1503, result->Int32Value(context).FromJust()); |
13751 result = CompileRun("ext_array[1]"); | 15199 result = CompileRun("ext_array[1]"); |
13752 CHECK_EQ(1, result->Int32Value()); | 15200 CHECK_EQ(1, result->Int32Value(context).FromJust()); |
13753 | 15201 |
13754 // Check assigned smis | 15202 // Check assigned smis |
13755 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15203 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13756 " ext_array[i] = i;" | 15204 " ext_array[i] = i;" |
13757 "}" | 15205 "}" |
13758 "var sum = 0;" | 15206 "var sum = 0;" |
13759 "for (var i = 0; i < 8; i++) {" | 15207 "for (var i = 0; i < 8; i++) {" |
13760 " sum += ext_array[i];" | 15208 " sum += ext_array[i];" |
13761 "}" | 15209 "}" |
13762 "sum;"); | 15210 "sum;"); |
13763 | 15211 |
13764 CHECK_EQ(28, result->Int32Value()); | 15212 CHECK_EQ(28, result->Int32Value(context).FromJust()); |
13765 // Check pass through of assigned smis | 15213 // Check pass through of assigned smis |
13766 result = CompileRun("var sum = 0;" | 15214 result = CompileRun("var sum = 0;" |
13767 "for (var i = 0; i < 8; i++) {" | 15215 "for (var i = 0; i < 8; i++) {" |
13768 " sum += ext_array[i] = ext_array[i] = -i;" | 15216 " sum += ext_array[i] = ext_array[i] = -i;" |
13769 "}" | 15217 "}" |
13770 "sum;"); | 15218 "sum;"); |
13771 CHECK_EQ(-28, result->Int32Value()); | 15219 CHECK_EQ(-28, result->Int32Value(context).FromJust()); |
13772 | 15220 |
13773 | 15221 |
13774 // Check assigned smis in reverse order | 15222 // Check assigned smis in reverse order |
13775 result = CompileRun("for (var i = 8; --i >= 0; ) {" | 15223 result = CompileRun("for (var i = 8; --i >= 0; ) {" |
13776 " ext_array[i] = i;" | 15224 " ext_array[i] = i;" |
13777 "}" | 15225 "}" |
13778 "var sum = 0;" | 15226 "var sum = 0;" |
13779 "for (var i = 0; i < 8; i++) {" | 15227 "for (var i = 0; i < 8; i++) {" |
13780 " sum += ext_array[i];" | 15228 " sum += ext_array[i];" |
13781 "}" | 15229 "}" |
13782 "sum;"); | 15230 "sum;"); |
13783 CHECK_EQ(28, result->Int32Value()); | 15231 CHECK_EQ(28, result->Int32Value(context).FromJust()); |
13784 | 15232 |
13785 // Check pass through of assigned HeapNumbers | 15233 // Check pass through of assigned HeapNumbers |
13786 result = CompileRun("var sum = 0;" | 15234 result = CompileRun("var sum = 0;" |
13787 "for (var i = 0; i < 16; i+=2) {" | 15235 "for (var i = 0; i < 16; i+=2) {" |
13788 " sum += ext_array[i] = ext_array[i] = (-i * 0.5);" | 15236 " sum += ext_array[i] = ext_array[i] = (-i * 0.5);" |
13789 "}" | 15237 "}" |
13790 "sum;"); | 15238 "sum;"); |
13791 CHECK_EQ(-28, result->Int32Value()); | 15239 CHECK_EQ(-28, result->Int32Value(context).FromJust()); |
13792 | 15240 |
13793 // Check assigned HeapNumbers | 15241 // Check assigned HeapNumbers |
13794 result = CompileRun("for (var i = 0; i < 16; i+=2) {" | 15242 result = CompileRun("for (var i = 0; i < 16; i+=2) {" |
13795 " ext_array[i] = (i * 0.5);" | 15243 " ext_array[i] = (i * 0.5);" |
13796 "}" | 15244 "}" |
13797 "var sum = 0;" | 15245 "var sum = 0;" |
13798 "for (var i = 0; i < 16; i+=2) {" | 15246 "for (var i = 0; i < 16; i+=2) {" |
13799 " sum += ext_array[i];" | 15247 " sum += ext_array[i];" |
13800 "}" | 15248 "}" |
13801 "sum;"); | 15249 "sum;"); |
13802 CHECK_EQ(28, result->Int32Value()); | 15250 CHECK_EQ(28, result->Int32Value(context).FromJust()); |
13803 | 15251 |
13804 // Check assigned HeapNumbers in reverse order | 15252 // Check assigned HeapNumbers in reverse order |
13805 result = CompileRun("for (var i = 14; i >= 0; i-=2) {" | 15253 result = CompileRun("for (var i = 14; i >= 0; i-=2) {" |
13806 " ext_array[i] = (i * 0.5);" | 15254 " ext_array[i] = (i * 0.5);" |
13807 "}" | 15255 "}" |
13808 "var sum = 0;" | 15256 "var sum = 0;" |
13809 "for (var i = 0; i < 16; i+=2) {" | 15257 "for (var i = 0; i < 16; i+=2) {" |
13810 " sum += ext_array[i];" | 15258 " sum += ext_array[i];" |
13811 "}" | 15259 "}" |
13812 "sum;"); | 15260 "sum;"); |
13813 CHECK_EQ(28, result->Int32Value()); | 15261 CHECK_EQ(28, result->Int32Value(context).FromJust()); |
13814 | 15262 |
13815 i::ScopedVector<char> test_buf(1024); | 15263 i::ScopedVector<char> test_buf(1024); |
13816 | 15264 |
13817 // Check legal boundary conditions. | 15265 // Check legal boundary conditions. |
13818 // The repeated loads and stores ensure the ICs are exercised. | 15266 // The repeated loads and stores ensure the ICs are exercised. |
13819 const char* boundary_program = | 15267 const char* boundary_program = |
13820 "var res = 0;" | 15268 "var res = 0;" |
13821 "for (var i = 0; i < 16; i++) {" | 15269 "for (var i = 0; i < 16; i++) {" |
13822 " ext_array[i] = %lld;" | 15270 " ext_array[i] = %lld;" |
13823 " if (i > 8) {" | 15271 " if (i > 8) {" |
(...skipping 19 matching lines...) Expand all Loading... | |
13843 "for (var i = 0; i < 8; i++) {" | 15291 "for (var i = 0; i < 8; i++) {" |
13844 " tmp_array[i] = i;" | 15292 " tmp_array[i] = i;" |
13845 " sum += tmp_array[i];" | 15293 " sum += tmp_array[i];" |
13846 " if (i == 4) {" | 15294 " if (i == 4) {" |
13847 " tmp_array = {};" | 15295 " tmp_array = {};" |
13848 " }" | 15296 " }" |
13849 "}" | 15297 "}" |
13850 "sum;"); | 15298 "sum;"); |
13851 // Force GC to trigger verification. | 15299 // Force GC to trigger verification. |
13852 CcTest::heap()->CollectAllGarbage(); | 15300 CcTest::heap()->CollectAllGarbage(); |
13853 CHECK_EQ(28, result->Int32Value()); | 15301 CHECK_EQ(28, result->Int32Value(context).FromJust()); |
13854 | 15302 |
13855 // Make sure out-of-range loads do not throw. | 15303 // Make sure out-of-range loads do not throw. |
13856 i::SNPrintF(test_buf, | 15304 i::SNPrintF(test_buf, |
13857 "var caught_exception = false;" | 15305 "var caught_exception = false;" |
13858 "try {" | 15306 "try {" |
13859 " ext_array[%d];" | 15307 " ext_array[%d];" |
13860 "} catch (e) {" | 15308 "} catch (e) {" |
13861 " caught_exception = true;" | 15309 " caught_exception = true;" |
13862 "}" | 15310 "}" |
13863 "caught_exception;", | 15311 "caught_exception;", |
(...skipping 12 matching lines...) Expand all Loading... | |
13876 "caught_exception;", | 15324 "caught_exception;", |
13877 element_count); | 15325 element_count); |
13878 result = CompileRun(test_buf.start()); | 15326 result = CompileRun(test_buf.start()); |
13879 CHECK_EQ(false, result->BooleanValue()); | 15327 CHECK_EQ(false, result->BooleanValue()); |
13880 | 15328 |
13881 // Check other boundary conditions, values and operations. | 15329 // Check other boundary conditions, values and operations. |
13882 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15330 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13883 " ext_array[7] = undefined;" | 15331 " ext_array[7] = undefined;" |
13884 "}" | 15332 "}" |
13885 "ext_array[7];"); | 15333 "ext_array[7];"); |
13886 CHECK_EQ(0, result->Int32Value()); | 15334 CHECK_EQ(0, result->Int32Value(context).FromJust()); |
13887 if (array_type == i::kExternalFloat64Array || | 15335 if (array_type == i::kExternalFloat64Array || |
13888 array_type == i::kExternalFloat32Array) { | 15336 array_type == i::kExternalFloat32Array) { |
13889 CHECK(std::isnan( | 15337 CHECK(std::isnan( |
13890 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number())); | 15338 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number())); |
13891 } else { | 15339 } else { |
13892 CheckElementValue(isolate, 0, jsobj, 7); | 15340 CheckElementValue(isolate, 0, jsobj, 7); |
13893 } | 15341 } |
13894 | 15342 |
13895 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15343 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13896 " ext_array[6] = '2.3';" | 15344 " ext_array[6] = '2.3';" |
13897 "}" | 15345 "}" |
13898 "ext_array[6];"); | 15346 "ext_array[6];"); |
13899 CHECK_EQ(2, result->Int32Value()); | 15347 CHECK_EQ(2, result->Int32Value(context).FromJust()); |
13900 CHECK_EQ(2, | 15348 CHECK_EQ(2, |
13901 static_cast<int>( | 15349 static_cast<int>( |
13902 i::Object::GetElement( | 15350 i::Object::GetElement( |
13903 isolate, jsobj, 6).ToHandleChecked()->Number())); | 15351 isolate, jsobj, 6).ToHandleChecked()->Number())); |
13904 | 15352 |
13905 if (array_type != i::kExternalFloat32Array && | 15353 if (array_type != i::kExternalFloat32Array && |
13906 array_type != i::kExternalFloat64Array) { | 15354 array_type != i::kExternalFloat64Array) { |
13907 // Though the specification doesn't state it, be explicit about | 15355 // Though the specification doesn't state it, be explicit about |
13908 // converting NaNs and +/-Infinity to zero. | 15356 // converting NaNs and +/-Infinity to zero. |
13909 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15357 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13910 " ext_array[i] = 5;" | 15358 " ext_array[i] = 5;" |
13911 "}" | 15359 "}" |
13912 "for (var i = 0; i < 8; i++) {" | 15360 "for (var i = 0; i < 8; i++) {" |
13913 " ext_array[i] = NaN;" | 15361 " ext_array[i] = NaN;" |
13914 "}" | 15362 "}" |
13915 "ext_array[5];"); | 15363 "ext_array[5];"); |
13916 CHECK_EQ(0, result->Int32Value()); | 15364 CHECK_EQ(0, result->Int32Value(context).FromJust()); |
13917 CheckElementValue(isolate, 0, jsobj, 5); | 15365 CheckElementValue(isolate, 0, jsobj, 5); |
13918 | 15366 |
13919 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15367 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13920 " ext_array[i] = 5;" | 15368 " ext_array[i] = 5;" |
13921 "}" | 15369 "}" |
13922 "for (var i = 0; i < 8; i++) {" | 15370 "for (var i = 0; i < 8; i++) {" |
13923 " ext_array[i] = Infinity;" | 15371 " ext_array[i] = Infinity;" |
13924 "}" | 15372 "}" |
13925 "ext_array[5];"); | 15373 "ext_array[5];"); |
13926 int expected_value = | 15374 int expected_value = |
13927 (array_type == i::kExternalUint8ClampedArray) ? 255 : 0; | 15375 (array_type == i::kExternalUint8ClampedArray) ? 255 : 0; |
13928 CHECK_EQ(expected_value, result->Int32Value()); | 15376 CHECK_EQ(expected_value, result->Int32Value(context).FromJust()); |
13929 CheckElementValue(isolate, expected_value, jsobj, 5); | 15377 CheckElementValue(isolate, expected_value, jsobj, 5); |
13930 | 15378 |
13931 result = CompileRun("for (var i = 0; i < 8; i++) {" | 15379 result = CompileRun("for (var i = 0; i < 8; i++) {" |
13932 " ext_array[i] = 5;" | 15380 " ext_array[i] = 5;" |
13933 "}" | 15381 "}" |
13934 "for (var i = 0; i < 8; i++) {" | 15382 "for (var i = 0; i < 8; i++) {" |
13935 " ext_array[i] = -Infinity;" | 15383 " ext_array[i] = -Infinity;" |
13936 "}" | 15384 "}" |
13937 "ext_array[5];"); | 15385 "ext_array[5];"); |
13938 CHECK_EQ(0, result->Int32Value()); | 15386 CHECK_EQ(0, result->Int32Value(context).FromJust()); |
13939 CheckElementValue(isolate, 0, jsobj, 5); | 15387 CheckElementValue(isolate, 0, jsobj, 5); |
13940 | 15388 |
13941 // Check truncation behavior of integral arrays. | 15389 // Check truncation behavior of integral arrays. |
13942 const char* unsigned_data = | 15390 const char* unsigned_data = |
13943 "var source_data = [0.6, 10.6];" | 15391 "var source_data = [0.6, 10.6];" |
13944 "var expected_results = [0, 10];"; | 15392 "var expected_results = [0, 10];"; |
13945 const char* signed_data = | 15393 const char* signed_data = |
13946 "var source_data = [0.6, 10.6, -0.6, -10.6];" | 15394 "var source_data = [0.6, 10.6, -0.6, -10.6];" |
13947 "var expected_results = [0, 10, 0, -10];"; | 15395 "var expected_results = [0, 10, 0, -10];"; |
13948 const char* pixel_data = | 15396 const char* pixel_data = |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13983 " sum += (ext_array[i] += 1);" | 15431 " sum += (ext_array[i] += 1);" |
13984 " sum += (ext_array[i] -= 1);" | 15432 " sum += (ext_array[i] -= 1);" |
13985 " } " | 15433 " } " |
13986 " return sum;" | 15434 " return sum;" |
13987 "}" | 15435 "}" |
13988 "sum=0;" | 15436 "sum=0;" |
13989 "for (var i=0;i<10000;++i) {" | 15437 "for (var i=0;i<10000;++i) {" |
13990 " sum=ee_op_test_complex_func(sum);" | 15438 " sum=ee_op_test_complex_func(sum);" |
13991 "}" | 15439 "}" |
13992 "sum;"); | 15440 "sum;"); |
13993 CHECK_EQ(16000000, result->Int32Value()); | 15441 CHECK_EQ(16000000, result->Int32Value(context).FromJust()); |
13994 | 15442 |
13995 // Test count operations | 15443 // Test count operations |
13996 result = CompileRun("function ee_op_test_count_func(sum) {" | 15444 result = CompileRun("function ee_op_test_count_func(sum) {" |
13997 " for (var i = 0; i < 40; ++i) {" | 15445 " for (var i = 0; i < 40; ++i) {" |
13998 " sum += (++ext_array[i]);" | 15446 " sum += (++ext_array[i]);" |
13999 " sum += (--ext_array[i]);" | 15447 " sum += (--ext_array[i]);" |
14000 " } " | 15448 " } " |
14001 " return sum;" | 15449 " return sum;" |
14002 "}" | 15450 "}" |
14003 "sum=0;" | 15451 "sum=0;" |
14004 "for (var i=0;i<10000;++i) {" | 15452 "for (var i=0;i<10000;++i) {" |
14005 " sum=ee_op_test_count_func(sum);" | 15453 " sum=ee_op_test_count_func(sum);" |
14006 "}" | 15454 "}" |
14007 "sum;"); | 15455 "sum;"); |
14008 CHECK_EQ(16000000, result->Int32Value()); | 15456 CHECK_EQ(16000000, result->Int32Value(context).FromJust()); |
14009 | 15457 |
14010 result = CompileRun("ext_array[3] = 33;" | 15458 result = CompileRun("ext_array[3] = 33;" |
14011 "delete ext_array[3];" | 15459 "delete ext_array[3];" |
14012 "ext_array[3];"); | 15460 "ext_array[3];"); |
14013 CHECK_EQ(33, result->Int32Value()); | 15461 CHECK_EQ(33, result->Int32Value(context).FromJust()); |
14014 | 15462 |
14015 result = CompileRun("ext_array[0] = 10; ext_array[1] = 11;" | 15463 result = CompileRun("ext_array[0] = 10; ext_array[1] = 11;" |
14016 "ext_array[2] = 12; ext_array[3] = 13;" | 15464 "ext_array[2] = 12; ext_array[3] = 13;" |
14017 "ext_array.__defineGetter__('2'," | 15465 "ext_array.__defineGetter__('2'," |
14018 "function() { return 120; });" | 15466 "function() { return 120; });" |
14019 "ext_array[2];"); | 15467 "ext_array[2];"); |
14020 CHECK_EQ(12, result->Int32Value()); | 15468 CHECK_EQ(12, result->Int32Value(context).FromJust()); |
14021 | 15469 |
14022 result = CompileRun("var js_array = new Array(40);" | 15470 result = CompileRun("var js_array = new Array(40);" |
14023 "js_array[0] = 77;" | 15471 "js_array[0] = 77;" |
14024 "js_array;"); | 15472 "js_array;"); |
14025 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); | 15473 CHECK_EQ(77, v8::Object::Cast(*result) |
15474 ->Get(v8_str("0")) | |
15475 ->Int32Value(context) | |
15476 .FromJust()); | |
14026 | 15477 |
14027 result = CompileRun("ext_array[1] = 23;" | 15478 result = CompileRun("ext_array[1] = 23;" |
14028 "ext_array.__proto__ = [];" | 15479 "ext_array.__proto__ = [];" |
14029 "js_array.__proto__ = ext_array;" | 15480 "js_array.__proto__ = ext_array;" |
14030 "js_array.concat(ext_array);"); | 15481 "js_array.concat(ext_array);"); |
14031 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); | 15482 CHECK_EQ(77, v8::Object::Cast(*result) |
14032 CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value()); | 15483 ->Get(v8_str("0")) |
15484 ->Int32Value(context) | |
15485 .FromJust()); | |
15486 CHECK_EQ(23, v8::Object::Cast(*result) | |
15487 ->Get(v8_str("1")) | |
15488 ->Int32Value(context) | |
15489 .FromJust()); | |
14033 | 15490 |
14034 result = CompileRun("ext_array[1] = 23;"); | 15491 result = CompileRun("ext_array[1] = 23;"); |
14035 CHECK_EQ(23, result->Int32Value()); | 15492 CHECK_EQ(23, result->Int32Value(context).FromJust()); |
14036 } | 15493 } |
14037 | 15494 |
14038 | 15495 |
14039 template <class FixedTypedArrayClass, i::ElementsKind elements_kind, | 15496 template <class FixedTypedArrayClass, i::ElementsKind elements_kind, |
14040 class ElementType> | 15497 class ElementType> |
14041 static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type, | 15498 static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type, |
14042 ElementType low, ElementType high) { | 15499 ElementType low, ElementType high) { |
14043 i::FLAG_allow_natives_syntax = true; | 15500 i::FLAG_allow_natives_syntax = true; |
14044 LocalContext context; | 15501 LocalContext context; |
14045 i::Isolate* isolate = CcTest::i_isolate(); | 15502 i::Isolate* isolate = CcTest::i_isolate(); |
(...skipping 10 matching lines...) Expand all Loading... | |
14056 CcTest::heap()->CollectAllGarbage(); | 15513 CcTest::heap()->CollectAllGarbage(); |
14057 for (int i = 0; i < kElementCount; i++) { | 15514 for (int i = 0; i < kElementCount; i++) { |
14058 fixed_array->set(i, static_cast<ElementType>(i)); | 15515 fixed_array->set(i, static_cast<ElementType>(i)); |
14059 } | 15516 } |
14060 // Force GC to trigger verification. | 15517 // Force GC to trigger verification. |
14061 CcTest::heap()->CollectAllGarbage(); | 15518 CcTest::heap()->CollectAllGarbage(); |
14062 for (int i = 0; i < kElementCount; i++) { | 15519 for (int i = 0; i < kElementCount; i++) { |
14063 CHECK_EQ(static_cast<int64_t>(static_cast<ElementType>(i)), | 15520 CHECK_EQ(static_cast<int64_t>(static_cast<ElementType>(i)), |
14064 static_cast<int64_t>(fixed_array->get_scalar(i))); | 15521 static_cast<int64_t>(fixed_array->get_scalar(i))); |
14065 } | 15522 } |
14066 v8::Handle<v8::Object> obj = v8::Utils::ToLocal(jsobj); | 15523 v8::Local<v8::Object> obj = v8::Utils::ToLocal(jsobj); |
14067 | 15524 |
14068 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>( | 15525 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>( |
14069 context.local(), obj, kElementCount, array_type, | 15526 context.local(), obj, kElementCount, array_type, |
14070 static_cast<int64_t>(low), | 15527 static_cast<int64_t>(low), |
14071 static_cast<int64_t>(high)); | 15528 static_cast<int64_t>(high)); |
14072 } | 15529 } |
14073 | 15530 |
14074 | 15531 |
14075 THREADED_TEST(FixedUint8Array) { | 15532 THREADED_TEST(FixedUint8Array) { |
14076 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>( | 15533 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>( |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14369 v8::SharedArrayBuffer::New(isolate, backing_store.start(), 2 + kSize); | 15826 v8::SharedArrayBuffer::New(isolate, backing_store.start(), 2 + kSize); |
14370 Local<v8::DataView> dv = | 15827 Local<v8::DataView> dv = |
14371 v8::DataView::New(ab, 2, kSize); | 15828 v8::DataView::New(ab, 2, kSize); |
14372 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); | 15829 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); |
14373 CHECK_EQ(2u, dv->ByteOffset()); | 15830 CHECK_EQ(2u, dv->ByteOffset()); |
14374 CHECK_EQ(kSize, static_cast<int>(dv->ByteLength())); | 15831 CHECK_EQ(kSize, static_cast<int>(dv->ByteLength())); |
14375 CHECK(ab->Equals(dv->Buffer())); | 15832 CHECK(ab->Equals(dv->Buffer())); |
14376 } | 15833 } |
14377 | 15834 |
14378 | 15835 |
14379 #define IS_ARRAY_BUFFER_VIEW_TEST(View) \ | 15836 #define IS_ARRAY_BUFFER_VIEW_TEST(View) \ |
14380 THREADED_TEST(Is##View) { \ | 15837 THREADED_TEST(Is##View) { \ |
14381 LocalContext env; \ | 15838 LocalContext env; \ |
14382 v8::Isolate* isolate = env->GetIsolate(); \ | 15839 v8::Isolate* isolate = env->GetIsolate(); \ |
14383 v8::HandleScope handle_scope(isolate); \ | 15840 v8::HandleScope handle_scope(isolate); \ |
14384 \ | 15841 \ |
14385 Handle<Value> result = CompileRun( \ | 15842 Local<Value> result = CompileRun( \ |
14386 "var ab = new ArrayBuffer(128);" \ | 15843 "var ab = new ArrayBuffer(128);" \ |
14387 "new " #View "(ab)"); \ | 15844 "new " #View "(ab)"); \ |
14388 CHECK(result->IsArrayBufferView()); \ | 15845 CHECK(result->IsArrayBufferView()); \ |
14389 CHECK(result->Is##View()); \ | 15846 CHECK(result->Is##View()); \ |
14390 CheckInternalFieldsAreZero<v8::ArrayBufferView>(result.As<v8::View>()); \ | 15847 CheckInternalFieldsAreZero<v8::ArrayBufferView>(result.As<v8::View>()); \ |
14391 } | 15848 } |
14392 | 15849 |
14393 IS_ARRAY_BUFFER_VIEW_TEST(Uint8Array) | 15850 IS_ARRAY_BUFFER_VIEW_TEST(Uint8Array) |
14394 IS_ARRAY_BUFFER_VIEW_TEST(Int8Array) | 15851 IS_ARRAY_BUFFER_VIEW_TEST(Int8Array) |
14395 IS_ARRAY_BUFFER_VIEW_TEST(Uint16Array) | 15852 IS_ARRAY_BUFFER_VIEW_TEST(Uint16Array) |
14396 IS_ARRAY_BUFFER_VIEW_TEST(Int16Array) | 15853 IS_ARRAY_BUFFER_VIEW_TEST(Int16Array) |
14397 IS_ARRAY_BUFFER_VIEW_TEST(Uint32Array) | 15854 IS_ARRAY_BUFFER_VIEW_TEST(Uint32Array) |
14398 IS_ARRAY_BUFFER_VIEW_TEST(Int32Array) | 15855 IS_ARRAY_BUFFER_VIEW_TEST(Int32Array) |
14399 IS_ARRAY_BUFFER_VIEW_TEST(Float32Array) | 15856 IS_ARRAY_BUFFER_VIEW_TEST(Float32Array) |
14400 IS_ARRAY_BUFFER_VIEW_TEST(Float64Array) | 15857 IS_ARRAY_BUFFER_VIEW_TEST(Float64Array) |
14401 IS_ARRAY_BUFFER_VIEW_TEST(Uint8ClampedArray) | 15858 IS_ARRAY_BUFFER_VIEW_TEST(Uint8ClampedArray) |
14402 IS_ARRAY_BUFFER_VIEW_TEST(DataView) | 15859 IS_ARRAY_BUFFER_VIEW_TEST(DataView) |
14403 | 15860 |
14404 #undef IS_ARRAY_BUFFER_VIEW_TEST | 15861 #undef IS_ARRAY_BUFFER_VIEW_TEST |
14405 | 15862 |
14406 | 15863 |
14407 | 15864 |
14408 THREADED_TEST(ScriptContextDependence) { | 15865 THREADED_TEST(ScriptContextDependence) { |
14409 LocalContext c1; | 15866 LocalContext c1; |
14410 v8::HandleScope scope(c1->GetIsolate()); | 15867 v8::HandleScope scope(c1->GetIsolate()); |
14411 const char *source = "foo"; | 15868 const char *source = "foo"; |
14412 v8::Handle<v8::Script> dep = v8_compile(source); | 15869 v8::Local<v8::Script> dep = v8_compile(source); |
14413 v8::ScriptCompiler::Source script_source(v8::String::NewFromUtf8( | 15870 v8::ScriptCompiler::Source script_source( |
14414 c1->GetIsolate(), source)); | 15871 v8::String::NewFromUtf8(c1->GetIsolate(), source, |
14415 v8::Handle<v8::UnboundScript> indep = | 15872 v8::NewStringType::kNormal) |
15873 .ToLocalChecked()); | |
15874 v8::Local<v8::UnboundScript> indep = | |
14416 v8::ScriptCompiler::CompileUnbound(c1->GetIsolate(), &script_source); | 15875 v8::ScriptCompiler::CompileUnbound(c1->GetIsolate(), &script_source); |
14417 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo"), | 15876 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo", |
15877 v8::NewStringType::kNormal) | |
15878 .ToLocalChecked(), | |
14418 v8::Integer::New(c1->GetIsolate(), 100)); | 15879 v8::Integer::New(c1->GetIsolate(), 100)); |
14419 CHECK_EQ(dep->Run()->Int32Value(), 100); | 15880 CHECK_EQ(dep->Run()->Int32Value(c1.local()).FromJust(), 100); |
14420 CHECK_EQ(indep->BindToCurrentContext()->Run()->Int32Value(), 100); | 15881 CHECK_EQ( |
15882 indep->BindToCurrentContext()->Run()->Int32Value(c1.local()).FromJust(), | |
15883 100); | |
14421 LocalContext c2; | 15884 LocalContext c2; |
14422 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo"), | 15885 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo", |
15886 v8::NewStringType::kNormal) | |
15887 .ToLocalChecked(), | |
14423 v8::Integer::New(c2->GetIsolate(), 101)); | 15888 v8::Integer::New(c2->GetIsolate(), 101)); |
14424 CHECK_EQ(dep->Run()->Int32Value(), 100); | 15889 CHECK_EQ(dep->Run()->Int32Value(c2.local()).FromJust(), 100); |
14425 CHECK_EQ(indep->BindToCurrentContext()->Run()->Int32Value(), 101); | 15890 CHECK_EQ( |
15891 indep->BindToCurrentContext()->Run()->Int32Value(c2.local()).FromJust(), | |
15892 101); | |
14426 } | 15893 } |
14427 | 15894 |
14428 | 15895 |
14429 THREADED_TEST(StackTrace) { | 15896 THREADED_TEST(StackTrace) { |
14430 LocalContext context; | 15897 LocalContext context; |
14431 v8::HandleScope scope(context->GetIsolate()); | 15898 v8::HandleScope scope(context->GetIsolate()); |
14432 v8::TryCatch try_catch(context->GetIsolate()); | 15899 v8::TryCatch try_catch(context->GetIsolate()); |
14433 const char *source = "function foo() { FAIL.FAIL; }; foo();"; | 15900 const char *source = "function foo() { FAIL.FAIL; }; foo();"; |
14434 v8::Handle<v8::String> src = | 15901 v8::Local<v8::String> src = v8_str(source); |
14435 v8::String::NewFromUtf8(context->GetIsolate(), source); | 15902 v8::Local<v8::String> origin = v8_str("stack-trace-test"); |
14436 v8::Handle<v8::String> origin = | |
14437 v8::String::NewFromUtf8(context->GetIsolate(), "stack-trace-test"); | |
14438 v8::ScriptCompiler::Source script_source(src, v8::ScriptOrigin(origin)); | 15903 v8::ScriptCompiler::Source script_source(src, v8::ScriptOrigin(origin)); |
14439 v8::ScriptCompiler::CompileUnbound(context->GetIsolate(), &script_source) | 15904 v8::ScriptCompiler::CompileUnbound(context->GetIsolate(), &script_source) |
14440 ->BindToCurrentContext() | 15905 ->BindToCurrentContext() |
14441 ->Run(); | 15906 ->Run(); |
14442 CHECK(try_catch.HasCaught()); | 15907 CHECK(try_catch.HasCaught()); |
14443 v8::String::Utf8Value stack(try_catch.StackTrace()); | 15908 v8::String::Utf8Value stack(try_catch.StackTrace()); |
14444 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); | 15909 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); |
14445 } | 15910 } |
14446 | 15911 |
14447 | 15912 |
14448 // Checks that a StackFrame has certain expected values. | 15913 // Checks that a StackFrame has certain expected values. |
14449 void checkStackFrame(const char* expected_script_name, | 15914 void checkStackFrame(const char* expected_script_name, |
14450 const char* expected_func_name, int expected_line_number, | 15915 const char* expected_func_name, int expected_line_number, |
14451 int expected_column, bool is_eval, bool is_constructor, | 15916 int expected_column, bool is_eval, bool is_constructor, |
14452 v8::Handle<v8::StackFrame> frame) { | 15917 v8::Local<v8::StackFrame> frame) { |
14453 v8::HandleScope scope(CcTest::isolate()); | 15918 v8::HandleScope scope(CcTest::isolate()); |
14454 v8::String::Utf8Value func_name(frame->GetFunctionName()); | 15919 v8::String::Utf8Value func_name(frame->GetFunctionName()); |
14455 v8::String::Utf8Value script_name(frame->GetScriptName()); | 15920 v8::String::Utf8Value script_name(frame->GetScriptName()); |
14456 if (*script_name == NULL) { | 15921 if (*script_name == NULL) { |
14457 // The situation where there is no associated script, like for evals. | 15922 // The situation where there is no associated script, like for evals. |
14458 CHECK(expected_script_name == NULL); | 15923 CHECK(expected_script_name == NULL); |
14459 } else { | 15924 } else { |
14460 CHECK(strstr(*script_name, expected_script_name) != NULL); | 15925 CHECK(strstr(*script_name, expected_script_name) != NULL); |
14461 } | 15926 } |
14462 CHECK(strstr(*func_name, expected_func_name) != NULL); | 15927 CHECK(strstr(*func_name, expected_func_name) != NULL); |
(...skipping 10 matching lines...) Expand all Loading... | |
14473 const int kOverviewTest = 1; | 15938 const int kOverviewTest = 1; |
14474 const int kDetailedTest = 2; | 15939 const int kDetailedTest = 2; |
14475 const int kFunctionName = 3; | 15940 const int kFunctionName = 3; |
14476 const int kDisplayName = 4; | 15941 const int kDisplayName = 4; |
14477 const int kFunctionNameAndDisplayName = 5; | 15942 const int kFunctionNameAndDisplayName = 5; |
14478 const int kDisplayNameIsNotString = 6; | 15943 const int kDisplayNameIsNotString = 6; |
14479 const int kFunctionNameIsNotString = 7; | 15944 const int kFunctionNameIsNotString = 7; |
14480 | 15945 |
14481 DCHECK(args.Length() == 1); | 15946 DCHECK(args.Length() == 1); |
14482 | 15947 |
14483 int testGroup = args[0]->Int32Value(); | 15948 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
15949 int testGroup = args[0]->Int32Value(context).FromJust(); | |
14484 if (testGroup == kOverviewTest) { | 15950 if (testGroup == kOverviewTest) { |
14485 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 15951 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
14486 args.GetIsolate(), 10, v8::StackTrace::kOverview); | 15952 args.GetIsolate(), 10, v8::StackTrace::kOverview); |
14487 CHECK_EQ(4, stackTrace->GetFrameCount()); | 15953 CHECK_EQ(4, stackTrace->GetFrameCount()); |
14488 checkStackFrame(origin, "bar", 2, 10, false, false, | 15954 checkStackFrame(origin, "bar", 2, 10, false, false, |
14489 stackTrace->GetFrame(0)); | 15955 stackTrace->GetFrame(0)); |
14490 checkStackFrame(origin, "foo", 6, 3, false, false, | 15956 checkStackFrame(origin, "foo", 6, 3, false, false, |
14491 stackTrace->GetFrame(1)); | 15957 stackTrace->GetFrame(1)); |
14492 // This is the source string inside the eval which has the call to foo. | 15958 // This is the source string inside the eval which has the call to foo. |
14493 checkStackFrame(NULL, "", 1, 1, false, false, stackTrace->GetFrame(2)); | 15959 checkStackFrame(NULL, "", 1, 1, false, false, stackTrace->GetFrame(2)); |
14494 // The last frame is an anonymous function which has the initial eval call. | 15960 // The last frame is an anonymous function which has the initial eval call. |
14495 checkStackFrame(origin, "", 8, 7, false, false, stackTrace->GetFrame(3)); | 15961 checkStackFrame(origin, "", 8, 7, false, false, stackTrace->GetFrame(3)); |
14496 | 15962 |
14497 CHECK(stackTrace->AsArray()->IsArray()); | 15963 CHECK(stackTrace->AsArray()->IsArray()); |
14498 } else if (testGroup == kDetailedTest) { | 15964 } else if (testGroup == kDetailedTest) { |
14499 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 15965 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
14500 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 15966 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
14501 CHECK_EQ(4, stackTrace->GetFrameCount()); | 15967 CHECK_EQ(4, stackTrace->GetFrameCount()); |
14502 checkStackFrame(origin, "bat", 4, 22, false, false, | 15968 checkStackFrame(origin, "bat", 4, 22, false, false, |
14503 stackTrace->GetFrame(0)); | 15969 stackTrace->GetFrame(0)); |
14504 checkStackFrame(origin, "baz", 8, 3, false, true, | 15970 checkStackFrame(origin, "baz", 8, 3, false, true, |
14505 stackTrace->GetFrame(1)); | 15971 stackTrace->GetFrame(1)); |
14506 bool is_eval = true; | 15972 bool is_eval = true; |
14507 // This is the source string inside the eval which has the call to baz. | 15973 // This is the source string inside the eval which has the call to baz. |
14508 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); | 15974 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2)); |
14509 // The last frame is an anonymous function which has the initial eval call. | 15975 // The last frame is an anonymous function which has the initial eval call. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14542 } | 16008 } |
14543 } | 16009 } |
14544 | 16010 |
14545 | 16011 |
14546 // Tests the C++ StackTrace API. | 16012 // Tests the C++ StackTrace API. |
14547 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. | 16013 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. |
14548 // THREADED_TEST(CaptureStackTrace) { | 16014 // THREADED_TEST(CaptureStackTrace) { |
14549 TEST(CaptureStackTrace) { | 16015 TEST(CaptureStackTrace) { |
14550 v8::Isolate* isolate = CcTest::isolate(); | 16016 v8::Isolate* isolate = CcTest::isolate(); |
14551 v8::HandleScope scope(isolate); | 16017 v8::HandleScope scope(isolate); |
14552 v8::Handle<v8::String> origin = | 16018 v8::Local<v8::String> origin = v8_str("capture-stack-trace-test"); |
14553 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test"); | |
14554 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 16019 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
14555 templ->Set(v8_str("AnalyzeStackInNativeCode"), | 16020 templ->Set(v8_str("AnalyzeStackInNativeCode"), |
14556 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); | 16021 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); |
14557 LocalContext context(0, templ); | 16022 LocalContext context(0, templ); |
14558 | 16023 |
14559 // Test getting OVERVIEW information. Should ignore information that is not | 16024 // Test getting OVERVIEW information. Should ignore information that is not |
14560 // script name, function name, line number, and column offset. | 16025 // script name, function name, line number, and column offset. |
14561 const char *overview_source = | 16026 const char *overview_source = |
14562 "function bar() {\n" | 16027 "function bar() {\n" |
14563 " var y; AnalyzeStackInNativeCode(1);\n" | 16028 " var y; AnalyzeStackInNativeCode(1);\n" |
14564 "}\n" | 16029 "}\n" |
14565 "function foo() {\n" | 16030 "function foo() {\n" |
14566 "\n" | 16031 "\n" |
14567 " bar();\n" | 16032 " bar();\n" |
14568 "}\n" | 16033 "}\n" |
14569 "var x;eval('new foo();');"; | 16034 "var x;eval('new foo();');"; |
14570 v8::Handle<v8::String> overview_src = | 16035 v8::Local<v8::String> overview_src = v8_str(overview_source); |
14571 v8::String::NewFromUtf8(isolate, overview_source); | |
14572 v8::ScriptCompiler::Source script_source(overview_src, | 16036 v8::ScriptCompiler::Source script_source(overview_src, |
14573 v8::ScriptOrigin(origin)); | 16037 v8::ScriptOrigin(origin)); |
14574 v8::Handle<Value> overview_result( | 16038 v8::Local<Value> overview_result( |
14575 v8::ScriptCompiler::CompileUnbound(isolate, &script_source) | 16039 v8::ScriptCompiler::CompileUnbound(isolate, &script_source) |
14576 ->BindToCurrentContext() | 16040 ->BindToCurrentContext() |
14577 ->Run()); | 16041 ->Run()); |
14578 CHECK(!overview_result.IsEmpty()); | 16042 CHECK(!overview_result.IsEmpty()); |
14579 CHECK(overview_result->IsObject()); | 16043 CHECK(overview_result->IsObject()); |
14580 | 16044 |
14581 // Test getting DETAILED information. | 16045 // Test getting DETAILED information. |
14582 const char *detailed_source = | 16046 const char *detailed_source = |
14583 "function bat() {AnalyzeStackInNativeCode(2);\n" | 16047 "function bat() {AnalyzeStackInNativeCode(2);\n" |
14584 "}\n" | 16048 "}\n" |
14585 "\n" | 16049 "\n" |
14586 "function baz() {\n" | 16050 "function baz() {\n" |
14587 " bat();\n" | 16051 " bat();\n" |
14588 "}\n" | 16052 "}\n" |
14589 "eval('new baz();');"; | 16053 "eval('new baz();');"; |
14590 v8::Handle<v8::String> detailed_src = | 16054 v8::Local<v8::String> detailed_src = v8_str(detailed_source); |
14591 v8::String::NewFromUtf8(isolate, detailed_source); | |
14592 // Make the script using a non-zero line and column offset. | 16055 // Make the script using a non-zero line and column offset. |
14593 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3); | 16056 v8::Local<v8::Integer> line_offset = v8::Integer::New(isolate, 3); |
14594 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5); | 16057 v8::Local<v8::Integer> column_offset = v8::Integer::New(isolate, 5); |
14595 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); | 16058 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); |
14596 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); | 16059 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); |
14597 v8::Handle<v8::UnboundScript> detailed_script( | 16060 v8::Local<v8::UnboundScript> detailed_script( |
14598 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); | 16061 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); |
14599 v8::Handle<Value> detailed_result( | 16062 v8::Local<Value> detailed_result( |
14600 detailed_script->BindToCurrentContext()->Run()); | 16063 detailed_script->BindToCurrentContext()->Run()); |
14601 CHECK(!detailed_result.IsEmpty()); | 16064 CHECK(!detailed_result.IsEmpty()); |
14602 CHECK(detailed_result->IsObject()); | 16065 CHECK(detailed_result->IsObject()); |
14603 | 16066 |
14604 // Test using function.name and function.displayName in stack trace | 16067 // Test using function.name and function.displayName in stack trace |
14605 const char* function_name_source = | 16068 const char* function_name_source = |
14606 "function bar(function_name, display_name, testGroup) {\n" | 16069 "function bar(function_name, display_name, testGroup) {\n" |
14607 " var f = function() { AnalyzeStackInNativeCode(testGroup); };\n" | 16070 " var f = function() { AnalyzeStackInNativeCode(testGroup); };\n" |
14608 " if (function_name) {\n" | 16071 " if (function_name) {\n" |
14609 " Object.defineProperty(f, 'name', { value: function_name });\n" | 16072 " Object.defineProperty(f, 'name', { value: function_name });\n" |
(...skipping 14 matching lines...) Expand all Loading... | |
14624 v8::ScriptOrigin(origin)); | 16087 v8::ScriptOrigin(origin)); |
14625 v8::Handle<Value> function_name_result( | 16088 v8::Handle<Value> function_name_result( |
14626 v8::ScriptCompiler::CompileUnbound(isolate, &script_source3) | 16089 v8::ScriptCompiler::CompileUnbound(isolate, &script_source3) |
14627 ->BindToCurrentContext() | 16090 ->BindToCurrentContext() |
14628 ->Run()); | 16091 ->Run()); |
14629 CHECK(!function_name_result.IsEmpty()); | 16092 CHECK(!function_name_result.IsEmpty()); |
14630 } | 16093 } |
14631 | 16094 |
14632 | 16095 |
14633 static void StackTraceForUncaughtExceptionListener( | 16096 static void StackTraceForUncaughtExceptionListener( |
14634 v8::Handle<v8::Message> message, | 16097 v8::Local<v8::Message> message, v8::Local<Value>) { |
14635 v8::Handle<Value>) { | |
14636 report_count++; | 16098 report_count++; |
14637 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16099 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14638 CHECK_EQ(2, stack_trace->GetFrameCount()); | 16100 CHECK_EQ(2, stack_trace->GetFrameCount()); |
14639 checkStackFrame("origin", "foo", 2, 3, false, false, | 16101 checkStackFrame("origin", "foo", 2, 3, false, false, |
14640 stack_trace->GetFrame(0)); | 16102 stack_trace->GetFrame(0)); |
14641 checkStackFrame("origin", "bar", 5, 3, false, false, | 16103 checkStackFrame("origin", "bar", 5, 3, false, false, |
14642 stack_trace->GetFrame(1)); | 16104 stack_trace->GetFrame(1)); |
14643 } | 16105 } |
14644 | 16106 |
14645 | 16107 |
14646 TEST(CaptureStackTraceForUncaughtException) { | 16108 TEST(CaptureStackTraceForUncaughtException) { |
14647 report_count = 0; | 16109 report_count = 0; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
14712 " 'isConstructor'];\n" | 16174 " 'isConstructor'];\n" |
14713 "for (var i = 0; i < setters.length; i++) {\n" | 16175 "for (var i = 0; i < setters.length; i++) {\n" |
14714 " var prop = setters[i];\n" | 16176 " var prop = setters[i];\n" |
14715 " Object.prototype.__defineSetter__(prop, function() { throw prop; });\n" | 16177 " Object.prototype.__defineSetter__(prop, function() { throw prop; });\n" |
14716 "}\n"); | 16178 "}\n"); |
14717 CompileRun("throw 'exception';"); | 16179 CompileRun("throw 'exception';"); |
14718 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 16180 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
14719 } | 16181 } |
14720 | 16182 |
14721 | 16183 |
14722 static void StackTraceFunctionNameListener(v8::Handle<v8::Message> message, | 16184 static void StackTraceFunctionNameListener(v8::Local<v8::Message> message, |
14723 v8::Handle<Value>) { | 16185 v8::Local<Value>) { |
14724 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16186 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14725 CHECK_EQ(5, stack_trace->GetFrameCount()); | 16187 CHECK_EQ(5, stack_trace->GetFrameCount()); |
14726 checkStackFrame("origin", "foo:0", 4, 7, false, false, | 16188 checkStackFrame("origin", "foo:0", 4, 7, false, false, |
14727 stack_trace->GetFrame(0)); | 16189 stack_trace->GetFrame(0)); |
14728 checkStackFrame("origin", "foo:1", 5, 27, false, false, | 16190 checkStackFrame("origin", "foo:1", 5, 27, false, false, |
14729 stack_trace->GetFrame(1)); | 16191 stack_trace->GetFrame(1)); |
14730 checkStackFrame("origin", "foo", 5, 27, false, false, | 16192 checkStackFrame("origin", "foo", 5, 27, false, false, |
14731 stack_trace->GetFrame(2)); | 16193 stack_trace->GetFrame(2)); |
14732 checkStackFrame("origin", "foo", 5, 27, false, false, | 16194 checkStackFrame("origin", "foo", 5, 27, false, false, |
14733 stack_trace->GetFrame(3)); | 16195 stack_trace->GetFrame(3)); |
14734 checkStackFrame("origin", "", 1, 14, false, false, stack_trace->GetFrame(4)); | 16196 checkStackFrame("origin", "", 1, 14, false, false, stack_trace->GetFrame(4)); |
(...skipping 25 matching lines...) Expand all Loading... | |
14760 "origin"); | 16222 "origin"); |
14761 | 16223 |
14762 v8::V8::AddMessageListener(StackTraceFunctionNameListener); | 16224 v8::V8::AddMessageListener(StackTraceFunctionNameListener); |
14763 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 16225 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
14764 CompileRunWithOrigin("gen('foo', 3)();", "origin"); | 16226 CompileRunWithOrigin("gen('foo', 3)();", "origin"); |
14765 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 16227 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
14766 v8::V8::RemoveMessageListeners(StackTraceFunctionNameListener); | 16228 v8::V8::RemoveMessageListeners(StackTraceFunctionNameListener); |
14767 } | 16229 } |
14768 | 16230 |
14769 | 16231 |
14770 static void RethrowStackTraceHandler(v8::Handle<v8::Message> message, | 16232 static void RethrowStackTraceHandler(v8::Local<v8::Message> message, |
14771 v8::Handle<v8::Value> data) { | 16233 v8::Local<v8::Value> data) { |
14772 // Use the frame where JavaScript is called from. | 16234 // Use the frame where JavaScript is called from. |
14773 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16235 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14774 CHECK(!stack_trace.IsEmpty()); | 16236 CHECK(!stack_trace.IsEmpty()); |
14775 int frame_count = stack_trace->GetFrameCount(); | 16237 int frame_count = stack_trace->GetFrameCount(); |
14776 CHECK_EQ(3, frame_count); | 16238 CHECK_EQ(3, frame_count); |
14777 int line_number[] = {1, 2, 5}; | 16239 int line_number[] = {1, 2, 5}; |
14778 for (int i = 0; i < frame_count; i++) { | 16240 for (int i = 0; i < frame_count; i++) { |
14779 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); | 16241 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); |
14780 } | 16242 } |
14781 } | 16243 } |
14782 | 16244 |
14783 | 16245 |
(...skipping 20 matching lines...) Expand all Loading... | |
14804 " } \n" | 16266 " } \n" |
14805 "} \n"; | 16267 "} \n"; |
14806 v8::V8::AddMessageListener(RethrowStackTraceHandler); | 16268 v8::V8::AddMessageListener(RethrowStackTraceHandler); |
14807 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 16269 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
14808 CompileRun(source); | 16270 CompileRun(source); |
14809 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 16271 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
14810 v8::V8::RemoveMessageListeners(RethrowStackTraceHandler); | 16272 v8::V8::RemoveMessageListeners(RethrowStackTraceHandler); |
14811 } | 16273 } |
14812 | 16274 |
14813 | 16275 |
14814 static void RethrowPrimitiveStackTraceHandler(v8::Handle<v8::Message> message, | 16276 static void RethrowPrimitiveStackTraceHandler(v8::Local<v8::Message> message, |
14815 v8::Handle<v8::Value> data) { | 16277 v8::Local<v8::Value> data) { |
14816 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16278 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14817 CHECK(!stack_trace.IsEmpty()); | 16279 CHECK(!stack_trace.IsEmpty()); |
14818 int frame_count = stack_trace->GetFrameCount(); | 16280 int frame_count = stack_trace->GetFrameCount(); |
14819 CHECK_EQ(2, frame_count); | 16281 CHECK_EQ(2, frame_count); |
14820 int line_number[] = {3, 7}; | 16282 int line_number[] = {3, 7}; |
14821 for (int i = 0; i < frame_count; i++) { | 16283 for (int i = 0; i < frame_count; i++) { |
14822 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); | 16284 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); |
14823 } | 16285 } |
14824 } | 16286 } |
14825 | 16287 |
14826 | 16288 |
(...skipping 13 matching lines...) Expand all Loading... | |
14840 " t(e1) \n" | 16302 " t(e1) \n" |
14841 "} \n"; | 16303 "} \n"; |
14842 v8::V8::AddMessageListener(RethrowPrimitiveStackTraceHandler); | 16304 v8::V8::AddMessageListener(RethrowPrimitiveStackTraceHandler); |
14843 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 16305 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
14844 CompileRun(source); | 16306 CompileRun(source); |
14845 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 16307 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
14846 v8::V8::RemoveMessageListeners(RethrowPrimitiveStackTraceHandler); | 16308 v8::V8::RemoveMessageListeners(RethrowPrimitiveStackTraceHandler); |
14847 } | 16309 } |
14848 | 16310 |
14849 | 16311 |
14850 static void RethrowExistingStackTraceHandler(v8::Handle<v8::Message> message, | 16312 static void RethrowExistingStackTraceHandler(v8::Local<v8::Message> message, |
14851 v8::Handle<v8::Value> data) { | 16313 v8::Local<v8::Value> data) { |
14852 // Use the frame where JavaScript is called from. | 16314 // Use the frame where JavaScript is called from. |
14853 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16315 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14854 CHECK(!stack_trace.IsEmpty()); | 16316 CHECK(!stack_trace.IsEmpty()); |
14855 CHECK_EQ(1, stack_trace->GetFrameCount()); | 16317 CHECK_EQ(1, stack_trace->GetFrameCount()); |
14856 CHECK_EQ(1, stack_trace->GetFrame(0)->GetLineNumber()); | 16318 CHECK_EQ(1, stack_trace->GetFrame(0)->GetLineNumber()); |
14857 } | 16319 } |
14858 | 16320 |
14859 | 16321 |
14860 // Test that the stack trace is captured when the error object is created and | 16322 // Test that the stack trace is captured when the error object is created and |
14861 // not where it is thrown. | 16323 // not where it is thrown. |
14862 TEST(RethrowExistingStackTrace) { | 16324 TEST(RethrowExistingStackTrace) { |
14863 LocalContext env; | 16325 LocalContext env; |
14864 v8::HandleScope scope(env->GetIsolate()); | 16326 v8::HandleScope scope(env->GetIsolate()); |
14865 const char* source = | 16327 const char* source = |
14866 "var e = new Error(); \n" | 16328 "var e = new Error(); \n" |
14867 "throw e; \n"; | 16329 "throw e; \n"; |
14868 v8::V8::AddMessageListener(RethrowExistingStackTraceHandler); | 16330 v8::V8::AddMessageListener(RethrowExistingStackTraceHandler); |
14869 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); | 16331 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); |
14870 CompileRun(source); | 16332 CompileRun(source); |
14871 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); | 16333 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); |
14872 v8::V8::RemoveMessageListeners(RethrowExistingStackTraceHandler); | 16334 v8::V8::RemoveMessageListeners(RethrowExistingStackTraceHandler); |
14873 } | 16335 } |
14874 | 16336 |
14875 | 16337 |
14876 static void RethrowBogusErrorStackTraceHandler(v8::Handle<v8::Message> message, | 16338 static void RethrowBogusErrorStackTraceHandler(v8::Local<v8::Message> message, |
14877 v8::Handle<v8::Value> data) { | 16339 v8::Local<v8::Value> data) { |
14878 // Use the frame where JavaScript is called from. | 16340 // Use the frame where JavaScript is called from. |
14879 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16341 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14880 CHECK(!stack_trace.IsEmpty()); | 16342 CHECK(!stack_trace.IsEmpty()); |
14881 CHECK_EQ(1, stack_trace->GetFrameCount()); | 16343 CHECK_EQ(1, stack_trace->GetFrameCount()); |
14882 CHECK_EQ(2, stack_trace->GetFrame(0)->GetLineNumber()); | 16344 CHECK_EQ(2, stack_trace->GetFrame(0)->GetLineNumber()); |
14883 } | 16345 } |
14884 | 16346 |
14885 | 16347 |
14886 // Test that the stack trace is captured where the bogus Error object is thrown. | 16348 // Test that the stack trace is captured where the bogus Error object is thrown. |
14887 TEST(RethrowBogusErrorStackTrace) { | 16349 TEST(RethrowBogusErrorStackTrace) { |
14888 LocalContext env; | 16350 LocalContext env; |
14889 v8::HandleScope scope(env->GetIsolate()); | 16351 v8::HandleScope scope(env->GetIsolate()); |
(...skipping 15 matching lines...) Expand all Loading... | |
14905 int promise_reject_msg_column_number = -1; | 16367 int promise_reject_msg_column_number = -1; |
14906 int promise_reject_line_number = -1; | 16368 int promise_reject_line_number = -1; |
14907 int promise_reject_column_number = -1; | 16369 int promise_reject_column_number = -1; |
14908 int promise_reject_frame_count = -1; | 16370 int promise_reject_frame_count = -1; |
14909 | 16371 |
14910 void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) { | 16372 void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) { |
14911 if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) { | 16373 if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) { |
14912 promise_reject_counter++; | 16374 promise_reject_counter++; |
14913 CcTest::global()->Set(v8_str("rejected"), reject_message.GetPromise()); | 16375 CcTest::global()->Set(v8_str("rejected"), reject_message.GetPromise()); |
14914 CcTest::global()->Set(v8_str("value"), reject_message.GetValue()); | 16376 CcTest::global()->Set(v8_str("value"), reject_message.GetValue()); |
14915 v8::Handle<v8::Message> message = | 16377 v8::Local<v8::Message> message = |
14916 v8::Exception::CreateMessage(reject_message.GetValue()); | 16378 v8::Exception::CreateMessage(reject_message.GetValue()); |
14917 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); | 16379 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace(); |
14918 | 16380 |
14919 promise_reject_msg_line_number = message->GetLineNumber(); | 16381 promise_reject_msg_line_number = message->GetLineNumber(); |
14920 promise_reject_msg_column_number = message->GetStartColumn() + 1; | 16382 promise_reject_msg_column_number = message->GetStartColumn() + 1; |
14921 | 16383 |
14922 if (!stack_trace.IsEmpty()) { | 16384 if (!stack_trace.IsEmpty()) { |
14923 promise_reject_frame_count = stack_trace->GetFrameCount(); | 16385 promise_reject_frame_count = stack_trace->GetFrameCount(); |
14924 if (promise_reject_frame_count > 0) { | 16386 if (promise_reject_frame_count > 0) { |
14925 CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro"))); | 16387 CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro"))); |
14926 promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber(); | 16388 promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber(); |
14927 promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn(); | 16389 promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn(); |
14928 } else { | 16390 } else { |
14929 promise_reject_line_number = -1; | 16391 promise_reject_line_number = -1; |
14930 promise_reject_column_number = -1; | 16392 promise_reject_column_number = -1; |
14931 } | 16393 } |
14932 } | 16394 } |
14933 } else { | 16395 } else { |
14934 promise_revoke_counter++; | 16396 promise_revoke_counter++; |
14935 CcTest::global()->Set(v8_str("revoked"), reject_message.GetPromise()); | 16397 CcTest::global()->Set(v8_str("revoked"), reject_message.GetPromise()); |
14936 CHECK(reject_message.GetValue().IsEmpty()); | 16398 CHECK(reject_message.GetValue().IsEmpty()); |
14937 } | 16399 } |
14938 } | 16400 } |
14939 | 16401 |
14940 | 16402 |
14941 v8::Handle<v8::Promise> GetPromise(const char* name) { | 16403 v8::Local<v8::Promise> GetPromise(const char* name) { |
14942 return v8::Handle<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); | 16404 return v8::Local<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); |
14943 } | 16405 } |
14944 | 16406 |
14945 | 16407 |
14946 v8::Handle<v8::Value> RejectValue() { | 16408 v8::Local<v8::Value> RejectValue() { |
14947 return CcTest::global()->Get(v8_str("value")); | 16409 return CcTest::global()->Get(v8_str("value")); |
14948 } | 16410 } |
14949 | 16411 |
14950 | 16412 |
14951 void ResetPromiseStates() { | 16413 void ResetPromiseStates() { |
14952 promise_reject_counter = 0; | 16414 promise_reject_counter = 0; |
14953 promise_revoke_counter = 0; | 16415 promise_revoke_counter = 0; |
14954 promise_reject_msg_line_number = -1; | 16416 promise_reject_msg_line_number = -1; |
14955 promise_reject_msg_column_number = -1; | 16417 promise_reject_msg_column_number = -1; |
14956 promise_reject_line_number = -1; | 16418 promise_reject_line_number = -1; |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15275 CHECK_EQ(5, promise_reject_line_number); | 16737 CHECK_EQ(5, promise_reject_line_number); |
15276 CHECK_EQ(10, promise_reject_column_number); | 16738 CHECK_EQ(10, promise_reject_column_number); |
15277 CHECK_EQ(2, promise_reject_msg_line_number); | 16739 CHECK_EQ(2, promise_reject_msg_line_number); |
15278 CHECK_EQ(7, promise_reject_msg_column_number); | 16740 CHECK_EQ(7, promise_reject_msg_column_number); |
15279 } | 16741 } |
15280 | 16742 |
15281 | 16743 |
15282 void AnalyzeStackOfEvalWithSourceURL( | 16744 void AnalyzeStackOfEvalWithSourceURL( |
15283 const v8::FunctionCallbackInfo<v8::Value>& args) { | 16745 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15284 v8::HandleScope scope(args.GetIsolate()); | 16746 v8::HandleScope scope(args.GetIsolate()); |
15285 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 16747 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
15286 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 16748 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
15287 CHECK_EQ(5, stackTrace->GetFrameCount()); | 16749 CHECK_EQ(5, stackTrace->GetFrameCount()); |
15288 v8::Handle<v8::String> url = v8_str("eval_url"); | 16750 v8::Local<v8::String> url = v8_str("eval_url"); |
15289 for (int i = 0; i < 3; i++) { | 16751 for (int i = 0; i < 3; i++) { |
15290 v8::Handle<v8::String> name = | 16752 v8::Local<v8::String> name = |
15291 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); | 16753 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); |
15292 CHECK(!name.IsEmpty()); | 16754 CHECK(!name.IsEmpty()); |
15293 CHECK(url->Equals(name)); | 16755 CHECK(url->Equals(name)); |
15294 } | 16756 } |
15295 } | 16757 } |
15296 | 16758 |
15297 | 16759 |
15298 TEST(SourceURLInStackTrace) { | 16760 TEST(SourceURLInStackTrace) { |
15299 v8::Isolate* isolate = CcTest::isolate(); | 16761 v8::Isolate* isolate = CcTest::isolate(); |
15300 v8::HandleScope scope(isolate); | 16762 v8::HandleScope scope(isolate); |
(...skipping 22 matching lines...) Expand all Loading... | |
15323 i::SNPrintF(code, source, "//@ sourceURL=eval_url"); | 16785 i::SNPrintF(code, source, "//@ sourceURL=eval_url"); |
15324 CHECK(CompileRun(code.start())->IsUndefined()); | 16786 CHECK(CompileRun(code.start())->IsUndefined()); |
15325 } | 16787 } |
15326 | 16788 |
15327 | 16789 |
15328 static int scriptIdInStack[2]; | 16790 static int scriptIdInStack[2]; |
15329 | 16791 |
15330 void AnalyzeScriptIdInStack( | 16792 void AnalyzeScriptIdInStack( |
15331 const v8::FunctionCallbackInfo<v8::Value>& args) { | 16793 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15332 v8::HandleScope scope(args.GetIsolate()); | 16794 v8::HandleScope scope(args.GetIsolate()); |
15333 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 16795 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
15334 args.GetIsolate(), 10, v8::StackTrace::kScriptId); | 16796 args.GetIsolate(), 10, v8::StackTrace::kScriptId); |
15335 CHECK_EQ(2, stackTrace->GetFrameCount()); | 16797 CHECK_EQ(2, stackTrace->GetFrameCount()); |
15336 for (int i = 0; i < 2; i++) { | 16798 for (int i = 0; i < 2; i++) { |
15337 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); | 16799 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); |
15338 } | 16800 } |
15339 } | 16801 } |
15340 | 16802 |
15341 | 16803 |
15342 TEST(ScriptIdInStackTrace) { | 16804 TEST(ScriptIdInStackTrace) { |
15343 v8::Isolate* isolate = CcTest::isolate(); | 16805 v8::Isolate* isolate = CcTest::isolate(); |
15344 v8::HandleScope scope(isolate); | 16806 v8::HandleScope scope(isolate); |
15345 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 16807 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
15346 templ->Set(v8_str("AnalyzeScriptIdInStack"), | 16808 templ->Set(v8_str("AnalyzeScriptIdInStack"), |
15347 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); | 16809 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); |
15348 LocalContext context(0, templ); | 16810 LocalContext context(0, templ); |
15349 | 16811 |
15350 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( | 16812 v8::Local<v8::String> scriptSource = v8_str( |
15351 isolate, | 16813 "function foo() {\n" |
15352 "function foo() {\n" | 16814 " AnalyzeScriptIdInStack();" |
15353 " AnalyzeScriptIdInStack();" | 16815 "}\n" |
15354 "}\n" | 16816 "foo();\n"); |
15355 "foo();\n"); | |
15356 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test"); | 16817 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test"); |
15357 script->Run(); | 16818 script->Run(); |
15358 for (int i = 0; i < 2; i++) { | 16819 for (int i = 0; i < 2; i++) { |
15359 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); | 16820 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); |
15360 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId()); | 16821 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId()); |
15361 } | 16822 } |
15362 } | 16823 } |
15363 | 16824 |
15364 | 16825 |
15365 void AnalyzeStackOfInlineScriptWithSourceURL( | 16826 void AnalyzeStackOfInlineScriptWithSourceURL( |
15366 const v8::FunctionCallbackInfo<v8::Value>& args) { | 16827 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15367 v8::HandleScope scope(args.GetIsolate()); | 16828 v8::HandleScope scope(args.GetIsolate()); |
15368 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 16829 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
15369 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 16830 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
15370 CHECK_EQ(4, stackTrace->GetFrameCount()); | 16831 CHECK_EQ(4, stackTrace->GetFrameCount()); |
15371 v8::Handle<v8::String> url = v8_str("source_url"); | 16832 v8::Local<v8::String> url = v8_str("source_url"); |
15372 for (int i = 0; i < 3; i++) { | 16833 for (int i = 0; i < 3; i++) { |
15373 v8::Handle<v8::String> name = | 16834 v8::Local<v8::String> name = |
15374 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); | 16835 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); |
15375 CHECK(!name.IsEmpty()); | 16836 CHECK(!name.IsEmpty()); |
15376 CHECK(url->Equals(name)); | 16837 CHECK(url->Equals(name)); |
15377 } | 16838 } |
15378 } | 16839 } |
15379 | 16840 |
15380 | 16841 |
15381 TEST(InlineScriptWithSourceURLInStackTrace) { | 16842 TEST(InlineScriptWithSourceURLInStackTrace) { |
15382 v8::Isolate* isolate = CcTest::isolate(); | 16843 v8::Isolate* isolate = CcTest::isolate(); |
15383 v8::HandleScope scope(isolate); | 16844 v8::HandleScope scope(isolate); |
(...skipping 20 matching lines...) Expand all Loading... | |
15404 i::SNPrintF(code, source, "//# sourceURL=source_url"); | 16865 i::SNPrintF(code, source, "//# sourceURL=source_url"); |
15405 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); | 16866 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); |
15406 i::SNPrintF(code, source, "//@ sourceURL=source_url"); | 16867 i::SNPrintF(code, source, "//@ sourceURL=source_url"); |
15407 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); | 16868 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); |
15408 } | 16869 } |
15409 | 16870 |
15410 | 16871 |
15411 void AnalyzeStackOfDynamicScriptWithSourceURL( | 16872 void AnalyzeStackOfDynamicScriptWithSourceURL( |
15412 const v8::FunctionCallbackInfo<v8::Value>& args) { | 16873 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15413 v8::HandleScope scope(args.GetIsolate()); | 16874 v8::HandleScope scope(args.GetIsolate()); |
15414 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 16875 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
15415 args.GetIsolate(), 10, v8::StackTrace::kDetailed); | 16876 args.GetIsolate(), 10, v8::StackTrace::kDetailed); |
15416 CHECK_EQ(4, stackTrace->GetFrameCount()); | 16877 CHECK_EQ(4, stackTrace->GetFrameCount()); |
15417 v8::Handle<v8::String> url = v8_str("source_url"); | 16878 v8::Local<v8::String> url = v8_str("source_url"); |
15418 for (int i = 0; i < 3; i++) { | 16879 for (int i = 0; i < 3; i++) { |
15419 v8::Handle<v8::String> name = | 16880 v8::Local<v8::String> name = |
15420 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); | 16881 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); |
15421 CHECK(!name.IsEmpty()); | 16882 CHECK(!name.IsEmpty()); |
15422 CHECK(url->Equals(name)); | 16883 CHECK(url->Equals(name)); |
15423 } | 16884 } |
15424 } | 16885 } |
15425 | 16886 |
15426 | 16887 |
15427 TEST(DynamicWithSourceURLInStackTrace) { | 16888 TEST(DynamicWithSourceURLInStackTrace) { |
15428 v8::Isolate* isolate = CcTest::isolate(); | 16889 v8::Isolate* isolate = CcTest::isolate(); |
15429 v8::HandleScope scope(isolate); | 16890 v8::HandleScope scope(isolate); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15488 " eval(scriptContents);\n" | 16949 " eval(scriptContents);\n" |
15489 " foo(); }\n" | 16950 " foo(); }\n" |
15490 "outer();\n" | 16951 "outer();\n" |
15491 "//# sourceURL=outer_url"; | 16952 "//# sourceURL=outer_url"; |
15492 | 16953 |
15493 v8::TryCatch try_catch(context->GetIsolate()); | 16954 v8::TryCatch try_catch(context->GetIsolate()); |
15494 CompileRun(source); | 16955 CompileRun(source); |
15495 CHECK(try_catch.HasCaught()); | 16956 CHECK(try_catch.HasCaught()); |
15496 | 16957 |
15497 Local<v8::Message> message = try_catch.Message(); | 16958 Local<v8::Message> message = try_catch.Message(); |
15498 Handle<Value> sourceURL = | 16959 Local<Value> sourceURL = message->GetScriptOrigin().ResourceName(); |
15499 message->GetScriptOrigin().ResourceName(); | |
15500 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); | 16960 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); |
15501 } | 16961 } |
15502 | 16962 |
15503 | 16963 |
15504 TEST(RecursionWithSourceURLInMessageScriptResourceNameOrSourceURL) { | 16964 TEST(RecursionWithSourceURLInMessageScriptResourceNameOrSourceURL) { |
15505 LocalContext context; | 16965 LocalContext context; |
15506 v8::HandleScope scope(context->GetIsolate()); | 16966 v8::HandleScope scope(context->GetIsolate()); |
15507 | 16967 |
15508 const char *source = | 16968 const char *source = |
15509 "function outer() {\n" | 16969 "function outer() {\n" |
15510 " var scriptContents = \"function boo(){ boo(); }\\\n" | 16970 " var scriptContents = \"function boo(){ boo(); }\\\n" |
15511 " //# sourceURL=source_url\";\n" | 16971 " //# sourceURL=source_url\";\n" |
15512 " eval(scriptContents);\n" | 16972 " eval(scriptContents);\n" |
15513 " boo(); }\n" | 16973 " boo(); }\n" |
15514 "outer();\n" | 16974 "outer();\n" |
15515 "//# sourceURL=outer_url"; | 16975 "//# sourceURL=outer_url"; |
15516 | 16976 |
15517 v8::TryCatch try_catch(context->GetIsolate()); | 16977 v8::TryCatch try_catch(context->GetIsolate()); |
15518 CompileRun(source); | 16978 CompileRun(source); |
15519 CHECK(try_catch.HasCaught()); | 16979 CHECK(try_catch.HasCaught()); |
15520 | 16980 |
15521 Local<v8::Message> message = try_catch.Message(); | 16981 Local<v8::Message> message = try_catch.Message(); |
15522 Handle<Value> sourceURL = | 16982 Local<Value> sourceURL = message->GetScriptOrigin().ResourceName(); |
15523 message->GetScriptOrigin().ResourceName(); | |
15524 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); | 16983 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); |
15525 } | 16984 } |
15526 | 16985 |
15527 | 16986 |
15528 static void CreateGarbageInOldSpace() { | 16987 static void CreateGarbageInOldSpace() { |
15529 i::Factory* factory = CcTest::i_isolate()->factory(); | 16988 i::Factory* factory = CcTest::i_isolate()->factory(); |
15530 v8::HandleScope scope(CcTest::isolate()); | 16989 v8::HandleScope scope(CcTest::isolate()); |
15531 i::AlwaysAllocateScope always_allocate(CcTest::i_isolate()); | 16990 i::AlwaysAllocateScope always_allocate(CcTest::i_isolate()); |
15532 for (int i = 0; i < 1000; i++) { | 16991 for (int i = 0; i < 1000; i++) { |
15533 factory->NewFixedArray(1000, i::TENURED); | 16992 factory->NewFixedArray(1000, i::TENURED); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15603 uint32_t* set_limit = ComputeStackLimit(stack_breathing_room); | 17062 uint32_t* set_limit = ComputeStackLimit(stack_breathing_room); |
15604 | 17063 |
15605 // Set stack limit. | 17064 // Set stack limit. |
15606 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); | 17065 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); |
15607 | 17066 |
15608 // Execute a script. | 17067 // Execute a script. |
15609 LocalContext env; | 17068 LocalContext env; |
15610 v8::HandleScope scope(env->GetIsolate()); | 17069 v8::HandleScope scope(env->GetIsolate()); |
15611 Local<v8::FunctionTemplate> fun_templ = | 17070 Local<v8::FunctionTemplate> fun_templ = |
15612 v8::FunctionTemplate::New(env->GetIsolate(), GetStackLimitCallback); | 17071 v8::FunctionTemplate::New(env->GetIsolate(), GetStackLimitCallback); |
15613 Local<Function> fun = fun_templ->GetFunction(); | 17072 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
15614 env->Global()->Set(v8_str("get_stack_limit"), fun); | 17073 CHECK(env->Global() |
17074 ->Set(env.local(), v8_str("get_stack_limit"), fun) | |
17075 .FromJust()); | |
15615 CompileRun("get_stack_limit();"); | 17076 CompileRun("get_stack_limit();"); |
15616 | 17077 |
15617 CHECK(stack_limit == set_limit); | 17078 CHECK(stack_limit == set_limit); |
15618 } | 17079 } |
15619 | 17080 |
15620 | 17081 |
15621 TEST(SetStackLimitInThread) { | 17082 TEST(SetStackLimitInThread) { |
15622 uint32_t* set_limit; | 17083 uint32_t* set_limit; |
15623 { | 17084 { |
15624 v8::Locker locker(CcTest::isolate()); | 17085 v8::Locker locker(CcTest::isolate()); |
15625 set_limit = ComputeStackLimit(stack_breathing_room); | 17086 set_limit = ComputeStackLimit(stack_breathing_room); |
15626 | 17087 |
15627 // Set stack limit. | 17088 // Set stack limit. |
15628 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); | 17089 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); |
15629 | 17090 |
15630 // Execute a script. | 17091 // Execute a script. |
15631 v8::HandleScope scope(CcTest::isolate()); | 17092 v8::HandleScope scope(CcTest::isolate()); |
15632 LocalContext env; | 17093 LocalContext env; |
15633 Local<v8::FunctionTemplate> fun_templ = | 17094 Local<v8::FunctionTemplate> fun_templ = |
15634 v8::FunctionTemplate::New(CcTest::isolate(), GetStackLimitCallback); | 17095 v8::FunctionTemplate::New(CcTest::isolate(), GetStackLimitCallback); |
15635 Local<Function> fun = fun_templ->GetFunction(); | 17096 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked(); |
15636 env->Global()->Set(v8_str("get_stack_limit"), fun); | 17097 CHECK(env->Global() |
17098 ->Set(env.local(), v8_str("get_stack_limit"), fun) | |
17099 .FromJust()); | |
15637 CompileRun("get_stack_limit();"); | 17100 CompileRun("get_stack_limit();"); |
15638 | 17101 |
15639 CHECK(stack_limit == set_limit); | 17102 CHECK(stack_limit == set_limit); |
15640 } | 17103 } |
15641 { | 17104 { |
15642 v8::Locker locker(CcTest::isolate()); | 17105 v8::Locker locker(CcTest::isolate()); |
15643 CHECK(stack_limit == set_limit); | 17106 CHECK(stack_limit == set_limit); |
15644 } | 17107 } |
15645 } | 17108 } |
15646 | 17109 |
(...skipping 12 matching lines...) Expand all Loading... | |
15659 | 17122 |
15660 class VisitorImpl : public v8::ExternalResourceVisitor { | 17123 class VisitorImpl : public v8::ExternalResourceVisitor { |
15661 public: | 17124 public: |
15662 explicit VisitorImpl(TestResource** resource) { | 17125 explicit VisitorImpl(TestResource** resource) { |
15663 for (int i = 0; i < 4; i++) { | 17126 for (int i = 0; i < 4; i++) { |
15664 resource_[i] = resource[i]; | 17127 resource_[i] = resource[i]; |
15665 found_resource_[i] = false; | 17128 found_resource_[i] = false; |
15666 } | 17129 } |
15667 } | 17130 } |
15668 virtual ~VisitorImpl() {} | 17131 virtual ~VisitorImpl() {} |
15669 virtual void VisitExternalString(v8::Handle<v8::String> string) { | 17132 virtual void VisitExternalString(v8::Local<v8::String> string) { |
15670 if (!string->IsExternal()) { | 17133 if (!string->IsExternal()) { |
15671 CHECK(string->IsExternalOneByte()); | 17134 CHECK(string->IsExternalOneByte()); |
15672 return; | 17135 return; |
15673 } | 17136 } |
15674 v8::String::ExternalStringResource* resource = | 17137 v8::String::ExternalStringResource* resource = |
15675 string->GetExternalStringResource(); | 17138 string->GetExternalStringResource(); |
15676 CHECK(resource); | 17139 CHECK(resource); |
15677 for (int i = 0; i < 4; i++) { | 17140 for (int i = 0; i < 4; i++) { |
15678 if (resource_[i] == resource) { | 17141 if (resource_[i] == resource) { |
15679 CHECK(!found_resource_[i]); | 17142 CHECK(!found_resource_[i]); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15746 TestResource* resource[4]; | 17209 TestResource* resource[4]; |
15747 resource[0] = new TestResource(two_byte_string); | 17210 resource[0] = new TestResource(two_byte_string); |
15748 v8::Local<v8::String> string0 = | 17211 v8::Local<v8::String> string0 = |
15749 v8::String::NewExternal(env->GetIsolate(), resource[0]); | 17212 v8::String::NewExternal(env->GetIsolate(), resource[0]); |
15750 resource[1] = new TestResource(two_byte_string, NULL, false); | 17213 resource[1] = new TestResource(two_byte_string, NULL, false); |
15751 v8::Local<v8::String> string1 = | 17214 v8::Local<v8::String> string1 = |
15752 v8::String::NewExternal(env->GetIsolate(), resource[1]); | 17215 v8::String::NewExternal(env->GetIsolate(), resource[1]); |
15753 | 17216 |
15754 // Externalized symbol. | 17217 // Externalized symbol. |
15755 resource[2] = new TestResource(two_byte_string, NULL, false); | 17218 resource[2] = new TestResource(two_byte_string, NULL, false); |
15756 v8::Local<v8::String> string2 = v8::String::NewFromUtf8( | 17219 v8::Local<v8::String> string2 = |
15757 env->GetIsolate(), string, v8::String::kInternalizedString); | 17220 v8::String::NewFromUtf8(env->GetIsolate(), string, |
17221 v8::NewStringType::kInternalized) | |
17222 .ToLocalChecked(); | |
15758 CHECK(string2->MakeExternal(resource[2])); | 17223 CHECK(string2->MakeExternal(resource[2])); |
15759 | 17224 |
15760 // Symbolized External. | 17225 // Symbolized External. |
15761 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); | 17226 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); |
15762 v8::Local<v8::String> string3 = | 17227 v8::Local<v8::String> string3 = |
15763 v8::String::NewExternal(env->GetIsolate(), resource[3]); | 17228 v8::String::NewExternal(env->GetIsolate(), resource[3]); |
15764 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. | 17229 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. |
15765 // Turn into a symbol. | 17230 // Turn into a symbol. |
15766 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3); | 17231 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3); |
15767 CHECK(!CcTest::i_isolate()->factory()->InternalizeString( | 17232 CHECK(!CcTest::i_isolate()->factory()->InternalizeString( |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15923 -infinity, | 17388 -infinity, |
15924 -qnan, | 17389 -qnan, |
15925 -snan | 17390 -snan |
15926 }; | 17391 }; |
15927 int num_test_values = 20; | 17392 int num_test_values = 20; |
15928 | 17393 |
15929 for (int i = 0; i < num_test_values; i++) { | 17394 for (int i = 0; i < num_test_values; i++) { |
15930 double test_value = test_values[i]; | 17395 double test_value = test_values[i]; |
15931 | 17396 |
15932 // Check that Number::New preserves non-NaNs and quiets SNaNs. | 17397 // Check that Number::New preserves non-NaNs and quiets SNaNs. |
15933 v8::Handle<v8::Value> number = v8::Number::New(isolate, test_value); | 17398 v8::Local<v8::Value> number = v8::Number::New(isolate, test_value); |
15934 double stored_number = number->NumberValue(); | 17399 double stored_number = number->NumberValue(); |
15935 if (!std::isnan(test_value)) { | 17400 if (!std::isnan(test_value)) { |
15936 CHECK_EQ(test_value, stored_number); | 17401 CHECK_EQ(test_value, stored_number); |
15937 } else { | 17402 } else { |
15938 uint64_t stored_bits = DoubleToBits(stored_number); | 17403 uint64_t stored_bits = DoubleToBits(stored_number); |
15939 // Check if quiet nan (bits 51..62 all set). | 17404 // Check if quiet nan (bits 51..62 all set). |
15940 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ | 17405 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ |
15941 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ | 17406 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ |
15942 !defined(USE_SIMULATOR) | 17407 !defined(USE_SIMULATOR) |
15943 // Most significant fraction bit for quiet nan is set to 0 | 17408 // Most significant fraction bit for quiet nan is set to 0 |
15944 // on MIPS architecture. Allowed by IEEE-754. | 17409 // on MIPS architecture. Allowed by IEEE-754. |
15945 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); | 17410 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); |
15946 #else | 17411 #else |
15947 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); | 17412 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); |
15948 #endif | 17413 #endif |
15949 } | 17414 } |
15950 | 17415 |
15951 // Check that Date::New preserves non-NaNs in the date range and | 17416 // Check that Date::New preserves non-NaNs in the date range and |
15952 // quiets SNaNs. | 17417 // quiets SNaNs. |
15953 v8::Handle<v8::Value> date = | 17418 v8::Local<v8::Value> date = v8::Date::New(isolate, test_value); |
15954 v8::Date::New(isolate, test_value); | |
15955 double expected_stored_date = DoubleToDateTime(test_value); | 17419 double expected_stored_date = DoubleToDateTime(test_value); |
15956 double stored_date = date->NumberValue(); | 17420 double stored_date = date->NumberValue(); |
15957 if (!std::isnan(expected_stored_date)) { | 17421 if (!std::isnan(expected_stored_date)) { |
15958 CHECK_EQ(expected_stored_date, stored_date); | 17422 CHECK_EQ(expected_stored_date, stored_date); |
15959 } else { | 17423 } else { |
15960 uint64_t stored_bits = DoubleToBits(stored_date); | 17424 uint64_t stored_bits = DoubleToBits(stored_date); |
15961 // Check if quiet nan (bits 51..62 all set). | 17425 // Check if quiet nan (bits 51..62 all set). |
15962 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ | 17426 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ |
15963 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ | 17427 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ |
15964 !defined(USE_SIMULATOR) | 17428 !defined(USE_SIMULATOR) |
15965 // Most significant fraction bit for quiet nan is set to 0 | 17429 // Most significant fraction bit for quiet nan is set to 0 |
15966 // on MIPS architecture. Allowed by IEEE-754. | 17430 // on MIPS architecture. Allowed by IEEE-754. |
15967 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); | 17431 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); |
15968 #else | 17432 #else |
15969 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); | 17433 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); |
15970 #endif | 17434 #endif |
15971 } | 17435 } |
15972 } | 17436 } |
15973 } | 17437 } |
15974 | 17438 |
15975 | 17439 |
15976 static void SpaghettiIncident( | 17440 static void SpaghettiIncident( |
15977 const v8::FunctionCallbackInfo<v8::Value>& args) { | 17441 const v8::FunctionCallbackInfo<v8::Value>& args) { |
15978 v8::HandleScope scope(args.GetIsolate()); | 17442 v8::HandleScope scope(args.GetIsolate()); |
15979 v8::TryCatch tc(args.GetIsolate()); | 17443 v8::TryCatch tc(args.GetIsolate()); |
15980 v8::Handle<v8::String> str(args[0]->ToString(args.GetIsolate())); | 17444 v8::Local<v8::String> str(args[0]->ToString(args.GetIsolate())); |
15981 USE(str); | 17445 USE(str); |
15982 if (tc.HasCaught()) | 17446 if (tc.HasCaught()) |
15983 tc.ReThrow(); | 17447 tc.ReThrow(); |
15984 } | 17448 } |
15985 | 17449 |
15986 | 17450 |
15987 // Test that an exception can be propagated down through a spaghetti | 17451 // Test that an exception can be propagated down through a spaghetti |
15988 // stack using ReThrow. | 17452 // stack using ReThrow. |
15989 THREADED_TEST(SpaghettiStackReThrow) { | 17453 THREADED_TEST(SpaghettiStackReThrow) { |
15990 v8::Isolate* isolate = CcTest::isolate(); | 17454 v8::Isolate* isolate = CcTest::isolate(); |
15991 v8::HandleScope scope(isolate); | 17455 v8::HandleScope scope(isolate); |
15992 LocalContext context; | 17456 LocalContext context; |
15993 context->Global()->Set( | 17457 context->Global()->Set(v8_str("s"), |
15994 v8::String::NewFromUtf8(isolate, "s"), | 17458 v8::FunctionTemplate::New(isolate, SpaghettiIncident) |
15995 v8::FunctionTemplate::New(isolate, SpaghettiIncident)->GetFunction()); | 17459 ->GetFunction(context.local()) |
17460 .ToLocalChecked()); | |
15996 v8::TryCatch try_catch(isolate); | 17461 v8::TryCatch try_catch(isolate); |
15997 CompileRun( | 17462 CompileRun( |
15998 "var i = 0;" | 17463 "var i = 0;" |
15999 "var o = {" | 17464 "var o = {" |
16000 " toString: function () {" | 17465 " toString: function () {" |
16001 " if (i == 10) {" | 17466 " if (i == 10) {" |
16002 " throw 'Hey!';" | 17467 " throw 'Hey!';" |
16003 " } else {" | 17468 " } else {" |
16004 " i++;" | 17469 " i++;" |
16005 " return s(o);" | 17470 " return s(o);" |
(...skipping 20 matching lines...) Expand all Loading... | |
16026 other_context = Context::New(isolate); | 17491 other_context = Context::New(isolate); |
16027 | 17492 |
16028 // Context-dependent context data creates reference from the compilation | 17493 // Context-dependent context data creates reference from the compilation |
16029 // cache to the global object. | 17494 // cache to the global object. |
16030 const char* source_simple = "1"; | 17495 const char* source_simple = "1"; |
16031 { | 17496 { |
16032 v8::HandleScope scope(isolate); | 17497 v8::HandleScope scope(isolate); |
16033 v8::Local<Context> context = Context::New(isolate); | 17498 v8::Local<Context> context = Context::New(isolate); |
16034 | 17499 |
16035 context->Enter(); | 17500 context->Enter(); |
16036 Local<v8::String> obj = v8::String::NewFromUtf8(isolate, ""); | 17501 Local<v8::String> obj = v8_str(""); |
16037 context->SetEmbedderData(0, obj); | 17502 context->SetEmbedderData(0, obj); |
16038 CompileRun(source_simple); | 17503 CompileRun(source_simple); |
16039 context->Exit(); | 17504 context->Exit(); |
16040 } | 17505 } |
16041 isolate->ContextDisposedNotification(); | 17506 isolate->ContextDisposedNotification(); |
16042 for (gc_count = 1; gc_count < 10; gc_count++) { | 17507 for (gc_count = 1; gc_count < 10; gc_count++) { |
16043 other_context->Enter(); | 17508 other_context->Enter(); |
16044 CompileRun(source_simple); | 17509 CompileRun(source_simple); |
16045 other_context->Exit(); | 17510 other_context->Exit(); |
16046 CcTest::heap()->CollectAllGarbage(); | 17511 CcTest::heap()->CollectAllGarbage(); |
(...skipping 28 matching lines...) Expand all Loading... | |
16075 // compilation cache to the global object. | 17540 // compilation cache to the global object. |
16076 const char* source_exception = "function f(){throw 1;} f()"; | 17541 const char* source_exception = "function f(){throw 1;} f()"; |
16077 { | 17542 { |
16078 v8::HandleScope scope(isolate); | 17543 v8::HandleScope scope(isolate); |
16079 v8::Local<Context> context = Context::New(isolate); | 17544 v8::Local<Context> context = Context::New(isolate); |
16080 | 17545 |
16081 context->Enter(); | 17546 context->Enter(); |
16082 v8::TryCatch try_catch(isolate); | 17547 v8::TryCatch try_catch(isolate); |
16083 CompileRun(source_exception); | 17548 CompileRun(source_exception); |
16084 CHECK(try_catch.HasCaught()); | 17549 CHECK(try_catch.HasCaught()); |
16085 v8::Handle<v8::Message> message = try_catch.Message(); | 17550 v8::Local<v8::Message> message = try_catch.Message(); |
16086 CHECK(!message.IsEmpty()); | 17551 CHECK(!message.IsEmpty()); |
16087 CHECK_EQ(1, message->GetLineNumber()); | 17552 CHECK_EQ(1, message->GetLineNumber()); |
16088 context->Exit(); | 17553 context->Exit(); |
16089 } | 17554 } |
16090 isolate->ContextDisposedNotification(); | 17555 isolate->ContextDisposedNotification(); |
16091 for (gc_count = 1; gc_count < 10; gc_count++) { | 17556 for (gc_count = 1; gc_count < 10; gc_count++) { |
16092 other_context->Enter(); | 17557 other_context->Enter(); |
16093 CompileRun(source_exception); | 17558 CompileRun(source_exception); |
16094 other_context->Exit(); | 17559 other_context->Exit(); |
16095 CcTest::heap()->CollectAllGarbage(); | 17560 CcTest::heap()->CollectAllGarbage(); |
16096 if (GetGlobalObjectsCount() == 1) break; | 17561 if (GetGlobalObjectsCount() == 1) break; |
16097 } | 17562 } |
16098 CHECK_GE(2, gc_count); | 17563 CHECK_GE(2, gc_count); |
16099 CHECK_EQ(1, GetGlobalObjectsCount()); | 17564 CHECK_EQ(1, GetGlobalObjectsCount()); |
16100 | 17565 |
16101 isolate->ContextDisposedNotification(); | 17566 isolate->ContextDisposedNotification(); |
16102 } | 17567 } |
16103 | 17568 |
16104 | 17569 |
16105 THREADED_TEST(ScriptOrigin) { | 17570 THREADED_TEST(ScriptOrigin) { |
16106 LocalContext env; | 17571 LocalContext env; |
16107 v8::HandleScope scope(env->GetIsolate()); | 17572 v8::HandleScope scope(env->GetIsolate()); |
16108 v8::ScriptOrigin origin = v8::ScriptOrigin( | 17573 v8::ScriptOrigin origin = v8::ScriptOrigin( |
16109 v8::String::NewFromUtf8(env->GetIsolate(), "test"), | 17574 v8_str("test"), v8::Integer::New(env->GetIsolate(), 1), |
16110 v8::Integer::New(env->GetIsolate(), 1), | |
16111 v8::Integer::New(env->GetIsolate(), 1), v8::True(env->GetIsolate()), | 17575 v8::Integer::New(env->GetIsolate(), 1), v8::True(env->GetIsolate()), |
16112 v8::Handle<v8::Integer>(), v8::True(env->GetIsolate()), | 17576 v8::Local<v8::Integer>(), v8::True(env->GetIsolate()), |
16113 v8::String::NewFromUtf8(env->GetIsolate(), "http://sourceMapUrl"), | 17577 v8_str("http://sourceMapUrl"), v8::True(env->GetIsolate())); |
16114 v8::True(env->GetIsolate())); | 17578 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}"); |
16115 v8::Handle<v8::String> script = v8::String::NewFromUtf8( | |
16116 env->GetIsolate(), "function f() {}\n\nfunction g() {}"); | |
16117 v8::Script::Compile(script, &origin)->Run(); | 17579 v8::Script::Compile(script, &origin)->Run(); |
16118 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 17580 v8::Local<v8::Function> f = |
16119 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | 17581 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); |
16120 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 17582 v8::Local<v8::Function> g = |
16121 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); | 17583 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); |
16122 | 17584 |
16123 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin(); | 17585 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin(); |
16124 CHECK_EQ(0, strcmp("test", | 17586 CHECK_EQ(0, strcmp("test", |
16125 *v8::String::Utf8Value(script_origin_f.ResourceName()))); | 17587 *v8::String::Utf8Value(script_origin_f.ResourceName()))); |
16126 CHECK_EQ(1, script_origin_f.ResourceLineOffset()->Int32Value()); | 17588 CHECK_EQ( |
17589 1, | |
17590 script_origin_f.ResourceLineOffset()->Int32Value(env.local()).FromJust()); | |
16127 CHECK(script_origin_f.Options().IsSharedCrossOrigin()); | 17591 CHECK(script_origin_f.Options().IsSharedCrossOrigin()); |
16128 CHECK(script_origin_f.Options().IsEmbedderDebugScript()); | 17592 CHECK(script_origin_f.Options().IsEmbedderDebugScript()); |
16129 CHECK(script_origin_f.Options().IsOpaque()); | 17593 CHECK(script_origin_f.Options().IsOpaque()); |
16130 printf("is name = %d\n", script_origin_f.SourceMapUrl()->IsUndefined()); | 17594 printf("is name = %d\n", script_origin_f.SourceMapUrl()->IsUndefined()); |
16131 | 17595 |
16132 CHECK_EQ(0, strcmp("http://sourceMapUrl", | 17596 CHECK_EQ(0, strcmp("http://sourceMapUrl", |
16133 *v8::String::Utf8Value(script_origin_f.SourceMapUrl()))); | 17597 *v8::String::Utf8Value(script_origin_f.SourceMapUrl()))); |
16134 | 17598 |
16135 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin(); | 17599 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin(); |
16136 CHECK_EQ(0, strcmp("test", | 17600 CHECK_EQ(0, strcmp("test", |
16137 *v8::String::Utf8Value(script_origin_g.ResourceName()))); | 17601 *v8::String::Utf8Value(script_origin_g.ResourceName()))); |
16138 CHECK_EQ(1, script_origin_g.ResourceLineOffset()->Int32Value()); | 17602 CHECK_EQ( |
17603 1, | |
17604 script_origin_g.ResourceLineOffset()->Int32Value(env.local()).FromJust()); | |
16139 CHECK(script_origin_g.Options().IsSharedCrossOrigin()); | 17605 CHECK(script_origin_g.Options().IsSharedCrossOrigin()); |
16140 CHECK(script_origin_g.Options().IsEmbedderDebugScript()); | 17606 CHECK(script_origin_g.Options().IsEmbedderDebugScript()); |
16141 CHECK(script_origin_g.Options().IsOpaque()); | 17607 CHECK(script_origin_g.Options().IsOpaque()); |
16142 CHECK_EQ(0, strcmp("http://sourceMapUrl", | 17608 CHECK_EQ(0, strcmp("http://sourceMapUrl", |
16143 *v8::String::Utf8Value(script_origin_g.SourceMapUrl()))); | 17609 *v8::String::Utf8Value(script_origin_g.SourceMapUrl()))); |
16144 } | 17610 } |
16145 | 17611 |
16146 | 17612 |
16147 THREADED_TEST(FunctionGetInferredName) { | 17613 THREADED_TEST(FunctionGetInferredName) { |
16148 LocalContext env; | 17614 LocalContext env; |
16149 v8::HandleScope scope(env->GetIsolate()); | 17615 v8::HandleScope scope(env->GetIsolate()); |
16150 v8::ScriptOrigin origin = | 17616 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); |
16151 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); | 17617 v8::Local<v8::String> script = |
16152 v8::Handle<v8::String> script = v8::String::NewFromUtf8( | 17618 v8_str("var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;"); |
16153 env->GetIsolate(), | |
16154 "var foo = { bar : { baz : function() {}}}; var f = foo.bar.baz;"); | |
16155 v8::Script::Compile(script, &origin)->Run(); | 17619 v8::Script::Compile(script, &origin)->Run(); |
16156 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 17620 v8::Local<v8::Function> f = |
16157 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | 17621 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); |
16158 CHECK_EQ(0, | 17622 CHECK_EQ(0, |
16159 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()))); | 17623 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()))); |
16160 } | 17624 } |
16161 | 17625 |
16162 | 17626 |
16163 THREADED_TEST(FunctionGetDebugName) { | 17627 THREADED_TEST(FunctionGetDebugName) { |
16164 LocalContext env; | 17628 LocalContext env; |
16165 v8::HandleScope scope(env->GetIsolate()); | 17629 v8::HandleScope scope(env->GetIsolate()); |
16166 const char* code = | 17630 const char* code = |
16167 "var error = false;" | 17631 "var error = false;" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16261 " throw new Error();" | 17725 " throw new Error();" |
16262 "});" | 17726 "});" |
16263 "function f() {};" | 17727 "function f() {};" |
16264 "f.displayName = { 'foo': 6, toString: function() {" | 17728 "f.displayName = { 'foo': 6, toString: function() {" |
16265 " error = true;" | 17729 " error = true;" |
16266 " return 'wrong_display_name';" | 17730 " return 'wrong_display_name';" |
16267 "}};" | 17731 "}};" |
16268 "var g = function() {" | 17732 "var g = function() {" |
16269 " arguments.callee.displayName = 'set_in_runtime';" | 17733 " arguments.callee.displayName = 'set_in_runtime';" |
16270 "}; g();"; | 17734 "}; g();"; |
16271 v8::ScriptOrigin origin = | 17735 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); |
16272 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); | 17736 v8::Script::Compile(v8_str(code), &origin)->Run(); |
16273 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), code), &origin) | 17737 v8::Local<v8::Value> error = env->Global()->Get(v8_str("error")); |
16274 ->Run(); | 17738 v8::Local<v8::Function> a = |
16275 v8::Local<v8::Value> error = | 17739 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("a"))); |
16276 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "error")); | 17740 v8::Local<v8::Function> b = |
16277 v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast( | 17741 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("b"))); |
16278 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "a"))); | 17742 v8::Local<v8::Function> c = |
16279 v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast( | 17743 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("c"))); |
16280 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "b"))); | 17744 v8::Local<v8::Function> d = |
16281 v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast( | 17745 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("d"))); |
16282 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "c"))); | 17746 v8::Local<v8::Function> e = |
16283 v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast( | 17747 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("e"))); |
16284 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "d"))); | 17748 v8::Local<v8::Function> f = |
16285 v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast( | 17749 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); |
16286 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "e"))); | 17750 v8::Local<v8::Function> g = |
16287 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 17751 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); |
16288 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | |
16289 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | |
16290 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); | |
16291 CHECK_EQ(false, error->BooleanValue()); | 17752 CHECK_EQ(false, error->BooleanValue()); |
16292 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName()))); | 17753 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName()))); |
16293 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName()))); | 17754 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName()))); |
16294 CHECK(c->GetDisplayName()->IsUndefined()); | 17755 CHECK(c->GetDisplayName()->IsUndefined()); |
16295 CHECK(d->GetDisplayName()->IsUndefined()); | 17756 CHECK(d->GetDisplayName()->IsUndefined()); |
16296 CHECK(e->GetDisplayName()->IsUndefined()); | 17757 CHECK(e->GetDisplayName()->IsUndefined()); |
16297 CHECK(f->GetDisplayName()->IsUndefined()); | 17758 CHECK(f->GetDisplayName()->IsUndefined()); |
16298 CHECK_EQ( | 17759 CHECK_EQ( |
16299 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()))); | 17760 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()))); |
16300 } | 17761 } |
16301 | 17762 |
16302 | 17763 |
16303 THREADED_TEST(ScriptLineNumber) { | 17764 THREADED_TEST(ScriptLineNumber) { |
16304 LocalContext env; | 17765 LocalContext env; |
16305 v8::HandleScope scope(env->GetIsolate()); | 17766 v8::HandleScope scope(env->GetIsolate()); |
16306 v8::ScriptOrigin origin = | 17767 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); |
16307 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); | 17768 v8::Local<v8::String> script = v8_str("function f() {}\n\nfunction g() {}"); |
16308 v8::Handle<v8::String> script = v8::String::NewFromUtf8( | |
16309 env->GetIsolate(), "function f() {}\n\nfunction g() {}"); | |
16310 v8::Script::Compile(script, &origin)->Run(); | 17769 v8::Script::Compile(script, &origin)->Run(); |
16311 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 17770 v8::Local<v8::Function> f = |
16312 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | 17771 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); |
16313 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 17772 v8::Local<v8::Function> g = |
16314 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); | 17773 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); |
16315 CHECK_EQ(0, f->GetScriptLineNumber()); | 17774 CHECK_EQ(0, f->GetScriptLineNumber()); |
16316 CHECK_EQ(2, g->GetScriptLineNumber()); | 17775 CHECK_EQ(2, g->GetScriptLineNumber()); |
16317 } | 17776 } |
16318 | 17777 |
16319 | 17778 |
16320 THREADED_TEST(ScriptColumnNumber) { | 17779 THREADED_TEST(ScriptColumnNumber) { |
16321 LocalContext env; | 17780 LocalContext env; |
16322 v8::Isolate* isolate = env->GetIsolate(); | 17781 v8::Isolate* isolate = env->GetIsolate(); |
16323 v8::HandleScope scope(isolate); | 17782 v8::HandleScope scope(isolate); |
16324 v8::ScriptOrigin origin = | 17783 v8::ScriptOrigin origin = |
16325 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test"), | 17784 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3), |
16326 v8::Integer::New(isolate, 3), | |
16327 v8::Integer::New(isolate, 2)); | 17785 v8::Integer::New(isolate, 2)); |
16328 v8::Handle<v8::String> script = v8::String::NewFromUtf8( | 17786 v8::Local<v8::String> script = |
16329 isolate, "function foo() {}\n\n function bar() {}"); | 17787 v8_str("function foo() {}\n\n function bar() {}"); |
16330 v8::Script::Compile(script, &origin)->Run(); | 17788 v8::Script::Compile(script, &origin)->Run(); |
16331 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 17789 v8::Local<v8::Function> foo = |
16332 env->Global()->Get(v8::String::NewFromUtf8(isolate, "foo"))); | 17790 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo"))); |
16333 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( | 17791 v8::Local<v8::Function> bar = |
16334 env->Global()->Get(v8::String::NewFromUtf8(isolate, "bar"))); | 17792 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar"))); |
16335 CHECK_EQ(14, foo->GetScriptColumnNumber()); | 17793 CHECK_EQ(14, foo->GetScriptColumnNumber()); |
16336 CHECK_EQ(17, bar->GetScriptColumnNumber()); | 17794 CHECK_EQ(17, bar->GetScriptColumnNumber()); |
16337 } | 17795 } |
16338 | 17796 |
16339 | 17797 |
16340 THREADED_TEST(FunctionIsBuiltin) { | 17798 THREADED_TEST(FunctionIsBuiltin) { |
16341 LocalContext env; | 17799 LocalContext env; |
16342 v8::Isolate* isolate = env->GetIsolate(); | 17800 v8::Isolate* isolate = env->GetIsolate(); |
16343 v8::HandleScope scope(isolate); | 17801 v8::HandleScope scope(isolate); |
16344 v8::Local<v8::Function> f; | 17802 v8::Local<v8::Function> f; |
16345 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor")); | 17803 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor")); |
16346 CHECK(f->IsBuiltin()); | 17804 CHECK(f->IsBuiltin()); |
16347 f = v8::Local<v8::Function>::Cast(CompileRun("Object")); | 17805 f = v8::Local<v8::Function>::Cast(CompileRun("Object")); |
16348 CHECK(f->IsBuiltin()); | 17806 CHECK(f->IsBuiltin()); |
16349 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__")); | 17807 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__")); |
16350 CHECK(f->IsBuiltin()); | 17808 CHECK(f->IsBuiltin()); |
16351 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString")); | 17809 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString")); |
16352 CHECK(f->IsBuiltin()); | 17810 CHECK(f->IsBuiltin()); |
16353 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;")); | 17811 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;")); |
16354 CHECK(!f->IsBuiltin()); | 17812 CHECK(!f->IsBuiltin()); |
16355 } | 17813 } |
16356 | 17814 |
16357 | 17815 |
16358 THREADED_TEST(FunctionGetScriptId) { | 17816 THREADED_TEST(FunctionGetScriptId) { |
16359 LocalContext env; | 17817 LocalContext env; |
16360 v8::Isolate* isolate = env->GetIsolate(); | 17818 v8::Isolate* isolate = env->GetIsolate(); |
16361 v8::HandleScope scope(isolate); | 17819 v8::HandleScope scope(isolate); |
16362 v8::ScriptOrigin origin = | 17820 v8::ScriptOrigin origin = |
16363 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test"), | 17821 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3), |
16364 v8::Integer::New(isolate, 3), | |
16365 v8::Integer::New(isolate, 2)); | 17822 v8::Integer::New(isolate, 2)); |
16366 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( | 17823 v8::Local<v8::String> scriptSource = |
16367 isolate, "function foo() {}\n\n function bar() {}"); | 17824 v8_str("function foo() {}\n\n function bar() {}"); |
16368 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); | 17825 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); |
16369 script->Run(); | 17826 script->Run(); |
16370 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( | 17827 v8::Local<v8::Function> foo = |
16371 env->Global()->Get(v8::String::NewFromUtf8(isolate, "foo"))); | 17828 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo"))); |
16372 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( | 17829 v8::Local<v8::Function> bar = |
16373 env->Global()->Get(v8::String::NewFromUtf8(isolate, "bar"))); | 17830 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar"))); |
16374 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId()); | 17831 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId()); |
16375 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId()); | 17832 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId()); |
16376 } | 17833 } |
16377 | 17834 |
16378 | 17835 |
16379 THREADED_TEST(FunctionGetBoundFunction) { | 17836 THREADED_TEST(FunctionGetBoundFunction) { |
16380 LocalContext env; | 17837 LocalContext env; |
16381 v8::HandleScope scope(env->GetIsolate()); | 17838 v8::HandleScope scope(env->GetIsolate()); |
16382 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::NewFromUtf8( | 17839 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test")); |
16383 env->GetIsolate(), "test")); | 17840 v8::Local<v8::String> script = v8_str( |
16384 v8::Handle<v8::String> script = v8::String::NewFromUtf8( | |
16385 env->GetIsolate(), | |
16386 "var a = new Object();\n" | 17841 "var a = new Object();\n" |
16387 "a.x = 1;\n" | 17842 "a.x = 1;\n" |
16388 "function f () { return this.x };\n" | 17843 "function f () { return this.x };\n" |
16389 "var g = f.bind(a);\n" | 17844 "var g = f.bind(a);\n" |
16390 "var b = g();"); | 17845 "var b = g();"); |
16391 v8::Script::Compile(script, &origin)->Run(); | 17846 v8::Script::Compile(script, &origin)->Run(); |
16392 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( | 17847 v8::Local<v8::Function> f = |
16393 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); | 17848 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f"))); |
16394 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( | 17849 v8::Local<v8::Function> g = |
16395 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); | 17850 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g"))); |
16396 CHECK(g->GetBoundFunction()->IsFunction()); | 17851 CHECK(g->GetBoundFunction()->IsFunction()); |
16397 Local<v8::Function> original_function = Local<v8::Function>::Cast( | 17852 Local<v8::Function> original_function = Local<v8::Function>::Cast( |
16398 g->GetBoundFunction()); | 17853 g->GetBoundFunction()); |
16399 CHECK(f->GetName()->Equals(original_function->GetName())); | 17854 CHECK(f->GetName()->Equals(original_function->GetName())); |
16400 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber()); | 17855 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber()); |
16401 CHECK_EQ(f->GetScriptColumnNumber(), | 17856 CHECK_EQ(f->GetScriptColumnNumber(), |
16402 original_function->GetScriptColumnNumber()); | 17857 original_function->GetScriptColumnNumber()); |
16403 } | 17858 } |
16404 | 17859 |
16405 | 17860 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16441 } | 17896 } |
16442 | 17897 |
16443 | 17898 |
16444 TEST(SetterOnConstructorPrototype) { | 17899 TEST(SetterOnConstructorPrototype) { |
16445 v8::Isolate* isolate = CcTest::isolate(); | 17900 v8::Isolate* isolate = CcTest::isolate(); |
16446 v8::HandleScope scope(isolate); | 17901 v8::HandleScope scope(isolate); |
16447 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 17902 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
16448 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, | 17903 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, |
16449 SetterWhichSetsYOnThisTo23); | 17904 SetterWhichSetsYOnThisTo23); |
16450 LocalContext context; | 17905 LocalContext context; |
16451 context->Global()->Set(v8_str("P"), templ->NewInstance()); | 17906 CHECK(context->Global() |
17907 ->Set(context.local(), v8_str("P"), | |
17908 templ->NewInstance(context.local()).ToLocalChecked()) | |
17909 .FromJust()); | |
16452 CompileRun("function C1() {" | 17910 CompileRun("function C1() {" |
16453 " this.x = 23;" | 17911 " this.x = 23;" |
16454 "};" | 17912 "};" |
16455 "C1.prototype = P;" | 17913 "C1.prototype = P;" |
16456 "function C2() {" | 17914 "function C2() {" |
16457 " this.x = 23" | 17915 " this.x = 23" |
16458 "};" | 17916 "};" |
16459 "C2.prototype = { };" | 17917 "C2.prototype = { };" |
16460 "C2.prototype.__proto__ = P;"); | 17918 "C2.prototype.__proto__ = P;"); |
16461 | 17919 |
16462 v8::Local<v8::Script> script; | 17920 v8::Local<v8::Script> script; |
16463 script = v8_compile("new C1();"); | 17921 script = v8_compile("new C1();"); |
16464 for (int i = 0; i < 10; i++) { | 17922 for (int i = 0; i < 10; i++) { |
16465 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 17923 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); |
16466 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); | 17924 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16467 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); | 17925 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16468 } | 17926 } |
16469 | 17927 |
16470 script = v8_compile("new C2();"); | 17928 script = v8_compile("new C2();"); |
16471 for (int i = 0; i < 10; i++) { | 17929 for (int i = 0; i < 10; i++) { |
16472 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); | 17930 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run()); |
16473 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); | 17931 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16474 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); | 17932 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16475 } | 17933 } |
16476 } | 17934 } |
16477 | 17935 |
16478 | 17936 |
16479 static void NamedPropertyGetterWhichReturns42( | 17937 static void NamedPropertyGetterWhichReturns42( |
16480 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { | 17938 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
16481 info.GetReturnValue().Set(v8_num(42)); | 17939 info.GetReturnValue().Set(v8_num(42)); |
16482 } | 17940 } |
16483 | 17941 |
16484 | 17942 |
16485 static void NamedPropertySetterWhichSetsYOnThisTo23( | 17943 static void NamedPropertySetterWhichSetsYOnThisTo23( |
16486 Local<Name> name, Local<Value> value, | 17944 Local<Name> name, Local<Value> value, |
16487 const v8::PropertyCallbackInfo<v8::Value>& info) { | 17945 const v8::PropertyCallbackInfo<v8::Value>& info) { |
16488 if (name->Equals(v8_str("x"))) { | 17946 if (name->Equals(v8_str("x"))) { |
16489 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); | 17947 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); |
16490 } | 17948 } |
16491 } | 17949 } |
16492 | 17950 |
16493 | 17951 |
16494 THREADED_TEST(InterceptorOnConstructorPrototype) { | 17952 THREADED_TEST(InterceptorOnConstructorPrototype) { |
16495 v8::Isolate* isolate = CcTest::isolate(); | 17953 v8::Isolate* isolate = CcTest::isolate(); |
16496 v8::HandleScope scope(isolate); | 17954 v8::HandleScope scope(isolate); |
16497 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 17955 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
16498 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 17956 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
16499 NamedPropertyGetterWhichReturns42, | 17957 NamedPropertyGetterWhichReturns42, |
16500 NamedPropertySetterWhichSetsYOnThisTo23)); | 17958 NamedPropertySetterWhichSetsYOnThisTo23)); |
16501 LocalContext context; | 17959 LocalContext context; |
16502 context->Global()->Set(v8_str("P"), templ->NewInstance()); | 17960 CHECK(context->Global() |
17961 ->Set(context.local(), v8_str("P"), | |
17962 templ->NewInstance(context.local()).ToLocalChecked()) | |
17963 .FromJust()); | |
16503 CompileRun("function C1() {" | 17964 CompileRun("function C1() {" |
16504 " this.x = 23;" | 17965 " this.x = 23;" |
16505 "};" | 17966 "};" |
16506 "C1.prototype = P;" | 17967 "C1.prototype = P;" |
16507 "function C2() {" | 17968 "function C2() {" |
16508 " this.x = 23" | 17969 " this.x = 23" |
16509 "};" | 17970 "};" |
16510 "C2.prototype = { };" | 17971 "C2.prototype = { };" |
16511 "C2.prototype.__proto__ = P;"); | 17972 "C2.prototype.__proto__ = P;"); |
16512 | 17973 |
16513 v8::Local<v8::Script> script; | 17974 v8::Local<v8::Script> script; |
16514 script = v8_compile("new C1();"); | 17975 script = v8_compile("new C1();"); |
16515 for (int i = 0; i < 10; i++) { | 17976 for (int i = 0; i < 10; i++) { |
16516 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 17977 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); |
16517 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); | 17978 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16518 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); | 17979 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16519 } | 17980 } |
16520 | 17981 |
16521 script = v8_compile("new C2();"); | 17982 script = v8_compile("new C2();"); |
16522 for (int i = 0; i < 10; i++) { | 17983 for (int i = 0; i < 10; i++) { |
16523 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); | 17984 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run()); |
16524 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value()); | 17985 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16525 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value()); | 17986 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16526 } | 17987 } |
16527 } | 17988 } |
16528 | 17989 |
16529 | 17990 |
16530 TEST(Regress618) { | 17991 TEST(Regress618) { |
16531 const char* source = "function C1() {" | 17992 const char* source = "function C1() {" |
16532 " this.x = 23;" | 17993 " this.x = 23;" |
16533 "};" | 17994 "};" |
16534 "C1.prototype = P;"; | 17995 "C1.prototype = P;"; |
16535 | 17996 |
16536 LocalContext context; | 17997 LocalContext context; |
16537 v8::Isolate* isolate = context->GetIsolate(); | 17998 v8::Isolate* isolate = context->GetIsolate(); |
16538 v8::HandleScope scope(isolate); | 17999 v8::HandleScope scope(isolate); |
16539 v8::Local<v8::Script> script; | 18000 v8::Local<v8::Script> script; |
16540 | 18001 |
16541 // Use a simple object as prototype. | 18002 // Use a simple object as prototype. |
16542 v8::Local<v8::Object> prototype = v8::Object::New(isolate); | 18003 v8::Local<v8::Object> prototype = v8::Object::New(isolate); |
16543 prototype->Set(v8_str("y"), v8_num(42)); | 18004 prototype->Set(v8_str("y"), v8_num(42)); |
16544 context->Global()->Set(v8_str("P"), prototype); | 18005 CHECK(context->Global() |
18006 ->Set(context.local(), v8_str("P"), prototype) | |
18007 .FromJust()); | |
16545 | 18008 |
16546 // This compile will add the code to the compilation cache. | 18009 // This compile will add the code to the compilation cache. |
16547 CompileRun(source); | 18010 CompileRun(source); |
16548 | 18011 |
16549 script = v8_compile("new C1();"); | 18012 script = v8_compile("new C1();"); |
16550 // Allow enough iterations for the inobject slack tracking logic | 18013 // Allow enough iterations for the inobject slack tracking logic |
16551 // to finalize instance size and install the fast construct stub. | 18014 // to finalize instance size and install the fast construct stub. |
16552 for (int i = 0; i < 256; i++) { | 18015 for (int i = 0; i < 256; i++) { |
16553 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18016 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); |
16554 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); | 18017 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16555 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); | 18018 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16556 } | 18019 } |
16557 | 18020 |
16558 // Use an API object with accessors as prototype. | 18021 // Use an API object with accessors as prototype. |
16559 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 18022 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
16560 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, | 18023 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, |
16561 SetterWhichSetsYOnThisTo23); | 18024 SetterWhichSetsYOnThisTo23); |
16562 context->Global()->Set(v8_str("P"), templ->NewInstance()); | 18025 CHECK(context->Global() |
18026 ->Set(context.local(), v8_str("P"), | |
18027 templ->NewInstance(context.local()).ToLocalChecked()) | |
18028 .FromJust()); | |
16563 | 18029 |
16564 // This compile will get the code from the compilation cache. | 18030 // This compile will get the code from the compilation cache. |
16565 CompileRun(source); | 18031 CompileRun(source); |
16566 | 18032 |
16567 script = v8_compile("new C1();"); | 18033 script = v8_compile("new C1();"); |
16568 for (int i = 0; i < 10; i++) { | 18034 for (int i = 0; i < 10; i++) { |
16569 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); | 18035 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run()); |
16570 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); | 18036 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust()); |
16571 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); | 18037 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust()); |
16572 } | 18038 } |
16573 } | 18039 } |
16574 | 18040 |
16575 v8::Isolate* gc_callbacks_isolate = NULL; | 18041 v8::Isolate* gc_callbacks_isolate = NULL; |
16576 int prologue_call_count = 0; | 18042 int prologue_call_count = 0; |
16577 int epilogue_call_count = 0; | 18043 int epilogue_call_count = 0; |
16578 int prologue_call_count_second = 0; | 18044 int prologue_call_count_second = 0; |
16579 int epilogue_call_count_second = 0; | 18045 int epilogue_call_count_second = 0; |
16580 int prologue_call_count_alloc = 0; | 18046 int prologue_call_count_alloc = 0; |
16581 int epilogue_call_count_alloc = 0; | 18047 int epilogue_call_count_alloc = 0; |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16805 CHECK(string->IsOneByteRepresentation()); | 18271 CHECK(string->IsOneByteRepresentation()); |
16806 i::ConsString* cons = i::ConsString::cast(*string); | 18272 i::ConsString* cons = i::ConsString::cast(*string); |
16807 CHECK_EQ(0, cons->second()->length()); | 18273 CHECK_EQ(0, cons->second()->length()); |
16808 CHECK(cons->first()->IsTwoByteRepresentation()); | 18274 CHECK(cons->first()->IsTwoByteRepresentation()); |
16809 } | 18275 } |
16810 | 18276 |
16811 // Check that some string operations work. | 18277 // Check that some string operations work. |
16812 | 18278 |
16813 // Atom RegExp. | 18279 // Atom RegExp. |
16814 Local<Value> reresult = CompileRun("str2.match(/abel/g).length;"); | 18280 Local<Value> reresult = CompileRun("str2.match(/abel/g).length;"); |
16815 CHECK_EQ(6, reresult->Int32Value()); | 18281 CHECK_EQ(6, reresult->Int32Value(context.local()).FromJust()); |
16816 | 18282 |
16817 // Nonatom RegExp. | 18283 // Nonatom RegExp. |
16818 reresult = CompileRun("str2.match(/abe./g).length;"); | 18284 reresult = CompileRun("str2.match(/abe./g).length;"); |
16819 CHECK_EQ(6, reresult->Int32Value()); | 18285 CHECK_EQ(6, reresult->Int32Value(context.local()).FromJust()); |
16820 | 18286 |
16821 reresult = CompileRun("str2.search(/bel/g);"); | 18287 reresult = CompileRun("str2.search(/bel/g);"); |
16822 CHECK_EQ(1, reresult->Int32Value()); | 18288 CHECK_EQ(1, reresult->Int32Value(context.local()).FromJust()); |
16823 | 18289 |
16824 reresult = CompileRun("str2.search(/be./g);"); | 18290 reresult = CompileRun("str2.search(/be./g);"); |
16825 CHECK_EQ(1, reresult->Int32Value()); | 18291 CHECK_EQ(1, reresult->Int32Value(context.local()).FromJust()); |
16826 | 18292 |
16827 ExpectTrue("/bel/g.test(str2);"); | 18293 ExpectTrue("/bel/g.test(str2);"); |
16828 | 18294 |
16829 ExpectTrue("/be./g.test(str2);"); | 18295 ExpectTrue("/be./g.test(str2);"); |
16830 | 18296 |
16831 reresult = CompileRun("/bel/g.exec(str2);"); | 18297 reresult = CompileRun("/bel/g.exec(str2);"); |
16832 CHECK(!reresult->IsNull()); | 18298 CHECK(!reresult->IsNull()); |
16833 | 18299 |
16834 reresult = CompileRun("/be./g.exec(str2);"); | 18300 reresult = CompileRun("/be./g.exec(str2);"); |
16835 CHECK(!reresult->IsNull()); | 18301 CHECK(!reresult->IsNull()); |
16836 | 18302 |
16837 ExpectString("str2.substring(2, 10);", "elspenda"); | 18303 ExpectString("str2.substring(2, 10);", "elspenda"); |
16838 | 18304 |
16839 ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); | 18305 ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); |
16840 | 18306 |
16841 ExpectString("str2.charAt(2);", "e"); | 18307 ExpectString("str2.charAt(2);", "e"); |
16842 | 18308 |
16843 ExpectObject("str2.indexOf('els');", indexof); | 18309 ExpectObject("str2.indexOf('els');", indexof); |
16844 | 18310 |
16845 ExpectObject("str2.lastIndexOf('dab');", lastindexof); | 18311 ExpectObject("str2.lastIndexOf('dab');", lastindexof); |
16846 | 18312 |
16847 reresult = CompileRun("str2.charCodeAt(2);"); | 18313 reresult = CompileRun("str2.charCodeAt(2);"); |
16848 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); | 18314 CHECK_EQ(static_cast<int32_t>('e'), |
18315 reresult->Int32Value(context.local()).FromJust()); | |
16849 } | 18316 } |
16850 | 18317 |
16851 | 18318 |
16852 TEST(ContainsOnlyOneByte) { | 18319 TEST(ContainsOnlyOneByte) { |
16853 v8::V8::Initialize(); | 18320 v8::V8::Initialize(); |
16854 v8::Isolate* isolate = CcTest::isolate(); | 18321 v8::Isolate* isolate = CcTest::isolate(); |
16855 v8::HandleScope scope(isolate); | 18322 v8::HandleScope scope(isolate); |
16856 // Make a buffer long enough that it won't automatically be converted. | 18323 // Make a buffer long enough that it won't automatically be converted. |
16857 const int length = 512; | 18324 const int length = 512; |
16858 // Ensure word aligned assignment. | 18325 // Ensure word aligned assignment. |
16859 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t); | 18326 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t); |
16860 v8::base::SmartArrayPointer<uintptr_t> aligned_contents( | 18327 v8::base::SmartArrayPointer<uintptr_t> aligned_contents( |
16861 new uintptr_t[aligned_length]); | 18328 new uintptr_t[aligned_length]); |
16862 uint16_t* string_contents = | 18329 uint16_t* string_contents = |
16863 reinterpret_cast<uint16_t*>(aligned_contents.get()); | 18330 reinterpret_cast<uint16_t*>(aligned_contents.get()); |
16864 // Set to contain only one byte. | 18331 // Set to contain only one byte. |
16865 for (int i = 0; i < length-1; i++) { | 18332 for (int i = 0; i < length-1; i++) { |
16866 string_contents[i] = 0x41; | 18333 string_contents[i] = 0x41; |
16867 } | 18334 } |
16868 string_contents[length-1] = 0; | 18335 string_contents[length-1] = 0; |
16869 // Simple case. | 18336 // Simple case. |
16870 Handle<String> string = | 18337 Local<String> string = String::NewExternal( |
16871 String::NewExternal(isolate, | 18338 isolate, new TestResource(string_contents, NULL, false)); |
16872 new TestResource(string_contents, NULL, false)); | |
16873 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); | 18339 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); |
16874 // Counter example. | 18340 // Counter example. |
16875 string = String::NewFromTwoByte(isolate, string_contents); | 18341 string = String::NewFromTwoByte(isolate, string_contents); |
16876 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); | 18342 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); |
16877 // Test left right and balanced cons strings. | 18343 // Test left right and balanced cons strings. |
16878 Handle<String> base = String::NewFromUtf8(isolate, "a"); | 18344 Local<String> base = v8_str("a"); |
16879 Handle<String> left = base; | 18345 Local<String> left = base; |
16880 Handle<String> right = base; | 18346 Local<String> right = base; |
16881 for (int i = 0; i < 1000; i++) { | 18347 for (int i = 0; i < 1000; i++) { |
16882 left = String::Concat(base, left); | 18348 left = String::Concat(base, left); |
16883 right = String::Concat(right, base); | 18349 right = String::Concat(right, base); |
16884 } | 18350 } |
16885 Handle<String> balanced = String::Concat(left, base); | 18351 Local<String> balanced = String::Concat(left, base); |
16886 balanced = String::Concat(balanced, right); | 18352 balanced = String::Concat(balanced, right); |
16887 Handle<String> cons_strings[] = {left, balanced, right}; | 18353 Local<String> cons_strings[] = {left, balanced, right}; |
16888 Handle<String> two_byte = | 18354 Local<String> two_byte = String::NewExternal( |
16889 String::NewExternal(isolate, | 18355 isolate, new TestResource(string_contents, NULL, false)); |
16890 new TestResource(string_contents, NULL, false)); | |
16891 USE(two_byte); USE(cons_strings); | 18356 USE(two_byte); USE(cons_strings); |
16892 for (size_t i = 0; i < arraysize(cons_strings); i++) { | 18357 for (size_t i = 0; i < arraysize(cons_strings); i++) { |
16893 // Base assumptions. | 18358 // Base assumptions. |
16894 string = cons_strings[i]; | 18359 string = cons_strings[i]; |
16895 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); | 18360 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); |
16896 // Test left and right concatentation. | 18361 // Test left and right concatentation. |
16897 string = String::Concat(two_byte, cons_strings[i]); | 18362 string = String::Concat(two_byte, cons_strings[i]); |
16898 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); | 18363 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); |
16899 string = String::Concat(cons_strings[i], two_byte); | 18364 string = String::Concat(cons_strings[i], two_byte); |
16900 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); | 18365 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16936 // invocation. Then force the callback to be called from va | 18401 // invocation. Then force the callback to be called from va |
16937 | 18402 |
16938 v8::V8::Initialize(); | 18403 v8::V8::Initialize(); |
16939 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); | 18404 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); |
16940 | 18405 |
16941 v8::Isolate* isolate = CcTest::isolate(); | 18406 v8::Isolate* isolate = CcTest::isolate(); |
16942 v8::HandleScope scope(isolate); | 18407 v8::HandleScope scope(isolate); |
16943 | 18408 |
16944 // Create an ObjectTemplate for global objects and install access | 18409 // Create an ObjectTemplate for global objects and install access |
16945 // check callbacks that will block access. | 18410 // check callbacks that will block access. |
16946 v8::Handle<v8::ObjectTemplate> global_template = | 18411 v8::Local<v8::ObjectTemplate> global_template = |
16947 v8::ObjectTemplate::New(isolate); | 18412 v8::ObjectTemplate::New(isolate); |
16948 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 18413 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
16949 | 18414 |
16950 // Create a context and set an x property on it's global object. | 18415 // Create a context and set an x property on it's global object. |
16951 LocalContext context0(NULL, global_template); | 18416 LocalContext context0(NULL, global_template); |
16952 context0->Global()->Set(v8_str("x"), v8_num(42)); | 18417 CHECK(context0->Global() |
16953 v8::Handle<v8::Object> global0 = context0->Global(); | 18418 ->Set(context0.local(), v8_str("x"), v8_num(42)) |
18419 .FromJust()); | |
18420 v8::Local<v8::Object> global0 = context0->Global(); | |
16954 | 18421 |
16955 // Create a context with a different security token so that the | 18422 // Create a context with a different security token so that the |
16956 // failed access check callback will be called on each access. | 18423 // failed access check callback will be called on each access. |
16957 LocalContext context1(NULL, global_template); | 18424 LocalContext context1(NULL, global_template); |
16958 context1->Global()->Set(v8_str("other"), global0); | 18425 CHECK(context1->Global() |
18426 ->Set(context1.local(), v8_str("other"), global0) | |
18427 .FromJust()); | |
16959 | 18428 |
16960 v8::TryCatch try_catch(isolate); | 18429 v8::TryCatch try_catch(isolate); |
16961 | 18430 |
16962 // Get property with failed access check. | 18431 // Get property with failed access check. |
16963 CHECK(CompileRun("other.x").IsEmpty()); | 18432 CHECK(CompileRun("other.x").IsEmpty()); |
16964 CHECK(try_catch.HasCaught()); | 18433 CHECK(try_catch.HasCaught()); |
16965 try_catch.Reset(); | 18434 try_catch.Reset(); |
16966 | 18435 |
16967 // Get element with failed access check. | 18436 // Get element with failed access check. |
16968 CHECK(CompileRun("other[0]").IsEmpty()); | 18437 CHECK(CompileRun("other[0]").IsEmpty()); |
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17541 public: | 19010 public: |
17542 explicit Visitor42(v8::Persistent<v8::Object>* object) | 19011 explicit Visitor42(v8::Persistent<v8::Object>* object) |
17543 : counter_(0), object_(object) { } | 19012 : counter_(0), object_(object) { } |
17544 | 19013 |
17545 virtual void VisitPersistentHandle(Persistent<Value>* value, | 19014 virtual void VisitPersistentHandle(Persistent<Value>* value, |
17546 uint16_t class_id) { | 19015 uint16_t class_id) { |
17547 if (class_id != 42) return; | 19016 if (class_id != 42) return; |
17548 CHECK_EQ(42, value->WrapperClassId()); | 19017 CHECK_EQ(42, value->WrapperClassId()); |
17549 v8::Isolate* isolate = CcTest::isolate(); | 19018 v8::Isolate* isolate = CcTest::isolate(); |
17550 v8::HandleScope handle_scope(isolate); | 19019 v8::HandleScope handle_scope(isolate); |
17551 v8::Handle<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value); | 19020 v8::Local<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value); |
17552 v8::Handle<v8::Value> object = | 19021 v8::Local<v8::Value> object = v8::Local<v8::Object>::New(isolate, *object_); |
17553 v8::Local<v8::Object>::New(isolate, *object_); | |
17554 CHECK(handle->IsObject()); | 19022 CHECK(handle->IsObject()); |
17555 CHECK(Handle<Object>::Cast(handle)->Equals(object)); | 19023 CHECK(Local<Object>::Cast(handle)->Equals(object)); |
17556 ++counter_; | 19024 ++counter_; |
17557 } | 19025 } |
17558 | 19026 |
17559 int counter_; | 19027 int counter_; |
17560 v8::Persistent<v8::Object>* object_; | 19028 v8::Persistent<v8::Object>* object_; |
17561 }; | 19029 }; |
17562 | 19030 |
17563 | 19031 |
17564 TEST(PersistentHandleVisitor) { | 19032 TEST(PersistentHandleVisitor) { |
17565 LocalContext context; | 19033 LocalContext context; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17615 object2.Reset(); | 19083 object2.Reset(); |
17616 } | 19084 } |
17617 | 19085 |
17618 | 19086 |
17619 TEST(RegExp) { | 19087 TEST(RegExp) { |
17620 i::FLAG_harmony_regexps = true; | 19088 i::FLAG_harmony_regexps = true; |
17621 i::FLAG_harmony_unicode_regexps = true; | 19089 i::FLAG_harmony_unicode_regexps = true; |
17622 LocalContext context; | 19090 LocalContext context; |
17623 v8::HandleScope scope(context->GetIsolate()); | 19091 v8::HandleScope scope(context->GetIsolate()); |
17624 | 19092 |
17625 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); | 19093 v8::Local<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); |
17626 CHECK(re->IsRegExp()); | 19094 CHECK(re->IsRegExp()); |
17627 CHECK(re->GetSource()->Equals(v8_str("foo"))); | 19095 CHECK(re->GetSource()->Equals(v8_str("foo"))); |
17628 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); | 19096 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); |
17629 | 19097 |
17630 re = v8::RegExp::New(v8_str("bar"), | 19098 re = v8::RegExp::New(v8_str("bar"), |
17631 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | | 19099 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | |
17632 v8::RegExp::kGlobal)); | 19100 v8::RegExp::kGlobal)); |
17633 CHECK(re->IsRegExp()); | 19101 CHECK(re->IsRegExp()); |
17634 CHECK(re->GetSource()->Equals(v8_str("bar"))); | 19102 CHECK(re->GetSource()->Equals(v8_str("bar"))); |
17635 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal, | 19103 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17672 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); | 19140 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); |
17673 | 19141 |
17674 re = v8::RegExp::New(v8_str("foobarbaz"), | 19142 re = v8::RegExp::New(v8_str("foobarbaz"), |
17675 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | | 19143 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | |
17676 v8::RegExp::kMultiline)); | 19144 v8::RegExp::kMultiline)); |
17677 CHECK(re->IsRegExp()); | 19145 CHECK(re->IsRegExp()); |
17678 CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); | 19146 CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); |
17679 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, | 19147 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, |
17680 static_cast<int>(re->GetFlags())); | 19148 static_cast<int>(re->GetFlags())); |
17681 | 19149 |
17682 context->Global()->Set(v8_str("re"), re); | 19150 CHECK(context->Global()->Set(context.local(), v8_str("re"), re).FromJust()); |
17683 ExpectTrue("re.test('FoobarbaZ')"); | 19151 ExpectTrue("re.test('FoobarbaZ')"); |
17684 | 19152 |
17685 // RegExps are objects on which you can set properties. | 19153 // RegExps are objects on which you can set properties. |
17686 re->Set(v8_str("property"), v8::Integer::New(context->GetIsolate(), 32)); | 19154 re->Set(v8_str("property"), v8::Integer::New(context->GetIsolate(), 32)); |
17687 v8::Handle<v8::Value> value(CompileRun("re.property")); | 19155 v8::Local<v8::Value> value(CompileRun("re.property")); |
17688 CHECK_EQ(32, value->Int32Value()); | 19156 CHECK_EQ(32, value->Int32Value(context.local()).FromJust()); |
17689 | 19157 |
17690 v8::TryCatch try_catch(context->GetIsolate()); | 19158 v8::TryCatch try_catch(context->GetIsolate()); |
17691 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); | 19159 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); |
17692 CHECK(re.IsEmpty()); | 19160 CHECK(re.IsEmpty()); |
17693 CHECK(try_catch.HasCaught()); | 19161 CHECK(try_catch.HasCaught()); |
17694 context->Global()->Set(v8_str("ex"), try_catch.Exception()); | 19162 CHECK(context->Global() |
19163 ->Set(context.local(), v8_str("ex"), try_catch.Exception()) | |
19164 .FromJust()); | |
17695 ExpectTrue("ex instanceof SyntaxError"); | 19165 ExpectTrue("ex instanceof SyntaxError"); |
17696 } | 19166 } |
17697 | 19167 |
17698 | 19168 |
17699 THREADED_TEST(Equals) { | 19169 THREADED_TEST(Equals) { |
17700 LocalContext localContext; | 19170 LocalContext localContext; |
17701 v8::HandleScope handleScope(localContext->GetIsolate()); | 19171 v8::HandleScope handleScope(localContext->GetIsolate()); |
17702 | 19172 |
17703 v8::Handle<v8::Object> globalProxy = localContext->Global(); | 19173 v8::Local<v8::Object> globalProxy = localContext->Global(); |
17704 v8::Handle<Value> global = globalProxy->GetPrototype(); | 19174 v8::Local<Value> global = globalProxy->GetPrototype(); |
17705 | 19175 |
17706 CHECK(global->StrictEquals(global)); | 19176 CHECK(global->StrictEquals(global)); |
17707 CHECK(!global->StrictEquals(globalProxy)); | 19177 CHECK(!global->StrictEquals(globalProxy)); |
17708 CHECK(!globalProxy->StrictEquals(global)); | 19178 CHECK(!globalProxy->StrictEquals(global)); |
17709 CHECK(globalProxy->StrictEquals(globalProxy)); | 19179 CHECK(globalProxy->StrictEquals(globalProxy)); |
17710 | 19180 |
17711 CHECK(global->Equals(global)); | 19181 CHECK(global->Equals(global)); |
17712 CHECK(!global->Equals(globalProxy)); | 19182 CHECK(!global->Equals(globalProxy)); |
17713 CHECK(!globalProxy->Equals(global)); | 19183 CHECK(!globalProxy->Equals(global)); |
17714 CHECK(globalProxy->Equals(globalProxy)); | 19184 CHECK(globalProxy->Equals(globalProxy)); |
17715 } | 19185 } |
17716 | 19186 |
17717 | 19187 |
17718 static void Getter(v8::Local<v8::Name> property, | 19188 static void Getter(v8::Local<v8::Name> property, |
17719 const v8::PropertyCallbackInfo<v8::Value>& info) { | 19189 const v8::PropertyCallbackInfo<v8::Value>& info) { |
17720 info.GetReturnValue().Set(v8_str("42!")); | 19190 info.GetReturnValue().Set(v8_str("42!")); |
17721 } | 19191 } |
17722 | 19192 |
17723 | 19193 |
17724 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { | 19194 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { |
17725 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); | 19195 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate()); |
17726 result->Set(0, v8_str("universalAnswer")); | 19196 result->Set(0, v8_str("universalAnswer")); |
17727 info.GetReturnValue().Set(result); | 19197 info.GetReturnValue().Set(result); |
17728 } | 19198 } |
17729 | 19199 |
17730 | 19200 |
17731 TEST(NamedEnumeratorAndForIn) { | 19201 TEST(NamedEnumeratorAndForIn) { |
17732 LocalContext context; | 19202 LocalContext context; |
17733 v8::Isolate* isolate = context->GetIsolate(); | 19203 v8::Isolate* isolate = context->GetIsolate(); |
17734 v8::HandleScope handle_scope(isolate); | 19204 v8::HandleScope handle_scope(isolate); |
17735 v8::Context::Scope context_scope(context.local()); | 19205 v8::Context::Scope context_scope(context.local()); |
17736 | 19206 |
17737 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate); | 19207 v8::Local<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate); |
17738 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL, | 19208 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL, |
17739 NULL, Enumerator)); | 19209 NULL, Enumerator)); |
17740 context->Global()->Set(v8_str("o"), tmpl->NewInstance()); | 19210 CHECK(context->Global() |
17741 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( | 19211 ->Set(context.local(), v8_str("o"), |
17742 "var result = []; for (var k in o) result.push(k); result")); | 19212 tmpl->NewInstance(context.local()).ToLocalChecked()) |
19213 .FromJust()); | |
19214 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast( | |
19215 CompileRun("var result = []; for (var k in o) result.push(k); result")); | |
17743 CHECK_EQ(1u, result->Length()); | 19216 CHECK_EQ(1u, result->Length()); |
17744 CHECK(v8_str("universalAnswer")->Equals(result->Get(0))); | 19217 CHECK(v8_str("universalAnswer")->Equals(result->Get(0))); |
17745 } | 19218 } |
17746 | 19219 |
17747 | 19220 |
17748 TEST(DefinePropertyPostDetach) { | 19221 TEST(DefinePropertyPostDetach) { |
17749 LocalContext context; | 19222 LocalContext context; |
17750 v8::HandleScope scope(context->GetIsolate()); | 19223 v8::HandleScope scope(context->GetIsolate()); |
17751 v8::Handle<v8::Object> proxy = context->Global(); | 19224 v8::Local<v8::Object> proxy = context->Global(); |
17752 v8::Handle<v8::Function> define_property = | 19225 v8::Local<v8::Function> define_property = |
17753 CompileRun("(function() {" | 19226 CompileRun( |
17754 " Object.defineProperty(" | 19227 "(function() {" |
17755 " this," | 19228 " Object.defineProperty(" |
17756 " 1," | 19229 " this," |
17757 " { configurable: true, enumerable: true, value: 3 });" | 19230 " 1," |
17758 "})").As<Function>(); | 19231 " { configurable: true, enumerable: true, value: 3 });" |
19232 "})") | |
19233 .As<Function>(); | |
17759 context->DetachGlobal(); | 19234 context->DetachGlobal(); |
17760 define_property->Call(proxy, 0, NULL); | 19235 define_property->Call(proxy, 0, NULL); |
17761 } | 19236 } |
17762 | 19237 |
17763 | 19238 |
17764 static void InstallContextId(v8::Handle<Context> context, int id) { | 19239 static void InstallContextId(v8::Local<Context> context, int id) { |
17765 Context::Scope scope(context); | 19240 Context::Scope scope(context); |
17766 CompileRun("Object.prototype").As<Object>()-> | 19241 CHECK(CompileRun("Object.prototype") |
17767 Set(v8_str("context_id"), v8::Integer::New(context->GetIsolate(), id)); | 19242 .As<Object>() |
19243 ->Set(context, v8_str("context_id"), | |
19244 v8::Integer::New(context->GetIsolate(), id)) | |
19245 .FromJust()); | |
17768 } | 19246 } |
17769 | 19247 |
17770 | 19248 |
17771 static void CheckContextId(v8::Handle<Object> object, int expected) { | 19249 static void CheckContextId(v8::Local<Object> object, int expected) { |
17772 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); | 19250 CHECK_EQ(expected, object->Get(v8_str("context_id")) |
19251 ->Int32Value(CcTest::isolate()->GetCurrentContext()) | |
19252 .FromJust()); | |
17773 } | 19253 } |
17774 | 19254 |
17775 | 19255 |
17776 THREADED_TEST(CreationContext) { | 19256 THREADED_TEST(CreationContext) { |
17777 v8::Isolate* isolate = CcTest::isolate(); | 19257 v8::Isolate* isolate = CcTest::isolate(); |
17778 HandleScope handle_scope(isolate); | 19258 HandleScope handle_scope(isolate); |
17779 Handle<Context> context1 = Context::New(isolate); | 19259 Local<Context> context1 = Context::New(isolate); |
17780 InstallContextId(context1, 1); | 19260 InstallContextId(context1, 1); |
17781 Handle<Context> context2 = Context::New(isolate); | 19261 Local<Context> context2 = Context::New(isolate); |
17782 InstallContextId(context2, 2); | 19262 InstallContextId(context2, 2); |
17783 Handle<Context> context3 = Context::New(isolate); | 19263 Local<Context> context3 = Context::New(isolate); |
17784 InstallContextId(context3, 3); | 19264 InstallContextId(context3, 3); |
17785 | 19265 |
17786 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(isolate); | 19266 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(isolate); |
17787 | 19267 |
17788 Local<Object> object1; | 19268 Local<Object> object1; |
17789 Local<Function> func1; | 19269 Local<Function> func1; |
17790 { | 19270 { |
17791 Context::Scope scope(context1); | 19271 Context::Scope scope(context1); |
17792 object1 = Object::New(isolate); | 19272 object1 = Object::New(isolate); |
17793 func1 = tmpl->GetFunction(); | 19273 func1 = tmpl->GetFunction(context1).ToLocalChecked(); |
17794 } | 19274 } |
17795 | 19275 |
17796 Local<Object> object2; | 19276 Local<Object> object2; |
17797 Local<Function> func2; | 19277 Local<Function> func2; |
17798 { | 19278 { |
17799 Context::Scope scope(context2); | 19279 Context::Scope scope(context2); |
17800 object2 = Object::New(isolate); | 19280 object2 = Object::New(isolate); |
17801 func2 = tmpl->GetFunction(); | 19281 func2 = tmpl->GetFunction(context2).ToLocalChecked(); |
17802 } | 19282 } |
17803 | 19283 |
17804 Local<Object> instance1; | 19284 Local<Object> instance1; |
17805 Local<Object> instance2; | 19285 Local<Object> instance2; |
17806 | 19286 |
17807 { | 19287 { |
17808 Context::Scope scope(context3); | 19288 Context::Scope scope(context3); |
17809 instance1 = func1->NewInstance(); | 19289 instance1 = func1->NewInstance(context3).ToLocalChecked(); |
17810 instance2 = func2->NewInstance(); | 19290 instance2 = func2->NewInstance(context3).ToLocalChecked(); |
17811 } | 19291 } |
17812 | 19292 |
17813 { | 19293 { |
17814 Handle<Context> other_context = Context::New(isolate); | 19294 Local<Context> other_context = Context::New(isolate); |
17815 Context::Scope scope(other_context); | 19295 Context::Scope scope(other_context); |
17816 CHECK(object1->CreationContext() == context1); | 19296 CHECK(object1->CreationContext() == context1); |
17817 CheckContextId(object1, 1); | 19297 CheckContextId(object1, 1); |
17818 CHECK(func1->CreationContext() == context1); | 19298 CHECK(func1->CreationContext() == context1); |
17819 CheckContextId(func1, 1); | 19299 CheckContextId(func1, 1); |
17820 CHECK(instance1->CreationContext() == context1); | 19300 CHECK(instance1->CreationContext() == context1); |
17821 CheckContextId(instance1, 1); | 19301 CheckContextId(instance1, 1); |
17822 CHECK(object2->CreationContext() == context2); | 19302 CHECK(object2->CreationContext() == context2); |
17823 CheckContextId(object2, 2); | 19303 CheckContextId(object2, 2); |
17824 CHECK(func2->CreationContext() == context2); | 19304 CHECK(func2->CreationContext() == context2); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
17856 CHECK(func2->CreationContext() == context2); | 19336 CHECK(func2->CreationContext() == context2); |
17857 CheckContextId(func2, 2); | 19337 CheckContextId(func2, 2); |
17858 CHECK(instance2->CreationContext() == context2); | 19338 CHECK(instance2->CreationContext() == context2); |
17859 CheckContextId(instance2, 2); | 19339 CheckContextId(instance2, 2); |
17860 } | 19340 } |
17861 } | 19341 } |
17862 | 19342 |
17863 | 19343 |
17864 THREADED_TEST(CreationContextOfJsFunction) { | 19344 THREADED_TEST(CreationContextOfJsFunction) { |
17865 HandleScope handle_scope(CcTest::isolate()); | 19345 HandleScope handle_scope(CcTest::isolate()); |
17866 Handle<Context> context = Context::New(CcTest::isolate()); | 19346 Local<Context> context = Context::New(CcTest::isolate()); |
17867 InstallContextId(context, 1); | 19347 InstallContextId(context, 1); |
17868 | 19348 |
17869 Local<Object> function; | 19349 Local<Object> function; |
17870 { | 19350 { |
17871 Context::Scope scope(context); | 19351 Context::Scope scope(context); |
17872 function = CompileRun("function foo() {}; foo").As<Object>(); | 19352 function = CompileRun("function foo() {}; foo").As<Object>(); |
17873 } | 19353 } |
17874 | 19354 |
17875 Handle<Context> other_context = Context::New(CcTest::isolate()); | 19355 Local<Context> other_context = Context::New(CcTest::isolate()); |
17876 Context::Scope scope(other_context); | 19356 Context::Scope scope(other_context); |
17877 CHECK(function->CreationContext() == context); | 19357 CHECK(function->CreationContext() == context); |
17878 CheckContextId(function, 1); | 19358 CheckContextId(function, 1); |
17879 } | 19359 } |
17880 | 19360 |
17881 | 19361 |
17882 void HasOwnPropertyIndexedPropertyGetter( | 19362 void HasOwnPropertyIndexedPropertyGetter( |
17883 uint32_t index, | 19363 uint32_t index, |
17884 const v8::PropertyCallbackInfo<v8::Value>& info) { | 19364 const v8::PropertyCallbackInfo<v8::Value>& info) { |
17885 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); | 19365 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); |
(...skipping 29 matching lines...) Expand all Loading... | |
17915 const v8::PropertyCallbackInfo<v8::Value>& info) { | 19395 const v8::PropertyCallbackInfo<v8::Value>& info) { |
17916 info.GetReturnValue().Set(v8_str("yes")); | 19396 info.GetReturnValue().Set(v8_str("yes")); |
17917 } | 19397 } |
17918 | 19398 |
17919 | 19399 |
17920 TEST(HasOwnProperty) { | 19400 TEST(HasOwnProperty) { |
17921 LocalContext env; | 19401 LocalContext env; |
17922 v8::Isolate* isolate = env->GetIsolate(); | 19402 v8::Isolate* isolate = env->GetIsolate(); |
17923 v8::HandleScope scope(isolate); | 19403 v8::HandleScope scope(isolate); |
17924 { // Check normal properties and defined getters. | 19404 { // Check normal properties and defined getters. |
17925 Handle<Value> value = CompileRun( | 19405 Local<Value> value = CompileRun( |
17926 "function Foo() {" | 19406 "function Foo() {" |
17927 " this.foo = 11;" | 19407 " this.foo = 11;" |
17928 " this.__defineGetter__('baz', function() { return 1; });" | 19408 " this.__defineGetter__('baz', function() { return 1; });" |
17929 "};" | 19409 "};" |
17930 "function Bar() { " | 19410 "function Bar() { " |
17931 " this.bar = 13;" | 19411 " this.bar = 13;" |
17932 " this.__defineGetter__('bla', function() { return 2; });" | 19412 " this.__defineGetter__('bla', function() { return 2; });" |
17933 "};" | 19413 "};" |
17934 "Bar.prototype = new Foo();" | 19414 "Bar.prototype = new Foo();" |
17935 "new Bar();"); | 19415 "new Bar();"); |
17936 CHECK(value->IsObject()); | 19416 CHECK(value->IsObject()); |
17937 Handle<Object> object = value->ToObject(isolate); | 19417 Local<Object> object = value->ToObject(isolate); |
17938 CHECK(object->Has(v8_str("foo"))); | 19418 CHECK(object->Has(v8_str("foo"))); |
17939 CHECK(!object->HasOwnProperty(v8_str("foo"))); | 19419 CHECK(!object->HasOwnProperty(v8_str("foo"))); |
17940 CHECK(object->HasOwnProperty(v8_str("bar"))); | 19420 CHECK(object->HasOwnProperty(v8_str("bar"))); |
17941 CHECK(object->Has(v8_str("baz"))); | 19421 CHECK(object->Has(v8_str("baz"))); |
17942 CHECK(!object->HasOwnProperty(v8_str("baz"))); | 19422 CHECK(!object->HasOwnProperty(v8_str("baz"))); |
17943 CHECK(object->HasOwnProperty(v8_str("bla"))); | 19423 CHECK(object->HasOwnProperty(v8_str("bla"))); |
17944 } | 19424 } |
17945 { // Check named getter interceptors. | 19425 { // Check named getter interceptors. |
17946 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19426 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17947 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 19427 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
17948 HasOwnPropertyNamedPropertyGetter)); | 19428 HasOwnPropertyNamedPropertyGetter)); |
17949 Handle<Object> instance = templ->NewInstance(); | 19429 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17950 CHECK(!instance->HasOwnProperty(v8_str("42"))); | 19430 CHECK(!instance->HasOwnProperty(v8_str("42"))); |
17951 CHECK(instance->HasOwnProperty(v8_str("foo"))); | 19431 CHECK(instance->HasOwnProperty(v8_str("foo"))); |
17952 CHECK(!instance->HasOwnProperty(v8_str("bar"))); | 19432 CHECK(!instance->HasOwnProperty(v8_str("bar"))); |
17953 } | 19433 } |
17954 { // Check indexed getter interceptors. | 19434 { // Check indexed getter interceptors. |
17955 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19435 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17956 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( | 19436 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
17957 HasOwnPropertyIndexedPropertyGetter)); | 19437 HasOwnPropertyIndexedPropertyGetter)); |
17958 Handle<Object> instance = templ->NewInstance(); | 19438 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17959 CHECK(instance->HasOwnProperty(v8_str("42"))); | 19439 CHECK(instance->HasOwnProperty(v8_str("42"))); |
17960 CHECK(!instance->HasOwnProperty(v8_str("43"))); | 19440 CHECK(!instance->HasOwnProperty(v8_str("43"))); |
17961 CHECK(!instance->HasOwnProperty(v8_str("foo"))); | 19441 CHECK(!instance->HasOwnProperty(v8_str("foo"))); |
17962 } | 19442 } |
17963 { // Check named query interceptors. | 19443 { // Check named query interceptors. |
17964 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19444 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17965 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 19445 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
17966 0, 0, HasOwnPropertyNamedPropertyQuery)); | 19446 0, 0, HasOwnPropertyNamedPropertyQuery)); |
17967 Handle<Object> instance = templ->NewInstance(); | 19447 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17968 CHECK(instance->HasOwnProperty(v8_str("foo"))); | 19448 CHECK(instance->HasOwnProperty(v8_str("foo"))); |
17969 CHECK(!instance->HasOwnProperty(v8_str("bar"))); | 19449 CHECK(!instance->HasOwnProperty(v8_str("bar"))); |
17970 } | 19450 } |
17971 { // Check indexed query interceptors. | 19451 { // Check indexed query interceptors. |
17972 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19452 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17973 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( | 19453 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
17974 0, 0, HasOwnPropertyIndexedPropertyQuery)); | 19454 0, 0, HasOwnPropertyIndexedPropertyQuery)); |
17975 Handle<Object> instance = templ->NewInstance(); | 19455 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17976 CHECK(instance->HasOwnProperty(v8_str("42"))); | 19456 CHECK(instance->HasOwnProperty(v8_str("42"))); |
17977 CHECK(!instance->HasOwnProperty(v8_str("41"))); | 19457 CHECK(!instance->HasOwnProperty(v8_str("41"))); |
17978 } | 19458 } |
17979 { // Check callbacks. | 19459 { // Check callbacks. |
17980 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19460 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17981 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter); | 19461 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter); |
17982 Handle<Object> instance = templ->NewInstance(); | 19462 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17983 CHECK(instance->HasOwnProperty(v8_str("foo"))); | 19463 CHECK(instance->HasOwnProperty(v8_str("foo"))); |
17984 CHECK(!instance->HasOwnProperty(v8_str("bar"))); | 19464 CHECK(!instance->HasOwnProperty(v8_str("bar"))); |
17985 } | 19465 } |
17986 { // Check that query wins on disagreement. | 19466 { // Check that query wins on disagreement. |
17987 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19467 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
17988 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( | 19468 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
17989 HasOwnPropertyNamedPropertyGetter, 0, | 19469 HasOwnPropertyNamedPropertyGetter, 0, |
17990 HasOwnPropertyNamedPropertyQuery2)); | 19470 HasOwnPropertyNamedPropertyQuery2)); |
17991 Handle<Object> instance = templ->NewInstance(); | 19471 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked(); |
17992 CHECK(!instance->HasOwnProperty(v8_str("foo"))); | 19472 CHECK(!instance->HasOwnProperty(v8_str("foo"))); |
17993 CHECK(instance->HasOwnProperty(v8_str("bar"))); | 19473 CHECK(instance->HasOwnProperty(v8_str("bar"))); |
17994 } | 19474 } |
17995 } | 19475 } |
17996 | 19476 |
17997 | 19477 |
17998 TEST(IndexedInterceptorWithStringProto) { | 19478 TEST(IndexedInterceptorWithStringProto) { |
17999 v8::Isolate* isolate = CcTest::isolate(); | 19479 v8::Isolate* isolate = CcTest::isolate(); |
18000 v8::HandleScope scope(isolate); | 19480 v8::HandleScope scope(isolate); |
18001 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19481 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
18002 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( | 19482 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( |
18003 NULL, NULL, HasOwnPropertyIndexedPropertyQuery)); | 19483 NULL, NULL, HasOwnPropertyIndexedPropertyQuery)); |
18004 LocalContext context; | 19484 LocalContext context; |
18005 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 19485 CHECK(context->Global() |
19486 ->Set(context.local(), v8_str("obj"), | |
19487 templ->NewInstance(context.local()).ToLocalChecked()) | |
19488 .FromJust()); | |
18006 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); | 19489 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); |
18007 // These should be intercepted. | 19490 // These should be intercepted. |
18008 CHECK(CompileRun("42 in obj")->BooleanValue()); | 19491 CHECK(CompileRun("42 in obj")->BooleanValue()); |
18009 CHECK(CompileRun("'42' in obj")->BooleanValue()); | 19492 CHECK(CompileRun("'42' in obj")->BooleanValue()); |
18010 // These should fall through to the String prototype. | 19493 // These should fall through to the String prototype. |
18011 CHECK(CompileRun("0 in obj")->BooleanValue()); | 19494 CHECK(CompileRun("0 in obj")->BooleanValue()); |
18012 CHECK(CompileRun("'0' in obj")->BooleanValue()); | 19495 CHECK(CompileRun("'0' in obj")->BooleanValue()); |
18013 // And these should both fail. | 19496 // And these should both fail. |
18014 CHECK(!CompileRun("32 in obj")->BooleanValue()); | 19497 CHECK(!CompileRun("32 in obj")->BooleanValue()); |
18015 CHECK(!CompileRun("'32' in obj")->BooleanValue()); | 19498 CHECK(!CompileRun("'32' in obj")->BooleanValue()); |
18016 } | 19499 } |
18017 | 19500 |
18018 | 19501 |
18019 void CheckCodeGenerationAllowed() { | 19502 void CheckCodeGenerationAllowed() { |
18020 Handle<Value> result = CompileRun("eval('42')"); | 19503 Local<v8::Context> context = CcTest::isolate()->GetCurrentContext(); |
18021 CHECK_EQ(42, result->Int32Value()); | 19504 Local<Value> result = CompileRun("eval('42')"); |
19505 CHECK_EQ(42, result->Int32Value(context).FromJust()); | |
18022 result = CompileRun("(function(e) { return e('42'); })(eval)"); | 19506 result = CompileRun("(function(e) { return e('42'); })(eval)"); |
18023 CHECK_EQ(42, result->Int32Value()); | 19507 CHECK_EQ(42, result->Int32Value(context).FromJust()); |
18024 result = CompileRun("var f = new Function('return 42'); f()"); | 19508 result = CompileRun("var f = new Function('return 42'); f()"); |
18025 CHECK_EQ(42, result->Int32Value()); | 19509 CHECK_EQ(42, result->Int32Value(context).FromJust()); |
18026 } | 19510 } |
18027 | 19511 |
18028 | 19512 |
18029 void CheckCodeGenerationDisallowed() { | 19513 void CheckCodeGenerationDisallowed() { |
18030 TryCatch try_catch(CcTest::isolate()); | 19514 TryCatch try_catch(CcTest::isolate()); |
18031 | 19515 |
18032 Handle<Value> result = CompileRun("eval('42')"); | 19516 Local<Value> result = CompileRun("eval('42')"); |
18033 CHECK(result.IsEmpty()); | 19517 CHECK(result.IsEmpty()); |
18034 CHECK(try_catch.HasCaught()); | 19518 CHECK(try_catch.HasCaught()); |
18035 try_catch.Reset(); | 19519 try_catch.Reset(); |
18036 | 19520 |
18037 result = CompileRun("(function(e) { return e('42'); })(eval)"); | 19521 result = CompileRun("(function(e) { return e('42'); })(eval)"); |
18038 CHECK(result.IsEmpty()); | 19522 CHECK(result.IsEmpty()); |
18039 CHECK(try_catch.HasCaught()); | 19523 CHECK(try_catch.HasCaught()); |
18040 try_catch.Reset(); | 19524 try_catch.Reset(); |
18041 | 19525 |
18042 result = CompileRun("var f = new Function('return 42'); f()"); | 19526 result = CompileRun("var f = new Function('return 42'); f()"); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18085 CHECK(!context->IsCodeGenerationFromStringsAllowed()); | 19569 CHECK(!context->IsCodeGenerationFromStringsAllowed()); |
18086 CheckCodeGenerationDisallowed(); | 19570 CheckCodeGenerationDisallowed(); |
18087 } | 19571 } |
18088 | 19572 |
18089 | 19573 |
18090 TEST(SetErrorMessageForCodeGenFromStrings) { | 19574 TEST(SetErrorMessageForCodeGenFromStrings) { |
18091 LocalContext context; | 19575 LocalContext context; |
18092 v8::HandleScope scope(context->GetIsolate()); | 19576 v8::HandleScope scope(context->GetIsolate()); |
18093 TryCatch try_catch(context->GetIsolate()); | 19577 TryCatch try_catch(context->GetIsolate()); |
18094 | 19578 |
18095 Handle<String> message = v8_str("Message"); | 19579 Local<String> message = v8_str("Message"); |
18096 Handle<String> expected_message = v8_str("Uncaught EvalError: Message"); | 19580 Local<String> expected_message = v8_str("Uncaught EvalError: Message"); |
18097 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); | 19581 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); |
18098 context->AllowCodeGenerationFromStrings(false); | 19582 context->AllowCodeGenerationFromStrings(false); |
18099 context->SetErrorMessageForCodeGenerationFromStrings(message); | 19583 context->SetErrorMessageForCodeGenerationFromStrings(message); |
18100 Handle<Value> result = CompileRun("eval('42')"); | 19584 Local<Value> result = CompileRun("eval('42')"); |
18101 CHECK(result.IsEmpty()); | 19585 CHECK(result.IsEmpty()); |
18102 CHECK(try_catch.HasCaught()); | 19586 CHECK(try_catch.HasCaught()); |
18103 Handle<String> actual_message = try_catch.Message()->Get(); | 19587 Local<String> actual_message = try_catch.Message()->Get(); |
18104 CHECK(expected_message->Equals(actual_message)); | 19588 CHECK(expected_message->Equals(actual_message)); |
18105 } | 19589 } |
18106 | 19590 |
18107 | 19591 |
18108 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 19592 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { |
18109 } | 19593 } |
18110 | 19594 |
18111 | 19595 |
18112 THREADED_TEST(CallAPIFunctionOnNonObject) { | 19596 THREADED_TEST(CallAPIFunctionOnNonObject) { |
18113 LocalContext context; | 19597 LocalContext context; |
18114 v8::Isolate* isolate = context->GetIsolate(); | 19598 v8::Isolate* isolate = context->GetIsolate(); |
18115 v8::HandleScope scope(isolate); | 19599 v8::HandleScope scope(isolate); |
18116 Handle<FunctionTemplate> templ = | 19600 Local<FunctionTemplate> templ = |
18117 v8::FunctionTemplate::New(isolate, NonObjectThis); | 19601 v8::FunctionTemplate::New(isolate, NonObjectThis); |
18118 Handle<Function> function = templ->GetFunction(); | 19602 Local<Function> function = |
18119 context->Global()->Set(v8_str("f"), function); | 19603 templ->GetFunction(context.local()).ToLocalChecked(); |
19604 CHECK(context->Global() | |
19605 ->Set(context.local(), v8_str("f"), function) | |
19606 .FromJust()); | |
18120 TryCatch try_catch(isolate); | 19607 TryCatch try_catch(isolate); |
18121 CompileRun("f.call(2)"); | 19608 CompileRun("f.call(2)"); |
18122 } | 19609 } |
18123 | 19610 |
18124 | 19611 |
18125 // Regression test for issue 1470. | 19612 // Regression test for issue 1470. |
18126 THREADED_TEST(ReadOnlyIndexedProperties) { | 19613 THREADED_TEST(ReadOnlyIndexedProperties) { |
18127 v8::Isolate* isolate = CcTest::isolate(); | 19614 v8::Isolate* isolate = CcTest::isolate(); |
18128 v8::HandleScope scope(isolate); | 19615 v8::HandleScope scope(isolate); |
18129 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 19616 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
18130 | 19617 |
18131 LocalContext context; | 19618 LocalContext context; |
18132 Local<v8::Object> obj = templ->NewInstance(); | 19619 Local<v8::Object> obj = templ->NewInstance(context.local()).ToLocalChecked(); |
18133 context->Global()->Set(v8_str("obj"), obj); | 19620 CHECK(context->Global()->Set(context.local(), v8_str("obj"), obj).FromJust()); |
18134 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); | 19621 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); |
18135 obj->Set(v8_str("1"), v8_str("foobar")); | 19622 obj->Set(v8_str("1"), v8_str("foobar")); |
18136 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("1")))); | 19623 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("1")))); |
18137 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); | 19624 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); |
18138 obj->Set(v8_num(2), v8_str("foobar")); | 19625 obj->Set(v8_num(2), v8_str("foobar")); |
18139 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_num(2)))); | 19626 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_num(2)))); |
18140 | 19627 |
18141 // Test non-smi case. | 19628 // Test non-smi case. |
18142 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); | 19629 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); |
18143 obj->Set(v8_str("2000000000"), v8_str("foobar")); | 19630 obj->Set(v8_str("2000000000"), v8_str("foobar")); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18202 protected_hidden_proto_template->SetHiddenPrototype(true); | 19689 protected_hidden_proto_template->SetHiddenPrototype(true); |
18203 | 19690 |
18204 // Context for "foreign" objects used in test. | 19691 // Context for "foreign" objects used in test. |
18205 Local<Context> context = v8::Context::New(isolate); | 19692 Local<Context> context = v8::Context::New(isolate); |
18206 context->Enter(); | 19693 context->Enter(); |
18207 | 19694 |
18208 // Plain object, no security check. | 19695 // Plain object, no security check. |
18209 Local<Object> simple_object = Object::New(isolate); | 19696 Local<Object> simple_object = Object::New(isolate); |
18210 | 19697 |
18211 // Object with explicit security check. | 19698 // Object with explicit security check. |
18212 Local<Object> protected_object = no_proto_template->NewInstance(); | 19699 Local<Object> protected_object = |
19700 no_proto_template->NewInstance(context).ToLocalChecked(); | |
18213 | 19701 |
18214 // JSGlobalProxy object, always have security check. | 19702 // JSGlobalProxy object, always have security check. |
18215 Local<Object> proxy_object = context->Global(); | 19703 Local<Object> proxy_object = context->Global(); |
18216 | 19704 |
18217 // Global object, the prototype of proxy_object. No security checks. | 19705 // Global object, the prototype of proxy_object. No security checks. |
18218 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); | 19706 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); |
18219 | 19707 |
18220 // Hidden prototype without security check. | 19708 // Hidden prototype without security check. |
18221 Local<Object> hidden_prototype = | 19709 Local<Object> hidden_prototype = hidden_proto_template->GetFunction(context) |
18222 hidden_proto_template->GetFunction()->NewInstance(); | 19710 .ToLocalChecked() |
19711 ->NewInstance(context) | |
19712 .ToLocalChecked(); | |
18223 Local<Object> object_with_hidden = | 19713 Local<Object> object_with_hidden = |
18224 Object::New(isolate); | 19714 Object::New(isolate); |
18225 object_with_hidden->SetPrototype(hidden_prototype); | 19715 object_with_hidden->SetPrototype(hidden_prototype); |
18226 | 19716 |
18227 context->Exit(); | 19717 context->Exit(); |
18228 | 19718 |
18229 // Template for object for second context. Values to test are put on it as | 19719 // Template for object for second context. Values to test are put on it as |
18230 // properties. | 19720 // properties. |
18231 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); | 19721 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); |
18232 global_template->Set(v8_str("simple"), simple_object); | 19722 global_template->Set(v8_str("simple"), simple_object); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18303 | 19793 |
18304 CompileRun("function ownfunc() { return { 0: this.id, " | 19794 CompileRun("function ownfunc() { return { 0: this.id, " |
18305 " 1: this, " | 19795 " 1: this, " |
18306 " toString: function() { " | 19796 " toString: function() { " |
18307 " return this[0];" | 19797 " return this[0];" |
18308 " }" | 19798 " }" |
18309 " };" | 19799 " };" |
18310 "}" | 19800 "}" |
18311 "var id = 'o';" | 19801 "var id = 'o';" |
18312 "ownfunc"); | 19802 "ownfunc"); |
18313 context->Global()->Set(v8_str("func"), foreign_function); | 19803 CHECK(context->Global() |
19804 ->Set(context.local(), v8_str("func"), foreign_function) | |
19805 .FromJust()); | |
18314 | 19806 |
18315 // Sanity check the contexts. | 19807 // Sanity check the contexts. |
18316 CHECK(i->Equals(foreign_context->Global()->Get(id))); | 19808 CHECK(i->Equals(foreign_context->Global()->Get(id))); |
18317 CHECK(o->Equals(context->Global()->Get(id))); | 19809 CHECK(o->Equals(context->Global()->Get(id))); |
18318 | 19810 |
18319 // Checking local function's receiver. | 19811 // Checking local function's receiver. |
18320 // Calling function using its call/apply methods. | 19812 // Calling function using its call/apply methods. |
18321 TestReceiver(o, context->Global(), "ownfunc.call()"); | 19813 TestReceiver(o, context->Global(), "ownfunc.call()"); |
18322 TestReceiver(o, context->Global(), "ownfunc.apply()"); | 19814 TestReceiver(o, context->Global(), "ownfunc.apply()"); |
18323 // Making calls through built-in functions. | 19815 // Making calls through built-in functions. |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18366 } | 19858 } |
18367 | 19859 |
18368 | 19860 |
18369 void CallCompletedCallback2() { | 19861 void CallCompletedCallback2() { |
18370 v8::base::OS::Print("Firing callback 2.\n"); | 19862 v8::base::OS::Print("Firing callback 2.\n"); |
18371 callback_fired ^= 2; // Toggle second bit. | 19863 callback_fired ^= 2; // Toggle second bit. |
18372 } | 19864 } |
18373 | 19865 |
18374 | 19866 |
18375 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { | 19867 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { |
18376 int32_t level = args[0]->Int32Value(); | 19868 int32_t level = |
19869 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust(); | |
18377 if (level < 3) { | 19870 if (level < 3) { |
18378 level++; | 19871 level++; |
18379 v8::base::OS::Print("Entering recursion level %d.\n", level); | 19872 v8::base::OS::Print("Entering recursion level %d.\n", level); |
18380 char script[64]; | 19873 char script[64]; |
18381 i::Vector<char> script_vector(script, sizeof(script)); | 19874 i::Vector<char> script_vector(script, sizeof(script)); |
18382 i::SNPrintF(script_vector, "recursion(%d)", level); | 19875 i::SNPrintF(script_vector, "recursion(%d)", level); |
18383 CompileRun(script_vector.start()); | 19876 CompileRun(script_vector.start()); |
18384 v8::base::OS::Print("Leaving recursion level %d.\n", level); | 19877 v8::base::OS::Print("Leaving recursion level %d.\n", level); |
18385 CHECK_EQ(0, callback_fired); | 19878 CHECK_EQ(0, callback_fired); |
18386 } else { | 19879 } else { |
18387 v8::base::OS::Print("Recursion ends.\n"); | 19880 v8::base::OS::Print("Recursion ends.\n"); |
18388 CHECK_EQ(0, callback_fired); | 19881 CHECK_EQ(0, callback_fired); |
18389 } | 19882 } |
18390 } | 19883 } |
18391 | 19884 |
18392 | 19885 |
18393 TEST(CallCompletedCallback) { | 19886 TEST(CallCompletedCallback) { |
18394 LocalContext env; | 19887 LocalContext env; |
18395 v8::HandleScope scope(env->GetIsolate()); | 19888 v8::HandleScope scope(env->GetIsolate()); |
18396 v8::Handle<v8::FunctionTemplate> recursive_runtime = | 19889 v8::Local<v8::FunctionTemplate> recursive_runtime = |
18397 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); | 19890 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); |
18398 env->Global()->Set(v8_str("recursion"), | 19891 env->Global()->Set( |
18399 recursive_runtime->GetFunction()); | 19892 v8_str("recursion"), |
19893 recursive_runtime->GetFunction(env.local()).ToLocalChecked()); | |
18400 // Adding the same callback a second time has no effect. | 19894 // Adding the same callback a second time has no effect. |
18401 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); | 19895 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); |
18402 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); | 19896 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); |
18403 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); | 19897 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); |
18404 v8::base::OS::Print("--- Script (1) ---\n"); | 19898 v8::base::OS::Print("--- Script (1) ---\n"); |
18405 Local<Script> script = v8::Script::Compile( | 19899 Local<Script> script = v8::Script::Compile(v8_str("recursion(0)")); |
18406 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)")); | |
18407 script->Run(); | 19900 script->Run(); |
18408 CHECK_EQ(3, callback_fired); | 19901 CHECK_EQ(3, callback_fired); |
18409 | 19902 |
18410 v8::base::OS::Print("\n--- Script (2) ---\n"); | 19903 v8::base::OS::Print("\n--- Script (2) ---\n"); |
18411 callback_fired = 0; | 19904 callback_fired = 0; |
18412 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); | 19905 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); |
18413 script->Run(); | 19906 script->Run(); |
18414 CHECK_EQ(2, callback_fired); | 19907 CHECK_EQ(2, callback_fired); |
18415 | 19908 |
18416 v8::base::OS::Print("\n--- Function ---\n"); | 19909 v8::base::OS::Print("\n--- Function ---\n"); |
18417 callback_fired = 0; | 19910 callback_fired = 0; |
18418 Local<Function> recursive_function = | 19911 Local<Function> recursive_function = |
18419 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); | 19912 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); |
18420 v8::Handle<Value> args[] = { v8_num(0) }; | 19913 v8::Local<Value> args[] = {v8_num(0)}; |
18421 recursive_function->Call(env->Global(), 1, args); | 19914 recursive_function->Call(env->Global(), 1, args); |
18422 CHECK_EQ(2, callback_fired); | 19915 CHECK_EQ(2, callback_fired); |
18423 } | 19916 } |
18424 | 19917 |
18425 | 19918 |
18426 void CallCompletedCallbackNoException() { | 19919 void CallCompletedCallbackNoException() { |
18427 v8::HandleScope scope(CcTest::isolate()); | 19920 v8::HandleScope scope(CcTest::isolate()); |
18428 CompileRun("1+1;"); | 19921 CompileRun("1+1;"); |
18429 } | 19922 } |
18430 | 19923 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18471 } | 19964 } |
18472 | 19965 |
18473 | 19966 |
18474 TEST(EnqueueMicrotask) { | 19967 TEST(EnqueueMicrotask) { |
18475 LocalContext env; | 19968 LocalContext env; |
18476 v8::HandleScope scope(env->GetIsolate()); | 19969 v8::HandleScope scope(env->GetIsolate()); |
18477 CompileRun( | 19970 CompileRun( |
18478 "var ext1Calls = 0;" | 19971 "var ext1Calls = 0;" |
18479 "var ext2Calls = 0;"); | 19972 "var ext2Calls = 0;"); |
18480 CompileRun("1+1;"); | 19973 CompileRun("1+1;"); |
18481 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value()); | 19974 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18482 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); | 19975 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18483 | 19976 |
18484 env->GetIsolate()->EnqueueMicrotask( | 19977 env->GetIsolate()->EnqueueMicrotask( |
18485 Function::New(env->GetIsolate(), MicrotaskOne)); | 19978 Function::New(env->GetIsolate(), MicrotaskOne)); |
18486 CompileRun("1+1;"); | 19979 CompileRun("1+1;"); |
18487 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); | 19980 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18488 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); | 19981 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18489 | 19982 |
18490 env->GetIsolate()->EnqueueMicrotask( | 19983 env->GetIsolate()->EnqueueMicrotask( |
18491 Function::New(env->GetIsolate(), MicrotaskOne)); | 19984 Function::New(env->GetIsolate(), MicrotaskOne)); |
18492 env->GetIsolate()->EnqueueMicrotask( | 19985 env->GetIsolate()->EnqueueMicrotask( |
18493 Function::New(env->GetIsolate(), MicrotaskTwo)); | 19986 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18494 CompileRun("1+1;"); | 19987 CompileRun("1+1;"); |
18495 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 19988 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18496 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); | 19989 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18497 | 19990 |
18498 env->GetIsolate()->EnqueueMicrotask( | 19991 env->GetIsolate()->EnqueueMicrotask( |
18499 Function::New(env->GetIsolate(), MicrotaskTwo)); | 19992 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18500 CompileRun("1+1;"); | 19993 CompileRun("1+1;"); |
18501 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 19994 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18502 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); | 19995 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18503 | 19996 |
18504 CompileRun("1+1;"); | 19997 CompileRun("1+1;"); |
18505 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 19998 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18506 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); | 19999 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18507 | 20000 |
18508 g_passed_to_three = NULL; | 20001 g_passed_to_three = NULL; |
18509 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree); | 20002 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree); |
18510 CompileRun("1+1;"); | 20003 CompileRun("1+1;"); |
18511 CHECK(!g_passed_to_three); | 20004 CHECK(!g_passed_to_three); |
18512 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20005 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18513 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); | 20006 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18514 | 20007 |
18515 int dummy; | 20008 int dummy; |
18516 env->GetIsolate()->EnqueueMicrotask( | 20009 env->GetIsolate()->EnqueueMicrotask( |
18517 Function::New(env->GetIsolate(), MicrotaskOne)); | 20010 Function::New(env->GetIsolate(), MicrotaskOne)); |
18518 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy); | 20011 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy); |
18519 env->GetIsolate()->EnqueueMicrotask( | 20012 env->GetIsolate()->EnqueueMicrotask( |
18520 Function::New(env->GetIsolate(), MicrotaskTwo)); | 20013 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18521 CompileRun("1+1;"); | 20014 CompileRun("1+1;"); |
18522 CHECK_EQ(&dummy, g_passed_to_three); | 20015 CHECK_EQ(&dummy, g_passed_to_three); |
18523 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value()); | 20016 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18524 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); | 20017 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18525 g_passed_to_three = NULL; | 20018 g_passed_to_three = NULL; |
18526 } | 20019 } |
18527 | 20020 |
18528 | 20021 |
18529 static void MicrotaskExceptionOne( | 20022 static void MicrotaskExceptionOne( |
18530 const v8::FunctionCallbackInfo<Value>& info) { | 20023 const v8::FunctionCallbackInfo<Value>& info) { |
18531 v8::HandleScope scope(info.GetIsolate()); | 20024 v8::HandleScope scope(info.GetIsolate()); |
18532 CompileRun("exception1Calls++;"); | 20025 CompileRun("exception1Calls++;"); |
18533 info.GetIsolate()->ThrowException( | 20026 info.GetIsolate()->ThrowException( |
18534 v8::Exception::Error(v8_str("first"))); | 20027 v8::Exception::Error(v8_str("first"))); |
(...skipping 16 matching lines...) Expand all Loading... | |
18551 CompileRun( | 20044 CompileRun( |
18552 "var exception1Calls = 0;" | 20045 "var exception1Calls = 0;" |
18553 "var exception2Calls = 0;"); | 20046 "var exception2Calls = 0;"); |
18554 isolate->EnqueueMicrotask( | 20047 isolate->EnqueueMicrotask( |
18555 Function::New(isolate, MicrotaskExceptionOne)); | 20048 Function::New(isolate, MicrotaskExceptionOne)); |
18556 isolate->EnqueueMicrotask( | 20049 isolate->EnqueueMicrotask( |
18557 Function::New(isolate, MicrotaskExceptionTwo)); | 20050 Function::New(isolate, MicrotaskExceptionTwo)); |
18558 TryCatch try_catch(isolate); | 20051 TryCatch try_catch(isolate); |
18559 CompileRun("1+1;"); | 20052 CompileRun("1+1;"); |
18560 CHECK(!try_catch.HasCaught()); | 20053 CHECK(!try_catch.HasCaught()); |
18561 CHECK_EQ(1, CompileRun("exception1Calls")->Int32Value()); | 20054 CHECK_EQ(1, |
18562 CHECK_EQ(1, CompileRun("exception2Calls")->Int32Value()); | 20055 CompileRun("exception1Calls")->Int32Value(env.local()).FromJust()); |
20056 CHECK_EQ(1, | |
20057 CompileRun("exception2Calls")->Int32Value(env.local()).FromJust()); | |
18563 } | 20058 } |
18564 | 20059 |
18565 | 20060 |
18566 TEST(SetAutorunMicrotasks) { | 20061 TEST(SetAutorunMicrotasks) { |
18567 LocalContext env; | 20062 LocalContext env; |
18568 v8::HandleScope scope(env->GetIsolate()); | 20063 v8::HandleScope scope(env->GetIsolate()); |
18569 CompileRun( | 20064 CompileRun( |
18570 "var ext1Calls = 0;" | 20065 "var ext1Calls = 0;" |
18571 "var ext2Calls = 0;"); | 20066 "var ext2Calls = 0;"); |
18572 CompileRun("1+1;"); | 20067 CompileRun("1+1;"); |
18573 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value()); | 20068 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18574 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); | 20069 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18575 | 20070 |
18576 env->GetIsolate()->EnqueueMicrotask( | 20071 env->GetIsolate()->EnqueueMicrotask( |
18577 Function::New(env->GetIsolate(), MicrotaskOne)); | 20072 Function::New(env->GetIsolate(), MicrotaskOne)); |
18578 CompileRun("1+1;"); | 20073 CompileRun("1+1;"); |
18579 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); | 20074 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18580 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); | 20075 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18581 | 20076 |
18582 env->GetIsolate()->SetAutorunMicrotasks(false); | 20077 env->GetIsolate()->SetAutorunMicrotasks(false); |
18583 env->GetIsolate()->EnqueueMicrotask( | 20078 env->GetIsolate()->EnqueueMicrotask( |
18584 Function::New(env->GetIsolate(), MicrotaskOne)); | 20079 Function::New(env->GetIsolate(), MicrotaskOne)); |
18585 env->GetIsolate()->EnqueueMicrotask( | 20080 env->GetIsolate()->EnqueueMicrotask( |
18586 Function::New(env->GetIsolate(), MicrotaskTwo)); | 20081 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18587 CompileRun("1+1;"); | 20082 CompileRun("1+1;"); |
18588 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); | 20083 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18589 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); | 20084 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18590 | 20085 |
18591 env->GetIsolate()->RunMicrotasks(); | 20086 env->GetIsolate()->RunMicrotasks(); |
18592 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20087 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18593 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); | 20088 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18594 | 20089 |
18595 env->GetIsolate()->EnqueueMicrotask( | 20090 env->GetIsolate()->EnqueueMicrotask( |
18596 Function::New(env->GetIsolate(), MicrotaskTwo)); | 20091 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18597 CompileRun("1+1;"); | 20092 CompileRun("1+1;"); |
18598 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20093 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18599 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); | 20094 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18600 | 20095 |
18601 env->GetIsolate()->RunMicrotasks(); | 20096 env->GetIsolate()->RunMicrotasks(); |
18602 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20097 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18603 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); | 20098 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18604 | 20099 |
18605 env->GetIsolate()->SetAutorunMicrotasks(true); | 20100 env->GetIsolate()->SetAutorunMicrotasks(true); |
18606 env->GetIsolate()->EnqueueMicrotask( | 20101 env->GetIsolate()->EnqueueMicrotask( |
18607 Function::New(env->GetIsolate(), MicrotaskTwo)); | 20102 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18608 CompileRun("1+1;"); | 20103 CompileRun("1+1;"); |
18609 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20104 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18610 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); | 20105 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18611 | 20106 |
18612 env->GetIsolate()->EnqueueMicrotask( | 20107 env->GetIsolate()->EnqueueMicrotask( |
18613 Function::New(env->GetIsolate(), MicrotaskTwo)); | 20108 Function::New(env->GetIsolate(), MicrotaskTwo)); |
18614 { | 20109 { |
18615 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate()); | 20110 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate()); |
18616 CompileRun("1+1;"); | 20111 CompileRun("1+1;"); |
18617 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20112 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18618 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); | 20113 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18619 } | 20114 } |
18620 | 20115 |
18621 CompileRun("1+1;"); | 20116 CompileRun("1+1;"); |
18622 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); | 20117 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust()); |
18623 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value()); | 20118 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust()); |
18624 } | 20119 } |
18625 | 20120 |
18626 | 20121 |
18627 TEST(RunMicrotasksWithoutEnteringContext) { | 20122 TEST(RunMicrotasksWithoutEnteringContext) { |
18628 v8::Isolate* isolate = CcTest::isolate(); | 20123 v8::Isolate* isolate = CcTest::isolate(); |
18629 HandleScope handle_scope(isolate); | 20124 HandleScope handle_scope(isolate); |
18630 isolate->SetAutorunMicrotasks(false); | 20125 isolate->SetAutorunMicrotasks(false); |
18631 Handle<Context> context = Context::New(isolate); | 20126 Local<Context> context = Context::New(isolate); |
18632 { | 20127 { |
18633 Context::Scope context_scope(context); | 20128 Context::Scope context_scope(context); |
18634 CompileRun("var ext1Calls = 0;"); | 20129 CompileRun("var ext1Calls = 0;"); |
18635 isolate->EnqueueMicrotask(Function::New(isolate, MicrotaskOne)); | 20130 isolate->EnqueueMicrotask(Function::New(isolate, MicrotaskOne)); |
18636 } | 20131 } |
18637 isolate->RunMicrotasks(); | 20132 isolate->RunMicrotasks(); |
18638 { | 20133 { |
18639 Context::Scope context_scope(context); | 20134 Context::Scope context_scope(context); |
18640 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); | 20135 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(context).FromJust()); |
18641 } | 20136 } |
18642 isolate->SetAutorunMicrotasks(true); | 20137 isolate->SetAutorunMicrotasks(true); |
18643 } | 20138 } |
18644 | 20139 |
18645 | 20140 |
18646 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) { | 20141 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) { |
18647 v8::DebugEvent event = event_details.GetEvent(); | 20142 v8::DebugEvent event = event_details.GetEvent(); |
18648 if (event != v8::Break) return; | 20143 if (event != v8::Break) return; |
18649 Handle<Object> exec_state = event_details.GetExecutionState(); | 20144 Local<Object> exec_state = event_details.GetExecutionState(); |
18650 Handle<Value> break_id = exec_state->Get(v8_str("break_id")); | 20145 Local<Value> break_id = exec_state->Get(v8_str("break_id")); |
18651 CompileRun("function f(id) { new FrameDetails(id, 0); }"); | 20146 CompileRun("function f(id) { new FrameDetails(id, 0); }"); |
18652 Handle<Function> fun = | 20147 Local<Function> fun = |
18653 Handle<Function>::Cast(CcTest::global()->Get(v8_str("f"))); | 20148 Local<Function>::Cast(CcTest::global()->Get(v8_str("f"))); |
18654 fun->Call(CcTest::global(), 1, &break_id); | 20149 fun->Call(CcTest::global(), 1, &break_id); |
18655 } | 20150 } |
18656 | 20151 |
18657 | 20152 |
18658 TEST(Regress385349) { | 20153 TEST(Regress385349) { |
18659 i::FLAG_allow_natives_syntax = true; | 20154 i::FLAG_allow_natives_syntax = true; |
18660 v8::Isolate* isolate = CcTest::isolate(); | 20155 v8::Isolate* isolate = CcTest::isolate(); |
18661 HandleScope handle_scope(isolate); | 20156 HandleScope handle_scope(isolate); |
18662 isolate->SetAutorunMicrotasks(false); | 20157 isolate->SetAutorunMicrotasks(false); |
18663 Handle<Context> context = Context::New(isolate); | 20158 Local<Context> context = Context::New(isolate); |
18664 v8::Debug::SetDebugEventListener(DebugEventInObserver); | 20159 v8::Debug::SetDebugEventListener(DebugEventInObserver); |
18665 { | 20160 { |
18666 Context::Scope context_scope(context); | 20161 Context::Scope context_scope(context); |
18667 CompileRun("var obj = {};" | 20162 CompileRun("var obj = {};" |
18668 "Object.observe(obj, function(changes) { debugger; });" | 20163 "Object.observe(obj, function(changes) { debugger; });" |
18669 "obj.a = 0;"); | 20164 "obj.a = 0;"); |
18670 } | 20165 } |
18671 isolate->RunMicrotasks(); | 20166 isolate->RunMicrotasks(); |
18672 isolate->SetAutorunMicrotasks(true); | 20167 isolate->SetAutorunMicrotasks(true); |
18673 v8::Debug::SetDebugEventListener(NULL); | 20168 v8::Debug::SetDebugEventListener(NULL); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18916 } | 20411 } |
18917 | 20412 |
18918 | 20413 |
18919 THREADED_TEST(InstanceCheckOnInstanceAccessor) { | 20414 THREADED_TEST(InstanceCheckOnInstanceAccessor) { |
18920 v8::internal::FLAG_allow_natives_syntax = true; | 20415 v8::internal::FLAG_allow_natives_syntax = true; |
18921 LocalContext context; | 20416 LocalContext context; |
18922 v8::HandleScope scope(context->GetIsolate()); | 20417 v8::HandleScope scope(context->GetIsolate()); |
18923 | 20418 |
18924 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); | 20419 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
18925 Local<ObjectTemplate> inst = templ->InstanceTemplate(); | 20420 Local<ObjectTemplate> inst = templ->InstanceTemplate(); |
18926 inst->SetAccessor(v8_str("foo"), | 20421 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter, |
18927 InstanceCheckedGetter, InstanceCheckedSetter, | 20422 Local<Value>(), v8::DEFAULT, v8::None, |
18928 Handle<Value>(), | |
18929 v8::DEFAULT, | |
18930 v8::None, | |
18931 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20423 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
18932 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20424 CHECK(context->Global() |
20425 ->Set(context.local(), v8_str("f"), | |
20426 templ->GetFunction(context.local()).ToLocalChecked()) | |
20427 .FromJust()); | |
18933 | 20428 |
18934 printf("Testing positive ...\n"); | 20429 printf("Testing positive ...\n"); |
18935 CompileRun("var obj = new f();"); | 20430 CompileRun("var obj = new f();"); |
18936 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20431 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
18937 CheckInstanceCheckedAccessors(true); | 20432 CheckInstanceCheckedAccessors(true); |
18938 | 20433 |
18939 printf("Testing negative ...\n"); | 20434 printf("Testing negative ...\n"); |
18940 CompileRun("var obj = {};" | 20435 CompileRun("var obj = {};" |
18941 "obj.__proto__ = new f();"); | 20436 "obj.__proto__ = new f();"); |
18942 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20437 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
(...skipping 12 matching lines...) Expand all Loading... | |
18955 | 20450 |
18956 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) { | 20451 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) { |
18957 v8::internal::FLAG_allow_natives_syntax = true; | 20452 v8::internal::FLAG_allow_natives_syntax = true; |
18958 LocalContext context; | 20453 LocalContext context; |
18959 v8::HandleScope scope(context->GetIsolate()); | 20454 v8::HandleScope scope(context->GetIsolate()); |
18960 | 20455 |
18961 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); | 20456 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
18962 Local<ObjectTemplate> inst = templ->InstanceTemplate(); | 20457 Local<ObjectTemplate> inst = templ->InstanceTemplate(); |
18963 templ->InstanceTemplate()->SetNamedPropertyHandler(EmptyInterceptorGetter, | 20458 templ->InstanceTemplate()->SetNamedPropertyHandler(EmptyInterceptorGetter, |
18964 EmptyInterceptorSetter); | 20459 EmptyInterceptorSetter); |
18965 inst->SetAccessor(v8_str("foo"), | 20460 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter, |
18966 InstanceCheckedGetter, InstanceCheckedSetter, | 20461 Local<Value>(), v8::DEFAULT, v8::None, |
18967 Handle<Value>(), | |
18968 v8::DEFAULT, | |
18969 v8::None, | |
18970 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20462 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
18971 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20463 CHECK(context->Global() |
20464 ->Set(context.local(), v8_str("f"), | |
20465 templ->GetFunction(context.local()).ToLocalChecked()) | |
20466 .FromJust()); | |
18972 | 20467 |
18973 printf("Testing positive ...\n"); | 20468 printf("Testing positive ...\n"); |
18974 CompileRun("var obj = new f();"); | 20469 CompileRun("var obj = new f();"); |
18975 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20470 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
18976 CheckInstanceCheckedAccessors(true); | 20471 CheckInstanceCheckedAccessors(true); |
18977 | 20472 |
18978 printf("Testing negative ...\n"); | 20473 printf("Testing negative ...\n"); |
18979 CompileRun("var obj = {};" | 20474 CompileRun("var obj = {};" |
18980 "obj.__proto__ = new f();"); | 20475 "obj.__proto__ = new f();"); |
18981 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20476 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
18982 CheckInstanceCheckedAccessors(false); | 20477 CheckInstanceCheckedAccessors(false); |
18983 } | 20478 } |
18984 | 20479 |
18985 | 20480 |
18986 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { | 20481 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { |
18987 v8::internal::FLAG_allow_natives_syntax = true; | 20482 v8::internal::FLAG_allow_natives_syntax = true; |
18988 LocalContext context; | 20483 LocalContext context; |
18989 v8::HandleScope scope(context->GetIsolate()); | 20484 v8::HandleScope scope(context->GetIsolate()); |
18990 | 20485 |
18991 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); | 20486 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
18992 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); | 20487 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); |
18993 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter, | 20488 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter, |
18994 InstanceCheckedSetter, Handle<Value>(), v8::DEFAULT, | 20489 InstanceCheckedSetter, Local<Value>(), v8::DEFAULT, |
18995 v8::None, | 20490 v8::None, |
18996 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20491 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
18997 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20492 CHECK(context->Global() |
20493 ->Set(context.local(), v8_str("f"), | |
20494 templ->GetFunction(context.local()).ToLocalChecked()) | |
20495 .FromJust()); | |
18998 | 20496 |
18999 printf("Testing positive ...\n"); | 20497 printf("Testing positive ...\n"); |
19000 CompileRun("var obj = new f();"); | 20498 CompileRun("var obj = new f();"); |
19001 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20499 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
19002 CheckInstanceCheckedAccessors(true); | 20500 CheckInstanceCheckedAccessors(true); |
19003 | 20501 |
19004 printf("Testing negative ...\n"); | 20502 printf("Testing negative ...\n"); |
19005 CompileRun("var obj = {};" | 20503 CompileRun("var obj = {};" |
19006 "obj.__proto__ = new f();"); | 20504 "obj.__proto__ = new f();"); |
19007 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20505 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19067 LocalContext context; | 20565 LocalContext context; |
19068 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate()); | 20566 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate()); |
19069 if (interceptor) { | 20567 if (interceptor) { |
19070 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(FooGetInterceptor, | 20568 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(FooGetInterceptor, |
19071 FooSetInterceptor)); | 20569 FooSetInterceptor)); |
19072 } else { | 20570 } else { |
19073 templ->SetAccessor(v8_str("foo"), | 20571 templ->SetAccessor(v8_str("foo"), |
19074 GetterWhichReturns42, | 20572 GetterWhichReturns42, |
19075 SetterWhichSetsYOnThisTo23); | 20573 SetterWhichSetsYOnThisTo23); |
19076 } | 20574 } |
19077 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 20575 CHECK(context->Global() |
20576 ->Set(context.local(), v8_str("obj"), | |
20577 templ->NewInstance(context.local()).ToLocalChecked()) | |
20578 .FromJust()); | |
19078 | 20579 |
19079 // Turn monomorphic on slow object with native accessor, then turn | 20580 // Turn monomorphic on slow object with native accessor, then turn |
19080 // polymorphic, finally optimize to create negative lookup and fail. | 20581 // polymorphic, finally optimize to create negative lookup and fail. |
19081 CompileRun(do_store ? | 20582 CompileRun(do_store ? |
19082 "function f(x) { x.foo = void 0; }" : | 20583 "function f(x) { x.foo = void 0; }" : |
19083 "function f(x) { return x.foo; }"); | 20584 "function f(x) { return x.foo; }"); |
19084 CompileRun("obj.y = void 0;"); | 20585 CompileRun("obj.y = void 0;"); |
19085 if (!interceptor) { | 20586 if (!interceptor) { |
19086 CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);"); | 20587 CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);"); |
19087 } | 20588 } |
19088 CompileRun("obj.__proto__ = null;" | 20589 CompileRun("obj.__proto__ = null;" |
19089 "f(obj); f(obj); f(obj);"); | 20590 "f(obj); f(obj); f(obj);"); |
19090 if (polymorphic) { | 20591 if (polymorphic) { |
19091 CompileRun("f({});"); | 20592 CompileRun("f({});"); |
19092 } | 20593 } |
19093 CompileRun("obj.y = void 0;" | 20594 CompileRun("obj.y = void 0;" |
19094 "%OptimizeFunctionOnNextCall(f);"); | 20595 "%OptimizeFunctionOnNextCall(f);"); |
19095 if (remove_accessor) { | 20596 if (remove_accessor) { |
19096 CompileRun("delete obj.foo;"); | 20597 CompileRun("delete obj.foo;"); |
19097 } | 20598 } |
19098 CompileRun("var result = f(obj);"); | 20599 CompileRun("var result = f(obj);"); |
19099 if (do_store) { | 20600 if (do_store) { |
19100 CompileRun("result = obj.y;"); | 20601 CompileRun("result = obj.y;"); |
19101 } | 20602 } |
19102 if (remove_accessor && !interceptor) { | 20603 if (remove_accessor && !interceptor) { |
19103 CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); | 20604 CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); |
19104 } else { | 20605 } else { |
19105 CHECK_EQ(do_store ? 23 : 42, | 20606 CHECK_EQ(do_store ? 23 : 42, context->Global() |
19106 context->Global()->Get(v8_str("result"))->Int32Value()); | 20607 ->Get(v8_str("result")) |
20608 ->Int32Value(context.local()) | |
20609 .FromJust()); | |
19107 } | 20610 } |
19108 } | 20611 } |
19109 | 20612 |
19110 | 20613 |
19111 THREADED_TEST(Regress137002a) { | 20614 THREADED_TEST(Regress137002a) { |
19112 i::FLAG_allow_natives_syntax = true; | 20615 i::FLAG_allow_natives_syntax = true; |
19113 i::FLAG_compilation_cache = false; | 20616 i::FLAG_compilation_cache = false; |
19114 v8::HandleScope scope(CcTest::isolate()); | 20617 v8::HandleScope scope(CcTest::isolate()); |
19115 for (int i = 0; i < 16; i++) { | 20618 for (int i = 0; i < 16; i++) { |
19116 Helper137002(i & 8, i & 4, i & 2, i & 1); | 20619 Helper137002(i & 8, i & 4, i & 2, i & 1); |
19117 } | 20620 } |
19118 } | 20621 } |
19119 | 20622 |
19120 | 20623 |
19121 THREADED_TEST(Regress137002b) { | 20624 THREADED_TEST(Regress137002b) { |
19122 i::FLAG_allow_natives_syntax = true; | 20625 i::FLAG_allow_natives_syntax = true; |
19123 LocalContext context; | 20626 LocalContext context; |
19124 v8::Isolate* isolate = context->GetIsolate(); | 20627 v8::Isolate* isolate = context->GetIsolate(); |
19125 v8::HandleScope scope(isolate); | 20628 v8::HandleScope scope(isolate); |
19126 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 20629 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
19127 templ->SetAccessor(v8_str("foo"), | 20630 templ->SetAccessor(v8_str("foo"), |
19128 GetterWhichReturns42, | 20631 GetterWhichReturns42, |
19129 SetterWhichSetsYOnThisTo23); | 20632 SetterWhichSetsYOnThisTo23); |
19130 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 20633 CHECK(context->Global() |
20634 ->Set(context.local(), v8_str("obj"), | |
20635 templ->NewInstance(context.local()).ToLocalChecked()) | |
20636 .FromJust()); | |
19131 | 20637 |
19132 // Turn monomorphic on slow object with native accessor, then just | 20638 // Turn monomorphic on slow object with native accessor, then just |
19133 // delete the property and fail. | 20639 // delete the property and fail. |
19134 CompileRun("function load(x) { return x.foo; }" | 20640 CompileRun("function load(x) { return x.foo; }" |
19135 "function store(x) { x.foo = void 0; }" | 20641 "function store(x) { x.foo = void 0; }" |
19136 "function keyed_load(x, key) { return x[key]; }" | 20642 "function keyed_load(x, key) { return x[key]; }" |
19137 // Second version of function has a different source (add void 0) | 20643 // Second version of function has a different source (add void 0) |
19138 // so that it does not share code with the first version. This | 20644 // so that it does not share code with the first version. This |
19139 // ensures that the ICs are monomorphic. | 20645 // ensures that the ICs are monomorphic. |
19140 "function load2(x) { void 0; return x.foo; }" | 20646 "function load2(x) { void 0; return x.foo; }" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19189 | 20695 |
19190 THREADED_TEST(Regress142088) { | 20696 THREADED_TEST(Regress142088) { |
19191 i::FLAG_allow_natives_syntax = true; | 20697 i::FLAG_allow_natives_syntax = true; |
19192 LocalContext context; | 20698 LocalContext context; |
19193 v8::Isolate* isolate = context->GetIsolate(); | 20699 v8::Isolate* isolate = context->GetIsolate(); |
19194 v8::HandleScope scope(isolate); | 20700 v8::HandleScope scope(isolate); |
19195 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 20701 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
19196 templ->SetAccessor(v8_str("foo"), | 20702 templ->SetAccessor(v8_str("foo"), |
19197 GetterWhichReturns42, | 20703 GetterWhichReturns42, |
19198 SetterWhichSetsYOnThisTo23); | 20704 SetterWhichSetsYOnThisTo23); |
19199 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 20705 CHECK(context->Global() |
20706 ->Set(context.local(), v8_str("obj"), | |
20707 templ->NewInstance(context.local()).ToLocalChecked()) | |
20708 .FromJust()); | |
19200 | 20709 |
19201 CompileRun("function load(x) { return x.foo; }" | 20710 CompileRun("function load(x) { return x.foo; }" |
19202 "var o = Object.create(obj);" | 20711 "var o = Object.create(obj);" |
19203 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" | 20712 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" |
19204 "load(o); load(o); load(o); load(o);"); | 20713 "load(o); load(o); load(o); load(o);"); |
19205 } | 20714 } |
19206 | 20715 |
19207 | 20716 |
19208 THREADED_TEST(Regress137496) { | 20717 THREADED_TEST(Regress137496) { |
19209 i::FLAG_expose_gc = true; | 20718 i::FLAG_expose_gc = true; |
19210 LocalContext context; | 20719 LocalContext context; |
19211 v8::HandleScope scope(context->GetIsolate()); | 20720 v8::HandleScope scope(context->GetIsolate()); |
19212 | 20721 |
19213 // Compile a try-finally clause where the finally block causes a GC | 20722 // Compile a try-finally clause where the finally block causes a GC |
19214 // while there still is a message pending for external reporting. | 20723 // while there still is a message pending for external reporting. |
19215 TryCatch try_catch(context->GetIsolate()); | 20724 TryCatch try_catch(context->GetIsolate()); |
19216 try_catch.SetVerbose(true); | 20725 try_catch.SetVerbose(true); |
19217 CompileRun("try { throw new Error(); } finally { gc(); }"); | 20726 CompileRun("try { throw new Error(); } finally { gc(); }"); |
19218 CHECK(try_catch.HasCaught()); | 20727 CHECK(try_catch.HasCaught()); |
19219 } | 20728 } |
19220 | 20729 |
19221 | 20730 |
19222 THREADED_TEST(Regress157124) { | 20731 THREADED_TEST(Regress157124) { |
19223 LocalContext context; | 20732 LocalContext context; |
19224 v8::Isolate* isolate = context->GetIsolate(); | 20733 v8::Isolate* isolate = context->GetIsolate(); |
19225 v8::HandleScope scope(isolate); | 20734 v8::HandleScope scope(isolate); |
19226 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 20735 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
19227 Local<Object> obj = templ->NewInstance(); | 20736 Local<Object> obj = templ->NewInstance(context.local()).ToLocalChecked(); |
19228 obj->GetIdentityHash(); | 20737 obj->GetIdentityHash(); |
19229 obj->DeletePrivate(context.local(), | 20738 obj->DeletePrivate(context.local(), |
19230 v8::Private::ForApi(isolate, v8_str("Bug"))) | 20739 v8::Private::ForApi(isolate, v8_str("Bug"))) |
19231 .FromJust(); | 20740 .FromJust(); |
19232 } | 20741 } |
19233 | 20742 |
19234 | 20743 |
19235 THREADED_TEST(Regress2535) { | 20744 THREADED_TEST(Regress2535) { |
19236 LocalContext context; | 20745 LocalContext context; |
19237 v8::HandleScope scope(context->GetIsolate()); | 20746 v8::HandleScope scope(context->GetIsolate()); |
(...skipping 20 matching lines...) Expand all Loading... | |
19258 } | 20767 } |
19259 | 20768 |
19260 | 20769 |
19261 THREADED_TEST(Regress260106) { | 20770 THREADED_TEST(Regress260106) { |
19262 LocalContext context; | 20771 LocalContext context; |
19263 v8::Isolate* isolate = context->GetIsolate(); | 20772 v8::Isolate* isolate = context->GetIsolate(); |
19264 v8::HandleScope scope(isolate); | 20773 v8::HandleScope scope(isolate); |
19265 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, | 20774 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, |
19266 DummyCallHandler); | 20775 DummyCallHandler); |
19267 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); | 20776 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); |
19268 Local<Function> function = templ->GetFunction(); | 20777 Local<Function> function = |
20778 templ->GetFunction(context.local()).ToLocalChecked(); | |
19269 CHECK(!function.IsEmpty()); | 20779 CHECK(!function.IsEmpty()); |
19270 CHECK(function->IsFunction()); | 20780 CHECK(function->IsFunction()); |
19271 } | 20781 } |
19272 | 20782 |
19273 | 20783 |
19274 THREADED_TEST(JSONParseObject) { | 20784 THREADED_TEST(JSONParseObject) { |
19275 LocalContext context; | 20785 LocalContext context; |
19276 HandleScope scope(context->GetIsolate()); | 20786 HandleScope scope(context->GetIsolate()); |
19277 Local<Value> obj = v8::JSON::Parse(v8_str("{\"x\":42}")); | 20787 Local<Value> obj = v8::JSON::Parse(v8_str("{\"x\":42}")); |
19278 Handle<Object> global = context->Global(); | 20788 Local<Object> global = context->Global(); |
19279 global->Set(v8_str("obj"), obj); | 20789 global->Set(v8_str("obj"), obj); |
19280 ExpectString("JSON.stringify(obj)", "{\"x\":42}"); | 20790 ExpectString("JSON.stringify(obj)", "{\"x\":42}"); |
19281 } | 20791 } |
19282 | 20792 |
19283 | 20793 |
19284 THREADED_TEST(JSONParseNumber) { | 20794 THREADED_TEST(JSONParseNumber) { |
19285 LocalContext context; | 20795 LocalContext context; |
19286 HandleScope scope(context->GetIsolate()); | 20796 HandleScope scope(context->GetIsolate()); |
19287 Local<Value> obj = v8::JSON::Parse(v8_str("42")); | 20797 Local<Value> obj = v8::JSON::Parse(v8_str("42")); |
19288 Handle<Object> global = context->Global(); | 20798 Local<Object> global = context->Global(); |
19289 global->Set(v8_str("obj"), obj); | 20799 global->Set(v8_str("obj"), obj); |
19290 ExpectString("JSON.stringify(obj)", "42"); | 20800 ExpectString("JSON.stringify(obj)", "42"); |
19291 } | 20801 } |
19292 | 20802 |
19293 | 20803 |
19294 #if V8_OS_POSIX && !V8_OS_NACL | 20804 #if V8_OS_POSIX && !V8_OS_NACL |
19295 class ThreadInterruptTest { | 20805 class ThreadInterruptTest { |
19296 public: | 20806 public: |
19297 ThreadInterruptTest() : sem_(0), sem_value_(0) { } | 20807 ThreadInterruptTest() : sem_(0), sem_value_(0) { } |
19298 ~ThreadInterruptTest() {} | 20808 ~ThreadInterruptTest() {} |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19360 } | 20870 } |
19361 | 20871 |
19362 | 20872 |
19363 TEST(JSONStringifyAccessCheck) { | 20873 TEST(JSONStringifyAccessCheck) { |
19364 v8::V8::Initialize(); | 20874 v8::V8::Initialize(); |
19365 v8::Isolate* isolate = CcTest::isolate(); | 20875 v8::Isolate* isolate = CcTest::isolate(); |
19366 v8::HandleScope scope(isolate); | 20876 v8::HandleScope scope(isolate); |
19367 | 20877 |
19368 // Create an ObjectTemplate for global objects and install access | 20878 // Create an ObjectTemplate for global objects and install access |
19369 // check callbacks that will block access. | 20879 // check callbacks that will block access. |
19370 v8::Handle<v8::ObjectTemplate> global_template = | 20880 v8::Local<v8::ObjectTemplate> global_template = |
19371 v8::ObjectTemplate::New(isolate); | 20881 v8::ObjectTemplate::New(isolate); |
19372 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 20882 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
19373 | 20883 |
19374 // Create a context and set an x property on it's global object. | 20884 // Create a context and set an x property on it's global object. |
19375 LocalContext context0(NULL, global_template); | 20885 LocalContext context0(NULL, global_template); |
19376 v8::Handle<v8::Object> global0 = context0->Global(); | 20886 v8::Local<v8::Object> global0 = context0->Global(); |
19377 global0->Set(v8_str("x"), v8_num(42)); | 20887 global0->Set(v8_str("x"), v8_num(42)); |
19378 ExpectString("JSON.stringify(this)", "{\"x\":42}"); | 20888 ExpectString("JSON.stringify(this)", "{\"x\":42}"); |
19379 | 20889 |
19380 for (int i = 0; i < 2; i++) { | 20890 for (int i = 0; i < 2; i++) { |
19381 if (i == 1) { | 20891 if (i == 1) { |
19382 // Install a toJSON function on the second run. | 20892 // Install a toJSON function on the second run. |
19383 v8::Handle<v8::FunctionTemplate> toJSON = | 20893 v8::Local<v8::FunctionTemplate> toJSON = |
19384 v8::FunctionTemplate::New(isolate, UnreachableCallback); | 20894 v8::FunctionTemplate::New(isolate, UnreachableCallback); |
19385 | 20895 |
19386 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); | 20896 global0->Set(v8_str("toJSON"), |
20897 toJSON->GetFunction(context0.local()).ToLocalChecked()); | |
19387 } | 20898 } |
19388 // Create a context with a different security token so that the | 20899 // Create a context with a different security token so that the |
19389 // failed access check callback will be called on each access. | 20900 // failed access check callback will be called on each access. |
19390 LocalContext context1(NULL, global_template); | 20901 LocalContext context1(NULL, global_template); |
19391 context1->Global()->Set(v8_str("other"), global0); | 20902 CHECK(context1->Global() |
20903 ->Set(context1.local(), v8_str("other"), global0) | |
20904 .FromJust()); | |
19392 | 20905 |
19393 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); | 20906 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); |
19394 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); | 20907 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); |
19395 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); | 20908 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); |
19396 } | 20909 } |
19397 } | 20910 } |
19398 | 20911 |
19399 | 20912 |
19400 bool access_check_fail_thrown = false; | 20913 bool access_check_fail_thrown = false; |
19401 bool catch_callback_called = false; | 20914 bool catch_callback_called = false; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19448 | 20961 |
19449 TEST(AccessCheckThrows) { | 20962 TEST(AccessCheckThrows) { |
19450 i::FLAG_allow_natives_syntax = true; | 20963 i::FLAG_allow_natives_syntax = true; |
19451 v8::V8::Initialize(); | 20964 v8::V8::Initialize(); |
19452 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); | 20965 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); |
19453 v8::Isolate* isolate = CcTest::isolate(); | 20966 v8::Isolate* isolate = CcTest::isolate(); |
19454 v8::HandleScope scope(isolate); | 20967 v8::HandleScope scope(isolate); |
19455 | 20968 |
19456 // Create an ObjectTemplate for global objects and install access | 20969 // Create an ObjectTemplate for global objects and install access |
19457 // check callbacks that will block access. | 20970 // check callbacks that will block access. |
19458 v8::Handle<v8::ObjectTemplate> global_template = | 20971 v8::Local<v8::ObjectTemplate> global_template = |
19459 v8::ObjectTemplate::New(isolate); | 20972 v8::ObjectTemplate::New(isolate); |
19460 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 20973 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
19461 | 20974 |
19462 // Create a context and set an x property on it's global object. | 20975 // Create a context and set an x property on it's global object. |
19463 LocalContext context0(NULL, global_template); | 20976 LocalContext context0(NULL, global_template); |
19464 v8::Handle<v8::Object> global0 = context0->Global(); | 20977 v8::Local<v8::Object> global0 = context0->Global(); |
19465 | 20978 |
19466 // Create a context with a different security token so that the | 20979 // Create a context with a different security token so that the |
19467 // failed access check callback will be called on each access. | 20980 // failed access check callback will be called on each access. |
19468 LocalContext context1(NULL, global_template); | 20981 LocalContext context1(NULL, global_template); |
19469 context1->Global()->Set(v8_str("other"), global0); | 20982 CHECK(context1->Global() |
20983 ->Set(context1.local(), v8_str("other"), global0) | |
20984 .FromJust()); | |
19470 | 20985 |
19471 v8::Handle<v8::FunctionTemplate> catcher_fun = | 20986 v8::Local<v8::FunctionTemplate> catcher_fun = |
19472 v8::FunctionTemplate::New(isolate, CatcherCallback); | 20987 v8::FunctionTemplate::New(isolate, CatcherCallback); |
19473 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction()); | 20988 CHECK(context1->Global() |
20989 ->Set(context1.local(), v8_str("catcher"), | |
20990 catcher_fun->GetFunction(context1.local()).ToLocalChecked()) | |
20991 .FromJust()); | |
19474 | 20992 |
19475 v8::Handle<v8::FunctionTemplate> has_own_property_fun = | 20993 v8::Local<v8::FunctionTemplate> has_own_property_fun = |
19476 v8::FunctionTemplate::New(isolate, HasOwnPropertyCallback); | 20994 v8::FunctionTemplate::New(isolate, HasOwnPropertyCallback); |
19477 context1->Global()->Set(v8_str("has_own_property"), | 20995 CHECK(context1->Global() |
19478 has_own_property_fun->GetFunction()); | 20996 ->Set(context1.local(), v8_str("has_own_property"), |
20997 has_own_property_fun->GetFunction(context1.local()) | |
20998 .ToLocalChecked()) | |
20999 .FromJust()); | |
19479 | 21000 |
19480 { | 21001 { |
19481 v8::TryCatch try_catch(isolate); | 21002 v8::TryCatch try_catch(isolate); |
19482 access_check_fail_thrown = false; | 21003 access_check_fail_thrown = false; |
19483 CompileRun("other.x;"); | 21004 CompileRun("other.x;"); |
19484 CHECK(access_check_fail_thrown); | 21005 CHECK(access_check_fail_thrown); |
19485 CHECK(try_catch.HasCaught()); | 21006 CHECK(try_catch.HasCaught()); |
19486 } | 21007 } |
19487 | 21008 |
19488 CheckCorrectThrow("other.x"); | 21009 CheckCorrectThrow("other.x"); |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19601 InterruptThread i_thread; | 21122 InterruptThread i_thread; |
19602 }; | 21123 }; |
19603 | 21124 |
19604 | 21125 |
19605 class RequestInterruptTestWithFunctionCall | 21126 class RequestInterruptTestWithFunctionCall |
19606 : public RequestInterruptTestBaseWithSimpleInterrupt { | 21127 : public RequestInterruptTestBaseWithSimpleInterrupt { |
19607 public: | 21128 public: |
19608 virtual void TestBody() { | 21129 virtual void TestBody() { |
19609 Local<Function> func = Function::New( | 21130 Local<Function> func = Function::New( |
19610 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); | 21131 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); |
19611 env_->Global()->Set(v8_str("ShouldContinue"), func); | 21132 CHECK(env_->Global() |
21133 ->Set(env_.local(), v8_str("ShouldContinue"), func) | |
21134 .FromJust()); | |
19612 | 21135 |
19613 CompileRun("while (ShouldContinue()) { }"); | 21136 CompileRun("while (ShouldContinue()) { }"); |
19614 } | 21137 } |
19615 }; | 21138 }; |
19616 | 21139 |
19617 | 21140 |
19618 class RequestInterruptTestWithMethodCall | 21141 class RequestInterruptTestWithMethodCall |
19619 : public RequestInterruptTestBaseWithSimpleInterrupt { | 21142 : public RequestInterruptTestBaseWithSimpleInterrupt { |
19620 public: | 21143 public: |
19621 virtual void TestBody() { | 21144 virtual void TestBody() { |
19622 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); | 21145 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); |
19623 v8::Local<v8::Template> proto = t->PrototypeTemplate(); | 21146 v8::Local<v8::Template> proto = t->PrototypeTemplate(); |
19624 proto->Set(v8_str("shouldContinue"), Function::New( | 21147 proto->Set(v8_str("shouldContinue"), Function::New( |
19625 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); | 21148 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); |
19626 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); | 21149 CHECK(env_->Global() |
21150 ->Set(env_.local(), v8_str("Klass"), | |
21151 t->GetFunction(env_.local()).ToLocalChecked()) | |
21152 .FromJust()); | |
19627 | 21153 |
19628 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); | 21154 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); |
19629 } | 21155 } |
19630 }; | 21156 }; |
19631 | 21157 |
19632 | 21158 |
19633 class RequestInterruptTestWithAccessor | 21159 class RequestInterruptTestWithAccessor |
19634 : public RequestInterruptTestBaseWithSimpleInterrupt { | 21160 : public RequestInterruptTestBaseWithSimpleInterrupt { |
19635 public: | 21161 public: |
19636 virtual void TestBody() { | 21162 virtual void TestBody() { |
19637 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); | 21163 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); |
19638 v8::Local<v8::Template> proto = t->PrototypeTemplate(); | 21164 v8::Local<v8::Template> proto = t->PrototypeTemplate(); |
19639 proto->SetAccessorProperty(v8_str("shouldContinue"), FunctionTemplate::New( | 21165 proto->SetAccessorProperty(v8_str("shouldContinue"), FunctionTemplate::New( |
19640 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); | 21166 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); |
19641 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); | 21167 CHECK(env_->Global() |
21168 ->Set(env_.local(), v8_str("Klass"), | |
21169 t->GetFunction(env_.local()).ToLocalChecked()) | |
21170 .FromJust()); | |
19642 | 21171 |
19643 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); | 21172 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); |
19644 } | 21173 } |
19645 }; | 21174 }; |
19646 | 21175 |
19647 | 21176 |
19648 class RequestInterruptTestWithNativeAccessor | 21177 class RequestInterruptTestWithNativeAccessor |
19649 : public RequestInterruptTestBaseWithSimpleInterrupt { | 21178 : public RequestInterruptTestBaseWithSimpleInterrupt { |
19650 public: | 21179 public: |
19651 virtual void TestBody() { | 21180 virtual void TestBody() { |
19652 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); | 21181 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); |
19653 t->InstanceTemplate()->SetNativeDataProperty( | 21182 t->InstanceTemplate()->SetNativeDataProperty( |
19654 v8_str("shouldContinue"), | 21183 v8_str("shouldContinue"), |
19655 &ShouldContinueNativeGetter, | 21184 &ShouldContinueNativeGetter, |
19656 NULL, | 21185 NULL, |
19657 v8::External::New(isolate_, this)); | 21186 v8::External::New(isolate_, this)); |
19658 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); | 21187 CHECK(env_->Global() |
21188 ->Set(env_.local(), v8_str("Klass"), | |
21189 t->GetFunction(env_.local()).ToLocalChecked()) | |
21190 .FromJust()); | |
19659 | 21191 |
19660 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); | 21192 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); |
19661 } | 21193 } |
19662 | 21194 |
19663 private: | 21195 private: |
19664 static void ShouldContinueNativeGetter( | 21196 static void ShouldContinueNativeGetter( |
19665 Local<String> property, | 21197 Local<String> property, |
19666 const v8::PropertyCallbackInfo<v8::Value>& info) { | 21198 const v8::PropertyCallbackInfo<v8::Value>& info) { |
19667 RequestInterruptTestBase* test = | 21199 RequestInterruptTestBase* test = |
19668 reinterpret_cast<RequestInterruptTestBase*>( | 21200 reinterpret_cast<RequestInterruptTestBase*>( |
19669 info.Data().As<v8::External>()->Value()); | 21201 info.Data().As<v8::External>()->Value()); |
19670 info.GetReturnValue().Set(test->ShouldContinue()); | 21202 info.GetReturnValue().Set(test->ShouldContinue()); |
19671 } | 21203 } |
19672 }; | 21204 }; |
19673 | 21205 |
19674 | 21206 |
19675 class RequestInterruptTestWithMethodCallAndInterceptor | 21207 class RequestInterruptTestWithMethodCallAndInterceptor |
19676 : public RequestInterruptTestBaseWithSimpleInterrupt { | 21208 : public RequestInterruptTestBaseWithSimpleInterrupt { |
19677 public: | 21209 public: |
19678 virtual void TestBody() { | 21210 virtual void TestBody() { |
19679 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); | 21211 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); |
19680 v8::Local<v8::Template> proto = t->PrototypeTemplate(); | 21212 v8::Local<v8::Template> proto = t->PrototypeTemplate(); |
19681 proto->Set(v8_str("shouldContinue"), Function::New( | 21213 proto->Set(v8_str("shouldContinue"), Function::New( |
19682 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); | 21214 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); |
19683 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); | 21215 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); |
19684 instance_template->SetHandler( | 21216 instance_template->SetHandler( |
19685 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor)); | 21217 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor)); |
19686 | 21218 |
19687 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); | 21219 CHECK(env_->Global() |
21220 ->Set(env_.local(), v8_str("Klass"), | |
21221 t->GetFunction(env_.local()).ToLocalChecked()) | |
21222 .FromJust()); | |
19688 | 21223 |
19689 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); | 21224 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); |
19690 } | 21225 } |
19691 | 21226 |
19692 private: | 21227 private: |
19693 static void EmptyInterceptor( | 21228 static void EmptyInterceptor( |
19694 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {} | 21229 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {} |
19695 }; | 21230 }; |
19696 | 21231 |
19697 | 21232 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19784 public: | 21319 public: |
19785 RequestMultipleInterrupts() : i_thread(this), counter_(0) {} | 21320 RequestMultipleInterrupts() : i_thread(this), counter_(0) {} |
19786 | 21321 |
19787 virtual void StartInterruptThread() { | 21322 virtual void StartInterruptThread() { |
19788 i_thread.Start(); | 21323 i_thread.Start(); |
19789 } | 21324 } |
19790 | 21325 |
19791 virtual void TestBody() { | 21326 virtual void TestBody() { |
19792 Local<Function> func = Function::New( | 21327 Local<Function> func = Function::New( |
19793 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); | 21328 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); |
19794 env_->Global()->Set(v8_str("ShouldContinue"), func); | 21329 CHECK(env_->Global() |
21330 ->Set(env_.local(), v8_str("ShouldContinue"), func) | |
21331 .FromJust()); | |
19795 | 21332 |
19796 CompileRun("while (ShouldContinue()) { }"); | 21333 CompileRun("while (ShouldContinue()) { }"); |
19797 } | 21334 } |
19798 | 21335 |
19799 private: | 21336 private: |
19800 class InterruptThread : public v8::base::Thread { | 21337 class InterruptThread : public v8::base::Thread { |
19801 public: | 21338 public: |
19802 enum { NUM_INTERRUPTS = 10 }; | 21339 enum { NUM_INTERRUPTS = 10 }; |
19803 explicit InterruptThread(RequestMultipleInterrupts* test) | 21340 explicit InterruptThread(RequestMultipleInterrupts* test) |
19804 : Thread(Options("RequestInterruptTest")), test_(test) {} | 21341 : Thread(Options("RequestInterruptTest")), test_(test) {} |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19855 } | 21392 } |
19856 | 21393 |
19857 | 21394 |
19858 THREADED_TEST(FunctionNew) { | 21395 THREADED_TEST(FunctionNew) { |
19859 LocalContext env; | 21396 LocalContext env; |
19860 v8::Isolate* isolate = env->GetIsolate(); | 21397 v8::Isolate* isolate = env->GetIsolate(); |
19861 v8::HandleScope scope(isolate); | 21398 v8::HandleScope scope(isolate); |
19862 Local<Object> data = v8::Object::New(isolate); | 21399 Local<Object> data = v8::Object::New(isolate); |
19863 function_new_expected_env = data; | 21400 function_new_expected_env = data; |
19864 Local<Function> func = Function::New(isolate, FunctionNewCallback, data); | 21401 Local<Function> func = Function::New(isolate, FunctionNewCallback, data); |
19865 env->Global()->Set(v8_str("func"), func); | 21402 CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust()); |
19866 Local<Value> result = CompileRun("func();"); | 21403 Local<Value> result = CompileRun("func();"); |
19867 CHECK(v8::Integer::New(isolate, 17)->Equals(result)); | 21404 CHECK(v8::Integer::New(isolate, 17)->Equals(result)); |
19868 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 21405 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
19869 // Verify function not cached | 21406 // Verify function not cached |
19870 auto serial_number = handle( | 21407 auto serial_number = handle( |
19871 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func)) | 21408 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func)) |
19872 ->shared() | 21409 ->shared() |
19873 ->get_api_func_data() | 21410 ->get_api_func_data() |
19874 ->serial_number()), | 21411 ->serial_number()), |
19875 i_isolate); | 21412 i_isolate); |
19876 auto cache = i_isolate->function_cache(); | 21413 auto cache = i_isolate->function_cache(); |
19877 CHECK(cache->Lookup(serial_number)->IsTheHole()); | 21414 CHECK(cache->Lookup(serial_number)->IsTheHole()); |
19878 // Verify that each Function::New creates a new function instance | 21415 // Verify that each Function::New creates a new function instance |
19879 Local<Object> data2 = v8::Object::New(isolate); | 21416 Local<Object> data2 = v8::Object::New(isolate); |
19880 function_new_expected_env = data2; | 21417 function_new_expected_env = data2; |
19881 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); | 21418 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); |
19882 CHECK(!func2->IsNull()); | 21419 CHECK(!func2->IsNull()); |
19883 CHECK(!func->Equals(func2)); | 21420 CHECK(!func->Equals(func2)); |
19884 env->Global()->Set(v8_str("func2"), func2); | 21421 CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust()); |
19885 Local<Value> result2 = CompileRun("func2();"); | 21422 Local<Value> result2 = CompileRun("func2();"); |
19886 CHECK(v8::Integer::New(isolate, 17)->Equals(result2)); | 21423 CHECK(v8::Integer::New(isolate, 17)->Equals(result2)); |
19887 } | 21424 } |
19888 | 21425 |
19889 | 21426 |
19890 TEST(EscapeableHandleScope) { | 21427 TEST(EscapeableHandleScope) { |
19891 HandleScope outer_scope(CcTest::isolate()); | 21428 HandleScope outer_scope(CcTest::isolate()); |
19892 LocalContext context; | 21429 LocalContext context; |
19893 const int runs = 10; | 21430 const int runs = 10; |
19894 Local<String> values[runs]; | 21431 Local<String> values[runs]; |
(...skipping 19 matching lines...) Expand all Loading... | |
19914 CHECK(info.Holder() != info.This()); | 21451 CHECK(info.Holder() != info.This()); |
19915 } | 21452 } |
19916 | 21453 |
19917 | 21454 |
19918 TEST(Regress239669) { | 21455 TEST(Regress239669) { |
19919 LocalContext context; | 21456 LocalContext context; |
19920 v8::Isolate* isolate = context->GetIsolate(); | 21457 v8::Isolate* isolate = context->GetIsolate(); |
19921 v8::HandleScope scope(isolate); | 21458 v8::HandleScope scope(isolate); |
19922 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); | 21459 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); |
19923 templ->SetAccessor(v8_str("x"), 0, SetterWhichExpectsThisAndHolderToDiffer); | 21460 templ->SetAccessor(v8_str("x"), 0, SetterWhichExpectsThisAndHolderToDiffer); |
19924 context->Global()->Set(v8_str("P"), templ->NewInstance()); | 21461 CHECK(context->Global() |
21462 ->Set(context.local(), v8_str("P"), | |
21463 templ->NewInstance(context.local()).ToLocalChecked()) | |
21464 .FromJust()); | |
19925 CompileRun( | 21465 CompileRun( |
19926 "function C1() {" | 21466 "function C1() {" |
19927 " this.x = 23;" | 21467 " this.x = 23;" |
19928 "};" | 21468 "};" |
19929 "C1.prototype = P;" | 21469 "C1.prototype = P;" |
19930 "for (var i = 0; i < 4; i++ ) {" | 21470 "for (var i = 0; i < 4; i++ ) {" |
19931 " new C1();" | 21471 " new C1();" |
19932 "}"); | 21472 "}"); |
19933 } | 21473 } |
19934 | 21474 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
19998 signature = v8::Signature::New(isolate, parent_template); | 21538 signature = v8::Signature::New(isolate, parent_template); |
19999 break; | 21539 break; |
20000 } | 21540 } |
20001 signature_template = function_template->InstanceTemplate(); | 21541 signature_template = function_template->InstanceTemplate(); |
20002 } | 21542 } |
20003 // Global object must pass checks. | 21543 // Global object must pass checks. |
20004 Local<v8::Context> context = | 21544 Local<v8::Context> context = |
20005 v8::Context::New(isolate, NULL, signature_template); | 21545 v8::Context::New(isolate, NULL, signature_template); |
20006 v8::Context::Scope context_scope(context); | 21546 v8::Context::Scope context_scope(context); |
20007 // Install regular object that can pass signature checks. | 21547 // Install regular object that can pass signature checks. |
20008 Local<Object> function_receiver = signature_template->NewInstance(); | 21548 Local<Object> function_receiver = |
20009 context->Global()->Set(v8_str("function_receiver"), function_receiver); | 21549 signature_template->NewInstance(context).ToLocalChecked(); |
21550 CHECK(context->Global() | |
21551 ->Set(context, v8_str("function_receiver"), function_receiver) | |
21552 .FromJust()); | |
20010 // Get the holder objects. | 21553 // Get the holder objects. |
20011 Local<Object> inner_global = | 21554 Local<Object> inner_global = |
20012 Local<Object>::Cast(context->Global()->GetPrototype()); | 21555 Local<Object>::Cast(context->Global()->GetPrototype()); |
20013 // Install functions on hidden prototype object if there is one. | 21556 // Install functions on hidden prototype object if there is one. |
20014 data = Object::New(isolate); | 21557 data = Object::New(isolate); |
20015 Local<FunctionTemplate> function_template = FunctionTemplate::New( | 21558 Local<FunctionTemplate> function_template = FunctionTemplate::New( |
20016 isolate, OptimizationCallback, data, signature); | 21559 isolate, OptimizationCallback, data, signature); |
20017 Local<Function> function = function_template->GetFunction(); | 21560 Local<Function> function = |
21561 function_template->GetFunction(context).ToLocalChecked(); | |
20018 Local<Object> global_holder = inner_global; | 21562 Local<Object> global_holder = inner_global; |
20019 Local<Object> function_holder = function_receiver; | 21563 Local<Object> function_holder = function_receiver; |
20020 if (signature_type == kSignatureOnPrototype) { | 21564 if (signature_type == kSignatureOnPrototype) { |
20021 function_holder = Local<Object>::Cast(function_holder->GetPrototype()); | 21565 function_holder = Local<Object>::Cast(function_holder->GetPrototype()); |
20022 global_holder = Local<Object>::Cast(global_holder->GetPrototype()); | 21566 global_holder = Local<Object>::Cast(global_holder->GetPrototype()); |
20023 } | 21567 } |
20024 global_holder->Set(v8_str("g_f"), function); | 21568 global_holder->Set(v8_str("g_f"), function); |
20025 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function); | 21569 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function); |
20026 function_holder->Set(v8_str("f"), function); | 21570 function_holder->Set(v8_str("f"), function); |
20027 function_holder->SetAccessorProperty(v8_str("acc"), function, function); | 21571 function_holder->SetAccessorProperty(v8_str("acc"), function, function); |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20115 ApiCallOptimizationChecker checker; | 21659 ApiCallOptimizationChecker checker; |
20116 checker.RunAll(); | 21660 checker.RunAll(); |
20117 } | 21661 } |
20118 | 21662 |
20119 | 21663 |
20120 TEST(FunctionCallOptimizationMultipleArgs) { | 21664 TEST(FunctionCallOptimizationMultipleArgs) { |
20121 i::FLAG_allow_natives_syntax = true; | 21665 i::FLAG_allow_natives_syntax = true; |
20122 LocalContext context; | 21666 LocalContext context; |
20123 v8::Isolate* isolate = context->GetIsolate(); | 21667 v8::Isolate* isolate = context->GetIsolate(); |
20124 v8::HandleScope scope(isolate); | 21668 v8::HandleScope scope(isolate); |
20125 Handle<Object> global = context->Global(); | 21669 Local<Object> global = context->Global(); |
20126 Local<v8::Function> function = Function::New(isolate, Returns42); | 21670 Local<v8::Function> function = Function::New(isolate, Returns42); |
20127 global->Set(v8_str("x"), function); | 21671 global->Set(v8_str("x"), function); |
20128 CompileRun( | 21672 CompileRun( |
20129 "function x_wrap() {\n" | 21673 "function x_wrap() {\n" |
20130 " for (var i = 0; i < 5; i++) {\n" | 21674 " for (var i = 0; i < 5; i++) {\n" |
20131 " x(1,2,3);\n" | 21675 " x(1,2,3);\n" |
20132 " }\n" | 21676 " }\n" |
20133 "}\n" | 21677 "}\n" |
20134 "x_wrap();\n" | 21678 "x_wrap();\n" |
20135 "%OptimizeFunctionOnNextCall(x_wrap);" | 21679 "%OptimizeFunctionOnNextCall(x_wrap);" |
20136 "x_wrap();\n"); | 21680 "x_wrap();\n"); |
20137 } | 21681 } |
20138 | 21682 |
20139 | 21683 |
20140 static void ReturnsSymbolCallback( | 21684 static void ReturnsSymbolCallback( |
20141 const v8::FunctionCallbackInfo<v8::Value>& info) { | 21685 const v8::FunctionCallbackInfo<v8::Value>& info) { |
20142 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate())); | 21686 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate())); |
20143 } | 21687 } |
20144 | 21688 |
20145 | 21689 |
20146 TEST(ApiCallbackCanReturnSymbols) { | 21690 TEST(ApiCallbackCanReturnSymbols) { |
20147 i::FLAG_allow_natives_syntax = true; | 21691 i::FLAG_allow_natives_syntax = true; |
20148 LocalContext context; | 21692 LocalContext context; |
20149 v8::Isolate* isolate = context->GetIsolate(); | 21693 v8::Isolate* isolate = context->GetIsolate(); |
20150 v8::HandleScope scope(isolate); | 21694 v8::HandleScope scope(isolate); |
20151 Handle<Object> global = context->Global(); | 21695 Local<Object> global = context->Global(); |
20152 Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback); | 21696 Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback); |
20153 global->Set(v8_str("x"), function); | 21697 global->Set(v8_str("x"), function); |
20154 CompileRun( | 21698 CompileRun( |
20155 "function x_wrap() {\n" | 21699 "function x_wrap() {\n" |
20156 " for (var i = 0; i < 5; i++) {\n" | 21700 " for (var i = 0; i < 5; i++) {\n" |
20157 " x();\n" | 21701 " x();\n" |
20158 " }\n" | 21702 " }\n" |
20159 "}\n" | 21703 "}\n" |
20160 "x_wrap();\n" | 21704 "x_wrap();\n" |
20161 "%OptimizeFunctionOnNextCall(x_wrap);" | 21705 "%OptimizeFunctionOnNextCall(x_wrap);" |
20162 "x_wrap();\n"); | 21706 "x_wrap();\n"); |
20163 } | 21707 } |
20164 | 21708 |
20165 | 21709 |
20166 TEST(EmptyApiCallback) { | 21710 TEST(EmptyApiCallback) { |
20167 LocalContext context; | 21711 LocalContext context; |
20168 auto isolate = context->GetIsolate(); | 21712 auto isolate = context->GetIsolate(); |
20169 v8::HandleScope scope(isolate); | 21713 v8::HandleScope scope(isolate); |
20170 auto global = context->Global(); | 21714 auto global = context->Global(); |
20171 auto function = FunctionTemplate::New(isolate)->GetFunction(); | 21715 auto function = FunctionTemplate::New(isolate) |
21716 ->GetFunction(context.local()) | |
21717 .ToLocalChecked(); | |
20172 global->Set(v8_str("x"), function); | 21718 global->Set(v8_str("x"), function); |
20173 | 21719 |
20174 auto result = CompileRun("x()"); | 21720 auto result = CompileRun("x()"); |
20175 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); | 21721 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); |
20176 | 21722 |
20177 result = CompileRun("x(1,2,3)"); | 21723 result = CompileRun("x(1,2,3)"); |
20178 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); | 21724 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); |
20179 | 21725 |
20180 result = CompileRun("7 + x.call(3) + 11"); | 21726 result = CompileRun("7 + x.call(3) + 11"); |
20181 CHECK(result->IsInt32()); | 21727 CHECK(result->IsInt32()); |
20182 CHECK_EQ(21, result->Int32Value()); | 21728 CHECK_EQ(21, result->Int32Value(context.local()).FromJust()); |
20183 | 21729 |
20184 result = CompileRun("7 + x.call(3, 101, 102, 103, 104) + 11"); | 21730 result = CompileRun("7 + x.call(3, 101, 102, 103, 104) + 11"); |
20185 CHECK(result->IsInt32()); | 21731 CHECK(result->IsInt32()); |
20186 CHECK_EQ(21, result->Int32Value()); | 21732 CHECK_EQ(21, result->Int32Value(context.local()).FromJust()); |
20187 | 21733 |
20188 result = CompileRun("var y = []; x.call(y)"); | 21734 result = CompileRun("var y = []; x.call(y)"); |
20189 CHECK(result->IsArray()); | 21735 CHECK(result->IsArray()); |
20190 | 21736 |
20191 result = CompileRun("x.call(y, 1, 2, 3, 4)"); | 21737 result = CompileRun("x.call(y, 1, 2, 3, 4)"); |
20192 CHECK(result->IsArray()); | 21738 CHECK(result->IsArray()); |
20193 } | 21739 } |
20194 | 21740 |
20195 | 21741 |
20196 TEST(SimpleSignatureCheck) { | 21742 TEST(SimpleSignatureCheck) { |
20197 LocalContext context; | 21743 LocalContext context; |
20198 auto isolate = context->GetIsolate(); | 21744 auto isolate = context->GetIsolate(); |
20199 v8::HandleScope scope(isolate); | 21745 v8::HandleScope scope(isolate); |
20200 auto global = context->Global(); | 21746 auto global = context->Global(); |
20201 auto sig_obj = FunctionTemplate::New(isolate); | 21747 auto sig_obj = FunctionTemplate::New(isolate); |
20202 auto sig = v8::Signature::New(isolate, sig_obj); | 21748 auto sig = v8::Signature::New(isolate, sig_obj); |
20203 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); | 21749 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); |
20204 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); | 21750 global->Set(v8_str("sig_obj"), |
20205 global->Set(v8_str("x"), x->GetFunction()); | 21751 sig_obj->GetFunction(context.local()).ToLocalChecked()); |
21752 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); | |
20206 CompileRun("var s = new sig_obj();"); | 21753 CompileRun("var s = new sig_obj();"); |
20207 { | 21754 { |
20208 TryCatch try_catch(isolate); | 21755 TryCatch try_catch(isolate); |
20209 CompileRun("x()"); | 21756 CompileRun("x()"); |
20210 CHECK(try_catch.HasCaught()); | 21757 CHECK(try_catch.HasCaught()); |
20211 } | 21758 } |
20212 { | 21759 { |
20213 TryCatch try_catch(isolate); | 21760 TryCatch try_catch(isolate); |
20214 CompileRun("x.call(1)"); | 21761 CompileRun("x.call(1)"); |
20215 CHECK(try_catch.HasCaught()); | 21762 CHECK(try_catch.HasCaught()); |
20216 } | 21763 } |
20217 { | 21764 { |
20218 TryCatch try_catch(isolate); | 21765 TryCatch try_catch(isolate); |
20219 auto result = CompileRun("s.x = x; s.x()"); | 21766 auto result = CompileRun("s.x = x; s.x()"); |
20220 CHECK(!try_catch.HasCaught()); | 21767 CHECK(!try_catch.HasCaught()); |
20221 CHECK_EQ(42, result->Int32Value()); | 21768 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20222 } | 21769 } |
20223 { | 21770 { |
20224 TryCatch try_catch(isolate); | 21771 TryCatch try_catch(isolate); |
20225 auto result = CompileRun("x.call(s)"); | 21772 auto result = CompileRun("x.call(s)"); |
20226 CHECK(!try_catch.HasCaught()); | 21773 CHECK(!try_catch.HasCaught()); |
20227 CHECK_EQ(42, result->Int32Value()); | 21774 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20228 } | 21775 } |
20229 } | 21776 } |
20230 | 21777 |
20231 | 21778 |
20232 TEST(ChainSignatureCheck) { | 21779 TEST(ChainSignatureCheck) { |
20233 LocalContext context; | 21780 LocalContext context; |
20234 auto isolate = context->GetIsolate(); | 21781 auto isolate = context->GetIsolate(); |
20235 v8::HandleScope scope(isolate); | 21782 v8::HandleScope scope(isolate); |
20236 auto global = context->Global(); | 21783 auto global = context->Global(); |
20237 auto sig_obj = FunctionTemplate::New(isolate); | 21784 auto sig_obj = FunctionTemplate::New(isolate); |
20238 auto sig = v8::Signature::New(isolate, sig_obj); | 21785 auto sig = v8::Signature::New(isolate, sig_obj); |
20239 for (int i = 0; i < 4; ++i) { | 21786 for (int i = 0; i < 4; ++i) { |
20240 auto temp = FunctionTemplate::New(isolate); | 21787 auto temp = FunctionTemplate::New(isolate); |
20241 temp->Inherit(sig_obj); | 21788 temp->Inherit(sig_obj); |
20242 sig_obj = temp; | 21789 sig_obj = temp; |
20243 } | 21790 } |
20244 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); | 21791 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); |
20245 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); | 21792 global->Set(v8_str("sig_obj"), |
20246 global->Set(v8_str("x"), x->GetFunction()); | 21793 sig_obj->GetFunction(context.local()).ToLocalChecked()); |
21794 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); | |
20247 CompileRun("var s = new sig_obj();"); | 21795 CompileRun("var s = new sig_obj();"); |
20248 { | 21796 { |
20249 TryCatch try_catch(isolate); | 21797 TryCatch try_catch(isolate); |
20250 CompileRun("x()"); | 21798 CompileRun("x()"); |
20251 CHECK(try_catch.HasCaught()); | 21799 CHECK(try_catch.HasCaught()); |
20252 } | 21800 } |
20253 { | 21801 { |
20254 TryCatch try_catch(isolate); | 21802 TryCatch try_catch(isolate); |
20255 CompileRun("x.call(1)"); | 21803 CompileRun("x.call(1)"); |
20256 CHECK(try_catch.HasCaught()); | 21804 CHECK(try_catch.HasCaught()); |
20257 } | 21805 } |
20258 { | 21806 { |
20259 TryCatch try_catch(isolate); | 21807 TryCatch try_catch(isolate); |
20260 auto result = CompileRun("s.x = x; s.x()"); | 21808 auto result = CompileRun("s.x = x; s.x()"); |
20261 CHECK(!try_catch.HasCaught()); | 21809 CHECK(!try_catch.HasCaught()); |
20262 CHECK_EQ(42, result->Int32Value()); | 21810 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20263 } | 21811 } |
20264 { | 21812 { |
20265 TryCatch try_catch(isolate); | 21813 TryCatch try_catch(isolate); |
20266 auto result = CompileRun("x.call(s)"); | 21814 auto result = CompileRun("x.call(s)"); |
20267 CHECK(!try_catch.HasCaught()); | 21815 CHECK(!try_catch.HasCaught()); |
20268 CHECK_EQ(42, result->Int32Value()); | 21816 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20269 } | 21817 } |
20270 } | 21818 } |
20271 | 21819 |
20272 | 21820 |
20273 TEST(PrototypeSignatureCheck) { | 21821 TEST(PrototypeSignatureCheck) { |
20274 LocalContext context; | 21822 LocalContext context; |
20275 auto isolate = context->GetIsolate(); | 21823 auto isolate = context->GetIsolate(); |
20276 v8::HandleScope scope(isolate); | 21824 v8::HandleScope scope(isolate); |
20277 auto global = context->Global(); | 21825 auto global = context->Global(); |
20278 auto sig_obj = FunctionTemplate::New(isolate); | 21826 auto sig_obj = FunctionTemplate::New(isolate); |
20279 sig_obj->SetHiddenPrototype(true); | 21827 sig_obj->SetHiddenPrototype(true); |
20280 auto sig = v8::Signature::New(isolate, sig_obj); | 21828 auto sig = v8::Signature::New(isolate, sig_obj); |
20281 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); | 21829 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig); |
20282 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); | 21830 global->Set(v8_str("sig_obj"), |
20283 global->Set(v8_str("x"), x->GetFunction()); | 21831 sig_obj->GetFunction(context.local()).ToLocalChecked()); |
21832 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked()); | |
20284 CompileRun("s = {}; s.__proto__ = new sig_obj();"); | 21833 CompileRun("s = {}; s.__proto__ = new sig_obj();"); |
20285 { | 21834 { |
20286 TryCatch try_catch(isolate); | 21835 TryCatch try_catch(isolate); |
20287 CompileRun("x()"); | 21836 CompileRun("x()"); |
20288 CHECK(try_catch.HasCaught()); | 21837 CHECK(try_catch.HasCaught()); |
20289 } | 21838 } |
20290 { | 21839 { |
20291 TryCatch try_catch(isolate); | 21840 TryCatch try_catch(isolate); |
20292 CompileRun("x.call(1)"); | 21841 CompileRun("x.call(1)"); |
20293 CHECK(try_catch.HasCaught()); | 21842 CHECK(try_catch.HasCaught()); |
20294 } | 21843 } |
20295 { | 21844 { |
20296 TryCatch try_catch(isolate); | 21845 TryCatch try_catch(isolate); |
20297 auto result = CompileRun("s.x = x; s.x()"); | 21846 auto result = CompileRun("s.x = x; s.x()"); |
20298 CHECK(!try_catch.HasCaught()); | 21847 CHECK(!try_catch.HasCaught()); |
20299 CHECK_EQ(42, result->Int32Value()); | 21848 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20300 } | 21849 } |
20301 { | 21850 { |
20302 TryCatch try_catch(isolate); | 21851 TryCatch try_catch(isolate); |
20303 auto result = CompileRun("x.call(s)"); | 21852 auto result = CompileRun("x.call(s)"); |
20304 CHECK(!try_catch.HasCaught()); | 21853 CHECK(!try_catch.HasCaught()); |
20305 CHECK_EQ(42, result->Int32Value()); | 21854 CHECK_EQ(42, result->Int32Value(context.local()).FromJust()); |
20306 } | 21855 } |
20307 } | 21856 } |
20308 | 21857 |
20309 | 21858 |
20310 static const char* last_event_message; | 21859 static const char* last_event_message; |
20311 static int last_event_status; | 21860 static int last_event_status; |
20312 void StoringEventLoggerCallback(const char* message, int status) { | 21861 void StoringEventLoggerCallback(const char* message, int status) { |
20313 last_event_message = message; | 21862 last_event_message = message; |
20314 last_event_status = status; | 21863 last_event_status = status; |
20315 } | 21864 } |
(...skipping 11 matching lines...) Expand all Loading... | |
20327 histogramTimer.Stop(); | 21876 histogramTimer.Stop(); |
20328 CHECK_EQ(0, strcmp("V8.Test", last_event_message)); | 21877 CHECK_EQ(0, strcmp("V8.Test", last_event_message)); |
20329 CHECK_EQ(1, last_event_status); | 21878 CHECK_EQ(1, last_event_status); |
20330 } | 21879 } |
20331 | 21880 |
20332 | 21881 |
20333 TEST(Promises) { | 21882 TEST(Promises) { |
20334 LocalContext context; | 21883 LocalContext context; |
20335 v8::Isolate* isolate = context->GetIsolate(); | 21884 v8::Isolate* isolate = context->GetIsolate(); |
20336 v8::HandleScope scope(isolate); | 21885 v8::HandleScope scope(isolate); |
20337 Handle<Object> global = context->Global(); | 21886 Local<Object> global = context->Global(); |
20338 | 21887 |
20339 // Creation. | 21888 // Creation. |
20340 Handle<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); | 21889 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); |
20341 Handle<v8::Promise::Resolver> rr = v8::Promise::Resolver::New(isolate); | 21890 Local<v8::Promise::Resolver> rr = v8::Promise::Resolver::New(isolate); |
20342 Handle<v8::Promise> p = pr->GetPromise(); | 21891 Local<v8::Promise> p = pr->GetPromise(); |
20343 Handle<v8::Promise> r = rr->GetPromise(); | 21892 Local<v8::Promise> r = rr->GetPromise(); |
20344 CHECK_EQ(isolate, p->GetIsolate()); | 21893 CHECK_EQ(isolate, p->GetIsolate()); |
20345 | 21894 |
20346 // IsPromise predicate. | 21895 // IsPromise predicate. |
20347 CHECK(p->IsPromise()); | 21896 CHECK(p->IsPromise()); |
20348 CHECK(r->IsPromise()); | 21897 CHECK(r->IsPromise()); |
20349 Handle<Value> o = v8::Object::New(isolate); | 21898 Local<Value> o = v8::Object::New(isolate); |
20350 CHECK(!o->IsPromise()); | 21899 CHECK(!o->IsPromise()); |
20351 | 21900 |
20352 // Resolution and rejection. | 21901 // Resolution and rejection. |
20353 pr->Resolve(v8::Integer::New(isolate, 1)); | 21902 pr->Resolve(v8::Integer::New(isolate, 1)); |
20354 CHECK(p->IsPromise()); | 21903 CHECK(p->IsPromise()); |
20355 rr->Reject(v8::Integer::New(isolate, 2)); | 21904 rr->Reject(v8::Integer::New(isolate, 2)); |
20356 CHECK(r->IsPromise()); | 21905 CHECK(r->IsPromise()); |
20357 | 21906 |
20358 // Chaining non-pending promises. | 21907 // Chaining non-pending promises. |
20359 CompileRun( | 21908 CompileRun( |
20360 "var x1 = 0;\n" | 21909 "var x1 = 0;\n" |
20361 "var x2 = 0;\n" | 21910 "var x2 = 0;\n" |
20362 "function f1(x) { x1 = x; return x+1 };\n" | 21911 "function f1(x) { x1 = x; return x+1 };\n" |
20363 "function f2(x) { x2 = x; return x+1 };\n"); | 21912 "function f2(x) { x2 = x; return x+1 };\n"); |
20364 Handle<Function> f1 = Handle<Function>::Cast(global->Get(v8_str("f1"))); | 21913 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1"))); |
20365 Handle<Function> f2 = Handle<Function>::Cast(global->Get(v8_str("f2"))); | 21914 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2"))); |
20366 | 21915 |
20367 p->Chain(f1); | 21916 p->Chain(f1); |
20368 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 21917 CHECK_EQ(0, |
21918 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); | |
20369 isolate->RunMicrotasks(); | 21919 isolate->RunMicrotasks(); |
20370 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); | 21920 CHECK_EQ(1, |
21921 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); | |
20371 | 21922 |
20372 p->Catch(f2); | 21923 p->Catch(f2); |
20373 isolate->RunMicrotasks(); | 21924 isolate->RunMicrotasks(); |
20374 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21925 CHECK_EQ(0, |
21926 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20375 | 21927 |
20376 r->Catch(f2); | 21928 r->Catch(f2); |
20377 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21929 CHECK_EQ(0, |
21930 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20378 isolate->RunMicrotasks(); | 21931 isolate->RunMicrotasks(); |
20379 CHECK_EQ(2, global->Get(v8_str("x2"))->Int32Value()); | 21932 CHECK_EQ(2, |
21933 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20380 | 21934 |
20381 r->Chain(f1); | 21935 r->Chain(f1); |
20382 isolate->RunMicrotasks(); | 21936 isolate->RunMicrotasks(); |
20383 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); | 21937 CHECK_EQ(1, |
21938 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); | |
20384 | 21939 |
20385 // Chaining pending promises. | 21940 // Chaining pending promises. |
20386 CompileRun("x1 = x2 = 0;"); | 21941 CompileRun("x1 = x2 = 0;"); |
20387 pr = v8::Promise::Resolver::New(isolate); | 21942 pr = v8::Promise::Resolver::New(isolate); |
20388 rr = v8::Promise::Resolver::New(isolate); | 21943 rr = v8::Promise::Resolver::New(isolate); |
20389 | 21944 |
20390 pr->GetPromise()->Chain(f1); | 21945 pr->GetPromise()->Chain(f1); |
20391 rr->GetPromise()->Catch(f2); | 21946 rr->GetPromise()->Catch(f2); |
20392 isolate->RunMicrotasks(); | 21947 isolate->RunMicrotasks(); |
20393 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 21948 CHECK_EQ(0, |
20394 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21949 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21950 CHECK_EQ(0, | |
21951 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20395 | 21952 |
20396 pr->Resolve(v8::Integer::New(isolate, 1)); | 21953 pr->Resolve(v8::Integer::New(isolate, 1)); |
20397 rr->Reject(v8::Integer::New(isolate, 2)); | 21954 rr->Reject(v8::Integer::New(isolate, 2)); |
20398 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 21955 CHECK_EQ(0, |
20399 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21956 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21957 CHECK_EQ(0, | |
21958 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20400 | 21959 |
20401 isolate->RunMicrotasks(); | 21960 isolate->RunMicrotasks(); |
20402 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); | 21961 CHECK_EQ(1, |
20403 CHECK_EQ(2, global->Get(v8_str("x2"))->Int32Value()); | 21962 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21963 CHECK_EQ(2, | |
21964 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20404 | 21965 |
20405 // Multi-chaining. | 21966 // Multi-chaining. |
20406 CompileRun("x1 = x2 = 0;"); | 21967 CompileRun("x1 = x2 = 0;"); |
20407 pr = v8::Promise::Resolver::New(isolate); | 21968 pr = v8::Promise::Resolver::New(isolate); |
20408 pr->GetPromise()->Chain(f1)->Chain(f2); | 21969 pr->GetPromise()->Chain(f1)->Chain(f2); |
20409 pr->Resolve(v8::Integer::New(isolate, 3)); | 21970 pr->Resolve(v8::Integer::New(isolate, 3)); |
20410 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 21971 CHECK_EQ(0, |
20411 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21972 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21973 CHECK_EQ(0, | |
21974 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20412 isolate->RunMicrotasks(); | 21975 isolate->RunMicrotasks(); |
20413 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); | 21976 CHECK_EQ(3, |
20414 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); | 21977 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21978 CHECK_EQ(4, | |
21979 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20415 | 21980 |
20416 CompileRun("x1 = x2 = 0;"); | 21981 CompileRun("x1 = x2 = 0;"); |
20417 rr = v8::Promise::Resolver::New(isolate); | 21982 rr = v8::Promise::Resolver::New(isolate); |
20418 rr->GetPromise()->Catch(f1)->Chain(f2); | 21983 rr->GetPromise()->Catch(f1)->Chain(f2); |
20419 rr->Reject(v8::Integer::New(isolate, 3)); | 21984 rr->Reject(v8::Integer::New(isolate, 3)); |
20420 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 21985 CHECK_EQ(0, |
20421 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 21986 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21987 CHECK_EQ(0, | |
21988 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20422 isolate->RunMicrotasks(); | 21989 isolate->RunMicrotasks(); |
20423 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); | 21990 CHECK_EQ(3, |
20424 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); | 21991 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
21992 CHECK_EQ(4, | |
21993 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20425 } | 21994 } |
20426 | 21995 |
20427 | 21996 |
20428 TEST(PromiseThen) { | 21997 TEST(PromiseThen) { |
20429 LocalContext context; | 21998 LocalContext context; |
20430 v8::Isolate* isolate = context->GetIsolate(); | 21999 v8::Isolate* isolate = context->GetIsolate(); |
20431 v8::HandleScope scope(isolate); | 22000 v8::HandleScope scope(isolate); |
20432 Handle<Object> global = context->Global(); | 22001 Local<Object> global = context->Global(); |
20433 | 22002 |
20434 // Creation. | 22003 // Creation. |
20435 Handle<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); | 22004 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); |
20436 Handle<v8::Promise::Resolver> qr = v8::Promise::Resolver::New(isolate); | 22005 Local<v8::Promise::Resolver> qr = v8::Promise::Resolver::New(isolate); |
20437 Handle<v8::Promise> p = pr->GetPromise(); | 22006 Local<v8::Promise> p = pr->GetPromise(); |
20438 Handle<v8::Promise> q = qr->GetPromise(); | 22007 Local<v8::Promise> q = qr->GetPromise(); |
20439 | 22008 |
20440 CHECK(p->IsPromise()); | 22009 CHECK(p->IsPromise()); |
20441 CHECK(q->IsPromise()); | 22010 CHECK(q->IsPromise()); |
20442 | 22011 |
20443 pr->Resolve(v8::Integer::New(isolate, 1)); | 22012 pr->Resolve(v8::Integer::New(isolate, 1)); |
20444 qr->Resolve(p); | 22013 qr->Resolve(p); |
20445 | 22014 |
20446 // Chaining non-pending promises. | 22015 // Chaining non-pending promises. |
20447 CompileRun( | 22016 CompileRun( |
20448 "var x1 = 0;\n" | 22017 "var x1 = 0;\n" |
20449 "var x2 = 0;\n" | 22018 "var x2 = 0;\n" |
20450 "function f1(x) { x1 = x; return x+1 };\n" | 22019 "function f1(x) { x1 = x; return x+1 };\n" |
20451 "function f2(x) { x2 = x; return x+1 };\n"); | 22020 "function f2(x) { x2 = x; return x+1 };\n"); |
20452 Handle<Function> f1 = Handle<Function>::Cast(global->Get(v8_str("f1"))); | 22021 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1"))); |
20453 Handle<Function> f2 = Handle<Function>::Cast(global->Get(v8_str("f2"))); | 22022 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2"))); |
20454 | 22023 |
20455 // TODO(caitp): remove tests once PromiseChain is removed, per bug 3237 | 22024 // TODO(caitp): remove tests once PromiseChain is removed, per bug 3237 |
20456 /* q->Chain(f1); | 22025 /* q->Chain(f1); |
20457 CHECK(global->Get(v8_str2("x1"))->IsNumber()); | 22026 CHECK(global->Get(v8_str2("x1"))->IsNumber()); |
20458 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 22027 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); |
20459 isolate->RunMicrotasks(); | 22028 isolate->RunMicrotasks(); |
20460 CHECK(!global->Get(v8_str("x1"))->IsNumber()); | 22029 CHECK(!global->Get(v8_str("x1"))->IsNumber()); |
20461 CHECK(p->Equals(global->Get(v8_str("x1")))); */ | 22030 CHECK(p->Equals(global->Get(v8_str("x1")))); */ |
20462 | 22031 |
20463 // Then | 22032 // Then |
20464 CompileRun("x1 = x2 = 0;"); | 22033 CompileRun("x1 = x2 = 0;"); |
20465 q->Then(f1); | 22034 q->Then(f1); |
20466 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 22035 CHECK_EQ(0, |
22036 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); | |
20467 isolate->RunMicrotasks(); | 22037 isolate->RunMicrotasks(); |
20468 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); | 22038 CHECK_EQ(1, |
22039 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); | |
20469 | 22040 |
20470 // Then | 22041 // Then |
20471 CompileRun("x1 = x2 = 0;"); | 22042 CompileRun("x1 = x2 = 0;"); |
20472 pr = v8::Promise::Resolver::New(isolate); | 22043 pr = v8::Promise::Resolver::New(isolate); |
20473 qr = v8::Promise::Resolver::New(isolate); | 22044 qr = v8::Promise::Resolver::New(isolate); |
20474 | 22045 |
20475 qr->Resolve(pr); | 22046 qr->Resolve(pr); |
20476 qr->GetPromise()->Then(f1)->Then(f2); | 22047 qr->GetPromise()->Then(f1)->Then(f2); |
20477 | 22048 |
20478 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 22049 CHECK_EQ(0, |
20479 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 22050 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
22051 CHECK_EQ(0, | |
22052 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20480 isolate->RunMicrotasks(); | 22053 isolate->RunMicrotasks(); |
20481 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 22054 CHECK_EQ(0, |
20482 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 22055 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
22056 CHECK_EQ(0, | |
22057 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20483 | 22058 |
20484 pr->Resolve(v8::Integer::New(isolate, 3)); | 22059 pr->Resolve(v8::Integer::New(isolate, 3)); |
20485 | 22060 |
20486 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); | 22061 CHECK_EQ(0, |
20487 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); | 22062 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
22063 CHECK_EQ(0, | |
22064 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20488 isolate->RunMicrotasks(); | 22065 isolate->RunMicrotasks(); |
20489 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); | 22066 CHECK_EQ(3, |
20490 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); | 22067 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust()); |
22068 CHECK_EQ(4, | |
22069 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust()); | |
20491 } | 22070 } |
20492 | 22071 |
20493 | 22072 |
20494 TEST(DisallowJavascriptExecutionScope) { | 22073 TEST(DisallowJavascriptExecutionScope) { |
20495 LocalContext context; | 22074 LocalContext context; |
20496 v8::Isolate* isolate = context->GetIsolate(); | 22075 v8::Isolate* isolate = context->GetIsolate(); |
20497 v8::HandleScope scope(isolate); | 22076 v8::HandleScope scope(isolate); |
20498 v8::Isolate::DisallowJavascriptExecutionScope no_js( | 22077 v8::Isolate::DisallowJavascriptExecutionScope no_js( |
20499 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE); | 22078 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE); |
20500 CompileRun("2+2"); | 22079 CompileRun("2+2"); |
(...skipping 24 matching lines...) Expand all Loading... | |
20525 CompileRun("1+1"); | 22104 CompileRun("1+1"); |
20526 CHECK(try_catch.HasCaught()); | 22105 CHECK(try_catch.HasCaught()); |
20527 } | 22106 } |
20528 | 22107 |
20529 | 22108 |
20530 TEST(Regress354123) { | 22109 TEST(Regress354123) { |
20531 LocalContext current; | 22110 LocalContext current; |
20532 v8::Isolate* isolate = current->GetIsolate(); | 22111 v8::Isolate* isolate = current->GetIsolate(); |
20533 v8::HandleScope scope(isolate); | 22112 v8::HandleScope scope(isolate); |
20534 | 22113 |
20535 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); | 22114 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); |
20536 templ->SetAccessCheckCallback(AccessCounter); | 22115 templ->SetAccessCheckCallback(AccessCounter); |
20537 current->Global()->Set(v8_str("friend"), templ->NewInstance()); | 22116 CHECK(current->Global() |
22117 ->Set(current.local(), v8_str("friend"), | |
22118 templ->NewInstance(current.local()).ToLocalChecked()) | |
22119 .FromJust()); | |
20538 | 22120 |
20539 // Test access using __proto__ from the prototype chain. | 22121 // Test access using __proto__ from the prototype chain. |
20540 access_count = 0; | 22122 access_count = 0; |
20541 CompileRun("friend.__proto__ = {};"); | 22123 CompileRun("friend.__proto__ = {};"); |
20542 CHECK_EQ(2, access_count); | 22124 CHECK_EQ(2, access_count); |
20543 CompileRun("friend.__proto__;"); | 22125 CompileRun("friend.__proto__;"); |
20544 CHECK_EQ(4, access_count); | 22126 CHECK_EQ(4, access_count); |
20545 | 22127 |
20546 // Test access using __proto__ as a hijacked function (A). | 22128 // Test access using __proto__ as a hijacked function (A). |
20547 access_count = 0; | 22129 access_count = 0; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20596 isolate, &script_source); | 22178 isolate, &script_source); |
20597 Local<Value> script_name = script->GetUnboundScript()->GetScriptName(); | 22179 Local<Value> script_name = script->GetUnboundScript()->GetScriptName(); |
20598 CHECK(!script_name.IsEmpty()); | 22180 CHECK(!script_name.IsEmpty()); |
20599 CHECK(script_name->IsString()); | 22181 CHECK(script_name->IsString()); |
20600 String::Utf8Value utf8_name(script_name); | 22182 String::Utf8Value utf8_name(script_name); |
20601 CHECK_EQ(0, strcmp(url, *utf8_name)); | 22183 CHECK_EQ(0, strcmp(url, *utf8_name)); |
20602 int line_number = script->GetUnboundScript()->GetLineNumber(0); | 22184 int line_number = script->GetUnboundScript()->GetLineNumber(0); |
20603 CHECK_EQ(13, line_number); | 22185 CHECK_EQ(13, line_number); |
20604 } | 22186 } |
20605 | 22187 |
20606 void CheckMagicComments(Handle<Script> script, const char* expected_source_url, | 22188 void CheckMagicComments(Local<Script> script, const char* expected_source_url, |
20607 const char* expected_source_mapping_url) { | 22189 const char* expected_source_mapping_url) { |
20608 if (expected_source_url != NULL) { | 22190 if (expected_source_url != NULL) { |
20609 v8::String::Utf8Value url(script->GetUnboundScript()->GetSourceURL()); | 22191 v8::String::Utf8Value url(script->GetUnboundScript()->GetSourceURL()); |
20610 CHECK_EQ(0, strcmp(expected_source_url, *url)); | 22192 CHECK_EQ(0, strcmp(expected_source_url, *url)); |
20611 } else { | 22193 } else { |
20612 CHECK(script->GetUnboundScript()->GetSourceURL()->IsUndefined()); | 22194 CHECK(script->GetUnboundScript()->GetSourceURL()->IsUndefined()); |
20613 } | 22195 } |
20614 if (expected_source_mapping_url != NULL) { | 22196 if (expected_source_mapping_url != NULL) { |
20615 v8::String::Utf8Value url( | 22197 v8::String::Utf8Value url( |
20616 script->GetUnboundScript()->GetSourceMappingURL()); | 22198 script->GetUnboundScript()->GetSourceMappingURL()); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20705 Local<Value> desc = x->GetOwnPropertyDescriptor(v8_str("no_prop")); | 22287 Local<Value> desc = x->GetOwnPropertyDescriptor(v8_str("no_prop")); |
20706 CHECK(desc->IsUndefined()); | 22288 CHECK(desc->IsUndefined()); |
20707 desc = x->GetOwnPropertyDescriptor(v8_str("p0")); | 22289 desc = x->GetOwnPropertyDescriptor(v8_str("p0")); |
20708 CHECK(v8_num(12)->Equals(Local<Object>::Cast(desc)->Get(v8_str("value")))); | 22290 CHECK(v8_num(12)->Equals(Local<Object>::Cast(desc)->Get(v8_str("value")))); |
20709 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 22291 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
20710 Local<Function> set = | 22292 Local<Function> set = |
20711 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 22293 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
20712 Local<Function> get = | 22294 Local<Function> get = |
20713 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 22295 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
20714 CHECK(v8_num(13)->Equals(get->Call(x, 0, NULL))); | 22296 CHECK(v8_num(13)->Equals(get->Call(x, 0, NULL))); |
20715 Handle<Value> args[] = { v8_num(14) }; | 22297 Local<Value> args[] = {v8_num(14)}; |
20716 set->Call(x, 1, args); | 22298 set->Call(x, 1, args); |
20717 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); | 22299 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); |
20718 } | 22300 } |
20719 | 22301 |
20720 | 22302 |
20721 TEST(Regress411877) { | 22303 TEST(Regress411877) { |
20722 v8::Isolate* isolate = CcTest::isolate(); | 22304 v8::Isolate* isolate = CcTest::isolate(); |
20723 v8::HandleScope handle_scope(isolate); | 22305 v8::HandleScope handle_scope(isolate); |
20724 v8::Handle<v8::ObjectTemplate> object_template = | 22306 v8::Local<v8::ObjectTemplate> object_template = |
20725 v8::ObjectTemplate::New(isolate); | 22307 v8::ObjectTemplate::New(isolate); |
20726 object_template->SetAccessCheckCallback(AccessCounter); | 22308 object_template->SetAccessCheckCallback(AccessCounter); |
20727 | 22309 |
20728 v8::Handle<Context> context = Context::New(isolate); | 22310 v8::Local<Context> context = Context::New(isolate); |
20729 v8::Context::Scope context_scope(context); | 22311 v8::Context::Scope context_scope(context); |
20730 | 22312 |
20731 context->Global()->Set(v8_str("o"), object_template->NewInstance()); | 22313 CHECK(context->Global() |
22314 ->Set(context, v8_str("o"), | |
22315 object_template->NewInstance(context).ToLocalChecked()) | |
22316 .FromJust()); | |
20732 CompileRun("Object.getOwnPropertyNames(o)"); | 22317 CompileRun("Object.getOwnPropertyNames(o)"); |
20733 } | 22318 } |
20734 | 22319 |
20735 | 22320 |
20736 TEST(GetHiddenPropertyTableAfterAccessCheck) { | 22321 TEST(GetHiddenPropertyTableAfterAccessCheck) { |
20737 v8::Isolate* isolate = CcTest::isolate(); | 22322 v8::Isolate* isolate = CcTest::isolate(); |
20738 v8::HandleScope handle_scope(isolate); | 22323 v8::HandleScope handle_scope(isolate); |
20739 v8::Handle<v8::ObjectTemplate> object_template = | 22324 v8::Local<v8::ObjectTemplate> object_template = |
20740 v8::ObjectTemplate::New(isolate); | 22325 v8::ObjectTemplate::New(isolate); |
20741 object_template->SetAccessCheckCallback(AccessCounter); | 22326 object_template->SetAccessCheckCallback(AccessCounter); |
20742 | 22327 |
20743 v8::Handle<Context> context = Context::New(isolate); | 22328 v8::Local<Context> context = Context::New(isolate); |
20744 v8::Context::Scope context_scope(context); | 22329 v8::Context::Scope context_scope(context); |
20745 | 22330 |
20746 v8::Handle<v8::Object> obj = object_template->NewInstance(); | 22331 v8::Local<v8::Object> obj = |
22332 object_template->NewInstance(context).ToLocalChecked(); | |
20747 obj->Set(v8_str("key"), v8_str("value")); | 22333 obj->Set(v8_str("key"), v8_str("value")); |
20748 obj->Delete(v8_str("key")); | 22334 obj->Delete(v8_str("key")); |
20749 | 22335 |
20750 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")), | 22336 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")), |
20751 v8_str("hidden value 2")) | 22337 v8_str("hidden value 2")) |
20752 .FromJust(); | 22338 .FromJust(); |
20753 } | 22339 } |
20754 | 22340 |
20755 | 22341 |
20756 TEST(Regress411793) { | 22342 TEST(Regress411793) { |
20757 v8::Isolate* isolate = CcTest::isolate(); | 22343 v8::Isolate* isolate = CcTest::isolate(); |
20758 v8::HandleScope handle_scope(isolate); | 22344 v8::HandleScope handle_scope(isolate); |
20759 v8::Handle<v8::ObjectTemplate> object_template = | 22345 v8::Local<v8::ObjectTemplate> object_template = |
20760 v8::ObjectTemplate::New(isolate); | 22346 v8::ObjectTemplate::New(isolate); |
20761 object_template->SetAccessCheckCallback(AccessCounter); | 22347 object_template->SetAccessCheckCallback(AccessCounter); |
20762 | 22348 |
20763 v8::Handle<Context> context = Context::New(isolate); | 22349 v8::Local<Context> context = Context::New(isolate); |
20764 v8::Context::Scope context_scope(context); | 22350 v8::Context::Scope context_scope(context); |
20765 | 22351 |
20766 context->Global()->Set(v8_str("o"), object_template->NewInstance()); | 22352 CHECK(context->Global() |
22353 ->Set(context, v8_str("o"), | |
22354 object_template->NewInstance(context).ToLocalChecked()) | |
22355 .FromJust()); | |
20767 CompileRun( | 22356 CompileRun( |
20768 "Object.defineProperty(o, 'key', " | 22357 "Object.defineProperty(o, 'key', " |
20769 " { get: function() {}, set: function() {} });"); | 22358 " { get: function() {}, set: function() {} });"); |
20770 } | 22359 } |
20771 | 22360 |
20772 class TestSourceStream : public v8::ScriptCompiler::ExternalSourceStream { | 22361 class TestSourceStream : public v8::ScriptCompiler::ExternalSourceStream { |
20773 public: | 22362 public: |
20774 explicit TestSourceStream(const char** chunks) : chunks_(chunks), index_(0) {} | 22363 explicit TestSourceStream(const char** chunks) : chunks_(chunks), index_(0) {} |
20775 | 22364 |
20776 virtual size_t GetMoreData(const uint8_t** src) { | 22365 virtual size_t GetMoreData(const uint8_t** src) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
20832 // TestSourceStream::GetMoreData won't block, so it's OK to just run the | 22421 // TestSourceStream::GetMoreData won't block, so it's OK to just run the |
20833 // task here in the main thread. | 22422 // task here in the main thread. |
20834 task->Run(); | 22423 task->Run(); |
20835 delete task; | 22424 delete task; |
20836 | 22425 |
20837 // Possible errors are only produced while compiling. | 22426 // Possible errors are only produced while compiling. |
20838 CHECK_EQ(false, try_catch.HasCaught()); | 22427 CHECK_EQ(false, try_catch.HasCaught()); |
20839 | 22428 |
20840 v8::ScriptOrigin origin(v8_str("http://foo.com")); | 22429 v8::ScriptOrigin origin(v8_str("http://foo.com")); |
20841 char* full_source = TestSourceStream::FullSourceString(chunks); | 22430 char* full_source = TestSourceStream::FullSourceString(chunks); |
20842 v8::Handle<Script> script = v8::ScriptCompiler::Compile( | 22431 v8::Local<Script> script = v8::ScriptCompiler::Compile( |
20843 isolate, &source, v8_str(full_source), origin); | 22432 isolate, &source, v8_str(full_source), origin); |
20844 if (expected_success) { | 22433 if (expected_success) { |
20845 CHECK(!script.IsEmpty()); | 22434 CHECK(!script.IsEmpty()); |
20846 v8::Handle<Value> result(script->Run()); | 22435 v8::Local<Value> result(script->Run()); |
20847 // All scripts are supposed to return the fixed value 13 when ran. | 22436 // All scripts are supposed to return the fixed value 13 when ran. |
20848 CHECK_EQ(13, result->Int32Value()); | 22437 CHECK_EQ(13, result->Int32Value(env.local()).FromJust()); |
20849 CheckMagicComments(script, expected_source_url, | 22438 CheckMagicComments(script, expected_source_url, |
20850 expected_source_mapping_url); | 22439 expected_source_mapping_url); |
20851 } else { | 22440 } else { |
20852 CHECK(script.IsEmpty()); | 22441 CHECK(script.IsEmpty()); |
20853 CHECK(try_catch.HasCaught()); | 22442 CHECK(try_catch.HasCaught()); |
20854 } | 22443 } |
20855 delete[] full_source; | 22444 delete[] full_source; |
20856 } | 22445 } |
20857 | 22446 |
20858 | 22447 |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21107 task->Run(); | 22696 task->Run(); |
21108 delete task; | 22697 delete task; |
21109 | 22698 |
21110 CHECK(!try_catch.HasCaught()); | 22699 CHECK(!try_catch.HasCaught()); |
21111 | 22700 |
21112 v8::ScriptOrigin origin(v8_str("http://foo.com")); | 22701 v8::ScriptOrigin origin(v8_str("http://foo.com")); |
21113 char* full_source = TestSourceStream::FullSourceString(chunks); | 22702 char* full_source = TestSourceStream::FullSourceString(chunks); |
21114 | 22703 |
21115 EnableDebugger(); | 22704 EnableDebugger(); |
21116 | 22705 |
21117 v8::Handle<Script> script = v8::ScriptCompiler::Compile( | 22706 v8::Local<Script> script = v8::ScriptCompiler::Compile( |
21118 isolate, &source, v8_str(full_source), origin); | 22707 isolate, &source, v8_str(full_source), origin); |
21119 | 22708 |
21120 Maybe<uint32_t> result = | 22709 Maybe<uint32_t> result = |
21121 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local()); | 22710 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local()); |
21122 CHECK_EQ(3U, result.FromMaybe(0)); | 22711 CHECK_EQ(3U, result.FromMaybe(0)); |
21123 | 22712 |
21124 delete[] full_source; | 22713 delete[] full_source; |
21125 | 22714 |
21126 DisableDebugger(); | 22715 DisableDebugger(); |
21127 } | 22716 } |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21211 v8::ScriptCompiler::StartStreamingScript(isolate, &source); | 22800 v8::ScriptCompiler::StartStreamingScript(isolate, &source); |
21212 task->Run(); | 22801 task->Run(); |
21213 delete task; | 22802 delete task; |
21214 | 22803 |
21215 // Parsing should succeed (the script will be parsed and compiled in a context | 22804 // Parsing should succeed (the script will be parsed and compiled in a context |
21216 // independent way, so the error is not detected). | 22805 // independent way, so the error is not detected). |
21217 CHECK_EQ(false, try_catch.HasCaught()); | 22806 CHECK_EQ(false, try_catch.HasCaught()); |
21218 | 22807 |
21219 v8::ScriptOrigin origin(v8_str("http://foo.com")); | 22808 v8::ScriptOrigin origin(v8_str("http://foo.com")); |
21220 char* full_source = TestSourceStream::FullSourceString(chunks); | 22809 char* full_source = TestSourceStream::FullSourceString(chunks); |
21221 v8::Handle<Script> script = v8::ScriptCompiler::Compile( | 22810 v8::Local<Script> script = v8::ScriptCompiler::Compile( |
21222 isolate, &source, v8_str(full_source), origin); | 22811 isolate, &source, v8_str(full_source), origin); |
21223 CHECK(!script.IsEmpty()); | 22812 CHECK(!script.IsEmpty()); |
21224 CHECK_EQ(false, try_catch.HasCaught()); | 22813 CHECK_EQ(false, try_catch.HasCaught()); |
21225 | 22814 |
21226 // Running the script exposes the error. | 22815 // Running the script exposes the error. |
21227 v8::Handle<Value> result(script->Run()); | 22816 v8::Local<Value> result(script->Run()); |
21228 CHECK(result.IsEmpty()); | 22817 CHECK(result.IsEmpty()); |
21229 CHECK(try_catch.HasCaught()); | 22818 CHECK(try_catch.HasCaught()); |
21230 delete[] full_source; | 22819 delete[] full_source; |
21231 } | 22820 } |
21232 | 22821 |
21233 | 22822 |
21234 TEST(CodeCache) { | 22823 TEST(CodeCache) { |
21235 v8::Isolate::CreateParams create_params; | 22824 v8::Isolate::CreateParams create_params; |
21236 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 22825 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
21237 | 22826 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21270 v8::ScriptCompiler::Source source(source_string, script_origin, cache); | 22859 v8::ScriptCompiler::Source source(source_string, script_origin, cache); |
21271 v8::ScriptCompiler::CompileOptions option = | 22860 v8::ScriptCompiler::CompileOptions option = |
21272 v8::ScriptCompiler::kConsumeCodeCache; | 22861 v8::ScriptCompiler::kConsumeCodeCache; |
21273 v8::Local<v8::Script> script; | 22862 v8::Local<v8::Script> script; |
21274 { | 22863 { |
21275 i::DisallowCompilation no_compile( | 22864 i::DisallowCompilation no_compile( |
21276 reinterpret_cast<i::Isolate*>(isolate2)); | 22865 reinterpret_cast<i::Isolate*>(isolate2)); |
21277 script = v8::ScriptCompiler::Compile(context, &source, option) | 22866 script = v8::ScriptCompiler::Compile(context, &source, option) |
21278 .ToLocalChecked(); | 22867 .ToLocalChecked(); |
21279 } | 22868 } |
21280 CHECK_EQ(2, script->Run()->ToInt32(isolate2)->Int32Value()); | 22869 CHECK_EQ(2, |
22870 script->Run()->ToInt32(isolate2)->Int32Value(context).FromJust()); | |
21281 } | 22871 } |
21282 isolate2->Dispose(); | 22872 isolate2->Dispose(); |
21283 } | 22873 } |
21284 | 22874 |
21285 | 22875 |
21286 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { | 22876 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { |
21287 const char* garbage = "garbage garbage garbage garbage garbage garbage"; | 22877 const char* garbage = "garbage garbage garbage garbage garbage garbage"; |
21288 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); | 22878 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); |
21289 int length = 16; | 22879 int length = 16; |
21290 v8::ScriptCompiler::CachedData* cached_data = | 22880 v8::ScriptCompiler::CachedData* cached_data = |
21291 new v8::ScriptCompiler::CachedData(data, length); | 22881 new v8::ScriptCompiler::CachedData(data, length); |
21292 DCHECK(!cached_data->rejected); | 22882 DCHECK(!cached_data->rejected); |
21293 v8::ScriptOrigin origin(v8_str("origin")); | 22883 v8::ScriptOrigin origin(v8_str("origin")); |
21294 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); | 22884 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); |
21295 v8::Handle<v8::Script> script = | 22885 v8::Local<v8::Script> script = |
21296 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); | 22886 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); |
21297 CHECK(cached_data->rejected); | 22887 CHECK(cached_data->rejected); |
21298 CHECK_EQ(42, script->Run()->Int32Value()); | 22888 CHECK_EQ(42, script->Run() |
22889 ->Int32Value(CcTest::isolate()->GetCurrentContext()) | |
22890 .FromJust()); | |
21299 } | 22891 } |
21300 | 22892 |
21301 | 22893 |
21302 TEST(InvalidCacheData) { | 22894 TEST(InvalidCacheData) { |
21303 v8::V8::Initialize(); | 22895 v8::V8::Initialize(); |
21304 v8::HandleScope scope(CcTest::isolate()); | 22896 v8::HandleScope scope(CcTest::isolate()); |
21305 LocalContext context; | 22897 LocalContext context; |
21306 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); | 22898 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); |
21307 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); | 22899 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); |
21308 } | 22900 } |
21309 | 22901 |
21310 | 22902 |
21311 TEST(ParserCacheRejectedGracefully) { | 22903 TEST(ParserCacheRejectedGracefully) { |
21312 i::FLAG_min_preparse_length = 0; | 22904 i::FLAG_min_preparse_length = 0; |
21313 v8::V8::Initialize(); | 22905 v8::V8::Initialize(); |
21314 v8::HandleScope scope(CcTest::isolate()); | 22906 v8::HandleScope scope(CcTest::isolate()); |
21315 LocalContext context; | 22907 LocalContext context; |
21316 // Produce valid cached data. | 22908 // Produce valid cached data. |
21317 v8::ScriptOrigin origin(v8_str("origin")); | 22909 v8::ScriptOrigin origin(v8_str("origin")); |
21318 v8::Local<v8::String> source_str = v8_str("function foo() {}"); | 22910 v8::Local<v8::String> source_str = v8_str("function foo() {}"); |
21319 v8::ScriptCompiler::Source source(source_str, origin); | 22911 v8::ScriptCompiler::Source source(source_str, origin); |
21320 v8::Handle<v8::Script> script = v8::ScriptCompiler::Compile( | 22912 v8::Local<v8::Script> script = v8::ScriptCompiler::Compile( |
21321 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache); | 22913 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache); |
21322 CHECK(!script.IsEmpty()); | 22914 CHECK(!script.IsEmpty()); |
21323 const v8::ScriptCompiler::CachedData* original_cached_data = | 22915 const v8::ScriptCompiler::CachedData* original_cached_data = |
21324 source.GetCachedData(); | 22916 source.GetCachedData(); |
21325 CHECK(original_cached_data != NULL); | 22917 CHECK(original_cached_data != NULL); |
21326 CHECK(original_cached_data->data != NULL); | 22918 CHECK(original_cached_data->data != NULL); |
21327 CHECK(!original_cached_data->rejected); | 22919 CHECK(!original_cached_data->rejected); |
21328 CHECK_GT(original_cached_data->length, 0); | 22920 CHECK_GT(original_cached_data->length, 0); |
21329 // Recompiling the same script with it won't reject the data. | 22921 // Recompiling the same script with it won't reject the data. |
21330 { | 22922 { |
21331 v8::ScriptCompiler::Source source_with_cached_data( | 22923 v8::ScriptCompiler::Source source_with_cached_data( |
21332 source_str, origin, | 22924 source_str, origin, |
21333 new v8::ScriptCompiler::CachedData(original_cached_data->data, | 22925 new v8::ScriptCompiler::CachedData(original_cached_data->data, |
21334 original_cached_data->length)); | 22926 original_cached_data->length)); |
21335 v8::Handle<v8::Script> script = | 22927 v8::Local<v8::Script> script = |
21336 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, | 22928 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, |
21337 v8::ScriptCompiler::kConsumeParserCache); | 22929 v8::ScriptCompiler::kConsumeParserCache); |
21338 CHECK(!script.IsEmpty()); | 22930 CHECK(!script.IsEmpty()); |
21339 const v8::ScriptCompiler::CachedData* new_cached_data = | 22931 const v8::ScriptCompiler::CachedData* new_cached_data = |
21340 source_with_cached_data.GetCachedData(); | 22932 source_with_cached_data.GetCachedData(); |
21341 CHECK(new_cached_data != NULL); | 22933 CHECK(new_cached_data != NULL); |
21342 CHECK(!new_cached_data->rejected); | 22934 CHECK(!new_cached_data->rejected); |
21343 } | 22935 } |
21344 // Compile an incompatible script with the cached data. The new script doesn't | 22936 // Compile an incompatible script with the cached data. The new script doesn't |
21345 // have the same starting position for the function as the old one, so the old | 22937 // have the same starting position for the function as the old one, so the old |
21346 // cached data will be incompatible with it and will be rejected. | 22938 // cached data will be incompatible with it and will be rejected. |
21347 { | 22939 { |
21348 v8::Local<v8::String> incompatible_source_str = | 22940 v8::Local<v8::String> incompatible_source_str = |
21349 v8_str(" function foo() {}"); | 22941 v8_str(" function foo() {}"); |
21350 v8::ScriptCompiler::Source source_with_cached_data( | 22942 v8::ScriptCompiler::Source source_with_cached_data( |
21351 incompatible_source_str, origin, | 22943 incompatible_source_str, origin, |
21352 new v8::ScriptCompiler::CachedData(original_cached_data->data, | 22944 new v8::ScriptCompiler::CachedData(original_cached_data->data, |
21353 original_cached_data->length)); | 22945 original_cached_data->length)); |
21354 v8::Handle<v8::Script> script = | 22946 v8::Local<v8::Script> script = |
21355 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, | 22947 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, |
21356 v8::ScriptCompiler::kConsumeParserCache); | 22948 v8::ScriptCompiler::kConsumeParserCache); |
21357 CHECK(!script.IsEmpty()); | 22949 CHECK(!script.IsEmpty()); |
21358 const v8::ScriptCompiler::CachedData* new_cached_data = | 22950 const v8::ScriptCompiler::CachedData* new_cached_data = |
21359 source_with_cached_data.GetCachedData(); | 22951 source_with_cached_data.GetCachedData(); |
21360 CHECK(new_cached_data != NULL); | 22952 CHECK(new_cached_data != NULL); |
21361 CHECK(new_cached_data->rejected); | 22953 CHECK(new_cached_data->rejected); |
21362 } | 22954 } |
21363 } | 22955 } |
21364 | 22956 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21413 CHECK_EQ(should_be_neuterable, result->IsNeuterable()); | 23005 CHECK_EQ(should_be_neuterable, result->IsNeuterable()); |
21414 } | 23006 } |
21415 | 23007 |
21416 | 23008 |
21417 TEST(GetPrototypeAccessControl) { | 23009 TEST(GetPrototypeAccessControl) { |
21418 i::FLAG_allow_natives_syntax = true; | 23010 i::FLAG_allow_natives_syntax = true; |
21419 v8::Isolate* isolate = CcTest::isolate(); | 23011 v8::Isolate* isolate = CcTest::isolate(); |
21420 v8::HandleScope handle_scope(isolate); | 23012 v8::HandleScope handle_scope(isolate); |
21421 LocalContext env; | 23013 LocalContext env; |
21422 | 23014 |
21423 v8::Handle<v8::ObjectTemplate> obj_template = | 23015 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); |
21424 v8::ObjectTemplate::New(isolate); | |
21425 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); | 23016 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); |
21426 | 23017 |
21427 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); | 23018 CHECK(env->Global() |
23019 ->Set(env.local(), v8_str("prohibited"), | |
23020 obj_template->NewInstance(env.local()).ToLocalChecked()) | |
23021 .FromJust()); | |
21428 | 23022 |
21429 CHECK(CompileRun( | 23023 CHECK(CompileRun( |
21430 "function f() { return %_GetPrototype(prohibited); }" | 23024 "function f() { return %_GetPrototype(prohibited); }" |
21431 "%OptimizeFunctionOnNextCall(f);" | 23025 "%OptimizeFunctionOnNextCall(f);" |
21432 "f();")->IsNull()); | 23026 "f();")->IsNull()); |
21433 } | 23027 } |
21434 | 23028 |
21435 | 23029 |
21436 TEST(GetPrototypeHidden) { | 23030 TEST(GetPrototypeHidden) { |
21437 i::FLAG_allow_natives_syntax = true; | 23031 i::FLAG_allow_natives_syntax = true; |
21438 v8::Isolate* isolate = CcTest::isolate(); | 23032 v8::Isolate* isolate = CcTest::isolate(); |
21439 v8::HandleScope handle_scope(isolate); | 23033 v8::HandleScope handle_scope(isolate); |
21440 LocalContext env; | 23034 LocalContext env; |
21441 | 23035 |
21442 Handle<FunctionTemplate> t = FunctionTemplate::New(isolate); | 23036 Local<FunctionTemplate> t = FunctionTemplate::New(isolate); |
21443 t->SetHiddenPrototype(true); | 23037 t->SetHiddenPrototype(true); |
21444 Handle<Object> proto = t->GetFunction()->NewInstance(); | 23038 Local<Object> proto = t->GetFunction(env.local()) |
21445 Handle<Object> object = Object::New(isolate); | 23039 .ToLocalChecked() |
21446 Handle<Object> proto2 = Object::New(isolate); | 23040 ->NewInstance(env.local()) |
23041 .ToLocalChecked(); | |
23042 Local<Object> object = Object::New(isolate); | |
23043 Local<Object> proto2 = Object::New(isolate); | |
21447 object->SetPrototype(proto); | 23044 object->SetPrototype(proto); |
21448 proto->SetPrototype(proto2); | 23045 proto->SetPrototype(proto2); |
21449 | 23046 |
21450 env->Global()->Set(v8_str("object"), object); | 23047 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust()); |
21451 env->Global()->Set(v8_str("proto"), proto); | 23048 CHECK(env->Global()->Set(env.local(), v8_str("proto"), proto).FromJust()); |
21452 env->Global()->Set(v8_str("proto2"), proto2); | 23049 CHECK(env->Global()->Set(env.local(), v8_str("proto2"), proto2).FromJust()); |
21453 | 23050 |
21454 v8::Handle<v8::Value> result = CompileRun("%_GetPrototype(object)"); | 23051 v8::Local<v8::Value> result = CompileRun("%_GetPrototype(object)"); |
21455 CHECK(result->Equals(proto2)); | 23052 CHECK(result->Equals(proto2)); |
21456 | 23053 |
21457 result = CompileRun( | 23054 result = CompileRun( |
21458 "function f() { return %_GetPrototype(object); }" | 23055 "function f() { return %_GetPrototype(object); }" |
21459 "%OptimizeFunctionOnNextCall(f);" | 23056 "%OptimizeFunctionOnNextCall(f);" |
21460 "f()"); | 23057 "f()"); |
21461 CHECK(result->Equals(proto2)); | 23058 CHECK(result->Equals(proto2)); |
21462 } | 23059 } |
21463 | 23060 |
21464 | 23061 |
21465 TEST(ClassPrototypeCreationContext) { | 23062 TEST(ClassPrototypeCreationContext) { |
21466 v8::Isolate* isolate = CcTest::isolate(); | 23063 v8::Isolate* isolate = CcTest::isolate(); |
21467 v8::HandleScope handle_scope(isolate); | 23064 v8::HandleScope handle_scope(isolate); |
21468 LocalContext env; | 23065 LocalContext env; |
21469 | 23066 |
21470 Handle<Object> result = Handle<Object>::Cast( | 23067 Local<Object> result = Local<Object>::Cast( |
21471 CompileRun("'use strict'; class Example { }; Example.prototype")); | 23068 CompileRun("'use strict'; class Example { }; Example.prototype")); |
21472 CHECK(env.local() == result->CreationContext()); | 23069 CHECK(env.local() == result->CreationContext()); |
21473 } | 23070 } |
21474 | 23071 |
21475 | 23072 |
21476 TEST(SimpleStreamingScriptWithSourceURL) { | 23073 TEST(SimpleStreamingScriptWithSourceURL) { |
21477 const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo();\n", | 23074 const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo();\n", |
21478 "//# sourceURL=bar2.js\n", NULL}; | 23075 "//# sourceURL=bar2.js\n", NULL}; |
21479 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, true, | 23076 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, true, |
21480 "bar2.js"); | 23077 "bar2.js"); |
(...skipping 20 matching lines...) Expand all Loading... | |
21501 v8::Isolate* isolate = CcTest::isolate(); | 23098 v8::Isolate* isolate = CcTest::isolate(); |
21502 v8::HandleScope handle_scope(isolate); | 23099 v8::HandleScope handle_scope(isolate); |
21503 const int length = i::String::kMaxLength + 1; | 23100 const int length = i::String::kMaxLength + 1; |
21504 const int buffer_size = length * sizeof(uint16_t); | 23101 const int buffer_size = length * sizeof(uint16_t); |
21505 void* buffer = malloc(buffer_size); | 23102 void* buffer = malloc(buffer_size); |
21506 if (buffer == NULL) return; | 23103 if (buffer == NULL) return; |
21507 memset(buffer, 'A', buffer_size); | 23104 memset(buffer, 'A', buffer_size); |
21508 { | 23105 { |
21509 v8::TryCatch try_catch(isolate); | 23106 v8::TryCatch try_catch(isolate); |
21510 char* data = reinterpret_cast<char*>(buffer); | 23107 char* data = reinterpret_cast<char*>(buffer); |
21511 CHECK(v8::String::NewFromUtf8(isolate, data, v8::String::kNormalString, | 23108 CHECK(v8::String::NewFromUtf8(isolate, data, v8::NewStringType::kNormal, |
21512 length).IsEmpty()); | 23109 length) |
23110 .IsEmpty()); | |
21513 CHECK(!try_catch.HasCaught()); | 23111 CHECK(!try_catch.HasCaught()); |
21514 } | 23112 } |
21515 { | 23113 { |
21516 v8::TryCatch try_catch(isolate); | 23114 v8::TryCatch try_catch(isolate); |
21517 uint8_t* data = reinterpret_cast<uint8_t*>(buffer); | 23115 uint8_t* data = reinterpret_cast<uint8_t*>(buffer); |
21518 CHECK(v8::String::NewFromOneByte(isolate, data, v8::String::kNormalString, | 23116 CHECK(v8::String::NewFromOneByte(isolate, data, v8::NewStringType::kNormal, |
21519 length).IsEmpty()); | 23117 length) |
23118 .IsEmpty()); | |
21520 CHECK(!try_catch.HasCaught()); | 23119 CHECK(!try_catch.HasCaught()); |
21521 } | 23120 } |
21522 { | 23121 { |
21523 v8::TryCatch try_catch(isolate); | 23122 v8::TryCatch try_catch(isolate); |
21524 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); | 23123 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); |
21525 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, | 23124 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::NewStringType::kNormal, |
21526 length).IsEmpty()); | 23125 length) |
23126 .IsEmpty()); | |
21527 CHECK(!try_catch.HasCaught()); | 23127 CHECK(!try_catch.HasCaught()); |
21528 } | 23128 } |
21529 free(buffer); | 23129 free(buffer); |
21530 } | 23130 } |
21531 | 23131 |
21532 | 23132 |
21533 TEST(SealHandleScope) { | 23133 TEST(SealHandleScope) { |
21534 v8::Isolate* isolate = CcTest::isolate(); | 23134 v8::Isolate* isolate = CcTest::isolate(); |
21535 v8::HandleScope handle_scope(isolate); | 23135 v8::HandleScope handle_scope(isolate); |
21536 LocalContext env; | 23136 LocalContext env; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
21576 Local<v8::Object> accessed_object) { | 23176 Local<v8::Object> accessed_object) { |
21577 access_was_called = true; | 23177 access_was_called = true; |
21578 return false; | 23178 return false; |
21579 } | 23179 } |
21580 | 23180 |
21581 | 23181 |
21582 TEST(StrongModeAccessCheckAllowed) { | 23182 TEST(StrongModeAccessCheckAllowed) { |
21583 i::FLAG_strong_mode = true; | 23183 i::FLAG_strong_mode = true; |
21584 v8::Isolate* isolate = CcTest::isolate(); | 23184 v8::Isolate* isolate = CcTest::isolate(); |
21585 v8::HandleScope handle_scope(isolate); | 23185 v8::HandleScope handle_scope(isolate); |
21586 v8::Handle<Value> value; | 23186 v8::Local<Value> value; |
21587 access_was_called = false; | 23187 access_was_called = false; |
21588 | 23188 |
21589 v8::Handle<v8::ObjectTemplate> obj_template = | 23189 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); |
21590 v8::ObjectTemplate::New(isolate); | |
21591 | 23190 |
21592 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 23191 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
21593 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag); | 23192 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag); |
21594 | 23193 |
21595 // Create an environment | 23194 // Create an environment |
21596 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); | 23195 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
21597 context0->Enter(); | 23196 context0->Enter(); |
21598 v8::Handle<v8::Object> global0 = context0->Global(); | 23197 v8::Local<v8::Object> global0 = context0->Global(); |
21599 global0->Set(v8_str("object"), obj_template->NewInstance()); | 23198 global0->Set(v8_str("object"), |
23199 obj_template->NewInstance(context0).ToLocalChecked()); | |
21600 { | 23200 { |
21601 v8::TryCatch try_catch(isolate); | 23201 v8::TryCatch try_catch(isolate); |
21602 value = CompileRun("'use strong'; object.x"); | 23202 value = CompileRun("'use strong'; object.x"); |
21603 CHECK(!try_catch.HasCaught()); | 23203 CHECK(!try_catch.HasCaught()); |
21604 CHECK(!access_was_called); | 23204 CHECK(!access_was_called); |
21605 CHECK_EQ(42, value->Int32Value()); | 23205 CHECK_EQ(42, value->Int32Value(context0).FromJust()); |
21606 } | 23206 } |
21607 { | 23207 { |
21608 v8::TryCatch try_catch(isolate); | 23208 v8::TryCatch try_catch(isolate); |
21609 value = CompileRun("'use strong'; object.foo"); | 23209 value = CompileRun("'use strong'; object.foo"); |
21610 CHECK(try_catch.HasCaught()); | 23210 CHECK(try_catch.HasCaught()); |
21611 CHECK(!access_was_called); | 23211 CHECK(!access_was_called); |
21612 } | 23212 } |
21613 { | 23213 { |
21614 v8::TryCatch try_catch(isolate); | 23214 v8::TryCatch try_catch(isolate); |
21615 value = CompileRun("'use strong'; object[10]"); | 23215 value = CompileRun("'use strong'; object[10]"); |
21616 CHECK(try_catch.HasCaught()); | 23216 CHECK(try_catch.HasCaught()); |
21617 CHECK(!access_was_called); | 23217 CHECK(!access_was_called); |
21618 } | 23218 } |
21619 | 23219 |
21620 // Create an environment | 23220 // Create an environment |
21621 v8::Local<Context> context1 = Context::New(isolate); | 23221 v8::Local<Context> context1 = Context::New(isolate); |
21622 context1->Enter(); | 23222 context1->Enter(); |
21623 v8::Handle<v8::Object> global1 = context1->Global(); | 23223 v8::Local<v8::Object> global1 = context1->Global(); |
21624 global1->Set(v8_str("object"), obj_template->NewInstance()); | 23224 global1->Set(v8_str("object"), |
23225 obj_template->NewInstance(context1).ToLocalChecked()); | |
21625 { | 23226 { |
21626 v8::TryCatch try_catch(isolate); | 23227 v8::TryCatch try_catch(isolate); |
21627 value = CompileRun("'use strong'; object.x"); | 23228 value = CompileRun("'use strong'; object.x"); |
21628 CHECK(!try_catch.HasCaught()); | 23229 CHECK(!try_catch.HasCaught()); |
21629 CHECK(access_was_called); | 23230 CHECK(access_was_called); |
21630 CHECK_EQ(42, value->Int32Value()); | 23231 CHECK_EQ(42, value->Int32Value(context1).FromJust()); |
21631 } | 23232 } |
21632 access_was_called = false; | 23233 access_was_called = false; |
21633 { | 23234 { |
21634 v8::TryCatch try_catch(isolate); | 23235 v8::TryCatch try_catch(isolate); |
21635 value = CompileRun("'use strong'; object.foo"); | 23236 value = CompileRun("'use strong'; object.foo"); |
21636 CHECK(try_catch.HasCaught()); | 23237 CHECK(try_catch.HasCaught()); |
21637 CHECK(access_was_called); | 23238 CHECK(access_was_called); |
21638 } | 23239 } |
21639 access_was_called = false; | 23240 access_was_called = false; |
21640 { | 23241 { |
21641 v8::TryCatch try_catch(isolate); | 23242 v8::TryCatch try_catch(isolate); |
21642 value = CompileRun("'use strong'; object[10]"); | 23243 value = CompileRun("'use strong'; object[10]"); |
21643 CHECK(try_catch.HasCaught()); | 23244 CHECK(try_catch.HasCaught()); |
21644 CHECK(access_was_called); | 23245 CHECK(access_was_called); |
21645 } | 23246 } |
21646 | 23247 |
21647 context1->Exit(); | 23248 context1->Exit(); |
21648 context0->Exit(); | 23249 context0->Exit(); |
21649 } | 23250 } |
21650 | 23251 |
21651 | 23252 |
21652 TEST(StrongModeAccessCheckBlocked) { | 23253 TEST(StrongModeAccessCheckBlocked) { |
21653 i::FLAG_strong_mode = true; | 23254 i::FLAG_strong_mode = true; |
21654 v8::Isolate* isolate = CcTest::isolate(); | 23255 v8::Isolate* isolate = CcTest::isolate(); |
21655 v8::HandleScope handle_scope(isolate); | 23256 v8::HandleScope handle_scope(isolate); |
21656 v8::Handle<Value> value; | 23257 v8::Local<Value> value; |
21657 access_was_called = false; | 23258 access_was_called = false; |
21658 | 23259 |
21659 v8::Handle<v8::ObjectTemplate> obj_template = | 23260 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate); |
21660 v8::ObjectTemplate::New(isolate); | |
21661 | 23261 |
21662 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); | 23262 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); |
21663 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag); | 23263 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag); |
21664 | 23264 |
21665 // Create an environment | 23265 // Create an environment |
21666 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); | 23266 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
21667 context0->Enter(); | 23267 context0->Enter(); |
21668 v8::Handle<v8::Object> global0 = context0->Global(); | 23268 v8::Local<v8::Object> global0 = context0->Global(); |
21669 global0->Set(v8_str("object"), obj_template->NewInstance()); | 23269 global0->Set(v8_str("object"), |
23270 obj_template->NewInstance(context0).ToLocalChecked()); | |
21670 { | 23271 { |
21671 v8::TryCatch try_catch(isolate); | 23272 v8::TryCatch try_catch(isolate); |
21672 value = CompileRun("'use strong'; object.x"); | 23273 value = CompileRun("'use strong'; object.x"); |
21673 CHECK(!try_catch.HasCaught()); | 23274 CHECK(!try_catch.HasCaught()); |
21674 CHECK(!access_was_called); | 23275 CHECK(!access_was_called); |
21675 CHECK_EQ(42, value->Int32Value()); | 23276 CHECK_EQ(42, value->Int32Value(context0).FromJust()); |
21676 } | 23277 } |
21677 { | 23278 { |
21678 v8::TryCatch try_catch(isolate); | 23279 v8::TryCatch try_catch(isolate); |
21679 value = CompileRun("'use strong'; object.foo"); | 23280 value = CompileRun("'use strong'; object.foo"); |
21680 CHECK(try_catch.HasCaught()); | 23281 CHECK(try_catch.HasCaught()); |
21681 CHECK(!access_was_called); | 23282 CHECK(!access_was_called); |
21682 } | 23283 } |
21683 { | 23284 { |
21684 v8::TryCatch try_catch(isolate); | 23285 v8::TryCatch try_catch(isolate); |
21685 value = CompileRun("'use strong'; object[10]"); | 23286 value = CompileRun("'use strong'; object[10]"); |
21686 CHECK(try_catch.HasCaught()); | 23287 CHECK(try_catch.HasCaught()); |
21687 CHECK(!access_was_called); | 23288 CHECK(!access_was_called); |
21688 } | 23289 } |
21689 | 23290 |
21690 // Create an environment | 23291 // Create an environment |
21691 v8::Local<Context> context1 = Context::New(isolate); | 23292 v8::Local<Context> context1 = Context::New(isolate); |
21692 context1->Enter(); | 23293 context1->Enter(); |
21693 v8::Handle<v8::Object> global1 = context1->Global(); | 23294 v8::Local<v8::Object> global1 = context1->Global(); |
21694 global1->Set(v8_str("object"), obj_template->NewInstance()); | 23295 global1->Set(v8_str("object"), |
23296 obj_template->NewInstance(context1).ToLocalChecked()); | |
21695 { | 23297 { |
21696 v8::TryCatch try_catch(isolate); | 23298 v8::TryCatch try_catch(isolate); |
21697 value = CompileRun("'use strong'; object.x"); | 23299 value = CompileRun("'use strong'; object.x"); |
21698 CHECK(try_catch.HasCaught()); | 23300 CHECK(try_catch.HasCaught()); |
21699 CHECK(access_was_called); | 23301 CHECK(access_was_called); |
21700 } | 23302 } |
21701 access_was_called = false; | 23303 access_was_called = false; |
21702 { | 23304 { |
21703 v8::TryCatch try_catch(isolate); | 23305 v8::TryCatch try_catch(isolate); |
21704 value = CompileRun("'use strong'; object.foo"); | 23306 value = CompileRun("'use strong'; object.foo"); |
(...skipping 29 matching lines...) Expand all Loading... | |
21734 } | 23336 } |
21735 | 23337 |
21736 { | 23338 { |
21737 v8::TryCatch try_catch(isolate); | 23339 v8::TryCatch try_catch(isolate); |
21738 fun->Call(v8::Undefined(isolate), 0, nullptr); | 23340 fun->Call(v8::Undefined(isolate), 0, nullptr); |
21739 CHECK(try_catch.HasCaught()); | 23341 CHECK(try_catch.HasCaught()); |
21740 } | 23342 } |
21741 | 23343 |
21742 { | 23344 { |
21743 v8::TryCatch try_catch(isolate); | 23345 v8::TryCatch try_catch(isolate); |
21744 v8::Handle<Value> args[] = {v8_num(42)}; | 23346 v8::Local<Value> args[] = {v8_num(42)}; |
21745 fun->Call(v8::Undefined(isolate), arraysize(args), args); | 23347 fun->Call(v8::Undefined(isolate), arraysize(args), args); |
21746 CHECK(!try_catch.HasCaught()); | 23348 CHECK(!try_catch.HasCaught()); |
21747 } | 23349 } |
21748 | 23350 |
21749 { | 23351 { |
21750 v8::TryCatch try_catch(isolate); | 23352 v8::TryCatch try_catch(isolate); |
21751 v8::Handle<Value> args[] = {v8_num(42), v8_num(555)}; | 23353 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; |
21752 fun->Call(v8::Undefined(isolate), arraysize(args), args); | 23354 fun->Call(v8::Undefined(isolate), arraysize(args), args); |
21753 CHECK(!try_catch.HasCaught()); | 23355 CHECK(!try_catch.HasCaught()); |
21754 } | 23356 } |
21755 } | 23357 } |
21756 | 23358 |
21757 | 23359 |
21758 TEST(StrongModeArityCallFromApi2) { | 23360 TEST(StrongModeArityCallFromApi2) { |
21759 i::FLAG_strong_mode = true; | 23361 i::FLAG_strong_mode = true; |
21760 LocalContext env; | 23362 LocalContext env; |
21761 v8::Isolate* isolate = env->GetIsolate(); | 23363 v8::Isolate* isolate = env->GetIsolate(); |
(...skipping 10 matching lines...) Expand all Loading... | |
21772 } | 23374 } |
21773 | 23375 |
21774 { | 23376 { |
21775 v8::TryCatch try_catch(isolate); | 23377 v8::TryCatch try_catch(isolate); |
21776 fun->Call(v8::Undefined(isolate), 0, nullptr); | 23378 fun->Call(v8::Undefined(isolate), 0, nullptr); |
21777 CHECK(try_catch.HasCaught()); | 23379 CHECK(try_catch.HasCaught()); |
21778 } | 23380 } |
21779 | 23381 |
21780 { | 23382 { |
21781 v8::TryCatch try_catch(isolate); | 23383 v8::TryCatch try_catch(isolate); |
21782 v8::Handle<Value> args[] = {v8_num(42)}; | 23384 v8::Local<Value> args[] = {v8_num(42)}; |
21783 fun->Call(v8::Undefined(isolate), arraysize(args), args); | 23385 fun->Call(v8::Undefined(isolate), arraysize(args), args); |
21784 CHECK(!try_catch.HasCaught()); | 23386 CHECK(!try_catch.HasCaught()); |
21785 } | 23387 } |
21786 | 23388 |
21787 { | 23389 { |
21788 v8::TryCatch try_catch(isolate); | 23390 v8::TryCatch try_catch(isolate); |
21789 v8::Handle<Value> args[] = {v8_num(42), v8_num(555)}; | 23391 v8::Local<Value> args[] = {v8_num(42), v8_num(555)}; |
21790 fun->Call(v8::Undefined(isolate), arraysize(args), args); | 23392 fun->Call(v8::Undefined(isolate), arraysize(args), args); |
21791 CHECK(!try_catch.HasCaught()); | 23393 CHECK(!try_catch.HasCaught()); |
21792 } | 23394 } |
21793 } | 23395 } |
21794 | 23396 |
21795 | 23397 |
21796 TEST(StrongObjectDelete) { | 23398 TEST(StrongObjectDelete) { |
21797 i::FLAG_strong_mode = true; | 23399 i::FLAG_strong_mode = true; |
21798 LocalContext env; | 23400 LocalContext env; |
21799 v8::Isolate* isolate = env->GetIsolate(); | 23401 v8::Isolate* isolate = env->GetIsolate(); |
(...skipping 10 matching lines...) Expand all Loading... | |
21810 obj->ForceSet(v8_str("2"), v8_num(1), v8::None); | 23412 obj->ForceSet(v8_str("2"), v8_num(1), v8::None); |
21811 CHECK(obj->HasOwnProperty(v8_str("foo"))); | 23413 CHECK(obj->HasOwnProperty(v8_str("foo"))); |
21812 CHECK(obj->HasOwnProperty(v8_str("2"))); | 23414 CHECK(obj->HasOwnProperty(v8_str("2"))); |
21813 CHECK(!obj->Delete(v8_str("foo"))); | 23415 CHECK(!obj->Delete(v8_str("foo"))); |
21814 CHECK(!obj->Delete(2)); | 23416 CHECK(!obj->Delete(2)); |
21815 } | 23417 } |
21816 | 23418 |
21817 | 23419 |
21818 static void ExtrasBindingTestRuntimeFunction( | 23420 static void ExtrasBindingTestRuntimeFunction( |
21819 const v8::FunctionCallbackInfo<v8::Value>& args) { | 23421 const v8::FunctionCallbackInfo<v8::Value>& args) { |
21820 CHECK_EQ(3, args[0]->Int32Value()); | 23422 CHECK_EQ( |
23423 3, | |
23424 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust()); | |
21821 args.GetReturnValue().Set(v8_num(7)); | 23425 args.GetReturnValue().Set(v8_num(7)); |
21822 } | 23426 } |
21823 | 23427 |
21824 | 23428 |
21825 TEST(ExtrasBindingObject) { | 23429 TEST(ExtrasBindingObject) { |
21826 v8::Isolate* isolate = CcTest::isolate(); | 23430 v8::Isolate* isolate = CcTest::isolate(); |
21827 v8::HandleScope handle_scope(isolate); | 23431 v8::HandleScope handle_scope(isolate); |
21828 LocalContext env; | 23432 LocalContext env; |
21829 | 23433 |
21830 // standalone.gypi ensures we include the test-extra.js file, which should | 23434 // standalone.gypi ensures we include the test-extra.js file, which should |
21831 // export the tested functions. | 23435 // export the tested functions. |
21832 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); | 23436 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); |
21833 | 23437 |
21834 auto func = | 23438 auto func = |
21835 binding->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>(); | 23439 binding->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>(); |
21836 auto undefined = v8::Undefined(isolate); | 23440 auto undefined = v8::Undefined(isolate); |
21837 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); | 23441 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); |
21838 CHECK_EQ(5, result->Int32Value()); | 23442 CHECK_EQ(5, result->Int32Value(env.local()).FromJust()); |
21839 | 23443 |
21840 v8::Handle<v8::FunctionTemplate> runtimeFunction = | 23444 v8::Local<v8::FunctionTemplate> runtimeFunction = |
21841 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); | 23445 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); |
21842 binding->Set(v8_str("runtime"), runtimeFunction->GetFunction()); | 23446 binding->Set(v8_str("runtime"), |
23447 runtimeFunction->GetFunction(env.local()).ToLocalChecked()); | |
21843 func = | 23448 func = |
21844 binding->Get(v8_str("testExtraShouldCallToRuntime")).As<v8::Function>(); | 23449 binding->Get(v8_str("testExtraShouldCallToRuntime")).As<v8::Function>(); |
21845 result = func->Call(undefined, 0, {}).As<v8::Number>(); | 23450 result = func->Call(undefined, 0, {}).As<v8::Number>(); |
21846 CHECK_EQ(7, result->Int32Value()); | 23451 CHECK_EQ(7, result->Int32Value(env.local()).FromJust()); |
21847 } | 23452 } |
21848 | 23453 |
21849 | 23454 |
21850 TEST(ExperimentalExtras) { | 23455 TEST(ExperimentalExtras) { |
21851 i::FLAG_experimental_extras = true; | 23456 i::FLAG_experimental_extras = true; |
21852 | 23457 |
21853 v8::Isolate* isolate = CcTest::isolate(); | 23458 v8::Isolate* isolate = CcTest::isolate(); |
21854 v8::HandleScope handle_scope(isolate); | 23459 v8::HandleScope handle_scope(isolate); |
21855 LocalContext env; | 23460 LocalContext env; |
21856 | 23461 |
21857 // standalone.gypi ensures we include the test-experimental-extra.js file, | 23462 // standalone.gypi ensures we include the test-experimental-extra.js file, |
21858 // which should export the tested functions. | 23463 // which should export the tested functions. |
21859 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); | 23464 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); |
21860 | 23465 |
21861 auto func = binding->Get(v8_str("testExperimentalExtraShouldReturnTen")) | 23466 auto func = binding->Get(v8_str("testExperimentalExtraShouldReturnTen")) |
21862 .As<v8::Function>(); | 23467 .As<v8::Function>(); |
21863 auto undefined = v8::Undefined(isolate); | 23468 auto undefined = v8::Undefined(isolate); |
21864 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); | 23469 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); |
21865 CHECK_EQ(10, result->Int32Value()); | 23470 CHECK_EQ(10, result->Int32Value(env.local()).FromJust()); |
21866 | 23471 |
21867 v8::Handle<v8::FunctionTemplate> runtimeFunction = | 23472 v8::Local<v8::FunctionTemplate> runtimeFunction = |
21868 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); | 23473 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); |
21869 binding->Set(v8_str("runtime"), runtimeFunction->GetFunction()); | 23474 binding->Set(v8_str("runtime"), |
23475 runtimeFunction->GetFunction(env.local()).ToLocalChecked()); | |
21870 func = binding->Get(v8_str("testExperimentalExtraShouldCallToRuntime")) | 23476 func = binding->Get(v8_str("testExperimentalExtraShouldCallToRuntime")) |
21871 .As<v8::Function>(); | 23477 .As<v8::Function>(); |
21872 result = func->Call(undefined, 0, {}).As<v8::Number>(); | 23478 result = func->Call(undefined, 0, {}).As<v8::Number>(); |
21873 CHECK_EQ(7, result->Int32Value()); | 23479 CHECK_EQ(7, result->Int32Value(env.local()).FromJust()); |
21874 } | 23480 } |
21875 | 23481 |
21876 | 23482 |
21877 TEST(ExtrasUtilsObject) { | 23483 TEST(ExtrasUtilsObject) { |
21878 LocalContext context; | 23484 LocalContext context; |
21879 v8::Isolate* isolate = context->GetIsolate(); | 23485 v8::Isolate* isolate = context->GetIsolate(); |
21880 v8::HandleScope handle_scope(isolate); | 23486 v8::HandleScope handle_scope(isolate); |
21881 | 23487 |
21882 LocalContext env; | 23488 LocalContext env; |
21883 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); | 23489 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); |
21884 | 23490 |
21885 auto func = binding->Get(v8_str("testExtraCanUseUtils")).As<v8::Function>(); | 23491 auto func = binding->Get(v8_str("testExtraCanUseUtils")).As<v8::Function>(); |
21886 auto undefined = v8::Undefined(isolate); | 23492 auto undefined = v8::Undefined(isolate); |
21887 auto result = func->Call(undefined, 0, {}).As<v8::Object>(); | 23493 auto result = func->Call(undefined, 0, {}).As<v8::Object>(); |
21888 | 23494 |
21889 auto private_symbol = result->Get(v8_str("privateSymbol")).As<v8::Symbol>(); | 23495 auto private_symbol = result->Get(v8_str("privateSymbol")).As<v8::Symbol>(); |
21890 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol); | 23496 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol); |
21891 CHECK_EQ(true, ips->IsPrivate()); | 23497 CHECK_EQ(true, ips->IsPrivate()); |
21892 | 23498 |
21893 CompileRun("var result = 0; function store(x) { result = x; }"); | 23499 CompileRun("var result = 0; function store(x) { result = x; }"); |
21894 auto store = CompileRun("store").As<v8::Function>(); | 23500 auto store = CompileRun("store").As<v8::Function>(); |
21895 | 23501 |
21896 auto fulfilled_promise = | 23502 auto fulfilled_promise = |
21897 result->Get(v8_str("fulfilledPromise")).As<v8::Promise>(); | 23503 result->Get(v8_str("fulfilledPromise")).As<v8::Promise>(); |
21898 fulfilled_promise->Then(store); | 23504 fulfilled_promise->Then(store); |
21899 isolate->RunMicrotasks(); | 23505 isolate->RunMicrotasks(); |
21900 CHECK_EQ(1, CompileRun("result")->Int32Value()); | 23506 CHECK_EQ(1, CompileRun("result")->Int32Value(env.local()).FromJust()); |
21901 | 23507 |
21902 auto fulfilled_promise_2 = | 23508 auto fulfilled_promise_2 = |
21903 result->Get(v8_str("fulfilledPromise2")).As<v8::Promise>(); | 23509 result->Get(v8_str("fulfilledPromise2")).As<v8::Promise>(); |
21904 fulfilled_promise_2->Then(store); | 23510 fulfilled_promise_2->Then(store); |
21905 isolate->RunMicrotasks(); | 23511 isolate->RunMicrotasks(); |
21906 CHECK_EQ(2, CompileRun("result")->Int32Value()); | 23512 CHECK_EQ(2, CompileRun("result")->Int32Value(env.local()).FromJust()); |
21907 | 23513 |
21908 auto rejected_promise = | 23514 auto rejected_promise = |
21909 result->Get(v8_str("rejectedPromise")).As<v8::Promise>(); | 23515 result->Get(v8_str("rejectedPromise")).As<v8::Promise>(); |
21910 rejected_promise->Catch(store); | 23516 rejected_promise->Catch(store); |
21911 isolate->RunMicrotasks(); | 23517 isolate->RunMicrotasks(); |
21912 CHECK_EQ(3, CompileRun("result")->Int32Value()); | 23518 CHECK_EQ(3, CompileRun("result")->Int32Value(env.local()).FromJust()); |
21913 } | 23519 } |
21914 | 23520 |
21915 | 23521 |
21916 TEST(Map) { | 23522 TEST(Map) { |
21917 v8::Isolate* isolate = CcTest::isolate(); | 23523 v8::Isolate* isolate = CcTest::isolate(); |
21918 v8::HandleScope handle_scope(isolate); | 23524 v8::HandleScope handle_scope(isolate); |
21919 LocalContext env; | 23525 LocalContext env; |
21920 | 23526 |
21921 v8::Local<v8::Map> map = v8::Map::New(isolate); | 23527 v8::Local<v8::Map> map = v8::Map::New(isolate); |
21922 CHECK(map->IsObject()); | 23528 CHECK(map->IsObject()); |
(...skipping 16 matching lines...) Expand all Loading... | |
21939 CHECK_EQ(2U, map->Size()); | 23545 CHECK_EQ(2U, map->Size()); |
21940 | 23546 |
21941 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust()); | 23547 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust()); |
21942 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust()); | 23548 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust()); |
21943 | 23549 |
21944 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust()); | 23550 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust()); |
21945 CHECK(!map->Has(env.local(), map).FromJust()); | 23551 CHECK(!map->Has(env.local(), map).FromJust()); |
21946 | 23552 |
21947 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1)) | 23553 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1)) |
21948 .ToLocalChecked() | 23554 .ToLocalChecked() |
21949 ->Int32Value()); | 23555 ->Int32Value(env.local()) |
23556 .FromJust()); | |
21950 CHECK_EQ(4, map->Get(env.local(), v8::Integer::New(isolate, 3)) | 23557 CHECK_EQ(4, map->Get(env.local(), v8::Integer::New(isolate, 3)) |
21951 .ToLocalChecked() | 23558 .ToLocalChecked() |
21952 ->Int32Value()); | 23559 ->Int32Value(env.local()) |
23560 .FromJust()); | |
21953 | 23561 |
21954 CHECK(map->Get(env.local(), v8::Integer::New(isolate, 42)) | 23562 CHECK(map->Get(env.local(), v8::Integer::New(isolate, 42)) |
21955 .ToLocalChecked() | 23563 .ToLocalChecked() |
21956 ->IsUndefined()); | 23564 ->IsUndefined()); |
21957 | 23565 |
21958 CHECK(!map->Set(env.local(), map, map).IsEmpty()); | 23566 CHECK(!map->Set(env.local(), map, map).IsEmpty()); |
21959 CHECK_EQ(3U, map->Size()); | 23567 CHECK_EQ(3U, map->Size()); |
21960 CHECK(map->Has(env.local(), map).FromJust()); | 23568 CHECK(map->Has(env.local(), map).FromJust()); |
21961 | 23569 |
21962 CHECK(map->Delete(env.local(), map).FromJust()); | 23570 CHECK(map->Delete(env.local(), map).FromJust()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
22016 v8::Isolate* isolate = CcTest::isolate(); | 23624 v8::Isolate* isolate = CcTest::isolate(); |
22017 v8::HandleScope scope(isolate); | 23625 v8::HandleScope scope(isolate); |
22018 v8::Local<v8::FunctionTemplate> parent = FunctionTemplate::New(isolate); | 23626 v8::Local<v8::FunctionTemplate> parent = FunctionTemplate::New(isolate); |
22019 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, parent); | 23627 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, parent); |
22020 auto returns_42 = | 23628 auto returns_42 = |
22021 v8::FunctionTemplate::New(isolate, Returns42, Local<Value>(), signature); | 23629 v8::FunctionTemplate::New(isolate, Returns42, Local<Value>(), signature); |
22022 parent->PrototypeTemplate()->SetAccessorProperty(v8_str("age"), returns_42); | 23630 parent->PrototypeTemplate()->SetAccessorProperty(v8_str("age"), returns_42); |
22023 v8::Local<v8::FunctionTemplate> child = v8::FunctionTemplate::New(isolate); | 23631 v8::Local<v8::FunctionTemplate> child = v8::FunctionTemplate::New(isolate); |
22024 child->Inherit(parent); | 23632 child->Inherit(parent); |
22025 LocalContext env; | 23633 LocalContext env; |
22026 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 23634 CHECK(env->Global() |
23635 ->Set(env.local(), v8_str("Child"), | |
23636 child->GetFunction(env.local()).ToLocalChecked()) | |
23637 .FromJust()); | |
22027 | 23638 |
22028 // Make sure there's a compiled stub for "Child.prototype.age" in the cache. | 23639 // Make sure there's a compiled stub for "Child.prototype.age" in the cache. |
22029 CompileRun( | 23640 CompileRun( |
22030 "var real = new Child();\n" | 23641 "var real = new Child();\n" |
22031 "for (var i = 0; i < 3; ++i) {\n" | 23642 "for (var i = 0; i < 3; ++i) {\n" |
22032 " real.age;\n" | 23643 " real.age;\n" |
22033 "}\n"); | 23644 "}\n"); |
22034 | 23645 |
22035 // Check that the cached stub is never used. | 23646 // Check that the cached stub is never used. |
22036 ExpectInt32( | 23647 ExpectInt32( |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
22099 | 23710 |
22100 bool NoAbortOnUncaughtException(v8::Isolate* isolate) { | 23711 bool NoAbortOnUncaughtException(v8::Isolate* isolate) { |
22101 ++nb_uncaught_exception_callback_calls; | 23712 ++nb_uncaught_exception_callback_calls; |
22102 return false; | 23713 return false; |
22103 } | 23714 } |
22104 | 23715 |
22105 | 23716 |
22106 TEST(AbortOnUncaughtExceptionNoAbort) { | 23717 TEST(AbortOnUncaughtExceptionNoAbort) { |
22107 v8::Isolate* isolate = CcTest::isolate(); | 23718 v8::Isolate* isolate = CcTest::isolate(); |
22108 v8::HandleScope handle_scope(isolate); | 23719 v8::HandleScope handle_scope(isolate); |
22109 v8::Handle<v8::ObjectTemplate> global_template = | 23720 v8::Local<v8::ObjectTemplate> global_template = |
22110 v8::ObjectTemplate::New(isolate); | 23721 v8::ObjectTemplate::New(isolate); |
22111 LocalContext env(NULL, global_template); | 23722 LocalContext env(NULL, global_template); |
22112 | 23723 |
22113 i::FLAG_abort_on_uncaught_exception = true; | 23724 i::FLAG_abort_on_uncaught_exception = true; |
22114 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException); | 23725 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException); |
22115 | 23726 |
22116 CompileRun("function boom() { throw new Error(\"boom\") }"); | 23727 CompileRun("function boom() { throw new Error(\"boom\") }"); |
22117 | 23728 |
22118 v8::Local<v8::Object> global_object = env->Global(); | 23729 v8::Local<v8::Object> global_object = env->Global(); |
22119 v8::Local<v8::Function> foo = | 23730 v8::Local<v8::Function> foo = |
22120 v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); | 23731 v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); |
22121 | 23732 |
22122 foo->Call(global_object, 0, NULL); | 23733 foo->Call(global_object, 0, NULL); |
22123 | 23734 |
22124 CHECK_EQ(1, nb_uncaught_exception_callback_calls); | 23735 CHECK_EQ(1, nb_uncaught_exception_callback_calls); |
22125 } | 23736 } |
22126 | 23737 |
22127 | 23738 |
22128 TEST(AccessCheckedIsConcatSpreadable) { | 23739 TEST(AccessCheckedIsConcatSpreadable) { |
22129 i::FLAG_harmony_concat_spreadable = true; | 23740 i::FLAG_harmony_concat_spreadable = true; |
22130 v8::Isolate* isolate = CcTest::isolate(); | 23741 v8::Isolate* isolate = CcTest::isolate(); |
22131 HandleScope scope(isolate); | 23742 HandleScope scope(isolate); |
22132 LocalContext env; | 23743 LocalContext env; |
22133 | 23744 |
22134 // Object with access check | 23745 // Object with access check |
22135 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); | 23746 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); |
22136 spreadable_template->SetAccessCheckCallback(AccessBlocker); | 23747 spreadable_template->SetAccessCheckCallback(AccessBlocker); |
22137 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), | 23748 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), |
22138 v8::Boolean::New(isolate, true)); | 23749 v8::Boolean::New(isolate, true)); |
22139 Local<Object> object = spreadable_template->NewInstance(); | 23750 Local<Object> object = |
23751 spreadable_template->NewInstance(env.local()).ToLocalChecked(); | |
22140 | 23752 |
22141 allowed_access = true; | 23753 allowed_access = true; |
22142 env->Global()->Set(v8_str("object"), object); | 23754 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust()); |
22143 object->Set(v8_str("length"), v8_num(2)); | 23755 object->Set(v8_str("length"), v8_num(2)); |
22144 object->Set(0U, v8_str("a")); | 23756 object->Set(0U, v8_str("a")); |
22145 object->Set(1U, v8_str("b")); | 23757 object->Set(1U, v8_str("b")); |
22146 | 23758 |
22147 // Access check is allowed, and the object is spread | 23759 // Access check is allowed, and the object is spread |
22148 CompileRun("var result = [].concat(object)"); | 23760 CompileRun("var result = [].concat(object)"); |
22149 ExpectTrue("Array.isArray(result)"); | 23761 ExpectTrue("Array.isArray(result)"); |
22150 ExpectString("result[0]", "a"); | 23762 ExpectString("result[0]", "a"); |
22151 ExpectString("result[1]", "b"); | 23763 ExpectString("result[1]", "b"); |
22152 ExpectTrue("result.length === 2"); | 23764 ExpectTrue("result.length === 2"); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
22201 | 23813 |
22202 | 23814 |
22203 TEST(ObjectTemplateIntrinsics) { | 23815 TEST(ObjectTemplateIntrinsics) { |
22204 v8::Isolate* isolate = CcTest::isolate(); | 23816 v8::Isolate* isolate = CcTest::isolate(); |
22205 v8::HandleScope scope(isolate); | 23817 v8::HandleScope scope(isolate); |
22206 LocalContext env; | 23818 LocalContext env; |
22207 | 23819 |
22208 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); | 23820 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); |
22209 object_template->SetIntrinsicDataProperty(v8_str("values"), | 23821 object_template->SetIntrinsicDataProperty(v8_str("values"), |
22210 v8::kArrayProto_values); | 23822 v8::kArrayProto_values); |
22211 Local<Object> object = object_template->NewInstance(); | 23823 Local<Object> object = |
23824 object_template->NewInstance(env.local()).ToLocalChecked(); | |
22212 | 23825 |
22213 env->Global()->Set(v8_str("obj1"), object); | 23826 CHECK(env->Global()->Set(env.local(), v8_str("obj1"), object).FromJust()); |
22214 ExpectString("typeof obj1.values", "function"); | 23827 ExpectString("typeof obj1.values", "function"); |
22215 | 23828 |
22216 auto values = Local<Function>::Cast(object->Get(v8_str("values"))); | 23829 auto values = Local<Function>::Cast(object->Get(v8_str("values"))); |
22217 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values)); | 23830 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values)); |
22218 auto ctx = v8::Utils::OpenHandle(*env.local()); | 23831 auto ctx = v8::Utils::OpenHandle(*env.local()); |
22219 CHECK_EQ(fn->GetCreationContext(), *ctx); | 23832 CHECK_EQ(fn->GetCreationContext(), *ctx); |
22220 | 23833 |
22221 { | 23834 { |
22222 LocalContext env2; | 23835 LocalContext env2; |
22223 Local<Object> object2 = object_template->NewInstance(); | 23836 Local<Object> object2 = |
22224 env2->Global()->Set(v8_str("obj2"), object2); | 23837 object_template->NewInstance(env2.local()).ToLocalChecked(); |
23838 CHECK( | |
23839 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust()); | |
22225 ExpectString("typeof obj2.values", "function"); | 23840 ExpectString("typeof obj2.values", "function"); |
22226 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); | 23841 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); |
22227 | 23842 |
22228 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); | 23843 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); |
22229 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); | 23844 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); |
22230 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); | 23845 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); |
22231 CHECK_EQ(fn2->GetCreationContext(), *ctx2); | 23846 CHECK_EQ(fn2->GetCreationContext(), *ctx2); |
22232 } | 23847 } |
22233 } | 23848 } |
OLD | NEW |