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

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

Issue 1427643005: Remove usage of deprecated APIs from test-api.cc. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove edit artefacts. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/cctest.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 #include "test/cctest/heap-tester.h" 53 #include "test/cctest/heap-tester.h"
54 54
55 static const bool kLogThreading = false; 55 static const bool kLogThreading = false;
56 56
57 using ::v8::Boolean; 57 using ::v8::Boolean;
58 using ::v8::BooleanObject; 58 using ::v8::BooleanObject;
59 using ::v8::Context; 59 using ::v8::Context;
60 using ::v8::Extension; 60 using ::v8::Extension;
61 using ::v8::Function; 61 using ::v8::Function;
62 using ::v8::FunctionTemplate; 62 using ::v8::FunctionTemplate;
63 using ::v8::Handle;
64 using ::v8::HandleScope; 63 using ::v8::HandleScope;
65 using ::v8::Local; 64 using ::v8::Local;
66 using ::v8::Maybe; 65 using ::v8::Maybe;
67 using ::v8::Message; 66 using ::v8::Message;
68 using ::v8::MessageCallback; 67 using ::v8::MessageCallback;
69 using ::v8::Name; 68 using ::v8::Name;
70 using ::v8::None; 69 using ::v8::None;
71 using ::v8::Object; 70 using ::v8::Object;
72 using ::v8::ObjectTemplate; 71 using ::v8::ObjectTemplate;
73 using ::v8::Persistent; 72 using ::v8::Persistent;
(...skipping 13 matching lines...) Expand all
87 static void Test##Name(); \ 86 static void Test##Name(); \
88 TEST(Name##WithProfiler) { \ 87 TEST(Name##WithProfiler) { \
89 RunWithProfiler(&Test##Name); \ 88 RunWithProfiler(&Test##Name); \
90 } \ 89 } \
91 THREADED_TEST(Name) 90 THREADED_TEST(Name)
92 91
93 92
94 void RunWithProfiler(void (*test)()) { 93 void RunWithProfiler(void (*test)()) {
95 LocalContext env; 94 LocalContext env;
96 v8::HandleScope scope(env->GetIsolate()); 95 v8::HandleScope scope(env->GetIsolate());
97 v8::Local<v8::String> profile_name = 96 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(); 97 v8::CpuProfiler* cpu_profiler = env->GetIsolate()->GetCpuProfiler();
100 98
101 cpu_profiler->StartProfiling(profile_name); 99 cpu_profiler->StartProfiling(profile_name);
102 (*test)(); 100 (*test)();
103 reinterpret_cast<i::CpuProfiler*>(cpu_profiler)->DeleteAllProfiles(); 101 reinterpret_cast<i::CpuProfiler*>(cpu_profiler)->DeleteAllProfiles();
104 } 102 }
105 103
106 104
107 static int signature_callback_count; 105 static int signature_callback_count;
108 static Local<Value> signature_expected_receiver; 106 static Local<Value> signature_expected_receiver;
109 static void IncrementingSignatureCallback( 107 static void IncrementingSignatureCallback(
110 const v8::FunctionCallbackInfo<v8::Value>& args) { 108 const v8::FunctionCallbackInfo<v8::Value>& args) {
111 ApiTestFuzzer::Fuzz(); 109 ApiTestFuzzer::Fuzz();
112 signature_callback_count++; 110 signature_callback_count++;
113 CHECK(signature_expected_receiver->Equals(args.Holder())); 111 CHECK(signature_expected_receiver->Equals(
114 CHECK(signature_expected_receiver->Equals(args.This())); 112 args.GetIsolate()->GetCurrentContext(),
115 v8::Handle<v8::Array> result = 113 args.Holder())
114 .FromJust());
115 CHECK(signature_expected_receiver->Equals(
116 args.GetIsolate()->GetCurrentContext(),
117 args.This())
118 .FromJust());
119 v8::Local<v8::Array> result =
116 v8::Array::New(args.GetIsolate(), args.Length()); 120 v8::Array::New(args.GetIsolate(), args.Length());
117 for (int i = 0; i < args.Length(); i++) 121 for (int i = 0; i < args.Length(); i++) {
118 result->Set(v8::Integer::New(args.GetIsolate(), i), args[i]); 122 CHECK(result->Set(args.GetIsolate()->GetCurrentContext(),
123 v8::Integer::New(args.GetIsolate(), i), args[i])
124 .FromJust());
125 }
119 args.GetReturnValue().Set(result); 126 args.GetReturnValue().Set(result);
120 } 127 }
121 128
122 129
123 static void Returns42(const v8::FunctionCallbackInfo<v8::Value>& info) { 130 static void Returns42(const v8::FunctionCallbackInfo<v8::Value>& info) {
124 info.GetReturnValue().Set(42); 131 info.GetReturnValue().Set(42);
125 } 132 }
126 133
127 134
128 // Tests that call v8::V8::Dispose() cannot be threaded. 135 // Tests that call v8::V8::Dispose() cannot be threaded.
(...skipping 18 matching lines...) Expand all
147 Local<Context> local_env; 154 Local<Context> local_env;
148 { 155 {
149 LocalContext env; 156 LocalContext env;
150 local_env = env.local(); 157 local_env = env.local();
151 } 158 }
152 159
153 // Local context should still be live. 160 // Local context should still be live.
154 CHECK(!local_env.IsEmpty()); 161 CHECK(!local_env.IsEmpty());
155 local_env->Enter(); 162 local_env->Enter();
156 163
157 v8::Handle<v8::Primitive> undef = v8::Undefined(CcTest::isolate()); 164 v8::Local<v8::Primitive> undef = v8::Undefined(CcTest::isolate());
158 CHECK(!undef.IsEmpty()); 165 CHECK(!undef.IsEmpty());
159 CHECK(undef->IsUndefined()); 166 CHECK(undef->IsUndefined());
160 167
161 const char* source = "1 + 2 + 3"; 168 const char* source = "1 + 2 + 3";
162 Local<Script> script = v8_compile(source); 169 Local<Script> script = v8_compile(source);
163 CHECK_EQ(6, script->Run()->Int32Value()); 170 CHECK_EQ(6, v8_run_int32value(script));
164 171
165 local_env->Exit(); 172 local_env->Exit();
166 } 173 }
167 174
168 175
169 THREADED_TEST(IsolateOfContext) { 176 THREADED_TEST(IsolateOfContext) {
170 v8::HandleScope scope(CcTest::isolate()); 177 v8::HandleScope scope(CcTest::isolate());
171 v8::Handle<Context> env = Context::New(CcTest::isolate()); 178 v8::Local<Context> env = Context::New(CcTest::isolate());
172 179
173 CHECK(!env->GetIsolate()->InContext()); 180 CHECK(!env->GetIsolate()->InContext());
174 CHECK(env->GetIsolate() == CcTest::isolate()); 181 CHECK(env->GetIsolate() == CcTest::isolate());
175 env->Enter(); 182 env->Enter();
176 CHECK(env->GetIsolate()->InContext()); 183 CHECK(env->GetIsolate()->InContext());
177 CHECK(env->GetIsolate() == CcTest::isolate()); 184 CHECK(env->GetIsolate() == CcTest::isolate());
178 env->Exit(); 185 env->Exit();
179 CHECK(!env->GetIsolate()->InContext()); 186 CHECK(!env->GetIsolate()->InContext());
180 CHECK(env->GetIsolate() == CcTest::isolate()); 187 CHECK(env->GetIsolate() == CcTest::isolate());
181 } 188 }
(...skipping 10 matching lines...) Expand all
192 signature_callback_count = 0; 199 signature_callback_count = 0;
193 signature_expected_receiver = receiver; 200 signature_expected_receiver = receiver;
194 bool expected_to_throw = receiver.IsEmpty(); 201 bool expected_to_throw = receiver.IsEmpty();
195 v8::TryCatch try_catch(isolate); 202 v8::TryCatch try_catch(isolate);
196 CompileRun(source.start()); 203 CompileRun(source.start());
197 CHECK_EQ(expected_to_throw, try_catch.HasCaught()); 204 CHECK_EQ(expected_to_throw, try_catch.HasCaught());
198 if (!expected_to_throw) { 205 if (!expected_to_throw) {
199 CHECK_EQ(10, signature_callback_count); 206 CHECK_EQ(10, signature_callback_count);
200 } else { 207 } else {
201 CHECK(v8_str("TypeError: Illegal invocation") 208 CHECK(v8_str("TypeError: Illegal invocation")
202 ->Equals(try_catch.Exception()->ToString(isolate))); 209 ->Equals(isolate->GetCurrentContext(),
210 try_catch.Exception()
211 ->ToString(isolate->GetCurrentContext())
212 .ToLocalChecked())
213 .FromJust());
203 } 214 }
204 } 215 }
205 216
206 217
207 THREADED_TEST(ReceiverSignature) { 218 THREADED_TEST(ReceiverSignature) {
208 LocalContext env; 219 LocalContext env;
209 v8::Isolate* isolate = env->GetIsolate(); 220 v8::Isolate* isolate = env->GetIsolate();
210 v8::HandleScope scope(isolate); 221 v8::HandleScope scope(isolate);
211 // Setup templates. 222 // Setup templates.
212 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); 223 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
213 v8::Handle<v8::Signature> sig = v8::Signature::New(isolate, fun); 224 v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun);
214 v8::Handle<v8::FunctionTemplate> callback_sig = 225 v8::Local<v8::FunctionTemplate> callback_sig = v8::FunctionTemplate::New(
215 v8::FunctionTemplate::New( 226 isolate, IncrementingSignatureCallback, Local<Value>(), sig);
216 isolate, IncrementingSignatureCallback, Local<Value>(), sig); 227 v8::Local<v8::FunctionTemplate> callback =
217 v8::Handle<v8::FunctionTemplate> callback =
218 v8::FunctionTemplate::New(isolate, IncrementingSignatureCallback); 228 v8::FunctionTemplate::New(isolate, IncrementingSignatureCallback);
219 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(isolate); 229 v8::Local<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(isolate);
220 sub_fun->Inherit(fun); 230 sub_fun->Inherit(fun);
221 v8::Handle<v8::FunctionTemplate> unrel_fun = 231 v8::Local<v8::FunctionTemplate> unrel_fun =
222 v8::FunctionTemplate::New(isolate); 232 v8::FunctionTemplate::New(isolate);
223 // Install properties. 233 // Install properties.
224 v8::Handle<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); 234 v8::Local<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate();
225 fun_proto->Set(v8_str("prop_sig"), callback_sig); 235 fun_proto->Set(v8_str("prop_sig"), callback_sig);
226 fun_proto->Set(v8_str("prop"), callback); 236 fun_proto->Set(v8_str("prop"), callback);
227 fun_proto->SetAccessorProperty( 237 fun_proto->SetAccessorProperty(
228 v8_str("accessor_sig"), callback_sig, callback_sig); 238 v8_str("accessor_sig"), callback_sig, callback_sig);
229 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); 239 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback);
230 // Instantiate templates. 240 // Instantiate templates.
231 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); 241 Local<Value> fun_instance =
232 Local<Value> sub_fun_instance = sub_fun->InstanceTemplate()->NewInstance(); 242 fun->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked();
243 Local<Value> sub_fun_instance =
244 sub_fun->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked();
233 // Setup global variables. 245 // Setup global variables.
234 env->Global()->Set(v8_str("Fun"), fun->GetFunction()); 246 CHECK(env->Global()
235 env->Global()->Set(v8_str("UnrelFun"), unrel_fun->GetFunction()); 247 ->Set(env.local(), v8_str("Fun"),
236 env->Global()->Set(v8_str("fun_instance"), fun_instance); 248 fun->GetFunction(env.local()).ToLocalChecked())
237 env->Global()->Set(v8_str("sub_fun_instance"), sub_fun_instance); 249 .FromJust());
250 CHECK(env->Global()
251 ->Set(env.local(), v8_str("UnrelFun"),
252 unrel_fun->GetFunction(env.local()).ToLocalChecked())
253 .FromJust());
254 CHECK(env->Global()
255 ->Set(env.local(), v8_str("fun_instance"), fun_instance)
256 .FromJust());
257 CHECK(env->Global()
258 ->Set(env.local(), v8_str("sub_fun_instance"), sub_fun_instance)
259 .FromJust());
238 CompileRun( 260 CompileRun(
239 "var accessor_sig_key = 'accessor_sig';" 261 "var accessor_sig_key = 'accessor_sig';"
240 "var accessor_key = 'accessor';" 262 "var accessor_key = 'accessor';"
241 "var prop_sig_key = 'prop_sig';" 263 "var prop_sig_key = 'prop_sig';"
242 "var prop_key = 'prop';" 264 "var prop_key = 'prop';"
243 "" 265 ""
244 "function copy_props(obj) {" 266 "function copy_props(obj) {"
245 " var keys = [accessor_sig_key, accessor_key, prop_sig_key, prop_key];" 267 " var keys = [accessor_sig_key, accessor_key, prop_sig_key, prop_key];"
246 " var source = Fun.prototype;" 268 " var source = Fun.prototype;"
247 " for (var i in keys) {" 269 " for (var i in keys) {"
(...skipping 28 matching lines...) Expand all
276 TestSignature("test_object.accessor_sig = 1;", test_object, isolate); 298 TestSignature("test_object.accessor_sig = 1;", test_object, isolate);
277 TestSignature("test_object[accessor_sig_key] = 1;", test_object, isolate); 299 TestSignature("test_object[accessor_sig_key] = 1;", test_object, isolate);
278 } 300 }
279 } 301 }
280 302
281 303
282 THREADED_TEST(HulIgennem) { 304 THREADED_TEST(HulIgennem) {
283 LocalContext env; 305 LocalContext env;
284 v8::Isolate* isolate = env->GetIsolate(); 306 v8::Isolate* isolate = env->GetIsolate();
285 v8::HandleScope scope(isolate); 307 v8::HandleScope scope(isolate);
286 v8::Handle<v8::Primitive> undef = v8::Undefined(isolate); 308 v8::Local<v8::Primitive> undef = v8::Undefined(isolate);
287 Local<String> undef_str = undef->ToString(isolate); 309 Local<String> undef_str = undef->ToString(env.local()).ToLocalChecked();
288 char* value = i::NewArray<char>(undef_str->Utf8Length() + 1); 310 char* value = i::NewArray<char>(undef_str->Utf8Length() + 1);
289 undef_str->WriteUtf8(value); 311 undef_str->WriteUtf8(value);
290 CHECK_EQ(0, strcmp(value, "undefined")); 312 CHECK_EQ(0, strcmp(value, "undefined"));
291 i::DeleteArray(value); 313 i::DeleteArray(value);
292 } 314 }
293 315
294 316
295 THREADED_TEST(Access) { 317 THREADED_TEST(Access) {
296 LocalContext env; 318 LocalContext env;
297 v8::Isolate* isolate = env->GetIsolate(); 319 v8::Isolate* isolate = env->GetIsolate();
298 v8::HandleScope scope(isolate); 320 v8::HandleScope scope(isolate);
299 Local<v8::Object> obj = v8::Object::New(isolate); 321 Local<v8::Object> obj = v8::Object::New(isolate);
300 Local<Value> foo_before = obj->Get(v8_str("foo")); 322 Local<Value> foo_before =
323 obj->Get(env.local(), v8_str("foo")).ToLocalChecked();
301 CHECK(foo_before->IsUndefined()); 324 CHECK(foo_before->IsUndefined());
302 Local<String> bar_str = v8_str("bar"); 325 Local<String> bar_str = v8_str("bar");
303 obj->Set(v8_str("foo"), bar_str); 326 CHECK(obj->Set(env.local(), v8_str("foo"), bar_str).FromJust());
304 Local<Value> foo_after = obj->Get(v8_str("foo")); 327 Local<Value> foo_after =
328 obj->Get(env.local(), v8_str("foo")).ToLocalChecked();
305 CHECK(!foo_after->IsUndefined()); 329 CHECK(!foo_after->IsUndefined());
306 CHECK(foo_after->IsString()); 330 CHECK(foo_after->IsString());
307 CHECK(bar_str->Equals(foo_after)); 331 CHECK(bar_str->Equals(env.local(), foo_after).FromJust());
308 } 332 }
309 333
310 334
311 THREADED_TEST(AccessElement) { 335 THREADED_TEST(AccessElement) {
312 LocalContext env; 336 LocalContext env;
313 v8::HandleScope scope(env->GetIsolate()); 337 v8::HandleScope scope(env->GetIsolate());
314 Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); 338 Local<v8::Object> obj = v8::Object::New(env->GetIsolate());
315 Local<Value> before = obj->Get(1); 339 Local<Value> before = obj->Get(env.local(), 1).ToLocalChecked();
316 CHECK(before->IsUndefined()); 340 CHECK(before->IsUndefined());
317 Local<String> bar_str = v8_str("bar"); 341 Local<String> bar_str = v8_str("bar");
318 obj->Set(1, bar_str); 342 CHECK(obj->Set(env.local(), 1, bar_str).FromJust());
319 Local<Value> after = obj->Get(1); 343 Local<Value> after = obj->Get(env.local(), 1).ToLocalChecked();
320 CHECK(!after->IsUndefined()); 344 CHECK(!after->IsUndefined());
321 CHECK(after->IsString()); 345 CHECK(after->IsString());
322 CHECK(bar_str->Equals(after)); 346 CHECK(bar_str->Equals(env.local(), after).FromJust());
323 347
324 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>(); 348 Local<v8::Array> value = CompileRun("[\"a\", \"b\"]").As<v8::Array>();
325 CHECK(v8_str("a")->Equals(value->Get(0))); 349 CHECK(v8_str("a")
326 CHECK(v8_str("b")->Equals(value->Get(1))); 350 ->Equals(env.local(), value->Get(env.local(), 0).ToLocalChecked())
351 .FromJust());
352 CHECK(v8_str("b")
353 ->Equals(env.local(), value->Get(env.local(), 1).ToLocalChecked())
354 .FromJust());
327 } 355 }
328 356
329 357
330 THREADED_TEST(Script) { 358 THREADED_TEST(Script) {
331 LocalContext env; 359 LocalContext env;
332 v8::HandleScope scope(env->GetIsolate()); 360 v8::HandleScope scope(env->GetIsolate());
333 const char* source = "1 + 2 + 3"; 361 const char* source = "1 + 2 + 3";
334 Local<Script> script = v8_compile(source); 362 Local<Script> script = v8_compile(source);
335 CHECK_EQ(6, script->Run()->Int32Value()); 363 CHECK_EQ(6, v8_run_int32value(script));
336 } 364 }
337 365
338 366
339 class TestResource: public String::ExternalStringResource { 367 class TestResource: public String::ExternalStringResource {
340 public: 368 public:
341 explicit TestResource(uint16_t* data, int* counter = NULL, 369 explicit TestResource(uint16_t* data, int* counter = NULL,
342 bool owning_data = true) 370 bool owning_data = true)
343 : data_(data), length_(0), counter_(counter), owning_data_(owning_data) { 371 : data_(data), length_(0), counter_(counter), owning_data_(owning_data) {
344 while (data[length_]) ++length_; 372 while (data[length_]) ++length_;
345 } 373 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
396 424
397 425
398 THREADED_TEST(ScriptUsingStringResource) { 426 THREADED_TEST(ScriptUsingStringResource) {
399 int dispose_count = 0; 427 int dispose_count = 0;
400 const char* c_source = "1 + 2 * 3"; 428 const char* c_source = "1 + 2 * 3";
401 uint16_t* two_byte_source = AsciiToTwoByteString(c_source); 429 uint16_t* two_byte_source = AsciiToTwoByteString(c_source);
402 { 430 {
403 LocalContext env; 431 LocalContext env;
404 v8::HandleScope scope(env->GetIsolate()); 432 v8::HandleScope scope(env->GetIsolate());
405 TestResource* resource = new TestResource(two_byte_source, &dispose_count); 433 TestResource* resource = new TestResource(two_byte_source, &dispose_count);
406 Local<String> source = String::NewExternal(env->GetIsolate(), resource); 434 Local<String> source =
435 String::NewExternalTwoByte(env->GetIsolate(), resource)
436 .ToLocalChecked();
407 Local<Script> script = v8_compile(source); 437 Local<Script> script = v8_compile(source);
408 Local<Value> value = script->Run(); 438 Local<Value> value = script->Run(env.local()).ToLocalChecked();
409 CHECK(value->IsNumber()); 439 CHECK(value->IsNumber());
410 CHECK_EQ(7, value->Int32Value()); 440 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
411 CHECK(source->IsExternal()); 441 CHECK(source->IsExternal());
412 CHECK_EQ(resource, 442 CHECK_EQ(resource,
413 static_cast<TestResource*>(source->GetExternalStringResource())); 443 static_cast<TestResource*>(source->GetExternalStringResource()));
414 String::Encoding encoding = String::UNKNOWN_ENCODING; 444 String::Encoding encoding = String::UNKNOWN_ENCODING;
415 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), 445 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource),
416 source->GetExternalStringResourceBase(&encoding)); 446 source->GetExternalStringResourceBase(&encoding));
417 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding); 447 CHECK_EQ(String::TWO_BYTE_ENCODING, encoding);
418 CcTest::heap()->CollectAllGarbage(); 448 CcTest::heap()->CollectAllGarbage();
419 CHECK_EQ(0, dispose_count); 449 CHECK_EQ(0, dispose_count);
420 } 450 }
421 CcTest::i_isolate()->compilation_cache()->Clear(); 451 CcTest::i_isolate()->compilation_cache()->Clear();
422 CcTest::heap()->CollectAllAvailableGarbage(); 452 CcTest::heap()->CollectAllAvailableGarbage();
423 CHECK_EQ(1, dispose_count); 453 CHECK_EQ(1, dispose_count);
424 } 454 }
425 455
426 456
427 THREADED_TEST(ScriptUsingOneByteStringResource) { 457 THREADED_TEST(ScriptUsingOneByteStringResource) {
428 int dispose_count = 0; 458 int dispose_count = 0;
429 const char* c_source = "1 + 2 * 3"; 459 const char* c_source = "1 + 2 * 3";
430 { 460 {
431 LocalContext env; 461 LocalContext env;
432 v8::HandleScope scope(env->GetIsolate()); 462 v8::HandleScope scope(env->GetIsolate());
433 TestOneByteResource* resource = 463 TestOneByteResource* resource =
434 new TestOneByteResource(i::StrDup(c_source), &dispose_count); 464 new TestOneByteResource(i::StrDup(c_source), &dispose_count);
435 Local<String> source = String::NewExternal(env->GetIsolate(), resource); 465 Local<String> source =
466 String::NewExternalOneByte(env->GetIsolate(), resource)
467 .ToLocalChecked();
436 CHECK(source->IsExternalOneByte()); 468 CHECK(source->IsExternalOneByte());
437 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), 469 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource),
438 source->GetExternalOneByteStringResource()); 470 source->GetExternalOneByteStringResource());
439 String::Encoding encoding = String::UNKNOWN_ENCODING; 471 String::Encoding encoding = String::UNKNOWN_ENCODING;
440 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource), 472 CHECK_EQ(static_cast<const String::ExternalStringResourceBase*>(resource),
441 source->GetExternalStringResourceBase(&encoding)); 473 source->GetExternalStringResourceBase(&encoding));
442 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); 474 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding);
443 Local<Script> script = v8_compile(source); 475 Local<Script> script = v8_compile(source);
444 Local<Value> value = script->Run(); 476 Local<Value> value = script->Run(env.local()).ToLocalChecked();
445 CHECK(value->IsNumber()); 477 CHECK(value->IsNumber());
446 CHECK_EQ(7, value->Int32Value()); 478 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
447 CcTest::heap()->CollectAllGarbage(); 479 CcTest::heap()->CollectAllGarbage();
448 CHECK_EQ(0, dispose_count); 480 CHECK_EQ(0, dispose_count);
449 } 481 }
450 CcTest::i_isolate()->compilation_cache()->Clear(); 482 CcTest::i_isolate()->compilation_cache()->Clear();
451 CcTest::heap()->CollectAllAvailableGarbage(); 483 CcTest::heap()->CollectAllAvailableGarbage();
452 CHECK_EQ(1, dispose_count); 484 CHECK_EQ(1, dispose_count);
453 } 485 }
454 486
455 487
456 THREADED_TEST(ScriptMakingExternalString) { 488 THREADED_TEST(ScriptMakingExternalString) {
457 int dispose_count = 0; 489 int dispose_count = 0;
458 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3"); 490 uint16_t* two_byte_source = AsciiToTwoByteString("1 + 2 * 3");
459 { 491 {
460 LocalContext env; 492 LocalContext env;
461 v8::HandleScope scope(env->GetIsolate()); 493 v8::HandleScope scope(env->GetIsolate());
462 Local<String> source = 494 Local<String> source =
463 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); 495 String::NewFromTwoByte(env->GetIsolate(), two_byte_source,
496 v8::NewStringType::kNormal)
497 .ToLocalChecked();
464 // Trigger GCs so that the newly allocated string moves to old gen. 498 // Trigger GCs so that the newly allocated string moves to old gen.
465 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 499 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
466 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 500 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
467 CHECK_EQ(source->IsExternal(), false); 501 CHECK_EQ(source->IsExternal(), false);
468 CHECK_EQ(source->IsExternalOneByte(), false); 502 CHECK_EQ(source->IsExternalOneByte(), false);
469 String::Encoding encoding = String::UNKNOWN_ENCODING; 503 String::Encoding encoding = String::UNKNOWN_ENCODING;
470 CHECK(!source->GetExternalStringResourceBase(&encoding)); 504 CHECK(!source->GetExternalStringResourceBase(&encoding));
471 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding); 505 CHECK_EQ(String::ONE_BYTE_ENCODING, encoding);
472 bool success = source->MakeExternal(new TestResource(two_byte_source, 506 bool success = source->MakeExternal(new TestResource(two_byte_source,
473 &dispose_count)); 507 &dispose_count));
474 CHECK(success); 508 CHECK(success);
475 Local<Script> script = v8_compile(source); 509 Local<Script> script = v8_compile(source);
476 Local<Value> value = script->Run(); 510 Local<Value> value = script->Run(env.local()).ToLocalChecked();
477 CHECK(value->IsNumber()); 511 CHECK(value->IsNumber());
478 CHECK_EQ(7, value->Int32Value()); 512 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
479 CcTest::heap()->CollectAllGarbage(); 513 CcTest::heap()->CollectAllGarbage();
480 CHECK_EQ(0, dispose_count); 514 CHECK_EQ(0, dispose_count);
481 } 515 }
482 CcTest::i_isolate()->compilation_cache()->Clear(); 516 CcTest::i_isolate()->compilation_cache()->Clear();
483 CcTest::heap()->CollectAllGarbage(); 517 CcTest::heap()->CollectAllGarbage();
484 CHECK_EQ(1, dispose_count); 518 CHECK_EQ(1, dispose_count);
485 } 519 }
486 520
487 521
488 THREADED_TEST(ScriptMakingExternalOneByteString) { 522 THREADED_TEST(ScriptMakingExternalOneByteString) {
489 int dispose_count = 0; 523 int dispose_count = 0;
490 const char* c_source = "1 + 2 * 3"; 524 const char* c_source = "1 + 2 * 3";
491 { 525 {
492 LocalContext env; 526 LocalContext env;
493 v8::HandleScope scope(env->GetIsolate()); 527 v8::HandleScope scope(env->GetIsolate());
494 Local<String> source = v8_str(c_source); 528 Local<String> source = v8_str(c_source);
495 // Trigger GCs so that the newly allocated string moves to old gen. 529 // Trigger GCs so that the newly allocated string moves to old gen.
496 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 530 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
497 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 531 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
498 bool success = source->MakeExternal( 532 bool success = source->MakeExternal(
499 new TestOneByteResource(i::StrDup(c_source), &dispose_count)); 533 new TestOneByteResource(i::StrDup(c_source), &dispose_count));
500 CHECK(success); 534 CHECK(success);
501 Local<Script> script = v8_compile(source); 535 Local<Script> script = v8_compile(source);
502 Local<Value> value = script->Run(); 536 Local<Value> value = script->Run(env.local()).ToLocalChecked();
503 CHECK(value->IsNumber()); 537 CHECK(value->IsNumber());
504 CHECK_EQ(7, value->Int32Value()); 538 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
505 CcTest::heap()->CollectAllGarbage(); 539 CcTest::heap()->CollectAllGarbage();
506 CHECK_EQ(0, dispose_count); 540 CHECK_EQ(0, dispose_count);
507 } 541 }
508 CcTest::i_isolate()->compilation_cache()->Clear(); 542 CcTest::i_isolate()->compilation_cache()->Clear();
509 CcTest::heap()->CollectAllGarbage(); 543 CcTest::heap()->CollectAllGarbage();
510 CHECK_EQ(1, dispose_count); 544 CHECK_EQ(1, dispose_count);
511 } 545 }
512 546
513 547
514 TEST(MakingExternalStringConditions) { 548 TEST(MakingExternalStringConditions) {
515 LocalContext env; 549 LocalContext env;
516 v8::HandleScope scope(env->GetIsolate()); 550 v8::HandleScope scope(env->GetIsolate());
517 551
518 // Free some space in the new space so that we can check freshness. 552 // Free some space in the new space so that we can check freshness.
519 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 553 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
520 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 554 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
521 555
522 uint16_t* two_byte_string = AsciiToTwoByteString("s1"); 556 uint16_t* two_byte_string = AsciiToTwoByteString("s1");
523 Local<String> small_string = 557 Local<String> small_string =
524 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); 558 String::NewFromTwoByte(env->GetIsolate(), two_byte_string,
559 v8::NewStringType::kNormal)
560 .ToLocalChecked();
525 i::DeleteArray(two_byte_string); 561 i::DeleteArray(two_byte_string);
526 562
527 // We should refuse to externalize small strings. 563 // We should refuse to externalize small strings.
528 CHECK(!small_string->CanMakeExternal()); 564 CHECK(!small_string->CanMakeExternal());
529 // Trigger GCs so that the newly allocated string moves to old gen. 565 // Trigger GCs so that the newly allocated string moves to old gen.
530 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 566 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
531 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
532 // Old space strings should be accepted. 568 // Old space strings should be accepted.
533 CHECK(small_string->CanMakeExternal()); 569 CHECK(small_string->CanMakeExternal());
534 570
535 two_byte_string = AsciiToTwoByteString("small string 2"); 571 two_byte_string = AsciiToTwoByteString("small string 2");
536 small_string = String::NewFromTwoByte(env->GetIsolate(), two_byte_string); 572 small_string = String::NewFromTwoByte(env->GetIsolate(), two_byte_string,
573 v8::NewStringType::kNormal)
574 .ToLocalChecked();
537 i::DeleteArray(two_byte_string); 575 i::DeleteArray(two_byte_string);
538 576
539 const int buf_size = 10 * 1024; 577 const int buf_size = 10 * 1024;
540 char* buf = i::NewArray<char>(buf_size); 578 char* buf = i::NewArray<char>(buf_size);
541 memset(buf, 'a', buf_size); 579 memset(buf, 'a', buf_size);
542 buf[buf_size - 1] = '\0'; 580 buf[buf_size - 1] = '\0';
543 581
544 two_byte_string = AsciiToTwoByteString(buf); 582 two_byte_string = AsciiToTwoByteString(buf);
545 Local<String> large_string = 583 Local<String> large_string =
546 String::NewFromTwoByte(env->GetIsolate(), two_byte_string); 584 String::NewFromTwoByte(env->GetIsolate(), two_byte_string,
585 v8::NewStringType::kNormal)
586 .ToLocalChecked();
547 i::DeleteArray(buf); 587 i::DeleteArray(buf);
548 i::DeleteArray(two_byte_string); 588 i::DeleteArray(two_byte_string);
549 // Large strings should be immediately accepted. 589 // Large strings should be immediately accepted.
550 CHECK(large_string->CanMakeExternal()); 590 CHECK(large_string->CanMakeExternal());
551 } 591 }
552 592
553 593
554 TEST(MakingExternalOneByteStringConditions) { 594 TEST(MakingExternalOneByteStringConditions) {
555 LocalContext env; 595 LocalContext env;
556 v8::HandleScope scope(env->GetIsolate()); 596 v8::HandleScope scope(env->GetIsolate());
557 597
558 // Free some space in the new space so that we can check freshness. 598 // Free some space in the new space so that we can check freshness.
559 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 599 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
560 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 600 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
561 601
562 Local<String> small_string = String::NewFromUtf8(env->GetIsolate(), "s1"); 602 Local<String> small_string = v8_str("s1");
563 // We should refuse to externalize small strings. 603 // We should refuse to externalize small strings.
564 CHECK(!small_string->CanMakeExternal()); 604 CHECK(!small_string->CanMakeExternal());
565 // Trigger GCs so that the newly allocated string moves to old gen. 605 // Trigger GCs so that the newly allocated string moves to old gen.
566 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 606 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
567 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 607 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
568 // Old space strings should be accepted. 608 // Old space strings should be accepted.
569 CHECK(small_string->CanMakeExternal()); 609 CHECK(small_string->CanMakeExternal());
570 610
571 const int buf_size = 10 * 1024; 611 const int buf_size = 10 * 1024;
572 char* buf = i::NewArray<char>(buf_size); 612 char* buf = i::NewArray<char>(buf_size);
573 memset(buf, 'a', buf_size); 613 memset(buf, 'a', buf_size);
574 buf[buf_size - 1] = '\0'; 614 buf[buf_size - 1] = '\0';
575 Local<String> large_string = String::NewFromUtf8(env->GetIsolate(), buf); 615 Local<String> large_string = v8_str(buf);
576 i::DeleteArray(buf); 616 i::DeleteArray(buf);
577 // Large strings should be immediately accepted. 617 // Large strings should be immediately accepted.
578 CHECK(large_string->CanMakeExternal()); 618 CHECK(large_string->CanMakeExternal());
579 } 619 }
580 620
581 621
582 TEST(MakingExternalUnalignedOneByteString) { 622 TEST(MakingExternalUnalignedOneByteString) {
583 LocalContext env; 623 LocalContext env;
584 v8::HandleScope scope(env->GetIsolate()); 624 v8::HandleScope scope(env->GetIsolate());
585 625
(...skipping 25 matching lines...) Expand all
611 CcTest::heap()->CollectAllGarbage(); 651 CcTest::heap()->CollectAllGarbage();
612 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask); 652 CcTest::heap()->CollectAllGarbage(i::Heap::kReduceMemoryFootprintMask);
613 } 653 }
614 654
615 655
616 THREADED_TEST(UsingExternalString) { 656 THREADED_TEST(UsingExternalString) {
617 i::Factory* factory = CcTest::i_isolate()->factory(); 657 i::Factory* factory = CcTest::i_isolate()->factory();
618 { 658 {
619 v8::HandleScope scope(CcTest::isolate()); 659 v8::HandleScope scope(CcTest::isolate());
620 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); 660 uint16_t* two_byte_string = AsciiToTwoByteString("test string");
621 Local<String> string = String::NewExternal( 661 Local<String> string =
622 CcTest::isolate(), new TestResource(two_byte_string)); 662 String::NewExternalTwoByte(CcTest::isolate(),
663 new TestResource(two_byte_string))
664 .ToLocalChecked();
623 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 665 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
624 // Trigger GCs so that the newly allocated string moves to old gen. 666 // Trigger GCs so that the newly allocated string moves to old gen.
625 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 667 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
626 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 668 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
627 i::Handle<i::String> isymbol = 669 i::Handle<i::String> isymbol =
628 factory->InternalizeString(istring); 670 factory->InternalizeString(istring);
629 CHECK(isymbol->IsInternalizedString()); 671 CHECK(isymbol->IsInternalizedString());
630 } 672 }
631 CcTest::heap()->CollectAllGarbage(); 673 CcTest::heap()->CollectAllGarbage();
632 CcTest::heap()->CollectAllGarbage(); 674 CcTest::heap()->CollectAllGarbage();
633 } 675 }
634 676
635 677
636 THREADED_TEST(UsingExternalOneByteString) { 678 THREADED_TEST(UsingExternalOneByteString) {
637 i::Factory* factory = CcTest::i_isolate()->factory(); 679 i::Factory* factory = CcTest::i_isolate()->factory();
638 { 680 {
639 v8::HandleScope scope(CcTest::isolate()); 681 v8::HandleScope scope(CcTest::isolate());
640 const char* one_byte_string = "test string"; 682 const char* one_byte_string = "test string";
641 Local<String> string = String::NewExternal( 683 Local<String> string =
642 CcTest::isolate(), new TestOneByteResource(i::StrDup(one_byte_string))); 684 String::NewExternalOneByte(
685 CcTest::isolate(),
686 new TestOneByteResource(i::StrDup(one_byte_string)))
687 .ToLocalChecked();
643 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 688 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
644 // Trigger GCs so that the newly allocated string moves to old gen. 689 // Trigger GCs so that the newly allocated string moves to old gen.
645 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now 690 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in survivor space now
646 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now 691 CcTest::heap()->CollectGarbage(i::NEW_SPACE); // in old gen now
647 i::Handle<i::String> isymbol = 692 i::Handle<i::String> isymbol =
648 factory->InternalizeString(istring); 693 factory->InternalizeString(istring);
649 CHECK(isymbol->IsInternalizedString()); 694 CHECK(isymbol->IsInternalizedString());
650 } 695 }
651 CcTest::heap()->CollectAllGarbage(); 696 CcTest::heap()->CollectAllGarbage();
652 CcTest::heap()->CollectAllGarbage(); 697 CcTest::heap()->CollectAllGarbage();
(...skipping 24 matching lines...) Expand all
677 int length_; 722 int length_;
678 }; 723 };
679 724
680 725
681 THREADED_TEST(NewExternalForVeryLongString) { 726 THREADED_TEST(NewExternalForVeryLongString) {
682 auto isolate = CcTest::isolate(); 727 auto isolate = CcTest::isolate();
683 { 728 {
684 v8::HandleScope scope(isolate); 729 v8::HandleScope scope(isolate);
685 v8::TryCatch try_catch(isolate); 730 v8::TryCatch try_catch(isolate);
686 RandomLengthOneByteResource r(1 << 30); 731 RandomLengthOneByteResource r(1 << 30);
687 v8::Local<v8::String> str = v8::String::NewExternal(isolate, &r); 732 v8::MaybeLocal<v8::String> maybe_str =
688 CHECK(str.IsEmpty()); 733 v8::String::NewExternalOneByte(isolate, &r);
734 CHECK(maybe_str.IsEmpty());
689 CHECK(!try_catch.HasCaught()); 735 CHECK(!try_catch.HasCaught());
690 } 736 }
691 737
692 { 738 {
693 v8::HandleScope scope(isolate); 739 v8::HandleScope scope(isolate);
694 v8::TryCatch try_catch(isolate); 740 v8::TryCatch try_catch(isolate);
695 RandomLengthResource r(1 << 30); 741 RandomLengthResource r(1 << 30);
696 v8::Local<v8::String> str = v8::String::NewExternal(isolate, &r); 742 v8::MaybeLocal<v8::String> maybe_str =
697 CHECK(str.IsEmpty()); 743 v8::String::NewExternalTwoByte(isolate, &r);
744 CHECK(maybe_str.IsEmpty());
698 CHECK(!try_catch.HasCaught()); 745 CHECK(!try_catch.HasCaught());
699 } 746 }
700 } 747 }
701 748
702 749
703 THREADED_TEST(ScavengeExternalString) { 750 THREADED_TEST(ScavengeExternalString) {
704 i::FLAG_stress_compaction = false; 751 i::FLAG_stress_compaction = false;
705 i::FLAG_gc_global = false; 752 i::FLAG_gc_global = false;
706 int dispose_count = 0; 753 int dispose_count = 0;
707 bool in_new_space = false; 754 bool in_new_space = false;
708 { 755 {
709 v8::HandleScope scope(CcTest::isolate()); 756 v8::HandleScope scope(CcTest::isolate());
710 uint16_t* two_byte_string = AsciiToTwoByteString("test string"); 757 uint16_t* two_byte_string = AsciiToTwoByteString("test string");
711 Local<String> string = String::NewExternal( 758 Local<String> string =
712 CcTest::isolate(), new TestResource(two_byte_string, &dispose_count)); 759 String::NewExternalTwoByte(
760 CcTest::isolate(),
761 new TestResource(two_byte_string, &dispose_count))
762 .ToLocalChecked();
713 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 763 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
714 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 764 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
715 in_new_space = CcTest::heap()->InNewSpace(*istring); 765 in_new_space = CcTest::heap()->InNewSpace(*istring);
716 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); 766 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring));
717 CHECK_EQ(0, dispose_count); 767 CHECK_EQ(0, dispose_count);
718 } 768 }
719 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); 769 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE);
720 CHECK_EQ(1, dispose_count); 770 CHECK_EQ(1, dispose_count);
721 } 771 }
722 772
723 773
724 THREADED_TEST(ScavengeExternalOneByteString) { 774 THREADED_TEST(ScavengeExternalOneByteString) {
725 i::FLAG_stress_compaction = false; 775 i::FLAG_stress_compaction = false;
726 i::FLAG_gc_global = false; 776 i::FLAG_gc_global = false;
727 int dispose_count = 0; 777 int dispose_count = 0;
728 bool in_new_space = false; 778 bool in_new_space = false;
729 { 779 {
730 v8::HandleScope scope(CcTest::isolate()); 780 v8::HandleScope scope(CcTest::isolate());
731 const char* one_byte_string = "test string"; 781 const char* one_byte_string = "test string";
732 Local<String> string = String::NewExternal( 782 Local<String> string =
733 CcTest::isolate(), 783 String::NewExternalOneByte(
734 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count)); 784 CcTest::isolate(),
785 new TestOneByteResource(i::StrDup(one_byte_string), &dispose_count))
786 .ToLocalChecked();
735 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string); 787 i::Handle<i::String> istring = v8::Utils::OpenHandle(*string);
736 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 788 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
737 in_new_space = CcTest::heap()->InNewSpace(*istring); 789 in_new_space = CcTest::heap()->InNewSpace(*istring);
738 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring)); 790 CHECK(in_new_space || CcTest::heap()->old_space()->Contains(*istring));
739 CHECK_EQ(0, dispose_count); 791 CHECK_EQ(0, dispose_count);
740 } 792 }
741 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE); 793 CcTest::heap()->CollectGarbage(in_new_space ? i::NEW_SPACE : i::OLD_SPACE);
742 CHECK_EQ(1, dispose_count); 794 CHECK_EQ(1, dispose_count);
743 } 795 }
744 796
(...skipping 23 matching lines...) Expand all
768 TEST(ExternalStringWithDisposeHandling) { 820 TEST(ExternalStringWithDisposeHandling) {
769 const char* c_source = "1 + 2 * 3"; 821 const char* c_source = "1 + 2 * 3";
770 822
771 // Use a stack allocated external string resource allocated object. 823 // Use a stack allocated external string resource allocated object.
772 TestOneByteResourceWithDisposeControl::dispose_count = 0; 824 TestOneByteResourceWithDisposeControl::dispose_count = 0;
773 TestOneByteResourceWithDisposeControl::dispose_calls = 0; 825 TestOneByteResourceWithDisposeControl::dispose_calls = 0;
774 TestOneByteResourceWithDisposeControl res_stack(i::StrDup(c_source), false); 826 TestOneByteResourceWithDisposeControl res_stack(i::StrDup(c_source), false);
775 { 827 {
776 LocalContext env; 828 LocalContext env;
777 v8::HandleScope scope(env->GetIsolate()); 829 v8::HandleScope scope(env->GetIsolate());
778 Local<String> source = String::NewExternal(env->GetIsolate(), &res_stack); 830 Local<String> source =
831 String::NewExternalOneByte(env->GetIsolate(), &res_stack)
832 .ToLocalChecked();
779 Local<Script> script = v8_compile(source); 833 Local<Script> script = v8_compile(source);
780 Local<Value> value = script->Run(); 834 Local<Value> value = script->Run(env.local()).ToLocalChecked();
781 CHECK(value->IsNumber()); 835 CHECK(value->IsNumber());
782 CHECK_EQ(7, value->Int32Value()); 836 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
783 CcTest::heap()->CollectAllAvailableGarbage(); 837 CcTest::heap()->CollectAllAvailableGarbage();
784 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); 838 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count);
785 } 839 }
786 CcTest::i_isolate()->compilation_cache()->Clear(); 840 CcTest::i_isolate()->compilation_cache()->Clear();
787 CcTest::heap()->CollectAllAvailableGarbage(); 841 CcTest::heap()->CollectAllAvailableGarbage();
788 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); 842 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls);
789 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); 843 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count);
790 844
791 // Use a heap allocated external string resource allocated object. 845 // Use a heap allocated external string resource allocated object.
792 TestOneByteResourceWithDisposeControl::dispose_count = 0; 846 TestOneByteResourceWithDisposeControl::dispose_count = 0;
793 TestOneByteResourceWithDisposeControl::dispose_calls = 0; 847 TestOneByteResourceWithDisposeControl::dispose_calls = 0;
794 TestOneByteResource* res_heap = 848 TestOneByteResource* res_heap =
795 new TestOneByteResourceWithDisposeControl(i::StrDup(c_source), true); 849 new TestOneByteResourceWithDisposeControl(i::StrDup(c_source), true);
796 { 850 {
797 LocalContext env; 851 LocalContext env;
798 v8::HandleScope scope(env->GetIsolate()); 852 v8::HandleScope scope(env->GetIsolate());
799 Local<String> source = String::NewExternal(env->GetIsolate(), res_heap); 853 Local<String> source =
854 String::NewExternalOneByte(env->GetIsolate(), res_heap)
855 .ToLocalChecked();
800 Local<Script> script = v8_compile(source); 856 Local<Script> script = v8_compile(source);
801 Local<Value> value = script->Run(); 857 Local<Value> value = script->Run(env.local()).ToLocalChecked();
802 CHECK(value->IsNumber()); 858 CHECK(value->IsNumber());
803 CHECK_EQ(7, value->Int32Value()); 859 CHECK_EQ(7, value->Int32Value(env.local()).FromJust());
804 CcTest::heap()->CollectAllAvailableGarbage(); 860 CcTest::heap()->CollectAllAvailableGarbage();
805 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count); 861 CHECK_EQ(0, TestOneByteResourceWithDisposeControl::dispose_count);
806 } 862 }
807 CcTest::i_isolate()->compilation_cache()->Clear(); 863 CcTest::i_isolate()->compilation_cache()->Clear();
808 CcTest::heap()->CollectAllAvailableGarbage(); 864 CcTest::heap()->CollectAllAvailableGarbage();
809 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls); 865 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_calls);
810 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_count); 866 CHECK_EQ(1, TestOneByteResourceWithDisposeControl::dispose_count);
811 } 867 }
812 868
813 869
814 THREADED_TEST(StringConcat) { 870 THREADED_TEST(StringConcat) {
815 { 871 {
816 LocalContext env; 872 LocalContext env;
817 v8::HandleScope scope(env->GetIsolate()); 873 v8::HandleScope scope(env->GetIsolate());
818 const char* one_byte_string_1 = "function a_times_t"; 874 const char* one_byte_string_1 = "function a_times_t";
819 const char* two_byte_string_1 = "wo_plus_b(a, b) {return "; 875 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) + "; 876 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) + "; 877 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) + "; 878 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) + "; 879 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);"; 880 const char* two_byte_extern_2 = "a_times_two_plus_b(1, 2);";
825 Local<String> left = v8_str(one_byte_string_1); 881 Local<String> left = v8_str(one_byte_string_1);
826 882
827 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1); 883 uint16_t* two_byte_source = AsciiToTwoByteString(two_byte_string_1);
828 Local<String> right = 884 Local<String> right =
829 String::NewFromTwoByte(env->GetIsolate(), two_byte_source); 885 String::NewFromTwoByte(env->GetIsolate(), two_byte_source,
886 v8::NewStringType::kNormal)
887 .ToLocalChecked();
830 i::DeleteArray(two_byte_source); 888 i::DeleteArray(two_byte_source);
831 889
832 Local<String> source = String::Concat(left, right); 890 Local<String> source = String::Concat(left, right);
833 right = String::NewExternal( 891 right = String::NewExternalOneByte(
834 env->GetIsolate(), 892 env->GetIsolate(),
835 new TestOneByteResource(i::StrDup(one_byte_extern_1))); 893 new TestOneByteResource(i::StrDup(one_byte_extern_1)))
894 .ToLocalChecked();
836 source = String::Concat(source, right); 895 source = String::Concat(source, right);
837 right = String::NewExternal( 896 right = String::NewExternalTwoByte(
838 env->GetIsolate(), 897 env->GetIsolate(),
839 new TestResource(AsciiToTwoByteString(two_byte_extern_1))); 898 new TestResource(AsciiToTwoByteString(two_byte_extern_1)))
899 .ToLocalChecked();
840 source = String::Concat(source, right); 900 source = String::Concat(source, right);
841 right = v8_str(one_byte_string_2); 901 right = v8_str(one_byte_string_2);
842 source = String::Concat(source, right); 902 source = String::Concat(source, right);
843 903
844 two_byte_source = AsciiToTwoByteString(two_byte_string_2); 904 two_byte_source = AsciiToTwoByteString(two_byte_string_2);
845 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source); 905 right = String::NewFromTwoByte(env->GetIsolate(), two_byte_source,
906 v8::NewStringType::kNormal)
907 .ToLocalChecked();
846 i::DeleteArray(two_byte_source); 908 i::DeleteArray(two_byte_source);
847 909
848 source = String::Concat(source, right); 910 source = String::Concat(source, right);
849 right = String::NewExternal( 911 right = String::NewExternalTwoByte(
850 env->GetIsolate(), 912 env->GetIsolate(),
851 new TestResource(AsciiToTwoByteString(two_byte_extern_2))); 913 new TestResource(AsciiToTwoByteString(two_byte_extern_2)))
914 .ToLocalChecked();
852 source = String::Concat(source, right); 915 source = String::Concat(source, right);
853 Local<Script> script = v8_compile(source); 916 Local<Script> script = v8_compile(source);
854 Local<Value> value = script->Run(); 917 Local<Value> value = script->Run(env.local()).ToLocalChecked();
855 CHECK(value->IsNumber()); 918 CHECK(value->IsNumber());
856 CHECK_EQ(68, value->Int32Value()); 919 CHECK_EQ(68, value->Int32Value(env.local()).FromJust());
857 } 920 }
858 CcTest::i_isolate()->compilation_cache()->Clear(); 921 CcTest::i_isolate()->compilation_cache()->Clear();
859 CcTest::heap()->CollectAllGarbage(); 922 CcTest::heap()->CollectAllGarbage();
860 CcTest::heap()->CollectAllGarbage(); 923 CcTest::heap()->CollectAllGarbage();
861 } 924 }
862 925
863 926
864 THREADED_TEST(GlobalProperties) { 927 THREADED_TEST(GlobalProperties) {
865 LocalContext env; 928 LocalContext env;
866 v8::HandleScope scope(env->GetIsolate()); 929 v8::HandleScope scope(env->GetIsolate());
867 v8::Handle<v8::Object> global = env->Global(); 930 v8::Local<v8::Object> global = env->Global();
868 global->Set(v8_str("pi"), v8_num(3.1415926)); 931 CHECK(global->Set(env.local(), v8_str("pi"), v8_num(3.1415926)).FromJust());
869 Local<Value> pi = global->Get(v8_str("pi")); 932 Local<Value> pi = global->Get(env.local(), v8_str("pi")).ToLocalChecked();
870 CHECK_EQ(3.1415926, pi->NumberValue()); 933 CHECK_EQ(3.1415926, pi->NumberValue(env.local()).FromJust());
871 } 934 }
872 935
873 936
874 static void handle_callback_impl(const v8::FunctionCallbackInfo<Value>& info, 937 static void handle_callback_impl(const v8::FunctionCallbackInfo<Value>& info,
875 i::Address callback) { 938 i::Address callback) {
876 ApiTestFuzzer::Fuzz(); 939 ApiTestFuzzer::Fuzz();
877 CheckReturnValue(info, callback); 940 CheckReturnValue(info, callback);
878 info.GetReturnValue().Set(v8_str("bad value")); 941 info.GetReturnValue().Set(v8_str("bad value"));
879 info.GetReturnValue().Set(v8_num(102)); 942 info.GetReturnValue().Set(v8_num(102));
880 } 943 }
881 944
882 945
883 static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) { 946 static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) {
884 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback)); 947 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback));
885 } 948 }
886 949
887 950
888 static void handle_callback_2(const v8::FunctionCallbackInfo<Value>& info) { 951 static void handle_callback_2(const v8::FunctionCallbackInfo<Value>& info) {
889 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback_2)); 952 return handle_callback_impl(info, FUNCTION_ADDR(handle_callback_2));
890 } 953 }
891 954
892 static void construct_callback( 955 static void construct_callback(
893 const v8::FunctionCallbackInfo<Value>& info) { 956 const v8::FunctionCallbackInfo<Value>& info) {
894 ApiTestFuzzer::Fuzz(); 957 ApiTestFuzzer::Fuzz();
895 CheckReturnValue(info, FUNCTION_ADDR(construct_callback)); 958 CheckReturnValue(info, FUNCTION_ADDR(construct_callback));
896 info.This()->Set(v8_str("x"), v8_num(1)); 959 CHECK(
897 info.This()->Set(v8_str("y"), v8_num(2)); 960 info.This()
961 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("x"), v8_num(1))
962 .FromJust());
963 CHECK(
964 info.This()
965 ->Set(info.GetIsolate()->GetCurrentContext(), v8_str("y"), v8_num(2))
966 .FromJust());
898 info.GetReturnValue().Set(v8_str("bad value")); 967 info.GetReturnValue().Set(v8_str("bad value"));
899 info.GetReturnValue().Set(info.This()); 968 info.GetReturnValue().Set(info.This());
900 } 969 }
901 970
902 971
903 static void Return239Callback( 972 static void Return239Callback(
904 Local<String> name, const v8::PropertyCallbackInfo<Value>& info) { 973 Local<String> name, const v8::PropertyCallbackInfo<Value>& info) {
905 ApiTestFuzzer::Fuzz(); 974 ApiTestFuzzer::Fuzz();
906 CheckReturnValue(info, FUNCTION_ADDR(Return239Callback)); 975 CheckReturnValue(info, FUNCTION_ADDR(Return239Callback));
907 info.GetReturnValue().Set(v8_str("bad value")); 976 info.GetReturnValue().Set(v8_str("bad value"));
908 info.GetReturnValue().Set(v8_num(239)); 977 info.GetReturnValue().Set(v8_num(239));
909 } 978 }
910 979
911 980
912 template<typename Handler> 981 template<typename Handler>
913 static void TestFunctionTemplateInitializer(Handler handler, 982 static void TestFunctionTemplateInitializer(Handler handler,
914 Handler handler_2) { 983 Handler handler_2) {
915 // Test constructor calls. 984 // Test constructor calls.
916 { 985 {
917 LocalContext env; 986 LocalContext env;
918 v8::Isolate* isolate = env->GetIsolate(); 987 v8::Isolate* isolate = env->GetIsolate();
919 v8::HandleScope scope(isolate); 988 v8::HandleScope scope(isolate);
920 989
921 Local<v8::FunctionTemplate> fun_templ = 990 Local<v8::FunctionTemplate> fun_templ =
922 v8::FunctionTemplate::New(isolate, handler); 991 v8::FunctionTemplate::New(isolate, handler);
923 Local<Function> fun = fun_templ->GetFunction(); 992 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
924 env->Global()->Set(v8_str("obj"), fun); 993 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust());
925 Local<Script> script = v8_compile("obj()"); 994 Local<Script> script = v8_compile("obj()");
926 for (int i = 0; i < 30; i++) { 995 for (int i = 0; i < 30; i++) {
927 CHECK_EQ(102, script->Run()->Int32Value()); 996 CHECK_EQ(102, v8_run_int32value(script));
928 } 997 }
929 } 998 }
930 // Use SetCallHandler to initialize a function template, should work like 999 // Use SetCallHandler to initialize a function template, should work like
931 // the previous one. 1000 // the previous one.
932 { 1001 {
933 LocalContext env; 1002 LocalContext env;
934 v8::Isolate* isolate = env->GetIsolate(); 1003 v8::Isolate* isolate = env->GetIsolate();
935 v8::HandleScope scope(isolate); 1004 v8::HandleScope scope(isolate);
936 1005
937 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); 1006 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate);
938 fun_templ->SetCallHandler(handler_2); 1007 fun_templ->SetCallHandler(handler_2);
939 Local<Function> fun = fun_templ->GetFunction(); 1008 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
940 env->Global()->Set(v8_str("obj"), fun); 1009 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust());
941 Local<Script> script = v8_compile("obj()"); 1010 Local<Script> script = v8_compile("obj()");
942 for (int i = 0; i < 30; i++) { 1011 for (int i = 0; i < 30; i++) {
943 CHECK_EQ(102, script->Run()->Int32Value()); 1012 CHECK_EQ(102, v8_run_int32value(script));
944 } 1013 }
945 } 1014 }
946 } 1015 }
947 1016
948 1017
949 template<typename Constructor, typename Accessor> 1018 template<typename Constructor, typename Accessor>
950 static void TestFunctionTemplateAccessor(Constructor constructor, 1019 static void TestFunctionTemplateAccessor(Constructor constructor,
951 Accessor accessor) { 1020 Accessor accessor) {
952 LocalContext env; 1021 LocalContext env;
953 v8::HandleScope scope(env->GetIsolate()); 1022 v8::HandleScope scope(env->GetIsolate());
954 1023
955 Local<v8::FunctionTemplate> fun_templ = 1024 Local<v8::FunctionTemplate> fun_templ =
956 v8::FunctionTemplate::New(env->GetIsolate(), constructor); 1025 v8::FunctionTemplate::New(env->GetIsolate(), constructor);
957 fun_templ->SetClassName(v8_str("funky")); 1026 fun_templ->SetClassName(v8_str("funky"));
958 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); 1027 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor);
959 Local<Function> fun = fun_templ->GetFunction(); 1028 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
960 env->Global()->Set(v8_str("obj"), fun); 1029 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust());
961 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); 1030 Local<Value> result =
962 CHECK(v8_str("[object funky]")->Equals(result)); 1031 v8_compile("(new obj()).toString()")->Run(env.local()).ToLocalChecked();
1032 CHECK(v8_str("[object funky]")->Equals(env.local(), result).FromJust());
963 CompileRun("var obj_instance = new obj();"); 1033 CompileRun("var obj_instance = new obj();");
964 Local<Script> script; 1034 Local<Script> script;
965 script = v8_compile("obj_instance.x"); 1035 script = v8_compile("obj_instance.x");
966 for (int i = 0; i < 30; i++) { 1036 for (int i = 0; i < 30; i++) {
967 CHECK_EQ(1, script->Run()->Int32Value()); 1037 CHECK_EQ(1, v8_run_int32value(script));
968 } 1038 }
969 script = v8_compile("obj_instance.m"); 1039 script = v8_compile("obj_instance.m");
970 for (int i = 0; i < 30; i++) { 1040 for (int i = 0; i < 30; i++) {
971 CHECK_EQ(239, script->Run()->Int32Value()); 1041 CHECK_EQ(239, v8_run_int32value(script));
972 } 1042 }
973 } 1043 }
974 1044
975 1045
976 THREADED_PROFILED_TEST(FunctionTemplate) { 1046 THREADED_PROFILED_TEST(FunctionTemplate) {
977 TestFunctionTemplateInitializer(handle_callback, handle_callback_2); 1047 TestFunctionTemplateInitializer(handle_callback, handle_callback_2);
978 TestFunctionTemplateAccessor(construct_callback, Return239Callback); 1048 TestFunctionTemplateAccessor(construct_callback, Return239Callback);
979 } 1049 }
980 1050
981 1051
982 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) { 1052 static void SimpleCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
983 ApiTestFuzzer::Fuzz(); 1053 ApiTestFuzzer::Fuzz();
984 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback)); 1054 CheckReturnValue(info, FUNCTION_ADDR(SimpleCallback));
985 info.GetReturnValue().Set(v8_num(51423 + info.Length())); 1055 info.GetReturnValue().Set(v8_num(51423 + info.Length()));
986 } 1056 }
987 1057
988 1058
989 template<typename Callback> 1059 template<typename Callback>
990 static void TestSimpleCallback(Callback callback) { 1060 static void TestSimpleCallback(Callback callback) {
991 LocalContext env; 1061 LocalContext env;
992 v8::Isolate* isolate = env->GetIsolate(); 1062 v8::Isolate* isolate = env->GetIsolate();
993 v8::HandleScope scope(isolate); 1063 v8::HandleScope scope(isolate);
994 1064
995 v8::Handle<v8::ObjectTemplate> object_template = 1065 v8::Local<v8::ObjectTemplate> object_template =
996 v8::ObjectTemplate::New(isolate); 1066 v8::ObjectTemplate::New(isolate);
997 object_template->Set(isolate, "callback", 1067 object_template->Set(isolate, "callback",
998 v8::FunctionTemplate::New(isolate, callback)); 1068 v8::FunctionTemplate::New(isolate, callback));
999 v8::Local<v8::Object> object = object_template->NewInstance(); 1069 v8::Local<v8::Object> object =
1000 (*env)->Global()->Set(v8_str("callback_object"), object); 1070 object_template->NewInstance(env.local()).ToLocalChecked();
1001 v8::Handle<v8::Script> script; 1071 CHECK((*env)
1072 ->Global()
1073 ->Set(env.local(), v8_str("callback_object"), object)
1074 .FromJust());
1075 v8::Local<v8::Script> script;
1002 script = v8_compile("callback_object.callback(17)"); 1076 script = v8_compile("callback_object.callback(17)");
1003 for (int i = 0; i < 30; i++) { 1077 for (int i = 0; i < 30; i++) {
1004 CHECK_EQ(51424, script->Run()->Int32Value()); 1078 CHECK_EQ(51424, v8_run_int32value(script));
1005 } 1079 }
1006 script = v8_compile("callback_object.callback(17, 24)"); 1080 script = v8_compile("callback_object.callback(17, 24)");
1007 for (int i = 0; i < 30; i++) { 1081 for (int i = 0; i < 30; i++) {
1008 CHECK_EQ(51425, script->Run()->Int32Value()); 1082 CHECK_EQ(51425, v8_run_int32value(script));
1009 } 1083 }
1010 } 1084 }
1011 1085
1012 1086
1013 THREADED_PROFILED_TEST(SimpleCallback) { 1087 THREADED_PROFILED_TEST(SimpleCallback) {
1014 TestSimpleCallback(SimpleCallback); 1088 TestSimpleCallback(SimpleCallback);
1015 } 1089 }
1016 1090
1017 1091
1018 template<typename T> 1092 template<typename T>
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1079 break; 1153 break;
1080 case kEmptyStringReturnValue: 1154 case kEmptyStringReturnValue:
1081 info.GetReturnValue().SetEmptyString(); 1155 info.GetReturnValue().SetEmptyString();
1082 break; 1156 break;
1083 } 1157 }
1084 } 1158 }
1085 1159
1086 template<> 1160 template<>
1087 void FastReturnValueCallback<Object>( 1161 void FastReturnValueCallback<Object>(
1088 const v8::FunctionCallbackInfo<v8::Value>& info) { 1162 const v8::FunctionCallbackInfo<v8::Value>& info) {
1089 v8::Handle<v8::Object> object; 1163 v8::Local<v8::Object> object;
1090 if (!fast_return_value_object_is_empty) { 1164 if (!fast_return_value_object_is_empty) {
1091 object = Object::New(info.GetIsolate()); 1165 object = Object::New(info.GetIsolate());
1092 } 1166 }
1093 info.GetReturnValue().Set(object); 1167 info.GetReturnValue().Set(object);
1094 } 1168 }
1095 1169
1096 template<typename T> 1170 template <typename T>
1097 Handle<Value> TestFastReturnValues() { 1171 Local<Value> TestFastReturnValues() {
1098 LocalContext env; 1172 LocalContext env;
1099 v8::Isolate* isolate = env->GetIsolate(); 1173 v8::Isolate* isolate = env->GetIsolate();
1100 v8::EscapableHandleScope scope(isolate); 1174 v8::EscapableHandleScope scope(isolate);
1101 v8::Handle<v8::ObjectTemplate> object_template = 1175 v8::Local<v8::ObjectTemplate> object_template =
1102 v8::ObjectTemplate::New(isolate); 1176 v8::ObjectTemplate::New(isolate);
1103 v8::FunctionCallback callback = &FastReturnValueCallback<T>; 1177 v8::FunctionCallback callback = &FastReturnValueCallback<T>;
1104 object_template->Set(isolate, "callback", 1178 object_template->Set(isolate, "callback",
1105 v8::FunctionTemplate::New(isolate, callback)); 1179 v8::FunctionTemplate::New(isolate, callback));
1106 v8::Local<v8::Object> object = object_template->NewInstance(); 1180 v8::Local<v8::Object> object =
1107 (*env)->Global()->Set(v8_str("callback_object"), object); 1181 object_template->NewInstance(env.local()).ToLocalChecked();
1182 CHECK((*env)
1183 ->Global()
1184 ->Set(env.local(), v8_str("callback_object"), object)
1185 .FromJust());
1108 return scope.Escape(CompileRun("callback_object.callback()")); 1186 return scope.Escape(CompileRun("callback_object.callback()"));
1109 } 1187 }
1110 1188
1111 1189
1112 THREADED_PROFILED_TEST(FastReturnValues) { 1190 THREADED_PROFILED_TEST(FastReturnValues) {
1113 LocalContext env; 1191 LocalContext env;
1114 v8::Isolate* isolate = env->GetIsolate(); 1192 v8::Isolate* isolate = env->GetIsolate();
1115 v8::HandleScope scope(isolate); 1193 v8::HandleScope scope(isolate);
1116 v8::Handle<v8::Value> value; 1194 v8::Local<v8::Value> value;
1117 // check int32_t and uint32_t 1195 // check int32_t and uint32_t
1118 int32_t int_values[] = { 1196 int32_t int_values[] = {
1119 0, 234, -723, 1197 0, 234, -723,
1120 i::Smi::kMinValue, i::Smi::kMaxValue 1198 i::Smi::kMinValue, i::Smi::kMaxValue
1121 }; 1199 };
1122 for (size_t i = 0; i < arraysize(int_values); i++) { 1200 for (size_t i = 0; i < arraysize(int_values); i++) {
1123 for (int modifier = -1; modifier <= 1; modifier++) { 1201 for (int modifier = -1; modifier <= 1; modifier++) {
1124 int int_value = int_values[i] + modifier; 1202 int int_value = int_values[i] + modifier;
1125 // check int32_t 1203 // check int32_t
1126 fast_return_value_int32 = int_value; 1204 fast_return_value_int32 = int_value;
1127 value = TestFastReturnValues<int32_t>(); 1205 value = TestFastReturnValues<int32_t>();
1128 CHECK(value->IsInt32()); 1206 CHECK(value->IsInt32());
1129 CHECK(fast_return_value_int32 == value->Int32Value()); 1207 CHECK_EQ(fast_return_value_int32,
1208 value->Int32Value(env.local()).FromJust());
1130 // check uint32_t 1209 // check uint32_t
1131 fast_return_value_uint32 = static_cast<uint32_t>(int_value); 1210 fast_return_value_uint32 = static_cast<uint32_t>(int_value);
1132 value = TestFastReturnValues<uint32_t>(); 1211 value = TestFastReturnValues<uint32_t>();
1133 CHECK(value->IsUint32()); 1212 CHECK(value->IsUint32());
1134 CHECK(fast_return_value_uint32 == value->Uint32Value()); 1213 CHECK_EQ(fast_return_value_uint32,
1214 value->Uint32Value(env.local()).FromJust());
1135 } 1215 }
1136 } 1216 }
1137 // check double 1217 // check double
1138 value = TestFastReturnValues<double>(); 1218 value = TestFastReturnValues<double>();
1139 CHECK(value->IsNumber()); 1219 CHECK(value->IsNumber());
1140 CHECK_EQ(kFastReturnValueDouble, value->ToNumber(isolate)->Value()); 1220 CHECK_EQ(kFastReturnValueDouble,
1221 value->ToNumber(env.local()).ToLocalChecked()->Value());
1141 // check bool values 1222 // check bool values
1142 for (int i = 0; i < 2; i++) { 1223 for (int i = 0; i < 2; i++) {
1143 fast_return_value_bool = i == 0; 1224 fast_return_value_bool = i == 0;
1144 value = TestFastReturnValues<bool>(); 1225 value = TestFastReturnValues<bool>();
1145 CHECK(value->IsBoolean()); 1226 CHECK(value->IsBoolean());
1146 CHECK_EQ(fast_return_value_bool, value->ToBoolean(isolate)->Value()); 1227 CHECK_EQ(fast_return_value_bool,
1228 value->ToBoolean(env.local()).ToLocalChecked()->Value());
1147 } 1229 }
1148 // check oddballs 1230 // check oddballs
1149 ReturnValueOddball oddballs[] = { 1231 ReturnValueOddball oddballs[] = {
1150 kNullReturnValue, 1232 kNullReturnValue,
1151 kUndefinedReturnValue, 1233 kUndefinedReturnValue,
1152 kEmptyStringReturnValue 1234 kEmptyStringReturnValue
1153 }; 1235 };
1154 for (size_t i = 0; i < arraysize(oddballs); i++) { 1236 for (size_t i = 0; i < arraysize(oddballs); i++) {
1155 fast_return_value_void = oddballs[i]; 1237 fast_return_value_void = oddballs[i];
1156 value = TestFastReturnValues<void>(); 1238 value = TestFastReturnValues<void>();
(...skipping 19 matching lines...) Expand all
1176 CHECK(value->IsUndefined()); 1258 CHECK(value->IsUndefined());
1177 } 1259 }
1178 1260
1179 1261
1180 THREADED_TEST(FunctionTemplateSetLength) { 1262 THREADED_TEST(FunctionTemplateSetLength) {
1181 LocalContext env; 1263 LocalContext env;
1182 v8::Isolate* isolate = env->GetIsolate(); 1264 v8::Isolate* isolate = env->GetIsolate();
1183 v8::HandleScope scope(isolate); 1265 v8::HandleScope scope(isolate);
1184 { 1266 {
1185 Local<v8::FunctionTemplate> fun_templ = 1267 Local<v8::FunctionTemplate> fun_templ =
1186 v8::FunctionTemplate::New(isolate, 1268 v8::FunctionTemplate::New(isolate, handle_callback, Local<v8::Value>(),
1187 handle_callback, 1269 Local<v8::Signature>(), 23);
1188 Handle<v8::Value>(), 1270 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
1189 Handle<v8::Signature>(), 1271 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"); 1272 Local<Script> script = v8_compile("obj.length");
1194 CHECK_EQ(23, script->Run()->Int32Value()); 1273 CHECK_EQ(23, v8_run_int32value(script));
1195 } 1274 }
1196 { 1275 {
1197 Local<v8::FunctionTemplate> fun_templ = 1276 Local<v8::FunctionTemplate> fun_templ =
1198 v8::FunctionTemplate::New(isolate, handle_callback); 1277 v8::FunctionTemplate::New(isolate, handle_callback);
1199 fun_templ->SetLength(22); 1278 fun_templ->SetLength(22);
1200 Local<Function> fun = fun_templ->GetFunction(); 1279 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
1201 env->Global()->Set(v8_str("obj"), fun); 1280 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust());
1202 Local<Script> script = v8_compile("obj.length"); 1281 Local<Script> script = v8_compile("obj.length");
1203 CHECK_EQ(22, script->Run()->Int32Value()); 1282 CHECK_EQ(22, v8_run_int32value(script));
1204 } 1283 }
1205 { 1284 {
1206 // Without setting length it defaults to 0. 1285 // Without setting length it defaults to 0.
1207 Local<v8::FunctionTemplate> fun_templ = 1286 Local<v8::FunctionTemplate> fun_templ =
1208 v8::FunctionTemplate::New(isolate, handle_callback); 1287 v8::FunctionTemplate::New(isolate, handle_callback);
1209 Local<Function> fun = fun_templ->GetFunction(); 1288 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
1210 env->Global()->Set(v8_str("obj"), fun); 1289 CHECK(env->Global()->Set(env.local(), v8_str("obj"), fun).FromJust());
1211 Local<Script> script = v8_compile("obj.length"); 1290 Local<Script> script = v8_compile("obj.length");
1212 CHECK_EQ(0, script->Run()->Int32Value()); 1291 CHECK_EQ(0, v8_run_int32value(script));
1213 } 1292 }
1214 } 1293 }
1215 1294
1216 1295
1217 static void* expected_ptr; 1296 static void* expected_ptr;
1218 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) { 1297 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) {
1219 void* ptr = v8::External::Cast(*args.Data())->Value(); 1298 void* ptr = v8::External::Cast(*args.Data())->Value();
1220 CHECK_EQ(expected_ptr, ptr); 1299 CHECK_EQ(expected_ptr, ptr);
1221 args.GetReturnValue().Set(true); 1300 args.GetReturnValue().Set(true);
1222 } 1301 }
1223 1302
1224 1303
1225 static void TestExternalPointerWrapping() { 1304 static void TestExternalPointerWrapping() {
1226 LocalContext env; 1305 LocalContext env;
1227 v8::Isolate* isolate = env->GetIsolate(); 1306 v8::Isolate* isolate = env->GetIsolate();
1228 v8::HandleScope scope(isolate); 1307 v8::HandleScope scope(isolate);
1229 1308
1230 v8::Handle<v8::Value> data = 1309 v8::Local<v8::Value> data = v8::External::New(isolate, expected_ptr);
1231 v8::External::New(isolate, expected_ptr);
1232 1310
1233 v8::Handle<v8::Object> obj = v8::Object::New(isolate); 1311 v8::Local<v8::Object> obj = v8::Object::New(isolate);
1234 obj->Set(v8_str("func"), 1312 CHECK(obj->Set(env.local(), v8_str("func"),
1235 v8::FunctionTemplate::New(isolate, callback, data)->GetFunction()); 1313 v8::FunctionTemplate::New(isolate, callback, data)
1236 env->Global()->Set(v8_str("obj"), obj); 1314 ->GetFunction(env.local())
1315 .ToLocalChecked())
1316 .FromJust());
1317 CHECK(env->Global()->Set(env.local(), v8_str("obj"), obj).FromJust());
1237 1318
1238 CHECK(CompileRun( 1319 CHECK(CompileRun("function foo() {\n"
1239 "function foo() {\n" 1320 " for (var i = 0; i < 13; i++) obj.func();\n"
1240 " for (var i = 0; i < 13; i++) obj.func();\n" 1321 "}\n"
1241 "}\n" 1322 "foo(), true")
1242 "foo(), true")->BooleanValue()); 1323 ->BooleanValue(env.local())
1324 .FromJust());
1243 } 1325 }
1244 1326
1245 1327
1246 THREADED_TEST(ExternalWrap) { 1328 THREADED_TEST(ExternalWrap) {
1247 // Check heap allocated object. 1329 // Check heap allocated object.
1248 int* ptr = new int; 1330 int* ptr = new int;
1249 expected_ptr = ptr; 1331 expected_ptr = ptr;
1250 TestExternalPointerWrapping(); 1332 TestExternalPointerWrapping();
1251 delete ptr; 1333 delete ptr;
1252 1334
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 THREADED_TEST(FindInstanceInPrototypeChain) { 1374 THREADED_TEST(FindInstanceInPrototypeChain) {
1293 LocalContext env; 1375 LocalContext env;
1294 v8::Isolate* isolate = env->GetIsolate(); 1376 v8::Isolate* isolate = env->GetIsolate();
1295 v8::HandleScope scope(isolate); 1377 v8::HandleScope scope(isolate);
1296 1378
1297 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(isolate); 1379 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(isolate);
1298 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(isolate); 1380 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(isolate);
1299 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(isolate); 1381 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(isolate);
1300 derived->Inherit(base); 1382 derived->Inherit(base);
1301 1383
1302 Local<v8::Function> base_function = base->GetFunction(); 1384 Local<v8::Function> base_function =
1303 Local<v8::Function> derived_function = derived->GetFunction(); 1385 base->GetFunction(env.local()).ToLocalChecked();
1304 Local<v8::Function> other_function = other->GetFunction(); 1386 Local<v8::Function> derived_function =
1387 derived->GetFunction(env.local()).ToLocalChecked();
1388 Local<v8::Function> other_function =
1389 other->GetFunction(env.local()).ToLocalChecked();
1305 1390
1306 Local<v8::Object> base_instance = base_function->NewInstance(); 1391 Local<v8::Object> base_instance =
1307 Local<v8::Object> derived_instance = derived_function->NewInstance(); 1392 base_function->NewInstance(env.local()).ToLocalChecked();
1308 Local<v8::Object> derived_instance2 = derived_function->NewInstance(); 1393 Local<v8::Object> derived_instance =
1309 Local<v8::Object> other_instance = other_function->NewInstance(); 1394 derived_function->NewInstance(env.local()).ToLocalChecked();
1310 derived_instance2->Set(v8_str("__proto__"), derived_instance); 1395 Local<v8::Object> derived_instance2 =
1311 other_instance->Set(v8_str("__proto__"), derived_instance2); 1396 derived_function->NewInstance(env.local()).ToLocalChecked();
1397 Local<v8::Object> other_instance =
1398 other_function->NewInstance(env.local()).ToLocalChecked();
1399 CHECK(
1400 derived_instance2->Set(env.local(), v8_str("__proto__"), derived_instance)
1401 .FromJust());
1402 CHECK(other_instance->Set(env.local(), v8_str("__proto__"), derived_instance2)
1403 .FromJust());
1312 1404
1313 // base_instance is only an instance of base. 1405 // base_instance is only an instance of base.
1314 CHECK( 1406 CHECK(base_instance->Equals(env.local(),
1315 base_instance->Equals(base_instance->FindInstanceInPrototypeChain(base))); 1407 base_instance->FindInstanceInPrototypeChain(base))
1408 .FromJust());
1316 CHECK(base_instance->FindInstanceInPrototypeChain(derived).IsEmpty()); 1409 CHECK(base_instance->FindInstanceInPrototypeChain(derived).IsEmpty());
1317 CHECK(base_instance->FindInstanceInPrototypeChain(other).IsEmpty()); 1410 CHECK(base_instance->FindInstanceInPrototypeChain(other).IsEmpty());
1318 1411
1319 // derived_instance is an instance of base and derived. 1412 // derived_instance is an instance of base and derived.
1320 CHECK(derived_instance->Equals( 1413 CHECK(derived_instance->Equals(env.local(),
1321 derived_instance->FindInstanceInPrototypeChain(base))); 1414 derived_instance->FindInstanceInPrototypeChain(
1322 CHECK(derived_instance->Equals( 1415 base))
1323 derived_instance->FindInstanceInPrototypeChain(derived))); 1416 .FromJust());
1417 CHECK(derived_instance->Equals(env.local(),
1418 derived_instance->FindInstanceInPrototypeChain(
1419 derived))
1420 .FromJust());
1324 CHECK(derived_instance->FindInstanceInPrototypeChain(other).IsEmpty()); 1421 CHECK(derived_instance->FindInstanceInPrototypeChain(other).IsEmpty());
1325 1422
1326 // other_instance is an instance of other and its immediate 1423 // other_instance is an instance of other and its immediate
1327 // prototype derived_instance2 is an instance of base and derived. 1424 // prototype derived_instance2 is an instance of base and derived.
1328 // Note, derived_instance is an instance of base and derived too, 1425 // Note, derived_instance is an instance of base and derived too,
1329 // but it comes after derived_instance2 in the prototype chain of 1426 // but it comes after derived_instance2 in the prototype chain of
1330 // other_instance. 1427 // other_instance.
1331 CHECK(derived_instance2->Equals( 1428 CHECK(derived_instance2->Equals(
1332 other_instance->FindInstanceInPrototypeChain(base))); 1429 env.local(),
1333 CHECK(derived_instance2->Equals( 1430 other_instance->FindInstanceInPrototypeChain(base))
1334 other_instance->FindInstanceInPrototypeChain(derived))); 1431 .FromJust());
1432 CHECK(derived_instance2->Equals(env.local(),
1433 other_instance->FindInstanceInPrototypeChain(
1434 derived))
1435 .FromJust());
1335 CHECK(other_instance->Equals( 1436 CHECK(other_instance->Equals(
1336 other_instance->FindInstanceInPrototypeChain(other))); 1437 env.local(),
1438 other_instance->FindInstanceInPrototypeChain(other))
1439 .FromJust());
1337 } 1440 }
1338 1441
1339 1442
1340 THREADED_TEST(TinyInteger) { 1443 THREADED_TEST(TinyInteger) {
1341 LocalContext env; 1444 LocalContext env;
1342 v8::Isolate* isolate = env->GetIsolate(); 1445 v8::Isolate* isolate = env->GetIsolate();
1343 v8::HandleScope scope(isolate); 1446 v8::HandleScope scope(isolate);
1344 1447
1345 int32_t value = 239; 1448 int32_t value = 239;
1346 Local<v8::Integer> value_obj = v8::Integer::New(isolate, value); 1449 Local<v8::Integer> value_obj = v8::Integer::New(isolate, value);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1559 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1457 1560
1458 value_obj = v8::Integer::NewFromUnsigned(isolate, value); 1561 value_obj = v8::Integer::NewFromUnsigned(isolate, value);
1459 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value()); 1562 CHECK_EQ(static_cast<int64_t>(value), value_obj->Value());
1460 } 1563 }
1461 1564
1462 1565
1463 THREADED_TEST(IsNativeError) { 1566 THREADED_TEST(IsNativeError) {
1464 LocalContext env; 1567 LocalContext env;
1465 v8::HandleScope scope(env->GetIsolate()); 1568 v8::HandleScope scope(env->GetIsolate());
1466 v8::Handle<Value> syntax_error = CompileRun( 1569 v8::Local<Value> syntax_error = CompileRun(
1467 "var out = 0; try { eval(\"#\"); } catch(x) { out = x; } out; "); 1570 "var out = 0; try { eval(\"#\"); } catch(x) { out = x; } out; ");
1468 CHECK(syntax_error->IsNativeError()); 1571 CHECK(syntax_error->IsNativeError());
1469 v8::Handle<Value> not_error = CompileRun("{a:42}"); 1572 v8::Local<Value> not_error = CompileRun("{a:42}");
1470 CHECK(!not_error->IsNativeError()); 1573 CHECK(!not_error->IsNativeError());
1471 v8::Handle<Value> not_object = CompileRun("42"); 1574 v8::Local<Value> not_object = CompileRun("42");
1472 CHECK(!not_object->IsNativeError()); 1575 CHECK(!not_object->IsNativeError());
1473 } 1576 }
1474 1577
1475 1578
1476 THREADED_TEST(IsGeneratorFunctionOrObject) { 1579 THREADED_TEST(IsGeneratorFunctionOrObject) {
1477 LocalContext env; 1580 LocalContext env;
1478 v8::HandleScope scope(env->GetIsolate()); 1581 v8::HandleScope scope(env->GetIsolate());
1479 1582
1480 CompileRun("function *gen() { yield 1; }\nfunction func() {}"); 1583 CompileRun("function *gen() { yield 1; }\nfunction func() {}");
1481 v8::Handle<Value> gen = CompileRun("gen"); 1584 v8::Local<Value> gen = CompileRun("gen");
1482 v8::Handle<Value> genObj = CompileRun("gen()"); 1585 v8::Local<Value> genObj = CompileRun("gen()");
1483 v8::Handle<Value> object = CompileRun("{a:42}"); 1586 v8::Local<Value> object = CompileRun("{a:42}");
1484 v8::Handle<Value> func = CompileRun("func"); 1587 v8::Local<Value> func = CompileRun("func");
1485 1588
1486 CHECK(gen->IsGeneratorFunction()); 1589 CHECK(gen->IsGeneratorFunction());
1487 CHECK(gen->IsFunction()); 1590 CHECK(gen->IsFunction());
1488 CHECK(!gen->IsGeneratorObject()); 1591 CHECK(!gen->IsGeneratorObject());
1489 1592
1490 CHECK(!genObj->IsGeneratorFunction()); 1593 CHECK(!genObj->IsGeneratorFunction());
1491 CHECK(!genObj->IsFunction()); 1594 CHECK(!genObj->IsFunction());
1492 CHECK(genObj->IsGeneratorObject()); 1595 CHECK(genObj->IsGeneratorObject());
1493 1596
1494 CHECK(!object->IsGeneratorFunction()); 1597 CHECK(!object->IsGeneratorFunction());
1495 CHECK(!object->IsFunction()); 1598 CHECK(!object->IsFunction());
1496 CHECK(!object->IsGeneratorObject()); 1599 CHECK(!object->IsGeneratorObject());
1497 1600
1498 CHECK(!func->IsGeneratorFunction()); 1601 CHECK(!func->IsGeneratorFunction());
1499 CHECK(func->IsFunction()); 1602 CHECK(func->IsFunction());
1500 CHECK(!func->IsGeneratorObject()); 1603 CHECK(!func->IsGeneratorObject());
1501 } 1604 }
1502 1605
1503 1606
1504 THREADED_TEST(ArgumentsObject) { 1607 THREADED_TEST(ArgumentsObject) {
1505 LocalContext env; 1608 LocalContext env;
1506 v8::HandleScope scope(env->GetIsolate()); 1609 v8::HandleScope scope(env->GetIsolate());
1507 v8::Handle<Value> arguments_object = 1610 v8::Local<Value> arguments_object =
1508 CompileRun("var out = 0; (function(){ out = arguments; })(1,2,3); out;"); 1611 CompileRun("var out = 0; (function(){ out = arguments; })(1,2,3); out;");
1509 CHECK(arguments_object->IsArgumentsObject()); 1612 CHECK(arguments_object->IsArgumentsObject());
1510 v8::Handle<Value> array = CompileRun("[1,2,3]"); 1613 v8::Local<Value> array = CompileRun("[1,2,3]");
1511 CHECK(!array->IsArgumentsObject()); 1614 CHECK(!array->IsArgumentsObject());
1512 v8::Handle<Value> object = CompileRun("{a:42}"); 1615 v8::Local<Value> object = CompileRun("{a:42}");
1513 CHECK(!object->IsArgumentsObject()); 1616 CHECK(!object->IsArgumentsObject());
1514 } 1617 }
1515 1618
1516 1619
1517 THREADED_TEST(IsMapOrSet) { 1620 THREADED_TEST(IsMapOrSet) {
1518 LocalContext env; 1621 LocalContext env;
1519 v8::HandleScope scope(env->GetIsolate()); 1622 v8::HandleScope scope(env->GetIsolate());
1520 v8::Handle<Value> map = CompileRun("new Map()"); 1623 v8::Local<Value> map = CompileRun("new Map()");
1521 v8::Handle<Value> set = CompileRun("new Set()"); 1624 v8::Local<Value> set = CompileRun("new Set()");
1522 v8::Handle<Value> weak_map = CompileRun("new WeakMap()"); 1625 v8::Local<Value> weak_map = CompileRun("new WeakMap()");
1523 v8::Handle<Value> weak_set = CompileRun("new WeakSet()"); 1626 v8::Local<Value> weak_set = CompileRun("new WeakSet()");
1524 CHECK(map->IsMap()); 1627 CHECK(map->IsMap());
1525 CHECK(set->IsSet()); 1628 CHECK(set->IsSet());
1526 CHECK(weak_map->IsWeakMap()); 1629 CHECK(weak_map->IsWeakMap());
1527 CHECK(weak_set->IsWeakSet()); 1630 CHECK(weak_set->IsWeakSet());
1528 1631
1529 CHECK(!map->IsSet()); 1632 CHECK(!map->IsSet());
1530 CHECK(!map->IsWeakMap()); 1633 CHECK(!map->IsWeakMap());
1531 CHECK(!map->IsWeakSet()); 1634 CHECK(!map->IsWeakSet());
1532 1635
1533 CHECK(!set->IsMap()); 1636 CHECK(!set->IsMap());
1534 CHECK(!set->IsWeakMap()); 1637 CHECK(!set->IsWeakMap());
1535 CHECK(!set->IsWeakSet()); 1638 CHECK(!set->IsWeakSet());
1536 1639
1537 CHECK(!weak_map->IsMap()); 1640 CHECK(!weak_map->IsMap());
1538 CHECK(!weak_map->IsSet()); 1641 CHECK(!weak_map->IsSet());
1539 CHECK(!weak_map->IsWeakSet()); 1642 CHECK(!weak_map->IsWeakSet());
1540 1643
1541 CHECK(!weak_set->IsMap()); 1644 CHECK(!weak_set->IsMap());
1542 CHECK(!weak_set->IsSet()); 1645 CHECK(!weak_set->IsSet());
1543 CHECK(!weak_set->IsWeakMap()); 1646 CHECK(!weak_set->IsWeakMap());
1544 1647
1545 v8::Handle<Value> object = CompileRun("{a:42}"); 1648 v8::Local<Value> object = CompileRun("{a:42}");
1546 CHECK(!object->IsMap()); 1649 CHECK(!object->IsMap());
1547 CHECK(!object->IsSet()); 1650 CHECK(!object->IsSet());
1548 CHECK(!object->IsWeakMap()); 1651 CHECK(!object->IsWeakMap());
1549 CHECK(!object->IsWeakSet()); 1652 CHECK(!object->IsWeakSet());
1550 } 1653 }
1551 1654
1552 1655
1553 THREADED_TEST(StringObject) { 1656 THREADED_TEST(StringObject) {
1554 LocalContext env; 1657 LocalContext env;
1555 v8::HandleScope scope(env->GetIsolate()); 1658 v8::HandleScope scope(env->GetIsolate());
1556 v8::Handle<Value> boxed_string = CompileRun("new String(\"test\")"); 1659 v8::Local<Value> boxed_string = CompileRun("new String(\"test\")");
1557 CHECK(boxed_string->IsStringObject()); 1660 CHECK(boxed_string->IsStringObject());
1558 v8::Handle<Value> unboxed_string = CompileRun("\"test\""); 1661 v8::Local<Value> unboxed_string = CompileRun("\"test\"");
1559 CHECK(!unboxed_string->IsStringObject()); 1662 CHECK(!unboxed_string->IsStringObject());
1560 v8::Handle<Value> boxed_not_string = CompileRun("new Number(42)"); 1663 v8::Local<Value> boxed_not_string = CompileRun("new Number(42)");
1561 CHECK(!boxed_not_string->IsStringObject()); 1664 CHECK(!boxed_not_string->IsStringObject());
1562 v8::Handle<Value> not_object = CompileRun("0"); 1665 v8::Local<Value> not_object = CompileRun("0");
1563 CHECK(!not_object->IsStringObject()); 1666 CHECK(!not_object->IsStringObject());
1564 v8::Handle<v8::StringObject> as_boxed = boxed_string.As<v8::StringObject>(); 1667 v8::Local<v8::StringObject> as_boxed = boxed_string.As<v8::StringObject>();
1565 CHECK(!as_boxed.IsEmpty()); 1668 CHECK(!as_boxed.IsEmpty());
1566 Local<v8::String> the_string = as_boxed->ValueOf(); 1669 Local<v8::String> the_string = as_boxed->ValueOf();
1567 CHECK(!the_string.IsEmpty()); 1670 CHECK(!the_string.IsEmpty());
1568 ExpectObject("\"test\"", the_string); 1671 ExpectObject("\"test\"", the_string);
1569 v8::Handle<v8::Value> new_boxed_string = v8::StringObject::New(the_string); 1672 v8::Local<v8::Value> new_boxed_string = v8::StringObject::New(the_string);
1570 CHECK(new_boxed_string->IsStringObject()); 1673 CHECK(new_boxed_string->IsStringObject());
1571 as_boxed = new_boxed_string.As<v8::StringObject>(); 1674 as_boxed = new_boxed_string.As<v8::StringObject>();
1572 the_string = as_boxed->ValueOf(); 1675 the_string = as_boxed->ValueOf();
1573 CHECK(!the_string.IsEmpty()); 1676 CHECK(!the_string.IsEmpty());
1574 ExpectObject("\"test\"", the_string); 1677 ExpectObject("\"test\"", the_string);
1575 } 1678 }
1576 1679
1577 1680
1578 TEST(StringObjectDelete) { 1681 TEST(StringObjectDelete) {
1579 LocalContext context; 1682 LocalContext context;
1580 v8::HandleScope scope(context->GetIsolate()); 1683 v8::HandleScope scope(context->GetIsolate());
1581 v8::Handle<Value> boxed_string = CompileRun("new String(\"test\")"); 1684 v8::Local<Value> boxed_string = CompileRun("new String(\"test\")");
1582 CHECK(boxed_string->IsStringObject()); 1685 CHECK(boxed_string->IsStringObject());
1583 v8::Handle<v8::Object> str_obj = boxed_string.As<v8::Object>(); 1686 v8::Local<v8::Object> str_obj = boxed_string.As<v8::Object>();
1584 CHECK(!str_obj->Delete(2)); 1687 CHECK(!str_obj->Delete(context.local(), 2).FromJust());
1585 CHECK(!str_obj->Delete(v8_num(2))); 1688 CHECK(!str_obj->Delete(context.local(), v8_num(2)).FromJust());
1586 } 1689 }
1587 1690
1588 1691
1589 THREADED_TEST(NumberObject) { 1692 THREADED_TEST(NumberObject) {
1590 LocalContext env; 1693 LocalContext env;
1591 v8::HandleScope scope(env->GetIsolate()); 1694 v8::HandleScope scope(env->GetIsolate());
1592 v8::Handle<Value> boxed_number = CompileRun("new Number(42)"); 1695 v8::Local<Value> boxed_number = CompileRun("new Number(42)");
1593 CHECK(boxed_number->IsNumberObject()); 1696 CHECK(boxed_number->IsNumberObject());
1594 v8::Handle<Value> unboxed_number = CompileRun("42"); 1697 v8::Local<Value> unboxed_number = CompileRun("42");
1595 CHECK(!unboxed_number->IsNumberObject()); 1698 CHECK(!unboxed_number->IsNumberObject());
1596 v8::Handle<Value> boxed_not_number = CompileRun("new Boolean(false)"); 1699 v8::Local<Value> boxed_not_number = CompileRun("new Boolean(false)");
1597 CHECK(!boxed_not_number->IsNumberObject()); 1700 CHECK(!boxed_not_number->IsNumberObject());
1598 v8::Handle<v8::NumberObject> as_boxed = boxed_number.As<v8::NumberObject>(); 1701 v8::Local<v8::NumberObject> as_boxed = boxed_number.As<v8::NumberObject>();
1599 CHECK(!as_boxed.IsEmpty()); 1702 CHECK(!as_boxed.IsEmpty());
1600 double the_number = as_boxed->ValueOf(); 1703 double the_number = as_boxed->ValueOf();
1601 CHECK_EQ(42.0, the_number); 1704 CHECK_EQ(42.0, the_number);
1602 v8::Handle<v8::Value> new_boxed_number = 1705 v8::Local<v8::Value> new_boxed_number =
1603 v8::NumberObject::New(env->GetIsolate(), 43); 1706 v8::NumberObject::New(env->GetIsolate(), 43);
1604 CHECK(new_boxed_number->IsNumberObject()); 1707 CHECK(new_boxed_number->IsNumberObject());
1605 as_boxed = new_boxed_number.As<v8::NumberObject>(); 1708 as_boxed = new_boxed_number.As<v8::NumberObject>();
1606 the_number = as_boxed->ValueOf(); 1709 the_number = as_boxed->ValueOf();
1607 CHECK_EQ(43.0, the_number); 1710 CHECK_EQ(43.0, the_number);
1608 } 1711 }
1609 1712
1610 1713
1611 THREADED_TEST(BooleanObject) { 1714 THREADED_TEST(BooleanObject) {
1612 LocalContext env; 1715 LocalContext env;
1613 v8::HandleScope scope(env->GetIsolate()); 1716 v8::HandleScope scope(env->GetIsolate());
1614 v8::Handle<Value> boxed_boolean = CompileRun("new Boolean(true)"); 1717 v8::Local<Value> boxed_boolean = CompileRun("new Boolean(true)");
1615 CHECK(boxed_boolean->IsBooleanObject()); 1718 CHECK(boxed_boolean->IsBooleanObject());
1616 v8::Handle<Value> unboxed_boolean = CompileRun("true"); 1719 v8::Local<Value> unboxed_boolean = CompileRun("true");
1617 CHECK(!unboxed_boolean->IsBooleanObject()); 1720 CHECK(!unboxed_boolean->IsBooleanObject());
1618 v8::Handle<Value> boxed_not_boolean = CompileRun("new Number(42)"); 1721 v8::Local<Value> boxed_not_boolean = CompileRun("new Number(42)");
1619 CHECK(!boxed_not_boolean->IsBooleanObject()); 1722 CHECK(!boxed_not_boolean->IsBooleanObject());
1620 v8::Handle<v8::BooleanObject> as_boxed = 1723 v8::Local<v8::BooleanObject> as_boxed = boxed_boolean.As<v8::BooleanObject>();
1621 boxed_boolean.As<v8::BooleanObject>();
1622 CHECK(!as_boxed.IsEmpty()); 1724 CHECK(!as_boxed.IsEmpty());
1623 bool the_boolean = as_boxed->ValueOf(); 1725 bool the_boolean = as_boxed->ValueOf();
1624 CHECK_EQ(true, the_boolean); 1726 CHECK_EQ(true, the_boolean);
1625 v8::Handle<v8::Value> boxed_true = v8::BooleanObject::New(true); 1727 v8::Local<v8::Value> boxed_true = v8::BooleanObject::New(true);
1626 v8::Handle<v8::Value> boxed_false = v8::BooleanObject::New(false); 1728 v8::Local<v8::Value> boxed_false = v8::BooleanObject::New(false);
1627 CHECK(boxed_true->IsBooleanObject()); 1729 CHECK(boxed_true->IsBooleanObject());
1628 CHECK(boxed_false->IsBooleanObject()); 1730 CHECK(boxed_false->IsBooleanObject());
1629 as_boxed = boxed_true.As<v8::BooleanObject>(); 1731 as_boxed = boxed_true.As<v8::BooleanObject>();
1630 CHECK_EQ(true, as_boxed->ValueOf()); 1732 CHECK_EQ(true, as_boxed->ValueOf());
1631 as_boxed = boxed_false.As<v8::BooleanObject>(); 1733 as_boxed = boxed_false.As<v8::BooleanObject>();
1632 CHECK_EQ(false, as_boxed->ValueOf()); 1734 CHECK_EQ(false, as_boxed->ValueOf());
1633 } 1735 }
1634 1736
1635 1737
1636 THREADED_TEST(PrimitiveAndWrappedBooleans) { 1738 THREADED_TEST(PrimitiveAndWrappedBooleans) {
1637 LocalContext env; 1739 LocalContext env;
1638 v8::HandleScope scope(env->GetIsolate()); 1740 v8::HandleScope scope(env->GetIsolate());
1639 1741
1640 Local<Value> primitive_false = Boolean::New(env->GetIsolate(), false); 1742 Local<Value> primitive_false = Boolean::New(env->GetIsolate(), false);
1641 CHECK(primitive_false->IsBoolean()); 1743 CHECK(primitive_false->IsBoolean());
1642 CHECK(!primitive_false->IsBooleanObject()); 1744 CHECK(!primitive_false->IsBooleanObject());
1643 CHECK(!primitive_false->BooleanValue()); 1745 CHECK(!primitive_false->BooleanValue(env.local()).FromJust());
1644 CHECK(!primitive_false->IsTrue()); 1746 CHECK(!primitive_false->IsTrue());
1645 CHECK(primitive_false->IsFalse()); 1747 CHECK(primitive_false->IsFalse());
1646 1748
1647 Local<Value> false_value = BooleanObject::New(false); 1749 Local<Value> false_value = BooleanObject::New(false);
1648 CHECK(!false_value->IsBoolean()); 1750 CHECK(!false_value->IsBoolean());
1649 CHECK(false_value->IsBooleanObject()); 1751 CHECK(false_value->IsBooleanObject());
1650 CHECK(false_value->BooleanValue()); 1752 CHECK(false_value->BooleanValue(env.local()).FromJust());
1651 CHECK(!false_value->IsTrue()); 1753 CHECK(!false_value->IsTrue());
1652 CHECK(!false_value->IsFalse()); 1754 CHECK(!false_value->IsFalse());
1653 1755
1654 Local<BooleanObject> false_boolean_object = false_value.As<BooleanObject>(); 1756 Local<BooleanObject> false_boolean_object = false_value.As<BooleanObject>();
1655 CHECK(!false_boolean_object->IsBoolean()); 1757 CHECK(!false_boolean_object->IsBoolean());
1656 CHECK(false_boolean_object->IsBooleanObject()); 1758 CHECK(false_boolean_object->IsBooleanObject());
1657 // TODO(svenpanne) Uncomment when BooleanObject::BooleanValue() is deleted. 1759 CHECK(false_boolean_object->BooleanValue(env.local()).FromJust());
1658 // CHECK(false_boolean_object->BooleanValue());
1659 CHECK(!false_boolean_object->ValueOf()); 1760 CHECK(!false_boolean_object->ValueOf());
1660 CHECK(!false_boolean_object->IsTrue()); 1761 CHECK(!false_boolean_object->IsTrue());
1661 CHECK(!false_boolean_object->IsFalse()); 1762 CHECK(!false_boolean_object->IsFalse());
1662 1763
1663 Local<Value> primitive_true = Boolean::New(env->GetIsolate(), true); 1764 Local<Value> primitive_true = Boolean::New(env->GetIsolate(), true);
1664 CHECK(primitive_true->IsBoolean()); 1765 CHECK(primitive_true->IsBoolean());
1665 CHECK(!primitive_true->IsBooleanObject()); 1766 CHECK(!primitive_true->IsBooleanObject());
1666 CHECK(primitive_true->BooleanValue()); 1767 CHECK(primitive_true->BooleanValue(env.local()).FromJust());
1667 CHECK(primitive_true->IsTrue()); 1768 CHECK(primitive_true->IsTrue());
1668 CHECK(!primitive_true->IsFalse()); 1769 CHECK(!primitive_true->IsFalse());
1669 1770
1670 Local<Value> true_value = BooleanObject::New(true); 1771 Local<Value> true_value = BooleanObject::New(true);
1671 CHECK(!true_value->IsBoolean()); 1772 CHECK(!true_value->IsBoolean());
1672 CHECK(true_value->IsBooleanObject()); 1773 CHECK(true_value->IsBooleanObject());
1673 CHECK(true_value->BooleanValue()); 1774 CHECK(true_value->BooleanValue(env.local()).FromJust());
1674 CHECK(!true_value->IsTrue()); 1775 CHECK(!true_value->IsTrue());
1675 CHECK(!true_value->IsFalse()); 1776 CHECK(!true_value->IsFalse());
1676 1777
1677 Local<BooleanObject> true_boolean_object = true_value.As<BooleanObject>(); 1778 Local<BooleanObject> true_boolean_object = true_value.As<BooleanObject>();
1678 CHECK(!true_boolean_object->IsBoolean()); 1779 CHECK(!true_boolean_object->IsBoolean());
1679 CHECK(true_boolean_object->IsBooleanObject()); 1780 CHECK(true_boolean_object->IsBooleanObject());
1680 // TODO(svenpanne) Uncomment when BooleanObject::BooleanValue() is deleted. 1781 CHECK(true_boolean_object->BooleanValue(env.local()).FromJust());
1681 // CHECK(true_boolean_object->BooleanValue());
1682 CHECK(true_boolean_object->ValueOf()); 1782 CHECK(true_boolean_object->ValueOf());
1683 CHECK(!true_boolean_object->IsTrue()); 1783 CHECK(!true_boolean_object->IsTrue());
1684 CHECK(!true_boolean_object->IsFalse()); 1784 CHECK(!true_boolean_object->IsFalse());
1685 } 1785 }
1686 1786
1687 1787
1688 THREADED_TEST(Number) { 1788 THREADED_TEST(Number) {
1689 LocalContext env; 1789 LocalContext env;
1690 v8::HandleScope scope(env->GetIsolate()); 1790 v8::HandleScope scope(env->GetIsolate());
1691 double PI = 3.1415926; 1791 double PI = 3.1415926;
1692 Local<v8::Number> pi_obj = v8::Number::New(env->GetIsolate(), PI); 1792 Local<v8::Number> pi_obj = v8::Number::New(env->GetIsolate(), PI);
1693 CHECK_EQ(PI, pi_obj->NumberValue()); 1793 CHECK_EQ(PI, pi_obj->NumberValue(env.local()).FromJust());
1694 } 1794 }
1695 1795
1696 1796
1697 THREADED_TEST(ToNumber) { 1797 THREADED_TEST(ToNumber) {
1698 LocalContext env; 1798 LocalContext env;
1699 v8::Isolate* isolate = CcTest::isolate(); 1799 v8::Isolate* isolate = CcTest::isolate();
1700 v8::HandleScope scope(isolate); 1800 v8::HandleScope scope(isolate);
1701 Local<String> str = v8_str("3.1415926"); 1801 Local<String> str = v8_str("3.1415926");
1702 CHECK_EQ(3.1415926, str->NumberValue()); 1802 CHECK_EQ(3.1415926, str->NumberValue(env.local()).FromJust());
1703 v8::Handle<v8::Boolean> t = v8::True(isolate); 1803 v8::Local<v8::Boolean> t = v8::True(isolate);
1704 CHECK_EQ(1.0, t->NumberValue()); 1804 CHECK_EQ(1.0, t->NumberValue(env.local()).FromJust());
1705 v8::Handle<v8::Boolean> f = v8::False(isolate); 1805 v8::Local<v8::Boolean> f = v8::False(isolate);
1706 CHECK_EQ(0.0, f->NumberValue()); 1806 CHECK_EQ(0.0, f->NumberValue(env.local()).FromJust());
1707 } 1807 }
1708 1808
1709 1809
1710 THREADED_TEST(Date) { 1810 THREADED_TEST(Date) {
1711 LocalContext env; 1811 LocalContext env;
1712 v8::HandleScope scope(env->GetIsolate()); 1812 v8::HandleScope scope(env->GetIsolate());
1713 double PI = 3.1415926; 1813 double PI = 3.1415926;
1714 Local<Value> date = v8::Date::New(env->GetIsolate(), PI); 1814 Local<Value> date = v8::Date::New(env.local(), PI).ToLocalChecked();
1715 CHECK_EQ(3.0, date->NumberValue()); 1815 CHECK_EQ(3.0, date->NumberValue(env.local()).FromJust());
1716 date.As<v8::Date>()->Set(v8_str("property"), 1816 CHECK(date.As<v8::Date>()
1717 v8::Integer::New(env->GetIsolate(), 42)); 1817 ->Set(env.local(), v8_str("property"),
1718 CHECK_EQ(42, date.As<v8::Date>()->Get(v8_str("property"))->Int32Value()); 1818 v8::Integer::New(env->GetIsolate(), 42))
1819 .FromJust());
1820 CHECK_EQ(42, date.As<v8::Date>()
1821 ->Get(env.local(), v8_str("property"))
1822 .ToLocalChecked()
1823 ->Int32Value(env.local())
1824 .FromJust());
1719 } 1825 }
1720 1826
1721 1827
1722 THREADED_TEST(Boolean) { 1828 THREADED_TEST(Boolean) {
1723 LocalContext env; 1829 LocalContext env;
1724 v8::Isolate* isolate = env->GetIsolate(); 1830 v8::Isolate* isolate = env->GetIsolate();
1725 v8::HandleScope scope(isolate); 1831 v8::HandleScope scope(isolate);
1726 v8::Handle<v8::Boolean> t = v8::True(isolate); 1832 v8::Local<v8::Boolean> t = v8::True(isolate);
1727 CHECK(t->Value()); 1833 CHECK(t->Value());
1728 v8::Handle<v8::Boolean> f = v8::False(isolate); 1834 v8::Local<v8::Boolean> f = v8::False(isolate);
1729 CHECK(!f->Value()); 1835 CHECK(!f->Value());
1730 v8::Handle<v8::Primitive> u = v8::Undefined(isolate); 1836 v8::Local<v8::Primitive> u = v8::Undefined(isolate);
1731 CHECK(!u->BooleanValue()); 1837 CHECK(!u->BooleanValue(env.local()).FromJust());
1732 v8::Handle<v8::Primitive> n = v8::Null(isolate); 1838 v8::Local<v8::Primitive> n = v8::Null(isolate);
1733 CHECK(!n->BooleanValue()); 1839 CHECK(!n->BooleanValue(env.local()).FromJust());
1734 v8::Handle<String> str1 = v8_str(""); 1840 v8::Local<String> str1 = v8_str("");
1735 CHECK(!str1->BooleanValue()); 1841 CHECK(!str1->BooleanValue(env.local()).FromJust());
1736 v8::Handle<String> str2 = v8_str("x"); 1842 v8::Local<String> str2 = v8_str("x");
1737 CHECK(str2->BooleanValue()); 1843 CHECK(str2->BooleanValue(env.local()).FromJust());
1738 CHECK(!v8::Number::New(isolate, 0)->BooleanValue()); 1844 CHECK(!v8::Number::New(isolate, 0)->BooleanValue(env.local()).FromJust());
1739 CHECK(v8::Number::New(isolate, -1)->BooleanValue()); 1845 CHECK(v8::Number::New(isolate, -1)->BooleanValue(env.local()).FromJust());
1740 CHECK(v8::Number::New(isolate, 1)->BooleanValue()); 1846 CHECK(v8::Number::New(isolate, 1)->BooleanValue(env.local()).FromJust());
1741 CHECK(v8::Number::New(isolate, 42)->BooleanValue()); 1847 CHECK(v8::Number::New(isolate, 42)->BooleanValue(env.local()).FromJust());
1742 CHECK(!v8_compile("NaN")->Run()->BooleanValue()); 1848 CHECK(!v8_compile("NaN")
1849 ->Run(env.local())
1850 .ToLocalChecked()
1851 ->BooleanValue(env.local())
1852 .FromJust());
1743 } 1853 }
1744 1854
1745 1855
1746 static void DummyCallHandler(const v8::FunctionCallbackInfo<v8::Value>& args) { 1856 static void DummyCallHandler(const v8::FunctionCallbackInfo<v8::Value>& args) {
1747 ApiTestFuzzer::Fuzz(); 1857 ApiTestFuzzer::Fuzz();
1748 args.GetReturnValue().Set(v8_num(13.4)); 1858 args.GetReturnValue().Set(v8_num(13.4));
1749 } 1859 }
1750 1860
1751 1861
1752 static void GetM(Local<String> name, 1862 static void GetM(Local<String> name,
1753 const v8::PropertyCallbackInfo<v8::Value>& info) { 1863 const v8::PropertyCallbackInfo<v8::Value>& info) {
1754 ApiTestFuzzer::Fuzz(); 1864 ApiTestFuzzer::Fuzz();
1755 info.GetReturnValue().Set(v8_num(876)); 1865 info.GetReturnValue().Set(v8_num(876));
1756 } 1866 }
1757 1867
1758 1868
1759 THREADED_TEST(GlobalPrototype) { 1869 THREADED_TEST(GlobalPrototype) {
1760 v8::Isolate* isolate = CcTest::isolate(); 1870 v8::Isolate* isolate = CcTest::isolate();
1761 v8::HandleScope scope(isolate); 1871 v8::HandleScope scope(isolate);
1762 v8::Handle<v8::FunctionTemplate> func_templ = 1872 v8::Local<v8::FunctionTemplate> func_templ =
1763 v8::FunctionTemplate::New(isolate); 1873 v8::FunctionTemplate::New(isolate);
1764 func_templ->PrototypeTemplate()->Set( 1874 func_templ->PrototypeTemplate()->Set(
1765 isolate, "dummy", v8::FunctionTemplate::New(isolate, DummyCallHandler)); 1875 isolate, "dummy", v8::FunctionTemplate::New(isolate, DummyCallHandler));
1766 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); 1876 v8::Local<ObjectTemplate> templ = func_templ->InstanceTemplate();
1767 templ->Set(isolate, "x", v8_num(200)); 1877 templ->Set(isolate, "x", v8_num(200));
1768 templ->SetAccessor(v8_str("m"), GetM); 1878 templ->SetAccessor(v8_str("m"), GetM);
1769 LocalContext env(0, templ); 1879 LocalContext env(0, templ);
1770 v8::Handle<Script> script(v8_compile("dummy()")); 1880 v8::Local<Script> script(v8_compile("dummy()"));
1771 v8::Handle<Value> result(script->Run()); 1881 v8::Local<Value> result(script->Run(env.local()).ToLocalChecked());
1772 CHECK_EQ(13.4, result->NumberValue()); 1882 CHECK_EQ(13.4, result->NumberValue(env.local()).FromJust());
1773 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); 1883 CHECK_EQ(200, v8_run_int32value(v8_compile("x")));
1774 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); 1884 CHECK_EQ(876, v8_run_int32value(v8_compile("m")));
1775 } 1885 }
1776 1886
1777 1887
1778 THREADED_TEST(ObjectTemplate) { 1888 THREADED_TEST(ObjectTemplate) {
1779 v8::Isolate* isolate = CcTest::isolate(); 1889 v8::Isolate* isolate = CcTest::isolate();
1780 v8::HandleScope scope(isolate); 1890 v8::HandleScope scope(isolate);
1781 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); 1891 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
1782 v8::Local<v8::String> class_name = 1892 v8::Local<v8::String> class_name = v8_str("the_class_name");
1783 v8::String::NewFromUtf8(isolate, "the_class_name");
1784 fun->SetClassName(class_name); 1893 fun->SetClassName(class_name);
1785 Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun); 1894 Local<ObjectTemplate> templ1 = ObjectTemplate::New(isolate, fun);
1786 templ1->Set(isolate, "x", v8_num(10)); 1895 templ1->Set(isolate, "x", v8_num(10));
1787 templ1->Set(isolate, "y", v8_num(13)); 1896 templ1->Set(isolate, "y", v8_num(13));
1788 LocalContext env; 1897 LocalContext env;
1789 Local<v8::Object> instance1 = templ1->NewInstance(); 1898 Local<v8::Object> instance1 =
1899 templ1->NewInstance(env.local()).ToLocalChecked();
1790 CHECK(class_name->StrictEquals(instance1->GetConstructorName())); 1900 CHECK(class_name->StrictEquals(instance1->GetConstructorName()));
1791 env->Global()->Set(v8_str("p"), instance1); 1901 CHECK(env->Global()->Set(env.local(), v8_str("p"), instance1).FromJust());
1792 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); 1902 CHECK(v8_compile("(p.x == 10)")
1793 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); 1903 ->Run(env.local())
1904 .ToLocalChecked()
1905 ->BooleanValue(env.local())
1906 .FromJust());
1907 CHECK(v8_compile("(p.y == 13)")
1908 ->Run(env.local())
1909 .ToLocalChecked()
1910 ->BooleanValue(env.local())
1911 .FromJust());
1794 Local<v8::FunctionTemplate> fun2 = v8::FunctionTemplate::New(isolate); 1912 Local<v8::FunctionTemplate> fun2 = v8::FunctionTemplate::New(isolate);
1795 fun2->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123)); 1913 fun2->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123));
1796 Local<ObjectTemplate> templ2 = fun2->InstanceTemplate(); 1914 Local<ObjectTemplate> templ2 = fun2->InstanceTemplate();
1797 templ2->Set(isolate, "a", v8_num(12)); 1915 templ2->Set(isolate, "a", v8_num(12));
1798 templ2->Set(isolate, "b", templ1); 1916 templ2->Set(isolate, "b", templ1);
1799 Local<v8::Object> instance2 = templ2->NewInstance(); 1917 Local<v8::Object> instance2 =
1800 env->Global()->Set(v8_str("q"), instance2); 1918 templ2->NewInstance(env.local()).ToLocalChecked();
1801 CHECK(v8_compile("(q.nirk == 123)")->Run()->BooleanValue()); 1919 CHECK(env->Global()->Set(env.local(), v8_str("q"), instance2).FromJust());
1802 CHECK(v8_compile("(q.a == 12)")->Run()->BooleanValue()); 1920 CHECK(v8_compile("(q.nirk == 123)")
1803 CHECK(v8_compile("(q.b.x == 10)")->Run()->BooleanValue()); 1921 ->Run(env.local())
1804 CHECK(v8_compile("(q.b.y == 13)")->Run()->BooleanValue()); 1922 .ToLocalChecked()
1923 ->BooleanValue(env.local())
1924 .FromJust());
1925 CHECK(v8_compile("(q.a == 12)")
1926 ->Run(env.local())
1927 .ToLocalChecked()
1928 ->BooleanValue(env.local())
1929 .FromJust());
1930 CHECK(v8_compile("(q.b.x == 10)")
1931 ->Run(env.local())
1932 .ToLocalChecked()
1933 ->BooleanValue(env.local())
1934 .FromJust());
1935 CHECK(v8_compile("(q.b.y == 13)")
1936 ->Run(env.local())
1937 .ToLocalChecked()
1938 ->BooleanValue(env.local())
1939 .FromJust());
1805 } 1940 }
1806 1941
1807 1942
1808 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) { 1943 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) {
1809 ApiTestFuzzer::Fuzz(); 1944 ApiTestFuzzer::Fuzz();
1810 args.GetReturnValue().Set(v8_num(17.2)); 1945 args.GetReturnValue().Set(v8_num(17.2));
1811 } 1946 }
1812 1947
1813 1948
1814 static void GetKnurd(Local<String> property, 1949 static void GetKnurd(Local<String> property,
1815 const v8::PropertyCallbackInfo<v8::Value>& info) { 1950 const v8::PropertyCallbackInfo<v8::Value>& info) {
1816 ApiTestFuzzer::Fuzz(); 1951 ApiTestFuzzer::Fuzz();
1817 info.GetReturnValue().Set(v8_num(15.2)); 1952 info.GetReturnValue().Set(v8_num(15.2));
1818 } 1953 }
1819 1954
1820 1955
1821 THREADED_TEST(DescriptorInheritance) { 1956 THREADED_TEST(DescriptorInheritance) {
1822 v8::Isolate* isolate = CcTest::isolate(); 1957 v8::Isolate* isolate = CcTest::isolate();
1823 v8::HandleScope scope(isolate); 1958 v8::HandleScope scope(isolate);
1824 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New(isolate); 1959 v8::Local<v8::FunctionTemplate> super = v8::FunctionTemplate::New(isolate);
1825 super->PrototypeTemplate()->Set(isolate, "flabby", 1960 super->PrototypeTemplate()->Set(isolate, "flabby",
1826 v8::FunctionTemplate::New(isolate, 1961 v8::FunctionTemplate::New(isolate,
1827 GetFlabby)); 1962 GetFlabby));
1828 super->PrototypeTemplate()->Set(isolate, "PI", v8_num(3.14)); 1963 super->PrototypeTemplate()->Set(isolate, "PI", v8_num(3.14));
1829 1964
1830 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); 1965 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd);
1831 1966
1832 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(isolate); 1967 v8::Local<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(isolate);
1833 base1->Inherit(super); 1968 base1->Inherit(super);
1834 base1->PrototypeTemplate()->Set(isolate, "v1", v8_num(20.1)); 1969 base1->PrototypeTemplate()->Set(isolate, "v1", v8_num(20.1));
1835 1970
1836 v8::Handle<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(isolate); 1971 v8::Local<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(isolate);
1837 base2->Inherit(super); 1972 base2->Inherit(super);
1838 base2->PrototypeTemplate()->Set(isolate, "v2", v8_num(10.1)); 1973 base2->PrototypeTemplate()->Set(isolate, "v2", v8_num(10.1));
1839 1974
1840 LocalContext env; 1975 LocalContext env;
1841 1976
1842 env->Global()->Set(v8_str("s"), super->GetFunction()); 1977 CHECK(env->Global()
1843 env->Global()->Set(v8_str("base1"), base1->GetFunction()); 1978 ->Set(env.local(), v8_str("s"),
1844 env->Global()->Set(v8_str("base2"), base2->GetFunction()); 1979 super->GetFunction(env.local()).ToLocalChecked())
1980 .FromJust());
1981 CHECK(env->Global()
1982 ->Set(env.local(), v8_str("base1"),
1983 base1->GetFunction(env.local()).ToLocalChecked())
1984 .FromJust());
1985 CHECK(env->Global()
1986 ->Set(env.local(), v8_str("base2"),
1987 base2->GetFunction(env.local()).ToLocalChecked())
1988 .FromJust());
1845 1989
1846 // Checks right __proto__ chain. 1990 // Checks right __proto__ chain.
1847 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype")->BooleanValue()); 1991 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype")
1848 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype")->BooleanValue()); 1992 ->BooleanValue(env.local())
1993 .FromJust());
1994 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype")
1995 ->BooleanValue(env.local())
1996 .FromJust());
1849 1997
1850 CHECK(v8_compile("s.prototype.PI == 3.14")->Run()->BooleanValue()); 1998 CHECK(v8_compile("s.prototype.PI == 3.14")
1999 ->Run(env.local())
2000 .ToLocalChecked()
2001 ->BooleanValue(env.local())
2002 .FromJust());
1851 2003
1852 // Instance accessor should not be visible on function object or its prototype 2004 // Instance accessor should not be visible on function object or its prototype
1853 CHECK(CompileRun("s.knurd == undefined")->BooleanValue()); 2005 CHECK(
1854 CHECK(CompileRun("s.prototype.knurd == undefined")->BooleanValue()); 2006 CompileRun("s.knurd == undefined")->BooleanValue(env.local()).FromJust());
1855 CHECK(CompileRun("base1.prototype.knurd == undefined")->BooleanValue()); 2007 CHECK(CompileRun("s.prototype.knurd == undefined")
2008 ->BooleanValue(env.local())
2009 .FromJust());
2010 CHECK(CompileRun("base1.prototype.knurd == undefined")
2011 ->BooleanValue(env.local())
2012 .FromJust());
1856 2013
1857 env->Global()->Set(v8_str("obj"), 2014 CHECK(env->Global()
1858 base1->GetFunction()->NewInstance()); 2015 ->Set(env.local(), v8_str("obj"), base1->GetFunction(env.local())
1859 CHECK_EQ(17.2, v8_compile("obj.flabby()")->Run()->NumberValue()); 2016 .ToLocalChecked()
1860 CHECK(v8_compile("'flabby' in obj")->Run()->BooleanValue()); 2017 ->NewInstance(env.local())
1861 CHECK_EQ(15.2, v8_compile("obj.knurd")->Run()->NumberValue()); 2018 .ToLocalChecked())
1862 CHECK(v8_compile("'knurd' in obj")->Run()->BooleanValue()); 2019 .FromJust());
1863 CHECK_EQ(20.1, v8_compile("obj.v1")->Run()->NumberValue()); 2020 CHECK_EQ(17.2, v8_compile("obj.flabby()")
2021 ->Run(env.local())
2022 .ToLocalChecked()
2023 ->NumberValue(env.local())
2024 .FromJust());
2025 CHECK(v8_compile("'flabby' in obj")
2026 ->Run(env.local())
2027 .ToLocalChecked()
2028 ->BooleanValue(env.local())
2029 .FromJust());
2030 CHECK_EQ(15.2, v8_compile("obj.knurd")
2031 ->Run(env.local())
2032 .ToLocalChecked()
2033 ->NumberValue(env.local())
2034 .FromJust());
2035 CHECK(v8_compile("'knurd' in obj")
2036 ->Run(env.local())
2037 .ToLocalChecked()
2038 ->BooleanValue(env.local())
2039 .FromJust());
2040 CHECK_EQ(20.1, v8_compile("obj.v1")
2041 ->Run(env.local())
2042 .ToLocalChecked()
2043 ->NumberValue(env.local())
2044 .FromJust());
1864 2045
1865 env->Global()->Set(v8_str("obj2"), 2046 CHECK(env->Global()
1866 base2->GetFunction()->NewInstance()); 2047 ->Set(env.local(), v8_str("obj2"), base2->GetFunction(env.local())
1867 CHECK_EQ(17.2, v8_compile("obj2.flabby()")->Run()->NumberValue()); 2048 .ToLocalChecked()
1868 CHECK(v8_compile("'flabby' in obj2")->Run()->BooleanValue()); 2049 ->NewInstance(env.local())
1869 CHECK_EQ(15.2, v8_compile("obj2.knurd")->Run()->NumberValue()); 2050 .ToLocalChecked())
1870 CHECK(v8_compile("'knurd' in obj2")->Run()->BooleanValue()); 2051 .FromJust());
1871 CHECK_EQ(10.1, v8_compile("obj2.v2")->Run()->NumberValue()); 2052 CHECK_EQ(17.2, v8_compile("obj2.flabby()")
2053 ->Run(env.local())
2054 .ToLocalChecked()
2055 ->NumberValue(env.local())
2056 .FromJust());
2057 CHECK(v8_compile("'flabby' in obj2")
2058 ->Run(env.local())
2059 .ToLocalChecked()
2060 ->BooleanValue(env.local())
2061 .FromJust());
2062 CHECK_EQ(15.2, v8_compile("obj2.knurd")
2063 ->Run(env.local())
2064 .ToLocalChecked()
2065 ->NumberValue(env.local())
2066 .FromJust());
2067 CHECK(v8_compile("'knurd' in obj2")
2068 ->Run(env.local())
2069 .ToLocalChecked()
2070 ->BooleanValue(env.local())
2071 .FromJust());
2072 CHECK_EQ(10.1, v8_compile("obj2.v2")
2073 ->Run(env.local())
2074 .ToLocalChecked()
2075 ->NumberValue(env.local())
2076 .FromJust());
1872 2077
1873 // base1 and base2 cannot cross reference to each's prototype 2078 // base1 and base2 cannot cross reference to each's prototype
1874 CHECK(v8_compile("obj.v2")->Run()->IsUndefined()); 2079 CHECK(v8_compile("obj.v2")->Run(env.local()).ToLocalChecked()->IsUndefined());
1875 CHECK(v8_compile("obj2.v1")->Run()->IsUndefined()); 2080 CHECK(
2081 v8_compile("obj2.v1")->Run(env.local()).ToLocalChecked()->IsUndefined());
1876 } 2082 }
1877 2083
1878 2084
1879 // Helper functions for Interceptor/Accessor interaction tests 2085 // Helper functions for Interceptor/Accessor interaction tests
1880 2086
1881 void SimpleAccessorGetter(Local<String> name, 2087 void SimpleAccessorGetter(Local<String> name,
1882 const v8::PropertyCallbackInfo<v8::Value>& info) { 2088 const v8::PropertyCallbackInfo<v8::Value>& info) {
1883 Handle<Object> self = Handle<Object>::Cast(info.This()); 2089 Local<Object> self = Local<Object>::Cast(info.This());
1884 info.GetReturnValue().Set( 2090 info.GetReturnValue().Set(self->Get(info.GetIsolate()->GetCurrentContext(),
1885 self->Get(String::Concat(v8_str("accessor_"), name))); 2091 String::Concat(v8_str("accessor_"), name))
2092 .ToLocalChecked());
1886 } 2093 }
1887 2094
1888 void SimpleAccessorSetter(Local<String> name, Local<Value> value, 2095 void SimpleAccessorSetter(Local<String> name, Local<Value> value,
1889 const v8::PropertyCallbackInfo<void>& info) { 2096 const v8::PropertyCallbackInfo<void>& info) {
1890 Handle<Object> self = Handle<Object>::Cast(info.This()); 2097 Local<Object> self = Local<Object>::Cast(info.This());
1891 self->Set(String::Concat(v8_str("accessor_"), name), value); 2098 CHECK(self->Set(info.GetIsolate()->GetCurrentContext(),
2099 String::Concat(v8_str("accessor_"), name), value)
2100 .FromJust());
1892 } 2101 }
1893 2102
1894 void SymbolAccessorGetter(Local<Name> name, 2103 void SymbolAccessorGetter(Local<Name> name,
1895 const v8::PropertyCallbackInfo<v8::Value>& info) { 2104 const v8::PropertyCallbackInfo<v8::Value>& info) {
1896 CHECK(name->IsSymbol()); 2105 CHECK(name->IsSymbol());
1897 Local<Symbol> sym = Local<Symbol>::Cast(name); 2106 Local<Symbol> sym = Local<Symbol>::Cast(name);
1898 if (sym->Name()->IsUndefined()) 2107 if (sym->Name()->IsUndefined())
1899 return; 2108 return;
1900 SimpleAccessorGetter(Local<String>::Cast(sym->Name()), info); 2109 SimpleAccessorGetter(Local<String>::Cast(sym->Name()), info);
1901 } 2110 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1937 i::Handle<i::String> name(v8::Utils::OpenHandle(*v8_str("length"))); 2146 i::Handle<i::String> name(v8::Utils::OpenHandle(*v8_str("length")));
1938 i::LookupIterator it(a, name, i::LookupIterator::OWN_SKIP_INTERCEPTOR); 2147 i::LookupIterator it(a, name, i::LookupIterator::OWN_SKIP_INTERCEPTOR);
1939 CHECK_EQ(i::LookupIterator::ACCESSOR, it.state()); 2148 CHECK_EQ(i::LookupIterator::ACCESSOR, it.state());
1940 CHECK(it.GetAccessors()->IsExecutableAccessorInfo()); 2149 CHECK(it.GetAccessors()->IsExecutableAccessorInfo());
1941 } 2150 }
1942 2151
1943 2152
1944 THREADED_TEST(UndefinedIsNotEnumerable) { 2153 THREADED_TEST(UndefinedIsNotEnumerable) {
1945 LocalContext env; 2154 LocalContext env;
1946 v8::HandleScope scope(env->GetIsolate()); 2155 v8::HandleScope scope(env->GetIsolate());
1947 v8::Handle<Value> result = CompileRun("this.propertyIsEnumerable(undefined)"); 2156 v8::Local<Value> result = CompileRun("this.propertyIsEnumerable(undefined)");
1948 CHECK(result->IsFalse()); 2157 CHECK(result->IsFalse());
1949 } 2158 }
1950 2159
1951 2160
1952 v8::Handle<Script> call_recursively_script; 2161 v8::Local<Script> call_recursively_script;
1953 static const int kTargetRecursionDepth = 150; // near maximum 2162 static const int kTargetRecursionDepth = 150; // near maximum
1954 2163
1955 2164
1956 static void CallScriptRecursivelyCall( 2165 static void CallScriptRecursivelyCall(
1957 const v8::FunctionCallbackInfo<v8::Value>& args) { 2166 const v8::FunctionCallbackInfo<v8::Value>& args) {
1958 ApiTestFuzzer::Fuzz(); 2167 ApiTestFuzzer::Fuzz();
1959 int depth = args.This()->Get(v8_str("depth"))->Int32Value(); 2168 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
2169 int depth = args.This()
2170 ->Get(context, v8_str("depth"))
2171 .ToLocalChecked()
2172 ->Int32Value(context)
2173 .FromJust();
1960 if (depth == kTargetRecursionDepth) return; 2174 if (depth == kTargetRecursionDepth) return;
1961 args.This()->Set(v8_str("depth"), 2175 CHECK(args.This()
1962 v8::Integer::New(args.GetIsolate(), depth + 1)); 2176 ->Set(context, v8_str("depth"),
1963 args.GetReturnValue().Set(call_recursively_script->Run()); 2177 v8::Integer::New(args.GetIsolate(), depth + 1))
2178 .FromJust());
2179 args.GetReturnValue().Set(
2180 call_recursively_script->Run(context).ToLocalChecked());
1964 } 2181 }
1965 2182
1966 2183
1967 static void CallFunctionRecursivelyCall( 2184 static void CallFunctionRecursivelyCall(
1968 const v8::FunctionCallbackInfo<v8::Value>& args) { 2185 const v8::FunctionCallbackInfo<v8::Value>& args) {
1969 ApiTestFuzzer::Fuzz(); 2186 ApiTestFuzzer::Fuzz();
1970 int depth = args.This()->Get(v8_str("depth"))->Int32Value(); 2187 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
2188 int depth = args.This()
2189 ->Get(context, v8_str("depth"))
2190 .ToLocalChecked()
2191 ->Int32Value(context)
2192 .FromJust();
1971 if (depth == kTargetRecursionDepth) { 2193 if (depth == kTargetRecursionDepth) {
1972 printf("[depth = %d]\n", depth); 2194 printf("[depth = %d]\n", depth);
1973 return; 2195 return;
1974 } 2196 }
1975 args.This()->Set(v8_str("depth"), 2197 CHECK(args.This()
1976 v8::Integer::New(args.GetIsolate(), depth + 1)); 2198 ->Set(context, v8_str("depth"),
1977 v8::Handle<Value> function = 2199 v8::Integer::New(args.GetIsolate(), depth + 1))
1978 args.This()->Get(v8_str("callFunctionRecursively")); 2200 .FromJust());
1979 args.GetReturnValue().Set( 2201 v8::Local<Value> function =
1980 function.As<Function>()->Call(args.This(), 0, NULL)); 2202 args.This()
2203 ->Get(context, v8_str("callFunctionRecursively"))
2204 .ToLocalChecked();
2205 args.GetReturnValue().Set(function.As<Function>()
2206 ->Call(context, args.This(), 0, NULL)
2207 .ToLocalChecked());
1981 } 2208 }
1982 2209
1983 2210
1984 THREADED_TEST(DeepCrossLanguageRecursion) { 2211 THREADED_TEST(DeepCrossLanguageRecursion) {
1985 v8::Isolate* isolate = CcTest::isolate(); 2212 v8::Isolate* isolate = CcTest::isolate();
1986 v8::HandleScope scope(isolate); 2213 v8::HandleScope scope(isolate);
1987 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); 2214 v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
1988 global->Set(v8_str("callScriptRecursively"), 2215 global->Set(v8_str("callScriptRecursively"),
1989 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall)); 2216 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall));
1990 global->Set(v8_str("callFunctionRecursively"), 2217 global->Set(v8_str("callFunctionRecursively"),
1991 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); 2218 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall));
1992 LocalContext env(NULL, global); 2219 LocalContext env(NULL, global);
1993 2220
1994 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); 2221 CHECK(env->Global()
2222 ->Set(env.local(), v8_str("depth"), v8::Integer::New(isolate, 0))
2223 .FromJust());
1995 call_recursively_script = v8_compile("callScriptRecursively()"); 2224 call_recursively_script = v8_compile("callScriptRecursively()");
1996 call_recursively_script->Run(); 2225 call_recursively_script->Run(env.local()).ToLocalChecked();
1997 call_recursively_script = v8::Handle<Script>(); 2226 call_recursively_script = v8::Local<Script>();
1998 2227
1999 env->Global()->Set(v8_str("depth"), v8::Integer::New(isolate, 0)); 2228 CHECK(env->Global()
2229 ->Set(env.local(), v8_str("depth"), v8::Integer::New(isolate, 0))
2230 .FromJust());
2000 CompileRun("callFunctionRecursively()"); 2231 CompileRun("callFunctionRecursively()");
2001 } 2232 }
2002 2233
2003 2234
2004 static void ThrowingPropertyHandlerGet( 2235 static void ThrowingPropertyHandlerGet(
2005 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) { 2236 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>& info) {
2006 // Since this interceptor is used on "with" objects, the runtime will look up 2237 // Since this interceptor is used on "with" objects, the runtime will look up
2007 // @@unscopables. Punt. 2238 // @@unscopables. Punt.
2008 if (key->IsSymbol()) return; 2239 if (key->IsSymbol()) return;
2009 ApiTestFuzzer::Fuzz(); 2240 ApiTestFuzzer::Fuzz();
2010 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key)); 2241 info.GetReturnValue().Set(info.GetIsolate()->ThrowException(key));
2011 } 2242 }
2012 2243
2013 2244
2014 static void ThrowingPropertyHandlerSet( 2245 static void ThrowingPropertyHandlerSet(
2015 Local<Name> key, Local<Value>, 2246 Local<Name> key, Local<Value>,
2016 const v8::PropertyCallbackInfo<v8::Value>& info) { 2247 const v8::PropertyCallbackInfo<v8::Value>& info) {
2017 info.GetIsolate()->ThrowException(key); 2248 info.GetIsolate()->ThrowException(key);
2018 info.GetReturnValue().SetUndefined(); // not the same as empty handle 2249 info.GetReturnValue().SetUndefined(); // not the same as empty handle
2019 } 2250 }
2020 2251
2021 2252
2022 THREADED_TEST(CallbackExceptionRegression) { 2253 THREADED_TEST(CallbackExceptionRegression) {
2023 v8::Isolate* isolate = CcTest::isolate(); 2254 v8::Isolate* isolate = CcTest::isolate();
2024 v8::HandleScope scope(isolate); 2255 v8::HandleScope scope(isolate);
2025 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); 2256 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
2026 obj->SetHandler(v8::NamedPropertyHandlerConfiguration( 2257 obj->SetHandler(v8::NamedPropertyHandlerConfiguration(
2027 ThrowingPropertyHandlerGet, ThrowingPropertyHandlerSet)); 2258 ThrowingPropertyHandlerGet, ThrowingPropertyHandlerSet));
2028 LocalContext env; 2259 LocalContext env;
2029 env->Global()->Set(v8_str("obj"), obj->NewInstance()); 2260 CHECK(env->Global()
2030 v8::Handle<Value> otto = 2261 ->Set(env.local(), v8_str("obj"),
2262 obj->NewInstance(env.local()).ToLocalChecked())
2263 .FromJust());
2264 v8::Local<Value> otto =
2031 CompileRun("try { with (obj) { otto; } } catch (e) { e; }"); 2265 CompileRun("try { with (obj) { otto; } } catch (e) { e; }");
2032 CHECK(v8_str("otto")->Equals(otto)); 2266 CHECK(v8_str("otto")->Equals(env.local(), otto).FromJust());
2033 v8::Handle<Value> netto = 2267 v8::Local<Value> netto =
2034 CompileRun("try { with (obj) { netto = 4; } } catch (e) { e; }"); 2268 CompileRun("try { with (obj) { netto = 4; } } catch (e) { e; }");
2035 CHECK(v8_str("netto")->Equals(netto)); 2269 CHECK(v8_str("netto")->Equals(env.local(), netto).FromJust());
2036 } 2270 }
2037 2271
2038 2272
2039 THREADED_TEST(FunctionPrototype) { 2273 THREADED_TEST(FunctionPrototype) {
2040 v8::Isolate* isolate = CcTest::isolate(); 2274 v8::Isolate* isolate = CcTest::isolate();
2041 v8::HandleScope scope(isolate); 2275 v8::HandleScope scope(isolate);
2042 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); 2276 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate);
2043 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); 2277 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321));
2044 LocalContext env; 2278 LocalContext env;
2045 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); 2279 CHECK(env->Global()
2280 ->Set(env.local(), v8_str("Foo"),
2281 Foo->GetFunction(env.local()).ToLocalChecked())
2282 .FromJust());
2046 Local<Script> script = v8_compile("Foo.prototype.plak"); 2283 Local<Script> script = v8_compile("Foo.prototype.plak");
2047 CHECK_EQ(script->Run()->Int32Value(), 321); 2284 CHECK_EQ(v8_run_int32value(script), 321);
2048 } 2285 }
2049 2286
2050 2287
2051 THREADED_TEST(InternalFields) { 2288 THREADED_TEST(InternalFields) {
2052 LocalContext env; 2289 LocalContext env;
2053 v8::Isolate* isolate = env->GetIsolate(); 2290 v8::Isolate* isolate = env->GetIsolate();
2054 v8::HandleScope scope(isolate); 2291 v8::HandleScope scope(isolate);
2055 2292
2056 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 2293 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
2057 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); 2294 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate();
2058 instance_templ->SetInternalFieldCount(1); 2295 instance_templ->SetInternalFieldCount(1);
2059 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); 2296 Local<v8::Object> obj = templ->GetFunction(env.local())
2297 .ToLocalChecked()
2298 ->NewInstance(env.local())
2299 .ToLocalChecked();
2060 CHECK_EQ(1, obj->InternalFieldCount()); 2300 CHECK_EQ(1, obj->InternalFieldCount());
2061 CHECK(obj->GetInternalField(0)->IsUndefined()); 2301 CHECK(obj->GetInternalField(0)->IsUndefined());
2062 obj->SetInternalField(0, v8_num(17)); 2302 obj->SetInternalField(0, v8_num(17));
2063 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); 2303 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value(env.local()).FromJust());
2064 } 2304 }
2065 2305
2066 2306
2067 THREADED_TEST(GlobalObjectInternalFields) { 2307 THREADED_TEST(GlobalObjectInternalFields) {
2068 v8::Isolate* isolate = CcTest::isolate(); 2308 v8::Isolate* isolate = CcTest::isolate();
2069 v8::HandleScope scope(isolate); 2309 v8::HandleScope scope(isolate);
2070 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate); 2310 Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(isolate);
2071 global_template->SetInternalFieldCount(1); 2311 global_template->SetInternalFieldCount(1);
2072 LocalContext env(NULL, global_template); 2312 LocalContext env(NULL, global_template);
2073 v8::Handle<v8::Object> global_proxy = env->Global(); 2313 v8::Local<v8::Object> global_proxy = env->Global();
2074 v8::Handle<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>(); 2314 v8::Local<v8::Object> global = global_proxy->GetPrototype().As<v8::Object>();
2075 CHECK_EQ(1, global->InternalFieldCount()); 2315 CHECK_EQ(1, global->InternalFieldCount());
2076 CHECK(global->GetInternalField(0)->IsUndefined()); 2316 CHECK(global->GetInternalField(0)->IsUndefined());
2077 global->SetInternalField(0, v8_num(17)); 2317 global->SetInternalField(0, v8_num(17));
2078 CHECK_EQ(17, global->GetInternalField(0)->Int32Value()); 2318 CHECK_EQ(17, global->GetInternalField(0)->Int32Value(env.local()).FromJust());
2079 } 2319 }
2080 2320
2081 2321
2082 THREADED_TEST(GlobalObjectHasRealIndexedProperty) { 2322 THREADED_TEST(GlobalObjectHasRealIndexedProperty) {
2083 LocalContext env; 2323 LocalContext env;
2084 v8::HandleScope scope(CcTest::isolate()); 2324 v8::HandleScope scope(CcTest::isolate());
2085 2325
2086 v8::Local<v8::Object> global = env->Global(); 2326 v8::Local<v8::Object> global = env->Global();
2087 global->Set(0, v8::String::NewFromUtf8(CcTest::isolate(), "value")); 2327 CHECK(global->Set(env.local(), 0, v8_str("value")).FromJust());
2088 CHECK(global->HasRealIndexedProperty(0)); 2328 CHECK(global->HasRealIndexedProperty(env.local(), 0).FromJust());
2089 } 2329 }
2090 2330
2091 2331
2092 static void CheckAlignedPointerInInternalField(Handle<v8::Object> obj, 2332 static void CheckAlignedPointerInInternalField(Local<v8::Object> obj,
2093 void* value) { 2333 void* value) {
2094 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); 2334 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1));
2095 obj->SetAlignedPointerInInternalField(0, value); 2335 obj->SetAlignedPointerInInternalField(0, value);
2096 CcTest::heap()->CollectAllGarbage(); 2336 CcTest::heap()->CollectAllGarbage();
2097 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); 2337 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0));
2098 } 2338 }
2099 2339
2100 2340
2101 THREADED_TEST(InternalFieldsAlignedPointers) { 2341 THREADED_TEST(InternalFieldsAlignedPointers) {
2102 LocalContext env; 2342 LocalContext env;
2103 v8::Isolate* isolate = env->GetIsolate(); 2343 v8::Isolate* isolate = env->GetIsolate();
2104 v8::HandleScope scope(isolate); 2344 v8::HandleScope scope(isolate);
2105 2345
2106 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 2346 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
2107 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); 2347 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate();
2108 instance_templ->SetInternalFieldCount(1); 2348 instance_templ->SetInternalFieldCount(1);
2109 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); 2349 Local<v8::Object> obj = templ->GetFunction(env.local())
2350 .ToLocalChecked()
2351 ->NewInstance(env.local())
2352 .ToLocalChecked();
2110 CHECK_EQ(1, obj->InternalFieldCount()); 2353 CHECK_EQ(1, obj->InternalFieldCount());
2111 2354
2112 CheckAlignedPointerInInternalField(obj, NULL); 2355 CheckAlignedPointerInInternalField(obj, NULL);
2113 2356
2114 int* heap_allocated = new int[100]; 2357 int* heap_allocated = new int[100];
2115 CheckAlignedPointerInInternalField(obj, heap_allocated); 2358 CheckAlignedPointerInInternalField(obj, heap_allocated);
2116 delete[] heap_allocated; 2359 delete[] heap_allocated;
2117 2360
2118 int stack_allocated[100]; 2361 int stack_allocated[100];
2119 CheckAlignedPointerInInternalField(obj, stack_allocated); 2362 CheckAlignedPointerInInternalField(obj, stack_allocated);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
2162 env->SetAlignedPointerInEmbedderData(i, AlignedTestPointer(i)); 2405 env->SetAlignedPointerInEmbedderData(i, AlignedTestPointer(i));
2163 } 2406 }
2164 CcTest::heap()->CollectAllGarbage(); 2407 CcTest::heap()->CollectAllGarbage();
2165 for (int i = 0; i < 100; i++) { 2408 for (int i = 0; i < 100; i++) {
2166 CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i)); 2409 CHECK_EQ(AlignedTestPointer(i), env->GetAlignedPointerFromEmbedderData(i));
2167 } 2410 }
2168 } 2411 }
2169 2412
2170 2413
2171 static void CheckEmbedderData(LocalContext* env, int index, 2414 static void CheckEmbedderData(LocalContext* env, int index,
2172 v8::Handle<Value> data) { 2415 v8::Local<Value> data) {
2173 (*env)->SetEmbedderData(index, data); 2416 (*env)->SetEmbedderData(index, data);
2174 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data)); 2417 CHECK((*env)->GetEmbedderData(index)->StrictEquals(data));
2175 } 2418 }
2176 2419
2177 2420
2178 THREADED_TEST(EmbedderData) { 2421 THREADED_TEST(EmbedderData) {
2179 LocalContext env; 2422 LocalContext env;
2180 v8::Isolate* isolate = env->GetIsolate(); 2423 v8::Isolate* isolate = env->GetIsolate();
2181 v8::HandleScope scope(isolate); 2424 v8::HandleScope scope(isolate);
2182 2425
2183 CheckEmbedderData( 2426 CheckEmbedderData(&env, 3, v8_str("The quick brown fox jumps"));
2184 &env, 3, v8::String::NewFromUtf8(isolate, "The quick brown fox jumps")); 2427 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)); 2428 CheckEmbedderData(&env, 1, v8::Number::New(isolate, 1.2345));
2188 CheckEmbedderData(&env, 0, v8::Boolean::New(isolate, true)); 2429 CheckEmbedderData(&env, 0, v8::Boolean::New(isolate, true));
2189 } 2430 }
2190 2431
2191 2432
2433 // TODO(vogelheim): Does this test even make sense in a post-deprecation world?
2434 /*
2192 THREADED_TEST(GetIsolate) { 2435 THREADED_TEST(GetIsolate) {
2193 LocalContext env; 2436 LocalContext env;
2194 v8::Isolate* isolate = env->GetIsolate(); 2437 v8::Isolate* isolate = env->GetIsolate();
2195 v8::HandleScope scope(isolate); 2438 v8::HandleScope scope(isolate);
2196 Local<v8::Object> obj = v8::Object::New(isolate); 2439 Local<v8::Object> obj = v8::Object::New(isolate);
2197 CHECK_EQ(isolate, obj->GetIsolate()); 2440 CHECK_EQ(isolate, obj->GetIsolate());
2198 CHECK_EQ(isolate, CcTest::global()->GetIsolate()); 2441 CHECK_EQ(isolate, CcTest::global()->GetIsolate());
2199 } 2442 }
2443 */
2200 2444
2201 2445
2202 THREADED_TEST(IdentityHash) { 2446 THREADED_TEST(IdentityHash) {
2203 LocalContext env; 2447 LocalContext env;
2204 v8::Isolate* isolate = env->GetIsolate(); 2448 v8::Isolate* isolate = env->GetIsolate();
2205 v8::HandleScope scope(isolate); 2449 v8::HandleScope scope(isolate);
2206 2450
2207 // Ensure that the test starts with an fresh heap to test whether the hash 2451 // Ensure that the test starts with an fresh heap to test whether the hash
2208 // code is based on the address. 2452 // code is based on the address.
2209 CcTest::heap()->CollectAllGarbage(); 2453 CcTest::heap()->CollectAllGarbage();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2242 CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash()); 2486 CHECK_NE(o1->GetIdentityHash(), o2->GetIdentityHash());
2243 } 2487 }
2244 } 2488 }
2245 2489
2246 2490
2247 void GlobalProxyIdentityHash(bool set_in_js) { 2491 void GlobalProxyIdentityHash(bool set_in_js) {
2248 LocalContext env; 2492 LocalContext env;
2249 v8::Isolate* isolate = env->GetIsolate(); 2493 v8::Isolate* isolate = env->GetIsolate();
2250 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 2494 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
2251 v8::HandleScope scope(isolate); 2495 v8::HandleScope scope(isolate);
2252 Handle<Object> global_proxy = env->Global(); 2496 Local<Object> global_proxy = env->Global();
2253 i::Handle<i::Object> i_global_proxy = v8::Utils::OpenHandle(*global_proxy); 2497 i::Handle<i::Object> i_global_proxy = v8::Utils::OpenHandle(*global_proxy);
2254 env->Global()->Set(v8_str("global"), global_proxy); 2498 CHECK(env->Global()
2499 ->Set(env.local(), v8_str("global"), global_proxy)
2500 .FromJust());
2255 i::Handle<i::Object> original_hash; 2501 i::Handle<i::Object> original_hash;
2256 if (set_in_js) { 2502 if (set_in_js) {
2257 CompileRun("var m = new Set(); m.add(global);"); 2503 CompileRun("var m = new Set(); m.add(global);");
2258 original_hash = i::Handle<i::Object>(i_global_proxy->GetHash(), i_isolate); 2504 original_hash = i::Handle<i::Object>(i_global_proxy->GetHash(), i_isolate);
2259 } else { 2505 } else {
2260 original_hash = i::Handle<i::Object>( 2506 original_hash = i::Handle<i::Object>(
2261 i::Object::GetOrCreateHash(i_isolate, i_global_proxy)); 2507 i::Object::GetOrCreateHash(i_isolate, i_global_proxy));
2262 } 2508 }
2263 CHECK(original_hash->IsSmi()); 2509 CHECK(original_hash->IsSmi());
2264 int32_t hash1 = i::Handle<i::Smi>::cast(original_hash)->value(); 2510 int32_t hash1 = i::Handle<i::Smi>::cast(original_hash)->value();
2265 // Hash should be retained after being detached. 2511 // Hash should be retained after being detached.
2266 env->DetachGlobal(); 2512 env->DetachGlobal();
2267 int hash2 = global_proxy->GetIdentityHash(); 2513 int hash2 = global_proxy->GetIdentityHash();
2268 CHECK_EQ(hash1, hash2); 2514 CHECK_EQ(hash1, hash2);
2269 { 2515 {
2270 // Re-attach global proxy to a new context, hash should stay the same. 2516 // Re-attach global proxy to a new context, hash should stay the same.
2271 LocalContext env2(NULL, Handle<ObjectTemplate>(), global_proxy); 2517 LocalContext env2(NULL, Local<ObjectTemplate>(), global_proxy);
2272 int hash3 = global_proxy->GetIdentityHash(); 2518 int hash3 = global_proxy->GetIdentityHash();
2273 CHECK_EQ(hash1, hash3); 2519 CHECK_EQ(hash1, hash3);
2274 } 2520 }
2275 } 2521 }
2276 2522
2277 2523
2278 THREADED_TEST(GlobalProxyIdentityHash) { 2524 THREADED_TEST(GlobalProxyIdentityHash) {
2279 GlobalProxyIdentityHash(true); 2525 GlobalProxyIdentityHash(true);
2280 GlobalProxyIdentityHash(false); 2526 GlobalProxyIdentityHash(false);
2281 } 2527 }
2282 2528
2283 2529
2284 TEST(SymbolIdentityHash) { 2530 TEST(SymbolIdentityHash) {
2285 LocalContext env; 2531 LocalContext env;
2286 v8::Isolate* isolate = env->GetIsolate(); 2532 v8::Isolate* isolate = env->GetIsolate();
2287 v8::HandleScope scope(isolate); 2533 v8::HandleScope scope(isolate);
2288 2534
2289 { 2535 {
2290 Local<v8::Symbol> symbol = v8::Symbol::New(isolate); 2536 Local<v8::Symbol> symbol = v8::Symbol::New(isolate);
2291 int hash = symbol->GetIdentityHash(); 2537 int hash = symbol->GetIdentityHash();
2292 int hash1 = symbol->GetIdentityHash(); 2538 int hash1 = symbol->GetIdentityHash();
2293 CHECK_EQ(hash, hash1); 2539 CHECK_EQ(hash, hash1);
2294 CcTest::heap()->CollectAllGarbage(); 2540 CcTest::heap()->CollectAllGarbage();
2295 int hash3 = symbol->GetIdentityHash(); 2541 int hash3 = symbol->GetIdentityHash();
2296 CHECK_EQ(hash, hash3); 2542 CHECK_EQ(hash, hash3);
2297 } 2543 }
2298 2544
2299 { 2545 {
2300 v8::Handle<v8::Symbol> js_symbol = 2546 v8::Local<v8::Symbol> js_symbol =
2301 CompileRun("Symbol('foo')").As<v8::Symbol>(); 2547 CompileRun("Symbol('foo')").As<v8::Symbol>();
2302 int hash = js_symbol->GetIdentityHash(); 2548 int hash = js_symbol->GetIdentityHash();
2303 int hash1 = js_symbol->GetIdentityHash(); 2549 int hash1 = js_symbol->GetIdentityHash();
2304 CHECK_EQ(hash, hash1); 2550 CHECK_EQ(hash, hash1);
2305 CcTest::heap()->CollectAllGarbage(); 2551 CcTest::heap()->CollectAllGarbage();
2306 int hash3 = js_symbol->GetIdentityHash(); 2552 int hash3 = js_symbol->GetIdentityHash();
2307 CHECK_EQ(hash, hash3); 2553 CHECK_EQ(hash, hash3);
2308 } 2554 }
2309 } 2555 }
2310 2556
2311 2557
2312 TEST(StringIdentityHash) { 2558 TEST(StringIdentityHash) {
2313 LocalContext env; 2559 LocalContext env;
2314 v8::Isolate* isolate = env->GetIsolate(); 2560 v8::Isolate* isolate = env->GetIsolate();
2315 v8::HandleScope scope(isolate); 2561 v8::HandleScope scope(isolate);
2316 2562
2317 Local<v8::String> str = v8::String::NewFromUtf8(isolate, "str1"); 2563 Local<v8::String> str = v8_str("str1");
2318 int hash = str->GetIdentityHash(); 2564 int hash = str->GetIdentityHash();
2319 int hash1 = str->GetIdentityHash(); 2565 int hash1 = str->GetIdentityHash();
2320 CHECK_EQ(hash, hash1); 2566 CHECK_EQ(hash, hash1);
2321 CcTest::heap()->CollectAllGarbage(); 2567 CcTest::heap()->CollectAllGarbage();
2322 int hash3 = str->GetIdentityHash(); 2568 int hash3 = str->GetIdentityHash();
2323 CHECK_EQ(hash, hash3); 2569 CHECK_EQ(hash, hash3);
2324 2570
2325 Local<v8::String> str2 = v8::String::NewFromUtf8(isolate, "str1"); 2571 Local<v8::String> str2 = v8_str("str1");
2326 int hash4 = str2->GetIdentityHash(); 2572 int hash4 = str2->GetIdentityHash();
2327 CHECK_EQ(hash, hash4); 2573 CHECK_EQ(hash, hash4);
2328 } 2574 }
2329 2575
2330 2576
2331 THREADED_TEST(SymbolProperties) { 2577 THREADED_TEST(SymbolProperties) {
2332 LocalContext env; 2578 LocalContext env;
2333 v8::Isolate* isolate = env->GetIsolate(); 2579 v8::Isolate* isolate = env->GetIsolate();
2334 v8::HandleScope scope(isolate); 2580 v8::HandleScope scope(isolate);
2335 2581
2336 v8::Local<v8::Object> obj = v8::Object::New(isolate); 2582 v8::Local<v8::Object> obj = v8::Object::New(isolate);
2337 v8::Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); 2583 v8::Local<v8::Symbol> sym1 = v8::Symbol::New(isolate);
2338 v8::Local<v8::Symbol> sym2 = v8::Symbol::New(isolate, v8_str("my-symbol")); 2584 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")); 2585 v8::Local<v8::Symbol> sym3 = v8::Symbol::New(isolate, v8_str("sym3"));
2340 2586
2341 CcTest::heap()->CollectAllGarbage(); 2587 CcTest::heap()->CollectAllGarbage();
2342 2588
2343 // Check basic symbol functionality. 2589 // Check basic symbol functionality.
2344 CHECK(sym1->IsSymbol()); 2590 CHECK(sym1->IsSymbol());
2345 CHECK(sym2->IsSymbol()); 2591 CHECK(sym2->IsSymbol());
2346 CHECK(!obj->IsSymbol()); 2592 CHECK(!obj->IsSymbol());
2347 2593
2348 CHECK(sym1->Equals(sym1)); 2594 CHECK(sym1->Equals(env.local(), sym1).FromJust());
2349 CHECK(sym2->Equals(sym2)); 2595 CHECK(sym2->Equals(env.local(), sym2).FromJust());
2350 CHECK(!sym1->Equals(sym2)); 2596 CHECK(!sym1->Equals(env.local(), sym2).FromJust());
2351 CHECK(!sym2->Equals(sym1)); 2597 CHECK(!sym2->Equals(env.local(), sym1).FromJust());
2352 CHECK(sym1->StrictEquals(sym1)); 2598 CHECK(sym1->StrictEquals(sym1));
2353 CHECK(sym2->StrictEquals(sym2)); 2599 CHECK(sym2->StrictEquals(sym2));
2354 CHECK(!sym1->StrictEquals(sym2)); 2600 CHECK(!sym1->StrictEquals(sym2));
2355 CHECK(!sym2->StrictEquals(sym1)); 2601 CHECK(!sym2->StrictEquals(sym1));
2356 2602
2357 CHECK(sym2->Name()->Equals(v8_str("my-symbol"))); 2603 CHECK(sym2->Name()->Equals(env.local(), v8_str("my-symbol")).FromJust());
2358 2604
2359 v8::Local<v8::Value> sym_val = sym2; 2605 v8::Local<v8::Value> sym_val = sym2;
2360 CHECK(sym_val->IsSymbol()); 2606 CHECK(sym_val->IsSymbol());
2361 CHECK(sym_val->Equals(sym2)); 2607 CHECK(sym_val->Equals(env.local(), sym2).FromJust());
2362 CHECK(sym_val->StrictEquals(sym2)); 2608 CHECK(sym_val->StrictEquals(sym2));
2363 CHECK(v8::Symbol::Cast(*sym_val)->Equals(sym2)); 2609 CHECK(v8::Symbol::Cast(*sym_val)->Equals(env.local(), sym2).FromJust());
2364 2610
2365 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2); 2611 v8::Local<v8::Value> sym_obj = v8::SymbolObject::New(isolate, sym2);
2366 CHECK(sym_obj->IsSymbolObject()); 2612 CHECK(sym_obj->IsSymbolObject());
2367 CHECK(!sym2->IsSymbolObject()); 2613 CHECK(!sym2->IsSymbolObject());
2368 CHECK(!obj->IsSymbolObject()); 2614 CHECK(!obj->IsSymbolObject());
2369 CHECK(sym_obj->Equals(sym2)); 2615 CHECK(sym_obj->Equals(env.local(), sym2).FromJust());
2370 CHECK(!sym_obj->StrictEquals(sym2)); 2616 CHECK(!sym_obj->StrictEquals(sym2));
2371 CHECK(v8::SymbolObject::Cast(*sym_obj)->Equals(sym_obj)); 2617 CHECK(v8::SymbolObject::Cast(*sym_obj)
2372 CHECK(v8::SymbolObject::Cast(*sym_obj)->ValueOf()->Equals(sym2)); 2618 ->Equals(env.local(), sym_obj)
2619 .FromJust());
2620 CHECK(v8::SymbolObject::Cast(*sym_obj)
2621 ->ValueOf()
2622 ->Equals(env.local(), sym2)
2623 .FromJust());
2373 2624
2374 // Make sure delete of a non-existent symbol property works. 2625 // Make sure delete of a non-existent symbol property works.
2375 CHECK(obj->Delete(sym1)); 2626 CHECK(obj->Delete(env.local(), sym1).FromJust());
2376 CHECK(!obj->Has(sym1)); 2627 CHECK(!obj->Has(env.local(), sym1).FromJust());
2377 2628
2378 CHECK(obj->Set(sym1, v8::Integer::New(isolate, 1503))); 2629 CHECK(
2379 CHECK(obj->Has(sym1)); 2630 obj->Set(env.local(), sym1, v8::Integer::New(isolate, 1503)).FromJust());
2380 CHECK_EQ(1503, obj->Get(sym1)->Int32Value()); 2631 CHECK(obj->Has(env.local(), sym1).FromJust());
2381 CHECK(obj->Set(sym1, v8::Integer::New(isolate, 2002))); 2632 CHECK_EQ(1503, obj->Get(env.local(), sym1)
2382 CHECK(obj->Has(sym1)); 2633 .ToLocalChecked()
2383 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2634 ->Int32Value(env.local())
2384 CHECK_EQ(v8::None, obj->GetPropertyAttributes(sym1)); 2635 .FromJust());
2636 CHECK(
2637 obj->Set(env.local(), sym1, v8::Integer::New(isolate, 2002)).FromJust());
2638 CHECK(obj->Has(env.local(), sym1).FromJust());
2639 CHECK_EQ(2002, obj->Get(env.local(), sym1)
2640 .ToLocalChecked()
2641 ->Int32Value(env.local())
2642 .FromJust());
2643 CHECK_EQ(v8::None, obj->GetPropertyAttributes(env.local(), sym1).FromJust());
2385 2644
2386 CHECK_EQ(0u, obj->GetOwnPropertyNames()->Length()); 2645 CHECK_EQ(0u,
2387 unsigned num_props = obj->GetPropertyNames()->Length(); 2646 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2388 CHECK(obj->Set(v8::String::NewFromUtf8(isolate, "bla"), 2647 unsigned num_props =
2389 v8::Integer::New(isolate, 20))); 2648 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length();
2390 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); 2649 CHECK(obj->Set(env.local(), v8_str("bla"), v8::Integer::New(isolate, 20))
2391 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); 2650 .FromJust());
2651 CHECK_EQ(1u,
2652 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2653 CHECK_EQ(num_props + 1,
2654 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length());
2392 2655
2393 CcTest::heap()->CollectAllGarbage(); 2656 CcTest::heap()->CollectAllGarbage();
2394 2657
2395 CHECK(obj->SetAccessor(sym3, SymbolAccessorGetter, SymbolAccessorSetter)); 2658 CHECK(obj->SetAccessor(env.local(), sym3, SymbolAccessorGetter,
2396 CHECK(obj->Get(sym3)->IsUndefined()); 2659 SymbolAccessorSetter)
2397 CHECK(obj->Set(sym3, v8::Integer::New(isolate, 42))); 2660 .FromJust());
2398 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); 2661 CHECK(obj->Get(env.local(), sym3).ToLocalChecked()->IsUndefined());
2399 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) 2662 CHECK(obj->Set(env.local(), sym3, v8::Integer::New(isolate, 42)).FromJust());
2400 ->Equals(v8::Integer::New(isolate, 42))); 2663 CHECK(obj->Get(env.local(), sym3)
2664 .ToLocalChecked()
2665 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2666 .FromJust());
2667 CHECK(obj->Get(env.local(), v8_str("accessor_sym3"))
2668 .ToLocalChecked()
2669 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2670 .FromJust());
2401 2671
2402 // Add another property and delete it afterwards to force the object in 2672 // Add another property and delete it afterwards to force the object in
2403 // slow case. 2673 // slow case.
2404 CHECK(obj->Set(sym2, v8::Integer::New(isolate, 2008))); 2674 CHECK(
2405 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2675 obj->Set(env.local(), sym2, v8::Integer::New(isolate, 2008)).FromJust());
2406 CHECK_EQ(2008, obj->Get(sym2)->Int32Value()); 2676 CHECK_EQ(2002, obj->Get(env.local(), sym1)
2407 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2677 .ToLocalChecked()
2408 CHECK_EQ(2u, obj->GetOwnPropertyNames()->Length()); 2678 ->Int32Value(env.local())
2679 .FromJust());
2680 CHECK_EQ(2008, obj->Get(env.local(), sym2)
2681 .ToLocalChecked()
2682 ->Int32Value(env.local())
2683 .FromJust());
2684 CHECK_EQ(2002, obj->Get(env.local(), sym1)
2685 .ToLocalChecked()
2686 ->Int32Value(env.local())
2687 .FromJust());
2688 CHECK_EQ(2u,
2689 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2409 2690
2410 CHECK(obj->Has(sym1)); 2691 CHECK(obj->Has(env.local(), sym1).FromJust());
2411 CHECK(obj->Has(sym2)); 2692 CHECK(obj->Has(env.local(), sym2).FromJust());
2412 CHECK(obj->Has(sym3)); 2693 CHECK(obj->Has(env.local(), sym3).FromJust());
2413 CHECK(obj->Has(v8::String::NewFromUtf8(isolate, "accessor_sym3"))); 2694 CHECK(obj->Has(env.local(), v8_str("accessor_sym3")).FromJust());
2414 CHECK(obj->Delete(sym2)); 2695 CHECK(obj->Delete(env.local(), sym2).FromJust());
2415 CHECK(obj->Has(sym1)); 2696 CHECK(obj->Has(env.local(), sym1).FromJust());
2416 CHECK(!obj->Has(sym2)); 2697 CHECK(!obj->Has(env.local(), sym2).FromJust());
2417 CHECK(obj->Has(sym3)); 2698 CHECK(obj->Has(env.local(), sym3).FromJust());
2418 CHECK(obj->Has(v8::String::NewFromUtf8(isolate, "accessor_sym3"))); 2699 CHECK(obj->Has(env.local(), v8_str("accessor_sym3")).FromJust());
2419 CHECK_EQ(2002, obj->Get(sym1)->Int32Value()); 2700 CHECK_EQ(2002, obj->Get(env.local(), sym1)
2420 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); 2701 .ToLocalChecked()
2421 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) 2702 ->Int32Value(env.local())
2422 ->Equals(v8::Integer::New(isolate, 42))); 2703 .FromJust());
2423 CHECK_EQ(2u, obj->GetOwnPropertyNames()->Length()); 2704 CHECK(obj->Get(env.local(), sym3)
2705 .ToLocalChecked()
2706 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2707 .FromJust());
2708 CHECK(obj->Get(env.local(), v8_str("accessor_sym3"))
2709 .ToLocalChecked()
2710 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2711 .FromJust());
2712 CHECK_EQ(2u,
2713 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2424 2714
2425 // Symbol properties are inherited. 2715 // Symbol properties are inherited.
2426 v8::Local<v8::Object> child = v8::Object::New(isolate); 2716 v8::Local<v8::Object> child = v8::Object::New(isolate);
2427 child->SetPrototype(obj); 2717 CHECK(child->SetPrototype(env.local(), obj).FromJust());
2428 CHECK(child->Has(sym1)); 2718 CHECK(child->Has(env.local(), sym1).FromJust());
2429 CHECK_EQ(2002, child->Get(sym1)->Int32Value()); 2719 CHECK_EQ(2002, child->Get(env.local(), sym1)
2430 CHECK(obj->Get(sym3)->Equals(v8::Integer::New(isolate, 42))); 2720 .ToLocalChecked()
2431 CHECK(obj->Get(v8::String::NewFromUtf8(isolate, "accessor_sym3")) 2721 ->Int32Value(env.local())
2432 ->Equals(v8::Integer::New(isolate, 42))); 2722 .FromJust());
2433 CHECK_EQ(0u, child->GetOwnPropertyNames()->Length()); 2723 CHECK(obj->Get(env.local(), sym3)
2724 .ToLocalChecked()
2725 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2726 .FromJust());
2727 CHECK(obj->Get(env.local(), v8_str("accessor_sym3"))
2728 .ToLocalChecked()
2729 ->Equals(env.local(), v8::Integer::New(isolate, 42))
2730 .FromJust());
2731 CHECK_EQ(0u,
2732 child->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2434 } 2733 }
2435 2734
2436 2735
2437 THREADED_TEST(SymbolTemplateProperties) { 2736 THREADED_TEST(SymbolTemplateProperties) {
2438 LocalContext env; 2737 LocalContext env;
2439 v8::Isolate* isolate = env->GetIsolate(); 2738 v8::Isolate* isolate = env->GetIsolate();
2440 v8::HandleScope scope(isolate); 2739 v8::HandleScope scope(isolate);
2441 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate); 2740 v8::Local<v8::FunctionTemplate> foo = v8::FunctionTemplate::New(isolate);
2442 v8::Local<v8::Name> name = v8::Symbol::New(isolate); 2741 v8::Local<v8::Name> name = v8::Symbol::New(isolate);
2443 CHECK(!name.IsEmpty()); 2742 CHECK(!name.IsEmpty());
2444 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate)); 2743 foo->PrototypeTemplate()->Set(name, v8::FunctionTemplate::New(isolate));
2445 v8::Local<v8::Object> new_instance = foo->InstanceTemplate()->NewInstance(); 2744 v8::Local<v8::Object> new_instance =
2745 foo->InstanceTemplate()->NewInstance(env.local()).ToLocalChecked();
2446 CHECK(!new_instance.IsEmpty()); 2746 CHECK(!new_instance.IsEmpty());
2447 CHECK(new_instance->Has(name)); 2747 CHECK(new_instance->Has(env.local(), name).FromJust());
2448 } 2748 }
2449 2749
2450 2750
2451 THREADED_TEST(PrivateProperties) { 2751 THREADED_TEST(PrivateProperties) {
2452 LocalContext env; 2752 LocalContext env;
2453 v8::Isolate* isolate = env->GetIsolate(); 2753 v8::Isolate* isolate = env->GetIsolate();
2454 v8::HandleScope scope(isolate); 2754 v8::HandleScope scope(isolate);
2455 2755
2456 v8::Local<v8::Object> obj = v8::Object::New(isolate); 2756 v8::Local<v8::Object> obj = v8::Object::New(isolate);
2457 v8::Local<v8::Private> priv1 = v8::Private::New(isolate); 2757 v8::Local<v8::Private> priv1 = v8::Private::New(isolate);
2458 v8::Local<v8::Private> priv2 = 2758 v8::Local<v8::Private> priv2 =
2459 v8::Private::New(isolate, v8_str("my-private")); 2759 v8::Private::New(isolate, v8_str("my-private"));
2460 2760
2461 CcTest::heap()->CollectAllGarbage(); 2761 CcTest::heap()->CollectAllGarbage();
2462 2762
2463 CHECK(priv2->Name()->Equals(v8::String::NewFromUtf8(isolate, "my-private"))); 2763 CHECK(priv2->Name()
2764 ->Equals(env.local(),
2765 v8::String::NewFromUtf8(isolate, "my-private",
2766 v8::NewStringType::kNormal)
2767 .ToLocalChecked())
2768 .FromJust());
2464 2769
2465 // Make sure delete of a non-existent private symbol property works. 2770 // Make sure delete of a non-existent private symbol property works.
2466 obj->DeletePrivate(env.local(), priv1).FromJust(); 2771 obj->DeletePrivate(env.local(), priv1).FromJust();
2467 CHECK(!obj->HasPrivate(env.local(), priv1).FromJust()); 2772 CHECK(!obj->HasPrivate(env.local(), priv1).FromJust());
2468 2773
2469 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 1503)) 2774 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 1503))
2470 .FromJust()); 2775 .FromJust());
2471 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); 2776 CHECK(obj->HasPrivate(env.local(), priv1).FromJust());
2472 CHECK_EQ(1503, 2777 CHECK_EQ(1503, obj->GetPrivate(env.local(), priv1)
2473 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); 2778 .ToLocalChecked()
2779 ->Int32Value(env.local())
2780 .FromJust());
2474 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 2002)) 2781 CHECK(obj->SetPrivate(env.local(), priv1, v8::Integer::New(isolate, 2002))
2475 .FromJust()); 2782 .FromJust());
2476 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); 2783 CHECK(obj->HasPrivate(env.local(), priv1).FromJust());
2477 CHECK_EQ(2002, 2784 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1)
2478 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); 2785 .ToLocalChecked()
2786 ->Int32Value(env.local())
2787 .FromJust());
2479 2788
2480 CHECK_EQ(0u, obj->GetOwnPropertyNames()->Length()); 2789 CHECK_EQ(0u,
2481 unsigned num_props = obj->GetPropertyNames()->Length(); 2790 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2482 CHECK(obj->Set(v8::String::NewFromUtf8(isolate, "bla"), 2791 unsigned num_props =
2483 v8::Integer::New(isolate, 20))); 2792 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length();
2484 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); 2793 CHECK(obj->Set(env.local(), v8::String::NewFromUtf8(
2485 CHECK_EQ(num_props + 1, obj->GetPropertyNames()->Length()); 2794 isolate, "bla", v8::NewStringType::kNormal)
2795 .ToLocalChecked(),
2796 v8::Integer::New(isolate, 20))
2797 .FromJust());
2798 CHECK_EQ(1u,
2799 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2800 CHECK_EQ(num_props + 1,
2801 obj->GetPropertyNames(env.local()).ToLocalChecked()->Length());
2486 2802
2487 CcTest::heap()->CollectAllGarbage(); 2803 CcTest::heap()->CollectAllGarbage();
2488 2804
2489 // Add another property and delete it afterwards to force the object in 2805 // Add another property and delete it afterwards to force the object in
2490 // slow case. 2806 // slow case.
2491 CHECK(obj->SetPrivate(env.local(), priv2, v8::Integer::New(isolate, 2008)) 2807 CHECK(obj->SetPrivate(env.local(), priv2, v8::Integer::New(isolate, 2008))
2492 .FromJust()); 2808 .FromJust());
2493 CHECK_EQ(2002, 2809 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1)
2494 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); 2810 .ToLocalChecked()
2495 CHECK_EQ(2008, 2811 ->Int32Value(env.local())
2496 obj->GetPrivate(env.local(), priv2).ToLocalChecked()->Int32Value()); 2812 .FromJust());
2497 CHECK_EQ(2002, 2813 CHECK_EQ(2008, obj->GetPrivate(env.local(), priv2)
2498 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); 2814 .ToLocalChecked()
2499 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); 2815 ->Int32Value(env.local())
2816 .FromJust());
2817 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1)
2818 .ToLocalChecked()
2819 ->Int32Value(env.local())
2820 .FromJust());
2821 CHECK_EQ(1u,
2822 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2500 2823
2501 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); 2824 CHECK(obj->HasPrivate(env.local(), priv1).FromJust());
2502 CHECK(obj->HasPrivate(env.local(), priv2).FromJust()); 2825 CHECK(obj->HasPrivate(env.local(), priv2).FromJust());
2503 CHECK(obj->DeletePrivate(env.local(), priv2).FromJust()); 2826 CHECK(obj->DeletePrivate(env.local(), priv2).FromJust());
2504 CHECK(obj->HasPrivate(env.local(), priv1).FromJust()); 2827 CHECK(obj->HasPrivate(env.local(), priv1).FromJust());
2505 CHECK(!obj->HasPrivate(env.local(), priv2).FromJust()); 2828 CHECK(!obj->HasPrivate(env.local(), priv2).FromJust());
2506 CHECK_EQ(2002, 2829 CHECK_EQ(2002, obj->GetPrivate(env.local(), priv1)
2507 obj->GetPrivate(env.local(), priv1).ToLocalChecked()->Int32Value()); 2830 .ToLocalChecked()
2508 CHECK_EQ(1u, obj->GetOwnPropertyNames()->Length()); 2831 ->Int32Value(env.local())
2832 .FromJust());
2833 CHECK_EQ(1u,
2834 obj->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2509 2835
2510 // Private properties are not inherited (for the time being). 2836 // Private properties are not inherited (for the time being).
2511 v8::Local<v8::Object> child = v8::Object::New(isolate); 2837 v8::Local<v8::Object> child = v8::Object::New(isolate);
2512 child->SetPrototype(obj); 2838 CHECK(child->SetPrototype(env.local(), obj).FromJust());
2513 CHECK(!child->HasPrivate(env.local(), priv1).FromJust()); 2839 CHECK(!child->HasPrivate(env.local(), priv1).FromJust());
2514 CHECK_EQ(0u, child->GetOwnPropertyNames()->Length()); 2840 CHECK_EQ(0u,
2841 child->GetOwnPropertyNames(env.local()).ToLocalChecked()->Length());
2515 } 2842 }
2516 2843
2517 2844
2518 THREADED_TEST(GlobalSymbols) { 2845 THREADED_TEST(GlobalSymbols) {
2519 LocalContext env; 2846 LocalContext env;
2520 v8::Isolate* isolate = env->GetIsolate(); 2847 v8::Isolate* isolate = env->GetIsolate();
2521 v8::HandleScope scope(isolate); 2848 v8::HandleScope scope(isolate);
2522 2849
2523 v8::Local<String> name = v8_str("my-symbol"); 2850 v8::Local<String> name = v8_str("my-symbol");
2524 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name); 2851 v8::Local<v8::Symbol> glob = v8::Symbol::For(isolate, name);
2525 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name); 2852 v8::Local<v8::Symbol> glob2 = v8::Symbol::For(isolate, name);
2526 CHECK(glob2->SameValue(glob)); 2853 CHECK(glob2->SameValue(glob));
2527 2854
2528 v8::Local<v8::Symbol> glob_api = v8::Symbol::ForApi(isolate, name); 2855 v8::Local<v8::Symbol> glob_api = v8::Symbol::ForApi(isolate, name);
2529 v8::Local<v8::Symbol> glob_api2 = v8::Symbol::ForApi(isolate, name); 2856 v8::Local<v8::Symbol> glob_api2 = v8::Symbol::ForApi(isolate, name);
2530 CHECK(glob_api2->SameValue(glob_api)); 2857 CHECK(glob_api2->SameValue(glob_api));
2531 CHECK(!glob_api->SameValue(glob)); 2858 CHECK(!glob_api->SameValue(glob));
2532 2859
2533 v8::Local<v8::Symbol> sym = v8::Symbol::New(isolate, name); 2860 v8::Local<v8::Symbol> sym = v8::Symbol::New(isolate, name);
2534 CHECK(!sym->SameValue(glob)); 2861 CHECK(!sym->SameValue(glob));
2535 2862
2536 CompileRun("var sym2 = Symbol.for('my-symbol')"); 2863 CompileRun("var sym2 = Symbol.for('my-symbol')");
2537 v8::Local<Value> sym2 = env->Global()->Get(v8_str("sym2")); 2864 v8::Local<Value> sym2 =
2865 env->Global()->Get(env.local(), v8_str("sym2")).ToLocalChecked();
2538 CHECK(sym2->SameValue(glob)); 2866 CHECK(sym2->SameValue(glob));
2539 CHECK(!sym2->SameValue(glob_api)); 2867 CHECK(!sym2->SameValue(glob_api));
2540 } 2868 }
2541 2869
2542 2870
2543 static void CheckWellKnownSymbol(v8::Local<v8::Symbol>(*getter)(v8::Isolate*), 2871 static void CheckWellKnownSymbol(v8::Local<v8::Symbol>(*getter)(v8::Isolate*),
2544 const char* name) { 2872 const char* name) {
2545 LocalContext env; 2873 LocalContext env;
2546 v8::Isolate* isolate = env->GetIsolate(); 2874 v8::Isolate* isolate = env->GetIsolate();
2547 v8::HandleScope scope(isolate); 2875 v8::HandleScope scope(isolate);
2548 2876
2549 v8::Local<v8::Symbol> symbol = getter(isolate); 2877 v8::Local<v8::Symbol> symbol = getter(isolate);
2550 std::string script = std::string("var sym = ") + name; 2878 std::string script = std::string("var sym = ") + name;
2551 CompileRun(script.c_str()); 2879 CompileRun(script.c_str());
2552 v8::Local<Value> value = env->Global()->Get(v8_str("sym")); 2880 v8::Local<Value> value =
2881 env->Global()->Get(env.local(), v8_str("sym")).ToLocalChecked();
2553 2882
2554 CHECK(!value.IsEmpty()); 2883 CHECK(!value.IsEmpty());
2555 CHECK(!symbol.IsEmpty()); 2884 CHECK(!symbol.IsEmpty());
2556 CHECK(value->SameValue(symbol)); 2885 CHECK(value->SameValue(symbol));
2557 } 2886 }
2558 2887
2559 2888
2560 THREADED_TEST(WellKnownSymbols) { 2889 THREADED_TEST(WellKnownSymbols) {
2561 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator"); 2890 CheckWellKnownSymbol(v8::Symbol::GetIterator, "Symbol.iterator");
2562 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables"); 2891 CheckWellKnownSymbol(v8::Symbol::GetUnscopables, "Symbol.unscopables");
(...skipping 12 matching lines...) Expand all
2575 CHECK(obj->SetPrivate(env.local(), glob, v8::Integer::New(isolate, 3)) 2904 CHECK(obj->SetPrivate(env.local(), glob, v8::Integer::New(isolate, 3))
2576 .FromJust()); 2905 .FromJust());
2577 2906
2578 v8::Local<v8::Private> glob2 = v8::Private::ForApi(isolate, name); 2907 v8::Local<v8::Private> glob2 = v8::Private::ForApi(isolate, name);
2579 CHECK(obj->HasPrivate(env.local(), glob2).FromJust()); 2908 CHECK(obj->HasPrivate(env.local(), glob2).FromJust());
2580 2909
2581 v8::Local<v8::Private> priv = v8::Private::New(isolate, name); 2910 v8::Local<v8::Private> priv = v8::Private::New(isolate, name);
2582 CHECK(!obj->HasPrivate(env.local(), priv).FromJust()); 2911 CHECK(!obj->HasPrivate(env.local(), priv).FromJust());
2583 2912
2584 CompileRun("var intern = %CreatePrivateSymbol('my-private')"); 2913 CompileRun("var intern = %CreatePrivateSymbol('my-private')");
2585 v8::Local<Value> intern = env->Global()->Get(v8_str("intern")); 2914 v8::Local<Value> intern =
2586 CHECK(!obj->Has(intern)); 2915 env->Global()->Get(env.local(), v8_str("intern")).ToLocalChecked();
2916 CHECK(!obj->Has(env.local(), intern).FromJust());
2587 } 2917 }
2588 2918
2589 2919
2590 class ScopedArrayBufferContents { 2920 class ScopedArrayBufferContents {
2591 public: 2921 public:
2592 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents) 2922 explicit ScopedArrayBufferContents(const v8::ArrayBuffer::Contents& contents)
2593 : contents_(contents) {} 2923 : contents_(contents) {}
2594 ~ScopedArrayBufferContents() { free(contents_.Data()); } 2924 ~ScopedArrayBufferContents() { free(contents_.Data()); }
2595 void* Data() const { return contents_.Data(); } 2925 void* Data() const { return contents_.Data(); }
2596 size_t ByteLength() const { return contents_.ByteLength(); } 2926 size_t ByteLength() const { return contents_.ByteLength(); }
2597 2927
2598 private: 2928 private:
2599 const v8::ArrayBuffer::Contents contents_; 2929 const v8::ArrayBuffer::Contents contents_;
2600 }; 2930 };
2601 2931
2602 template <typename T> 2932 template <typename T>
2603 static void CheckInternalFieldsAreZero(v8::Handle<T> value) { 2933 static void CheckInternalFieldsAreZero(v8::Local<T> value) {
2604 CHECK_EQ(T::kInternalFieldCount, value->InternalFieldCount()); 2934 CHECK_EQ(T::kInternalFieldCount, value->InternalFieldCount());
2605 for (int i = 0; i < value->InternalFieldCount(); i++) { 2935 for (int i = 0; i < value->InternalFieldCount(); i++) {
2606 CHECK_EQ(0, value->GetInternalField(i)->Int32Value()); 2936 CHECK_EQ(0, value->GetInternalField(i)
2937 ->Int32Value(CcTest::isolate()->GetCurrentContext())
2938 .FromJust());
2607 } 2939 }
2608 } 2940 }
2609 2941
2610 2942
2611 THREADED_TEST(ArrayBuffer_ApiInternalToExternal) { 2943 THREADED_TEST(ArrayBuffer_ApiInternalToExternal) {
2612 LocalContext env; 2944 LocalContext env;
2613 v8::Isolate* isolate = env->GetIsolate(); 2945 v8::Isolate* isolate = env->GetIsolate();
2614 v8::HandleScope handle_scope(isolate); 2946 v8::HandleScope handle_scope(isolate);
2615 2947
2616 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 1024); 2948 Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(isolate, 1024);
2617 CheckInternalFieldsAreZero(ab); 2949 CheckInternalFieldsAreZero(ab);
2618 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); 2950 CHECK_EQ(1024, static_cast<int>(ab->ByteLength()));
2619 CHECK(!ab->IsExternal()); 2951 CHECK(!ab->IsExternal());
2620 CcTest::heap()->CollectAllGarbage(); 2952 CcTest::heap()->CollectAllGarbage();
2621 2953
2622 ScopedArrayBufferContents ab_contents(ab->Externalize()); 2954 ScopedArrayBufferContents ab_contents(ab->Externalize());
2623 CHECK(ab->IsExternal()); 2955 CHECK(ab->IsExternal());
2624 2956
2625 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); 2957 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength()));
2626 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); 2958 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data());
2627 DCHECK(data != NULL); 2959 DCHECK(data != NULL);
2628 env->Global()->Set(v8_str("ab"), ab); 2960 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust());
2629 2961
2630 v8::Handle<v8::Value> result = CompileRun("ab.byteLength"); 2962 v8::Local<v8::Value> result = CompileRun("ab.byteLength");
2631 CHECK_EQ(1024, result->Int32Value()); 2963 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust());
2632 2964
2633 result = CompileRun( 2965 result = CompileRun(
2634 "var u8 = new Uint8Array(ab);" 2966 "var u8 = new Uint8Array(ab);"
2635 "u8[0] = 0xFF;" 2967 "u8[0] = 0xFF;"
2636 "u8[1] = 0xAA;" 2968 "u8[1] = 0xAA;"
2637 "u8.length"); 2969 "u8.length");
2638 CHECK_EQ(1024, result->Int32Value()); 2970 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust());
2639 CHECK_EQ(0xFF, data[0]); 2971 CHECK_EQ(0xFF, data[0]);
2640 CHECK_EQ(0xAA, data[1]); 2972 CHECK_EQ(0xAA, data[1]);
2641 data[0] = 0xCC; 2973 data[0] = 0xCC;
2642 data[1] = 0x11; 2974 data[1] = 0x11;
2643 result = CompileRun("u8[0] + u8[1]"); 2975 result = CompileRun("u8[0] + u8[1]");
2644 CHECK_EQ(0xDD, result->Int32Value()); 2976 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
2645 } 2977 }
2646 2978
2647 2979
2648 THREADED_TEST(ArrayBuffer_JSInternalToExternal) { 2980 THREADED_TEST(ArrayBuffer_JSInternalToExternal) {
2649 LocalContext env; 2981 LocalContext env;
2650 v8::Isolate* isolate = env->GetIsolate(); 2982 v8::Isolate* isolate = env->GetIsolate();
2651 v8::HandleScope handle_scope(isolate); 2983 v8::HandleScope handle_scope(isolate);
2652 2984
2653 2985
2654 v8::Local<v8::Value> result = CompileRun( 2986 v8::Local<v8::Value> result = CompileRun(
2655 "var ab1 = new ArrayBuffer(2);" 2987 "var ab1 = new ArrayBuffer(2);"
2656 "var u8_a = new Uint8Array(ab1);" 2988 "var u8_a = new Uint8Array(ab1);"
2657 "u8_a[0] = 0xAA;" 2989 "u8_a[0] = 0xAA;"
2658 "u8_a[1] = 0xFF; u8_a.buffer"); 2990 "u8_a[1] = 0xFF; u8_a.buffer");
2659 Local<v8::ArrayBuffer> ab1 = Local<v8::ArrayBuffer>::Cast(result); 2991 Local<v8::ArrayBuffer> ab1 = Local<v8::ArrayBuffer>::Cast(result);
2660 CheckInternalFieldsAreZero(ab1); 2992 CheckInternalFieldsAreZero(ab1);
2661 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); 2993 CHECK_EQ(2, static_cast<int>(ab1->ByteLength()));
2662 CHECK(!ab1->IsExternal()); 2994 CHECK(!ab1->IsExternal());
2663 ScopedArrayBufferContents ab1_contents(ab1->Externalize()); 2995 ScopedArrayBufferContents ab1_contents(ab1->Externalize());
2664 CHECK(ab1->IsExternal()); 2996 CHECK(ab1->IsExternal());
2665 2997
2666 result = CompileRun("ab1.byteLength"); 2998 result = CompileRun("ab1.byteLength");
2667 CHECK_EQ(2, result->Int32Value()); 2999 CHECK_EQ(2, result->Int32Value(env.local()).FromJust());
2668 result = CompileRun("u8_a[0]"); 3000 result = CompileRun("u8_a[0]");
2669 CHECK_EQ(0xAA, result->Int32Value()); 3001 CHECK_EQ(0xAA, result->Int32Value(env.local()).FromJust());
2670 result = CompileRun("u8_a[1]"); 3002 result = CompileRun("u8_a[1]");
2671 CHECK_EQ(0xFF, result->Int32Value()); 3003 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust());
2672 result = CompileRun( 3004 result = CompileRun(
2673 "var u8_b = new Uint8Array(ab1);" 3005 "var u8_b = new Uint8Array(ab1);"
2674 "u8_b[0] = 0xBB;" 3006 "u8_b[0] = 0xBB;"
2675 "u8_a[0]"); 3007 "u8_a[0]");
2676 CHECK_EQ(0xBB, result->Int32Value()); 3008 CHECK_EQ(0xBB, result->Int32Value(env.local()).FromJust());
2677 result = CompileRun("u8_b[1]"); 3009 result = CompileRun("u8_b[1]");
2678 CHECK_EQ(0xFF, result->Int32Value()); 3010 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust());
2679 3011
2680 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); 3012 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength()));
2681 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); 3013 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data());
2682 CHECK_EQ(0xBB, ab1_data[0]); 3014 CHECK_EQ(0xBB, ab1_data[0]);
2683 CHECK_EQ(0xFF, ab1_data[1]); 3015 CHECK_EQ(0xFF, ab1_data[1]);
2684 ab1_data[0] = 0xCC; 3016 ab1_data[0] = 0xCC;
2685 ab1_data[1] = 0x11; 3017 ab1_data[1] = 0x11;
2686 result = CompileRun("u8_a[0] + u8_a[1]"); 3018 result = CompileRun("u8_a[0] + u8_a[1]");
2687 CHECK_EQ(0xDD, result->Int32Value()); 3019 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
2688 } 3020 }
2689 3021
2690 3022
2691 THREADED_TEST(ArrayBuffer_External) { 3023 THREADED_TEST(ArrayBuffer_External) {
2692 LocalContext env; 3024 LocalContext env;
2693 v8::Isolate* isolate = env->GetIsolate(); 3025 v8::Isolate* isolate = env->GetIsolate();
2694 v8::HandleScope handle_scope(isolate); 3026 v8::HandleScope handle_scope(isolate);
2695 3027
2696 i::ScopedVector<uint8_t> my_data(100); 3028 i::ScopedVector<uint8_t> my_data(100);
2697 memset(my_data.start(), 0, 100); 3029 memset(my_data.start(), 0, 100);
2698 Local<v8::ArrayBuffer> ab3 = 3030 Local<v8::ArrayBuffer> ab3 =
2699 v8::ArrayBuffer::New(isolate, my_data.start(), 100); 3031 v8::ArrayBuffer::New(isolate, my_data.start(), 100);
2700 CheckInternalFieldsAreZero(ab3); 3032 CheckInternalFieldsAreZero(ab3);
2701 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); 3033 CHECK_EQ(100, static_cast<int>(ab3->ByteLength()));
2702 CHECK(ab3->IsExternal()); 3034 CHECK(ab3->IsExternal());
2703 3035
2704 env->Global()->Set(v8_str("ab3"), ab3); 3036 CHECK(env->Global()->Set(env.local(), v8_str("ab3"), ab3).FromJust());
2705 3037
2706 v8::Handle<v8::Value> result = CompileRun("ab3.byteLength"); 3038 v8::Local<v8::Value> result = CompileRun("ab3.byteLength");
2707 CHECK_EQ(100, result->Int32Value()); 3039 CHECK_EQ(100, result->Int32Value(env.local()).FromJust());
2708 3040
2709 result = CompileRun( 3041 result = CompileRun(
2710 "var u8_b = new Uint8Array(ab3);" 3042 "var u8_b = new Uint8Array(ab3);"
2711 "u8_b[0] = 0xBB;" 3043 "u8_b[0] = 0xBB;"
2712 "u8_b[1] = 0xCC;" 3044 "u8_b[1] = 0xCC;"
2713 "u8_b.length"); 3045 "u8_b.length");
2714 CHECK_EQ(100, result->Int32Value()); 3046 CHECK_EQ(100, result->Int32Value(env.local()).FromJust());
2715 CHECK_EQ(0xBB, my_data[0]); 3047 CHECK_EQ(0xBB, my_data[0]);
2716 CHECK_EQ(0xCC, my_data[1]); 3048 CHECK_EQ(0xCC, my_data[1]);
2717 my_data[0] = 0xCC; 3049 my_data[0] = 0xCC;
2718 my_data[1] = 0x11; 3050 my_data[1] = 0x11;
2719 result = CompileRun("u8_b[0] + u8_b[1]"); 3051 result = CompileRun("u8_b[0] + u8_b[1]");
2720 CHECK_EQ(0xDD, result->Int32Value()); 3052 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
2721 } 3053 }
2722 3054
2723 3055
2724 THREADED_TEST(ArrayBuffer_DisableNeuter) { 3056 THREADED_TEST(ArrayBuffer_DisableNeuter) {
2725 LocalContext env; 3057 LocalContext env;
2726 v8::Isolate* isolate = env->GetIsolate(); 3058 v8::Isolate* isolate = env->GetIsolate();
2727 v8::HandleScope handle_scope(isolate); 3059 v8::HandleScope handle_scope(isolate);
2728 3060
2729 i::ScopedVector<uint8_t> my_data(100); 3061 i::ScopedVector<uint8_t> my_data(100);
2730 memset(my_data.start(), 0, 100); 3062 memset(my_data.start(), 0, 100);
2731 Local<v8::ArrayBuffer> ab = 3063 Local<v8::ArrayBuffer> ab =
2732 v8::ArrayBuffer::New(isolate, my_data.start(), 100); 3064 v8::ArrayBuffer::New(isolate, my_data.start(), 100);
2733 CHECK(ab->IsNeuterable()); 3065 CHECK(ab->IsNeuterable());
2734 3066
2735 i::Handle<i::JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab); 3067 i::Handle<i::JSArrayBuffer> buf = v8::Utils::OpenHandle(*ab);
2736 buf->set_is_neuterable(false); 3068 buf->set_is_neuterable(false);
2737 3069
2738 CHECK(!ab->IsNeuterable()); 3070 CHECK(!ab->IsNeuterable());
2739 } 3071 }
2740 3072
2741 3073
2742 static void CheckDataViewIsNeutered(v8::Handle<v8::DataView> dv) { 3074 static void CheckDataViewIsNeutered(v8::Local<v8::DataView> dv) {
2743 CHECK_EQ(0, static_cast<int>(dv->ByteLength())); 3075 CHECK_EQ(0, static_cast<int>(dv->ByteLength()));
2744 CHECK_EQ(0, static_cast<int>(dv->ByteOffset())); 3076 CHECK_EQ(0, static_cast<int>(dv->ByteOffset()));
2745 } 3077 }
2746 3078
2747 3079
2748 static void CheckIsNeutered(v8::Handle<v8::TypedArray> ta) { 3080 static void CheckIsNeutered(v8::Local<v8::TypedArray> ta) {
2749 CHECK_EQ(0, static_cast<int>(ta->ByteLength())); 3081 CHECK_EQ(0, static_cast<int>(ta->ByteLength()));
2750 CHECK_EQ(0, static_cast<int>(ta->Length())); 3082 CHECK_EQ(0, static_cast<int>(ta->Length()));
2751 CHECK_EQ(0, static_cast<int>(ta->ByteOffset())); 3083 CHECK_EQ(0, static_cast<int>(ta->ByteOffset()));
2752 } 3084 }
2753 3085
2754 3086
2755 static void CheckIsTypedArrayVarNeutered(const char* name) { 3087 static void CheckIsTypedArrayVarNeutered(const char* name) {
2756 i::ScopedVector<char> source(1024); 3088 i::ScopedVector<char> source(1024);
2757 i::SNPrintF(source, 3089 i::SNPrintF(source,
2758 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0", 3090 "%s.byteLength == 0 && %s.byteOffset == 0 && %s.length == 0",
2759 name, name, name); 3091 name, name, name);
2760 CHECK(CompileRun(source.start())->IsTrue()); 3092 CHECK(CompileRun(source.start())->IsTrue());
2761 v8::Handle<v8::TypedArray> ta = 3093 v8::Local<v8::TypedArray> ta =
2762 v8::Handle<v8::TypedArray>::Cast(CompileRun(name)); 3094 v8::Local<v8::TypedArray>::Cast(CompileRun(name));
2763 CheckIsNeutered(ta); 3095 CheckIsNeutered(ta);
2764 } 3096 }
2765 3097
2766 3098
2767 template <typename TypedArray, int kElementSize> 3099 template <typename TypedArray, int kElementSize>
2768 static Handle<TypedArray> CreateAndCheck(Handle<v8::ArrayBuffer> ab, 3100 static Local<TypedArray> CreateAndCheck(Local<v8::ArrayBuffer> ab,
2769 int byteOffset, int length) { 3101 int byteOffset, int length) {
2770 v8::Handle<TypedArray> ta = TypedArray::New(ab, byteOffset, length); 3102 v8::Local<TypedArray> ta = TypedArray::New(ab, byteOffset, length);
2771 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta); 3103 CheckInternalFieldsAreZero<v8::ArrayBufferView>(ta);
2772 CHECK_EQ(byteOffset, static_cast<int>(ta->ByteOffset())); 3104 CHECK_EQ(byteOffset, static_cast<int>(ta->ByteOffset()));
2773 CHECK_EQ(length, static_cast<int>(ta->Length())); 3105 CHECK_EQ(length, static_cast<int>(ta->Length()));
2774 CHECK_EQ(length * kElementSize, static_cast<int>(ta->ByteLength())); 3106 CHECK_EQ(length * kElementSize, static_cast<int>(ta->ByteLength()));
2775 return ta; 3107 return ta;
2776 } 3108 }
2777 3109
2778 3110
2779 THREADED_TEST(ArrayBuffer_NeuteringApi) { 3111 THREADED_TEST(ArrayBuffer_NeuteringApi) {
2780 LocalContext env; 3112 LocalContext env;
2781 v8::Isolate* isolate = env->GetIsolate(); 3113 v8::Isolate* isolate = env->GetIsolate();
2782 v8::HandleScope handle_scope(isolate); 3114 v8::HandleScope handle_scope(isolate);
2783 3115
2784 v8::Handle<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(isolate, 1024); 3116 v8::Local<v8::ArrayBuffer> buffer = v8::ArrayBuffer::New(isolate, 1024);
2785 3117
2786 v8::Handle<v8::Uint8Array> u8a = 3118 v8::Local<v8::Uint8Array> u8a =
2787 CreateAndCheck<v8::Uint8Array, 1>(buffer, 1, 1023); 3119 CreateAndCheck<v8::Uint8Array, 1>(buffer, 1, 1023);
2788 v8::Handle<v8::Uint8ClampedArray> u8c = 3120 v8::Local<v8::Uint8ClampedArray> u8c =
2789 CreateAndCheck<v8::Uint8ClampedArray, 1>(buffer, 1, 1023); 3121 CreateAndCheck<v8::Uint8ClampedArray, 1>(buffer, 1, 1023);
2790 v8::Handle<v8::Int8Array> i8a = 3122 v8::Local<v8::Int8Array> i8a =
2791 CreateAndCheck<v8::Int8Array, 1>(buffer, 1, 1023); 3123 CreateAndCheck<v8::Int8Array, 1>(buffer, 1, 1023);
2792 3124
2793 v8::Handle<v8::Uint16Array> u16a = 3125 v8::Local<v8::Uint16Array> u16a =
2794 CreateAndCheck<v8::Uint16Array, 2>(buffer, 2, 511); 3126 CreateAndCheck<v8::Uint16Array, 2>(buffer, 2, 511);
2795 v8::Handle<v8::Int16Array> i16a = 3127 v8::Local<v8::Int16Array> i16a =
2796 CreateAndCheck<v8::Int16Array, 2>(buffer, 2, 511); 3128 CreateAndCheck<v8::Int16Array, 2>(buffer, 2, 511);
2797 3129
2798 v8::Handle<v8::Uint32Array> u32a = 3130 v8::Local<v8::Uint32Array> u32a =
2799 CreateAndCheck<v8::Uint32Array, 4>(buffer, 4, 255); 3131 CreateAndCheck<v8::Uint32Array, 4>(buffer, 4, 255);
2800 v8::Handle<v8::Int32Array> i32a = 3132 v8::Local<v8::Int32Array> i32a =
2801 CreateAndCheck<v8::Int32Array, 4>(buffer, 4, 255); 3133 CreateAndCheck<v8::Int32Array, 4>(buffer, 4, 255);
2802 3134
2803 v8::Handle<v8::Float32Array> f32a = 3135 v8::Local<v8::Float32Array> f32a =
2804 CreateAndCheck<v8::Float32Array, 4>(buffer, 4, 255); 3136 CreateAndCheck<v8::Float32Array, 4>(buffer, 4, 255);
2805 v8::Handle<v8::Float64Array> f64a = 3137 v8::Local<v8::Float64Array> f64a =
2806 CreateAndCheck<v8::Float64Array, 8>(buffer, 8, 127); 3138 CreateAndCheck<v8::Float64Array, 8>(buffer, 8, 127);
2807 3139
2808 v8::Handle<v8::DataView> dv = v8::DataView::New(buffer, 1, 1023); 3140 v8::Local<v8::DataView> dv = v8::DataView::New(buffer, 1, 1023);
2809 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); 3141 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv);
2810 CHECK_EQ(1, static_cast<int>(dv->ByteOffset())); 3142 CHECK_EQ(1, static_cast<int>(dv->ByteOffset()));
2811 CHECK_EQ(1023, static_cast<int>(dv->ByteLength())); 3143 CHECK_EQ(1023, static_cast<int>(dv->ByteLength()));
2812 3144
2813 ScopedArrayBufferContents contents(buffer->Externalize()); 3145 ScopedArrayBufferContents contents(buffer->Externalize());
2814 buffer->Neuter(); 3146 buffer->Neuter();
2815 CHECK_EQ(0, static_cast<int>(buffer->ByteLength())); 3147 CHECK_EQ(0, static_cast<int>(buffer->ByteLength()));
2816 CheckIsNeutered(u8a); 3148 CheckIsNeutered(u8a);
2817 CheckIsNeutered(u8c); 3149 CheckIsNeutered(u8c);
2818 CheckIsNeutered(i8a); 3150 CheckIsNeutered(i8a);
(...skipping 18 matching lines...) Expand all
2837 "var u8c = new Uint8ClampedArray(ab, 1, 1023);" 3169 "var u8c = new Uint8ClampedArray(ab, 1, 1023);"
2838 "var i8a = new Int8Array(ab, 1, 1023);" 3170 "var i8a = new Int8Array(ab, 1, 1023);"
2839 "var u16a = new Uint16Array(ab, 2, 511);" 3171 "var u16a = new Uint16Array(ab, 2, 511);"
2840 "var i16a = new Int16Array(ab, 2, 511);" 3172 "var i16a = new Int16Array(ab, 2, 511);"
2841 "var u32a = new Uint32Array(ab, 4, 255);" 3173 "var u32a = new Uint32Array(ab, 4, 255);"
2842 "var i32a = new Int32Array(ab, 4, 255);" 3174 "var i32a = new Int32Array(ab, 4, 255);"
2843 "var f32a = new Float32Array(ab, 4, 255);" 3175 "var f32a = new Float32Array(ab, 4, 255);"
2844 "var f64a = new Float64Array(ab, 8, 127);" 3176 "var f64a = new Float64Array(ab, 8, 127);"
2845 "var dv = new DataView(ab, 1, 1023);"); 3177 "var dv = new DataView(ab, 1, 1023);");
2846 3178
2847 v8::Handle<v8::ArrayBuffer> ab = 3179 v8::Local<v8::ArrayBuffer> ab =
2848 Local<v8::ArrayBuffer>::Cast(CompileRun("ab")); 3180 Local<v8::ArrayBuffer>::Cast(CompileRun("ab"));
2849 3181
2850 v8::Handle<v8::DataView> dv = 3182 v8::Local<v8::DataView> dv = v8::Local<v8::DataView>::Cast(CompileRun("dv"));
2851 v8::Handle<v8::DataView>::Cast(CompileRun("dv"));
2852 3183
2853 ScopedArrayBufferContents contents(ab->Externalize()); 3184 ScopedArrayBufferContents contents(ab->Externalize());
2854 ab->Neuter(); 3185 ab->Neuter();
2855 CHECK_EQ(0, static_cast<int>(ab->ByteLength())); 3186 CHECK_EQ(0, static_cast<int>(ab->ByteLength()));
2856 CHECK_EQ(0, CompileRun("ab.byteLength")->Int32Value()); 3187 CHECK_EQ(0, v8_run_int32value(v8_compile("ab.byteLength")));
2857 3188
2858 CheckIsTypedArrayVarNeutered("u8a"); 3189 CheckIsTypedArrayVarNeutered("u8a");
2859 CheckIsTypedArrayVarNeutered("u8c"); 3190 CheckIsTypedArrayVarNeutered("u8c");
2860 CheckIsTypedArrayVarNeutered("i8a"); 3191 CheckIsTypedArrayVarNeutered("i8a");
2861 CheckIsTypedArrayVarNeutered("u16a"); 3192 CheckIsTypedArrayVarNeutered("u16a");
2862 CheckIsTypedArrayVarNeutered("i16a"); 3193 CheckIsTypedArrayVarNeutered("i16a");
2863 CheckIsTypedArrayVarNeutered("u32a"); 3194 CheckIsTypedArrayVarNeutered("u32a");
2864 CheckIsTypedArrayVarNeutered("i32a"); 3195 CheckIsTypedArrayVarNeutered("i32a");
2865 CheckIsTypedArrayVarNeutered("f32a"); 3196 CheckIsTypedArrayVarNeutered("f32a");
2866 CheckIsTypedArrayVarNeutered("f64a"); 3197 CheckIsTypedArrayVarNeutered("f64a");
(...skipping 28 matching lines...) Expand all
2895 CHECK_EQ(1024, static_cast<int>(ab->ByteLength())); 3226 CHECK_EQ(1024, static_cast<int>(ab->ByteLength()));
2896 CHECK(!ab->IsExternal()); 3227 CHECK(!ab->IsExternal());
2897 CcTest::heap()->CollectAllGarbage(); 3228 CcTest::heap()->CollectAllGarbage();
2898 3229
2899 ScopedSharedArrayBufferContents ab_contents(ab->Externalize()); 3230 ScopedSharedArrayBufferContents ab_contents(ab->Externalize());
2900 CHECK(ab->IsExternal()); 3231 CHECK(ab->IsExternal());
2901 3232
2902 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength())); 3233 CHECK_EQ(1024, static_cast<int>(ab_contents.ByteLength()));
2903 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data()); 3234 uint8_t* data = static_cast<uint8_t*>(ab_contents.Data());
2904 DCHECK(data != NULL); 3235 DCHECK(data != NULL);
2905 env->Global()->Set(v8_str("ab"), ab); 3236 CHECK(env->Global()->Set(env.local(), v8_str("ab"), ab).FromJust());
2906 3237
2907 v8::Handle<v8::Value> result = CompileRun("ab.byteLength"); 3238 v8::Local<v8::Value> result = CompileRun("ab.byteLength");
2908 CHECK_EQ(1024, result->Int32Value()); 3239 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust());
2909 3240
2910 result = CompileRun( 3241 result = CompileRun(
2911 "var u8 = new Uint8Array(ab);" 3242 "var u8 = new Uint8Array(ab);"
2912 "u8[0] = 0xFF;" 3243 "u8[0] = 0xFF;"
2913 "u8[1] = 0xAA;" 3244 "u8[1] = 0xAA;"
2914 "u8.length"); 3245 "u8.length");
2915 CHECK_EQ(1024, result->Int32Value()); 3246 CHECK_EQ(1024, result->Int32Value(env.local()).FromJust());
2916 CHECK_EQ(0xFF, data[0]); 3247 CHECK_EQ(0xFF, data[0]);
2917 CHECK_EQ(0xAA, data[1]); 3248 CHECK_EQ(0xAA, data[1]);
2918 data[0] = 0xCC; 3249 data[0] = 0xCC;
2919 data[1] = 0x11; 3250 data[1] = 0x11;
2920 result = CompileRun("u8[0] + u8[1]"); 3251 result = CompileRun("u8[0] + u8[1]");
2921 CHECK_EQ(0xDD, result->Int32Value()); 3252 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
2922 } 3253 }
2923 3254
2924 3255
2925 THREADED_TEST(SharedArrayBuffer_JSInternalToExternal) { 3256 THREADED_TEST(SharedArrayBuffer_JSInternalToExternal) {
2926 i::FLAG_harmony_sharedarraybuffer = true; 3257 i::FLAG_harmony_sharedarraybuffer = true;
2927 LocalContext env; 3258 LocalContext env;
2928 v8::Isolate* isolate = env->GetIsolate(); 3259 v8::Isolate* isolate = env->GetIsolate();
2929 v8::HandleScope handle_scope(isolate); 3260 v8::HandleScope handle_scope(isolate);
2930 3261
2931 3262
2932 v8::Local<v8::Value> result = CompileRun( 3263 v8::Local<v8::Value> result = CompileRun(
2933 "var ab1 = new SharedArrayBuffer(2);" 3264 "var ab1 = new SharedArrayBuffer(2);"
2934 "var u8_a = new Uint8Array(ab1);" 3265 "var u8_a = new Uint8Array(ab1);"
2935 "u8_a[0] = 0xAA;" 3266 "u8_a[0] = 0xAA;"
2936 "u8_a[1] = 0xFF; u8_a.buffer"); 3267 "u8_a[1] = 0xFF; u8_a.buffer");
2937 Local<v8::SharedArrayBuffer> ab1 = Local<v8::SharedArrayBuffer>::Cast(result); 3268 Local<v8::SharedArrayBuffer> ab1 = Local<v8::SharedArrayBuffer>::Cast(result);
2938 CheckInternalFieldsAreZero(ab1); 3269 CheckInternalFieldsAreZero(ab1);
2939 CHECK_EQ(2, static_cast<int>(ab1->ByteLength())); 3270 CHECK_EQ(2, static_cast<int>(ab1->ByteLength()));
2940 CHECK(!ab1->IsExternal()); 3271 CHECK(!ab1->IsExternal());
2941 ScopedSharedArrayBufferContents ab1_contents(ab1->Externalize()); 3272 ScopedSharedArrayBufferContents ab1_contents(ab1->Externalize());
2942 CHECK(ab1->IsExternal()); 3273 CHECK(ab1->IsExternal());
2943 3274
2944 result = CompileRun("ab1.byteLength"); 3275 result = CompileRun("ab1.byteLength");
2945 CHECK_EQ(2, result->Int32Value()); 3276 CHECK_EQ(2, result->Int32Value(env.local()).FromJust());
2946 result = CompileRun("u8_a[0]"); 3277 result = CompileRun("u8_a[0]");
2947 CHECK_EQ(0xAA, result->Int32Value()); 3278 CHECK_EQ(0xAA, result->Int32Value(env.local()).FromJust());
2948 result = CompileRun("u8_a[1]"); 3279 result = CompileRun("u8_a[1]");
2949 CHECK_EQ(0xFF, result->Int32Value()); 3280 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust());
2950 result = CompileRun( 3281 result = CompileRun(
2951 "var u8_b = new Uint8Array(ab1);" 3282 "var u8_b = new Uint8Array(ab1);"
2952 "u8_b[0] = 0xBB;" 3283 "u8_b[0] = 0xBB;"
2953 "u8_a[0]"); 3284 "u8_a[0]");
2954 CHECK_EQ(0xBB, result->Int32Value()); 3285 CHECK_EQ(0xBB, result->Int32Value(env.local()).FromJust());
2955 result = CompileRun("u8_b[1]"); 3286 result = CompileRun("u8_b[1]");
2956 CHECK_EQ(0xFF, result->Int32Value()); 3287 CHECK_EQ(0xFF, result->Int32Value(env.local()).FromJust());
2957 3288
2958 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength())); 3289 CHECK_EQ(2, static_cast<int>(ab1_contents.ByteLength()));
2959 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data()); 3290 uint8_t* ab1_data = static_cast<uint8_t*>(ab1_contents.Data());
2960 CHECK_EQ(0xBB, ab1_data[0]); 3291 CHECK_EQ(0xBB, ab1_data[0]);
2961 CHECK_EQ(0xFF, ab1_data[1]); 3292 CHECK_EQ(0xFF, ab1_data[1]);
2962 ab1_data[0] = 0xCC; 3293 ab1_data[0] = 0xCC;
2963 ab1_data[1] = 0x11; 3294 ab1_data[1] = 0x11;
2964 result = CompileRun("u8_a[0] + u8_a[1]"); 3295 result = CompileRun("u8_a[0] + u8_a[1]");
2965 CHECK_EQ(0xDD, result->Int32Value()); 3296 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
2966 } 3297 }
2967 3298
2968 3299
2969 THREADED_TEST(SharedArrayBuffer_External) { 3300 THREADED_TEST(SharedArrayBuffer_External) {
2970 i::FLAG_harmony_sharedarraybuffer = true; 3301 i::FLAG_harmony_sharedarraybuffer = true;
2971 LocalContext env; 3302 LocalContext env;
2972 v8::Isolate* isolate = env->GetIsolate(); 3303 v8::Isolate* isolate = env->GetIsolate();
2973 v8::HandleScope handle_scope(isolate); 3304 v8::HandleScope handle_scope(isolate);
2974 3305
2975 i::ScopedVector<uint8_t> my_data(100); 3306 i::ScopedVector<uint8_t> my_data(100);
2976 memset(my_data.start(), 0, 100); 3307 memset(my_data.start(), 0, 100);
2977 Local<v8::SharedArrayBuffer> ab3 = 3308 Local<v8::SharedArrayBuffer> ab3 =
2978 v8::SharedArrayBuffer::New(isolate, my_data.start(), 100); 3309 v8::SharedArrayBuffer::New(isolate, my_data.start(), 100);
2979 CheckInternalFieldsAreZero(ab3); 3310 CheckInternalFieldsAreZero(ab3);
2980 CHECK_EQ(100, static_cast<int>(ab3->ByteLength())); 3311 CHECK_EQ(100, static_cast<int>(ab3->ByteLength()));
2981 CHECK(ab3->IsExternal()); 3312 CHECK(ab3->IsExternal());
2982 3313
2983 env->Global()->Set(v8_str("ab3"), ab3); 3314 CHECK(env->Global()->Set(env.local(), v8_str("ab3"), ab3).FromJust());
2984 3315
2985 v8::Handle<v8::Value> result = CompileRun("ab3.byteLength"); 3316 v8::Local<v8::Value> result = CompileRun("ab3.byteLength");
2986 CHECK_EQ(100, result->Int32Value()); 3317 CHECK_EQ(100, result->Int32Value(env.local()).FromJust());
2987 3318
2988 result = CompileRun( 3319 result = CompileRun(
2989 "var u8_b = new Uint8Array(ab3);" 3320 "var u8_b = new Uint8Array(ab3);"
2990 "u8_b[0] = 0xBB;" 3321 "u8_b[0] = 0xBB;"
2991 "u8_b[1] = 0xCC;" 3322 "u8_b[1] = 0xCC;"
2992 "u8_b.length"); 3323 "u8_b.length");
2993 CHECK_EQ(100, result->Int32Value()); 3324 CHECK_EQ(100, result->Int32Value(env.local()).FromJust());
2994 CHECK_EQ(0xBB, my_data[0]); 3325 CHECK_EQ(0xBB, my_data[0]);
2995 CHECK_EQ(0xCC, my_data[1]); 3326 CHECK_EQ(0xCC, my_data[1]);
2996 my_data[0] = 0xCC; 3327 my_data[0] = 0xCC;
2997 my_data[1] = 0x11; 3328 my_data[1] = 0x11;
2998 result = CompileRun("u8_b[0] + u8_b[1]"); 3329 result = CompileRun("u8_b[0] + u8_b[1]");
2999 CHECK_EQ(0xDD, result->Int32Value()); 3330 CHECK_EQ(0xDD, result->Int32Value(env.local()).FromJust());
3000 } 3331 }
3001 3332
3002 3333
3003 THREADED_TEST(HiddenProperties) { 3334 THREADED_TEST(HiddenProperties) {
3004 LocalContext env; 3335 LocalContext env;
3005 v8::Isolate* isolate = env->GetIsolate(); 3336 v8::Isolate* isolate = env->GetIsolate();
3006 v8::HandleScope scope(isolate); 3337 v8::HandleScope scope(isolate);
3007 3338
3008 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate()); 3339 v8::Local<v8::Object> obj = v8::Object::New(env->GetIsolate());
3009 v8::Local<v8::Private> key = 3340 v8::Local<v8::Private> key =
3010 v8::Private::ForApi(isolate, v8_str("api-test::hidden-key")); 3341 v8::Private::ForApi(isolate, v8_str("api-test::hidden-key"));
3011 v8::Local<v8::String> empty = v8_str(""); 3342 v8::Local<v8::String> empty = v8_str("");
3012 v8::Local<v8::String> prop_name = v8_str("prop_name"); 3343 v8::Local<v8::String> prop_name = v8_str("prop_name");
3013 3344
3014 CcTest::heap()->CollectAllGarbage(); 3345 CcTest::heap()->CollectAllGarbage();
3015 3346
3016 // Make sure delete of a non-existent hidden value works 3347 // Make sure delete of a non-existent hidden value works
3017 obj->DeletePrivate(env.local(), key).FromJust(); 3348 obj->DeletePrivate(env.local(), key).FromJust();
3018 3349
3019 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 1503)) 3350 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 1503))
3020 .FromJust()); 3351 .FromJust());
3021 CHECK_EQ(1503, 3352 CHECK_EQ(1503, obj->GetPrivate(env.local(), key)
3022 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3353 .ToLocalChecked()
3354 ->Int32Value(env.local())
3355 .FromJust());
3023 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) 3356 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002))
3024 .FromJust()); 3357 .FromJust());
3025 CHECK_EQ(2002, 3358 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3026 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3359 .ToLocalChecked()
3360 ->Int32Value(env.local())
3361 .FromJust());
3027 3362
3028 CcTest::heap()->CollectAllGarbage(); 3363 CcTest::heap()->CollectAllGarbage();
3029 3364
3030 // Make sure we do not find the hidden property. 3365 // Make sure we do not find the hidden property.
3031 CHECK(!obj->Has(empty)); 3366 CHECK(!obj->Has(env.local(), empty).FromJust());
3032 CHECK_EQ(2002, 3367 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3033 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3368 .ToLocalChecked()
3034 CHECK(obj->Get(empty)->IsUndefined()); 3369 ->Int32Value(env.local())
3035 CHECK_EQ(2002, 3370 .FromJust());
3036 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3371 CHECK(obj->Get(env.local(), empty).ToLocalChecked()->IsUndefined());
3037 CHECK(obj->Set(empty, v8::Integer::New(isolate, 2003))); 3372 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3038 CHECK_EQ(2002, 3373 .ToLocalChecked()
3039 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3374 ->Int32Value(env.local())
3040 CHECK_EQ(2003, obj->Get(empty)->Int32Value()); 3375 .FromJust());
3376 CHECK(
3377 obj->Set(env.local(), empty, v8::Integer::New(isolate, 2003)).FromJust());
3378 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3379 .ToLocalChecked()
3380 ->Int32Value(env.local())
3381 .FromJust());
3382 CHECK_EQ(2003, obj->Get(env.local(), empty)
3383 .ToLocalChecked()
3384 ->Int32Value(env.local())
3385 .FromJust());
3041 3386
3042 CcTest::heap()->CollectAllGarbage(); 3387 CcTest::heap()->CollectAllGarbage();
3043 3388
3044 // Add another property and delete it afterwards to force the object in 3389 // Add another property and delete it afterwards to force the object in
3045 // slow case. 3390 // slow case.
3046 CHECK(obj->Set(prop_name, v8::Integer::New(isolate, 2008))); 3391 CHECK(obj->Set(env.local(), prop_name, v8::Integer::New(isolate, 2008))
3047 CHECK_EQ(2002, 3392 .FromJust());
3048 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3393 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3049 CHECK_EQ(2008, obj->Get(prop_name)->Int32Value()); 3394 .ToLocalChecked()
3050 CHECK_EQ(2002, 3395 ->Int32Value(env.local())
3051 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3396 .FromJust());
3052 CHECK(obj->Delete(prop_name)); 3397 CHECK_EQ(2008, obj->Get(env.local(), prop_name)
3053 CHECK_EQ(2002, 3398 .ToLocalChecked()
3054 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3399 ->Int32Value(env.local())
3400 .FromJust());
3401 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3402 .ToLocalChecked()
3403 ->Int32Value(env.local())
3404 .FromJust());
3405 CHECK(obj->Delete(env.local(), prop_name).FromJust());
3406 CHECK_EQ(2002, obj->GetPrivate(env.local(), key)
3407 .ToLocalChecked()
3408 ->Int32Value(env.local())
3409 .FromJust());
3055 3410
3056 CcTest::heap()->CollectAllGarbage(); 3411 CcTest::heap()->CollectAllGarbage();
3057 3412
3058 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002)) 3413 CHECK(obj->SetPrivate(env.local(), key, v8::Integer::New(isolate, 2002))
3059 .FromJust()); 3414 .FromJust());
3060 CHECK(obj->DeletePrivate(env.local(), key).FromJust()); 3415 CHECK(obj->DeletePrivate(env.local(), key).FromJust());
3061 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); 3416 CHECK(!obj->HasPrivate(env.local(), key).FromJust());
3062 } 3417 }
3063 3418
3064 3419
(...skipping 17 matching lines...) Expand all
3082 " set: function() { set_called = true; }})"); 3437 " set: function() { set_called = true; }})");
3083 3438
3084 CHECK(!obj->HasPrivate(env.local(), key).FromJust()); 3439 CHECK(!obj->HasPrivate(env.local(), key).FromJust());
3085 // Make sure that the getter and setter from Object.prototype is not invoked. 3440 // 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 3441 // If it did we would have full access to the hidden properties in
3087 // the accessor. 3442 // the accessor.
3088 CHECK( 3443 CHECK(
3089 obj->SetPrivate(env.local(), key, v8::Integer::New(env->GetIsolate(), 42)) 3444 obj->SetPrivate(env.local(), key, v8::Integer::New(env->GetIsolate(), 42))
3090 .FromJust()); 3445 .FromJust());
3091 ExpectFalse("set_called"); 3446 ExpectFalse("set_called");
3092 CHECK_EQ(42, 3447 CHECK_EQ(42, obj->GetPrivate(env.local(), key)
3093 obj->GetPrivate(env.local(), key).ToLocalChecked()->Int32Value()); 3448 .ToLocalChecked()
3449 ->Int32Value(env.local())
3450 .FromJust());
3094 } 3451 }
3095 3452
3096 3453
3097 THREADED_TEST(External) { 3454 THREADED_TEST(External) {
3098 v8::HandleScope scope(CcTest::isolate()); 3455 v8::HandleScope scope(CcTest::isolate());
3099 int x = 3; 3456 int x = 3;
3100 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x); 3457 Local<v8::External> ext = v8::External::New(CcTest::isolate(), &x);
3101 LocalContext env; 3458 LocalContext env;
3102 env->Global()->Set(v8_str("ext"), ext); 3459 CHECK(env->Global()->Set(env.local(), v8_str("ext"), ext).FromJust());
3103 Local<Value> reext_obj = CompileRun("this.ext"); 3460 Local<Value> reext_obj = CompileRun("this.ext");
3104 v8::Handle<v8::External> reext = reext_obj.As<v8::External>(); 3461 v8::Local<v8::External> reext = reext_obj.As<v8::External>();
3105 int* ptr = static_cast<int*>(reext->Value()); 3462 int* ptr = static_cast<int*>(reext->Value());
3106 CHECK_EQ(x, 3); 3463 CHECK_EQ(x, 3);
3107 *ptr = 10; 3464 *ptr = 10;
3108 CHECK_EQ(x, 10); 3465 CHECK_EQ(x, 10);
3109 3466
3110 // Make sure unaligned pointers are wrapped properly. 3467 // Make sure unaligned pointers are wrapped properly.
3111 char* data = i::StrDup("0123456789"); 3468 char* data = i::StrDup("0123456789");
3112 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]); 3469 Local<v8::Value> zero = v8::External::New(CcTest::isolate(), &data[0]);
3113 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]); 3470 Local<v8::Value> one = v8::External::New(CcTest::isolate(), &data[1]);
3114 Local<v8::Value> two = v8::External::New(CcTest::isolate(), &data[2]); 3471 Local<v8::Value> two = v8::External::New(CcTest::isolate(), &data[2]);
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
3390 3747
3391 namespace { 3748 namespace {
3392 3749
3393 void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); } 3750 void* IntKeyToVoidPointer(int key) { return reinterpret_cast<void*>(key << 1); }
3394 3751
3395 3752
3396 Local<v8::Object> NewObjectForIntKey( 3753 Local<v8::Object> NewObjectForIntKey(
3397 v8::Isolate* isolate, const v8::Global<v8::ObjectTemplate>& templ, 3754 v8::Isolate* isolate, const v8::Global<v8::ObjectTemplate>& templ,
3398 int key) { 3755 int key) {
3399 auto local = Local<v8::ObjectTemplate>::New(isolate, templ); 3756 auto local = Local<v8::ObjectTemplate>::New(isolate, templ);
3400 auto obj = local->NewInstance(); 3757 auto obj = local->NewInstance(isolate->GetCurrentContext()).ToLocalChecked();
3401 obj->SetAlignedPointerInInternalField(0, IntKeyToVoidPointer(key)); 3758 obj->SetAlignedPointerInInternalField(0, IntKeyToVoidPointer(key));
3402 return obj; 3759 return obj;
3403 } 3760 }
3404 3761
3405 3762
3406 template <typename K, typename V> 3763 template <typename K, typename V>
3407 class PhantomStdMapTraits : public v8::StdMapTraits<K, V> { 3764 class PhantomStdMapTraits : public v8::StdMapTraits<K, V> {
3408 public: 3765 public:
3409 typedef typename v8::GlobalValueMap<K, V, PhantomStdMapTraits<K, V>> MapType; 3766 typedef typename v8::GlobalValueMap<K, V, PhantomStdMapTraits<K, V>> MapType;
3410 static const v8::PersistentContainerCallbackType kCallbackType = 3767 static const v8::PersistentContainerCallbackType kCallbackType =
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
3461 int initial_handle_count = global_handles->global_handles_count(); 3818 int initial_handle_count = global_handles->global_handles_count();
3462 CHECK_EQ(0, static_cast<int>(map.Size())); 3819 CHECK_EQ(0, static_cast<int>(map.Size()));
3463 { 3820 {
3464 HandleScope scope(isolate); 3821 HandleScope scope(isolate);
3465 Local<v8::Object> obj = map.Get(7); 3822 Local<v8::Object> obj = map.Get(7);
3466 CHECK(obj.IsEmpty()); 3823 CHECK(obj.IsEmpty());
3467 Local<v8::Object> expected = v8::Object::New(isolate); 3824 Local<v8::Object> expected = v8::Object::New(isolate);
3468 map.Set(7, expected); 3825 map.Set(7, expected);
3469 CHECK_EQ(1, static_cast<int>(map.Size())); 3826 CHECK_EQ(1, static_cast<int>(map.Size()));
3470 obj = map.Get(7); 3827 obj = map.Get(7);
3471 CHECK(expected->Equals(obj)); 3828 CHECK(expected->Equals(env.local(), obj).FromJust());
3472 { 3829 {
3473 typename Map::PersistentValueReference ref = map.GetReference(7); 3830 typename Map::PersistentValueReference ref = map.GetReference(7);
3474 CHECK(expected->Equals(ref.NewLocal(isolate))); 3831 CHECK(expected->Equals(ref.NewLocal(isolate)));
3475 } 3832 }
3476 v8::Global<v8::Object> removed = map.Remove(7); 3833 v8::Global<v8::Object> removed = map.Remove(7);
3477 CHECK_EQ(0, static_cast<int>(map.Size())); 3834 CHECK_EQ(0, static_cast<int>(map.Size()));
3478 CHECK(expected == removed); 3835 CHECK(expected == removed);
3479 removed = map.Remove(7); 3836 removed = map.Remove(7);
3480 CHECK(removed.IsEmpty()); 3837 CHECK(removed.IsEmpty());
3481 map.Set(8, expected); 3838 map.Set(8, expected);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
3546 3903
3547 vector.Append(obj1); 3904 vector.Append(obj1);
3548 vector.Append(obj2); 3905 vector.Append(obj2);
3549 vector.Append(obj1); 3906 vector.Append(obj1);
3550 vector.Append(obj3.Pass()); 3907 vector.Append(obj3.Pass());
3551 vector.Append(obj1); 3908 vector.Append(obj1);
3552 3909
3553 CHECK(!vector.IsEmpty()); 3910 CHECK(!vector.IsEmpty());
3554 CHECK_EQ(5, static_cast<int>(vector.Size())); 3911 CHECK_EQ(5, static_cast<int>(vector.Size()));
3555 CHECK(obj3.IsEmpty()); 3912 CHECK(obj3.IsEmpty());
3556 CHECK(obj1->Equals(vector.Get(0))); 3913 CHECK(obj1->Equals(env.local(), vector.Get(0)).FromJust());
3557 CHECK(obj1->Equals(vector.Get(2))); 3914 CHECK(obj1->Equals(env.local(), vector.Get(2)).FromJust());
3558 CHECK(obj1->Equals(vector.Get(4))); 3915 CHECK(obj1->Equals(env.local(), vector.Get(4)).FromJust());
3559 CHECK(obj2->Equals(vector.Get(1))); 3916 CHECK(obj2->Equals(env.local(), vector.Get(1)).FromJust());
3560 3917
3561 CHECK_EQ(5 + handle_count, global_handles->global_handles_count()); 3918 CHECK_EQ(5 + handle_count, global_handles->global_handles_count());
3562 3919
3563 vector.Clear(); 3920 vector.Clear();
3564 CHECK(vector.IsEmpty()); 3921 CHECK(vector.IsEmpty());
3565 CHECK_EQ(0, static_cast<int>(vector.Size())); 3922 CHECK_EQ(0, static_cast<int>(vector.Size()));
3566 CHECK_EQ(handle_count, global_handles->global_handles_count()); 3923 CHECK_EQ(handle_count, global_handles->global_handles_count());
3567 } 3924 }
3568 3925
3569 3926
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
3700 v8::WeakCallbackType::kParameter); 4057 v8::WeakCallbackType::kParameter);
3701 } 4058 }
3702 4059
3703 WeakCallCounterAndPersistent<Value> root(&counter); 4060 WeakCallCounterAndPersistent<Value> root(&counter);
3704 root.handle.Reset(iso, g1s1.handle); // make a root. 4061 root.handle.Reset(iso, g1s1.handle); // make a root.
3705 4062
3706 // Connect group 1 and 2, make a cycle. 4063 // Connect group 1 and 2, make a cycle.
3707 { 4064 {
3708 HandleScope scope(iso); 4065 HandleScope scope(iso);
3709 CHECK(Local<Object>::New(iso, g1s2.handle.As<Object>()) 4066 CHECK(Local<Object>::New(iso, g1s2.handle.As<Object>())
3710 ->Set(0, Local<Value>::New(iso, g2s2.handle))); 4067 ->Set(env.local(), 0, Local<Value>::New(iso, g2s2.handle))
4068 .FromJust());
3711 CHECK(Local<Object>::New(iso, g2s1.handle.As<Object>()) 4069 CHECK(Local<Object>::New(iso, g2s1.handle.As<Object>())
3712 ->Set(0, Local<Value>::New(iso, g1s1.handle))); 4070 ->Set(env.local(), 0, Local<Value>::New(iso, g1s1.handle))
4071 .FromJust());
3713 } 4072 }
3714 4073
3715 { 4074 {
3716 UniqueId id1 = MakeUniqueId(g1s1.handle); 4075 UniqueId id1 = MakeUniqueId(g1s1.handle);
3717 UniqueId id2 = MakeUniqueId(g2s2.handle); 4076 UniqueId id2 = MakeUniqueId(g2s2.handle);
3718 iso->SetObjectGroupId(g1s1.handle, id1); 4077 iso->SetObjectGroupId(g1s1.handle, id1);
3719 iso->SetObjectGroupId(g1s2.handle, id1); 4078 iso->SetObjectGroupId(g1s2.handle, id1);
3720 iso->SetReferenceFromGroup(id1, g1c1.handle); 4079 iso->SetReferenceFromGroup(id1, g1c1.handle);
3721 iso->SetObjectGroupId(g2s1.handle, id2); 4080 iso->SetObjectGroupId(g2s1.handle, id2);
3722 iso->SetObjectGroupId(g2s2.handle, id2); 4081 iso->SetObjectGroupId(g2s2.handle, id2);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3776 WeakCallCounterAndPersistent<Object> g1s1(&counter); 4135 WeakCallCounterAndPersistent<Object> g1s1(&counter);
3777 WeakCallCounterAndPersistent<String> g1s2(&counter); 4136 WeakCallCounterAndPersistent<String> g1s2(&counter);
3778 WeakCallCounterAndPersistent<String> g1c1(&counter); 4137 WeakCallCounterAndPersistent<String> g1c1(&counter);
3779 WeakCallCounterAndPersistent<Object> g2s1(&counter); 4138 WeakCallCounterAndPersistent<Object> g2s1(&counter);
3780 WeakCallCounterAndPersistent<String> g2s2(&counter); 4139 WeakCallCounterAndPersistent<String> g2s2(&counter);
3781 WeakCallCounterAndPersistent<String> g2c1(&counter); 4140 WeakCallCounterAndPersistent<String> g2c1(&counter);
3782 4141
3783 { 4142 {
3784 HandleScope scope(iso); 4143 HandleScope scope(iso);
3785 g1s1.handle.Reset(iso, Object::New(iso)); 4144 g1s1.handle.Reset(iso, Object::New(iso));
3786 g1s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo1")); 4145 g1s2.handle.Reset(iso, v8_str("foo1"));
3787 g1c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo2")); 4146 g1c1.handle.Reset(iso, v8_str("foo2"));
3788 g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback, 4147 g1s1.handle.SetWeak(&g1s1, &WeakPointerCallback,
3789 v8::WeakCallbackType::kParameter); 4148 v8::WeakCallbackType::kParameter);
3790 g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback, 4149 g1s2.handle.SetWeak(&g1s2, &WeakPointerCallback,
3791 v8::WeakCallbackType::kParameter); 4150 v8::WeakCallbackType::kParameter);
3792 g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback, 4151 g1c1.handle.SetWeak(&g1c1, &WeakPointerCallback,
3793 v8::WeakCallbackType::kParameter); 4152 v8::WeakCallbackType::kParameter);
3794 4153
3795 g2s1.handle.Reset(iso, Object::New(iso)); 4154 g2s1.handle.Reset(iso, Object::New(iso));
3796 g2s2.handle.Reset(iso, String::NewFromUtf8(iso, "foo3")); 4155 g2s2.handle.Reset(iso, v8_str("foo3"));
3797 g2c1.handle.Reset(iso, String::NewFromUtf8(iso, "foo4")); 4156 g2c1.handle.Reset(iso, v8_str("foo4"));
3798 g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback, 4157 g2s1.handle.SetWeak(&g2s1, &WeakPointerCallback,
3799 v8::WeakCallbackType::kParameter); 4158 v8::WeakCallbackType::kParameter);
3800 g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback, 4159 g2s2.handle.SetWeak(&g2s2, &WeakPointerCallback,
3801 v8::WeakCallbackType::kParameter); 4160 v8::WeakCallbackType::kParameter);
3802 g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback, 4161 g2c1.handle.SetWeak(&g2c1, &WeakPointerCallback,
3803 v8::WeakCallbackType::kParameter); 4162 v8::WeakCallbackType::kParameter);
3804 } 4163 }
3805 4164
3806 WeakCallCounterAndPersistent<Value> root(&counter); 4165 WeakCallCounterAndPersistent<Value> root(&counter);
3807 root.handle.Reset(iso, g1s1.handle); // make a root. 4166 root.handle.Reset(iso, g1s1.handle); // make a root.
3808 4167
3809 // Connect group 1 and 2, make a cycle. 4168 // Connect group 1 and 2, make a cycle.
3810 { 4169 {
3811 HandleScope scope(iso); 4170 HandleScope scope(iso);
3812 CHECK(Local<Object>::New(iso, g1s1.handle) 4171 CHECK(Local<Object>::New(iso, g1s1.handle)
3813 ->Set(0, Local<Object>::New(iso, g2s1.handle))); 4172 ->Set(env.local(), 0, Local<Object>::New(iso, g2s1.handle))
4173 .FromJust());
3814 CHECK(Local<Object>::New(iso, g2s1.handle) 4174 CHECK(Local<Object>::New(iso, g2s1.handle)
3815 ->Set(0, Local<Object>::New(iso, g1s1.handle))); 4175 ->Set(env.local(), 0, Local<Object>::New(iso, g1s1.handle))
4176 .FromJust());
3816 } 4177 }
3817 4178
3818 { 4179 {
3819 UniqueId id1 = MakeUniqueId(g1s1.handle); 4180 UniqueId id1 = MakeUniqueId(g1s1.handle);
3820 UniqueId id2 = MakeUniqueId(g2s2.handle); 4181 UniqueId id2 = MakeUniqueId(g2s2.handle);
3821 iso->SetObjectGroupId(g1s1.handle, id1); 4182 iso->SetObjectGroupId(g1s1.handle, id1);
3822 iso->SetObjectGroupId(g1s2.handle, id1); 4183 iso->SetObjectGroupId(g1s2.handle, id1);
3823 iso->SetReference(g1s1.handle, g1c1.handle); 4184 iso->SetReference(g1s1.handle, g1c1.handle);
3824 iso->SetObjectGroupId(g2s1.handle, id2); 4185 iso->SetObjectGroupId(g2s1.handle, id2);
3825 iso->SetObjectGroupId(g2s2.handle, id2); 4186 iso->SetObjectGroupId(g2s2.handle, id2);
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
4041 HandleScope handle_scope(iso); 4402 HandleScope handle_scope(iso);
4042 g1s1.handle.MarkPartiallyDependent(); 4403 g1s1.handle.MarkPartiallyDependent();
4043 g1s2.handle.MarkPartiallyDependent(); 4404 g1s2.handle.MarkPartiallyDependent();
4044 g2s1.handle.MarkPartiallyDependent(); 4405 g2s1.handle.MarkPartiallyDependent();
4045 g2s2.handle.MarkPartiallyDependent(); 4406 g2s2.handle.MarkPartiallyDependent();
4046 g3s1.handle.MarkPartiallyDependent(); 4407 g3s1.handle.MarkPartiallyDependent();
4047 g3s2.handle.MarkPartiallyDependent(); 4408 g3s2.handle.MarkPartiallyDependent();
4048 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); 4409 iso->SetObjectGroupId(g1s1.handle, UniqueId(1));
4049 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); 4410 iso->SetObjectGroupId(g1s2.handle, UniqueId(1));
4050 Local<Object>::New(iso, g1s1.handle.As<Object>()) 4411 Local<Object>::New(iso, g1s1.handle.As<Object>())
4051 ->Set(v8_str("x"), Local<Value>::New(iso, g2s1.handle)); 4412 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g2s1.handle))
4413 .FromJust();
4052 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); 4414 iso->SetObjectGroupId(g2s1.handle, UniqueId(2));
4053 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); 4415 iso->SetObjectGroupId(g2s2.handle, UniqueId(2));
4054 Local<Object>::New(iso, g2s1.handle.As<Object>()) 4416 Local<Object>::New(iso, g2s1.handle.As<Object>())
4055 ->Set(v8_str("x"), Local<Value>::New(iso, g3s1.handle)); 4417 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g3s1.handle))
4418 .FromJust();
4056 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); 4419 iso->SetObjectGroupId(g3s1.handle, UniqueId(3));
4057 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); 4420 iso->SetObjectGroupId(g3s2.handle, UniqueId(3));
4058 Local<Object>::New(iso, g3s1.handle.As<Object>()) 4421 Local<Object>::New(iso, g3s1.handle.As<Object>())
4059 ->Set(v8_str("x"), Local<Value>::New(iso, g1s1.handle)); 4422 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g1s1.handle))
4423 .FromJust();
4060 } 4424 }
4061 4425
4062 v8::internal::Heap* heap = 4426 v8::internal::Heap* heap =
4063 reinterpret_cast<v8::internal::Isolate*>(iso)->heap(); 4427 reinterpret_cast<v8::internal::Isolate*>(iso)->heap();
4064 heap->CollectAllGarbage(); 4428 heap->CollectAllGarbage();
4065 4429
4066 // All objects should be alive. 4430 // All objects should be alive.
4067 CHECK_EQ(0, counter.NumberOfWeakCalls()); 4431 CHECK_EQ(0, counter.NumberOfWeakCalls());
4068 4432
4069 // Weaken the root. 4433 // Weaken the root.
4070 root.handle.SetWeak(&root, &WeakPointerCallback, 4434 root.handle.SetWeak(&root, &WeakPointerCallback,
4071 v8::WeakCallbackType::kParameter); 4435 v8::WeakCallbackType::kParameter);
4072 root.handle.MarkPartiallyDependent(); 4436 root.handle.MarkPartiallyDependent();
4073 4437
4074 // Groups are deleted, rebuild groups. 4438 // Groups are deleted, rebuild groups.
4075 { 4439 {
4076 HandleScope handle_scope(iso); 4440 HandleScope handle_scope(iso);
4077 g1s1.handle.MarkPartiallyDependent(); 4441 g1s1.handle.MarkPartiallyDependent();
4078 g1s2.handle.MarkPartiallyDependent(); 4442 g1s2.handle.MarkPartiallyDependent();
4079 g2s1.handle.MarkPartiallyDependent(); 4443 g2s1.handle.MarkPartiallyDependent();
4080 g2s2.handle.MarkPartiallyDependent(); 4444 g2s2.handle.MarkPartiallyDependent();
4081 g3s1.handle.MarkPartiallyDependent(); 4445 g3s1.handle.MarkPartiallyDependent();
4082 g3s2.handle.MarkPartiallyDependent(); 4446 g3s2.handle.MarkPartiallyDependent();
4083 iso->SetObjectGroupId(g1s1.handle, UniqueId(1)); 4447 iso->SetObjectGroupId(g1s1.handle, UniqueId(1));
4084 iso->SetObjectGroupId(g1s2.handle, UniqueId(1)); 4448 iso->SetObjectGroupId(g1s2.handle, UniqueId(1));
4085 Local<Object>::New(iso, g1s1.handle.As<Object>()) 4449 Local<Object>::New(iso, g1s1.handle.As<Object>())
4086 ->Set(v8_str("x"), Local<Value>::New(iso, g2s1.handle)); 4450 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g2s1.handle))
4451 .FromJust();
4087 iso->SetObjectGroupId(g2s1.handle, UniqueId(2)); 4452 iso->SetObjectGroupId(g2s1.handle, UniqueId(2));
4088 iso->SetObjectGroupId(g2s2.handle, UniqueId(2)); 4453 iso->SetObjectGroupId(g2s2.handle, UniqueId(2));
4089 Local<Object>::New(iso, g2s1.handle.As<Object>()) 4454 Local<Object>::New(iso, g2s1.handle.As<Object>())
4090 ->Set(v8_str("x"), Local<Value>::New(iso, g3s1.handle)); 4455 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g3s1.handle))
4456 .FromJust();
4091 iso->SetObjectGroupId(g3s1.handle, UniqueId(3)); 4457 iso->SetObjectGroupId(g3s1.handle, UniqueId(3));
4092 iso->SetObjectGroupId(g3s2.handle, UniqueId(3)); 4458 iso->SetObjectGroupId(g3s2.handle, UniqueId(3));
4093 Local<Object>::New(iso, g3s1.handle.As<Object>()) 4459 Local<Object>::New(iso, g3s1.handle.As<Object>())
4094 ->Set(v8_str("x"), Local<Value>::New(iso, g1s1.handle)); 4460 ->Set(env.local(), v8_str("x"), Local<Value>::New(iso, g1s1.handle))
4461 .FromJust();
4095 } 4462 }
4096 4463
4097 heap->CollectAllGarbage(); 4464 heap->CollectAllGarbage();
4098 4465
4099 // All objects should be gone. 7 global handles in total. 4466 // All objects should be gone. 7 global handles in total.
4100 CHECK_EQ(7, counter.NumberOfWeakCalls()); 4467 CHECK_EQ(7, counter.NumberOfWeakCalls());
4101 } 4468 }
4102 4469
4103 4470
4104 THREADED_TEST(ScriptException) { 4471 THREADED_TEST(ScriptException) {
4105 LocalContext env; 4472 LocalContext env;
4106 v8::HandleScope scope(env->GetIsolate()); 4473 v8::HandleScope scope(env->GetIsolate());
4107 Local<Script> script = v8_compile("throw 'panama!';"); 4474 Local<Script> script = v8_compile("throw 'panama!';");
4108 v8::TryCatch try_catch(env->GetIsolate()); 4475 v8::TryCatch try_catch(env->GetIsolate());
4109 Local<Value> result = script->Run(); 4476 v8::MaybeLocal<Value> result = script->Run(env.local());
4110 CHECK(result.IsEmpty()); 4477 CHECK(result.IsEmpty());
4111 CHECK(try_catch.HasCaught()); 4478 CHECK(try_catch.HasCaught());
4112 String::Utf8Value exception_value(try_catch.Exception()); 4479 String::Utf8Value exception_value(try_catch.Exception());
4113 CHECK_EQ(0, strcmp(*exception_value, "panama!")); 4480 CHECK_EQ(0, strcmp(*exception_value, "panama!"));
4114 } 4481 }
4115 4482
4116 4483
4117 TEST(TryCatchCustomException) { 4484 TEST(TryCatchCustomException) {
4118 LocalContext env; 4485 LocalContext env;
4119 v8::Isolate* isolate = env->GetIsolate(); 4486 v8::Isolate* isolate = env->GetIsolate();
4120 v8::HandleScope scope(isolate); 4487 v8::HandleScope scope(isolate);
4121 v8::TryCatch try_catch(isolate); 4488 v8::TryCatch try_catch(isolate);
4122 CompileRun( 4489 CompileRun(
4123 "function CustomError() { this.a = 'b'; }" 4490 "function CustomError() { this.a = 'b'; }"
4124 "(function f() { throw new CustomError(); })();"); 4491 "(function f() { throw new CustomError(); })();");
4125 CHECK(try_catch.HasCaught()); 4492 CHECK(try_catch.HasCaught());
4126 CHECK(try_catch.Exception() 4493 CHECK(try_catch.Exception()
4127 ->ToObject(isolate) 4494 ->ToObject(env.local())
4128 ->Get(v8_str("a")) 4495 .ToLocalChecked()
4129 ->Equals(v8_str("b"))); 4496 ->Get(env.local(), v8_str("a"))
4497 .ToLocalChecked()
4498 ->Equals(env.local(), v8_str("b"))
4499 .FromJust());
4130 } 4500 }
4131 4501
4132 4502
4133 bool message_received; 4503 bool message_received;
4134 4504
4135 4505
4136 static void check_message_0(v8::Handle<v8::Message> message, 4506 static void check_message_0(v8::Local<v8::Message> message,
4137 v8::Handle<Value> data) { 4507 v8::Local<Value> data) {
4138 CHECK_EQ(5.76, data->NumberValue()); 4508 CHECK_EQ(5.76, data->NumberValue(CcTest::isolate()->GetCurrentContext())
4139 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); 4509 .FromJust());
4510 CHECK_EQ(6.75, message->GetScriptOrigin()
4511 .ResourceName()
4512 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4513 .FromJust());
4140 CHECK(!message->IsSharedCrossOrigin()); 4514 CHECK(!message->IsSharedCrossOrigin());
4141 message_received = true; 4515 message_received = true;
4142 } 4516 }
4143 4517
4144 4518
4145 THREADED_TEST(MessageHandler0) { 4519 THREADED_TEST(MessageHandler0) {
4146 message_received = false; 4520 message_received = false;
4147 v8::HandleScope scope(CcTest::isolate()); 4521 v8::HandleScope scope(CcTest::isolate());
4148 CHECK(!message_received); 4522 CHECK(!message_received);
4149 LocalContext context; 4523 LocalContext context;
4150 v8::V8::AddMessageListener(check_message_0, v8_num(5.76)); 4524 CcTest::isolate()->AddMessageListener(check_message_0, v8_num(5.76));
4151 v8::Handle<v8::Script> script = CompileWithOrigin("throw 'error'", "6.75"); 4525 v8::Local<v8::Script> script = CompileWithOrigin("throw 'error'", "6.75");
4152 script->Run(); 4526 CHECK(script->Run(context.local()).IsEmpty());
4153 CHECK(message_received); 4527 CHECK(message_received);
4154 // clear out the message listener 4528 // clear out the message listener
4155 v8::V8::RemoveMessageListeners(check_message_0); 4529 CcTest::isolate()->RemoveMessageListeners(check_message_0);
4156 } 4530 }
4157 4531
4158 4532
4159 static void check_message_1(v8::Handle<v8::Message> message, 4533 static void check_message_1(v8::Local<v8::Message> message,
4160 v8::Handle<Value> data) { 4534 v8::Local<Value> data) {
4161 CHECK(data->IsNumber()); 4535 CHECK(data->IsNumber());
4162 CHECK_EQ(1337, data->Int32Value()); 4536 CHECK_EQ(1337,
4537 data->Int32Value(CcTest::isolate()->GetCurrentContext()).FromJust());
4163 CHECK(!message->IsSharedCrossOrigin()); 4538 CHECK(!message->IsSharedCrossOrigin());
4164 message_received = true; 4539 message_received = true;
4165 } 4540 }
4166 4541
4167 4542
4168 TEST(MessageHandler1) { 4543 TEST(MessageHandler1) {
4169 message_received = false; 4544 message_received = false;
4170 v8::HandleScope scope(CcTest::isolate()); 4545 v8::HandleScope scope(CcTest::isolate());
4171 CHECK(!message_received); 4546 CHECK(!message_received);
4172 v8::V8::AddMessageListener(check_message_1); 4547 CcTest::isolate()->AddMessageListener(check_message_1);
4173 LocalContext context; 4548 LocalContext context;
4174 CompileRun("throw 1337;"); 4549 CompileRun("throw 1337;");
4175 CHECK(message_received); 4550 CHECK(message_received);
4176 // clear out the message listener 4551 // clear out the message listener
4177 v8::V8::RemoveMessageListeners(check_message_1); 4552 CcTest::isolate()->RemoveMessageListeners(check_message_1);
4178 } 4553 }
4179 4554
4180 4555
4181 static void check_message_2(v8::Handle<v8::Message> message, 4556 static void check_message_2(v8::Local<v8::Message> message,
4182 v8::Handle<Value> data) { 4557 v8::Local<Value> data) {
4183 LocalContext context; 4558 LocalContext context;
4184 CHECK(data->IsObject()); 4559 CHECK(data->IsObject());
4185 v8::Local<v8::Value> hidden_property = 4560 v8::Local<v8::Value> hidden_property =
4186 v8::Object::Cast(*data) 4561 v8::Object::Cast(*data)
4187 ->GetPrivate( 4562 ->GetPrivate(
4188 context.local(), 4563 context.local(),
4189 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key"))) 4564 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")))
4190 .ToLocalChecked(); 4565 .ToLocalChecked();
4191 CHECK(v8_str("hidden value")->Equals(hidden_property)); 4566 CHECK(v8_str("hidden value")
4567 ->Equals(context.local(), hidden_property)
4568 .FromJust());
4192 CHECK(!message->IsSharedCrossOrigin()); 4569 CHECK(!message->IsSharedCrossOrigin());
4193 message_received = true; 4570 message_received = true;
4194 } 4571 }
4195 4572
4196 4573
4197 TEST(MessageHandler2) { 4574 TEST(MessageHandler2) {
4198 message_received = false; 4575 message_received = false;
4199 v8::HandleScope scope(CcTest::isolate()); 4576 v8::HandleScope scope(CcTest::isolate());
4200 CHECK(!message_received); 4577 CHECK(!message_received);
4201 v8::V8::AddMessageListener(check_message_2); 4578 CcTest::isolate()->AddMessageListener(check_message_2);
4202 LocalContext context; 4579 LocalContext context;
4203 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error")); 4580 v8::Local<v8::Value> error = v8::Exception::Error(v8_str("custom error"));
4204 v8::Object::Cast(*error) 4581 v8::Object::Cast(*error)
4205 ->SetPrivate(context.local(), 4582 ->SetPrivate(context.local(),
4206 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")), 4583 v8::Private::ForApi(CcTest::isolate(), v8_str("hidden key")),
4207 v8_str("hidden value")) 4584 v8_str("hidden value"))
4208 .FromJust(); 4585 .FromJust();
4209 context->Global()->Set(v8_str("error"), error); 4586 CHECK(context->Global()
4587 ->Set(context.local(), v8_str("error"), error)
4588 .FromJust());
4210 CompileRun("throw error;"); 4589 CompileRun("throw error;");
4211 CHECK(message_received); 4590 CHECK(message_received);
4212 // clear out the message listener 4591 // clear out the message listener
4213 v8::V8::RemoveMessageListeners(check_message_2); 4592 CcTest::isolate()->RemoveMessageListeners(check_message_2);
4214 } 4593 }
4215 4594
4216 4595
4217 static void check_message_3(v8::Handle<v8::Message> message, 4596 static void check_message_3(v8::Local<v8::Message> message,
4218 v8::Handle<Value> data) { 4597 v8::Local<Value> data) {
4219 CHECK(message->IsSharedCrossOrigin()); 4598 CHECK(message->IsSharedCrossOrigin());
4220 CHECK(message->GetScriptOrigin().Options().IsSharedCrossOrigin()); 4599 CHECK(message->GetScriptOrigin().Options().IsSharedCrossOrigin());
4221 CHECK(message->GetScriptOrigin().Options().IsEmbedderDebugScript()); 4600 CHECK(message->GetScriptOrigin().Options().IsEmbedderDebugScript());
4222 CHECK(message->GetScriptOrigin().Options().IsOpaque()); 4601 CHECK(message->GetScriptOrigin().Options().IsOpaque());
4223 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); 4602 CHECK_EQ(6.75, message->GetScriptOrigin()
4224 CHECK_EQ(7.40, message->GetScriptOrigin().SourceMapUrl()->NumberValue()); 4603 .ResourceName()
4604 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4605 .FromJust());
4606 CHECK_EQ(7.40, message->GetScriptOrigin()
4607 .SourceMapUrl()
4608 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4609 .FromJust());
4225 message_received = true; 4610 message_received = true;
4226 } 4611 }
4227 4612
4228 4613
4229 TEST(MessageHandler3) { 4614 TEST(MessageHandler3) {
4230 message_received = false; 4615 message_received = false;
4231 v8::Isolate* isolate = CcTest::isolate(); 4616 v8::Isolate* isolate = CcTest::isolate();
4232 v8::HandleScope scope(isolate); 4617 v8::HandleScope scope(isolate);
4233 CHECK(!message_received); 4618 CHECK(!message_received);
4234 v8::V8::AddMessageListener(check_message_3); 4619 isolate->AddMessageListener(check_message_3);
4235 LocalContext context; 4620 LocalContext context;
4236 v8::ScriptOrigin origin = v8::ScriptOrigin( 4621 v8::ScriptOrigin origin = v8::ScriptOrigin(
4237 v8_str("6.75"), v8::Integer::New(isolate, 1), 4622 v8_str("6.75"), v8::Integer::New(isolate, 1),
4238 v8::Integer::New(isolate, 2), v8::True(isolate), Handle<v8::Integer>(), 4623 v8::Integer::New(isolate, 2), v8::True(isolate), Local<v8::Integer>(),
4239 v8::True(isolate), v8_str("7.40"), v8::True(isolate)); 4624 v8::True(isolate), v8_str("7.40"), v8::True(isolate));
4240 v8::Handle<v8::Script> script = 4625 v8::Local<v8::Script> script =
4241 Script::Compile(v8_str("throw 'error'"), &origin); 4626 Script::Compile(context.local(), v8_str("throw 'error'"), &origin)
4242 script->Run(); 4627 .ToLocalChecked();
4628 CHECK(script->Run(context.local()).IsEmpty());
4243 CHECK(message_received); 4629 CHECK(message_received);
4244 // clear out the message listener 4630 // clear out the message listener
4245 v8::V8::RemoveMessageListeners(check_message_3); 4631 isolate->RemoveMessageListeners(check_message_3);
4246 } 4632 }
4247 4633
4248 4634
4249 static void check_message_4(v8::Handle<v8::Message> message, 4635 static void check_message_4(v8::Local<v8::Message> message,
4250 v8::Handle<Value> data) { 4636 v8::Local<Value> data) {
4251 CHECK(!message->IsSharedCrossOrigin()); 4637 CHECK(!message->IsSharedCrossOrigin());
4252 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); 4638 CHECK_EQ(6.75, message->GetScriptOrigin()
4639 .ResourceName()
4640 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4641 .FromJust());
4253 message_received = true; 4642 message_received = true;
4254 } 4643 }
4255 4644
4256 4645
4257 TEST(MessageHandler4) { 4646 TEST(MessageHandler4) {
4258 message_received = false; 4647 message_received = false;
4259 v8::Isolate* isolate = CcTest::isolate(); 4648 v8::Isolate* isolate = CcTest::isolate();
4260 v8::HandleScope scope(isolate); 4649 v8::HandleScope scope(isolate);
4261 CHECK(!message_received); 4650 CHECK(!message_received);
4262 v8::V8::AddMessageListener(check_message_4); 4651 isolate->AddMessageListener(check_message_4);
4263 LocalContext context; 4652 LocalContext context;
4264 v8::ScriptOrigin origin = 4653 v8::ScriptOrigin origin =
4265 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), 4654 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1),
4266 v8::Integer::New(isolate, 2), v8::False(isolate)); 4655 v8::Integer::New(isolate, 2), v8::False(isolate));
4267 v8::Handle<v8::Script> script = 4656 v8::Local<v8::Script> script =
4268 Script::Compile(v8_str("throw 'error'"), &origin); 4657 Script::Compile(context.local(), v8_str("throw 'error'"), &origin)
4269 script->Run(); 4658 .ToLocalChecked();
4659 CHECK(script->Run(context.local()).IsEmpty());
4270 CHECK(message_received); 4660 CHECK(message_received);
4271 // clear out the message listener 4661 // clear out the message listener
4272 v8::V8::RemoveMessageListeners(check_message_4); 4662 isolate->RemoveMessageListeners(check_message_4);
4273 } 4663 }
4274 4664
4275 4665
4276 static void check_message_5a(v8::Handle<v8::Message> message, 4666 static void check_message_5a(v8::Local<v8::Message> message,
4277 v8::Handle<Value> data) { 4667 v8::Local<Value> data) {
4278 CHECK(message->IsSharedCrossOrigin()); 4668 CHECK(message->IsSharedCrossOrigin());
4279 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); 4669 CHECK_EQ(6.75, message->GetScriptOrigin()
4670 .ResourceName()
4671 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4672 .FromJust());
4280 message_received = true; 4673 message_received = true;
4281 } 4674 }
4282 4675
4283 4676
4284 static void check_message_5b(v8::Handle<v8::Message> message, 4677 static void check_message_5b(v8::Local<v8::Message> message,
4285 v8::Handle<Value> data) { 4678 v8::Local<Value> data) {
4286 CHECK(!message->IsSharedCrossOrigin()); 4679 CHECK(!message->IsSharedCrossOrigin());
4287 CHECK_EQ(6.75, message->GetScriptOrigin().ResourceName()->NumberValue()); 4680 CHECK_EQ(6.75, message->GetScriptOrigin()
4681 .ResourceName()
4682 ->NumberValue(CcTest::isolate()->GetCurrentContext())
4683 .FromJust());
4288 message_received = true; 4684 message_received = true;
4289 } 4685 }
4290 4686
4291 4687
4292 TEST(MessageHandler5) { 4688 TEST(MessageHandler5) {
4293 message_received = false; 4689 message_received = false;
4294 v8::Isolate* isolate = CcTest::isolate(); 4690 v8::Isolate* isolate = CcTest::isolate();
4295 v8::HandleScope scope(isolate); 4691 v8::HandleScope scope(isolate);
4296 CHECK(!message_received); 4692 CHECK(!message_received);
4297 v8::V8::AddMessageListener(check_message_5a); 4693 isolate->AddMessageListener(check_message_5a);
4298 LocalContext context; 4694 LocalContext context;
4299 v8::ScriptOrigin origin1 = 4695 v8::ScriptOrigin origin1 =
4300 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), 4696 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1),
4301 v8::Integer::New(isolate, 2), v8::True(isolate)); 4697 v8::Integer::New(isolate, 2), v8::True(isolate));
4302 v8::Handle<v8::Script> script = 4698 v8::Local<v8::Script> script =
4303 Script::Compile(v8_str("throw 'error'"), &origin1); 4699 Script::Compile(context.local(), v8_str("throw 'error'"), &origin1)
4304 script->Run(); 4700 .ToLocalChecked();
4701 CHECK(script->Run(context.local()).IsEmpty());
4305 CHECK(message_received); 4702 CHECK(message_received);
4306 // clear out the message listener 4703 // clear out the message listener
4307 v8::V8::RemoveMessageListeners(check_message_5a); 4704 isolate->RemoveMessageListeners(check_message_5a);
4308 4705
4309 message_received = false; 4706 message_received = false;
4310 v8::V8::AddMessageListener(check_message_5b); 4707 isolate->AddMessageListener(check_message_5b);
4311 v8::ScriptOrigin origin2 = 4708 v8::ScriptOrigin origin2 =
4312 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1), 4709 v8::ScriptOrigin(v8_str("6.75"), v8::Integer::New(isolate, 1),
4313 v8::Integer::New(isolate, 2), v8::False(isolate)); 4710 v8::Integer::New(isolate, 2), v8::False(isolate));
4314 script = Script::Compile(v8_str("throw 'error'"), &origin2); 4711 script = Script::Compile(context.local(), v8_str("throw 'error'"), &origin2)
4315 script->Run(); 4712 .ToLocalChecked();
4713 CHECK(script->Run(context.local()).IsEmpty());
4316 CHECK(message_received); 4714 CHECK(message_received);
4317 // clear out the message listener 4715 // clear out the message listener
4318 v8::V8::RemoveMessageListeners(check_message_5b); 4716 isolate->RemoveMessageListeners(check_message_5b);
4319 } 4717 }
4320 4718
4321 4719
4322 TEST(NativeWeakMap) { 4720 TEST(NativeWeakMap) {
4323 v8::Isolate* isolate = CcTest::isolate(); 4721 v8::Isolate* isolate = CcTest::isolate();
4324 HandleScope scope(isolate); 4722 HandleScope scope(isolate);
4325 Local<v8::NativeWeakMap> weak_map(v8::NativeWeakMap::New(isolate)); 4723 Local<v8::NativeWeakMap> weak_map(v8::NativeWeakMap::New(isolate));
4326 CHECK(!weak_map.IsEmpty()); 4724 CHECK(!weak_map.IsEmpty());
4327 4725
4328 LocalContext env; 4726 LocalContext env;
4329 Local<Object> value = v8::Object::New(isolate); 4727 Local<Object> value = v8::Object::New(isolate);
4330 4728
4331 Local<Object> local1 = v8::Object::New(isolate); 4729 Local<Object> local1 = v8::Object::New(isolate);
4332 CHECK(!weak_map->Has(local1)); 4730 CHECK(!weak_map->Has(local1));
4333 CHECK(weak_map->Get(local1)->IsUndefined()); 4731 CHECK(weak_map->Get(local1)->IsUndefined());
4334 weak_map->Set(local1, value); 4732 weak_map->Set(local1, value);
4335 CHECK(weak_map->Has(local1)); 4733 CHECK(weak_map->Has(local1));
4336 CHECK(value->Equals(weak_map->Get(local1))); 4734 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust());
4337 4735
4338 WeakCallCounter counter(1234); 4736 WeakCallCounter counter(1234);
4339 WeakCallCounterAndPersistent<Value> o1(&counter); 4737 WeakCallCounterAndPersistent<Value> o1(&counter);
4340 WeakCallCounterAndPersistent<Value> o2(&counter); 4738 WeakCallCounterAndPersistent<Value> o2(&counter);
4341 WeakCallCounterAndPersistent<Value> s1(&counter); 4739 WeakCallCounterAndPersistent<Value> s1(&counter);
4342 { 4740 {
4343 HandleScope scope(isolate); 4741 HandleScope scope(isolate);
4344 Local<v8::Object> obj1 = v8::Object::New(isolate); 4742 Local<v8::Object> obj1 = v8::Object::New(isolate);
4345 Local<v8::Object> obj2 = v8::Object::New(isolate); 4743 Local<v8::Object> obj2 = v8::Object::New(isolate);
4346 Local<v8::Symbol> sym1 = v8::Symbol::New(isolate); 4744 Local<v8::Symbol> sym1 = v8::Symbol::New(isolate);
4347 4745
4348 weak_map->Set(obj1, value); 4746 weak_map->Set(obj1, value);
4349 weak_map->Set(obj2, value); 4747 weak_map->Set(obj2, value);
4350 weak_map->Set(sym1, value); 4748 weak_map->Set(sym1, value);
4351 4749
4352 o1.handle.Reset(isolate, obj1); 4750 o1.handle.Reset(isolate, obj1);
4353 o2.handle.Reset(isolate, obj2); 4751 o2.handle.Reset(isolate, obj2);
4354 s1.handle.Reset(isolate, sym1); 4752 s1.handle.Reset(isolate, sym1);
4355 4753
4356 CHECK(weak_map->Has(local1)); 4754 CHECK(weak_map->Has(local1));
4357 CHECK(weak_map->Has(obj1)); 4755 CHECK(weak_map->Has(obj1));
4358 CHECK(weak_map->Has(obj2)); 4756 CHECK(weak_map->Has(obj2));
4359 CHECK(weak_map->Has(sym1)); 4757 CHECK(weak_map->Has(sym1));
4360 4758
4361 CHECK(value->Equals(weak_map->Get(local1))); 4759 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust());
4362 CHECK(value->Equals(weak_map->Get(obj1))); 4760 CHECK(value->Equals(env.local(), weak_map->Get(obj1)).FromJust());
4363 CHECK(value->Equals(weak_map->Get(obj2))); 4761 CHECK(value->Equals(env.local(), weak_map->Get(obj2)).FromJust());
4364 CHECK(value->Equals(weak_map->Get(sym1))); 4762 CHECK(value->Equals(env.local(), weak_map->Get(sym1)).FromJust());
4365 } 4763 }
4366 CcTest::heap()->CollectAllGarbage(); 4764 CcTest::heap()->CollectAllGarbage();
4367 { 4765 {
4368 HandleScope scope(isolate); 4766 HandleScope scope(isolate);
4369 CHECK(value->Equals(weak_map->Get(local1))); 4767 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust());
4370 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, o1.handle)))); 4768 CHECK(value->Equals(env.local(),
4371 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, o2.handle)))); 4769 weak_map->Get(Local<Value>::New(isolate, o1.handle)))
4372 CHECK(value->Equals(weak_map->Get(Local<Value>::New(isolate, s1.handle)))); 4770 .FromJust());
4771 CHECK(value->Equals(env.local(),
4772 weak_map->Get(Local<Value>::New(isolate, o2.handle)))
4773 .FromJust());
4774 CHECK(value->Equals(env.local(),
4775 weak_map->Get(Local<Value>::New(isolate, s1.handle)))
4776 .FromJust());
4373 } 4777 }
4374 4778
4375 o1.handle.SetWeak(&o1, &WeakPointerCallback, 4779 o1.handle.SetWeak(&o1, &WeakPointerCallback,
4376 v8::WeakCallbackType::kParameter); 4780 v8::WeakCallbackType::kParameter);
4377 o2.handle.SetWeak(&o2, &WeakPointerCallback, 4781 o2.handle.SetWeak(&o2, &WeakPointerCallback,
4378 v8::WeakCallbackType::kParameter); 4782 v8::WeakCallbackType::kParameter);
4379 s1.handle.SetWeak(&s1, &WeakPointerCallback, 4783 s1.handle.SetWeak(&s1, &WeakPointerCallback,
4380 v8::WeakCallbackType::kParameter); 4784 v8::WeakCallbackType::kParameter);
4381 4785
4382 CcTest::heap()->CollectAllGarbage(); 4786 CcTest::heap()->CollectAllGarbage();
4383 CHECK_EQ(3, counter.NumberOfWeakCalls()); 4787 CHECK_EQ(3, counter.NumberOfWeakCalls());
4384 4788
4385 CHECK(o1.handle.IsEmpty()); 4789 CHECK(o1.handle.IsEmpty());
4386 CHECK(o2.handle.IsEmpty()); 4790 CHECK(o2.handle.IsEmpty());
4387 CHECK(s1.handle.IsEmpty()); 4791 CHECK(s1.handle.IsEmpty());
4388 4792
4389 CHECK(value->Equals(weak_map->Get(local1))); 4793 CHECK(value->Equals(env.local(), weak_map->Get(local1)).FromJust());
4390 CHECK(weak_map->Delete(local1)); 4794 CHECK(weak_map->Delete(local1));
4391 CHECK(!weak_map->Has(local1)); 4795 CHECK(!weak_map->Has(local1));
4392 CHECK(weak_map->Get(local1)->IsUndefined()); 4796 CHECK(weak_map->Get(local1)->IsUndefined());
4393 } 4797 }
4394 4798
4395 4799
4396 THREADED_TEST(GetSetProperty) { 4800 THREADED_TEST(GetSetProperty) {
4397 LocalContext context; 4801 LocalContext context;
4398 v8::Isolate* isolate = context->GetIsolate(); 4802 v8::Isolate* isolate = context->GetIsolate();
4399 v8::HandleScope scope(isolate); 4803 v8::HandleScope scope(isolate);
4400 context->Global()->Set(v8_str("foo"), v8_num(14)); 4804 CHECK(context->Global()
4401 context->Global()->Set(v8_str("12"), v8_num(92)); 4805 ->Set(context.local(), v8_str("foo"), v8_num(14))
4402 context->Global()->Set(v8::Integer::New(isolate, 16), v8_num(32)); 4806 .FromJust());
4403 context->Global()->Set(v8_num(13), v8_num(56)); 4807 CHECK(context->Global()
4808 ->Set(context.local(), v8_str("12"), v8_num(92))
4809 .FromJust());
4810 CHECK(context->Global()
4811 ->Set(context.local(), v8::Integer::New(isolate, 16), v8_num(32))
4812 .FromJust());
4813 CHECK(context->Global()
4814 ->Set(context.local(), v8_num(13), v8_num(56))
4815 .FromJust());
4404 Local<Value> foo = CompileRun("this.foo"); 4816 Local<Value> foo = CompileRun("this.foo");
4405 CHECK_EQ(14, foo->Int32Value()); 4817 CHECK_EQ(14, foo->Int32Value(context.local()).FromJust());
4406 Local<Value> twelve = CompileRun("this[12]"); 4818 Local<Value> twelve = CompileRun("this[12]");
4407 CHECK_EQ(92, twelve->Int32Value()); 4819 CHECK_EQ(92, twelve->Int32Value(context.local()).FromJust());
4408 Local<Value> sixteen = CompileRun("this[16]"); 4820 Local<Value> sixteen = CompileRun("this[16]");
4409 CHECK_EQ(32, sixteen->Int32Value()); 4821 CHECK_EQ(32, sixteen->Int32Value(context.local()).FromJust());
4410 Local<Value> thirteen = CompileRun("this[13]"); 4822 Local<Value> thirteen = CompileRun("this[13]");
4411 CHECK_EQ(56, thirteen->Int32Value()); 4823 CHECK_EQ(56, thirteen->Int32Value(context.local()).FromJust());
4412 CHECK_EQ(92, 4824 CHECK_EQ(92, context->Global()
4413 context->Global()->Get(v8::Integer::New(isolate, 12))->Int32Value()); 4825 ->Get(context.local(), v8::Integer::New(isolate, 12))
4414 CHECK_EQ(92, context->Global()->Get(v8_str("12"))->Int32Value()); 4826 .ToLocalChecked()
4415 CHECK_EQ(92, context->Global()->Get(v8_num(12))->Int32Value()); 4827 ->Int32Value(context.local())
4416 CHECK_EQ(32, 4828 .FromJust());
4417 context->Global()->Get(v8::Integer::New(isolate, 16))->Int32Value()); 4829 CHECK_EQ(92, context->Global()
4418 CHECK_EQ(32, context->Global()->Get(v8_str("16"))->Int32Value()); 4830 ->Get(context.local(), v8_str("12"))
4419 CHECK_EQ(32, context->Global()->Get(v8_num(16))->Int32Value()); 4831 .ToLocalChecked()
4420 CHECK_EQ(56, 4832 ->Int32Value(context.local())
4421 context->Global()->Get(v8::Integer::New(isolate, 13))->Int32Value()); 4833 .FromJust());
4422 CHECK_EQ(56, context->Global()->Get(v8_str("13"))->Int32Value()); 4834 CHECK_EQ(92, context->Global()
4423 CHECK_EQ(56, context->Global()->Get(v8_num(13))->Int32Value()); 4835 ->Get(context.local(), v8_num(12))
4836 .ToLocalChecked()
4837 ->Int32Value(context.local())
4838 .FromJust());
4839 CHECK_EQ(32, context->Global()
4840 ->Get(context.local(), v8::Integer::New(isolate, 16))
4841 .ToLocalChecked()
4842 ->Int32Value(context.local())
4843 .FromJust());
4844 CHECK_EQ(32, context->Global()
4845 ->Get(context.local(), v8_str("16"))
4846 .ToLocalChecked()
4847 ->Int32Value(context.local())
4848 .FromJust());
4849 CHECK_EQ(32, context->Global()
4850 ->Get(context.local(), v8_num(16))
4851 .ToLocalChecked()
4852 ->Int32Value(context.local())
4853 .FromJust());
4854 CHECK_EQ(56, context->Global()
4855 ->Get(context.local(), v8::Integer::New(isolate, 13))
4856 .ToLocalChecked()
4857 ->Int32Value(context.local())
4858 .FromJust());
4859 CHECK_EQ(56, context->Global()
4860 ->Get(context.local(), v8_str("13"))
4861 .ToLocalChecked()
4862 ->Int32Value(context.local())
4863 .FromJust());
4864 CHECK_EQ(56, context->Global()
4865 ->Get(context.local(), v8_num(13))
4866 .ToLocalChecked()
4867 ->Int32Value(context.local())
4868 .FromJust());
4424 } 4869 }
4425 4870
4426 4871
4427 THREADED_TEST(PropertyAttributes) { 4872 THREADED_TEST(PropertyAttributes) {
4428 LocalContext context; 4873 LocalContext context;
4429 v8::HandleScope scope(context->GetIsolate()); 4874 v8::HandleScope scope(context->GetIsolate());
4430 // none 4875 // none
4431 Local<String> prop = v8_str("none"); 4876 Local<String> prop = v8_str("none");
4432 context->Global()->Set(prop, v8_num(7)); 4877 CHECK(context->Global()->Set(context.local(), prop, v8_num(7)).FromJust());
4433 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); 4878 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(),
4879 prop).FromJust());
4434 // read-only 4880 // read-only
4435 prop = v8_str("read_only"); 4881 prop = v8_str("read_only");
4436 context->Global()->ForceSet(prop, v8_num(7), v8::ReadOnly); 4882 context->Global()->ForceSet(context.local(), prop, v8_num(7),
4437 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); 4883 v8::ReadOnly).FromJust();
4438 CHECK_EQ(v8::ReadOnly, context->Global()->GetPropertyAttributes(prop)); 4884 CHECK_EQ(7, context->Global()->Get(context.local(),
4885 prop).ToLocalChecked()->Int32Value(context.local()).FromJust());
4886 CHECK_EQ(v8::ReadOnly,
4887 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust());
4439 CompileRun("read_only = 9"); 4888 CompileRun("read_only = 9");
4440 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); 4889 CHECK_EQ(7, context->Global()->Get(context.local(),
4441 context->Global()->Set(prop, v8_num(10)); 4890 prop).ToLocalChecked()->Int32Value(context.local()).FromJust());
4442 CHECK_EQ(7, context->Global()->Get(prop)->Int32Value()); 4891 CHECK(context->Global()->Set(context.local(), prop, v8_num(10)).FromJust());
4892 CHECK_EQ(7, context->Global()->Get(context.local(),
4893 prop).ToLocalChecked()->Int32Value(context.local()).FromJust());
4443 // dont-delete 4894 // dont-delete
4444 prop = v8_str("dont_delete"); 4895 prop = v8_str("dont_delete");
4445 context->Global()->ForceSet(prop, v8_num(13), v8::DontDelete); 4896 context->Global()->ForceSet(context.local(), prop, v8_num(13),
4446 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); 4897 v8::DontDelete).FromJust();
4898 CHECK_EQ(13, context->Global()->Get(context.local(),
4899 prop).ToLocalChecked()->Int32Value(context.local()).FromJust());
4447 CompileRun("delete dont_delete"); 4900 CompileRun("delete dont_delete");
4448 CHECK_EQ(13, context->Global()->Get(prop)->Int32Value()); 4901 CHECK_EQ(13, context->Global()->Get(context.local(),
4449 CHECK_EQ(v8::DontDelete, context->Global()->GetPropertyAttributes(prop)); 4902 prop).ToLocalChecked()->Int32Value(context.local()).FromJust());
4903 CHECK_EQ(v8::DontDelete,
4904 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust());
4450 // dont-enum 4905 // dont-enum
4451 prop = v8_str("dont_enum"); 4906 prop = v8_str("dont_enum");
4452 context->Global()->ForceSet(prop, v8_num(28), v8::DontEnum); 4907 context->Global()->ForceSet(prop, v8_num(28), v8::DontEnum);
4453 CHECK_EQ(v8::DontEnum, context->Global()->GetPropertyAttributes(prop)); 4908 CHECK_EQ(v8::DontEnum,
4909 context->Global()->GetPropertyAttributes(context.local(), prop).FromJust());
4454 // absent 4910 // absent
4455 prop = v8_str("absent"); 4911 prop = v8_str("absent");
4456 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(prop)); 4912 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(),
4913 prop).FromJust());
4457 Local<Value> fake_prop = v8_num(1); 4914 Local<Value> fake_prop = v8_num(1);
4458 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(fake_prop)); 4915 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(),
4916 fake_prop).FromJust());
4459 // exception 4917 // exception
4460 TryCatch try_catch(context->GetIsolate()); 4918 TryCatch try_catch(context->GetIsolate());
4461 Local<Value> exception = 4919 Local<Value> exception =
4462 CompileRun("({ toString: function() { throw 'exception';} })"); 4920 CompileRun("({ toString: function() { throw 'exception';} })");
4463 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(exception)); 4921 CHECK_EQ(v8::None, context->Global()->GetPropertyAttributes(context.local(),
4922 exception).FromJust());
4464 CHECK(try_catch.HasCaught()); 4923 CHECK(try_catch.HasCaught());
4465 String::Utf8Value exception_value(try_catch.Exception()); 4924 String::Utf8Value exception_value(try_catch.Exception());
4466 CHECK_EQ(0, strcmp("exception", *exception_value)); 4925 CHECK_EQ(0, strcmp("exception", *exception_value));
4467 try_catch.Reset(); 4926 try_catch.Reset();
4468 } 4927 }
4469 4928
4470 4929
4471 THREADED_TEST(Array) { 4930 THREADED_TEST(Array) {
4472 LocalContext context; 4931 LocalContext context;
4473 v8::HandleScope scope(context->GetIsolate()); 4932 v8::HandleScope scope(context->GetIsolate());
4474 Local<v8::Array> array = v8::Array::New(context->GetIsolate()); 4933 Local<v8::Array> array = v8::Array::New(context->GetIsolate());
4475 CHECK_EQ(0u, array->Length()); 4934 CHECK_EQ(0u, array->Length());
4476 CHECK(array->Get(0)->IsUndefined()); 4935 CHECK(array->Get(context.local(), 0).ToLocalChecked()->IsUndefined());
4477 CHECK(!array->Has(0)); 4936 CHECK(!array->Has(context.local(), 0).FromJust());
4478 CHECK(array->Get(100)->IsUndefined()); 4937 CHECK(array->Get(context.local(), 100).ToLocalChecked()->IsUndefined());
4479 CHECK(!array->Has(100)); 4938 CHECK(!array->Has(context.local(), 100).FromJust());
4480 array->Set(2, v8_num(7)); 4939 CHECK(array->Set(context.local(), 2, v8_num(7)).FromJust());
4481 CHECK_EQ(3u, array->Length()); 4940 CHECK_EQ(3u, array->Length());
4482 CHECK(!array->Has(0)); 4941 CHECK(!array->Has(context.local(), 0).FromJust());
4483 CHECK(!array->Has(1)); 4942 CHECK(!array->Has(context.local(), 1).FromJust());
4484 CHECK(array->Has(2)); 4943 CHECK(array->Has(context.local(), 2).FromJust());
4485 CHECK_EQ(7, array->Get(2)->Int32Value()); 4944 CHECK_EQ(7, array->Get(context.local(), 2)
4945 .ToLocalChecked()
4946 ->Int32Value(context.local())
4947 .FromJust());
4486 Local<Value> obj = CompileRun("[1, 2, 3]"); 4948 Local<Value> obj = CompileRun("[1, 2, 3]");
4487 Local<v8::Array> arr = obj.As<v8::Array>(); 4949 Local<v8::Array> arr = obj.As<v8::Array>();
4488 CHECK_EQ(3u, arr->Length()); 4950 CHECK_EQ(3u, arr->Length());
4489 CHECK_EQ(1, arr->Get(0)->Int32Value()); 4951 CHECK_EQ(1, arr->Get(context.local(), 0)
4490 CHECK_EQ(2, arr->Get(1)->Int32Value()); 4952 .ToLocalChecked()
4491 CHECK_EQ(3, arr->Get(2)->Int32Value()); 4953 ->Int32Value(context.local())
4954 .FromJust());
4955 CHECK_EQ(2, arr->Get(context.local(), 1)
4956 .ToLocalChecked()
4957 ->Int32Value(context.local())
4958 .FromJust());
4959 CHECK_EQ(3, arr->Get(context.local(), 2)
4960 .ToLocalChecked()
4961 ->Int32Value(context.local())
4962 .FromJust());
4492 array = v8::Array::New(context->GetIsolate(), 27); 4963 array = v8::Array::New(context->GetIsolate(), 27);
4493 CHECK_EQ(27u, array->Length()); 4964 CHECK_EQ(27u, array->Length());
4494 array = v8::Array::New(context->GetIsolate(), -27); 4965 array = v8::Array::New(context->GetIsolate(), -27);
4495 CHECK_EQ(0u, array->Length()); 4966 CHECK_EQ(0u, array->Length());
4496 } 4967 }
4497 4968
4498 4969
4499 void HandleF(const v8::FunctionCallbackInfo<v8::Value>& args) { 4970 void HandleF(const v8::FunctionCallbackInfo<v8::Value>& args) {
4500 v8::EscapableHandleScope scope(args.GetIsolate()); 4971 v8::EscapableHandleScope scope(args.GetIsolate());
4501 ApiTestFuzzer::Fuzz(); 4972 ApiTestFuzzer::Fuzz();
4502 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); 4973 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]); 4974 for (int i = 0; i < args.Length(); i++) {
4975 CHECK(result->Set(CcTest::isolate()->GetCurrentContext(), i, args[i])
4976 .FromJust());
4977 }
4504 args.GetReturnValue().Set(scope.Escape(result)); 4978 args.GetReturnValue().Set(scope.Escape(result));
4505 } 4979 }
4506 4980
4507 4981
4508 THREADED_TEST(Vector) { 4982 THREADED_TEST(Vector) {
4509 v8::Isolate* isolate = CcTest::isolate(); 4983 v8::Isolate* isolate = CcTest::isolate();
4510 v8::HandleScope scope(isolate); 4984 v8::HandleScope scope(isolate);
4511 Local<ObjectTemplate> global = ObjectTemplate::New(isolate); 4985 Local<ObjectTemplate> global = ObjectTemplate::New(isolate);
4512 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF)); 4986 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF));
4513 LocalContext context(0, global); 4987 LocalContext context(0, global);
4514 4988
4515 const char* fun = "f()"; 4989 const char* fun = "f()";
4516 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); 4990 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>();
4517 CHECK_EQ(0u, a0->Length()); 4991 CHECK_EQ(0u, a0->Length());
4518 4992
4519 const char* fun2 = "f(11)"; 4993 const char* fun2 = "f(11)";
4520 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); 4994 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>();
4521 CHECK_EQ(1u, a1->Length()); 4995 CHECK_EQ(1u, a1->Length());
4522 CHECK_EQ(11, a1->Get(0)->Int32Value()); 4996 CHECK_EQ(11, a1->Get(context.local(), 0)
4997 .ToLocalChecked()
4998 ->Int32Value(context.local())
4999 .FromJust());
4523 5000
4524 const char* fun3 = "f(12, 13)"; 5001 const char* fun3 = "f(12, 13)";
4525 Local<v8::Array> a2 = CompileRun(fun3).As<v8::Array>(); 5002 Local<v8::Array> a2 = CompileRun(fun3).As<v8::Array>();
4526 CHECK_EQ(2u, a2->Length()); 5003 CHECK_EQ(2u, a2->Length());
4527 CHECK_EQ(12, a2->Get(0)->Int32Value()); 5004 CHECK_EQ(12, a2->Get(context.local(), 0)
4528 CHECK_EQ(13, a2->Get(1)->Int32Value()); 5005 .ToLocalChecked()
5006 ->Int32Value(context.local())
5007 .FromJust());
5008 CHECK_EQ(13, a2->Get(context.local(), 1)
5009 .ToLocalChecked()
5010 ->Int32Value(context.local())
5011 .FromJust());
4529 5012
4530 const char* fun4 = "f(14, 15, 16)"; 5013 const char* fun4 = "f(14, 15, 16)";
4531 Local<v8::Array> a3 = CompileRun(fun4).As<v8::Array>(); 5014 Local<v8::Array> a3 = CompileRun(fun4).As<v8::Array>();
4532 CHECK_EQ(3u, a3->Length()); 5015 CHECK_EQ(3u, a3->Length());
4533 CHECK_EQ(14, a3->Get(0)->Int32Value()); 5016 CHECK_EQ(14, a3->Get(context.local(), 0)
4534 CHECK_EQ(15, a3->Get(1)->Int32Value()); 5017 .ToLocalChecked()
4535 CHECK_EQ(16, a3->Get(2)->Int32Value()); 5018 ->Int32Value(context.local())
5019 .FromJust());
5020 CHECK_EQ(15, a3->Get(context.local(), 1)
5021 .ToLocalChecked()
5022 ->Int32Value(context.local())
5023 .FromJust());
5024 CHECK_EQ(16, a3->Get(context.local(), 2)
5025 .ToLocalChecked()
5026 ->Int32Value(context.local())
5027 .FromJust());
4536 5028
4537 const char* fun5 = "f(17, 18, 19, 20)"; 5029 const char* fun5 = "f(17, 18, 19, 20)";
4538 Local<v8::Array> a4 = CompileRun(fun5).As<v8::Array>(); 5030 Local<v8::Array> a4 = CompileRun(fun5).As<v8::Array>();
4539 CHECK_EQ(4u, a4->Length()); 5031 CHECK_EQ(4u, a4->Length());
4540 CHECK_EQ(17, a4->Get(0)->Int32Value()); 5032 CHECK_EQ(17, a4->Get(context.local(), 0)
4541 CHECK_EQ(18, a4->Get(1)->Int32Value()); 5033 .ToLocalChecked()
4542 CHECK_EQ(19, a4->Get(2)->Int32Value()); 5034 ->Int32Value(context.local())
4543 CHECK_EQ(20, a4->Get(3)->Int32Value()); 5035 .FromJust());
5036 CHECK_EQ(18, a4->Get(context.local(), 1)
5037 .ToLocalChecked()
5038 ->Int32Value(context.local())
5039 .FromJust());
5040 CHECK_EQ(19, a4->Get(context.local(), 2)
5041 .ToLocalChecked()
5042 ->Int32Value(context.local())
5043 .FromJust());
5044 CHECK_EQ(20, a4->Get(context.local(), 3)
5045 .ToLocalChecked()
5046 ->Int32Value(context.local())
5047 .FromJust());
4544 } 5048 }
4545 5049
4546 5050
4547 THREADED_TEST(FunctionCall) { 5051 THREADED_TEST(FunctionCall) {
4548 LocalContext context; 5052 LocalContext context;
4549 v8::Isolate* isolate = context->GetIsolate(); 5053 v8::Isolate* isolate = context->GetIsolate();
4550 v8::HandleScope scope(isolate); 5054 v8::HandleScope scope(isolate);
4551 CompileRun( 5055 CompileRun(
4552 "function Foo() {" 5056 "function Foo() {"
4553 " var result = [];" 5057 " var result = [];"
4554 " for (var i = 0; i < arguments.length; i++) {" 5058 " for (var i = 0; i < arguments.length; i++) {"
4555 " result.push(arguments[i]);" 5059 " result.push(arguments[i]);"
4556 " }" 5060 " }"
4557 " return result;" 5061 " return result;"
4558 "}" 5062 "}"
4559 "function ReturnThisSloppy() {" 5063 "function ReturnThisSloppy() {"
4560 " return this;" 5064 " return this;"
4561 "}" 5065 "}"
4562 "function ReturnThisStrict() {" 5066 "function ReturnThisStrict() {"
4563 " 'use strict';" 5067 " 'use strict';"
4564 " return this;" 5068 " return this;"
4565 "}"); 5069 "}");
4566 Local<Function> Foo = 5070 Local<Function> Foo = Local<Function>::Cast(
4567 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); 5071 context->Global()->Get(context.local(), v8_str("Foo")).ToLocalChecked());
4568 Local<Function> ReturnThisSloppy = 5072 Local<Function> ReturnThisSloppy = Local<Function>::Cast(
4569 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisSloppy"))); 5073 context->Global()
4570 Local<Function> ReturnThisStrict = 5074 ->Get(context.local(), v8_str("ReturnThisSloppy"))
4571 Local<Function>::Cast(context->Global()->Get(v8_str("ReturnThisStrict"))); 5075 .ToLocalChecked());
5076 Local<Function> ReturnThisStrict = Local<Function>::Cast(
5077 context->Global()
5078 ->Get(context.local(), v8_str("ReturnThisStrict"))
5079 .ToLocalChecked());
4572 5080
4573 v8::Handle<Value>* args0 = NULL; 5081 v8::Local<Value>* args0 = NULL;
4574 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->Call(Foo, 0, args0)); 5082 Local<v8::Array> a0 = Local<v8::Array>::Cast(
5083 Foo->Call(context.local(), Foo, 0, args0).ToLocalChecked());
4575 CHECK_EQ(0u, a0->Length()); 5084 CHECK_EQ(0u, a0->Length());
4576 5085
4577 v8::Handle<Value> args1[] = {v8_num(1.1)}; 5086 v8::Local<Value> args1[] = {v8_num(1.1)};
4578 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->Call(Foo, 1, args1)); 5087 Local<v8::Array> a1 = Local<v8::Array>::Cast(
5088 Foo->Call(context.local(), Foo, 1, args1).ToLocalChecked());
4579 CHECK_EQ(1u, a1->Length()); 5089 CHECK_EQ(1u, a1->Length());
4580 CHECK_EQ(1.1, a1->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5090 CHECK_EQ(1.1, a1->Get(context.local(), v8::Integer::New(isolate, 0))
5091 .ToLocalChecked()
5092 ->NumberValue(context.local())
5093 .FromJust());
4581 5094
4582 v8::Handle<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; 5095 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)); 5096 Local<v8::Array> a2 = Local<v8::Array>::Cast(
5097 Foo->Call(context.local(), Foo, 2, args2).ToLocalChecked());
4584 CHECK_EQ(2u, a2->Length()); 5098 CHECK_EQ(2u, a2->Length());
4585 CHECK_EQ(2.2, a2->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5099 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()); 5100 .ToLocalChecked()
5101 ->NumberValue(context.local())
5102 .FromJust());
5103 CHECK_EQ(3.3, a2->Get(context.local(), v8::Integer::New(isolate, 1))
5104 .ToLocalChecked()
5105 ->NumberValue(context.local())
5106 .FromJust());
4587 5107
4588 v8::Handle<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; 5108 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)); 5109 Local<v8::Array> a3 = Local<v8::Array>::Cast(
5110 Foo->Call(context.local(), Foo, 3, args3).ToLocalChecked());
4590 CHECK_EQ(3u, a3->Length()); 5111 CHECK_EQ(3u, a3->Length());
4591 CHECK_EQ(4.4, a3->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5112 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()); 5113 .ToLocalChecked()
4593 CHECK_EQ(6.6, a3->Get(v8::Integer::New(isolate, 2))->NumberValue()); 5114 ->NumberValue(context.local())
5115 .FromJust());
5116 CHECK_EQ(5.5, a3->Get(context.local(), v8::Integer::New(isolate, 1))
5117 .ToLocalChecked()
5118 ->NumberValue(context.local())
5119 .FromJust());
5120 CHECK_EQ(6.6, a3->Get(context.local(), v8::Integer::New(isolate, 2))
5121 .ToLocalChecked()
5122 ->NumberValue(context.local())
5123 .FromJust());
4594 5124
4595 v8::Handle<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), 5125 v8::Local<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9),
4596 v8_num(10.11)}; 5126 v8_num(10.11)};
4597 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->Call(Foo, 4, args4)); 5127 Local<v8::Array> a4 = Local<v8::Array>::Cast(
5128 Foo->Call(context.local(), Foo, 4, args4).ToLocalChecked());
4598 CHECK_EQ(4u, a4->Length()); 5129 CHECK_EQ(4u, a4->Length());
4599 CHECK_EQ(7.7, a4->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5130 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()); 5131 .ToLocalChecked()
4601 CHECK_EQ(9.9, a4->Get(v8::Integer::New(isolate, 2))->NumberValue()); 5132 ->NumberValue(context.local())
4602 CHECK_EQ(10.11, a4->Get(v8::Integer::New(isolate, 3))->NumberValue()); 5133 .FromJust());
5134 CHECK_EQ(8.8, a4->Get(context.local(), v8::Integer::New(isolate, 1))
5135 .ToLocalChecked()
5136 ->NumberValue(context.local())
5137 .FromJust());
5138 CHECK_EQ(9.9, a4->Get(context.local(), v8::Integer::New(isolate, 2))
5139 .ToLocalChecked()
5140 ->NumberValue(context.local())
5141 .FromJust());
5142 CHECK_EQ(10.11, a4->Get(context.local(), v8::Integer::New(isolate, 3))
5143 .ToLocalChecked()
5144 ->NumberValue(context.local())
5145 .FromJust());
4603 5146
4604 Local<v8::Value> r1 = ReturnThisSloppy->Call(v8::Undefined(isolate), 0, NULL); 5147 Local<v8::Value> r1 =
5148 ReturnThisSloppy->Call(context.local(), v8::Undefined(isolate), 0, NULL)
5149 .ToLocalChecked();
4605 CHECK(r1->StrictEquals(context->Global())); 5150 CHECK(r1->StrictEquals(context->Global()));
4606 Local<v8::Value> r2 = ReturnThisSloppy->Call(v8::Null(isolate), 0, NULL); 5151 Local<v8::Value> r2 =
5152 ReturnThisSloppy->Call(context.local(), v8::Null(isolate), 0, NULL)
5153 .ToLocalChecked();
4607 CHECK(r2->StrictEquals(context->Global())); 5154 CHECK(r2->StrictEquals(context->Global()));
4608 Local<v8::Value> r3 = ReturnThisSloppy->Call(v8_num(42), 0, NULL); 5155 Local<v8::Value> r3 =
5156 ReturnThisSloppy->Call(context.local(), v8_num(42), 0, NULL)
5157 .ToLocalChecked();
4609 CHECK(r3->IsNumberObject()); 5158 CHECK(r3->IsNumberObject());
4610 CHECK_EQ(42.0, r3.As<v8::NumberObject>()->ValueOf()); 5159 CHECK_EQ(42.0, r3.As<v8::NumberObject>()->ValueOf());
4611 Local<v8::Value> r4 = ReturnThisSloppy->Call(v8_str("hello"), 0, NULL); 5160 Local<v8::Value> r4 =
5161 ReturnThisSloppy->Call(context.local(), v8_str("hello"), 0, NULL)
5162 .ToLocalChecked();
4612 CHECK(r4->IsStringObject()); 5163 CHECK(r4->IsStringObject());
4613 CHECK(r4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello"))); 5164 CHECK(r4.As<v8::StringObject>()->ValueOf()->StrictEquals(v8_str("hello")));
4614 Local<v8::Value> r5 = ReturnThisSloppy->Call(v8::True(isolate), 0, NULL); 5165 Local<v8::Value> r5 =
5166 ReturnThisSloppy->Call(context.local(), v8::True(isolate), 0, NULL)
5167 .ToLocalChecked();
4615 CHECK(r5->IsBooleanObject()); 5168 CHECK(r5->IsBooleanObject());
4616 CHECK(r5.As<v8::BooleanObject>()->ValueOf()); 5169 CHECK(r5.As<v8::BooleanObject>()->ValueOf());
4617 5170
4618 Local<v8::Value> r6 = ReturnThisStrict->Call(v8::Undefined(isolate), 0, NULL); 5171 Local<v8::Value> r6 =
5172 ReturnThisStrict->Call(context.local(), v8::Undefined(isolate), 0, NULL)
5173 .ToLocalChecked();
4619 CHECK(r6->IsUndefined()); 5174 CHECK(r6->IsUndefined());
4620 Local<v8::Value> r7 = ReturnThisStrict->Call(v8::Null(isolate), 0, NULL); 5175 Local<v8::Value> r7 =
5176 ReturnThisStrict->Call(context.local(), v8::Null(isolate), 0, NULL)
5177 .ToLocalChecked();
4621 CHECK(r7->IsNull()); 5178 CHECK(r7->IsNull());
4622 Local<v8::Value> r8 = ReturnThisStrict->Call(v8_num(42), 0, NULL); 5179 Local<v8::Value> r8 =
5180 ReturnThisStrict->Call(context.local(), v8_num(42), 0, NULL)
5181 .ToLocalChecked();
4623 CHECK(r8->StrictEquals(v8_num(42))); 5182 CHECK(r8->StrictEquals(v8_num(42)));
4624 Local<v8::Value> r9 = ReturnThisStrict->Call(v8_str("hello"), 0, NULL); 5183 Local<v8::Value> r9 =
5184 ReturnThisStrict->Call(context.local(), v8_str("hello"), 0, NULL)
5185 .ToLocalChecked();
4625 CHECK(r9->StrictEquals(v8_str("hello"))); 5186 CHECK(r9->StrictEquals(v8_str("hello")));
4626 Local<v8::Value> r10 = ReturnThisStrict->Call(v8::True(isolate), 0, NULL); 5187 Local<v8::Value> r10 =
5188 ReturnThisStrict->Call(context.local(), v8::True(isolate), 0, NULL)
5189 .ToLocalChecked();
4627 CHECK(r10->StrictEquals(v8::True(isolate))); 5190 CHECK(r10->StrictEquals(v8::True(isolate)));
4628 } 5191 }
4629 5192
4630 5193
4631 THREADED_TEST(ConstructCall) { 5194 THREADED_TEST(ConstructCall) {
4632 LocalContext context; 5195 LocalContext context;
4633 v8::Isolate* isolate = context->GetIsolate(); 5196 v8::Isolate* isolate = context->GetIsolate();
4634 v8::HandleScope scope(isolate); 5197 v8::HandleScope scope(isolate);
4635 CompileRun( 5198 CompileRun(
4636 "function Foo() {" 5199 "function Foo() {"
4637 " var result = [];" 5200 " var result = [];"
4638 " for (var i = 0; i < arguments.length; i++) {" 5201 " for (var i = 0; i < arguments.length; i++) {"
4639 " result.push(arguments[i]);" 5202 " result.push(arguments[i]);"
4640 " }" 5203 " }"
4641 " return result;" 5204 " return result;"
4642 "}"); 5205 "}");
4643 Local<Function> Foo = 5206 Local<Function> Foo = Local<Function>::Cast(
4644 Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); 5207 context->Global()->Get(context.local(), v8_str("Foo")).ToLocalChecked());
4645 5208
4646 v8::Handle<Value>* args0 = NULL; 5209 v8::Local<Value>* args0 = NULL;
4647 Local<v8::Array> a0 = Local<v8::Array>::Cast(Foo->NewInstance(0, args0)); 5210 Local<v8::Array> a0 = Local<v8::Array>::Cast(
5211 Foo->NewInstance(context.local(), 0, args0).ToLocalChecked());
4648 CHECK_EQ(0u, a0->Length()); 5212 CHECK_EQ(0u, a0->Length());
4649 5213
4650 v8::Handle<Value> args1[] = {v8_num(1.1)}; 5214 v8::Local<Value> args1[] = {v8_num(1.1)};
4651 Local<v8::Array> a1 = Local<v8::Array>::Cast(Foo->NewInstance(1, args1)); 5215 Local<v8::Array> a1 = Local<v8::Array>::Cast(
5216 Foo->NewInstance(context.local(), 1, args1).ToLocalChecked());
4652 CHECK_EQ(1u, a1->Length()); 5217 CHECK_EQ(1u, a1->Length());
4653 CHECK_EQ(1.1, a1->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5218 CHECK_EQ(1.1, a1->Get(context.local(), v8::Integer::New(isolate, 0))
5219 .ToLocalChecked()
5220 ->NumberValue(context.local())
5221 .FromJust());
4654 5222
4655 v8::Handle<Value> args2[] = {v8_num(2.2), v8_num(3.3)}; 5223 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)); 5224 Local<v8::Array> a2 = Local<v8::Array>::Cast(
5225 Foo->NewInstance(context.local(), 2, args2).ToLocalChecked());
4657 CHECK_EQ(2u, a2->Length()); 5226 CHECK_EQ(2u, a2->Length());
4658 CHECK_EQ(2.2, a2->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5227 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()); 5228 .ToLocalChecked()
5229 ->NumberValue(context.local())
5230 .FromJust());
5231 CHECK_EQ(3.3, a2->Get(context.local(), v8::Integer::New(isolate, 1))
5232 .ToLocalChecked()
5233 ->NumberValue(context.local())
5234 .FromJust());
4660 5235
4661 v8::Handle<Value> args3[] = {v8_num(4.4), v8_num(5.5), v8_num(6.6)}; 5236 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)); 5237 Local<v8::Array> a3 = Local<v8::Array>::Cast(
5238 Foo->NewInstance(context.local(), 3, args3).ToLocalChecked());
4663 CHECK_EQ(3u, a3->Length()); 5239 CHECK_EQ(3u, a3->Length());
4664 CHECK_EQ(4.4, a3->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5240 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()); 5241 .ToLocalChecked()
4666 CHECK_EQ(6.6, a3->Get(v8::Integer::New(isolate, 2))->NumberValue()); 5242 ->NumberValue(context.local())
5243 .FromJust());
5244 CHECK_EQ(5.5, a3->Get(context.local(), v8::Integer::New(isolate, 1))
5245 .ToLocalChecked()
5246 ->NumberValue(context.local())
5247 .FromJust());
5248 CHECK_EQ(6.6, a3->Get(context.local(), v8::Integer::New(isolate, 2))
5249 .ToLocalChecked()
5250 ->NumberValue(context.local())
5251 .FromJust());
4667 5252
4668 v8::Handle<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9), 5253 v8::Local<Value> args4[] = {v8_num(7.7), v8_num(8.8), v8_num(9.9),
4669 v8_num(10.11)}; 5254 v8_num(10.11)};
4670 Local<v8::Array> a4 = Local<v8::Array>::Cast(Foo->NewInstance(4, args4)); 5255 Local<v8::Array> a4 = Local<v8::Array>::Cast(
5256 Foo->NewInstance(context.local(), 4, args4).ToLocalChecked());
4671 CHECK_EQ(4u, a4->Length()); 5257 CHECK_EQ(4u, a4->Length());
4672 CHECK_EQ(7.7, a4->Get(v8::Integer::New(isolate, 0))->NumberValue()); 5258 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()); 5259 .ToLocalChecked()
4674 CHECK_EQ(9.9, a4->Get(v8::Integer::New(isolate, 2))->NumberValue()); 5260 ->NumberValue(context.local())
4675 CHECK_EQ(10.11, a4->Get(v8::Integer::New(isolate, 3))->NumberValue()); 5261 .FromJust());
5262 CHECK_EQ(8.8, a4->Get(context.local(), v8::Integer::New(isolate, 1))
5263 .ToLocalChecked()
5264 ->NumberValue(context.local())
5265 .FromJust());
5266 CHECK_EQ(9.9, a4->Get(context.local(), v8::Integer::New(isolate, 2))
5267 .ToLocalChecked()
5268 ->NumberValue(context.local())
5269 .FromJust());
5270 CHECK_EQ(10.11, a4->Get(context.local(), v8::Integer::New(isolate, 3))
5271 .ToLocalChecked()
5272 ->NumberValue(context.local())
5273 .FromJust());
4676 } 5274 }
4677 5275
4678 5276
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) { 5277 THREADED_TEST(ConversionNumber) {
4688 LocalContext env; 5278 LocalContext env;
4689 v8::Isolate* isolate = env->GetIsolate(); 5279 v8::Isolate* isolate = env->GetIsolate();
4690 v8::HandleScope scope(isolate); 5280 v8::HandleScope scope(isolate);
4691 // Very large number. 5281 // Very large number.
4692 CompileRun("var obj = Math.pow(2,32) * 1237;"); 5282 CompileRun("var obj = Math.pow(2,32) * 1237;");
4693 Local<Value> obj = env->Global()->Get(v8_str("obj")); 5283 Local<Value> obj =
4694 CHECK_EQ(5312874545152.0, obj->ToNumber(isolate)->Value()); 5284 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4695 CHECK_EQ(0, obj->ToInt32(isolate)->Value()); 5285 CHECK_EQ(5312874545152.0,
5286 obj->ToNumber(env.local()).ToLocalChecked()->Value());
5287 CHECK_EQ(0, obj->ToInt32(env.local()).ToLocalChecked()->Value());
4696 CHECK(0u == 5288 CHECK(0u ==
4697 obj->ToUint32(isolate)->Value()); // NOLINT - no CHECK_EQ for unsigned. 5289 obj->ToUint32(env.local())
5290 .ToLocalChecked()
5291 ->Value()); // NOLINT - no CHECK_EQ for unsigned.
4698 // Large number. 5292 // Large number.
4699 CompileRun("var obj = -1234567890123;"); 5293 CompileRun("var obj = -1234567890123;");
4700 obj = env->Global()->Get(v8_str("obj")); 5294 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4701 CHECK_EQ(-1234567890123.0, obj->ToNumber(isolate)->Value()); 5295 CHECK_EQ(-1234567890123.0,
4702 CHECK_EQ(-1912276171, obj->ToInt32(isolate)->Value()); 5296 obj->ToNumber(env.local()).ToLocalChecked()->Value());
4703 CHECK(2382691125u == obj->ToUint32(isolate)->Value()); // NOLINT 5297 CHECK_EQ(-1912276171, obj->ToInt32(env.local()).ToLocalChecked()->Value());
5298 CHECK(2382691125u ==
5299 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4704 // Small positive integer. 5300 // Small positive integer.
4705 CompileRun("var obj = 42;"); 5301 CompileRun("var obj = 42;");
4706 obj = env->Global()->Get(v8_str("obj")); 5302 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4707 CHECK_EQ(42.0, obj->ToNumber(isolate)->Value()); 5303 CHECK_EQ(42.0, obj->ToNumber(env.local()).ToLocalChecked()->Value());
4708 CHECK_EQ(42, obj->ToInt32(isolate)->Value()); 5304 CHECK_EQ(42, obj->ToInt32(env.local()).ToLocalChecked()->Value());
4709 CHECK(42u == obj->ToUint32(isolate)->Value()); // NOLINT 5305 CHECK(42u == obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4710 // Negative integer. 5306 // Negative integer.
4711 CompileRun("var obj = -37;"); 5307 CompileRun("var obj = -37;");
4712 obj = env->Global()->Get(v8_str("obj")); 5308 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4713 CHECK_EQ(-37.0, obj->ToNumber(isolate)->Value()); 5309 CHECK_EQ(-37.0, obj->ToNumber(env.local()).ToLocalChecked()->Value());
4714 CHECK_EQ(-37, obj->ToInt32(isolate)->Value()); 5310 CHECK_EQ(-37, obj->ToInt32(env.local()).ToLocalChecked()->Value());
4715 CHECK(4294967259u == obj->ToUint32(isolate)->Value()); // NOLINT 5311 CHECK(4294967259u ==
5312 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4716 // Positive non-int32 integer. 5313 // Positive non-int32 integer.
4717 CompileRun("var obj = 0x81234567;"); 5314 CompileRun("var obj = 0x81234567;");
4718 obj = env->Global()->Get(v8_str("obj")); 5315 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4719 CHECK_EQ(2166572391.0, obj->ToNumber(isolate)->Value()); 5316 CHECK_EQ(2166572391.0, obj->ToNumber(env.local()).ToLocalChecked()->Value());
4720 CHECK_EQ(-2128394905, obj->ToInt32(isolate)->Value()); 5317 CHECK_EQ(-2128394905, obj->ToInt32(env.local()).ToLocalChecked()->Value());
4721 CHECK(2166572391u == obj->ToUint32(isolate)->Value()); // NOLINT 5318 CHECK(2166572391u ==
5319 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4722 // Fraction. 5320 // Fraction.
4723 CompileRun("var obj = 42.3;"); 5321 CompileRun("var obj = 42.3;");
4724 obj = env->Global()->Get(v8_str("obj")); 5322 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4725 CHECK_EQ(42.3, obj->ToNumber(isolate)->Value()); 5323 CHECK_EQ(42.3, obj->ToNumber(env.local()).ToLocalChecked()->Value());
4726 CHECK_EQ(42, obj->ToInt32(isolate)->Value()); 5324 CHECK_EQ(42, obj->ToInt32(env.local()).ToLocalChecked()->Value());
4727 CHECK(42u == obj->ToUint32(isolate)->Value()); // NOLINT 5325 CHECK(42u == obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4728 // Large negative fraction. 5326 // Large negative fraction.
4729 CompileRun("var obj = -5726623061.75;"); 5327 CompileRun("var obj = -5726623061.75;");
4730 obj = env->Global()->Get(v8_str("obj")); 5328 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4731 CHECK_EQ(-5726623061.75, obj->ToNumber(isolate)->Value()); 5329 CHECK_EQ(-5726623061.75,
4732 CHECK_EQ(-1431655765, obj->ToInt32(isolate)->Value()); 5330 obj->ToNumber(env.local()).ToLocalChecked()->Value());
4733 CHECK(2863311531u == obj->ToUint32(isolate)->Value()); // NOLINT 5331 CHECK_EQ(-1431655765, obj->ToInt32(env.local()).ToLocalChecked()->Value());
5332 CHECK(2863311531u ==
5333 obj->ToUint32(env.local()).ToLocalChecked()->Value()); // NOLINT
4734 } 5334 }
4735 5335
4736 5336
4737 THREADED_TEST(isNumberType) { 5337 THREADED_TEST(isNumberType) {
4738 LocalContext env; 5338 LocalContext env;
4739 v8::HandleScope scope(env->GetIsolate()); 5339 v8::HandleScope scope(env->GetIsolate());
4740 // Very large number. 5340 // Very large number.
4741 CompileRun("var obj = Math.pow(2,32) * 1237;"); 5341 CompileRun("var obj = Math.pow(2,32) * 1237;");
4742 Local<Value> obj = env->Global()->Get(v8_str("obj")); 5342 Local<Value> obj =
5343 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4743 CHECK(!obj->IsInt32()); 5344 CHECK(!obj->IsInt32());
4744 CHECK(!obj->IsUint32()); 5345 CHECK(!obj->IsUint32());
4745 // Large negative number. 5346 // Large negative number.
4746 CompileRun("var obj = -1234567890123;"); 5347 CompileRun("var obj = -1234567890123;");
4747 obj = env->Global()->Get(v8_str("obj")); 5348 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4748 CHECK(!obj->IsInt32()); 5349 CHECK(!obj->IsInt32());
4749 CHECK(!obj->IsUint32()); 5350 CHECK(!obj->IsUint32());
4750 // Small positive integer. 5351 // Small positive integer.
4751 CompileRun("var obj = 42;"); 5352 CompileRun("var obj = 42;");
4752 obj = env->Global()->Get(v8_str("obj")); 5353 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4753 CHECK(obj->IsInt32()); 5354 CHECK(obj->IsInt32());
4754 CHECK(obj->IsUint32()); 5355 CHECK(obj->IsUint32());
4755 // Negative integer. 5356 // Negative integer.
4756 CompileRun("var obj = -37;"); 5357 CompileRun("var obj = -37;");
4757 obj = env->Global()->Get(v8_str("obj")); 5358 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4758 CHECK(obj->IsInt32()); 5359 CHECK(obj->IsInt32());
4759 CHECK(!obj->IsUint32()); 5360 CHECK(!obj->IsUint32());
4760 // Positive non-int32 integer. 5361 // Positive non-int32 integer.
4761 CompileRun("var obj = 0x81234567;"); 5362 CompileRun("var obj = 0x81234567;");
4762 obj = env->Global()->Get(v8_str("obj")); 5363 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4763 CHECK(!obj->IsInt32()); 5364 CHECK(!obj->IsInt32());
4764 CHECK(obj->IsUint32()); 5365 CHECK(obj->IsUint32());
4765 // Fraction. 5366 // Fraction.
4766 CompileRun("var obj = 42.3;"); 5367 CompileRun("var obj = 42.3;");
4767 obj = env->Global()->Get(v8_str("obj")); 5368 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4768 CHECK(!obj->IsInt32()); 5369 CHECK(!obj->IsInt32());
4769 CHECK(!obj->IsUint32()); 5370 CHECK(!obj->IsUint32());
4770 // Large negative fraction. 5371 // Large negative fraction.
4771 CompileRun("var obj = -5726623061.75;"); 5372 CompileRun("var obj = -5726623061.75;");
4772 obj = env->Global()->Get(v8_str("obj")); 5373 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4773 CHECK(!obj->IsInt32()); 5374 CHECK(!obj->IsInt32());
4774 CHECK(!obj->IsUint32()); 5375 CHECK(!obj->IsUint32());
4775 // Positive zero 5376 // Positive zero
4776 CompileRun("var obj = 0.0;"); 5377 CompileRun("var obj = 0.0;");
4777 obj = env->Global()->Get(v8_str("obj")); 5378 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4778 CHECK(obj->IsInt32()); 5379 CHECK(obj->IsInt32());
4779 CHECK(obj->IsUint32()); 5380 CHECK(obj->IsUint32());
4780 // Positive zero 5381 // Positive zero
4781 CompileRun("var obj = -0.0;"); 5382 CompileRun("var obj = -0.0;");
4782 obj = env->Global()->Get(v8_str("obj")); 5383 obj = env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4783 CHECK(!obj->IsInt32()); 5384 CHECK(!obj->IsInt32());
4784 CHECK(!obj->IsUint32()); 5385 CHECK(!obj->IsUint32());
4785 } 5386 }
4786 5387
4787 5388
5389 static void CheckUncle(v8::TryCatch* try_catch) {
5390 CHECK(try_catch->HasCaught());
5391 String::Utf8Value str_value(try_catch->Exception());
5392 CHECK_EQ(0, strcmp(*str_value, "uncle?"));
5393 try_catch->Reset();
5394 }
5395
5396
4788 THREADED_TEST(ConversionException) { 5397 THREADED_TEST(ConversionException) {
4789 LocalContext env; 5398 LocalContext env;
4790 v8::Isolate* isolate = env->GetIsolate(); 5399 v8::Isolate* isolate = env->GetIsolate();
4791 v8::HandleScope scope(isolate); 5400 v8::HandleScope scope(isolate);
4792 CompileRun( 5401 CompileRun(
4793 "function TestClass() { };" 5402 "function TestClass() { };"
4794 "TestClass.prototype.toString = function () { throw 'uncle?'; };" 5403 "TestClass.prototype.toString = function () { throw 'uncle?'; };"
4795 "var obj = new TestClass();"); 5404 "var obj = new TestClass();");
4796 Local<Value> obj = env->Global()->Get(v8_str("obj")); 5405 Local<Value> obj =
5406 env->Global()->Get(env.local(), v8_str("obj")).ToLocalChecked();
4797 5407
4798 v8::TryCatch try_catch(isolate); 5408 v8::TryCatch try_catch(isolate);
4799 5409
4800 Local<Value> to_string_result = obj->ToString(isolate); 5410 CHECK(obj->ToString(env.local()).IsEmpty());
4801 CHECK(to_string_result.IsEmpty());
4802 CheckUncle(&try_catch); 5411 CheckUncle(&try_catch);
4803 5412
4804 Local<Value> to_number_result = obj->ToNumber(isolate); 5413 CHECK(obj->ToNumber(env.local()).IsEmpty());
4805 CHECK(to_number_result.IsEmpty());
4806 CheckUncle(&try_catch); 5414 CheckUncle(&try_catch);
4807 5415
4808 Local<Value> to_integer_result = obj->ToInteger(isolate); 5416 CHECK(obj->ToInteger(env.local()).IsEmpty());
4809 CHECK(to_integer_result.IsEmpty());
4810 CheckUncle(&try_catch); 5417 CheckUncle(&try_catch);
4811 5418
4812 Local<Value> to_uint32_result = obj->ToUint32(isolate); 5419 CHECK(obj->ToUint32(env.local()).IsEmpty());
4813 CHECK(to_uint32_result.IsEmpty());
4814 CheckUncle(&try_catch); 5420 CheckUncle(&try_catch);
4815 5421
4816 Local<Value> to_int32_result = obj->ToInt32(isolate); 5422 CHECK(obj->ToInt32(env.local()).IsEmpty());
4817 CHECK(to_int32_result.IsEmpty());
4818 CheckUncle(&try_catch); 5423 CheckUncle(&try_catch);
4819 5424
4820 Local<Value> to_object_result = v8::Undefined(isolate)->ToObject(isolate); 5425 CHECK(v8::Undefined(isolate)->ToObject(env.local()).IsEmpty());
4821 CHECK(to_object_result.IsEmpty());
4822 CHECK(try_catch.HasCaught()); 5426 CHECK(try_catch.HasCaught());
4823 try_catch.Reset(); 5427 try_catch.Reset();
4824 5428
4825 int32_t int32_value = obj->Int32Value(); 5429 CHECK(obj->Int32Value(env.local()).IsNothing());
4826 CHECK_EQ(0, int32_value);
4827 CheckUncle(&try_catch); 5430 CheckUncle(&try_catch);
4828 5431
4829 uint32_t uint32_value = obj->Uint32Value(); 5432 CHECK(obj->Uint32Value(env.local()).IsNothing());
4830 CHECK_EQ(0u, uint32_value);
4831 CheckUncle(&try_catch); 5433 CheckUncle(&try_catch);
4832 5434
4833 double number_value = obj->NumberValue(); 5435 CHECK(obj->NumberValue(env.local()).IsNothing());
4834 CHECK(std::isnan(number_value));
4835 CheckUncle(&try_catch); 5436 CheckUncle(&try_catch);
4836 5437
4837 int64_t integer_value = obj->IntegerValue(); 5438 CHECK(obj->IntegerValue(env.local()).IsNothing());
4838 CHECK_EQ(0, integer_value);
4839 CheckUncle(&try_catch); 5439 CheckUncle(&try_catch);
4840 } 5440 }
4841 5441
4842 5442
4843 void ThrowFromC(const v8::FunctionCallbackInfo<v8::Value>& args) { 5443 void ThrowFromC(const v8::FunctionCallbackInfo<v8::Value>& args) {
4844 ApiTestFuzzer::Fuzz(); 5444 ApiTestFuzzer::Fuzz();
4845 args.GetIsolate()->ThrowException(v8_str("konto")); 5445 args.GetIsolate()->ThrowException(v8_str("konto"));
4846 } 5446 }
4847 5447
4848 5448
4849 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) { 5449 void CCatcher(const v8::FunctionCallbackInfo<v8::Value>& args) {
4850 if (args.Length() < 1) { 5450 if (args.Length() < 1) {
4851 args.GetReturnValue().Set(false); 5451 args.GetReturnValue().Set(false);
4852 return; 5452 return;
4853 } 5453 }
4854 v8::HandleScope scope(args.GetIsolate()); 5454 v8::HandleScope scope(args.GetIsolate());
4855 v8::TryCatch try_catch(args.GetIsolate()); 5455 v8::TryCatch try_catch(args.GetIsolate());
4856 Local<Value> result = CompileRun(args[0]->ToString(args.GetIsolate())); 5456 Local<Value> result =
5457 CompileRun(args[0]
5458 ->ToString(args.GetIsolate()->GetCurrentContext())
5459 .ToLocalChecked());
4857 CHECK(!try_catch.HasCaught() || result.IsEmpty()); 5460 CHECK(!try_catch.HasCaught() || result.IsEmpty());
4858 args.GetReturnValue().Set(try_catch.HasCaught()); 5461 args.GetReturnValue().Set(try_catch.HasCaught());
4859 } 5462 }
4860 5463
4861 5464
4862 THREADED_TEST(APICatch) { 5465 THREADED_TEST(APICatch) {
4863 v8::Isolate* isolate = CcTest::isolate(); 5466 v8::Isolate* isolate = CcTest::isolate();
4864 v8::HandleScope scope(isolate); 5467 v8::HandleScope scope(isolate);
4865 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5468 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4866 templ->Set(v8_str("ThrowFromC"), 5469 templ->Set(v8_str("ThrowFromC"),
4867 v8::FunctionTemplate::New(isolate, ThrowFromC)); 5470 v8::FunctionTemplate::New(isolate, ThrowFromC));
4868 LocalContext context(0, templ); 5471 LocalContext context(0, templ);
4869 CompileRun( 5472 CompileRun(
4870 "var thrown = false;" 5473 "var thrown = false;"
4871 "try {" 5474 "try {"
4872 " ThrowFromC();" 5475 " ThrowFromC();"
4873 "} catch (e) {" 5476 "} catch (e) {"
4874 " thrown = true;" 5477 " thrown = true;"
4875 "}"); 5478 "}");
4876 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); 5479 Local<Value> thrown = context->Global()
4877 CHECK(thrown->BooleanValue()); 5480 ->Get(context.local(), v8_str("thrown"))
5481 .ToLocalChecked();
5482 CHECK(thrown->BooleanValue(context.local()).FromJust());
4878 } 5483 }
4879 5484
4880 5485
4881 THREADED_TEST(APIThrowTryCatch) { 5486 THREADED_TEST(APIThrowTryCatch) {
4882 v8::Isolate* isolate = CcTest::isolate(); 5487 v8::Isolate* isolate = CcTest::isolate();
4883 v8::HandleScope scope(isolate); 5488 v8::HandleScope scope(isolate);
4884 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5489 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4885 templ->Set(v8_str("ThrowFromC"), 5490 templ->Set(v8_str("ThrowFromC"),
4886 v8::FunctionTemplate::New(isolate, ThrowFromC)); 5491 v8::FunctionTemplate::New(isolate, ThrowFromC));
4887 LocalContext context(0, templ); 5492 LocalContext context(0, templ);
(...skipping 21 matching lines...) Expand all
4909 " try {" 5514 " try {"
4910 " CCatcher('throw 7;');" 5515 " CCatcher('throw 7;');"
4911 " } finally {" 5516 " } finally {"
4912 " }" 5517 " }"
4913 "} catch (e) {" 5518 "} catch (e) {"
4914 "}"); 5519 "}");
4915 CHECK(result->IsTrue()); 5520 CHECK(result->IsTrue());
4916 } 5521 }
4917 5522
4918 5523
4919 static void check_reference_error_message(v8::Handle<v8::Message> message, 5524 static void check_reference_error_message(v8::Local<v8::Message> message,
4920 v8::Handle<v8::Value> data) { 5525 v8::Local<v8::Value> data) {
4921 const char* reference_error = "Uncaught ReferenceError: asdf is not defined"; 5526 const char* reference_error = "Uncaught ReferenceError: asdf is not defined";
4922 CHECK(message->Get()->Equals(v8_str(reference_error))); 5527 CHECK(message->Get()
5528 ->Equals(CcTest::isolate()->GetCurrentContext(),
5529 v8_str(reference_error))
5530 .FromJust());
4923 } 5531 }
4924 5532
4925 5533
4926 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { 5534 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) {
4927 ApiTestFuzzer::Fuzz(); 5535 ApiTestFuzzer::Fuzz();
4928 CHECK(false); 5536 CHECK(false);
4929 } 5537 }
4930 5538
4931 5539
4932 // Test that overwritten methods are not invoked on uncaught exception 5540 // Test that overwritten methods are not invoked on uncaught exception
4933 // formatting. However, they are invoked when performing normal error 5541 // formatting. However, they are invoked when performing normal error
4934 // string conversions. 5542 // string conversions.
4935 TEST(APIThrowMessageOverwrittenToString) { 5543 TEST(APIThrowMessageOverwrittenToString) {
4936 v8::Isolate* isolate = CcTest::isolate(); 5544 v8::Isolate* isolate = CcTest::isolate();
4937 v8::HandleScope scope(isolate); 5545 v8::HandleScope scope(isolate);
4938 v8::V8::AddMessageListener(check_reference_error_message); 5546 isolate->AddMessageListener(check_reference_error_message);
4939 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5547 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
4940 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail)); 5548 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail));
4941 LocalContext context(NULL, templ); 5549 LocalContext context(NULL, templ);
4942 CompileRun("asdf;"); 5550 CompileRun("asdf;");
4943 CompileRun( 5551 CompileRun(
4944 "var limit = {};" 5552 "var limit = {};"
4945 "limit.valueOf = fail;" 5553 "limit.valueOf = fail;"
4946 "Error.stackTraceLimit = limit;"); 5554 "Error.stackTraceLimit = limit;");
4947 CompileRun("asdf"); 5555 CompileRun("asdf");
4948 CompileRun("Array.prototype.pop = fail;"); 5556 CompileRun("Array.prototype.pop = fail;");
4949 CompileRun("Object.prototype.hasOwnProperty = fail;"); 5557 CompileRun("Object.prototype.hasOwnProperty = fail;");
4950 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); 5558 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }");
4951 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); 5559 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }");
4952 CompileRun("String.prototype.toString = function f() { return 'Yikes'; }"); 5560 CompileRun("String.prototype.toString = function f() { return 'Yikes'; }");
4953 CompileRun( 5561 CompileRun(
4954 "ReferenceError.prototype.toString =" 5562 "ReferenceError.prototype.toString ="
4955 " function() { return 'Whoops' }"); 5563 " function() { return 'Whoops' }");
4956 CompileRun("asdf;"); 5564 CompileRun("asdf;");
4957 CompileRun("ReferenceError.prototype.constructor.name = void 0;"); 5565 CompileRun("ReferenceError.prototype.constructor.name = void 0;");
4958 CompileRun("asdf;"); 5566 CompileRun("asdf;");
4959 CompileRun("ReferenceError.prototype.constructor = void 0;"); 5567 CompileRun("ReferenceError.prototype.constructor = void 0;");
4960 CompileRun("asdf;"); 5568 CompileRun("asdf;");
4961 CompileRun("ReferenceError.prototype.__proto__ = new Object();"); 5569 CompileRun("ReferenceError.prototype.__proto__ = new Object();");
4962 CompileRun("asdf;"); 5570 CompileRun("asdf;");
4963 CompileRun("ReferenceError.prototype = new Object();"); 5571 CompileRun("ReferenceError.prototype = new Object();");
4964 CompileRun("asdf;"); 5572 CompileRun("asdf;");
4965 v8::Handle<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }"); 5573 v8::Local<Value> string = CompileRun("try { asdf; } catch(e) { e + ''; }");
4966 CHECK(string->Equals(v8_str("Whoops"))); 5574 CHECK(string->Equals(context.local(), v8_str("Whoops")).FromJust());
4967 CompileRun( 5575 CompileRun(
4968 "ReferenceError.prototype.constructor = new Object();" 5576 "ReferenceError.prototype.constructor = new Object();"
4969 "ReferenceError.prototype.constructor.name = 1;" 5577 "ReferenceError.prototype.constructor.name = 1;"
4970 "Number.prototype.toString = function() { return 'Whoops'; };" 5578 "Number.prototype.toString = function() { return 'Whoops'; };"
4971 "ReferenceError.prototype.toString = Object.prototype.toString;"); 5579 "ReferenceError.prototype.toString = Object.prototype.toString;");
4972 CompileRun("asdf;"); 5580 CompileRun("asdf;");
4973 v8::V8::RemoveMessageListeners(check_reference_error_message); 5581 isolate->RemoveMessageListeners(check_reference_error_message);
4974 } 5582 }
4975 5583
4976 5584
4977 static void check_custom_error_tostring(v8::Handle<v8::Message> message, 5585 static void check_custom_error_tostring(v8::Local<v8::Message> message,
4978 v8::Handle<v8::Value> data) { 5586 v8::Local<v8::Value> data) {
4979 const char* uncaught_error = "Uncaught MyError toString"; 5587 const char* uncaught_error = "Uncaught MyError toString";
4980 CHECK(message->Get()->Equals(v8_str(uncaught_error))); 5588 CHECK(message->Get()
5589 ->Equals(CcTest::isolate()->GetCurrentContext(),
5590 v8_str(uncaught_error))
5591 .FromJust());
4981 } 5592 }
4982 5593
4983 5594
4984 TEST(CustomErrorToString) { 5595 TEST(CustomErrorToString) {
4985 LocalContext context; 5596 LocalContext context;
4986 v8::HandleScope scope(context->GetIsolate()); 5597 v8::HandleScope scope(context->GetIsolate());
4987 v8::V8::AddMessageListener(check_custom_error_tostring); 5598 context->GetIsolate()->AddMessageListener(check_custom_error_tostring);
4988 CompileRun( 5599 CompileRun(
4989 "function MyError(name, message) { " 5600 "function MyError(name, message) { "
4990 " this.name = name; " 5601 " this.name = name; "
4991 " this.message = message; " 5602 " this.message = message; "
4992 "} " 5603 "} "
4993 "MyError.prototype = Object.create(Error.prototype); " 5604 "MyError.prototype = Object.create(Error.prototype); "
4994 "MyError.prototype.toString = function() { " 5605 "MyError.prototype.toString = function() { "
4995 " return 'MyError toString'; " 5606 " return 'MyError toString'; "
4996 "}; " 5607 "}; "
4997 "throw new MyError('my name', 'my message'); "); 5608 "throw new MyError('my name', 'my message'); ");
4998 v8::V8::RemoveMessageListeners(check_custom_error_tostring); 5609 context->GetIsolate()->RemoveMessageListeners(check_custom_error_tostring);
4999 } 5610 }
5000 5611
5001 5612
5002 static void check_custom_error_message(v8::Handle<v8::Message> message, 5613 static void check_custom_error_message(v8::Local<v8::Message> message,
5003 v8::Handle<v8::Value> data) { 5614 v8::Local<v8::Value> data) {
5004 const char* uncaught_error = "Uncaught MyError: my message"; 5615 const char* uncaught_error = "Uncaught MyError: my message";
5005 printf("%s\n", *v8::String::Utf8Value(message->Get())); 5616 printf("%s\n", *v8::String::Utf8Value(message->Get()));
5006 CHECK(message->Get()->Equals(v8_str(uncaught_error))); 5617 CHECK(message->Get()
5618 ->Equals(CcTest::isolate()->GetCurrentContext(),
5619 v8_str(uncaught_error))
5620 .FromJust());
5007 } 5621 }
5008 5622
5009 5623
5010 TEST(CustomErrorMessage) { 5624 TEST(CustomErrorMessage) {
5011 LocalContext context; 5625 LocalContext context;
5012 v8::HandleScope scope(context->GetIsolate()); 5626 v8::HandleScope scope(context->GetIsolate());
5013 v8::V8::AddMessageListener(check_custom_error_message); 5627 context->GetIsolate()->AddMessageListener(check_custom_error_message);
5014 5628
5015 // Handlebars. 5629 // Handlebars.
5016 CompileRun( 5630 CompileRun(
5017 "function MyError(msg) { " 5631 "function MyError(msg) { "
5018 " this.name = 'MyError'; " 5632 " this.name = 'MyError'; "
5019 " this.message = msg; " 5633 " this.message = msg; "
5020 "} " 5634 "} "
5021 "MyError.prototype = new Error(); " 5635 "MyError.prototype = new Error(); "
5022 "throw new MyError('my message'); "); 5636 "throw new MyError('my message'); ");
5023 5637
(...skipping 15 matching lines...) Expand all
5039 5653
5040 // Object.create. 5654 // Object.create.
5041 CompileRun( 5655 CompileRun(
5042 "function MyError(msg) { " 5656 "function MyError(msg) { "
5043 " this.name = 'MyError'; " 5657 " this.name = 'MyError'; "
5044 " this.message = msg; " 5658 " this.message = msg; "
5045 "} " 5659 "} "
5046 "MyError.prototype = Object.create(Error.prototype); " 5660 "MyError.prototype = Object.create(Error.prototype); "
5047 "throw new MyError('my message'); "); 5661 "throw new MyError('my message'); ");
5048 5662
5049 v8::V8::RemoveMessageListeners(check_custom_error_message); 5663 context->GetIsolate()->RemoveMessageListeners(check_custom_error_message);
5050 } 5664 }
5051 5665
5052 5666
5053 static void check_custom_rethrowing_message(v8::Handle<v8::Message> message, 5667 static void check_custom_rethrowing_message(v8::Local<v8::Message> message,
5054 v8::Handle<v8::Value> data) { 5668 v8::Local<v8::Value> data) {
5055 const char* uncaught_error = "Uncaught exception"; 5669 const char* uncaught_error = "Uncaught exception";
5056 CHECK(message->Get()->Equals(v8_str(uncaught_error))); 5670 CHECK(message->Get()
5671 ->Equals(CcTest::isolate()->GetCurrentContext(),
5672 v8_str(uncaught_error))
5673 .FromJust());
5057 } 5674 }
5058 5675
5059 5676
5060 TEST(CustomErrorRethrowsOnToString) { 5677 TEST(CustomErrorRethrowsOnToString) {
5061 LocalContext context; 5678 LocalContext context;
5062 v8::HandleScope scope(context->GetIsolate()); 5679 v8::HandleScope scope(context->GetIsolate());
5063 v8::V8::AddMessageListener(check_custom_rethrowing_message); 5680 context->GetIsolate()->AddMessageListener(check_custom_rethrowing_message);
5064 5681
5065 CompileRun( 5682 CompileRun(
5066 "var e = { toString: function() { throw e; } };" 5683 "var e = { toString: function() { throw e; } };"
5067 "try { throw e; } finally {}"); 5684 "try { throw e; } finally {}");
5068 5685
5069 v8::V8::RemoveMessageListeners(check_custom_rethrowing_message); 5686 context->GetIsolate()->RemoveMessageListeners(
5687 check_custom_rethrowing_message);
5070 } 5688 }
5071 5689
5072 5690
5073 static void receive_message(v8::Handle<v8::Message> message, 5691 static void receive_message(v8::Local<v8::Message> message,
5074 v8::Handle<v8::Value> data) { 5692 v8::Local<v8::Value> data) {
5075 message->Get(); 5693 message->Get();
5076 message_received = true; 5694 message_received = true;
5077 } 5695 }
5078 5696
5079 5697
5080 TEST(APIThrowMessage) { 5698 TEST(APIThrowMessage) {
5081 message_received = false; 5699 message_received = false;
5082 v8::Isolate* isolate = CcTest::isolate(); 5700 v8::Isolate* isolate = CcTest::isolate();
5083 v8::HandleScope scope(isolate); 5701 v8::HandleScope scope(isolate);
5084 v8::V8::AddMessageListener(receive_message); 5702 isolate->AddMessageListener(receive_message);
5085 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5703 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5086 templ->Set(v8_str("ThrowFromC"), 5704 templ->Set(v8_str("ThrowFromC"),
5087 v8::FunctionTemplate::New(isolate, ThrowFromC)); 5705 v8::FunctionTemplate::New(isolate, ThrowFromC));
5088 LocalContext context(0, templ); 5706 LocalContext context(0, templ);
5089 CompileRun("ThrowFromC();"); 5707 CompileRun("ThrowFromC();");
5090 CHECK(message_received); 5708 CHECK(message_received);
5091 v8::V8::RemoveMessageListeners(receive_message); 5709 isolate->RemoveMessageListeners(receive_message);
5092 } 5710 }
5093 5711
5094 5712
5095 TEST(APIThrowMessageAndVerboseTryCatch) { 5713 TEST(APIThrowMessageAndVerboseTryCatch) {
5096 message_received = false; 5714 message_received = false;
5097 v8::Isolate* isolate = CcTest::isolate(); 5715 v8::Isolate* isolate = CcTest::isolate();
5098 v8::HandleScope scope(isolate); 5716 v8::HandleScope scope(isolate);
5099 v8::V8::AddMessageListener(receive_message); 5717 isolate->AddMessageListener(receive_message);
5100 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5718 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5101 templ->Set(v8_str("ThrowFromC"), 5719 templ->Set(v8_str("ThrowFromC"),
5102 v8::FunctionTemplate::New(isolate, ThrowFromC)); 5720 v8::FunctionTemplate::New(isolate, ThrowFromC));
5103 LocalContext context(0, templ); 5721 LocalContext context(0, templ);
5104 v8::TryCatch try_catch(isolate); 5722 v8::TryCatch try_catch(isolate);
5105 try_catch.SetVerbose(true); 5723 try_catch.SetVerbose(true);
5106 Local<Value> result = CompileRun("ThrowFromC();"); 5724 Local<Value> result = CompileRun("ThrowFromC();");
5107 CHECK(try_catch.HasCaught()); 5725 CHECK(try_catch.HasCaught());
5108 CHECK(result.IsEmpty()); 5726 CHECK(result.IsEmpty());
5109 CHECK(message_received); 5727 CHECK(message_received);
5110 v8::V8::RemoveMessageListeners(receive_message); 5728 isolate->RemoveMessageListeners(receive_message);
5111 } 5729 }
5112 5730
5113 5731
5114 TEST(APIStackOverflowAndVerboseTryCatch) { 5732 TEST(APIStackOverflowAndVerboseTryCatch) {
5115 message_received = false; 5733 message_received = false;
5116 LocalContext context; 5734 LocalContext context;
5117 v8::HandleScope scope(context->GetIsolate()); 5735 v8::HandleScope scope(context->GetIsolate());
5118 v8::V8::AddMessageListener(receive_message); 5736 context->GetIsolate()->AddMessageListener(receive_message);
5119 v8::TryCatch try_catch(context->GetIsolate()); 5737 v8::TryCatch try_catch(context->GetIsolate());
5120 try_catch.SetVerbose(true); 5738 try_catch.SetVerbose(true);
5121 Local<Value> result = CompileRun("function foo() { foo(); } foo();"); 5739 Local<Value> result = CompileRun("function foo() { foo(); } foo();");
5122 CHECK(try_catch.HasCaught()); 5740 CHECK(try_catch.HasCaught());
5123 CHECK(result.IsEmpty()); 5741 CHECK(result.IsEmpty());
5124 CHECK(message_received); 5742 CHECK(message_received);
5125 v8::V8::RemoveMessageListeners(receive_message); 5743 context->GetIsolate()->RemoveMessageListeners(receive_message);
5126 } 5744 }
5127 5745
5128 5746
5129 THREADED_TEST(ExternalScriptException) { 5747 THREADED_TEST(ExternalScriptException) {
5130 v8::Isolate* isolate = CcTest::isolate(); 5748 v8::Isolate* isolate = CcTest::isolate();
5131 v8::HandleScope scope(isolate); 5749 v8::HandleScope scope(isolate);
5132 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5750 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5133 templ->Set(v8_str("ThrowFromC"), 5751 templ->Set(v8_str("ThrowFromC"),
5134 v8::FunctionTemplate::New(isolate, ThrowFromC)); 5752 v8::FunctionTemplate::New(isolate, ThrowFromC));
5135 LocalContext context(0, templ); 5753 LocalContext context(0, templ);
5136 5754
5137 v8::TryCatch try_catch(isolate); 5755 v8::TryCatch try_catch(isolate);
5138 Local<Value> result = CompileRun("ThrowFromC(); throw 'panama';"); 5756 Local<Value> result = CompileRun("ThrowFromC(); throw 'panama';");
5139 CHECK(result.IsEmpty()); 5757 CHECK(result.IsEmpty());
5140 CHECK(try_catch.HasCaught()); 5758 CHECK(try_catch.HasCaught());
5141 String::Utf8Value exception_value(try_catch.Exception()); 5759 String::Utf8Value exception_value(try_catch.Exception());
5142 CHECK_EQ(0, strcmp("konto", *exception_value)); 5760 CHECK_EQ(0, strcmp("konto", *exception_value));
5143 } 5761 }
5144 5762
5145 5763
5146 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) { 5764 void CThrowCountDown(const v8::FunctionCallbackInfo<v8::Value>& args) {
5147 ApiTestFuzzer::Fuzz(); 5765 ApiTestFuzzer::Fuzz();
5148 CHECK_EQ(4, args.Length()); 5766 CHECK_EQ(4, args.Length());
5149 int count = args[0]->Int32Value(); 5767 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
5150 int cInterval = args[2]->Int32Value(); 5768 int count = args[0]->Int32Value(context).FromJust();
5769 int cInterval = args[2]->Int32Value(context).FromJust();
5151 if (count == 0) { 5770 if (count == 0) {
5152 args.GetIsolate()->ThrowException(v8_str("FromC")); 5771 args.GetIsolate()->ThrowException(v8_str("FromC"));
5153 return; 5772 return;
5154 } else { 5773 } else {
5155 Local<v8::Object> global = args.GetIsolate()->GetCurrentContext()->Global(); 5774 Local<v8::Object> global = context->Global();
5156 Local<Value> fun = global->Get(v8_str("JSThrowCountDown")); 5775 Local<Value> fun =
5157 v8::Handle<Value> argv[] = {v8_num(count - 1), args[1], args[2], args[3]}; 5776 global->Get(context, v8_str("JSThrowCountDown")).ToLocalChecked();
5777 v8::Local<Value> argv[] = {v8_num(count - 1), args[1], args[2], args[3]};
5158 if (count % cInterval == 0) { 5778 if (count % cInterval == 0) {
5159 v8::TryCatch try_catch(args.GetIsolate()); 5779 v8::TryCatch try_catch(args.GetIsolate());
5160 Local<Value> result = fun.As<Function>()->Call(global, 4, argv); 5780 Local<Value> result = fun.As<Function>()
5161 int expected = args[3]->Int32Value(); 5781 ->Call(context, global, 4, argv)
5782 .FromMaybe(Local<Value>());
5783 int expected = args[3]->Int32Value(context).FromJust();
5162 if (try_catch.HasCaught()) { 5784 if (try_catch.HasCaught()) {
5163 CHECK_EQ(expected, count); 5785 CHECK_EQ(expected, count);
5164 CHECK(result.IsEmpty()); 5786 CHECK(result.IsEmpty());
5165 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); 5787 CHECK(!CcTest::i_isolate()->has_scheduled_exception());
5166 } else { 5788 } else {
5167 CHECK_NE(expected, count); 5789 CHECK_NE(expected, count);
5168 } 5790 }
5169 args.GetReturnValue().Set(result); 5791 args.GetReturnValue().Set(result);
5170 return; 5792 return;
5171 } else { 5793 } else {
5172 args.GetReturnValue().Set(fun.As<Function>()->Call(global, 4, argv)); 5794 args.GetReturnValue().Set(fun.As<Function>()
5795 ->Call(context, global, 4, argv)
5796 .FromMaybe(v8::Local<v8::Value>()));
5173 return; 5797 return;
5174 } 5798 }
5175 } 5799 }
5176 } 5800 }
5177 5801
5178 5802
5179 void JSCheck(const v8::FunctionCallbackInfo<v8::Value>& args) { 5803 void JSCheck(const v8::FunctionCallbackInfo<v8::Value>& args) {
5180 ApiTestFuzzer::Fuzz(); 5804 ApiTestFuzzer::Fuzz();
5181 CHECK_EQ(3, args.Length()); 5805 CHECK_EQ(3, args.Length());
5182 bool equality = args[0]->BooleanValue(); 5806 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
5183 int count = args[1]->Int32Value(); 5807 bool equality = args[0]->BooleanValue(context).FromJust();
5184 int expected = args[2]->Int32Value(); 5808 int count = args[1]->Int32Value(context).FromJust();
5809 int expected = args[2]->Int32Value(context).FromJust();
5185 if (equality) { 5810 if (equality) {
5186 CHECK_EQ(count, expected); 5811 CHECK_EQ(count, expected);
5187 } else { 5812 } else {
5188 CHECK_NE(count, expected); 5813 CHECK_NE(count, expected);
5189 } 5814 }
5190 } 5815 }
5191 5816
5192 5817
5193 THREADED_TEST(EvalInTryFinally) { 5818 THREADED_TEST(EvalInTryFinally) {
5194 LocalContext context; 5819 LocalContext context;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5245 " expected);" 5870 " expected);"
5246 " check(false, count, expected);" 5871 " check(false, count, expected);"
5247 " return value;" 5872 " return value;"
5248 " } catch (e) {" 5873 " } catch (e) {"
5249 " check(true, count, expected);" 5874 " check(true, count, expected);"
5250 " }" 5875 " }"
5251 " } else {" 5876 " } else {"
5252 " return CThrowCountDown(count - 1, jsInterval, cInterval, expected);" 5877 " return CThrowCountDown(count - 1, jsInterval, cInterval, expected);"
5253 " }" 5878 " }"
5254 "}"); 5879 "}");
5255 Local<Function> fun = 5880 Local<Function> fun = Local<Function>::Cast(
5256 Local<Function>::Cast(context->Global()->Get(v8_str("JSThrowCountDown"))); 5881 context->Global()
5882 ->Get(context.local(), v8_str("JSThrowCountDown"))
5883 .ToLocalChecked());
5257 5884
5258 const int argc = 4; 5885 const int argc = 4;
5259 // count jsInterval cInterval expected 5886 // count jsInterval cInterval expected
5260 5887
5261 // *JS[4] *C[3] @JS[2] C[1] JS[0] 5888 // *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)}; 5889 v8::Local<Value> a0[argc] = {v8_num(4), v8_num(2), v8_num(3), v8_num(2)};
5263 fun->Call(fun, argc, a0); 5890 fun->Call(context.local(), fun, argc, a0).ToLocalChecked();
5264 5891
5265 // JS[5] *C[4] JS[3] @C[2] JS[1] C[0] 5892 // 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)}; 5893 v8::Local<Value> a1[argc] = {v8_num(5), v8_num(6), v8_num(1), v8_num(2)};
5267 fun->Call(fun, argc, a1); 5894 fun->Call(context.local(), fun, argc, a1).ToLocalChecked();
5268 5895
5269 // JS[6] @C[5] JS[4] C[3] JS[2] C[1] JS[0] 5896 // 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)}; 5897 v8::Local<Value> a2[argc] = {v8_num(6), v8_num(7), v8_num(5), v8_num(5)};
5271 fun->Call(fun, argc, a2); 5898 fun->Call(context.local(), fun, argc, a2).ToLocalChecked();
5272 5899
5273 // @JS[6] C[5] JS[4] C[3] JS[2] C[1] JS[0] 5900 // @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)}; 5901 v8::Local<Value> a3[argc] = {v8_num(6), v8_num(6), v8_num(7), v8_num(6)};
5275 fun->Call(fun, argc, a3); 5902 fun->Call(context.local(), fun, argc, a3).ToLocalChecked();
5276 5903
5277 // 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]
5278 v8::Handle<Value> a4[argc] = {v8_num(6), v8_num(4), v8_num(5), v8_num(4)}; 5905 v8::Local<Value> a4[argc] = {v8_num(6), v8_num(4), v8_num(5), v8_num(4)};
5279 fun->Call(fun, argc, a4); 5906 fun->Call(context.local(), fun, argc, a4).ToLocalChecked();
5280 5907
5281 // 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]
5282 v8::Handle<Value> a5[argc] = {v8_num(6), v8_num(4), v8_num(3), v8_num(3)}; 5909 v8::Local<Value> a5[argc] = {v8_num(6), v8_num(4), v8_num(3), v8_num(3)};
5283 fun->Call(fun, argc, a5); 5910 fun->Call(context.local(), fun, argc, a5).ToLocalChecked();
5284 } 5911 }
5285 5912
5286 5913
5287 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { 5914 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) {
5288 ApiTestFuzzer::Fuzz(); 5915 ApiTestFuzzer::Fuzz();
5289 CHECK_EQ(1, args.Length()); 5916 CHECK_EQ(1, args.Length());
5290 args.GetIsolate()->ThrowException(args[0]); 5917 args.GetIsolate()->ThrowException(args[0]);
5291 } 5918 }
5292 5919
5293 5920
5294 THREADED_TEST(ThrowValues) { 5921 THREADED_TEST(ThrowValues) {
5295 v8::Isolate* isolate = CcTest::isolate(); 5922 v8::Isolate* isolate = CcTest::isolate();
5296 v8::HandleScope scope(isolate); 5923 v8::HandleScope scope(isolate);
5297 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 5924 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5298 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue)); 5925 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue));
5299 LocalContext context(0, templ); 5926 LocalContext context(0, templ);
5300 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 5927 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast(
5301 "function Run(obj) {" 5928 CompileRun("function Run(obj) {"
5302 " try {" 5929 " try {"
5303 " Throw(obj);" 5930 " Throw(obj);"
5304 " } catch (e) {" 5931 " } catch (e) {"
5305 " return e;" 5932 " return e;"
5306 " }" 5933 " }"
5307 " return 'no exception';" 5934 " return 'no exception';"
5308 "}" 5935 "}"
5309 "[Run('str'), Run(1), Run(0), Run(null), Run(void 0)];")); 5936 "[Run('str'), Run(1), Run(0), Run(null), Run(void 0)];"));
5310 CHECK_EQ(5u, result->Length()); 5937 CHECK_EQ(5u, result->Length());
5311 CHECK(result->Get(v8::Integer::New(isolate, 0))->IsString()); 5938 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 0))
5312 CHECK(result->Get(v8::Integer::New(isolate, 1))->IsNumber()); 5939 .ToLocalChecked()
5313 CHECK_EQ(1, result->Get(v8::Integer::New(isolate, 1))->Int32Value()); 5940 ->IsString());
5314 CHECK(result->Get(v8::Integer::New(isolate, 2))->IsNumber()); 5941 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 1))
5315 CHECK_EQ(0, result->Get(v8::Integer::New(isolate, 2))->Int32Value()); 5942 .ToLocalChecked()
5316 CHECK(result->Get(v8::Integer::New(isolate, 3))->IsNull()); 5943 ->IsNumber());
5317 CHECK(result->Get(v8::Integer::New(isolate, 4))->IsUndefined()); 5944 CHECK_EQ(1, result->Get(context.local(), v8::Integer::New(isolate, 1))
5945 .ToLocalChecked()
5946 ->Int32Value(context.local())
5947 .FromJust());
5948 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 2))
5949 .ToLocalChecked()
5950 ->IsNumber());
5951 CHECK_EQ(0, result->Get(context.local(), v8::Integer::New(isolate, 2))
5952 .ToLocalChecked()
5953 ->Int32Value(context.local())
5954 .FromJust());
5955 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 3))
5956 .ToLocalChecked()
5957 ->IsNull());
5958 CHECK(result->Get(context.local(), v8::Integer::New(isolate, 4))
5959 .ToLocalChecked()
5960 ->IsUndefined());
5318 } 5961 }
5319 5962
5320 5963
5321 THREADED_TEST(CatchZero) { 5964 THREADED_TEST(CatchZero) {
5322 LocalContext context; 5965 LocalContext context;
5323 v8::HandleScope scope(context->GetIsolate()); 5966 v8::HandleScope scope(context->GetIsolate());
5324 v8::TryCatch try_catch(context->GetIsolate()); 5967 v8::TryCatch try_catch(context->GetIsolate());
5325 CHECK(!try_catch.HasCaught()); 5968 CHECK(!try_catch.HasCaught());
5326 CompileRun("throw 10"); 5969 CompileRun("throw 10");
5327 CHECK(try_catch.HasCaught()); 5970 CHECK(try_catch.HasCaught());
5328 CHECK_EQ(10, try_catch.Exception()->Int32Value()); 5971 CHECK_EQ(10, try_catch.Exception()->Int32Value(context.local()).FromJust());
5329 try_catch.Reset(); 5972 try_catch.Reset();
5330 CHECK(!try_catch.HasCaught()); 5973 CHECK(!try_catch.HasCaught());
5331 CompileRun("throw 0"); 5974 CompileRun("throw 0");
5332 CHECK(try_catch.HasCaught()); 5975 CHECK(try_catch.HasCaught());
5333 CHECK_EQ(0, try_catch.Exception()->Int32Value()); 5976 CHECK_EQ(0, try_catch.Exception()->Int32Value(context.local()).FromJust());
5334 } 5977 }
5335 5978
5336 5979
5337 THREADED_TEST(CatchExceptionFromWith) { 5980 THREADED_TEST(CatchExceptionFromWith) {
5338 LocalContext context; 5981 LocalContext context;
5339 v8::HandleScope scope(context->GetIsolate()); 5982 v8::HandleScope scope(context->GetIsolate());
5340 v8::TryCatch try_catch(context->GetIsolate()); 5983 v8::TryCatch try_catch(context->GetIsolate());
5341 CHECK(!try_catch.HasCaught()); 5984 CHECK(!try_catch.HasCaught());
5342 CompileRun("var o = {}; with (o) { throw 42; }"); 5985 CompileRun("var o = {}; with (o) { throw 42; }");
5343 CHECK(try_catch.HasCaught()); 5986 CHECK(try_catch.HasCaught());
(...skipping 13 matching lines...) Expand all
5357 6000
5358 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { 6001 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) {
5359 v8::TryCatch try_catch(args.GetIsolate()); 6002 v8::TryCatch try_catch(args.GetIsolate());
5360 } 6003 }
5361 6004
5362 6005
5363 THREADED_TEST(TryCatchAndFinally) { 6006 THREADED_TEST(TryCatchAndFinally) {
5364 LocalContext context; 6007 LocalContext context;
5365 v8::Isolate* isolate = context->GetIsolate(); 6008 v8::Isolate* isolate = context->GetIsolate();
5366 v8::HandleScope scope(isolate); 6009 v8::HandleScope scope(isolate);
5367 context->Global()->Set( 6010 CHECK(context->Global()
5368 v8_str("native_with_try_catch"), 6011 ->Set(context.local(), v8_str("native_with_try_catch"),
5369 v8::FunctionTemplate::New(isolate, WithTryCatch)->GetFunction()); 6012 v8::FunctionTemplate::New(isolate, WithTryCatch)
6013 ->GetFunction(context.local())
6014 .ToLocalChecked())
6015 .FromJust());
5370 v8::TryCatch try_catch(isolate); 6016 v8::TryCatch try_catch(isolate);
5371 CHECK(!try_catch.HasCaught()); 6017 CHECK(!try_catch.HasCaught());
5372 CompileRun( 6018 CompileRun(
5373 "try {\n" 6019 "try {\n"
5374 " throw new Error('a');\n" 6020 " throw new Error('a');\n"
5375 "} finally {\n" 6021 "} finally {\n"
5376 " native_with_try_catch();\n" 6022 " native_with_try_catch();\n"
5377 "}\n"); 6023 "}\n");
5378 CHECK(try_catch.HasCaught()); 6024 CHECK(try_catch.HasCaught());
5379 } 6025 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
5423 v8::TryCatch try_catch(context->GetIsolate()); 6069 v8::TryCatch try_catch(context->GetIsolate());
5424 TryCatchNested2Helper(5); 6070 TryCatchNested2Helper(5);
5425 CHECK(try_catch.HasCaught()); 6071 CHECK(try_catch.HasCaught());
5426 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E2")); 6072 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(try_catch.Exception()), "E2"));
5427 } 6073 }
5428 } 6074 }
5429 6075
5430 6076
5431 void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) { 6077 void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) {
5432 CHECK(try_catch->HasCaught()); 6078 CHECK(try_catch->HasCaught());
5433 Handle<Message> message = try_catch->Message(); 6079 Local<Message> message = try_catch->Message();
5434 Handle<Value> resource = message->GetScriptOrigin().ResourceName(); 6080 Local<Value> resource = message->GetScriptOrigin().ResourceName();
5435 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(resource), "inner")); 6081 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(resource), "inner"));
5436 CHECK_EQ(0, 6082 CHECK_EQ(0,
5437 strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a")); 6083 strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a"));
5438 CHECK_EQ(1, message->GetLineNumber()); 6084 CHECK_EQ(1, message->GetLineNumber(CcTest::isolate()->GetCurrentContext())
5439 CHECK_EQ(0, message->GetStartColumn()); 6085 .FromJust());
6086 CHECK_EQ(0, message->GetStartColumn(CcTest::isolate()->GetCurrentContext())
6087 .FromJust());
5440 } 6088 }
5441 6089
5442 6090
5443 void TryCatchMixedNestingHelper( 6091 void TryCatchMixedNestingHelper(
5444 const v8::FunctionCallbackInfo<v8::Value>& args) { 6092 const v8::FunctionCallbackInfo<v8::Value>& args) {
5445 ApiTestFuzzer::Fuzz(); 6093 ApiTestFuzzer::Fuzz();
5446 v8::TryCatch try_catch(args.GetIsolate()); 6094 v8::TryCatch try_catch(args.GetIsolate());
5447 CompileRunWithOrigin("throw new Error('a');\n", "inner", 0, 0); 6095 CompileRunWithOrigin("throw new Error('a');\n", "inner", 0, 0);
5448 CHECK(try_catch.HasCaught()); 6096 CHECK(try_catch.HasCaught());
5449 TryCatchMixedNestingCheck(&try_catch); 6097 TryCatchMixedNestingCheck(&try_catch);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
5515 CompileRun("TryCatchNativeResetHelper();"); 6163 CompileRun("TryCatchNativeResetHelper();");
5516 CHECK(!try_catch.HasCaught()); 6164 CHECK(!try_catch.HasCaught());
5517 } 6165 }
5518 6166
5519 6167
5520 THREADED_TEST(Equality) { 6168 THREADED_TEST(Equality) {
5521 LocalContext context; 6169 LocalContext context;
5522 v8::Isolate* isolate = context->GetIsolate(); 6170 v8::Isolate* isolate = context->GetIsolate();
5523 v8::HandleScope scope(context->GetIsolate()); 6171 v8::HandleScope scope(context->GetIsolate());
5524 // Check that equality works at all before relying on CHECK_EQ 6172 // Check that equality works at all before relying on CHECK_EQ
5525 CHECK(v8_str("a")->Equals(v8_str("a"))); 6173 CHECK(v8_str("a")->Equals(context.local(), v8_str("a")).FromJust());
5526 CHECK(!v8_str("a")->Equals(v8_str("b"))); 6174 CHECK(!v8_str("a")->Equals(context.local(), v8_str("b")).FromJust());
5527 6175
5528 CHECK(v8_str("a")->Equals(v8_str("a"))); 6176 CHECK(v8_str("a")->Equals(context.local(), v8_str("a")).FromJust());
5529 CHECK(!v8_str("a")->Equals(v8_str("b"))); 6177 CHECK(!v8_str("a")->Equals(context.local(), v8_str("b")).FromJust());
5530 CHECK(v8_num(1)->Equals(v8_num(1))); 6178 CHECK(v8_num(1)->Equals(context.local(), v8_num(1)).FromJust());
5531 CHECK(v8_num(1.00)->Equals(v8_num(1))); 6179 CHECK(v8_num(1.00)->Equals(context.local(), v8_num(1)).FromJust());
5532 CHECK(!v8_num(1)->Equals(v8_num(2))); 6180 CHECK(!v8_num(1)->Equals(context.local(), v8_num(2)).FromJust());
5533 6181
5534 // Assume String is not internalized. 6182 // Assume String is not internalized.
5535 CHECK(v8_str("a")->StrictEquals(v8_str("a"))); 6183 CHECK(v8_str("a")->StrictEquals(v8_str("a")));
5536 CHECK(!v8_str("a")->StrictEquals(v8_str("b"))); 6184 CHECK(!v8_str("a")->StrictEquals(v8_str("b")));
5537 CHECK(!v8_str("5")->StrictEquals(v8_num(5))); 6185 CHECK(!v8_str("5")->StrictEquals(v8_num(5)));
5538 CHECK(v8_num(1)->StrictEquals(v8_num(1))); 6186 CHECK(v8_num(1)->StrictEquals(v8_num(1)));
5539 CHECK(!v8_num(1)->StrictEquals(v8_num(2))); 6187 CHECK(!v8_num(1)->StrictEquals(v8_num(2)));
5540 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0))); 6188 CHECK(v8_num(0.0)->StrictEquals(v8_num(-0.0)));
5541 Local<Value> not_a_number = v8_num(std::numeric_limits<double>::quiet_NaN()); 6189 Local<Value> not_a_number = v8_num(std::numeric_limits<double>::quiet_NaN());
5542 CHECK(!not_a_number->StrictEquals(not_a_number)); 6190 CHECK(!not_a_number->StrictEquals(not_a_number));
5543 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate))); 6191 CHECK(v8::False(isolate)->StrictEquals(v8::False(isolate)));
5544 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate))); 6192 CHECK(!v8::False(isolate)->StrictEquals(v8::Undefined(isolate)));
5545 6193
5546 v8::Handle<v8::Object> obj = v8::Object::New(isolate); 6194 v8::Local<v8::Object> obj = v8::Object::New(isolate);
5547 v8::Persistent<v8::Object> alias(isolate, obj); 6195 v8::Persistent<v8::Object> alias(isolate, obj);
5548 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj)); 6196 CHECK(v8::Local<v8::Object>::New(isolate, alias)->StrictEquals(obj));
5549 alias.Reset(); 6197 alias.Reset();
5550 6198
5551 CHECK(v8_str("a")->SameValue(v8_str("a"))); 6199 CHECK(v8_str("a")->SameValue(v8_str("a")));
5552 CHECK(!v8_str("a")->SameValue(v8_str("b"))); 6200 CHECK(!v8_str("a")->SameValue(v8_str("b")));
5553 CHECK(!v8_str("5")->SameValue(v8_num(5))); 6201 CHECK(!v8_str("5")->SameValue(v8_num(5)));
5554 CHECK(v8_num(1)->SameValue(v8_num(1))); 6202 CHECK(v8_num(1)->SameValue(v8_num(1)));
5555 CHECK(!v8_num(1)->SameValue(v8_num(2))); 6203 CHECK(!v8_num(1)->SameValue(v8_num(2)));
5556 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0))); 6204 CHECK(!v8_num(0.0)->SameValue(v8_num(-0.0)));
5557 CHECK(not_a_number->SameValue(not_a_number)); 6205 CHECK(not_a_number->SameValue(not_a_number));
5558 CHECK(v8::False(isolate)->SameValue(v8::False(isolate))); 6206 CHECK(v8::False(isolate)->SameValue(v8::False(isolate)));
5559 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate))); 6207 CHECK(!v8::False(isolate)->SameValue(v8::Undefined(isolate)));
5560 } 6208 }
5561 6209
5562 6210
5563 THREADED_TEST(MultiRun) { 6211 THREADED_TEST(MultiRun) {
5564 LocalContext context; 6212 LocalContext context;
5565 v8::HandleScope scope(context->GetIsolate()); 6213 v8::HandleScope scope(context->GetIsolate());
5566 Local<Script> script = v8_compile("x"); 6214 Local<Script> script = v8_compile("x");
5567 for (int i = 0; i < 10; i++) script->Run(); 6215 for (int i = 0; i < 10; i++) {
6216 script->Run(context.local()).IsEmpty();
6217 }
5568 } 6218 }
5569 6219
5570 6220
5571 static void GetXValue(Local<String> name, 6221 static void GetXValue(Local<Name> name,
5572 const v8::PropertyCallbackInfo<v8::Value>& info) { 6222 const v8::PropertyCallbackInfo<v8::Value>& info) {
5573 ApiTestFuzzer::Fuzz(); 6223 ApiTestFuzzer::Fuzz();
5574 CHECK(info.Data()->Equals(v8_str("donut"))); 6224 CHECK(info.Data()
5575 CHECK(name->Equals(v8_str("x"))); 6225 ->Equals(CcTest::isolate()->GetCurrentContext(), v8_str("donut"))
6226 .FromJust());
6227 CHECK(name->Equals(CcTest::isolate()->GetCurrentContext(), v8_str("x"))
6228 .FromJust());
5576 info.GetReturnValue().Set(name); 6229 info.GetReturnValue().Set(name);
5577 } 6230 }
5578 6231
5579 6232
5580 THREADED_TEST(SimplePropertyRead) { 6233 THREADED_TEST(SimplePropertyRead) {
5581 LocalContext context; 6234 LocalContext context;
5582 v8::Isolate* isolate = context->GetIsolate(); 6235 v8::Isolate* isolate = context->GetIsolate();
5583 v8::HandleScope scope(isolate); 6236 v8::HandleScope scope(isolate);
5584 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6237 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5585 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 6238 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5586 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6239 CHECK(context->Global()
6240 ->Set(context.local(), v8_str("obj"),
6241 templ->NewInstance(context.local()).ToLocalChecked())
6242 .FromJust());
5587 Local<Script> script = v8_compile("obj.x"); 6243 Local<Script> script = v8_compile("obj.x");
5588 for (int i = 0; i < 10; i++) { 6244 for (int i = 0; i < 10; i++) {
5589 Local<Value> result = script->Run(); 6245 Local<Value> result = script->Run(context.local()).ToLocalChecked();
5590 CHECK(result->Equals(v8_str("x"))); 6246 CHECK(result->Equals(context.local(), v8_str("x")).FromJust());
5591 } 6247 }
5592 } 6248 }
5593 6249
5594 6250
5595 THREADED_TEST(DefinePropertyOnAPIAccessor) { 6251 THREADED_TEST(DefinePropertyOnAPIAccessor) {
5596 LocalContext context; 6252 LocalContext context;
5597 v8::Isolate* isolate = context->GetIsolate(); 6253 v8::Isolate* isolate = context->GetIsolate();
5598 v8::HandleScope scope(isolate); 6254 v8::HandleScope scope(isolate);
5599 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6255 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5600 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 6256 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5601 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6257 CHECK(context->Global()
6258 ->Set(context.local(), v8_str("obj"),
6259 templ->NewInstance(context.local()).ToLocalChecked())
6260 .FromJust());
5602 6261
5603 // Uses getOwnPropertyDescriptor to check the configurable status 6262 // Uses getOwnPropertyDescriptor to check the configurable status
5604 Local<Script> script_desc = v8_compile( 6263 Local<Script> script_desc = v8_compile(
5605 "var prop = Object.getOwnPropertyDescriptor( " 6264 "var prop = Object.getOwnPropertyDescriptor( "
5606 "obj, 'x');" 6265 "obj, 'x');"
5607 "prop.configurable;"); 6266 "prop.configurable;");
5608 Local<Value> result = script_desc->Run(); 6267 Local<Value> result = script_desc->Run(context.local()).ToLocalChecked();
5609 CHECK_EQ(result->BooleanValue(), true); 6268 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true);
5610 6269
5611 // Redefine get - but still configurable 6270 // Redefine get - but still configurable
5612 Local<Script> script_define = v8_compile( 6271 Local<Script> script_define = v8_compile(
5613 "var desc = { get: function(){return 42; }," 6272 "var desc = { get: function(){return 42; },"
5614 " configurable: true };" 6273 " configurable: true };"
5615 "Object.defineProperty(obj, 'x', desc);" 6274 "Object.defineProperty(obj, 'x', desc);"
5616 "obj.x"); 6275 "obj.x");
5617 result = script_define->Run(); 6276 result = script_define->Run(context.local()).ToLocalChecked();
5618 CHECK(result->Equals(v8_num(42))); 6277 CHECK(result->Equals(context.local(), v8_num(42)).FromJust());
5619 6278
5620 // Check that the accessor is still configurable 6279 // Check that the accessor is still configurable
5621 result = script_desc->Run(); 6280 result = script_desc->Run(context.local()).ToLocalChecked();
5622 CHECK_EQ(result->BooleanValue(), true); 6281 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true);
5623 6282
5624 // Redefine to a non-configurable 6283 // Redefine to a non-configurable
5625 script_define = v8_compile( 6284 script_define = v8_compile(
5626 "var desc = { get: function(){return 43; }," 6285 "var desc = { get: function(){return 43; },"
5627 " configurable: false };" 6286 " configurable: false };"
5628 "Object.defineProperty(obj, 'x', desc);" 6287 "Object.defineProperty(obj, 'x', desc);"
5629 "obj.x"); 6288 "obj.x");
5630 result = script_define->Run(); 6289 result = script_define->Run(context.local()).ToLocalChecked();
5631 CHECK(result->Equals(v8_num(43))); 6290 CHECK(result->Equals(context.local(), v8_num(43)).FromJust());
5632 result = script_desc->Run(); 6291 result = script_desc->Run(context.local()).ToLocalChecked();
5633 CHECK_EQ(result->BooleanValue(), false); 6292 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), false);
5634 6293
5635 // Make sure that it is not possible to redefine again 6294 // Make sure that it is not possible to redefine again
5636 v8::TryCatch try_catch(isolate); 6295 v8::TryCatch try_catch(isolate);
5637 result = script_define->Run(); 6296 CHECK(script_define->Run(context.local()).IsEmpty());
5638 CHECK(try_catch.HasCaught()); 6297 CHECK(try_catch.HasCaught());
5639 String::Utf8Value exception_value(try_catch.Exception()); 6298 String::Utf8Value exception_value(try_catch.Exception());
5640 CHECK_EQ(0, 6299 CHECK_EQ(0,
5641 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); 6300 strcmp(*exception_value, "TypeError: Cannot redefine property: x"));
5642 } 6301 }
5643 6302
5644 6303
5645 THREADED_TEST(DefinePropertyOnDefineGetterSetter) { 6304 THREADED_TEST(DefinePropertyOnDefineGetterSetter) {
5646 v8::Isolate* isolate = CcTest::isolate(); 6305 v8::Isolate* isolate = CcTest::isolate();
5647 v8::HandleScope scope(isolate); 6306 v8::HandleScope scope(isolate);
5648 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6307 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5649 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut")); 6308 templ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"));
5650 LocalContext context; 6309 LocalContext context;
5651 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6310 CHECK(context->Global()
6311 ->Set(context.local(), v8_str("obj"),
6312 templ->NewInstance(context.local()).ToLocalChecked())
6313 .FromJust());
5652 6314
5653 Local<Script> script_desc = v8_compile( 6315 Local<Script> script_desc = v8_compile(
5654 "var prop =" 6316 "var prop ="
5655 "Object.getOwnPropertyDescriptor( " 6317 "Object.getOwnPropertyDescriptor( "
5656 "obj, 'x');" 6318 "obj, 'x');"
5657 "prop.configurable;"); 6319 "prop.configurable;");
5658 Local<Value> result = script_desc->Run(); 6320 Local<Value> result = script_desc->Run(context.local()).ToLocalChecked();
5659 CHECK_EQ(result->BooleanValue(), true); 6321 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true);
5660 6322
5661 Local<Script> script_define = v8_compile( 6323 Local<Script> script_define = v8_compile(
5662 "var desc = {get: function(){return 42; }," 6324 "var desc = {get: function(){return 42; },"
5663 " configurable: true };" 6325 " configurable: true };"
5664 "Object.defineProperty(obj, 'x', desc);" 6326 "Object.defineProperty(obj, 'x', desc);"
5665 "obj.x"); 6327 "obj.x");
5666 result = script_define->Run(); 6328 result = script_define->Run(context.local()).ToLocalChecked();
5667 CHECK(result->Equals(v8_num(42))); 6329 CHECK(result->Equals(context.local(), v8_num(42)).FromJust());
5668 6330
5669 6331 result = script_desc->Run(context.local()).ToLocalChecked();
5670 result = script_desc->Run(); 6332 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), true);
5671 CHECK_EQ(result->BooleanValue(), true);
5672
5673 6333
5674 script_define = v8_compile( 6334 script_define = v8_compile(
5675 "var desc = {get: function(){return 43; }," 6335 "var desc = {get: function(){return 43; },"
5676 " configurable: false };" 6336 " configurable: false };"
5677 "Object.defineProperty(obj, 'x', desc);" 6337 "Object.defineProperty(obj, 'x', desc);"
5678 "obj.x"); 6338 "obj.x");
5679 result = script_define->Run(); 6339 result = script_define->Run(context.local()).ToLocalChecked();
5680 CHECK(result->Equals(v8_num(43))); 6340 CHECK(result->Equals(context.local(), v8_num(43)).FromJust());
5681 result = script_desc->Run();
5682 6341
5683 CHECK_EQ(result->BooleanValue(), false); 6342 result = script_desc->Run(context.local()).ToLocalChecked();
6343 CHECK_EQ(result->BooleanValue(context.local()).FromJust(), false);
5684 6344
5685 v8::TryCatch try_catch(isolate); 6345 v8::TryCatch try_catch(isolate);
5686 result = script_define->Run(); 6346 CHECK(script_define->Run(context.local()).IsEmpty());
5687 CHECK(try_catch.HasCaught()); 6347 CHECK(try_catch.HasCaught());
5688 String::Utf8Value exception_value(try_catch.Exception()); 6348 String::Utf8Value exception_value(try_catch.Exception());
5689 CHECK_EQ(0, 6349 CHECK_EQ(0,
5690 strcmp(*exception_value, "TypeError: Cannot redefine property: x")); 6350 strcmp(*exception_value, "TypeError: Cannot redefine property: x"));
5691 } 6351 }
5692 6352
5693 6353
5694 static v8::Handle<v8::Object> GetGlobalProperty(LocalContext* context, 6354 static v8::Local<v8::Object> GetGlobalProperty(LocalContext* context,
5695 char const* name) { 6355 char const* name) {
5696 return v8::Handle<v8::Object>::Cast((*context)->Global()->Get(v8_str(name))); 6356 return v8::Local<v8::Object>::Cast(
6357 (*context)
6358 ->Global()
6359 ->Get(CcTest::isolate()->GetCurrentContext(), v8_str(name))
6360 .ToLocalChecked());
5697 } 6361 }
5698 6362
5699 6363
5700 THREADED_TEST(DefineAPIAccessorOnObject) { 6364 THREADED_TEST(DefineAPIAccessorOnObject) {
5701 v8::Isolate* isolate = CcTest::isolate(); 6365 v8::Isolate* isolate = CcTest::isolate();
5702 v8::HandleScope scope(isolate); 6366 v8::HandleScope scope(isolate);
5703 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6367 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5704 LocalContext context; 6368 LocalContext context;
5705 6369
5706 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 6370 CHECK(context->Global()
6371 ->Set(context.local(), v8_str("obj1"),
6372 templ->NewInstance(context.local()).ToLocalChecked())
6373 .FromJust());
5707 CompileRun("var obj2 = {};"); 6374 CompileRun("var obj2 = {};");
5708 6375
5709 CHECK(CompileRun("obj1.x")->IsUndefined()); 6376 CHECK(CompileRun("obj1.x")->IsUndefined());
5710 CHECK(CompileRun("obj2.x")->IsUndefined()); 6377 CHECK(CompileRun("obj2.x")->IsUndefined());
5711 6378
5712 CHECK(GetGlobalProperty(&context, "obj1") 6379 CHECK(GetGlobalProperty(&context, "obj1")
5713 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6380 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6381 v8_str("donut"))
6382 .FromJust());
5714 6383
5715 ExpectString("obj1.x", "x"); 6384 ExpectString("obj1.x", "x");
5716 CHECK(CompileRun("obj2.x")->IsUndefined()); 6385 CHECK(CompileRun("obj2.x")->IsUndefined());
5717 6386
5718 CHECK(GetGlobalProperty(&context, "obj2") 6387 CHECK(GetGlobalProperty(&context, "obj2")
5719 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6388 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6389 v8_str("donut"))
6390 .FromJust());
5720 6391
5721 ExpectString("obj1.x", "x"); 6392 ExpectString("obj1.x", "x");
5722 ExpectString("obj2.x", "x"); 6393 ExpectString("obj2.x", "x");
5723 6394
5724 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); 6395 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable");
5725 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); 6396 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable");
5726 6397
5727 CompileRun( 6398 CompileRun(
5728 "Object.defineProperty(obj1, 'x'," 6399 "Object.defineProperty(obj1, 'x',"
5729 "{ get: function() { return 'y'; }, configurable: true })"); 6400 "{ get: function() { return 'y'; }, configurable: true })");
5730 6401
5731 ExpectString("obj1.x", "y"); 6402 ExpectString("obj1.x", "y");
5732 ExpectString("obj2.x", "x"); 6403 ExpectString("obj2.x", "x");
5733 6404
5734 CompileRun( 6405 CompileRun(
5735 "Object.defineProperty(obj2, 'x'," 6406 "Object.defineProperty(obj2, 'x',"
5736 "{ get: function() { return 'y'; }, configurable: true })"); 6407 "{ get: function() { return 'y'; }, configurable: true })");
5737 6408
5738 ExpectString("obj1.x", "y"); 6409 ExpectString("obj1.x", "y");
5739 ExpectString("obj2.x", "y"); 6410 ExpectString("obj2.x", "y");
5740 6411
5741 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); 6412 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable");
5742 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); 6413 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable");
5743 6414
5744 CHECK(GetGlobalProperty(&context, "obj1") 6415 CHECK(GetGlobalProperty(&context, "obj1")
5745 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6416 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6417 v8_str("donut"))
6418 .FromJust());
5746 CHECK(GetGlobalProperty(&context, "obj2") 6419 CHECK(GetGlobalProperty(&context, "obj2")
5747 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6420 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6421 v8_str("donut"))
6422 .FromJust());
5748 6423
5749 ExpectString("obj1.x", "x"); 6424 ExpectString("obj1.x", "x");
5750 ExpectString("obj2.x", "x"); 6425 ExpectString("obj2.x", "x");
5751 6426
5752 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); 6427 ExpectTrue("Object.getOwnPropertyDescriptor(obj1, 'x').configurable");
5753 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); 6428 ExpectTrue("Object.getOwnPropertyDescriptor(obj2, 'x').configurable");
5754 6429
5755 // Define getters/setters, but now make them not configurable. 6430 // Define getters/setters, but now make them not configurable.
5756 CompileRun( 6431 CompileRun(
5757 "Object.defineProperty(obj1, 'x'," 6432 "Object.defineProperty(obj1, 'x',"
5758 "{ get: function() { return 'z'; }, configurable: false })"); 6433 "{ get: function() { return 'z'; }, configurable: false })");
5759 CompileRun( 6434 CompileRun(
5760 "Object.defineProperty(obj2, 'x'," 6435 "Object.defineProperty(obj2, 'x',"
5761 "{ get: function() { return 'z'; }, configurable: false })"); 6436 "{ get: function() { return 'z'; }, configurable: false })");
5762
5763 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); 6437 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable");
5764 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); 6438 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable");
5765 6439
5766 ExpectString("obj1.x", "z"); 6440 ExpectString("obj1.x", "z");
5767 ExpectString("obj2.x", "z"); 6441 ExpectString("obj2.x", "z");
5768 6442
5769 CHECK(!GetGlobalProperty(&context, "obj1") 6443 CHECK(GetGlobalProperty(&context, "obj1")
5770 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6444 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
5771 CHECK(!GetGlobalProperty(&context, "obj2") 6445 v8_str("donut"))
5772 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6446 .IsNothing());
6447 CHECK(GetGlobalProperty(&context, "obj2")
6448 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6449 v8_str("donut"))
6450 .IsNothing());
5773 6451
5774 ExpectString("obj1.x", "z"); 6452 ExpectString("obj1.x", "z");
5775 ExpectString("obj2.x", "z"); 6453 ExpectString("obj2.x", "z");
5776 } 6454 }
5777 6455
5778 6456
5779 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) { 6457 THREADED_TEST(DontDeleteAPIAccessorsCannotBeOverriden) {
5780 v8::Isolate* isolate = CcTest::isolate(); 6458 v8::Isolate* isolate = CcTest::isolate();
5781 v8::HandleScope scope(isolate); 6459 v8::HandleScope scope(isolate);
5782 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6460 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5783 LocalContext context; 6461 LocalContext context;
5784 6462
5785 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 6463 CHECK(context->Global()
6464 ->Set(context.local(), v8_str("obj1"),
6465 templ->NewInstance(context.local()).ToLocalChecked())
6466 .FromJust());
5786 CompileRun("var obj2 = {};"); 6467 CompileRun("var obj2 = {};");
5787 6468
5788 CHECK(GetGlobalProperty(&context, "obj1") 6469 CHECK(GetGlobalProperty(&context, "obj1")
5789 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"), 6470 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
5790 v8::DEFAULT, v8::DontDelete)); 6471 v8_str("donut"), v8::DEFAULT, v8::DontDelete)
6472 .FromJust());
5791 CHECK(GetGlobalProperty(&context, "obj2") 6473 CHECK(GetGlobalProperty(&context, "obj2")
5792 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"), 6474 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
5793 v8::DEFAULT, v8::DontDelete)); 6475 v8_str("donut"), v8::DEFAULT, v8::DontDelete)
6476 .FromJust());
5794 6477
5795 ExpectString("obj1.x", "x"); 6478 ExpectString("obj1.x", "x");
5796 ExpectString("obj2.x", "x"); 6479 ExpectString("obj2.x", "x");
5797 6480
5798 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable"); 6481 ExpectTrue("!Object.getOwnPropertyDescriptor(obj1, 'x').configurable");
5799 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable"); 6482 ExpectTrue("!Object.getOwnPropertyDescriptor(obj2, 'x').configurable");
5800 6483
5801 CHECK(!GetGlobalProperty(&context, "obj1") 6484 CHECK(GetGlobalProperty(&context, "obj1")
5802 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6485 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
5803 CHECK(!GetGlobalProperty(&context, "obj2") 6486 v8_str("donut"))
5804 ->SetAccessor(v8_str("x"), GetXValue, NULL, v8_str("donut"))); 6487 .IsNothing());
6488 CHECK(GetGlobalProperty(&context, "obj2")
6489 ->SetAccessor(context.local(), v8_str("x"), GetXValue, NULL,
6490 v8_str("donut"))
6491 .IsNothing());
5805 6492
5806 { 6493 {
5807 v8::TryCatch try_catch(isolate); 6494 v8::TryCatch try_catch(isolate);
5808 CompileRun( 6495 CompileRun(
5809 "Object.defineProperty(obj1, 'x'," 6496 "Object.defineProperty(obj1, 'x',"
5810 "{get: function() { return 'func'; }})"); 6497 "{get: function() { return 'func'; }})");
5811 CHECK(try_catch.HasCaught()); 6498 CHECK(try_catch.HasCaught());
5812 String::Utf8Value exception_value(try_catch.Exception()); 6499 String::Utf8Value exception_value(try_catch.Exception());
5813 CHECK_EQ( 6500 CHECK_EQ(
5814 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); 6501 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x"));
5815 } 6502 }
5816 { 6503 {
5817 v8::TryCatch try_catch(isolate); 6504 v8::TryCatch try_catch(isolate);
5818 CompileRun( 6505 CompileRun(
5819 "Object.defineProperty(obj2, 'x'," 6506 "Object.defineProperty(obj2, 'x',"
5820 "{get: function() { return 'func'; }})"); 6507 "{get: function() { return 'func'; }})");
5821 CHECK(try_catch.HasCaught()); 6508 CHECK(try_catch.HasCaught());
5822 String::Utf8Value exception_value(try_catch.Exception()); 6509 String::Utf8Value exception_value(try_catch.Exception());
5823 CHECK_EQ( 6510 CHECK_EQ(
5824 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x")); 6511 0, strcmp(*exception_value, "TypeError: Cannot redefine property: x"));
5825 } 6512 }
5826 } 6513 }
5827 6514
5828 6515
5829 static void Get239Value(Local<String> name, 6516 static void Get239Value(Local<Name> name,
5830 const v8::PropertyCallbackInfo<v8::Value>& info) { 6517 const v8::PropertyCallbackInfo<v8::Value>& info) {
5831 ApiTestFuzzer::Fuzz(); 6518 ApiTestFuzzer::Fuzz();
5832 CHECK(info.Data()->Equals(v8_str("donut"))); 6519 CHECK(info.Data()
5833 CHECK(name->Equals(v8_str("239"))); 6520 ->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("donut"))
6521 .FromJust());
6522 CHECK(name->Equals(info.GetIsolate()->GetCurrentContext(), v8_str("239"))
6523 .FromJust());
5834 info.GetReturnValue().Set(name); 6524 info.GetReturnValue().Set(name);
5835 } 6525 }
5836 6526
5837 6527
5838 THREADED_TEST(ElementAPIAccessor) { 6528 THREADED_TEST(ElementAPIAccessor) {
5839 v8::Isolate* isolate = CcTest::isolate(); 6529 v8::Isolate* isolate = CcTest::isolate();
5840 v8::HandleScope scope(isolate); 6530 v8::HandleScope scope(isolate);
5841 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6531 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5842 LocalContext context; 6532 LocalContext context;
5843 6533
5844 context->Global()->Set(v8_str("obj1"), templ->NewInstance()); 6534 CHECK(context->Global()
6535 ->Set(context.local(), v8_str("obj1"),
6536 templ->NewInstance(context.local()).ToLocalChecked())
6537 .FromJust());
5845 CompileRun("var obj2 = {};"); 6538 CompileRun("var obj2 = {};");
5846 6539
5847 CHECK(GetGlobalProperty(&context, "obj1") 6540 CHECK(GetGlobalProperty(&context, "obj1")
5848 ->SetAccessor(v8_str("239"), Get239Value, NULL, v8_str("donut"))); 6541 ->SetAccessor(context.local(), v8_str("239"), Get239Value, NULL,
6542 v8_str("donut"))
6543 .FromJust());
5849 CHECK(GetGlobalProperty(&context, "obj2") 6544 CHECK(GetGlobalProperty(&context, "obj2")
5850 ->SetAccessor(v8_str("239"), Get239Value, NULL, v8_str("donut"))); 6545 ->SetAccessor(context.local(), v8_str("239"), Get239Value, NULL,
6546 v8_str("donut"))
6547 .FromJust());
5851 6548
5852 ExpectString("obj1[239]", "239"); 6549 ExpectString("obj1[239]", "239");
5853 ExpectString("obj2[239]", "239"); 6550 ExpectString("obj2[239]", "239");
5854 ExpectString("obj1['239']", "239"); 6551 ExpectString("obj1['239']", "239");
5855 ExpectString("obj2['239']", "239"); 6552 ExpectString("obj2['239']", "239");
5856 } 6553 }
5857 6554
5858 6555
5859 v8::Persistent<Value> xValue; 6556 v8::Persistent<Value> xValue;
5860 6557
5861 6558
5862 static void SetXValue(Local<String> name, Local<Value> value, 6559 static void SetXValue(Local<Name> name, Local<Value> value,
5863 const v8::PropertyCallbackInfo<void>& info) { 6560 const v8::PropertyCallbackInfo<void>& info) {
5864 CHECK(value->Equals(v8_num(4))); 6561 Local<Context> context = info.GetIsolate()->GetCurrentContext();
5865 CHECK(info.Data()->Equals(v8_str("donut"))); 6562 CHECK(value->Equals(context, v8_num(4)).FromJust());
5866 CHECK(name->Equals(v8_str("x"))); 6563 CHECK(info.Data()->Equals(context, v8_str("donut")).FromJust());
6564 CHECK(name->Equals(context, v8_str("x")).FromJust());
5867 CHECK(xValue.IsEmpty()); 6565 CHECK(xValue.IsEmpty());
5868 xValue.Reset(info.GetIsolate(), value); 6566 xValue.Reset(info.GetIsolate(), value);
5869 } 6567 }
5870 6568
5871 6569
5872 THREADED_TEST(SimplePropertyWrite) { 6570 THREADED_TEST(SimplePropertyWrite) {
5873 v8::Isolate* isolate = CcTest::isolate(); 6571 v8::Isolate* isolate = CcTest::isolate();
5874 v8::HandleScope scope(isolate); 6572 v8::HandleScope scope(isolate);
5875 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6573 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5876 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut")); 6574 templ->SetAccessor(v8_str("x"), GetXValue, SetXValue, v8_str("donut"));
5877 LocalContext context; 6575 LocalContext context;
5878 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6576 CHECK(context->Global()
6577 ->Set(context.local(), v8_str("obj"),
6578 templ->NewInstance(context.local()).ToLocalChecked())
6579 .FromJust());
5879 Local<Script> script = v8_compile("obj.x = 4"); 6580 Local<Script> script = v8_compile("obj.x = 4");
5880 for (int i = 0; i < 10; i++) { 6581 for (int i = 0; i < 10; i++) {
5881 CHECK(xValue.IsEmpty()); 6582 CHECK(xValue.IsEmpty());
5882 script->Run(); 6583 script->Run(context.local()).ToLocalChecked();
5883 CHECK(v8_num(4)->Equals(Local<Value>::New(CcTest::isolate(), xValue))); 6584 CHECK(v8_num(4)
6585 ->Equals(context.local(),
6586 Local<Value>::New(CcTest::isolate(), xValue))
6587 .FromJust());
5884 xValue.Reset(); 6588 xValue.Reset();
5885 } 6589 }
5886 } 6590 }
5887 6591
5888 6592
5889 THREADED_TEST(SetterOnly) { 6593 THREADED_TEST(SetterOnly) {
5890 v8::Isolate* isolate = CcTest::isolate(); 6594 v8::Isolate* isolate = CcTest::isolate();
5891 v8::HandleScope scope(isolate); 6595 v8::HandleScope scope(isolate);
5892 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6596 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5893 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut")); 6597 templ->SetAccessor(v8_str("x"), NULL, SetXValue, v8_str("donut"));
5894 LocalContext context; 6598 LocalContext context;
5895 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6599 CHECK(context->Global()
6600 ->Set(context.local(), v8_str("obj"),
6601 templ->NewInstance(context.local()).ToLocalChecked())
6602 .FromJust());
5896 Local<Script> script = v8_compile("obj.x = 4; obj.x"); 6603 Local<Script> script = v8_compile("obj.x = 4; obj.x");
5897 for (int i = 0; i < 10; i++) { 6604 for (int i = 0; i < 10; i++) {
5898 CHECK(xValue.IsEmpty()); 6605 CHECK(xValue.IsEmpty());
5899 script->Run(); 6606 script->Run(context.local()).ToLocalChecked();
5900 CHECK(v8_num(4)->Equals(Local<Value>::New(CcTest::isolate(), xValue))); 6607 CHECK(v8_num(4)
6608 ->Equals(context.local(),
6609 Local<Value>::New(CcTest::isolate(), xValue))
6610 .FromJust());
5901 xValue.Reset(); 6611 xValue.Reset();
5902 } 6612 }
5903 } 6613 }
5904 6614
5905 6615
5906 THREADED_TEST(NoAccessors) { 6616 THREADED_TEST(NoAccessors) {
5907 v8::Isolate* isolate = CcTest::isolate(); 6617 v8::Isolate* isolate = CcTest::isolate();
5908 v8::HandleScope scope(isolate); 6618 v8::HandleScope scope(isolate);
5909 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6619 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5910 templ->SetAccessor(v8_str("x"), static_cast<v8::AccessorGetterCallback>(NULL), 6620 templ->SetAccessor(v8_str("x"), static_cast<v8::AccessorGetterCallback>(NULL),
5911 NULL, v8_str("donut")); 6621 NULL, v8_str("donut"));
5912 LocalContext context; 6622 LocalContext context;
5913 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 6623 CHECK(context->Global()
6624 ->Set(context.local(), v8_str("obj"),
6625 templ->NewInstance(context.local()).ToLocalChecked())
6626 .FromJust());
5914 Local<Script> script = v8_compile("obj.x = 4; obj.x"); 6627 Local<Script> script = v8_compile("obj.x = 4; obj.x");
5915 for (int i = 0; i < 10; i++) { 6628 for (int i = 0; i < 10; i++) {
5916 script->Run(); 6629 script->Run(context.local()).ToLocalChecked();
5917 } 6630 }
5918 } 6631 }
5919 6632
5920 6633
5921 THREADED_TEST(MultiContexts) { 6634 THREADED_TEST(MultiContexts) {
5922 v8::Isolate* isolate = CcTest::isolate(); 6635 v8::Isolate* isolate = CcTest::isolate();
5923 v8::HandleScope scope(isolate); 6636 v8::HandleScope scope(isolate);
5924 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 6637 v8::Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
5925 templ->Set(v8_str("dummy"), 6638 templ->Set(v8_str("dummy"),
5926 v8::FunctionTemplate::New(isolate, DummyCallHandler)); 6639 v8::FunctionTemplate::New(isolate, DummyCallHandler));
5927 6640
5928 Local<String> password = v8_str("Password"); 6641 Local<String> password = v8_str("Password");
5929 6642
5930 // Create an environment 6643 // Create an environment
5931 LocalContext context0(0, templ); 6644 LocalContext context0(0, templ);
5932 context0->SetSecurityToken(password); 6645 context0->SetSecurityToken(password);
5933 v8::Handle<v8::Object> global0 = context0->Global(); 6646 v8::Local<v8::Object> global0 = context0->Global();
5934 global0->Set(v8_str("custom"), v8_num(1234)); 6647 CHECK(global0->Set(context0.local(), v8_str("custom"), v8_num(1234))
5935 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); 6648 .FromJust());
6649 CHECK_EQ(1234, global0->Get(context0.local(), v8_str("custom"))
6650 .ToLocalChecked()
6651 ->Int32Value(context0.local())
6652 .FromJust());
5936 6653
5937 // Create an independent environment 6654 // Create an independent environment
5938 LocalContext context1(0, templ); 6655 LocalContext context1(0, templ);
5939 context1->SetSecurityToken(password); 6656 context1->SetSecurityToken(password);
5940 v8::Handle<v8::Object> global1 = context1->Global(); 6657 v8::Local<v8::Object> global1 = context1->Global();
5941 global1->Set(v8_str("custom"), v8_num(1234)); 6658 CHECK(global1->Set(context1.local(), v8_str("custom"), v8_num(1234))
5942 CHECK(!global0->Equals(global1)); 6659 .FromJust());
5943 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); 6660 CHECK(!global0->Equals(context1.local(), global1).FromJust());
5944 CHECK_EQ(1234, global1->Get(v8_str("custom"))->Int32Value()); 6661 CHECK_EQ(1234, global0->Get(context1.local(), v8_str("custom"))
6662 .ToLocalChecked()
6663 ->Int32Value(context0.local())
6664 .FromJust());
6665 CHECK_EQ(1234, global1->Get(context1.local(), v8_str("custom"))
6666 .ToLocalChecked()
6667 ->Int32Value(context1.local())
6668 .FromJust());
5945 6669
5946 // Now create a new context with the old global 6670 // Now create a new context with the old global
5947 LocalContext context2(0, templ, global1); 6671 LocalContext context2(0, templ, global1);
5948 context2->SetSecurityToken(password); 6672 context2->SetSecurityToken(password);
5949 v8::Handle<v8::Object> global2 = context2->Global(); 6673 v8::Local<v8::Object> global2 = context2->Global();
5950 CHECK(global1->Equals(global2)); 6674 CHECK(global1->Equals(context2.local(), global2).FromJust());
5951 CHECK_EQ(0, global1->Get(v8_str("custom"))->Int32Value()); 6675 CHECK_EQ(0, global1->Get(context2.local(), v8_str("custom"))
5952 CHECK_EQ(0, global2->Get(v8_str("custom"))->Int32Value()); 6676 .ToLocalChecked()
6677 ->Int32Value(context1.local())
6678 .FromJust());
6679 CHECK_EQ(0, global2->Get(context2.local(), v8_str("custom"))
6680 .ToLocalChecked()
6681 ->Int32Value(context2.local())
6682 .FromJust());
5953 } 6683 }
5954 6684
5955 6685
5956 THREADED_TEST(FunctionPrototypeAcrossContexts) { 6686 THREADED_TEST(FunctionPrototypeAcrossContexts) {
5957 // Make sure that functions created by cloning boilerplates cannot 6687 // Make sure that functions created by cloning boilerplates cannot
5958 // communicate through their __proto__ field. 6688 // communicate through their __proto__ field.
5959 6689
5960 v8::HandleScope scope(CcTest::isolate()); 6690 v8::HandleScope scope(CcTest::isolate());
5961 6691
5962 LocalContext env0; 6692 LocalContext env0;
5963 v8::Handle<v8::Object> global0 = env0->Global(); 6693 v8::Local<v8::Object> global0 = env0->Global();
5964 v8::Handle<v8::Object> object0 = 6694 v8::Local<v8::Object> object0 = global0->Get(env0.local(), v8_str("Object"))
5965 global0->Get(v8_str("Object")).As<v8::Object>(); 6695 .ToLocalChecked()
5966 v8::Handle<v8::Object> tostring0 = 6696 .As<v8::Object>();
5967 object0->Get(v8_str("toString")).As<v8::Object>(); 6697 v8::Local<v8::Object> tostring0 =
5968 v8::Handle<v8::Object> proto0 = 6698 object0->Get(env0.local(), v8_str("toString"))
5969 tostring0->Get(v8_str("__proto__")).As<v8::Object>(); 6699 .ToLocalChecked()
5970 proto0->Set(v8_str("custom"), v8_num(1234)); 6700 .As<v8::Object>();
6701 v8::Local<v8::Object> proto0 =
6702 tostring0->Get(env0.local(), v8_str("__proto__"))
6703 .ToLocalChecked()
6704 .As<v8::Object>();
6705 CHECK(proto0->Set(env0.local(), v8_str("custom"), v8_num(1234)).FromJust());
5971 6706
5972 LocalContext env1; 6707 LocalContext env1;
5973 v8::Handle<v8::Object> global1 = env1->Global(); 6708 v8::Local<v8::Object> global1 = env1->Global();
5974 v8::Handle<v8::Object> object1 = 6709 v8::Local<v8::Object> object1 = global1->Get(env1.local(), v8_str("Object"))
5975 global1->Get(v8_str("Object")).As<v8::Object>(); 6710 .ToLocalChecked()
5976 v8::Handle<v8::Object> tostring1 = 6711 .As<v8::Object>();
5977 object1->Get(v8_str("toString")).As<v8::Object>(); 6712 v8::Local<v8::Object> tostring1 =
5978 v8::Handle<v8::Object> proto1 = 6713 object1->Get(env1.local(), v8_str("toString"))
5979 tostring1->Get(v8_str("__proto__")).As<v8::Object>(); 6714 .ToLocalChecked()
5980 CHECK(!proto1->Has(v8_str("custom"))); 6715 .As<v8::Object>();
6716 v8::Local<v8::Object> proto1 =
6717 tostring1->Get(env1.local(), v8_str("__proto__"))
6718 .ToLocalChecked()
6719 .As<v8::Object>();
6720 CHECK(!proto1->Has(env1.local(), v8_str("custom")).FromJust());
5981 } 6721 }
5982 6722
5983 6723
5984 THREADED_TEST(Regress892105) { 6724 THREADED_TEST(Regress892105) {
5985 // Make sure that object and array literals created by cloning 6725 // Make sure that object and array literals created by cloning
5986 // boilerplates cannot communicate through their __proto__ 6726 // boilerplates cannot communicate through their __proto__
5987 // field. This is rather difficult to check, but we try to add stuff 6727 // field. This is rather difficult to check, but we try to add stuff
5988 // to Object.prototype and Array.prototype and create a new 6728 // to Object.prototype and Array.prototype and create a new
5989 // environment. This should succeed. 6729 // environment. This should succeed.
5990 6730
5991 v8::HandleScope scope(CcTest::isolate()); 6731 v8::HandleScope scope(CcTest::isolate());
5992 6732
5993 Local<String> source = v8_str( 6733 Local<String> source = v8_str(
5994 "Object.prototype.obj = 1234;" 6734 "Object.prototype.obj = 1234;"
5995 "Array.prototype.arr = 4567;" 6735 "Array.prototype.arr = 4567;"
5996 "8901"); 6736 "8901");
5997 6737
5998 LocalContext env0; 6738 LocalContext env0;
5999 Local<Script> script0 = v8_compile(source); 6739 Local<Script> script0 = v8_compile(source);
6000 CHECK_EQ(8901.0, script0->Run()->NumberValue()); 6740 CHECK_EQ(8901.0, script0->Run(env0.local())
6741 .ToLocalChecked()
6742 ->NumberValue(env0.local())
6743 .FromJust());
6001 6744
6002 LocalContext env1; 6745 LocalContext env1;
6003 Local<Script> script1 = v8_compile(source); 6746 Local<Script> script1 = v8_compile(source);
6004 CHECK_EQ(8901.0, script1->Run()->NumberValue()); 6747 CHECK_EQ(8901.0, script1->Run(env1.local())
6748 .ToLocalChecked()
6749 ->NumberValue(env1.local())
6750 .FromJust());
6005 } 6751 }
6006 6752
6007 6753
6008 THREADED_TEST(UndetectableObject) { 6754 THREADED_TEST(UndetectableObject) {
6009 LocalContext env; 6755 LocalContext env;
6010 v8::HandleScope scope(env->GetIsolate()); 6756 v8::HandleScope scope(env->GetIsolate());
6011 6757
6012 Local<v8::FunctionTemplate> desc = 6758 Local<v8::FunctionTemplate> desc =
6013 v8::FunctionTemplate::New(env->GetIsolate()); 6759 v8::FunctionTemplate::New(env->GetIsolate());
6014 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable 6760 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
6015 6761
6016 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); 6762 Local<v8::Object> obj = desc->GetFunction(env.local())
6017 env->Global()->Set(v8_str("undetectable"), obj); 6763 .ToLocalChecked()
6764 ->NewInstance(env.local())
6765 .ToLocalChecked();
6766 CHECK(
6767 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust());
6018 6768
6019 ExpectString("undetectable.toString()", "[object Object]"); 6769 ExpectString("undetectable.toString()", "[object Object]");
6020 ExpectString("typeof undetectable", "undefined"); 6770 ExpectString("typeof undetectable", "undefined");
6021 ExpectString("typeof(undetectable)", "undefined"); 6771 ExpectString("typeof(undetectable)", "undefined");
6022 ExpectBoolean("typeof undetectable == 'undefined'", true); 6772 ExpectBoolean("typeof undetectable == 'undefined'", true);
6023 ExpectBoolean("typeof undetectable == 'object'", false); 6773 ExpectBoolean("typeof undetectable == 'object'", false);
6024 ExpectBoolean("if (undetectable) { true; } else { false; }", false); 6774 ExpectBoolean("if (undetectable) { true; } else { false; }", false);
6025 ExpectBoolean("!undetectable", true); 6775 ExpectBoolean("!undetectable", true);
6026 6776
6027 ExpectObject("true&&undetectable", obj); 6777 ExpectObject("true&&undetectable", obj);
(...skipping 22 matching lines...) Expand all
6050 6800
6051 6801
6052 THREADED_TEST(VoidLiteral) { 6802 THREADED_TEST(VoidLiteral) {
6053 LocalContext env; 6803 LocalContext env;
6054 v8::Isolate* isolate = env->GetIsolate(); 6804 v8::Isolate* isolate = env->GetIsolate();
6055 v8::HandleScope scope(isolate); 6805 v8::HandleScope scope(isolate);
6056 6806
6057 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); 6807 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate);
6058 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable 6808 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
6059 6809
6060 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); 6810 Local<v8::Object> obj = desc->GetFunction(env.local())
6061 env->Global()->Set(v8_str("undetectable"), obj); 6811 .ToLocalChecked()
6812 ->NewInstance(env.local())
6813 .ToLocalChecked();
6814 CHECK(
6815 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust());
6062 6816
6063 ExpectBoolean("undefined == void 0", true); 6817 ExpectBoolean("undefined == void 0", true);
6064 ExpectBoolean("undetectable == void 0", true); 6818 ExpectBoolean("undetectable == void 0", true);
6065 ExpectBoolean("null == void 0", true); 6819 ExpectBoolean("null == void 0", true);
6066 ExpectBoolean("undefined === void 0", true); 6820 ExpectBoolean("undefined === void 0", true);
6067 ExpectBoolean("undetectable === void 0", false); 6821 ExpectBoolean("undetectable === void 0", false);
6068 ExpectBoolean("null === void 0", false); 6822 ExpectBoolean("null === void 0", false);
6069 6823
6070 ExpectBoolean("void 0 == undefined", true); 6824 ExpectBoolean("void 0 == undefined", true);
6071 ExpectBoolean("void 0 == undetectable", true); 6825 ExpectBoolean("void 0 == undetectable", true);
(...skipping 24 matching lines...) Expand all
6096 6850
6097 6851
6098 THREADED_TEST(ExtensibleOnUndetectable) { 6852 THREADED_TEST(ExtensibleOnUndetectable) {
6099 LocalContext env; 6853 LocalContext env;
6100 v8::Isolate* isolate = env->GetIsolate(); 6854 v8::Isolate* isolate = env->GetIsolate();
6101 v8::HandleScope scope(isolate); 6855 v8::HandleScope scope(isolate);
6102 6856
6103 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); 6857 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate);
6104 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable 6858 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable
6105 6859
6106 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); 6860 Local<v8::Object> obj = desc->GetFunction(env.local())
6107 env->Global()->Set(v8_str("undetectable"), obj); 6861 .ToLocalChecked()
6862 ->NewInstance(env.local())
6863 .ToLocalChecked();
6864 CHECK(
6865 env->Global()->Set(env.local(), v8_str("undetectable"), obj).FromJust());
6108 6866
6109 Local<String> source = v8_str( 6867 Local<String> source = v8_str(
6110 "undetectable.x = 42;" 6868 "undetectable.x = 42;"
6111 "undetectable.x"); 6869 "undetectable.x");
6112 6870
6113 Local<Script> script = v8_compile(source); 6871 Local<Script> script = v8_compile(source);
6114 6872
6115 CHECK(v8::Integer::New(isolate, 42)->Equals(script->Run())); 6873 CHECK(v8::Integer::New(isolate, 42)
6874 ->Equals(env.local(), script->Run(env.local()).ToLocalChecked())
6875 .FromJust());
6116 6876
6117 ExpectBoolean("Object.isExtensible(undetectable)", true); 6877 ExpectBoolean("Object.isExtensible(undetectable)", true);
6118 6878
6119 source = v8_str("Object.preventExtensions(undetectable);"); 6879 source = v8_str("Object.preventExtensions(undetectable);");
6120 script = v8_compile(source); 6880 script = v8_compile(source);
6121 script->Run(); 6881 script->Run(env.local()).ToLocalChecked();
6122 ExpectBoolean("Object.isExtensible(undetectable)", false); 6882 ExpectBoolean("Object.isExtensible(undetectable)", false);
6123 6883
6124 source = v8_str("undetectable.y = 2000;"); 6884 source = v8_str("undetectable.y = 2000;");
6125 script = v8_compile(source); 6885 script = v8_compile(source);
6126 script->Run(); 6886 script->Run(env.local()).ToLocalChecked();
6127 ExpectBoolean("undetectable.y == undefined", true); 6887 ExpectBoolean("undetectable.y == undefined", true);
6128 } 6888 }
6129 6889
6130 6890
6131 // The point of this test is type checking. We run it only so compilers 6891 // The point of this test is type checking. We run it only so compilers
6132 // don't complain about an unused function. 6892 // don't complain about an unused function.
6133 TEST(PersistentHandles) { 6893 TEST(PersistentHandles) {
6134 LocalContext env; 6894 LocalContext env;
6135 v8::Isolate* isolate = CcTest::isolate(); 6895 v8::Isolate* isolate = CcTest::isolate();
6136 v8::HandleScope scope(isolate); 6896 v8::HandleScope scope(isolate);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6168 "function Foo() {" 6928 "function Foo() {"
6169 " return 4;" 6929 " return 4;"
6170 "}"; 6930 "}";
6171 6931
6172 6932
6173 TEST(SimpleExtensions) { 6933 TEST(SimpleExtensions) {
6174 v8::HandleScope handle_scope(CcTest::isolate()); 6934 v8::HandleScope handle_scope(CcTest::isolate());
6175 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource)); 6935 v8::RegisterExtension(new Extension("simpletest", kSimpleExtensionSource));
6176 const char* extension_names[] = {"simpletest"}; 6936 const char* extension_names[] = {"simpletest"};
6177 v8::ExtensionConfiguration extensions(1, extension_names); 6937 v8::ExtensionConfiguration extensions(1, extension_names);
6178 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 6938 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6179 Context::Scope lock(context); 6939 Context::Scope lock(context);
6180 v8::Handle<Value> result = CompileRun("Foo()"); 6940 v8::Local<Value> result = CompileRun("Foo()");
6181 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); 6941 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4))
6942 .FromJust());
6182 } 6943 }
6183 6944
6184 6945
6185 static const char* kStackTraceFromExtensionSource = 6946 static const char* kStackTraceFromExtensionSource =
6186 "function foo() {" 6947 "function foo() {"
6187 " throw new Error();" 6948 " throw new Error();"
6188 "}" 6949 "}"
6189 "function bar() {" 6950 "function bar() {"
6190 " foo();" 6951 " foo();"
6191 "}"; 6952 "}";
6192 6953
6193 6954
6194 TEST(StackTraceInExtension) { 6955 TEST(StackTraceInExtension) {
6195 v8::HandleScope handle_scope(CcTest::isolate()); 6956 v8::HandleScope handle_scope(CcTest::isolate());
6196 v8::RegisterExtension( 6957 v8::RegisterExtension(
6197 new Extension("stacktracetest", kStackTraceFromExtensionSource)); 6958 new Extension("stacktracetest", kStackTraceFromExtensionSource));
6198 const char* extension_names[] = {"stacktracetest"}; 6959 const char* extension_names[] = {"stacktracetest"};
6199 v8::ExtensionConfiguration extensions(1, extension_names); 6960 v8::ExtensionConfiguration extensions(1, extension_names);
6200 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 6961 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6201 Context::Scope lock(context); 6962 Context::Scope lock(context);
6202 CompileRun( 6963 CompileRun(
6203 "function user() { bar(); }" 6964 "function user() { bar(); }"
6204 "var error;" 6965 "var error;"
6205 "try{ user(); } catch (e) { error = e; }"); 6966 "try{ user(); } catch (e) { error = e; }");
6206 CHECK_EQ(-1, CompileRun("error.stack.indexOf('foo')")->Int32Value()); 6967 CHECK_EQ(-1, v8_run_int32value(v8_compile("error.stack.indexOf('foo')")));
6207 CHECK_EQ(-1, CompileRun("error.stack.indexOf('bar')")->Int32Value()); 6968 CHECK_EQ(-1, v8_run_int32value(v8_compile("error.stack.indexOf('bar')")));
6208 CHECK_NE(-1, CompileRun("error.stack.indexOf('user')")->Int32Value()); 6969 CHECK_NE(-1, v8_run_int32value(v8_compile("error.stack.indexOf('user')")));
6209 } 6970 }
6210 6971
6211 6972
6212 TEST(NullExtensions) { 6973 TEST(NullExtensions) {
6213 v8::HandleScope handle_scope(CcTest::isolate()); 6974 v8::HandleScope handle_scope(CcTest::isolate());
6214 v8::RegisterExtension(new Extension("nulltest", NULL)); 6975 v8::RegisterExtension(new Extension("nulltest", NULL));
6215 const char* extension_names[] = {"nulltest"}; 6976 const char* extension_names[] = {"nulltest"};
6216 v8::ExtensionConfiguration extensions(1, extension_names); 6977 v8::ExtensionConfiguration extensions(1, extension_names);
6217 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 6978 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6218 Context::Scope lock(context); 6979 Context::Scope lock(context);
6219 v8::Handle<Value> result = CompileRun("1+3"); 6980 v8::Local<Value> result = CompileRun("1+3");
6220 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); 6981 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4))
6982 .FromJust());
6221 } 6983 }
6222 6984
6223 6985
6224 static const char* kEmbeddedExtensionSource = 6986 static const char* kEmbeddedExtensionSource =
6225 "function Ret54321(){return 54321;}~~@@$" 6987 "function Ret54321(){return 54321;}~~@@$"
6226 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS."; 6988 "$%% THIS IS A SERIES OF NON-NULL-TERMINATED STRINGS.";
6227 static const int kEmbeddedExtensionSourceValidLen = 34; 6989 static const int kEmbeddedExtensionSourceValidLen = 34;
6228 6990
6229 6991
6230 TEST(ExtensionMissingSourceLength) { 6992 TEST(ExtensionMissingSourceLength) {
6231 v8::HandleScope handle_scope(CcTest::isolate()); 6993 v8::HandleScope handle_scope(CcTest::isolate());
6232 v8::RegisterExtension( 6994 v8::RegisterExtension(
6233 new Extension("srclentest_fail", kEmbeddedExtensionSource)); 6995 new Extension("srclentest_fail", kEmbeddedExtensionSource));
6234 const char* extension_names[] = {"srclentest_fail"}; 6996 const char* extension_names[] = {"srclentest_fail"};
6235 v8::ExtensionConfiguration extensions(1, extension_names); 6997 v8::ExtensionConfiguration extensions(1, extension_names);
6236 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 6998 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6237 CHECK(0 == *context); 6999 CHECK(0 == *context);
6238 } 7000 }
6239 7001
6240 7002
6241 TEST(ExtensionWithSourceLength) { 7003 TEST(ExtensionWithSourceLength) {
6242 for (int source_len = kEmbeddedExtensionSourceValidLen - 1; 7004 for (int source_len = kEmbeddedExtensionSourceValidLen - 1;
6243 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) { 7005 source_len <= kEmbeddedExtensionSourceValidLen + 1; ++source_len) {
6244 v8::HandleScope handle_scope(CcTest::isolate()); 7006 v8::HandleScope handle_scope(CcTest::isolate());
6245 i::ScopedVector<char> extension_name(32); 7007 i::ScopedVector<char> extension_name(32);
6246 i::SNPrintF(extension_name, "ext #%d", source_len); 7008 i::SNPrintF(extension_name, "ext #%d", source_len);
6247 v8::RegisterExtension(new Extension( 7009 v8::RegisterExtension(new Extension(
6248 extension_name.start(), kEmbeddedExtensionSource, 0, 0, source_len)); 7010 extension_name.start(), kEmbeddedExtensionSource, 0, 0, source_len));
6249 const char* extension_names[1] = {extension_name.start()}; 7011 const char* extension_names[1] = {extension_name.start()};
6250 v8::ExtensionConfiguration extensions(1, extension_names); 7012 v8::ExtensionConfiguration extensions(1, extension_names);
6251 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7013 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6252 if (source_len == kEmbeddedExtensionSourceValidLen) { 7014 if (source_len == kEmbeddedExtensionSourceValidLen) {
6253 Context::Scope lock(context); 7015 Context::Scope lock(context);
6254 v8::Handle<Value> result = CompileRun("Ret54321()"); 7016 v8::Local<Value> result = CompileRun("Ret54321()");
6255 CHECK(v8::Integer::New(CcTest::isolate(), 54321)->Equals(result)); 7017 CHECK(v8::Integer::New(CcTest::isolate(), 54321)
7018 ->Equals(context, result)
7019 .FromJust());
6256 } else { 7020 } else {
6257 // Anything but exactly the right length should fail to compile. 7021 // Anything but exactly the right length should fail to compile.
6258 CHECK(0 == *context); 7022 CHECK(0 == *context);
6259 } 7023 }
6260 } 7024 }
6261 } 7025 }
6262 7026
6263 7027
6264 static const char* kEvalExtensionSource1 = 7028 static const char* kEvalExtensionSource1 =
6265 "function UseEval1() {" 7029 "function UseEval1() {"
(...skipping 11 matching lines...) Expand all
6277 " this.UseEval2 = e;" 7041 " this.UseEval2 = e;"
6278 "})()"; 7042 "})()";
6279 7043
6280 7044
6281 TEST(UseEvalFromExtension) { 7045 TEST(UseEvalFromExtension) {
6282 v8::HandleScope handle_scope(CcTest::isolate()); 7046 v8::HandleScope handle_scope(CcTest::isolate());
6283 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1)); 7047 v8::RegisterExtension(new Extension("evaltest1", kEvalExtensionSource1));
6284 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2)); 7048 v8::RegisterExtension(new Extension("evaltest2", kEvalExtensionSource2));
6285 const char* extension_names[] = {"evaltest1", "evaltest2"}; 7049 const char* extension_names[] = {"evaltest1", "evaltest2"};
6286 v8::ExtensionConfiguration extensions(2, extension_names); 7050 v8::ExtensionConfiguration extensions(2, extension_names);
6287 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7051 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6288 Context::Scope lock(context); 7052 Context::Scope lock(context);
6289 v8::Handle<Value> result = CompileRun("UseEval1()"); 7053 v8::Local<Value> result = CompileRun("UseEval1()");
6290 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); 7054 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42))
7055 .FromJust());
6291 result = CompileRun("UseEval2()"); 7056 result = CompileRun("UseEval2()");
6292 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); 7057 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42))
7058 .FromJust());
6293 } 7059 }
6294 7060
6295 7061
6296 static const char* kWithExtensionSource1 = 7062 static const char* kWithExtensionSource1 =
6297 "function UseWith1() {" 7063 "function UseWith1() {"
6298 " var x = 42;" 7064 " var x = 42;"
6299 " with({x:87}) { return x; }" 7065 " with({x:87}) { return x; }"
6300 "}"; 7066 "}";
6301 7067
6302 7068
6303 static const char* kWithExtensionSource2 = 7069 static const char* kWithExtensionSource2 =
6304 "(function() {" 7070 "(function() {"
6305 " var x = 42;" 7071 " var x = 42;"
6306 " function e() {" 7072 " function e() {"
6307 " with ({x:87}) { return x; }" 7073 " with ({x:87}) { return x; }"
6308 " }" 7074 " }"
6309 " this.UseWith2 = e;" 7075 " this.UseWith2 = e;"
6310 "})()"; 7076 "})()";
6311 7077
6312 7078
6313 TEST(UseWithFromExtension) { 7079 TEST(UseWithFromExtension) {
6314 v8::HandleScope handle_scope(CcTest::isolate()); 7080 v8::HandleScope handle_scope(CcTest::isolate());
6315 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1)); 7081 v8::RegisterExtension(new Extension("withtest1", kWithExtensionSource1));
6316 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2)); 7082 v8::RegisterExtension(new Extension("withtest2", kWithExtensionSource2));
6317 const char* extension_names[] = {"withtest1", "withtest2"}; 7083 const char* extension_names[] = {"withtest1", "withtest2"};
6318 v8::ExtensionConfiguration extensions(2, extension_names); 7084 v8::ExtensionConfiguration extensions(2, extension_names);
6319 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7085 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6320 Context::Scope lock(context); 7086 Context::Scope lock(context);
6321 v8::Handle<Value> result = CompileRun("UseWith1()"); 7087 v8::Local<Value> result = CompileRun("UseWith1()");
6322 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 87))); 7088 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 87))
7089 .FromJust());
6323 result = CompileRun("UseWith2()"); 7090 result = CompileRun("UseWith2()");
6324 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 87))); 7091 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 87))
7092 .FromJust());
6325 } 7093 }
6326 7094
6327 7095
6328 TEST(AutoExtensions) { 7096 TEST(AutoExtensions) {
6329 v8::HandleScope handle_scope(CcTest::isolate()); 7097 v8::HandleScope handle_scope(CcTest::isolate());
6330 Extension* extension = new Extension("autotest", kSimpleExtensionSource); 7098 Extension* extension = new Extension("autotest", kSimpleExtensionSource);
6331 extension->set_auto_enable(true); 7099 extension->set_auto_enable(true);
6332 v8::RegisterExtension(extension); 7100 v8::RegisterExtension(extension);
6333 v8::Handle<Context> context = Context::New(CcTest::isolate()); 7101 v8::Local<Context> context = Context::New(CcTest::isolate());
6334 Context::Scope lock(context); 7102 Context::Scope lock(context);
6335 v8::Handle<Value> result = CompileRun("Foo()"); 7103 v8::Local<Value> result = CompileRun("Foo()");
6336 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 4))); 7104 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 4))
7105 .FromJust());
6337 } 7106 }
6338 7107
6339 7108
6340 static const char* kSyntaxErrorInExtensionSource = "["; 7109 static const char* kSyntaxErrorInExtensionSource = "[";
6341 7110
6342 7111
6343 // Test that a syntax error in an extension does not cause a fatal 7112 // Test that a syntax error in an extension does not cause a fatal
6344 // error but results in an empty context. 7113 // error but results in an empty context.
6345 TEST(SyntaxErrorExtensions) { 7114 TEST(SyntaxErrorExtensions) {
6346 v8::HandleScope handle_scope(CcTest::isolate()); 7115 v8::HandleScope handle_scope(CcTest::isolate());
6347 v8::RegisterExtension( 7116 v8::RegisterExtension(
6348 new Extension("syntaxerror", kSyntaxErrorInExtensionSource)); 7117 new Extension("syntaxerror", kSyntaxErrorInExtensionSource));
6349 const char* extension_names[] = {"syntaxerror"}; 7118 const char* extension_names[] = {"syntaxerror"};
6350 v8::ExtensionConfiguration extensions(1, extension_names); 7119 v8::ExtensionConfiguration extensions(1, extension_names);
6351 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7120 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6352 CHECK(context.IsEmpty()); 7121 CHECK(context.IsEmpty());
6353 } 7122 }
6354 7123
6355 7124
6356 static const char* kExceptionInExtensionSource = "throw 42"; 7125 static const char* kExceptionInExtensionSource = "throw 42";
6357 7126
6358 7127
6359 // Test that an exception when installing an extension does not cause 7128 // Test that an exception when installing an extension does not cause
6360 // a fatal error but results in an empty context. 7129 // a fatal error but results in an empty context.
6361 TEST(ExceptionExtensions) { 7130 TEST(ExceptionExtensions) {
6362 v8::HandleScope handle_scope(CcTest::isolate()); 7131 v8::HandleScope handle_scope(CcTest::isolate());
6363 v8::RegisterExtension( 7132 v8::RegisterExtension(
6364 new Extension("exception", kExceptionInExtensionSource)); 7133 new Extension("exception", kExceptionInExtensionSource));
6365 const char* extension_names[] = {"exception"}; 7134 const char* extension_names[] = {"exception"};
6366 v8::ExtensionConfiguration extensions(1, extension_names); 7135 v8::ExtensionConfiguration extensions(1, extension_names);
6367 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7136 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6368 CHECK(context.IsEmpty()); 7137 CHECK(context.IsEmpty());
6369 } 7138 }
6370 7139
6371 7140
6372 static const char* kNativeCallInExtensionSource = 7141 static const char* kNativeCallInExtensionSource =
6373 "function call_runtime_last_index_of(x) {" 7142 "function call_runtime_last_index_of(x) {"
6374 " return %StringLastIndexOf(x, 'bob', 10);" 7143 " return %StringLastIndexOf(x, 'bob', 10);"
6375 "}"; 7144 "}";
6376 7145
6377 7146
6378 static const char* kNativeCallTest = 7147 static const char* kNativeCallTest =
6379 "call_runtime_last_index_of('bobbobboellebobboellebobbob');"; 7148 "call_runtime_last_index_of('bobbobboellebobboellebobbob');";
6380 7149
6381 // Test that a native runtime calls are supported in extensions. 7150 // Test that a native runtime calls are supported in extensions.
6382 TEST(NativeCallInExtensions) { 7151 TEST(NativeCallInExtensions) {
6383 v8::HandleScope handle_scope(CcTest::isolate()); 7152 v8::HandleScope handle_scope(CcTest::isolate());
6384 v8::RegisterExtension( 7153 v8::RegisterExtension(
6385 new Extension("nativecall", kNativeCallInExtensionSource)); 7154 new Extension("nativecall", kNativeCallInExtensionSource));
6386 const char* extension_names[] = {"nativecall"}; 7155 const char* extension_names[] = {"nativecall"};
6387 v8::ExtensionConfiguration extensions(1, extension_names); 7156 v8::ExtensionConfiguration extensions(1, extension_names);
6388 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7157 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6389 Context::Scope lock(context); 7158 Context::Scope lock(context);
6390 v8::Handle<Value> result = CompileRun(kNativeCallTest); 7159 v8::Local<Value> result = CompileRun(kNativeCallTest);
6391 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 3))); 7160 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 3))
7161 .FromJust());
6392 } 7162 }
6393 7163
6394 7164
6395 class NativeFunctionExtension : public Extension { 7165 class NativeFunctionExtension : public Extension {
6396 public: 7166 public:
6397 NativeFunctionExtension(const char* name, const char* source, 7167 NativeFunctionExtension(const char* name, const char* source,
6398 v8::FunctionCallback fun = &Echo) 7168 v8::FunctionCallback fun = &Echo)
6399 : Extension(name, source), function_(fun) {} 7169 : Extension(name, source), function_(fun) {}
6400 7170
6401 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( 7171 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate(
6402 v8::Isolate* isolate, v8::Handle<v8::String> name) { 7172 v8::Isolate* isolate, v8::Local<v8::String> name) {
6403 return v8::FunctionTemplate::New(isolate, function_); 7173 return v8::FunctionTemplate::New(isolate, function_);
6404 } 7174 }
6405 7175
6406 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { 7176 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) {
6407 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); 7177 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]);
6408 } 7178 }
6409 7179
6410 private: 7180 private:
6411 v8::FunctionCallback function_; 7181 v8::FunctionCallback function_;
6412 }; 7182 };
6413 7183
6414 7184
6415 TEST(NativeFunctionDeclaration) { 7185 TEST(NativeFunctionDeclaration) {
6416 v8::HandleScope handle_scope(CcTest::isolate()); 7186 v8::HandleScope handle_scope(CcTest::isolate());
6417 const char* name = "nativedecl"; 7187 const char* name = "nativedecl";
6418 v8::RegisterExtension( 7188 v8::RegisterExtension(
6419 new NativeFunctionExtension(name, "native function foo();")); 7189 new NativeFunctionExtension(name, "native function foo();"));
6420 const char* extension_names[] = {name}; 7190 const char* extension_names[] = {name};
6421 v8::ExtensionConfiguration extensions(1, extension_names); 7191 v8::ExtensionConfiguration extensions(1, extension_names);
6422 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7192 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6423 Context::Scope lock(context); 7193 Context::Scope lock(context);
6424 v8::Handle<Value> result = CompileRun("foo(42);"); 7194 v8::Local<Value> result = CompileRun("foo(42);");
6425 CHECK(result->Equals(v8::Integer::New(CcTest::isolate(), 42))); 7195 CHECK(result->Equals(context, v8::Integer::New(CcTest::isolate(), 42))
7196 .FromJust());
6426 } 7197 }
6427 7198
6428 7199
6429 TEST(NativeFunctionDeclarationError) { 7200 TEST(NativeFunctionDeclarationError) {
6430 v8::HandleScope handle_scope(CcTest::isolate()); 7201 v8::HandleScope handle_scope(CcTest::isolate());
6431 const char* name = "nativedeclerr"; 7202 const char* name = "nativedeclerr";
6432 // Syntax error in extension code. 7203 // Syntax error in extension code.
6433 v8::RegisterExtension( 7204 v8::RegisterExtension(
6434 new NativeFunctionExtension(name, "native\nfunction foo();")); 7205 new NativeFunctionExtension(name, "native\nfunction foo();"));
6435 const char* extension_names[] = {name}; 7206 const char* extension_names[] = {name};
6436 v8::ExtensionConfiguration extensions(1, extension_names); 7207 v8::ExtensionConfiguration extensions(1, extension_names);
6437 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7208 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6438 CHECK(context.IsEmpty()); 7209 CHECK(context.IsEmpty());
6439 } 7210 }
6440 7211
6441 7212
6442 TEST(NativeFunctionDeclarationErrorEscape) { 7213 TEST(NativeFunctionDeclarationErrorEscape) {
6443 v8::HandleScope handle_scope(CcTest::isolate()); 7214 v8::HandleScope handle_scope(CcTest::isolate());
6444 const char* name = "nativedeclerresc"; 7215 const char* name = "nativedeclerresc";
6445 // Syntax error in extension code - escape code in "native" means that 7216 // Syntax error in extension code - escape code in "native" means that
6446 // it's not treated as a keyword. 7217 // it's not treated as a keyword.
6447 v8::RegisterExtension( 7218 v8::RegisterExtension(
6448 new NativeFunctionExtension(name, "nativ\\u0065 function foo();")); 7219 new NativeFunctionExtension(name, "nativ\\u0065 function foo();"));
6449 const char* extension_names[] = {name}; 7220 const char* extension_names[] = {name};
6450 v8::ExtensionConfiguration extensions(1, extension_names); 7221 v8::ExtensionConfiguration extensions(1, extension_names);
6451 v8::Handle<Context> context = Context::New(CcTest::isolate(), &extensions); 7222 v8::Local<Context> context = Context::New(CcTest::isolate(), &extensions);
6452 CHECK(context.IsEmpty()); 7223 CHECK(context.IsEmpty());
6453 } 7224 }
6454 7225
6455 7226
6456 static void CheckDependencies(const char* name, const char* expected) { 7227 static void CheckDependencies(const char* name, const char* expected) {
6457 v8::HandleScope handle_scope(CcTest::isolate()); 7228 v8::HandleScope handle_scope(CcTest::isolate());
6458 v8::ExtensionConfiguration config(1, &name); 7229 v8::ExtensionConfiguration config(1, &name);
6459 LocalContext context(&config); 7230 LocalContext context(&config);
6460 CHECK(String::NewFromUtf8(CcTest::isolate(), expected) 7231 CHECK(
6461 ->Equals(context->Global()->Get(v8_str("loaded")))); 7232 v8_str(expected)
7233 ->Equals(context.local(), context->Global()
7234 ->Get(context.local(), v8_str("loaded"))
7235 .ToLocalChecked())
7236 .FromJust());
6462 } 7237 }
6463 7238
6464 7239
6465 /* 7240 /*
6466 * Configuration: 7241 * Configuration:
6467 * 7242 *
6468 * /-- B <--\ 7243 * /-- B <--\
6469 * A <- -- D <-- E 7244 * A <- -- D <-- E
6470 * \-- C <--/ 7245 * \-- C <--/
6471 */ 7246 */
6472 THREADED_TEST(ExtensionDependency) { 7247 THREADED_TEST(ExtensionDependency) {
6473 static const char* kEDeps[] = {"D"}; 7248 static const char* kEDeps[] = {"D"};
6474 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps)); 7249 v8::RegisterExtension(new Extension("E", "this.loaded += 'E';", 1, kEDeps));
6475 static const char* kDDeps[] = {"B", "C"}; 7250 static const char* kDDeps[] = {"B", "C"};
6476 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps)); 7251 v8::RegisterExtension(new Extension("D", "this.loaded += 'D';", 2, kDDeps));
6477 static const char* kBCDeps[] = {"A"}; 7252 static const char* kBCDeps[] = {"A"};
6478 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps)); 7253 v8::RegisterExtension(new Extension("B", "this.loaded += 'B';", 1, kBCDeps));
6479 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps)); 7254 v8::RegisterExtension(new Extension("C", "this.loaded += 'C';", 1, kBCDeps));
6480 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';")); 7255 v8::RegisterExtension(new Extension("A", "this.loaded += 'A';"));
6481 CheckDependencies("A", "undefinedA"); 7256 CheckDependencies("A", "undefinedA");
6482 CheckDependencies("B", "undefinedAB"); 7257 CheckDependencies("B", "undefinedAB");
6483 CheckDependencies("C", "undefinedAC"); 7258 CheckDependencies("C", "undefinedAC");
6484 CheckDependencies("D", "undefinedABCD"); 7259 CheckDependencies("D", "undefinedABCD");
6485 CheckDependencies("E", "undefinedABCDE"); 7260 CheckDependencies("E", "undefinedABCDE");
6486 v8::HandleScope handle_scope(CcTest::isolate()); 7261 v8::HandleScope handle_scope(CcTest::isolate());
6487 static const char* exts[2] = {"C", "E"}; 7262 static const char* exts[2] = {"C", "E"};
6488 v8::ExtensionConfiguration config(2, exts); 7263 v8::ExtensionConfiguration config(2, exts);
6489 LocalContext context(&config); 7264 LocalContext context(&config);
6490 CHECK(v8_str("undefinedACBDE") 7265 CHECK(
6491 ->Equals(context->Global()->Get(v8_str("loaded")))); 7266 v8_str("undefinedACBDE")
7267 ->Equals(context.local(), context->Global()
7268 ->Get(context.local(), v8_str("loaded"))
7269 .ToLocalChecked())
7270 .FromJust());
6492 } 7271 }
6493 7272
6494 7273
6495 static const char* kExtensionTestScript = 7274 static const char* kExtensionTestScript =
6496 "native function A();" 7275 "native function A();"
6497 "native function B();" 7276 "native function B();"
6498 "native function C();" 7277 "native function C();"
6499 "function Foo(i) {" 7278 "function Foo(i) {"
6500 " if (i == 0) return A();" 7279 " if (i == 0) return A();"
6501 " if (i == 1) return B();" 7280 " if (i == 1) return B();"
6502 " if (i == 2) return C();" 7281 " if (i == 2) return C();"
6503 "}"; 7282 "}";
6504 7283
6505 7284
6506 static void CallFun(const v8::FunctionCallbackInfo<v8::Value>& args) { 7285 static void CallFun(const v8::FunctionCallbackInfo<v8::Value>& args) {
6507 ApiTestFuzzer::Fuzz(); 7286 ApiTestFuzzer::Fuzz();
6508 if (args.IsConstructCall()) { 7287 if (args.IsConstructCall()) {
6509 args.This()->Set(v8_str("data"), args.Data()); 7288 CHECK(args.This()
7289 ->Set(args.GetIsolate()->GetCurrentContext(), v8_str("data"),
7290 args.Data())
7291 .FromJust());
6510 args.GetReturnValue().SetNull(); 7292 args.GetReturnValue().SetNull();
6511 return; 7293 return;
6512 } 7294 }
6513 args.GetReturnValue().Set(args.Data()); 7295 args.GetReturnValue().Set(args.Data());
6514 } 7296 }
6515 7297
6516 7298
6517 class FunctionExtension : public Extension { 7299 class FunctionExtension : public Extension {
6518 public: 7300 public:
6519 FunctionExtension() : Extension("functiontest", kExtensionTestScript) {} 7301 FunctionExtension() : Extension("functiontest", kExtensionTestScript) {}
6520 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( 7302 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate(
6521 v8::Isolate* isolate, v8::Handle<String> name); 7303 v8::Isolate* isolate, v8::Local<String> name);
6522 }; 7304 };
6523 7305
6524 7306
6525 static int lookup_count = 0; 7307 static int lookup_count = 0;
6526 v8::Handle<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate( 7308 v8::Local<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate(
6527 v8::Isolate* isolate, v8::Handle<String> name) { 7309 v8::Isolate* isolate, v8::Local<String> name) {
6528 lookup_count++; 7310 lookup_count++;
6529 if (name->Equals(v8_str("A"))) { 7311 if (name->Equals(isolate->GetCurrentContext(), v8_str("A")).FromJust()) {
6530 return v8::FunctionTemplate::New(isolate, CallFun, 7312 return v8::FunctionTemplate::New(isolate, CallFun,
6531 v8::Integer::New(isolate, 8)); 7313 v8::Integer::New(isolate, 8));
6532 } else if (name->Equals(v8_str("B"))) { 7314 } else if (name->Equals(isolate->GetCurrentContext(), v8_str("B"))
7315 .FromJust()) {
6533 return v8::FunctionTemplate::New(isolate, CallFun, 7316 return v8::FunctionTemplate::New(isolate, CallFun,
6534 v8::Integer::New(isolate, 7)); 7317 v8::Integer::New(isolate, 7));
6535 } else if (name->Equals(v8_str("C"))) { 7318 } else if (name->Equals(isolate->GetCurrentContext(), v8_str("C"))
7319 .FromJust()) {
6536 return v8::FunctionTemplate::New(isolate, CallFun, 7320 return v8::FunctionTemplate::New(isolate, CallFun,
6537 v8::Integer::New(isolate, 6)); 7321 v8::Integer::New(isolate, 6));
6538 } else { 7322 } else {
6539 return v8::Handle<v8::FunctionTemplate>(); 7323 return v8::Local<v8::FunctionTemplate>();
6540 } 7324 }
6541 } 7325 }
6542 7326
6543 7327
6544 THREADED_TEST(FunctionLookup) { 7328 THREADED_TEST(FunctionLookup) {
6545 v8::RegisterExtension(new FunctionExtension()); 7329 v8::RegisterExtension(new FunctionExtension());
6546 v8::HandleScope handle_scope(CcTest::isolate()); 7330 v8::HandleScope handle_scope(CcTest::isolate());
6547 static const char* exts[1] = {"functiontest"}; 7331 static const char* exts[1] = {"functiontest"};
6548 v8::ExtensionConfiguration config(1, exts); 7332 v8::ExtensionConfiguration config(1, exts);
6549 LocalContext context(&config); 7333 LocalContext context(&config);
6550 CHECK_EQ(3, lookup_count); 7334 CHECK_EQ(3, lookup_count);
6551 CHECK(v8::Integer::New(CcTest::isolate(), 8)->Equals(CompileRun("Foo(0)"))); 7335 CHECK(v8::Integer::New(CcTest::isolate(), 8)
6552 CHECK(v8::Integer::New(CcTest::isolate(), 7)->Equals(CompileRun("Foo(1)"))); 7336 ->Equals(context.local(), CompileRun("Foo(0)"))
6553 CHECK(v8::Integer::New(CcTest::isolate(), 6)->Equals(CompileRun("Foo(2)"))); 7337 .FromJust());
7338 CHECK(v8::Integer::New(CcTest::isolate(), 7)
7339 ->Equals(context.local(), CompileRun("Foo(1)"))
7340 .FromJust());
7341 CHECK(v8::Integer::New(CcTest::isolate(), 6)
7342 ->Equals(context.local(), CompileRun("Foo(2)"))
7343 .FromJust());
6554 } 7344 }
6555 7345
6556 7346
6557 THREADED_TEST(NativeFunctionConstructCall) { 7347 THREADED_TEST(NativeFunctionConstructCall) {
6558 v8::RegisterExtension(new FunctionExtension()); 7348 v8::RegisterExtension(new FunctionExtension());
6559 v8::HandleScope handle_scope(CcTest::isolate()); 7349 v8::HandleScope handle_scope(CcTest::isolate());
6560 static const char* exts[1] = {"functiontest"}; 7350 static const char* exts[1] = {"functiontest"};
6561 v8::ExtensionConfiguration config(1, exts); 7351 v8::ExtensionConfiguration config(1, exts);
6562 LocalContext context(&config); 7352 LocalContext context(&config);
6563 for (int i = 0; i < 10; i++) { 7353 for (int i = 0; i < 10; i++) {
6564 // Run a few times to ensure that allocation of objects doesn't 7354 // Run a few times to ensure that allocation of objects doesn't
6565 // change behavior of a constructor function. 7355 // change behavior of a constructor function.
6566 CHECK(v8::Integer::New(CcTest::isolate(), 8) 7356 CHECK(v8::Integer::New(CcTest::isolate(), 8)
6567 ->Equals(CompileRun("(new A()).data"))); 7357 ->Equals(context.local(), CompileRun("(new A()).data"))
7358 .FromJust());
6568 CHECK(v8::Integer::New(CcTest::isolate(), 7) 7359 CHECK(v8::Integer::New(CcTest::isolate(), 7)
6569 ->Equals(CompileRun("(new B()).data"))); 7360 ->Equals(context.local(), CompileRun("(new B()).data"))
7361 .FromJust());
6570 CHECK(v8::Integer::New(CcTest::isolate(), 6) 7362 CHECK(v8::Integer::New(CcTest::isolate(), 6)
6571 ->Equals(CompileRun("(new C()).data"))); 7363 ->Equals(context.local(), CompileRun("(new C()).data"))
7364 .FromJust());
6572 } 7365 }
6573 } 7366 }
6574 7367
6575 7368
6576 static const char* last_location; 7369 static const char* last_location;
6577 static const char* last_message; 7370 static const char* last_message;
6578 void StoringErrorCallback(const char* location, const char* message) { 7371 void StoringErrorCallback(const char* location, const char* message) {
6579 if (last_location == NULL) { 7372 if (last_location == NULL) {
6580 last_location = location; 7373 last_location = location;
6581 last_message = message; 7374 last_message = message;
6582 } 7375 }
6583 } 7376 }
6584 7377
6585 7378
6586 // ErrorReporting creates a circular extensions configuration and 7379 // ErrorReporting creates a circular extensions configuration and
6587 // tests that the fatal error handler gets called. This renders V8 7380 // tests that the fatal error handler gets called. This renders V8
6588 // unusable and therefore this test cannot be run in parallel. 7381 // unusable and therefore this test cannot be run in parallel.
6589 TEST(ErrorReporting) { 7382 TEST(ErrorReporting) {
6590 v8::V8::SetFatalErrorHandler(StoringErrorCallback); 7383 CcTest::isolate()->SetFatalErrorHandler(StoringErrorCallback);
6591 static const char* aDeps[] = {"B"}; 7384 static const char* aDeps[] = {"B"};
6592 v8::RegisterExtension(new Extension("A", "", 1, aDeps)); 7385 v8::RegisterExtension(new Extension("A", "", 1, aDeps));
6593 static const char* bDeps[] = {"A"}; 7386 static const char* bDeps[] = {"A"};
6594 v8::RegisterExtension(new Extension("B", "", 1, bDeps)); 7387 v8::RegisterExtension(new Extension("B", "", 1, bDeps));
6595 last_location = NULL; 7388 last_location = NULL;
6596 v8::ExtensionConfiguration config(1, bDeps); 7389 v8::ExtensionConfiguration config(1, bDeps);
6597 v8::Handle<Context> context = Context::New(CcTest::isolate(), &config); 7390 v8::Local<Context> context = Context::New(CcTest::isolate(), &config);
6598 CHECK(context.IsEmpty()); 7391 CHECK(context.IsEmpty());
6599 CHECK(last_location); 7392 CHECK(last_location);
6600 } 7393 }
6601 7394
6602 7395
6603 static void MissingScriptInfoMessageListener(v8::Handle<v8::Message> message, 7396 static void MissingScriptInfoMessageListener(v8::Local<v8::Message> message,
6604 v8::Handle<Value> data) { 7397 v8::Local<Value> data) {
7398 v8::Isolate* isolate = CcTest::isolate();
7399 Local<Context> context = isolate->GetCurrentContext();
6605 CHECK(message->GetScriptOrigin().ResourceName()->IsUndefined()); 7400 CHECK(message->GetScriptOrigin().ResourceName()->IsUndefined());
6606 CHECK(v8::Undefined(CcTest::isolate()) 7401 CHECK(v8::Undefined(isolate)
6607 ->Equals(message->GetScriptOrigin().ResourceName())); 7402 ->Equals(context, message->GetScriptOrigin().ResourceName())
6608 message->GetLineNumber(); 7403 .FromJust());
6609 message->GetSourceLine(); 7404 message->GetLineNumber(context).FromJust();
7405 message->GetSourceLine(context).ToLocalChecked();
6610 } 7406 }
6611 7407
6612 7408
6613 THREADED_TEST(ErrorWithMissingScriptInfo) { 7409 THREADED_TEST(ErrorWithMissingScriptInfo) {
6614 LocalContext context; 7410 LocalContext context;
6615 v8::HandleScope scope(context->GetIsolate()); 7411 v8::HandleScope scope(context->GetIsolate());
6616 v8::V8::AddMessageListener(MissingScriptInfoMessageListener); 7412 context->GetIsolate()->AddMessageListener(MissingScriptInfoMessageListener);
6617 CompileRun("throw Error()"); 7413 CompileRun("throw Error()");
6618 v8::V8::RemoveMessageListeners(MissingScriptInfoMessageListener); 7414 context->GetIsolate()->RemoveMessageListeners(
7415 MissingScriptInfoMessageListener);
6619 } 7416 }
6620 7417
6621 7418
6622 struct FlagAndPersistent { 7419 struct FlagAndPersistent {
6623 bool flag; 7420 bool flag;
6624 v8::Global<v8::Object> handle; 7421 v8::Global<v8::Object> handle;
6625 }; 7422 };
6626 7423
6627 7424
6628 static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) { 7425 static void SetFlag(const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
6629 data.GetParameter()->flag = true; 7426 data.GetParameter()->flag = true;
6630 data.GetParameter()->handle.Reset(); 7427 data.GetParameter()->handle.Reset();
6631 } 7428 }
6632 7429
6633 7430
6634 static void IndependentWeakHandle(bool global_gc, bool interlinked) { 7431 static void IndependentWeakHandle(bool global_gc, bool interlinked) {
6635 v8::Isolate* iso = CcTest::isolate(); 7432 v8::Isolate* iso = CcTest::isolate();
6636 v8::HandleScope scope(iso); 7433 v8::HandleScope scope(iso);
6637 v8::Handle<Context> context = Context::New(iso); 7434 v8::Local<Context> context = Context::New(iso);
6638 Context::Scope context_scope(context); 7435 Context::Scope context_scope(context);
6639 7436
6640 FlagAndPersistent object_a, object_b; 7437 FlagAndPersistent object_a, object_b;
6641 7438
6642 intptr_t big_heap_size; 7439 intptr_t big_heap_size;
6643 7440
6644 { 7441 {
6645 v8::HandleScope handle_scope(iso); 7442 v8::HandleScope handle_scope(iso);
6646 Local<Object> a(v8::Object::New(iso)); 7443 Local<Object> a(v8::Object::New(iso));
6647 Local<Object> b(v8::Object::New(iso)); 7444 Local<Object> b(v8::Object::New(iso));
6648 object_a.handle.Reset(iso, a); 7445 object_a.handle.Reset(iso, a);
6649 object_b.handle.Reset(iso, b); 7446 object_b.handle.Reset(iso, b);
6650 if (interlinked) { 7447 if (interlinked) {
6651 a->Set(v8_str("x"), b); 7448 a->Set(context, v8_str("x"), b).FromJust();
6652 b->Set(v8_str("x"), a); 7449 b->Set(context, v8_str("x"), a).FromJust();
6653 } 7450 }
6654 if (global_gc) { 7451 if (global_gc) {
6655 CcTest::heap()->CollectAllGarbage(); 7452 CcTest::heap()->CollectAllGarbage();
6656 } else { 7453 } else {
6657 CcTest::heap()->CollectGarbage(i::NEW_SPACE); 7454 CcTest::heap()->CollectGarbage(i::NEW_SPACE);
6658 } 7455 }
6659 // We are relying on this creating a big flag array and reserving the space 7456 // We are relying on this creating a big flag array and reserving the space
6660 // up front. 7457 // up front.
6661 v8::Handle<Value> big_array = CompileRun("new Array(5000)"); 7458 v8::Local<Value> big_array = CompileRun("new Array(5000)");
6662 a->Set(v8_str("y"), big_array); 7459 a->Set(context, v8_str("y"), big_array).FromJust();
6663 big_heap_size = CcTest::heap()->SizeOfObjects(); 7460 big_heap_size = CcTest::heap()->SizeOfObjects();
6664 } 7461 }
6665 7462
6666 object_a.flag = false; 7463 object_a.flag = false;
6667 object_b.flag = false; 7464 object_b.flag = false;
6668 object_a.handle.SetWeak(&object_a, &SetFlag, 7465 object_a.handle.SetWeak(&object_a, &SetFlag,
6669 v8::WeakCallbackType::kParameter); 7466 v8::WeakCallbackType::kParameter);
6670 object_b.handle.SetWeak(&object_b, &SetFlag, 7467 object_b.handle.SetWeak(&object_b, &SetFlag,
6671 v8::WeakCallbackType::kParameter); 7468 v8::WeakCallbackType::kParameter);
6672 CHECK(!object_b.handle.IsIndependent()); 7469 CHECK(!object_b.handle.IsIndependent());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
6719 private: 7516 private:
6720 int y_; 7517 int y_;
6721 int x_; 7518 int x_;
6722 }; 7519 };
6723 7520
6724 7521
6725 void CheckInternalFields( 7522 void CheckInternalFields(
6726 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) { 7523 const v8::WeakCallbackInfo<v8::Persistent<v8::Object>>& data) {
6727 v8::Persistent<v8::Object>* handle = data.GetParameter(); 7524 v8::Persistent<v8::Object>* handle = data.GetParameter();
6728 handle->Reset(); 7525 handle->Reset();
6729 Trivial* t1 = reinterpret_cast<Trivial*>(data.GetInternalField1()); 7526 Trivial* t1 = reinterpret_cast<Trivial*>(data.GetInternalField(0));
6730 Trivial2* t2 = reinterpret_cast<Trivial2*>(data.GetInternalField2()); 7527 Trivial2* t2 = reinterpret_cast<Trivial2*>(data.GetInternalField(1));
6731 CHECK_EQ(42, t1->x()); 7528 CHECK_EQ(42, t1->x());
6732 CHECK_EQ(103, t2->x()); 7529 CHECK_EQ(103, t2->x());
6733 t1->set_x(1729); 7530 t1->set_x(1729);
6734 t2->set_x(33550336); 7531 t2->set_x(33550336);
6735 } 7532 }
6736 7533
6737 7534
6738 void InternalFieldCallback(bool global_gc) { 7535 void InternalFieldCallback(bool global_gc) {
6739 LocalContext env; 7536 LocalContext env;
6740 v8::Isolate* isolate = env->GetIsolate(); 7537 v8::Isolate* isolate = env->GetIsolate();
6741 v8::HandleScope scope(isolate); 7538 v8::HandleScope scope(isolate);
6742 7539
6743 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 7540 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
6744 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); 7541 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate();
6745 Trivial* t1; 7542 Trivial* t1;
6746 Trivial2* t2; 7543 Trivial2* t2;
6747 instance_templ->SetInternalFieldCount(2); 7544 instance_templ->SetInternalFieldCount(2);
6748 { 7545 {
6749 v8::HandleScope scope(isolate); 7546 v8::HandleScope scope(isolate);
6750 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); 7547 Local<v8::Object> obj = templ->GetFunction(env.local())
7548 .ToLocalChecked()
7549 ->NewInstance(env.local())
7550 .ToLocalChecked();
6751 v8::Persistent<v8::Object> handle(isolate, obj); 7551 v8::Persistent<v8::Object> handle(isolate, obj);
6752 CHECK_EQ(2, obj->InternalFieldCount()); 7552 CHECK_EQ(2, obj->InternalFieldCount());
6753 CHECK(obj->GetInternalField(0)->IsUndefined()); 7553 CHECK(obj->GetInternalField(0)->IsUndefined());
6754 t1 = new Trivial(42); 7554 t1 = new Trivial(42);
6755 t2 = new Trivial2(103, 9); 7555 t2 = new Trivial2(103, 9);
6756 7556
6757 obj->SetAlignedPointerInInternalField(0, t1); 7557 obj->SetAlignedPointerInInternalField(0, t1);
6758 t1 = reinterpret_cast<Trivial*>(obj->GetAlignedPointerFromInternalField(0)); 7558 t1 = reinterpret_cast<Trivial*>(obj->GetAlignedPointerFromInternalField(0));
6759 CHECK_EQ(42, t1->x()); 7559 CHECK_EQ(42, t1->x());
6760 7560
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
6798 } 7598 }
6799 7599
6800 7600
6801 void v8::internal::HeapTester::ResetWeakHandle(bool global_gc) { 7601 void v8::internal::HeapTester::ResetWeakHandle(bool global_gc) {
6802 using v8::Context; 7602 using v8::Context;
6803 using v8::Local; 7603 using v8::Local;
6804 using v8::Object; 7604 using v8::Object;
6805 7605
6806 v8::Isolate* iso = CcTest::isolate(); 7606 v8::Isolate* iso = CcTest::isolate();
6807 v8::HandleScope scope(iso); 7607 v8::HandleScope scope(iso);
6808 v8::Handle<Context> context = Context::New(iso); 7608 v8::Local<Context> context = Context::New(iso);
6809 Context::Scope context_scope(context); 7609 Context::Scope context_scope(context);
6810 7610
6811 FlagAndPersistent object_a, object_b; 7611 FlagAndPersistent object_a, object_b;
6812 7612
6813 { 7613 {
6814 v8::HandleScope handle_scope(iso); 7614 v8::HandleScope handle_scope(iso);
6815 Local<Object> a(v8::Object::New(iso)); 7615 Local<Object> a(v8::Object::New(iso));
6816 Local<Object> b(v8::Object::New(iso)); 7616 Local<Object> b(v8::Object::New(iso));
6817 object_a.handle.Reset(iso, a); 7617 object_a.handle.Reset(iso, a);
6818 object_b.handle.Reset(iso, b); 7618 object_b.handle.Reset(iso, b);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
6879 const v8::WeakCallbackInfo<FlagAndPersistent>& data) { 7679 const v8::WeakCallbackInfo<FlagAndPersistent>& data) {
6880 data.GetParameter()->handle.Reset(); 7680 data.GetParameter()->handle.Reset();
6881 data.SetSecondPassCallback(ForceMarkSweep2); 7681 data.SetSecondPassCallback(ForceMarkSweep2);
6882 } 7682 }
6883 7683
6884 7684
6885 THREADED_TEST(GCFromWeakCallbacks) { 7685 THREADED_TEST(GCFromWeakCallbacks) {
6886 v8::Isolate* isolate = CcTest::isolate(); 7686 v8::Isolate* isolate = CcTest::isolate();
6887 v8::Locker locker(CcTest::isolate()); 7687 v8::Locker locker(CcTest::isolate());
6888 v8::HandleScope scope(isolate); 7688 v8::HandleScope scope(isolate);
6889 v8::Handle<Context> context = Context::New(isolate); 7689 v8::Local<Context> context = Context::New(isolate);
6890 Context::Scope context_scope(context); 7690 Context::Scope context_scope(context);
6891 7691
6892 static const int kNumberOfGCTypes = 2; 7692 static const int kNumberOfGCTypes = 2;
6893 typedef v8::WeakCallbackInfo<FlagAndPersistent>::Callback Callback; 7693 typedef v8::WeakCallbackInfo<FlagAndPersistent>::Callback Callback;
6894 Callback gc_forcing_callback[kNumberOfGCTypes] = {&ForceScavenge1, 7694 Callback gc_forcing_callback[kNumberOfGCTypes] = {&ForceScavenge1,
6895 &ForceMarkSweep1}; 7695 &ForceMarkSweep1};
6896 7696
6897 typedef void (*GCInvoker)(); 7697 typedef void (*GCInvoker)();
6898 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep}; 7698 GCInvoker invoke_gc[kNumberOfGCTypes] = {&InvokeScavenge, &InvokeMarkSweep};
6899 7699
6900 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) { 7700 for (int outer_gc = 0; outer_gc < kNumberOfGCTypes; outer_gc++) {
6901 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) { 7701 for (int inner_gc = 0; inner_gc < kNumberOfGCTypes; inner_gc++) {
6902 FlagAndPersistent object; 7702 FlagAndPersistent object;
6903 { 7703 {
6904 v8::HandleScope handle_scope(isolate); 7704 v8::HandleScope handle_scope(isolate);
6905 object.handle.Reset(isolate, v8::Object::New(isolate)); 7705 object.handle.Reset(isolate, v8::Object::New(isolate));
6906 } 7706 }
6907 object.flag = false; 7707 object.flag = false;
6908 object.handle.SetWeak(&object, gc_forcing_callback[inner_gc], 7708 object.handle.SetWeak(&object, gc_forcing_callback[inner_gc],
6909 v8::WeakCallbackType::kParameter); 7709 v8::WeakCallbackType::kParameter);
6910 object.handle.MarkIndependent(); 7710 object.handle.MarkIndependent();
6911 invoke_gc[outer_gc](); 7711 invoke_gc[outer_gc]();
6912 EmptyMessageQueues(isolate); 7712 EmptyMessageQueues(isolate);
6913 CHECK(object.flag); 7713 CHECK(object.flag);
6914 } 7714 }
6915 } 7715 }
6916 } 7716 }
6917 7717
6918 7718
6919 v8::Handle<Function> args_fun; 7719 v8::Local<Function> args_fun;
6920 7720
6921 7721
6922 static void ArgumentsTestCallback( 7722 static void ArgumentsTestCallback(
6923 const v8::FunctionCallbackInfo<v8::Value>& args) { 7723 const v8::FunctionCallbackInfo<v8::Value>& args) {
6924 ApiTestFuzzer::Fuzz(); 7724 ApiTestFuzzer::Fuzz();
6925 v8::Isolate* isolate = args.GetIsolate(); 7725 v8::Isolate* isolate = args.GetIsolate();
6926 CHECK(args_fun->Equals(args.Callee())); 7726 Local<Context> context = isolate->GetCurrentContext();
7727 CHECK(args_fun->Equals(context, args.Callee()).FromJust());
6927 CHECK_EQ(3, args.Length()); 7728 CHECK_EQ(3, args.Length());
6928 CHECK(v8::Integer::New(isolate, 1)->Equals(args[0])); 7729 CHECK(v8::Integer::New(isolate, 1)->Equals(context, args[0]).FromJust());
6929 CHECK(v8::Integer::New(isolate, 2)->Equals(args[1])); 7730 CHECK(v8::Integer::New(isolate, 2)->Equals(context, args[1]).FromJust());
6930 CHECK(v8::Integer::New(isolate, 3)->Equals(args[2])); 7731 CHECK(v8::Integer::New(isolate, 3)->Equals(context, args[2]).FromJust());
6931 CHECK(v8::Undefined(isolate)->Equals(args[3])); 7732 CHECK(v8::Undefined(isolate)->Equals(context, args[3]).FromJust());
6932 v8::HandleScope scope(args.GetIsolate()); 7733 v8::HandleScope scope(args.GetIsolate());
6933 CcTest::heap()->CollectAllGarbage(); 7734 CcTest::heap()->CollectAllGarbage();
6934 } 7735 }
6935 7736
6936 7737
6937 THREADED_TEST(Arguments) { 7738 THREADED_TEST(Arguments) {
6938 v8::Isolate* isolate = CcTest::isolate(); 7739 v8::Isolate* isolate = CcTest::isolate();
6939 v8::HandleScope scope(isolate); 7740 v8::HandleScope scope(isolate);
6940 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(isolate); 7741 v8::Local<v8::ObjectTemplate> global = ObjectTemplate::New(isolate);
6941 global->Set(v8_str("f"), 7742 global->Set(v8_str("f"),
6942 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); 7743 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback));
6943 LocalContext context(NULL, global); 7744 LocalContext context(NULL, global);
6944 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); 7745 args_fun = context->Global()
6945 v8_compile("f(1, 2, 3)")->Run(); 7746 ->Get(context.local(), v8_str("f"))
7747 .ToLocalChecked()
7748 .As<Function>();
7749 v8_compile("f(1, 2, 3)")->Run(context.local()).ToLocalChecked();
6946 } 7750 }
6947 7751
6948 7752
6949 static int p_getter_count; 7753 static int p_getter_count;
6950 static int p_getter_count2; 7754 static int p_getter_count2;
6951 7755
6952 7756
6953 static void PGetter(Local<String> name, 7757 static void PGetter(Local<Name> name,
6954 const v8::PropertyCallbackInfo<v8::Value>& info) { 7758 const v8::PropertyCallbackInfo<v8::Value>& info) {
6955 ApiTestFuzzer::Fuzz(); 7759 ApiTestFuzzer::Fuzz();
6956 p_getter_count++; 7760 p_getter_count++;
6957 v8::Handle<v8::Object> global = 7761 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
6958 info.GetIsolate()->GetCurrentContext()->Global(); 7762 v8::Local<v8::Object> global = context->Global();
6959 CHECK(info.Holder()->Equals(global->Get(v8_str("o1")))); 7763 CHECK(
6960 if (name->Equals(v8_str("p1"))) { 7764 info.Holder()
6961 CHECK(info.This()->Equals(global->Get(v8_str("o1")))); 7765 ->Equals(context, global->Get(context, v8_str("o1")).ToLocalChecked())
6962 } else if (name->Equals(v8_str("p2"))) { 7766 .FromJust());
6963 CHECK(info.This()->Equals(global->Get(v8_str("o2")))); 7767 if (name->Equals(context, v8_str("p1")).FromJust()) {
6964 } else if (name->Equals(v8_str("p3"))) { 7768 CHECK(info.This()
6965 CHECK(info.This()->Equals(global->Get(v8_str("o3")))); 7769 ->Equals(context,
6966 } else if (name->Equals(v8_str("p4"))) { 7770 global->Get(context, v8_str("o1")).ToLocalChecked())
6967 CHECK(info.This()->Equals(global->Get(v8_str("o4")))); 7771 .FromJust());
7772 } else if (name->Equals(context, v8_str("p2")).FromJust()) {
7773 CHECK(info.This()
7774 ->Equals(context,
7775 global->Get(context, v8_str("o2")).ToLocalChecked())
7776 .FromJust());
7777 } else if (name->Equals(context, v8_str("p3")).FromJust()) {
7778 CHECK(info.This()
7779 ->Equals(context,
7780 global->Get(context, v8_str("o3")).ToLocalChecked())
7781 .FromJust());
7782 } else if (name->Equals(context, v8_str("p4")).FromJust()) {
7783 CHECK(info.This()
7784 ->Equals(context,
7785 global->Get(context, v8_str("o4")).ToLocalChecked())
7786 .FromJust());
6968 } 7787 }
6969 } 7788 }
6970 7789
6971 7790
6972 static void RunHolderTest(v8::Handle<v8::ObjectTemplate> obj) { 7791 static void RunHolderTest(v8::Local<v8::ObjectTemplate> obj) {
6973 ApiTestFuzzer::Fuzz(); 7792 ApiTestFuzzer::Fuzz();
6974 LocalContext context; 7793 LocalContext context;
6975 context->Global()->Set(v8_str("o1"), obj->NewInstance()); 7794 CHECK(context->Global()
7795 ->Set(context.local(), v8_str("o1"),
7796 obj->NewInstance(context.local()).ToLocalChecked())
7797 .FromJust());
6976 CompileRun( 7798 CompileRun(
6977 "o1.__proto__ = { };" 7799 "o1.__proto__ = { };"
6978 "var o2 = { __proto__: o1 };" 7800 "var o2 = { __proto__: o1 };"
6979 "var o3 = { __proto__: o2 };" 7801 "var o3 = { __proto__: o2 };"
6980 "var o4 = { __proto__: o3 };" 7802 "var o4 = { __proto__: o3 };"
6981 "for (var i = 0; i < 10; i++) o4.p4;" 7803 "for (var i = 0; i < 10; i++) o4.p4;"
6982 "for (var i = 0; i < 10; i++) o3.p3;" 7804 "for (var i = 0; i < 10; i++) o3.p3;"
6983 "for (var i = 0; i < 10; i++) o2.p2;" 7805 "for (var i = 0; i < 10; i++) o2.p2;"
6984 "for (var i = 0; i < 10; i++) o1.p1;"); 7806 "for (var i = 0; i < 10; i++) o1.p1;");
6985 } 7807 }
6986 7808
6987 7809
6988 static void PGetter2(Local<Name> name, 7810 static void PGetter2(Local<Name> name,
6989 const v8::PropertyCallbackInfo<v8::Value>& info) { 7811 const v8::PropertyCallbackInfo<v8::Value>& info) {
6990 ApiTestFuzzer::Fuzz(); 7812 ApiTestFuzzer::Fuzz();
6991 p_getter_count2++; 7813 p_getter_count2++;
6992 v8::Handle<v8::Object> global = 7814 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
6993 info.GetIsolate()->GetCurrentContext()->Global(); 7815 v8::Local<v8::Object> global = context->Global();
6994 CHECK(info.Holder()->Equals(global->Get(v8_str("o1")))); 7816 CHECK(
6995 if (name->Equals(v8_str("p1"))) { 7817 info.Holder()
6996 CHECK(info.This()->Equals(global->Get(v8_str("o1")))); 7818 ->Equals(context, global->Get(context, v8_str("o1")).ToLocalChecked())
6997 } else if (name->Equals(v8_str("p2"))) { 7819 .FromJust());
6998 CHECK(info.This()->Equals(global->Get(v8_str("o2")))); 7820 if (name->Equals(context, v8_str("p1")).FromJust()) {
6999 } else if (name->Equals(v8_str("p3"))) { 7821 CHECK(info.This()
7000 CHECK(info.This()->Equals(global->Get(v8_str("o3")))); 7822 ->Equals(context,
7001 } else if (name->Equals(v8_str("p4"))) { 7823 global->Get(context, v8_str("o1")).ToLocalChecked())
7002 CHECK(info.This()->Equals(global->Get(v8_str("o4")))); 7824 .FromJust());
7825 } else if (name->Equals(context, v8_str("p2")).FromJust()) {
7826 CHECK(info.This()
7827 ->Equals(context,
7828 global->Get(context, v8_str("o2")).ToLocalChecked())
7829 .FromJust());
7830 } else if (name->Equals(context, v8_str("p3")).FromJust()) {
7831 CHECK(info.This()
7832 ->Equals(context,
7833 global->Get(context, v8_str("o3")).ToLocalChecked())
7834 .FromJust());
7835 } else if (name->Equals(context, v8_str("p4")).FromJust()) {
7836 CHECK(info.This()
7837 ->Equals(context,
7838 global->Get(context, v8_str("o4")).ToLocalChecked())
7839 .FromJust());
7003 } 7840 }
7004 } 7841 }
7005 7842
7006 7843
7007 THREADED_TEST(GetterHolders) { 7844 THREADED_TEST(GetterHolders) {
7008 v8::Isolate* isolate = CcTest::isolate(); 7845 v8::Isolate* isolate = CcTest::isolate();
7009 v8::HandleScope scope(isolate); 7846 v8::HandleScope scope(isolate);
7010 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); 7847 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7011 obj->SetAccessor(v8_str("p1"), PGetter); 7848 obj->SetAccessor(v8_str("p1"), PGetter);
7012 obj->SetAccessor(v8_str("p2"), PGetter); 7849 obj->SetAccessor(v8_str("p2"), PGetter);
7013 obj->SetAccessor(v8_str("p3"), PGetter); 7850 obj->SetAccessor(v8_str("p3"), PGetter);
7014 obj->SetAccessor(v8_str("p4"), PGetter); 7851 obj->SetAccessor(v8_str("p4"), PGetter);
7015 p_getter_count = 0; 7852 p_getter_count = 0;
7016 RunHolderTest(obj); 7853 RunHolderTest(obj);
7017 CHECK_EQ(40, p_getter_count); 7854 CHECK_EQ(40, p_getter_count);
7018 } 7855 }
7019 7856
7020 7857
7021 THREADED_TEST(PreInterceptorHolders) { 7858 THREADED_TEST(PreInterceptorHolders) {
7022 v8::Isolate* isolate = CcTest::isolate(); 7859 v8::Isolate* isolate = CcTest::isolate();
7023 v8::HandleScope scope(isolate); 7860 v8::HandleScope scope(isolate);
7024 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); 7861 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7025 obj->SetHandler(v8::NamedPropertyHandlerConfiguration(PGetter2)); 7862 obj->SetHandler(v8::NamedPropertyHandlerConfiguration(PGetter2));
7026 p_getter_count2 = 0; 7863 p_getter_count2 = 0;
7027 RunHolderTest(obj); 7864 RunHolderTest(obj);
7028 CHECK_EQ(40, p_getter_count2); 7865 CHECK_EQ(40, p_getter_count2);
7029 } 7866 }
7030 7867
7031 7868
7032 THREADED_TEST(ObjectInstantiation) { 7869 THREADED_TEST(ObjectInstantiation) {
7033 v8::Isolate* isolate = CcTest::isolate(); 7870 v8::Isolate* isolate = CcTest::isolate();
7034 v8::HandleScope scope(isolate); 7871 v8::HandleScope scope(isolate);
7035 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); 7872 v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate);
7036 templ->SetAccessor(v8_str("t"), PGetter2); 7873 templ->SetAccessor(v8_str("t"), PGetter2);
7037 LocalContext context; 7874 LocalContext context;
7038 context->Global()->Set(v8_str("o"), templ->NewInstance()); 7875 CHECK(context->Global()
7876 ->Set(context.local(), v8_str("o"),
7877 templ->NewInstance(context.local()).ToLocalChecked())
7878 .FromJust());
7039 for (int i = 0; i < 100; i++) { 7879 for (int i = 0; i < 100; i++) {
7040 v8::HandleScope inner_scope(CcTest::isolate()); 7880 v8::HandleScope inner_scope(CcTest::isolate());
7041 v8::Handle<v8::Object> obj = templ->NewInstance(); 7881 v8::Local<v8::Object> obj =
7042 CHECK(!obj->Equals(context->Global()->Get(v8_str("o")))); 7882 templ->NewInstance(context.local()).ToLocalChecked();
7043 context->Global()->Set(v8_str("o2"), obj); 7883 CHECK(!obj->Equals(context.local(), context->Global()
7044 v8::Handle<Value> value = 7884 ->Get(context.local(), v8_str("o"))
7045 CompileRun("o.__proto__ === o2.__proto__"); 7885 .ToLocalChecked())
7046 CHECK(v8::True(isolate)->Equals(value)); 7886 .FromJust());
7047 context->Global()->Set(v8_str("o"), obj); 7887 CHECK(
7888 context->Global()->Set(context.local(), v8_str("o2"), obj).FromJust());
7889 v8::Local<Value> value = CompileRun("o.__proto__ === o2.__proto__");
7890 CHECK(v8::True(isolate)->Equals(context.local(), value).FromJust());
7891 CHECK(context->Global()->Set(context.local(), v8_str("o"), obj).FromJust());
7048 } 7892 }
7049 } 7893 }
7050 7894
7051 7895
7052 static int StrCmp16(uint16_t* a, uint16_t* b) { 7896 static int StrCmp16(uint16_t* a, uint16_t* b) {
7053 while (true) { 7897 while (true) {
7054 if (*a == 0 && *b == 0) return 0; 7898 if (*a == 0 && *b == 0) return 0;
7055 if (*a != *b) return 0 + *a - *b; 7899 if (*a != *b) return 0 + *a - *b;
7056 a++; 7900 a++;
7057 b++; 7901 b++;
7058 } 7902 }
7059 } 7903 }
7060 7904
7061 7905
7062 static int StrNCmp16(uint16_t* a, uint16_t* b, int n) { 7906 static int StrNCmp16(uint16_t* a, uint16_t* b, int n) {
7063 while (true) { 7907 while (true) {
7064 if (n-- == 0) return 0; 7908 if (n-- == 0) return 0;
7065 if (*a == 0 && *b == 0) return 0; 7909 if (*a == 0 && *b == 0) return 0;
7066 if (*a != *b) return 0 + *a - *b; 7910 if (*a != *b) return 0 + *a - *b;
7067 a++; 7911 a++;
7068 b++; 7912 b++;
7069 } 7913 }
7070 } 7914 }
7071 7915
7072 7916
7073 int GetUtf8Length(Handle<String> str) { 7917 int GetUtf8Length(Local<String> str) {
7074 int len = str->Utf8Length(); 7918 int len = str->Utf8Length();
7075 if (len < 0) { 7919 if (len < 0) {
7076 i::Handle<i::String> istr(v8::Utils::OpenHandle(*str)); 7920 i::Handle<i::String> istr(v8::Utils::OpenHandle(*str));
7077 i::String::Flatten(istr); 7921 i::String::Flatten(istr);
7078 len = str->Utf8Length(); 7922 len = str->Utf8Length();
7079 } 7923 }
7080 return len; 7924 return len;
7081 } 7925 }
7082 7926
7083 7927
7084 THREADED_TEST(StringWrite) { 7928 THREADED_TEST(StringWrite) {
7085 LocalContext context; 7929 LocalContext context;
7086 v8::HandleScope scope(context->GetIsolate()); 7930 v8::HandleScope scope(context->GetIsolate());
7087 v8::Handle<String> str = v8_str("abcde"); 7931 v8::Local<String> str = v8_str("abcde");
7088 // abc<Icelandic eth><Unicode snowman>. 7932 // abc<Icelandic eth><Unicode snowman>.
7089 v8::Handle<String> str2 = v8_str("abc\303\260\342\230\203"); 7933 v8::Local<String> str2 = v8_str("abc\303\260\342\230\203");
7090 v8::Handle<String> str3 = v8::String::NewFromUtf8( 7934 v8::Local<String> str3 =
7091 context->GetIsolate(), "abc\0def", v8::String::kNormalString, 7); 7935 v8::String::NewFromUtf8(context->GetIsolate(), "abc\0def",
7936 v8::NewStringType::kNormal, 7)
7937 .ToLocalChecked();
7092 // "ab" + lead surrogate + "cd" + trail surrogate + "ef" 7938 // "ab" + lead surrogate + "cd" + trail surrogate + "ef"
7093 uint16_t orphans[8] = { 0x61, 0x62, 0xd800, 0x63, 0x64, 0xdc00, 0x65, 0x66 }; 7939 uint16_t orphans[8] = { 0x61, 0x62, 0xd800, 0x63, 0x64, 0xdc00, 0x65, 0x66 };
7094 v8::Handle<String> orphans_str = v8::String::NewFromTwoByte( 7940 v8::Local<String> orphans_str =
7095 context->GetIsolate(), orphans, v8::String::kNormalString, 8); 7941 v8::String::NewFromTwoByte(context->GetIsolate(), orphans,
7942 v8::NewStringType::kNormal, 8)
7943 .ToLocalChecked();
7096 // single lead surrogate 7944 // single lead surrogate
7097 uint16_t lead[1] = { 0xd800 }; 7945 uint16_t lead[1] = { 0xd800 };
7098 v8::Handle<String> lead_str = v8::String::NewFromTwoByte( 7946 v8::Local<String> lead_str =
7099 context->GetIsolate(), lead, v8::String::kNormalString, 1); 7947 v8::String::NewFromTwoByte(context->GetIsolate(), lead,
7948 v8::NewStringType::kNormal, 1)
7949 .ToLocalChecked();
7100 // single trail surrogate 7950 // single trail surrogate
7101 uint16_t trail[1] = { 0xdc00 }; 7951 uint16_t trail[1] = { 0xdc00 };
7102 v8::Handle<String> trail_str = v8::String::NewFromTwoByte( 7952 v8::Local<String> trail_str =
7103 context->GetIsolate(), trail, v8::String::kNormalString, 1); 7953 v8::String::NewFromTwoByte(context->GetIsolate(), trail,
7954 v8::NewStringType::kNormal, 1)
7955 .ToLocalChecked();
7104 // surrogate pair 7956 // surrogate pair
7105 uint16_t pair[2] = { 0xd800, 0xdc00 }; 7957 uint16_t pair[2] = { 0xd800, 0xdc00 };
7106 v8::Handle<String> pair_str = v8::String::NewFromTwoByte( 7958 v8::Local<String> pair_str =
7107 context->GetIsolate(), pair, v8::String::kNormalString, 2); 7959 v8::String::NewFromTwoByte(context->GetIsolate(), pair,
7960 v8::NewStringType::kNormal, 2)
7961 .ToLocalChecked();
7108 const int kStride = 4; // Must match stride in for loops in JS below. 7962 const int kStride = 4; // Must match stride in for loops in JS below.
7109 CompileRun( 7963 CompileRun(
7110 "var left = '';" 7964 "var left = '';"
7111 "for (var i = 0; i < 0xd800; i += 4) {" 7965 "for (var i = 0; i < 0xd800; i += 4) {"
7112 " left = left + String.fromCharCode(i);" 7966 " left = left + String.fromCharCode(i);"
7113 "}"); 7967 "}");
7114 CompileRun( 7968 CompileRun(
7115 "var right = '';" 7969 "var right = '';"
7116 "for (var i = 0; i < 0xd800; i += 4) {" 7970 "for (var i = 0; i < 0xd800; i += 4) {"
7117 " right = String.fromCharCode(i) + right;" 7971 " right = String.fromCharCode(i) + right;"
7118 "}"); 7972 "}");
7119 v8::Handle<v8::Object> global = context->Global(); 7973 v8::Local<v8::Object> global = context->Global();
7120 Handle<String> left_tree = global->Get(v8_str("left")).As<String>(); 7974 Local<String> left_tree = global->Get(context.local(), v8_str("left"))
7121 Handle<String> right_tree = global->Get(v8_str("right")).As<String>(); 7975 .ToLocalChecked()
7976 .As<String>();
7977 Local<String> right_tree = global->Get(context.local(), v8_str("right"))
7978 .ToLocalChecked()
7979 .As<String>();
7122 7980
7123 CHECK_EQ(5, str2->Length()); 7981 CHECK_EQ(5, str2->Length());
7124 CHECK_EQ(0xd800 / kStride, left_tree->Length()); 7982 CHECK_EQ(0xd800 / kStride, left_tree->Length());
7125 CHECK_EQ(0xd800 / kStride, right_tree->Length()); 7983 CHECK_EQ(0xd800 / kStride, right_tree->Length());
7126 7984
7127 char buf[100]; 7985 char buf[100];
7128 char utf8buf[0xd800 * 3]; 7986 char utf8buf[0xd800 * 3];
7129 uint16_t wbuf[100]; 7987 uint16_t wbuf[100];
7130 int len; 7988 int len;
7131 int charlen; 7989 int charlen;
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
7387 CHECK_EQ(0, str->WriteUtf8(NULL, 0, 0, String::NO_NULL_TERMINATION)); 8245 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)); 8246 CHECK_EQ(0, str->Write(NULL, 0, 0, String::NO_NULL_TERMINATION));
7389 } 8247 }
7390 8248
7391 8249
7392 static void Utf16Helper( 8250 static void Utf16Helper(
7393 LocalContext& context, // NOLINT 8251 LocalContext& context, // NOLINT
7394 const char* name, 8252 const char* name,
7395 const char* lengths_name, 8253 const char* lengths_name,
7396 int len) { 8254 int len) {
7397 Local<v8::Array> a = 8255 Local<v8::Array> a = Local<v8::Array>::Cast(
7398 Local<v8::Array>::Cast(context->Global()->Get(v8_str(name))); 8256 context->Global()->Get(context.local(), v8_str(name)).ToLocalChecked());
7399 Local<v8::Array> alens = 8257 Local<v8::Array> alens =
7400 Local<v8::Array>::Cast(context->Global()->Get(v8_str(lengths_name))); 8258 Local<v8::Array>::Cast(context->Global()
8259 ->Get(context.local(), v8_str(lengths_name))
8260 .ToLocalChecked());
7401 for (int i = 0; i < len; i++) { 8261 for (int i = 0; i < len; i++) {
7402 Local<v8::String> string = 8262 Local<v8::String> string =
7403 Local<v8::String>::Cast(a->Get(i)); 8263 Local<v8::String>::Cast(a->Get(context.local(), i).ToLocalChecked());
7404 Local<v8::Number> expected_len = 8264 Local<v8::Number> expected_len = Local<v8::Number>::Cast(
7405 Local<v8::Number>::Cast(alens->Get(i)); 8265 alens->Get(context.local(), i).ToLocalChecked());
7406 int length = GetUtf8Length(string); 8266 int length = GetUtf8Length(string);
7407 CHECK_EQ(static_cast<int>(expected_len->Value()), length); 8267 CHECK_EQ(static_cast<int>(expected_len->Value()), length);
7408 } 8268 }
7409 } 8269 }
7410 8270
7411 8271
7412 THREADED_TEST(Utf16) { 8272 THREADED_TEST(Utf16) {
7413 LocalContext context; 8273 LocalContext context;
7414 v8::HandleScope scope(context->GetIsolate()); 8274 v8::HandleScope scope(context->GetIsolate());
7415 CompileRun( 8275 CompileRun(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7451 // The 'm's that end with 0xd8.. are 1, 4 and 7 8311 // The 'm's that end with 0xd8.. are 1, 4 and 7
7452 " if ((m % 3) == 1 && n >= 6) utf -= 2;" 8312 " if ((m % 3) == 1 && n >= 6) utf -= 2;"
7453 " a2lens.push(utf);" 8313 " a2lens.push(utf);"
7454 " }" 8314 " }"
7455 "}"); 8315 "}");
7456 Utf16Helper(context, "a", "alens", 9); 8316 Utf16Helper(context, "a", "alens", 9);
7457 Utf16Helper(context, "a2", "a2lens", 81); 8317 Utf16Helper(context, "a2", "a2lens", 81);
7458 } 8318 }
7459 8319
7460 8320
7461 static bool SameSymbol(Handle<String> s1, Handle<String> s2) { 8321 static bool SameSymbol(Local<String> s1, Local<String> s2) {
7462 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1)); 8322 i::Handle<i::String> is1(v8::Utils::OpenHandle(*s1));
7463 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2)); 8323 i::Handle<i::String> is2(v8::Utils::OpenHandle(*s2));
7464 return *is1 == *is2; 8324 return *is1 == *is2;
7465 } 8325 }
7466 8326
7467 8327
7468 THREADED_TEST(Utf16Symbol) { 8328 THREADED_TEST(Utf16Symbol) {
7469 LocalContext context; 8329 LocalContext context;
7470 v8::HandleScope scope(context->GetIsolate()); 8330 v8::HandleScope scope(context->GetIsolate());
7471 8331
7472 Handle<String> symbol1 = v8::String::NewFromUtf8( 8332 Local<String> symbol1 =
7473 context->GetIsolate(), "abc", v8::String::kInternalizedString); 8333 v8::String::NewFromUtf8(context->GetIsolate(), "abc",
7474 Handle<String> symbol2 = v8::String::NewFromUtf8( 8334 v8::NewStringType::kInternalized)
7475 context->GetIsolate(), "abc", v8::String::kInternalizedString); 8335 .ToLocalChecked();
8336 Local<String> symbol2 =
8337 v8::String::NewFromUtf8(context->GetIsolate(), "abc",
8338 v8::NewStringType::kInternalized)
8339 .ToLocalChecked();
7476 CHECK(SameSymbol(symbol1, symbol2)); 8340 CHECK(SameSymbol(symbol1, symbol2));
7477 8341
7478 CompileRun( 8342 CompileRun(
7479 "var sym0 = 'benedictus';" 8343 "var sym0 = 'benedictus';"
7480 "var sym0b = 'S\303\270ren';" 8344 "var sym0b = 'S\303\270ren';"
7481 "var sym1 = '\355\240\201\355\260\207';" 8345 "var sym1 = '\355\240\201\355\260\207';"
7482 "var sym2 = '\360\220\220\210';" 8346 "var sym2 = '\360\220\220\210';"
7483 "var sym3 = 'x\355\240\201\355\260\207';" 8347 "var sym3 = 'x\355\240\201\355\260\207';"
7484 "var sym4 = 'x\360\220\220\210';" 8348 "var sym4 = 'x\360\220\220\210';"
7485 "if (sym1.length != 2) throw sym1;" 8349 "if (sym1.length != 2) throw sym1;"
7486 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);" 8350 "if (sym1.charCodeAt(1) != 0xdc07) throw sym1.charCodeAt(1);"
7487 "if (sym2.length != 2) throw sym2;" 8351 "if (sym2.length != 2) throw sym2;"
7488 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);" 8352 "if (sym2.charCodeAt(1) != 0xdc08) throw sym2.charCodeAt(2);"
7489 "if (sym3.length != 3) throw sym3;" 8353 "if (sym3.length != 3) throw sym3;"
7490 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);" 8354 "if (sym3.charCodeAt(2) != 0xdc07) throw sym1.charCodeAt(2);"
7491 "if (sym4.length != 3) throw sym4;" 8355 "if (sym4.length != 3) throw sym4;"
7492 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);"); 8356 "if (sym4.charCodeAt(2) != 0xdc08) throw sym2.charCodeAt(2);");
7493 Handle<String> sym0 = v8::String::NewFromUtf8( 8357 Local<String> sym0 =
7494 context->GetIsolate(), "benedictus", v8::String::kInternalizedString); 8358 v8::String::NewFromUtf8(context->GetIsolate(), "benedictus",
7495 Handle<String> sym0b = v8::String::NewFromUtf8( 8359 v8::NewStringType::kInternalized)
7496 context->GetIsolate(), "S\303\270ren", v8::String::kInternalizedString); 8360 .ToLocalChecked();
7497 Handle<String> sym1 = 8361 Local<String> sym0b =
8362 v8::String::NewFromUtf8(context->GetIsolate(), "S\303\270ren",
8363 v8::NewStringType::kInternalized)
8364 .ToLocalChecked();
8365 Local<String> sym1 =
7498 v8::String::NewFromUtf8(context->GetIsolate(), "\355\240\201\355\260\207", 8366 v8::String::NewFromUtf8(context->GetIsolate(), "\355\240\201\355\260\207",
7499 v8::String::kInternalizedString); 8367 v8::NewStringType::kInternalized)
7500 Handle<String> sym2 = 8368 .ToLocalChecked();
8369 Local<String> sym2 =
7501 v8::String::NewFromUtf8(context->GetIsolate(), "\360\220\220\210", 8370 v8::String::NewFromUtf8(context->GetIsolate(), "\360\220\220\210",
7502 v8::String::kInternalizedString); 8371 v8::NewStringType::kInternalized)
7503 Handle<String> sym3 = v8::String::NewFromUtf8( 8372 .ToLocalChecked();
7504 context->GetIsolate(), "x\355\240\201\355\260\207", 8373 Local<String> sym3 = v8::String::NewFromUtf8(context->GetIsolate(),
7505 v8::String::kInternalizedString); 8374 "x\355\240\201\355\260\207",
7506 Handle<String> sym4 = 8375 v8::NewStringType::kInternalized)
8376 .ToLocalChecked();
8377 Local<String> sym4 =
7507 v8::String::NewFromUtf8(context->GetIsolate(), "x\360\220\220\210", 8378 v8::String::NewFromUtf8(context->GetIsolate(), "x\360\220\220\210",
7508 v8::String::kInternalizedString); 8379 v8::NewStringType::kInternalized)
8380 .ToLocalChecked();
7509 v8::Local<v8::Object> global = context->Global(); 8381 v8::Local<v8::Object> global = context->Global();
7510 Local<Value> s0 = global->Get(v8_str("sym0")); 8382 Local<Value> s0 =
7511 Local<Value> s0b = global->Get(v8_str("sym0b")); 8383 global->Get(context.local(), v8_str("sym0")).ToLocalChecked();
7512 Local<Value> s1 = global->Get(v8_str("sym1")); 8384 Local<Value> s0b =
7513 Local<Value> s2 = global->Get(v8_str("sym2")); 8385 global->Get(context.local(), v8_str("sym0b")).ToLocalChecked();
7514 Local<Value> s3 = global->Get(v8_str("sym3")); 8386 Local<Value> s1 =
7515 Local<Value> s4 = global->Get(v8_str("sym4")); 8387 global->Get(context.local(), v8_str("sym1")).ToLocalChecked();
7516 CHECK(SameSymbol(sym0, Handle<String>::Cast(s0))); 8388 Local<Value> s2 =
7517 CHECK(SameSymbol(sym0b, Handle<String>::Cast(s0b))); 8389 global->Get(context.local(), v8_str("sym2")).ToLocalChecked();
7518 CHECK(SameSymbol(sym1, Handle<String>::Cast(s1))); 8390 Local<Value> s3 =
7519 CHECK(SameSymbol(sym2, Handle<String>::Cast(s2))); 8391 global->Get(context.local(), v8_str("sym3")).ToLocalChecked();
7520 CHECK(SameSymbol(sym3, Handle<String>::Cast(s3))); 8392 Local<Value> s4 =
7521 CHECK(SameSymbol(sym4, Handle<String>::Cast(s4))); 8393 global->Get(context.local(), v8_str("sym4")).ToLocalChecked();
8394 CHECK(SameSymbol(sym0, Local<String>::Cast(s0)));
8395 CHECK(SameSymbol(sym0b, Local<String>::Cast(s0b)));
8396 CHECK(SameSymbol(sym1, Local<String>::Cast(s1)));
8397 CHECK(SameSymbol(sym2, Local<String>::Cast(s2)));
8398 CHECK(SameSymbol(sym3, Local<String>::Cast(s3)));
8399 CHECK(SameSymbol(sym4, Local<String>::Cast(s4)));
7522 } 8400 }
7523 8401
7524 8402
7525 THREADED_TEST(Utf16MissingTrailing) { 8403 THREADED_TEST(Utf16MissingTrailing) {
7526 LocalContext context; 8404 LocalContext context;
7527 v8::HandleScope scope(context->GetIsolate()); 8405 v8::HandleScope scope(context->GetIsolate());
7528 8406
7529 // Make sure it will go past the buffer, so it will call `WriteUtf16Slow` 8407 // Make sure it will go past the buffer, so it will call `WriteUtf16Slow`
7530 int size = 1024 * 64; 8408 int size = 1024 * 64;
7531 uint8_t* buffer = new uint8_t[size]; 8409 uint8_t* buffer = new uint8_t[size];
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
7571 8449
7572 delete[] buffer; 8450 delete[] buffer;
7573 } 8451 }
7574 8452
7575 8453
7576 THREADED_TEST(ToArrayIndex) { 8454 THREADED_TEST(ToArrayIndex) {
7577 LocalContext context; 8455 LocalContext context;
7578 v8::Isolate* isolate = context->GetIsolate(); 8456 v8::Isolate* isolate = context->GetIsolate();
7579 v8::HandleScope scope(isolate); 8457 v8::HandleScope scope(isolate);
7580 8458
7581 v8::Handle<String> str = v8_str("42"); 8459 v8::Local<String> str = v8_str("42");
7582 v8::Handle<v8::Uint32> index = str->ToArrayIndex(); 8460 v8::MaybeLocal<v8::Uint32> index = str->ToArrayIndex(context.local());
7583 CHECK(!index.IsEmpty()); 8461 CHECK(!index.IsEmpty());
7584 CHECK_EQ(42.0, index->Uint32Value()); 8462 CHECK_EQ(42.0,
8463 index.ToLocalChecked()->Uint32Value(context.local()).FromJust());
7585 str = v8_str("42asdf"); 8464 str = v8_str("42asdf");
7586 index = str->ToArrayIndex(); 8465 index = str->ToArrayIndex(context.local());
7587 CHECK(index.IsEmpty()); 8466 CHECK(index.IsEmpty());
7588 str = v8_str("-42"); 8467 str = v8_str("-42");
7589 index = str->ToArrayIndex(); 8468 index = str->ToArrayIndex(context.local());
7590 CHECK(index.IsEmpty()); 8469 CHECK(index.IsEmpty());
7591 str = v8_str("4294967294"); 8470 str = v8_str("4294967294");
7592 index = str->ToArrayIndex(); 8471 index = str->ToArrayIndex(context.local());
7593 CHECK(!index.IsEmpty()); 8472 CHECK(!index.IsEmpty());
7594 CHECK_EQ(4294967294.0, index->Uint32Value()); 8473 CHECK_EQ(4294967294.0,
7595 v8::Handle<v8::Number> num = v8::Number::New(isolate, 1); 8474 index.ToLocalChecked()->Uint32Value(context.local()).FromJust());
7596 index = num->ToArrayIndex(); 8475 v8::Local<v8::Number> num = v8::Number::New(isolate, 1);
8476 index = num->ToArrayIndex(context.local());
7597 CHECK(!index.IsEmpty()); 8477 CHECK(!index.IsEmpty());
7598 CHECK_EQ(1.0, index->Uint32Value()); 8478 CHECK_EQ(1.0,
8479 index.ToLocalChecked()->Uint32Value(context.local()).FromJust());
7599 num = v8::Number::New(isolate, -1); 8480 num = v8::Number::New(isolate, -1);
7600 index = num->ToArrayIndex(); 8481 index = num->ToArrayIndex(context.local());
7601 CHECK(index.IsEmpty()); 8482 CHECK(index.IsEmpty());
7602 v8::Handle<v8::Object> obj = v8::Object::New(isolate); 8483 v8::Local<v8::Object> obj = v8::Object::New(isolate);
7603 index = obj->ToArrayIndex(); 8484 index = obj->ToArrayIndex(context.local());
7604 CHECK(index.IsEmpty()); 8485 CHECK(index.IsEmpty());
7605 } 8486 }
7606 8487
7607 8488
7608 THREADED_TEST(ErrorConstruction) { 8489 THREADED_TEST(ErrorConstruction) {
7609 LocalContext context; 8490 LocalContext context;
7610 v8::HandleScope scope(context->GetIsolate()); 8491 v8::HandleScope scope(context->GetIsolate());
7611 8492
7612 v8::Handle<String> foo = v8_str("foo"); 8493 v8::Local<String> foo = v8_str("foo");
7613 v8::Handle<String> message = v8_str("message"); 8494 v8::Local<String> message = v8_str("message");
7614 v8::Handle<Value> range_error = v8::Exception::RangeError(foo); 8495 v8::Local<Value> range_error = v8::Exception::RangeError(foo);
7615 CHECK(range_error->IsObject()); 8496 CHECK(range_error->IsObject());
7616 CHECK(range_error.As<v8::Object>()->Get(message)->Equals(foo)); 8497 CHECK(range_error.As<v8::Object>()
7617 v8::Handle<Value> reference_error = v8::Exception::ReferenceError(foo); 8498 ->Get(context.local(), message)
8499 .ToLocalChecked()
8500 ->Equals(context.local(), foo)
8501 .FromJust());
8502 v8::Local<Value> reference_error = v8::Exception::ReferenceError(foo);
7618 CHECK(reference_error->IsObject()); 8503 CHECK(reference_error->IsObject());
7619 CHECK(reference_error.As<v8::Object>()->Get(message)->Equals(foo)); 8504 CHECK(reference_error.As<v8::Object>()
7620 v8::Handle<Value> syntax_error = v8::Exception::SyntaxError(foo); 8505 ->Get(context.local(), message)
8506 .ToLocalChecked()
8507 ->Equals(context.local(), foo)
8508 .FromJust());
8509 v8::Local<Value> syntax_error = v8::Exception::SyntaxError(foo);
7621 CHECK(syntax_error->IsObject()); 8510 CHECK(syntax_error->IsObject());
7622 CHECK(syntax_error.As<v8::Object>()->Get(message)->Equals(foo)); 8511 CHECK(syntax_error.As<v8::Object>()
7623 v8::Handle<Value> type_error = v8::Exception::TypeError(foo); 8512 ->Get(context.local(), message)
8513 .ToLocalChecked()
8514 ->Equals(context.local(), foo)
8515 .FromJust());
8516 v8::Local<Value> type_error = v8::Exception::TypeError(foo);
7624 CHECK(type_error->IsObject()); 8517 CHECK(type_error->IsObject());
7625 CHECK(type_error.As<v8::Object>()->Get(message)->Equals(foo)); 8518 CHECK(type_error.As<v8::Object>()
7626 v8::Handle<Value> error = v8::Exception::Error(foo); 8519 ->Get(context.local(), message)
8520 .ToLocalChecked()
8521 ->Equals(context.local(), foo)
8522 .FromJust());
8523 v8::Local<Value> error = v8::Exception::Error(foo);
7627 CHECK(error->IsObject()); 8524 CHECK(error->IsObject());
7628 CHECK(error.As<v8::Object>()->Get(message)->Equals(foo)); 8525 CHECK(error.As<v8::Object>()
8526 ->Get(context.local(), message)
8527 .ToLocalChecked()
8528 ->Equals(context.local(), foo)
8529 .FromJust());
7629 } 8530 }
7630 8531
7631 8532
7632 static void ThrowV8Exception(const v8::FunctionCallbackInfo<v8::Value>& info) { 8533 static void ThrowV8Exception(const v8::FunctionCallbackInfo<v8::Value>& info) {
7633 ApiTestFuzzer::Fuzz(); 8534 ApiTestFuzzer::Fuzz();
7634 v8::Handle<String> foo = v8_str("foo"); 8535 v8::Local<String> foo = v8_str("foo");
7635 v8::Handle<String> message = v8_str("message"); 8536 v8::Local<String> message = v8_str("message");
7636 v8::Handle<Value> error = v8::Exception::Error(foo); 8537 v8::Local<Value> error = v8::Exception::Error(foo);
7637 CHECK(error->IsObject()); 8538 CHECK(error->IsObject());
7638 CHECK(error.As<v8::Object>()->Get(message)->Equals(foo)); 8539 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
8540 CHECK(error.As<v8::Object>()
8541 ->Get(context, message)
8542 .ToLocalChecked()
8543 ->Equals(context, foo)
8544 .FromJust());
7639 info.GetIsolate()->ThrowException(error); 8545 info.GetIsolate()->ThrowException(error);
7640 info.GetReturnValue().SetUndefined(); 8546 info.GetReturnValue().SetUndefined();
7641 } 8547 }
7642 8548
7643 8549
7644 THREADED_TEST(ExceptionCreateMessage) { 8550 THREADED_TEST(ExceptionCreateMessage) {
7645 LocalContext context; 8551 LocalContext context;
7646 v8::HandleScope scope(context->GetIsolate()); 8552 v8::HandleScope scope(context->GetIsolate());
7647 v8::Handle<String> foo_str = v8_str("foo"); 8553 v8::Local<String> foo_str = v8_str("foo");
7648 v8::Handle<String> message_str = v8_str("message"); 8554 v8::Local<String> message_str = v8_str("message");
7649 8555
7650 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 8556 context->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(true);
7651 8557
7652 Local<v8::FunctionTemplate> fun = 8558 Local<v8::FunctionTemplate> fun =
7653 v8::FunctionTemplate::New(context->GetIsolate(), ThrowV8Exception); 8559 v8::FunctionTemplate::New(context->GetIsolate(), ThrowV8Exception);
7654 v8::Local<v8::Object> global = context->Global(); 8560 v8::Local<v8::Object> global = context->Global();
7655 global->Set(v8_str("throwV8Exception"), fun->GetFunction()); 8561 CHECK(global->Set(context.local(), v8_str("throwV8Exception"),
8562 fun->GetFunction(context.local()).ToLocalChecked())
8563 .FromJust());
7656 8564
7657 TryCatch try_catch(context->GetIsolate()); 8565 TryCatch try_catch(context->GetIsolate());
7658 CompileRun( 8566 CompileRun(
7659 "function f1() {\n" 8567 "function f1() {\n"
7660 " throwV8Exception();\n" 8568 " throwV8Exception();\n"
7661 "};\n" 8569 "};\n"
7662 "f1();"); 8570 "f1();");
7663 CHECK(try_catch.HasCaught()); 8571 CHECK(try_catch.HasCaught());
7664 8572
7665 v8::Handle<v8::Value> error = try_catch.Exception(); 8573 v8::Local<v8::Value> error = try_catch.Exception();
7666 CHECK(error->IsObject()); 8574 CHECK(error->IsObject());
7667 CHECK(error.As<v8::Object>()->Get(message_str)->Equals(foo_str)); 8575 CHECK(error.As<v8::Object>()
8576 ->Get(context.local(), message_str)
8577 .ToLocalChecked()
8578 ->Equals(context.local(), foo_str)
8579 .FromJust());
7668 8580
7669 v8::Handle<v8::Message> message = v8::Exception::CreateMessage(error); 8581 v8::Local<v8::Message> message = v8::Exception::CreateMessage(error);
7670 CHECK(!message.IsEmpty()); 8582 CHECK(!message.IsEmpty());
7671 CHECK_EQ(2, message->GetLineNumber()); 8583 CHECK_EQ(2, message->GetLineNumber(context.local()).FromJust());
7672 CHECK_EQ(2, message->GetStartColumn()); 8584 CHECK_EQ(2, message->GetStartColumn(context.local()).FromJust());
7673 8585
7674 v8::Handle<v8::StackTrace> stackTrace = message->GetStackTrace(); 8586 v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace();
7675 CHECK(!stackTrace.IsEmpty()); 8587 CHECK(!stackTrace.IsEmpty());
7676 CHECK_EQ(2, stackTrace->GetFrameCount()); 8588 CHECK_EQ(2, stackTrace->GetFrameCount());
7677 8589
7678 stackTrace = v8::Exception::GetStackTrace(error); 8590 stackTrace = v8::Exception::GetStackTrace(error);
7679 CHECK(!stackTrace.IsEmpty()); 8591 CHECK(!stackTrace.IsEmpty());
7680 CHECK_EQ(2, stackTrace->GetFrameCount()); 8592 CHECK_EQ(2, stackTrace->GetFrameCount());
7681 8593
7682 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 8594 context->GetIsolate()->SetCaptureStackTraceForUncaughtExceptions(false);
7683 8595
7684 // Now check message location when SetCaptureStackTraceForUncaughtExceptions 8596 // Now check message location when SetCaptureStackTraceForUncaughtExceptions
7685 // is false. 8597 // is false.
7686 try_catch.Reset(); 8598 try_catch.Reset();
7687 8599
7688 CompileRun( 8600 CompileRun(
7689 "function f2() {\n" 8601 "function f2() {\n"
7690 " return throwV8Exception();\n" 8602 " return throwV8Exception();\n"
7691 "};\n" 8603 "};\n"
7692 "f2();"); 8604 "f2();");
7693 CHECK(try_catch.HasCaught()); 8605 CHECK(try_catch.HasCaught());
7694 8606
7695 error = try_catch.Exception(); 8607 error = try_catch.Exception();
7696 CHECK(error->IsObject()); 8608 CHECK(error->IsObject());
7697 CHECK(error.As<v8::Object>()->Get(message_str)->Equals(foo_str)); 8609 CHECK(error.As<v8::Object>()
8610 ->Get(context.local(), message_str)
8611 .ToLocalChecked()
8612 ->Equals(context.local(), foo_str)
8613 .FromJust());
7698 8614
7699 message = v8::Exception::CreateMessage(error); 8615 message = v8::Exception::CreateMessage(error);
7700 CHECK(!message.IsEmpty()); 8616 CHECK(!message.IsEmpty());
7701 CHECK_EQ(2, message->GetLineNumber()); 8617 CHECK_EQ(2, message->GetLineNumber(context.local()).FromJust());
7702 CHECK_EQ(9, message->GetStartColumn()); 8618 CHECK_EQ(9, message->GetStartColumn(context.local()).FromJust());
7703 8619
7704 // Should be empty stack trace. 8620 // Should be empty stack trace.
7705 stackTrace = message->GetStackTrace(); 8621 stackTrace = message->GetStackTrace();
7706 CHECK(stackTrace.IsEmpty()); 8622 CHECK(stackTrace.IsEmpty());
7707 CHECK(v8::Exception::GetStackTrace(error).IsEmpty()); 8623 CHECK(v8::Exception::GetStackTrace(error).IsEmpty());
7708 } 8624 }
7709 8625
7710 8626
7711 THREADED_TEST(ExceptionCreateMessageLength) { 8627 THREADED_TEST(ExceptionCreateMessageLength) {
7712 LocalContext context; 8628 LocalContext context;
(...skipping 15 matching lines...) Expand all
7728 const v8::PropertyCallbackInfo<v8::Value>& info) { 8644 const v8::PropertyCallbackInfo<v8::Value>& info) {
7729 ApiTestFuzzer::Fuzz(); 8645 ApiTestFuzzer::Fuzz();
7730 info.GetReturnValue().Set(v8_num(10)); 8646 info.GetReturnValue().Set(v8_num(10));
7731 } 8647 }
7732 8648
7733 8649
7734 static void YSetter(Local<String> name, 8650 static void YSetter(Local<String> name,
7735 Local<Value> value, 8651 Local<Value> value,
7736 const v8::PropertyCallbackInfo<void>& info) { 8652 const v8::PropertyCallbackInfo<void>& info) {
7737 Local<Object> this_obj = Local<Object>::Cast(info.This()); 8653 Local<Object> this_obj = Local<Object>::Cast(info.This());
7738 if (this_obj->Has(name)) this_obj->Delete(name); 8654 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
7739 this_obj->Set(name, value); 8655 if (this_obj->Has(context, name).FromJust())
8656 this_obj->Delete(context, name).FromJust();
8657 CHECK(this_obj->Set(context, name, value).FromJust());
7740 } 8658 }
7741 8659
7742 8660
7743 THREADED_TEST(DeleteAccessor) { 8661 THREADED_TEST(DeleteAccessor) {
7744 v8::Isolate* isolate = CcTest::isolate(); 8662 v8::Isolate* isolate = CcTest::isolate();
7745 v8::HandleScope scope(isolate); 8663 v8::HandleScope scope(isolate);
7746 v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate); 8664 v8::Local<v8::ObjectTemplate> obj = ObjectTemplate::New(isolate);
7747 obj->SetAccessor(v8_str("y"), YGetter, YSetter); 8665 obj->SetAccessor(v8_str("y"), YGetter, YSetter);
7748 LocalContext context; 8666 LocalContext context;
7749 v8::Handle<v8::Object> holder = obj->NewInstance(); 8667 v8::Local<v8::Object> holder =
7750 context->Global()->Set(v8_str("holder"), holder); 8668 obj->NewInstance(context.local()).ToLocalChecked();
7751 v8::Handle<Value> result = CompileRun( 8669 CHECK(context->Global()
7752 "holder.y = 11; holder.y = 12; holder.y"); 8670 ->Set(context.local(), v8_str("holder"), holder)
7753 CHECK_EQ(12u, result->Uint32Value()); 8671 .FromJust());
8672 v8::Local<Value> result =
8673 CompileRun("holder.y = 11; holder.y = 12; holder.y");
8674 CHECK_EQ(12u, result->Uint32Value(context.local()).FromJust());
7754 } 8675 }
7755 8676
7756 8677
7757 THREADED_TEST(TypeSwitch) { 8678 THREADED_TEST(TypeSwitch) {
7758 v8::Isolate* isolate = CcTest::isolate(); 8679 v8::Isolate* isolate = CcTest::isolate();
7759 v8::HandleScope scope(isolate); 8680 v8::HandleScope scope(isolate);
7760 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(isolate); 8681 v8::Local<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(isolate);
7761 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate); 8682 v8::Local<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate);
7762 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(isolate); 8683 v8::Local<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(isolate);
7763 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 }; 8684 v8::Local<v8::FunctionTemplate> templs[3] = {templ1, templ2, templ3};
7764 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); 8685 v8::Local<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs);
7765 LocalContext context; 8686 LocalContext context;
7766 v8::Handle<v8::Object> obj0 = v8::Object::New(isolate); 8687 v8::Local<v8::Object> obj0 = v8::Object::New(isolate);
7767 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance(); 8688 v8::Local<v8::Object> obj1 = templ1->GetFunction(context.local())
7768 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance(); 8689 .ToLocalChecked()
7769 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance(); 8690 ->NewInstance(context.local())
8691 .ToLocalChecked();
8692 v8::Local<v8::Object> obj2 = templ2->GetFunction(context.local())
8693 .ToLocalChecked()
8694 ->NewInstance(context.local())
8695 .ToLocalChecked();
8696 v8::Local<v8::Object> obj3 = templ3->GetFunction(context.local())
8697 .ToLocalChecked()
8698 ->NewInstance(context.local())
8699 .ToLocalChecked();
7770 for (int i = 0; i < 10; i++) { 8700 for (int i = 0; i < 10; i++) {
7771 CHECK_EQ(0, type_switch->match(obj0)); 8701 CHECK_EQ(0, type_switch->match(obj0));
7772 CHECK_EQ(1, type_switch->match(obj1)); 8702 CHECK_EQ(1, type_switch->match(obj1));
7773 CHECK_EQ(2, type_switch->match(obj2)); 8703 CHECK_EQ(2, type_switch->match(obj2));
7774 CHECK_EQ(3, type_switch->match(obj3)); 8704 CHECK_EQ(3, type_switch->match(obj3));
7775 CHECK_EQ(3, type_switch->match(obj3)); 8705 CHECK_EQ(3, type_switch->match(obj3));
7776 CHECK_EQ(2, type_switch->match(obj2)); 8706 CHECK_EQ(2, type_switch->match(obj2));
7777 CHECK_EQ(1, type_switch->match(obj1)); 8707 CHECK_EQ(1, type_switch->match(obj1));
7778 CHECK_EQ(0, type_switch->match(obj0)); 8708 CHECK_EQ(0, type_switch->match(obj0));
7779 } 8709 }
7780 } 8710 }
7781 8711
7782 8712
7783 static int trouble_nesting = 0; 8713 static int trouble_nesting = 0;
7784 static void TroubleCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 8714 static void TroubleCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
7785 ApiTestFuzzer::Fuzz(); 8715 ApiTestFuzzer::Fuzz();
7786 trouble_nesting++; 8716 trouble_nesting++;
7787 8717
7788 // Call a JS function that throws an uncaught exception. 8718 // Call a JS function that throws an uncaught exception.
7789 Local<v8::Object> arg_this = 8719 Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
7790 args.GetIsolate()->GetCurrentContext()->Global(); 8720 Local<v8::Object> arg_this = context->Global();
7791 Local<Value> trouble_callee = (trouble_nesting == 3) ? 8721 Local<Value> trouble_callee =
7792 arg_this->Get(v8_str("trouble_callee")) : 8722 (trouble_nesting == 3)
7793 arg_this->Get(v8_str("trouble_caller")); 8723 ? arg_this->Get(context, v8_str("trouble_callee")).ToLocalChecked()
8724 : arg_this->Get(context, v8_str("trouble_caller")).ToLocalChecked();
7794 CHECK(trouble_callee->IsFunction()); 8725 CHECK(trouble_callee->IsFunction());
7795 args.GetReturnValue().Set( 8726 args.GetReturnValue().Set(Function::Cast(*trouble_callee)
7796 Function::Cast(*trouble_callee)->Call(arg_this, 0, NULL)); 8727 ->Call(context, arg_this, 0, NULL)
8728 .FromMaybe(v8::Local<v8::Value>()));
7797 } 8729 }
7798 8730
7799 8731
7800 static int report_count = 0; 8732 static int report_count = 0;
7801 static void ApiUncaughtExceptionTestListener(v8::Handle<v8::Message>, 8733 static void ApiUncaughtExceptionTestListener(v8::Local<v8::Message>,
7802 v8::Handle<Value>) { 8734 v8::Local<Value>) {
7803 report_count++; 8735 report_count++;
7804 } 8736 }
7805 8737
7806 8738
7807 // Counts uncaught exceptions, but other tests running in parallel 8739 // Counts uncaught exceptions, but other tests running in parallel
7808 // also have uncaught exceptions. 8740 // also have uncaught exceptions.
7809 TEST(ApiUncaughtException) { 8741 TEST(ApiUncaughtException) {
7810 report_count = 0; 8742 report_count = 0;
7811 LocalContext env; 8743 LocalContext env;
7812 v8::Isolate* isolate = env->GetIsolate(); 8744 v8::Isolate* isolate = env->GetIsolate();
7813 v8::HandleScope scope(isolate); 8745 v8::HandleScope scope(isolate);
7814 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); 8746 isolate->AddMessageListener(ApiUncaughtExceptionTestListener);
7815 8747
7816 Local<v8::FunctionTemplate> fun = 8748 Local<v8::FunctionTemplate> fun =
7817 v8::FunctionTemplate::New(isolate, TroubleCallback); 8749 v8::FunctionTemplate::New(isolate, TroubleCallback);
7818 v8::Local<v8::Object> global = env->Global(); 8750 v8::Local<v8::Object> global = env->Global();
7819 global->Set(v8_str("trouble"), fun->GetFunction()); 8751 CHECK(global->Set(env.local(), v8_str("trouble"),
8752 fun->GetFunction(env.local()).ToLocalChecked())
8753 .FromJust());
7820 8754
7821 CompileRun( 8755 CompileRun(
7822 "function trouble_callee() {" 8756 "function trouble_callee() {"
7823 " var x = null;" 8757 " var x = null;"
7824 " return x.foo;" 8758 " return x.foo;"
7825 "};" 8759 "};"
7826 "function trouble_caller() {" 8760 "function trouble_caller() {"
7827 " trouble();" 8761 " trouble();"
7828 "};"); 8762 "};");
7829 Local<Value> trouble = global->Get(v8_str("trouble")); 8763 Local<Value> trouble =
8764 global->Get(env.local(), v8_str("trouble")).ToLocalChecked();
7830 CHECK(trouble->IsFunction()); 8765 CHECK(trouble->IsFunction());
7831 Local<Value> trouble_callee = global->Get(v8_str("trouble_callee")); 8766 Local<Value> trouble_callee =
8767 global->Get(env.local(), v8_str("trouble_callee")).ToLocalChecked();
7832 CHECK(trouble_callee->IsFunction()); 8768 CHECK(trouble_callee->IsFunction());
7833 Local<Value> trouble_caller = global->Get(v8_str("trouble_caller")); 8769 Local<Value> trouble_caller =
8770 global->Get(env.local(), v8_str("trouble_caller")).ToLocalChecked();
7834 CHECK(trouble_caller->IsFunction()); 8771 CHECK(trouble_caller->IsFunction());
7835 Function::Cast(*trouble_caller)->Call(global, 0, NULL); 8772 Function::Cast(*trouble_caller)
8773 ->Call(env.local(), global, 0, NULL)
8774 .FromMaybe(v8::Local<v8::Value>());
7836 CHECK_EQ(1, report_count); 8775 CHECK_EQ(1, report_count);
7837 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); 8776 isolate->RemoveMessageListeners(ApiUncaughtExceptionTestListener);
7838 } 8777 }
7839 8778
7840 8779
7841 TEST(ApiUncaughtExceptionInObjectObserve) { 8780 TEST(ApiUncaughtExceptionInObjectObserve) {
7842 v8::internal::FLAG_stack_size = 150; 8781 v8::internal::FLAG_stack_size = 150;
7843 report_count = 0; 8782 report_count = 0;
7844 LocalContext env; 8783 LocalContext env;
7845 v8::Isolate* isolate = env->GetIsolate(); 8784 v8::Isolate* isolate = env->GetIsolate();
7846 v8::HandleScope scope(isolate); 8785 v8::HandleScope scope(isolate);
7847 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); 8786 isolate->AddMessageListener(ApiUncaughtExceptionTestListener);
7848 CompileRun( 8787 CompileRun(
7849 "var obj = {};" 8788 "var obj = {};"
7850 "var observe_count = 0;" 8789 "var observe_count = 0;"
7851 "function observer1() { ++observe_count; };" 8790 "function observer1() { ++observe_count; };"
7852 "function observer2() { ++observe_count; };" 8791 "function observer2() { ++observe_count; };"
7853 "function observer_throws() { throw new Error(); };" 8792 "function observer_throws() { throw new Error(); };"
7854 "function stack_overflow() { return (function f(x) { f(x+1); })(0); };" 8793 "function stack_overflow() { return (function f(x) { f(x+1); })(0); };"
7855 "Object.observe(obj, observer_throws.bind());" 8794 "Object.observe(obj, observer_throws.bind());"
7856 "Object.observe(obj, observer1);" 8795 "Object.observe(obj, observer1);"
7857 "Object.observe(obj, stack_overflow);" 8796 "Object.observe(obj, stack_overflow);"
7858 "Object.observe(obj, observer2);" 8797 "Object.observe(obj, observer2);"
7859 "Object.observe(obj, observer_throws.bind());" 8798 "Object.observe(obj, observer_throws.bind());"
7860 "obj.foo = 'bar';"); 8799 "obj.foo = 'bar';");
7861 CHECK_EQ(3, report_count); 8800 CHECK_EQ(3, report_count);
7862 ExpectInt32("observe_count", 2); 8801 ExpectInt32("observe_count", 2);
7863 v8::V8::RemoveMessageListeners(ApiUncaughtExceptionTestListener); 8802 isolate->RemoveMessageListeners(ApiUncaughtExceptionTestListener);
7864 } 8803 }
7865 8804
7866 8805
7867 static const char* script_resource_name = "ExceptionInNativeScript.js"; 8806 static const char* script_resource_name = "ExceptionInNativeScript.js";
7868 static void ExceptionInNativeScriptTestListener(v8::Handle<v8::Message> message, 8807 static void ExceptionInNativeScriptTestListener(v8::Local<v8::Message> message,
7869 v8::Handle<Value>) { 8808 v8::Local<Value>) {
7870 v8::Handle<v8::Value> name_val = message->GetScriptOrigin().ResourceName(); 8809 v8::Local<v8::Value> name_val = message->GetScriptOrigin().ResourceName();
7871 CHECK(!name_val.IsEmpty() && name_val->IsString()); 8810 CHECK(!name_val.IsEmpty() && name_val->IsString());
7872 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); 8811 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName());
7873 CHECK_EQ(0, strcmp(script_resource_name, *name)); 8812 CHECK_EQ(0, strcmp(script_resource_name, *name));
7874 CHECK_EQ(3, message->GetLineNumber()); 8813 v8::Local<v8::Context> context =
7875 v8::String::Utf8Value source_line(message->GetSourceLine()); 8814 v8::Isolate::GetCurrent()->GetCurrentContext();
8815 CHECK_EQ(3, message->GetLineNumber(context).FromJust());
8816 v8::String::Utf8Value source_line(
8817 message->GetSourceLine(context).ToLocalChecked());
7876 CHECK_EQ(0, strcmp(" new o.foo();", *source_line)); 8818 CHECK_EQ(0, strcmp(" new o.foo();", *source_line));
7877 } 8819 }
7878 8820
7879 8821
7880 TEST(ExceptionInNativeScript) { 8822 TEST(ExceptionInNativeScript) {
7881 LocalContext env; 8823 LocalContext env;
7882 v8::Isolate* isolate = env->GetIsolate(); 8824 v8::Isolate* isolate = env->GetIsolate();
7883 v8::HandleScope scope(isolate); 8825 v8::HandleScope scope(isolate);
7884 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); 8826 isolate->AddMessageListener(ExceptionInNativeScriptTestListener);
7885 8827
7886 Local<v8::FunctionTemplate> fun = 8828 Local<v8::FunctionTemplate> fun =
7887 v8::FunctionTemplate::New(isolate, TroubleCallback); 8829 v8::FunctionTemplate::New(isolate, TroubleCallback);
7888 v8::Local<v8::Object> global = env->Global(); 8830 v8::Local<v8::Object> global = env->Global();
7889 global->Set(v8_str("trouble"), fun->GetFunction()); 8831 CHECK(global->Set(env.local(), v8_str("trouble"),
8832 fun->GetFunction(env.local()).ToLocalChecked())
8833 .FromJust());
7890 8834
7891 CompileRunWithOrigin( 8835 CompileRunWithOrigin(
7892 "function trouble() {\n" 8836 "function trouble() {\n"
7893 " var o = {};\n" 8837 " var o = {};\n"
7894 " new o.foo();\n" 8838 " new o.foo();\n"
7895 "};", 8839 "};",
7896 script_resource_name); 8840 script_resource_name);
7897 Local<Value> trouble = global->Get(v8_str("trouble")); 8841 Local<Value> trouble =
8842 global->Get(env.local(), v8_str("trouble")).ToLocalChecked();
7898 CHECK(trouble->IsFunction()); 8843 CHECK(trouble->IsFunction());
7899 Function::Cast(*trouble)->Call(global, 0, NULL); 8844 CHECK(Function::Cast(*trouble)->Call(env.local(), global, 0, NULL).IsEmpty());
7900 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); 8845 isolate->RemoveMessageListeners(ExceptionInNativeScriptTestListener);
7901 } 8846 }
7902 8847
7903 8848
7904 TEST(CompilationErrorUsingTryCatchHandler) { 8849 TEST(CompilationErrorUsingTryCatchHandler) {
7905 LocalContext env; 8850 LocalContext env;
7906 v8::HandleScope scope(env->GetIsolate()); 8851 v8::HandleScope scope(env->GetIsolate());
7907 v8::TryCatch try_catch(env->GetIsolate()); 8852 v8::TryCatch try_catch(env->GetIsolate());
7908 v8_compile("This doesn't &*&@#$&*^ compile."); 8853 v8_compile("This doesn't &*&@#$&*^ compile.");
7909 CHECK(*try_catch.Exception()); 8854 CHECK(*try_catch.Exception());
7910 CHECK(try_catch.HasCaught()); 8855 CHECK(try_catch.HasCaught());
(...skipping 17 matching lines...) Expand all
7928 CompileRun( 8873 CompileRun(
7929 "(function()" 8874 "(function()"
7930 " { try { throw ''; } finally { throw 0; }" 8875 " { try { throw ''; } finally { throw 0; }"
7931 "})()"); 8876 "})()");
7932 CHECK(try_catch.HasCaught()); 8877 CHECK(try_catch.HasCaught());
7933 } 8878 }
7934 8879
7935 8880
7936 void CEvaluate(const v8::FunctionCallbackInfo<v8::Value>& args) { 8881 void CEvaluate(const v8::FunctionCallbackInfo<v8::Value>& args) {
7937 v8::HandleScope scope(args.GetIsolate()); 8882 v8::HandleScope scope(args.GetIsolate());
7938 CompileRun(args[0]->ToString(args.GetIsolate())); 8883 CompileRun(args[0]
8884 ->ToString(args.GetIsolate()->GetCurrentContext())
8885 .ToLocalChecked());
7939 } 8886 }
7940 8887
7941 8888
7942 TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) { 8889 TEST(TryCatchFinallyStoresMessageUsingTryCatchHandler) {
7943 v8::Isolate* isolate = CcTest::isolate(); 8890 v8::Isolate* isolate = CcTest::isolate();
7944 v8::HandleScope scope(isolate); 8891 v8::HandleScope scope(isolate);
7945 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 8892 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
7946 templ->Set(v8_str("CEvaluate"), 8893 templ->Set(v8_str("CEvaluate"),
7947 v8::FunctionTemplate::New(isolate, CEvaluate)); 8894 v8::FunctionTemplate::New(isolate, CEvaluate));
7948 LocalContext context(0, templ); 8895 LocalContext context(0, templ);
(...skipping 25 matching lines...) Expand all
7974 Local<v8::Object> accessed_object) { 8921 Local<v8::Object> accessed_object) {
7975 printf("a\n"); 8922 printf("a\n");
7976 return g_security_callback_result; 8923 return g_security_callback_result;
7977 } 8924 }
7978 8925
7979 8926
7980 // SecurityHandler can't be run twice 8927 // SecurityHandler can't be run twice
7981 TEST(SecurityHandler) { 8928 TEST(SecurityHandler) {
7982 v8::Isolate* isolate = CcTest::isolate(); 8929 v8::Isolate* isolate = CcTest::isolate();
7983 v8::HandleScope scope0(isolate); 8930 v8::HandleScope scope0(isolate);
7984 v8::Handle<v8::ObjectTemplate> global_template = 8931 v8::Local<v8::ObjectTemplate> global_template =
7985 v8::ObjectTemplate::New(isolate); 8932 v8::ObjectTemplate::New(isolate);
7986 global_template->SetAccessCheckCallback(SecurityTestCallback); 8933 global_template->SetAccessCheckCallback(SecurityTestCallback);
7987 // Create an environment 8934 // Create an environment
7988 v8::Handle<Context> context0 = Context::New(isolate, NULL, global_template); 8935 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
7989 context0->Enter(); 8936 context0->Enter();
7990 8937
7991 v8::Handle<v8::Object> global0 = context0->Global(); 8938 v8::Local<v8::Object> global0 = context0->Global();
7992 v8::Handle<Script> script0 = v8_compile("foo = 111"); 8939 v8::Local<Script> script0 = v8_compile("foo = 111");
7993 script0->Run(); 8940 script0->Run(context0).ToLocalChecked();
7994 global0->Set(v8_str("0"), v8_num(999)); 8941 CHECK(global0->Set(context0, v8_str("0"), v8_num(999)).FromJust());
7995 v8::Handle<Value> foo0 = global0->Get(v8_str("foo")); 8942 v8::Local<Value> foo0 =
7996 CHECK_EQ(111, foo0->Int32Value()); 8943 global0->Get(context0, v8_str("foo")).ToLocalChecked();
7997 v8::Handle<Value> z0 = global0->Get(v8_str("0")); 8944 CHECK_EQ(111, foo0->Int32Value(context0).FromJust());
7998 CHECK_EQ(999, z0->Int32Value()); 8945 v8::Local<Value> z0 = global0->Get(context0, v8_str("0")).ToLocalChecked();
8946 CHECK_EQ(999, z0->Int32Value(context0).FromJust());
7999 8947
8000 // Create another environment, should fail security checks. 8948 // Create another environment, should fail security checks.
8001 v8::HandleScope scope1(isolate); 8949 v8::HandleScope scope1(isolate);
8002 8950
8003 v8::Handle<Context> context1 = 8951 v8::Local<Context> context1 = Context::New(isolate, NULL, global_template);
8004 Context::New(isolate, NULL, global_template);
8005 context1->Enter(); 8952 context1->Enter();
8006 8953
8007 v8::Handle<v8::Object> global1 = context1->Global(); 8954 v8::Local<v8::Object> global1 = context1->Global();
8008 global1->Set(v8_str("othercontext"), global0); 8955 global1->Set(context1, v8_str("othercontext"), global0).FromJust();
8009 // This set will fail the security check. 8956 // This set will fail the security check.
8010 v8::Handle<Script> script1 = 8957 v8::Local<Script> script1 =
8011 v8_compile("othercontext.foo = 222; othercontext[0] = 888;"); 8958 v8_compile("othercontext.foo = 222; othercontext[0] = 888;");
8012 script1->Run(); 8959 CHECK(script1->Run(context1).IsEmpty());
8013 g_security_callback_result = true; 8960 g_security_callback_result = true;
8014 // This read will pass the security check. 8961 // This read will pass the security check.
8015 v8::Handle<Value> foo1 = global0->Get(v8_str("foo")); 8962 v8::Local<Value> foo1 =
8016 CHECK_EQ(111, foo1->Int32Value()); 8963 global0->Get(context0, v8_str("foo")).ToLocalChecked();
8964 CHECK_EQ(111, foo1->Int32Value(context0).FromJust());
8017 // This read will pass the security check. 8965 // This read will pass the security check.
8018 v8::Handle<Value> z1 = global0->Get(v8_str("0")); 8966 v8::Local<Value> z1 = global0->Get(context0, v8_str("0")).ToLocalChecked();
8019 CHECK_EQ(999, z1->Int32Value()); 8967 CHECK_EQ(999, z1->Int32Value(context0).FromJust());
8020 8968
8021 // Create another environment, should pass security checks. 8969 // Create another environment, should pass security checks.
8022 { 8970 {
8023 v8::HandleScope scope2(isolate); 8971 v8::HandleScope scope2(isolate);
8024 LocalContext context2; 8972 LocalContext context2;
8025 v8::Handle<v8::Object> global2 = context2->Global(); 8973 v8::Local<v8::Object> global2 = context2->Global();
8026 global2->Set(v8_str("othercontext"), global0); 8974 CHECK(global2->Set(context2.local(), v8_str("othercontext"), global0)
8027 v8::Handle<Script> script2 = 8975 .FromJust());
8976 v8::Local<Script> script2 =
8028 v8_compile("othercontext.foo = 333; othercontext[0] = 888;"); 8977 v8_compile("othercontext.foo = 333; othercontext[0] = 888;");
8029 script2->Run(); 8978 script2->Run(context2.local()).ToLocalChecked();
8030 v8::Handle<Value> foo2 = global0->Get(v8_str("foo")); 8979 v8::Local<Value> foo2 =
8031 CHECK_EQ(333, foo2->Int32Value()); 8980 global0->Get(context2.local(), v8_str("foo")).ToLocalChecked();
8032 v8::Handle<Value> z2 = global0->Get(v8_str("0")); 8981 CHECK_EQ(333, foo2->Int32Value(context2.local()).FromJust());
8033 CHECK_EQ(888, z2->Int32Value()); 8982 v8::Local<Value> z2 =
8983 global0->Get(context2.local(), v8_str("0")).ToLocalChecked();
8984 CHECK_EQ(888, z2->Int32Value(context2.local()).FromJust());
8034 } 8985 }
8035 8986
8036 context1->Exit(); 8987 context1->Exit();
8037 context0->Exit(); 8988 context0->Exit();
8038 } 8989 }
8039 8990
8040 8991
8041 THREADED_TEST(SecurityChecks) { 8992 THREADED_TEST(SecurityChecks) {
8042 LocalContext env1; 8993 LocalContext env1;
8043 v8::HandleScope handle_scope(env1->GetIsolate()); 8994 v8::HandleScope handle_scope(env1->GetIsolate());
8044 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 8995 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8045 8996
8046 Local<Value> foo = v8_str("foo"); 8997 Local<Value> foo = v8_str("foo");
8047 Local<Value> bar = v8_str("bar"); 8998 Local<Value> bar = v8_str("bar");
8048 8999
8049 // Set to the same domain. 9000 // Set to the same domain.
8050 env1->SetSecurityToken(foo); 9001 env1->SetSecurityToken(foo);
8051 9002
8052 // Create a function in env1. 9003 // Create a function in env1.
8053 CompileRun("spy=function(){return spy;}"); 9004 CompileRun("spy=function(){return spy;}");
8054 Local<Value> spy = env1->Global()->Get(v8_str("spy")); 9005 Local<Value> spy =
9006 env1->Global()->Get(env1.local(), v8_str("spy")).ToLocalChecked();
8055 CHECK(spy->IsFunction()); 9007 CHECK(spy->IsFunction());
8056 9008
8057 // Create another function accessing global objects. 9009 // Create another function accessing global objects.
8058 CompileRun("spy2=function(){return new this.Array();}"); 9010 CompileRun("spy2=function(){return new this.Array();}");
8059 Local<Value> spy2 = env1->Global()->Get(v8_str("spy2")); 9011 Local<Value> spy2 =
9012 env1->Global()->Get(env1.local(), v8_str("spy2")).ToLocalChecked();
8060 CHECK(spy2->IsFunction()); 9013 CHECK(spy2->IsFunction());
8061 9014
8062 // Switch to env2 in the same domain and invoke spy on env2. 9015 // Switch to env2 in the same domain and invoke spy on env2.
8063 { 9016 {
8064 env2->SetSecurityToken(foo); 9017 env2->SetSecurityToken(foo);
8065 // Enter env2 9018 // Enter env2
8066 Context::Scope scope_env2(env2); 9019 Context::Scope scope_env2(env2);
8067 Local<Value> result = Function::Cast(*spy)->Call(env2->Global(), 0, NULL); 9020 Local<Value> result = Function::Cast(*spy)
9021 ->Call(env2, env2->Global(), 0, NULL)
9022 .ToLocalChecked();
8068 CHECK(result->IsFunction()); 9023 CHECK(result->IsFunction());
8069 } 9024 }
8070 9025
8071 { 9026 {
8072 env2->SetSecurityToken(bar); 9027 env2->SetSecurityToken(bar);
8073 Context::Scope scope_env2(env2); 9028 Context::Scope scope_env2(env2);
8074 9029
8075 // Call cross_domain_call, it should throw an exception 9030 // Call cross_domain_call, it should throw an exception
8076 v8::TryCatch try_catch(env1->GetIsolate()); 9031 v8::TryCatch try_catch(env1->GetIsolate());
8077 Function::Cast(*spy2)->Call(env2->Global(), 0, NULL); 9032 CHECK(Function::Cast(*spy2)->Call(env2, env2->Global(), 0, NULL).IsEmpty());
8078 CHECK(try_catch.HasCaught()); 9033 CHECK(try_catch.HasCaught());
8079 } 9034 }
8080 } 9035 }
8081 9036
8082 9037
8083 // Regression test case for issue 1183439. 9038 // Regression test case for issue 1183439.
8084 THREADED_TEST(SecurityChecksForPrototypeChain) { 9039 THREADED_TEST(SecurityChecksForPrototypeChain) {
8085 LocalContext current; 9040 LocalContext current;
8086 v8::HandleScope scope(current->GetIsolate()); 9041 v8::HandleScope scope(current->GetIsolate());
8087 v8::Handle<Context> other = Context::New(current->GetIsolate()); 9042 v8::Local<Context> other = Context::New(current->GetIsolate());
8088 9043
8089 // Change context to be able to get to the Object function in the 9044 // Change context to be able to get to the Object function in the
8090 // other context without hitting the security checks. 9045 // other context without hitting the security checks.
8091 v8::Local<Value> other_object; 9046 v8::Local<Value> other_object;
8092 { Context::Scope scope(other); 9047 { Context::Scope scope(other);
8093 other_object = other->Global()->Get(v8_str("Object")); 9048 other_object =
8094 other->Global()->Set(v8_num(42), v8_num(87)); 9049 other->Global()->Get(other, v8_str("Object")).ToLocalChecked();
9050 CHECK(other->Global()->Set(other, v8_num(42), v8_num(87)).FromJust());
8095 } 9051 }
8096 9052
8097 current->Global()->Set(v8_str("other"), other->Global()); 9053 CHECK(current->Global()
8098 CHECK(v8_compile("other")->Run()->Equals(other->Global())); 9054 ->Set(current.local(), v8_str("other"), other->Global())
9055 .FromJust());
9056 CHECK(v8_compile("other")
9057 ->Run(current.local())
9058 .ToLocalChecked()
9059 ->Equals(current.local(), other->Global())
9060 .FromJust());
8099 9061
8100 // Make sure the security check fails here and we get an undefined 9062 // Make sure the security check fails here and we get an undefined
8101 // result instead of getting the Object function. Repeat in a loop 9063 // result instead of getting the Object function. Repeat in a loop
8102 // to make sure to exercise the IC code. 9064 // to make sure to exercise the IC code.
8103 v8::Local<Script> access_other0 = v8_compile("other.Object"); 9065 v8::Local<Script> access_other0 = v8_compile("other.Object");
8104 v8::Local<Script> access_other1 = v8_compile("other[42]"); 9066 v8::Local<Script> access_other1 = v8_compile("other[42]");
8105 for (int i = 0; i < 5; i++) { 9067 for (int i = 0; i < 5; i++) {
8106 CHECK(access_other0->Run().IsEmpty()); 9068 CHECK(access_other0->Run(current.local()).IsEmpty());
8107 CHECK(access_other1->Run().IsEmpty()); 9069 CHECK(access_other1->Run(current.local()).IsEmpty());
8108 } 9070 }
8109 9071
8110 // Create an object that has 'other' in its prototype chain and make 9072 // Create an object that has 'other' in its prototype chain and make
8111 // sure we cannot access the Object function indirectly through 9073 // sure we cannot access the Object function indirectly through
8112 // that. Repeat in a loop to make sure to exercise the IC code. 9074 // that. Repeat in a loop to make sure to exercise the IC code.
8113 v8_compile("function F() { };" 9075 v8_compile(
8114 "F.prototype = other;" 9076 "function F() { };"
8115 "var f = new F();")->Run(); 9077 "F.prototype = other;"
9078 "var f = new F();")
9079 ->Run(current.local())
9080 .ToLocalChecked();
8116 v8::Local<Script> access_f0 = v8_compile("f.Object"); 9081 v8::Local<Script> access_f0 = v8_compile("f.Object");
8117 v8::Local<Script> access_f1 = v8_compile("f[42]"); 9082 v8::Local<Script> access_f1 = v8_compile("f[42]");
8118 for (int j = 0; j < 5; j++) { 9083 for (int j = 0; j < 5; j++) {
8119 CHECK(access_f0->Run().IsEmpty()); 9084 CHECK(access_f0->Run(current.local()).IsEmpty());
8120 CHECK(access_f1->Run().IsEmpty()); 9085 CHECK(access_f1->Run(current.local()).IsEmpty());
8121 } 9086 }
8122 9087
8123 // Now it gets hairy: Set the prototype for the other global object 9088 // 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 9089 // to be the current global object. The prototype chain for 'f' now
8125 // goes through 'other' but ends up in the current global object. 9090 // goes through 'other' but ends up in the current global object.
8126 { Context::Scope scope(other); 9091 { Context::Scope scope(other);
8127 other->Global()->Set(v8_str("__proto__"), current->Global()); 9092 CHECK(other->Global()
9093 ->Set(other, v8_str("__proto__"), current->Global())
9094 .FromJust());
8128 } 9095 }
8129 // Set a named and an index property on the current global 9096 // Set a named and an index property on the current global
8130 // object. To force the lookup to go through the other global object, 9097 // object. To force the lookup to go through the other global object,
8131 // the properties must not exist in the other global object. 9098 // the properties must not exist in the other global object.
8132 current->Global()->Set(v8_str("foo"), v8_num(100)); 9099 CHECK(current->Global()
8133 current->Global()->Set(v8_num(99), v8_num(101)); 9100 ->Set(current.local(), v8_str("foo"), v8_num(100))
9101 .FromJust());
9102 CHECK(current->Global()
9103 ->Set(current.local(), v8_num(99), v8_num(101))
9104 .FromJust());
8134 // Try to read the properties from f and make sure that the access 9105 // 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. 9106 // gets stopped by the security checks on the other global object.
8136 Local<Script> access_f2 = v8_compile("f.foo"); 9107 Local<Script> access_f2 = v8_compile("f.foo");
8137 Local<Script> access_f3 = v8_compile("f[99]"); 9108 Local<Script> access_f3 = v8_compile("f[99]");
8138 for (int k = 0; k < 5; k++) { 9109 for (int k = 0; k < 5; k++) {
8139 CHECK(access_f2->Run().IsEmpty()); 9110 CHECK(access_f2->Run(current.local()).IsEmpty());
8140 CHECK(access_f3->Run().IsEmpty()); 9111 CHECK(access_f3->Run(current.local()).IsEmpty());
8141 } 9112 }
8142 } 9113 }
8143 9114
8144 9115
8145 static bool security_check_with_gc_called; 9116 static bool security_check_with_gc_called;
8146 9117
8147 static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context, 9118 static bool SecurityTestCallbackWithGC(Local<v8::Context> accessing_context,
8148 Local<v8::Object> accessed_object) { 9119 Local<v8::Object> accessed_object) {
8149 CcTest::heap()->CollectAllGarbage(); 9120 CcTest::heap()->CollectAllGarbage();
8150 security_check_with_gc_called = true; 9121 security_check_with_gc_called = true;
8151 return true; 9122 return true;
8152 } 9123 }
8153 9124
8154 9125
8155 TEST(SecurityTestGCAllowed) { 9126 TEST(SecurityTestGCAllowed) {
8156 v8::Isolate* isolate = CcTest::isolate(); 9127 v8::Isolate* isolate = CcTest::isolate();
8157 v8::HandleScope handle_scope(isolate); 9128 v8::HandleScope handle_scope(isolate);
8158 v8::Handle<v8::ObjectTemplate> object_template = 9129 v8::Local<v8::ObjectTemplate> object_template =
8159 v8::ObjectTemplate::New(isolate); 9130 v8::ObjectTemplate::New(isolate);
8160 object_template->SetAccessCheckCallback(SecurityTestCallbackWithGC); 9131 object_template->SetAccessCheckCallback(SecurityTestCallbackWithGC);
8161 9132
8162 v8::Handle<Context> context = Context::New(isolate); 9133 v8::Local<Context> context = Context::New(isolate);
8163 v8::Context::Scope context_scope(context); 9134 v8::Context::Scope context_scope(context);
8164 9135
8165 context->Global()->Set(v8_str("obj"), object_template->NewInstance()); 9136 CHECK(context->Global()
9137 ->Set(context, v8_str("obj"),
9138 object_template->NewInstance(context).ToLocalChecked())
9139 .FromJust());
8166 9140
8167 security_check_with_gc_called = false; 9141 security_check_with_gc_called = false;
8168 CompileRun("obj[0] = new String(1002);"); 9142 CompileRun("obj[0] = new String(1002);");
8169 CHECK(security_check_with_gc_called); 9143 CHECK(security_check_with_gc_called);
8170 9144
8171 security_check_with_gc_called = false; 9145 security_check_with_gc_called = false;
8172 CHECK(CompileRun("obj[0]")->ToString(isolate)->Equals(v8_str("1002"))); 9146 CHECK(CompileRun("obj[0]")
9147 ->ToString(context)
9148 .ToLocalChecked()
9149 ->Equals(context, v8_str("1002"))
9150 .FromJust());
8173 CHECK(security_check_with_gc_called); 9151 CHECK(security_check_with_gc_called);
8174 } 9152 }
8175 9153
8176 9154
8177 THREADED_TEST(CrossDomainDelete) { 9155 THREADED_TEST(CrossDomainDelete) {
8178 LocalContext env1; 9156 LocalContext env1;
8179 v8::HandleScope handle_scope(env1->GetIsolate()); 9157 v8::HandleScope handle_scope(env1->GetIsolate());
8180 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9158 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8181 9159
8182 Local<Value> foo = v8_str("foo"); 9160 Local<Value> foo = v8_str("foo");
8183 Local<Value> bar = v8_str("bar"); 9161 Local<Value> bar = v8_str("bar");
8184 9162
8185 // Set to the same domain. 9163 // Set to the same domain.
8186 env1->SetSecurityToken(foo); 9164 env1->SetSecurityToken(foo);
8187 env2->SetSecurityToken(foo); 9165 env2->SetSecurityToken(foo);
8188 9166
8189 env1->Global()->Set(v8_str("prop"), v8_num(3)); 9167 CHECK(env1->Global()->Set(env2, v8_str("prop"), v8_num(3)).FromJust());
jochen (gone - plz use gerrit) 2015/11/24 12:42:25 should be env1 here
vogelheim 2015/11/26 10:57:32 Done.
8190 env2->Global()->Set(v8_str("env1"), env1->Global()); 9168 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust());
8191 9169
8192 // Change env2 to a different domain and delete env1.prop. 9170 // Change env2 to a different domain and delete env1.prop.
8193 env2->SetSecurityToken(bar); 9171 env2->SetSecurityToken(bar);
8194 { 9172 {
8195 Context::Scope scope_env2(env2); 9173 Context::Scope scope_env2(env2);
8196 Local<Value> result = 9174 Local<Value> result =
8197 CompileRun("delete env1.prop"); 9175 CompileRun("delete env1.prop");
8198 CHECK(result.IsEmpty()); 9176 CHECK(result.IsEmpty());
8199 } 9177 }
8200 9178
8201 // Check that env1.prop still exists. 9179 // Check that env1.prop still exists.
8202 Local<Value> v = env1->Global()->Get(v8_str("prop")); 9180 Local<Value> v =
9181 env1->Global()->Get(env1.local(), v8_str("prop")).ToLocalChecked();
8203 CHECK(v->IsNumber()); 9182 CHECK(v->IsNumber());
8204 CHECK_EQ(3, v->Int32Value()); 9183 CHECK_EQ(3, v->Int32Value(env1.local()).FromJust());
8205 } 9184 }
8206 9185
8207 9186
8208 THREADED_TEST(CrossDomainIsPropertyEnumerable) { 9187 THREADED_TEST(CrossDomainIsPropertyEnumerable) {
8209 LocalContext env1; 9188 LocalContext env1;
8210 v8::HandleScope handle_scope(env1->GetIsolate()); 9189 v8::HandleScope handle_scope(env1->GetIsolate());
8211 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9190 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8212 9191
8213 Local<Value> foo = v8_str("foo"); 9192 Local<Value> foo = v8_str("foo");
8214 Local<Value> bar = v8_str("bar"); 9193 Local<Value> bar = v8_str("bar");
8215 9194
8216 // Set to the same domain. 9195 // Set to the same domain.
8217 env1->SetSecurityToken(foo); 9196 env1->SetSecurityToken(foo);
8218 env2->SetSecurityToken(foo); 9197 env2->SetSecurityToken(foo);
8219 9198
8220 env1->Global()->Set(v8_str("prop"), v8_num(3)); 9199 CHECK(
8221 env2->Global()->Set(v8_str("env1"), env1->Global()); 9200 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust());
9201 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust());
8222 9202
8223 // env1.prop is enumerable in env2. 9203 // env1.prop is enumerable in env2.
8224 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')"); 9204 Local<String> test = v8_str("propertyIsEnumerable.call(env1, 'prop')");
8225 { 9205 {
8226 Context::Scope scope_env2(env2); 9206 Context::Scope scope_env2(env2);
8227 Local<Value> result = CompileRun(test); 9207 Local<Value> result = CompileRun(test);
8228 CHECK(result->IsTrue()); 9208 CHECK(result->IsTrue());
8229 } 9209 }
8230 9210
8231 // Change env2 to a different domain and test again. 9211 // Change env2 to a different domain and test again.
8232 env2->SetSecurityToken(bar); 9212 env2->SetSecurityToken(bar);
8233 { 9213 {
8234 Context::Scope scope_env2(env2); 9214 Context::Scope scope_env2(env2);
8235 Local<Value> result = CompileRun(test); 9215 Local<Value> result = CompileRun(test);
8236 CHECK(result.IsEmpty()); 9216 CHECK(result.IsEmpty());
8237 } 9217 }
8238 } 9218 }
8239 9219
8240 9220
8241 THREADED_TEST(CrossDomainFor) { 9221 THREADED_TEST(CrossDomainFor) {
8242 LocalContext env1; 9222 LocalContext env1;
8243 v8::HandleScope handle_scope(env1->GetIsolate()); 9223 v8::HandleScope handle_scope(env1->GetIsolate());
8244 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9224 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8245 9225
8246 Local<Value> foo = v8_str("foo"); 9226 Local<Value> foo = v8_str("foo");
8247 Local<Value> bar = v8_str("bar"); 9227 Local<Value> bar = v8_str("bar");
8248 9228
8249 // Set to the same domain. 9229 // Set to the same domain.
8250 env1->SetSecurityToken(foo); 9230 env1->SetSecurityToken(foo);
8251 env2->SetSecurityToken(foo); 9231 env2->SetSecurityToken(foo);
8252 9232
8253 env1->Global()->Set(v8_str("prop"), v8_num(3)); 9233 CHECK(
8254 env2->Global()->Set(v8_str("env1"), env1->Global()); 9234 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust());
9235 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust());
8255 9236
8256 // Change env2 to a different domain and set env1's global object 9237 // Change env2 to a different domain and set env1's global object
8257 // as the __proto__ of an object in env2 and enumerate properties 9238 // as the __proto__ of an object in env2 and enumerate properties
8258 // in for-in. It shouldn't enumerate properties on env1's global 9239 // in for-in. It shouldn't enumerate properties on env1's global
8259 // object. 9240 // object.
8260 env2->SetSecurityToken(bar); 9241 env2->SetSecurityToken(bar);
8261 { 9242 {
8262 Context::Scope scope_env2(env2); 9243 Context::Scope scope_env2(env2);
8263 Local<Value> result = CompileRun( 9244 Local<Value> result = CompileRun(
8264 "(function() {" 9245 "(function() {"
8265 " try {" 9246 " try {"
8266 " for (var p in env1) {" 9247 " for (var p in env1) {"
8267 " if (p == 'prop') return false;" 9248 " if (p == 'prop') return false;"
8268 " }" 9249 " }"
8269 " return true;" 9250 " return true;"
8270 " } catch (e) {" 9251 " } catch (e) {"
8271 " return false;" 9252 " return false;"
8272 " }" 9253 " }"
8273 "})()"); 9254 "})()");
8274 CHECK(result->IsTrue()); 9255 CHECK(result->IsTrue());
8275 } 9256 }
8276 } 9257 }
8277 9258
8278 9259
8279 THREADED_TEST(CrossDomainForInOnPrototype) { 9260 THREADED_TEST(CrossDomainForInOnPrototype) {
8280 LocalContext env1; 9261 LocalContext env1;
8281 v8::HandleScope handle_scope(env1->GetIsolate()); 9262 v8::HandleScope handle_scope(env1->GetIsolate());
8282 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9263 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8283 9264
8284 Local<Value> foo = v8_str("foo"); 9265 Local<Value> foo = v8_str("foo");
8285 Local<Value> bar = v8_str("bar"); 9266 Local<Value> bar = v8_str("bar");
8286 9267
8287 // Set to the same domain. 9268 // Set to the same domain.
8288 env1->SetSecurityToken(foo); 9269 env1->SetSecurityToken(foo);
8289 env2->SetSecurityToken(foo); 9270 env2->SetSecurityToken(foo);
8290 9271
8291 env1->Global()->Set(v8_str("prop"), v8_num(3)); 9272 CHECK(
8292 env2->Global()->Set(v8_str("env1"), env1->Global()); 9273 env1->Global()->Set(env1.local(), v8_str("prop"), v8_num(3)).FromJust());
9274 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust());
8293 9275
8294 // Change env2 to a different domain and set env1's global object 9276 // Change env2 to a different domain and set env1's global object
8295 // as the __proto__ of an object in env2 and enumerate properties 9277 // as the __proto__ of an object in env2 and enumerate properties
8296 // in for-in. It shouldn't enumerate properties on env1's global 9278 // in for-in. It shouldn't enumerate properties on env1's global
8297 // object. 9279 // object.
8298 env2->SetSecurityToken(bar); 9280 env2->SetSecurityToken(bar);
8299 { 9281 {
8300 Context::Scope scope_env2(env2); 9282 Context::Scope scope_env2(env2);
8301 Local<Value> result = CompileRun( 9283 Local<Value> result = CompileRun(
8302 "(function() {" 9284 "(function() {"
8303 " var obj = { '__proto__': env1 };" 9285 " var obj = { '__proto__': env1 };"
8304 " try {" 9286 " try {"
8305 " for (var p in obj) {" 9287 " for (var p in obj) {"
8306 " if (p == 'prop') return false;" 9288 " if (p == 'prop') return false;"
8307 " }" 9289 " }"
8308 " return false;" 9290 " return false;"
8309 " } catch (e) {" 9291 " } catch (e) {"
8310 " return true;" 9292 " return true;"
8311 " }" 9293 " }"
8312 "})()"); 9294 "})()");
8313 CHECK(result->IsTrue()); 9295 CHECK(result->IsTrue());
8314 } 9296 }
8315 } 9297 }
8316 9298
8317 9299
8318 TEST(ContextDetachGlobal) { 9300 TEST(ContextDetachGlobal) {
8319 LocalContext env1; 9301 LocalContext env1;
8320 v8::HandleScope handle_scope(env1->GetIsolate()); 9302 v8::HandleScope handle_scope(env1->GetIsolate());
8321 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9303 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8322 9304
8323 Local<v8::Object> global1 = env1->Global();
8324 9305
8325 Local<Value> foo = v8_str("foo"); 9306 Local<Value> foo = v8_str("foo");
8326 9307
8327 // Set to the same domain. 9308 // Set to the same domain.
8328 env1->SetSecurityToken(foo); 9309 env1->SetSecurityToken(foo);
8329 env2->SetSecurityToken(foo); 9310 env2->SetSecurityToken(foo);
8330 9311
8331 // Enter env2 9312 // Enter env2
8332 env2->Enter(); 9313 env2->Enter();
8333 9314
8334 // Create a function in env2 and add a reference to it in env1. 9315 // Create a function in env2 and add a reference to it in env1.
8335 Local<v8::Object> global2 = env2->Global(); 9316 Local<v8::Object> global2 = env2->Global();
8336 global2->Set(v8_str("prop"), v8::Integer::New(env2->GetIsolate(), 1)); 9317 CHECK(global2->Set(env2, v8_str("prop"),
9318 v8::Integer::New(env2->GetIsolate(), 1))
9319 .FromJust());
8337 CompileRun("function getProp() {return prop;}"); 9320 CompileRun("function getProp() {return prop;}");
8338 9321
8339 env1->Global()->Set(v8_str("getProp"), 9322 CHECK(env1->Global()
8340 global2->Get(v8_str("getProp"))); 9323 ->Set(env1.local(), v8_str("getProp"),
9324 global2->Get(env2, v8_str("getProp")).ToLocalChecked())
9325 .FromJust());
8341 9326
8342 // Detach env2's global, and reuse the global object of env2 9327 // Detach env2's global, and reuse the global object of env2
8343 env2->Exit(); 9328 env2->Exit();
8344 env2->DetachGlobal(); 9329 env2->DetachGlobal();
8345 9330
8346 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), 9331 v8::Local<Context> env3 = Context::New(
8347 0, 9332 env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(), global2);
8348 v8::Handle<v8::ObjectTemplate>(),
8349 global2);
8350 env3->SetSecurityToken(v8_str("bar")); 9333 env3->SetSecurityToken(v8_str("bar"));
9334
8351 env3->Enter(); 9335 env3->Enter();
8352
8353 Local<v8::Object> global3 = env3->Global(); 9336 Local<v8::Object> global3 = env3->Global();
8354 CHECK(global2->Equals(global3)); 9337 CHECK(global2->Equals(env3, global3).FromJust());
8355 CHECK(global3->Get(v8_str("prop"))->IsUndefined()); 9338 CHECK(global3->Get(env3, v8_str("prop")).ToLocalChecked()->IsUndefined());
8356 CHECK(global3->Get(v8_str("getProp"))->IsUndefined()); 9339 CHECK(global3->Get(env3, v8_str("getProp")).ToLocalChecked()->IsUndefined());
8357 global3->Set(v8_str("prop"), v8::Integer::New(env3->GetIsolate(), -1)); 9340 CHECK(global3->Set(env3, v8_str("prop"),
8358 global3->Set(v8_str("prop2"), v8::Integer::New(env3->GetIsolate(), 2)); 9341 v8::Integer::New(env3->GetIsolate(), -1))
9342 .FromJust());
9343 CHECK(global3->Set(env3, v8_str("prop2"),
9344 v8::Integer::New(env3->GetIsolate(), 2))
9345 .FromJust());
8359 env3->Exit(); 9346 env3->Exit();
8360 9347
8361 // Call getProp in env1, and it should return the value 1 9348 // Call getProp in env1, and it should return the value 1
8362 { 9349 {
8363 Local<Value> get_prop = global1->Get(v8_str("getProp")); 9350 Local<v8::Object> global1 = env1->Global();
9351 Local<Value> get_prop =
9352 global1->Get(env1.local(), v8_str("getProp")).ToLocalChecked();
8364 CHECK(get_prop->IsFunction()); 9353 CHECK(get_prop->IsFunction());
8365 v8::TryCatch try_catch(env1->GetIsolate()); 9354 v8::TryCatch try_catch(env1->GetIsolate());
8366 Local<Value> r = Function::Cast(*get_prop)->Call(global1, 0, NULL); 9355 Local<Value> r = Function::Cast(*get_prop)
9356 ->Call(env1.local(), global1, 0, NULL)
9357 .ToLocalChecked();
8367 CHECK(!try_catch.HasCaught()); 9358 CHECK(!try_catch.HasCaught());
8368 CHECK_EQ(1, r->Int32Value()); 9359 CHECK_EQ(1, r->Int32Value(env1.local()).FromJust());
8369 } 9360 }
8370 9361
8371 // Check that env3 is not accessible from env1 9362 // Check that env3 is not accessible from env1
8372 { 9363 {
8373 Local<Value> r = global3->Get(v8_str("prop2")); 9364 v8::MaybeLocal<Value> r = global3->Get(env1.local(), v8_str("prop2"));
8374 CHECK(r.IsEmpty()); 9365 CHECK(r.IsEmpty());
8375 } 9366 }
8376 } 9367 }
8377 9368
8378 9369
8379 TEST(DetachGlobal) { 9370 TEST(DetachGlobal) {
8380 LocalContext env1; 9371 LocalContext env1;
8381 v8::HandleScope scope(env1->GetIsolate()); 9372 v8::HandleScope scope(env1->GetIsolate());
8382 9373
8383 // Create second environment. 9374 // Create second environment.
8384 v8::Handle<Context> env2 = Context::New(env1->GetIsolate()); 9375 v8::Local<Context> env2 = Context::New(env1->GetIsolate());
8385 9376
8386 Local<Value> foo = v8_str("foo"); 9377 Local<Value> foo = v8_str("foo");
8387 9378
8388 // Set same security token for env1 and env2. 9379 // Set same security token for env1 and env2.
8389 env1->SetSecurityToken(foo); 9380 env1->SetSecurityToken(foo);
8390 env2->SetSecurityToken(foo); 9381 env2->SetSecurityToken(foo);
8391 9382
8392 // Create a property on the global object in env2. 9383 // Create a property on the global object in env2.
8393 { 9384 {
8394 v8::Context::Scope scope(env2); 9385 v8::Context::Scope scope(env2);
8395 env2->Global()->Set(v8_str("p"), v8::Integer::New(env2->GetIsolate(), 42)); 9386 CHECK(env2->Global()
9387 ->Set(env2, v8_str("p"), v8::Integer::New(env2->GetIsolate(), 42))
9388 .FromJust());
8396 } 9389 }
8397 9390
8398 // Create a reference to env2 global from env1 global. 9391 // Create a reference to env2 global from env1 global.
8399 env1->Global()->Set(v8_str("other"), env2->Global()); 9392 CHECK(env1->Global()
9393 ->Set(env1.local(), v8_str("other"), env2->Global())
9394 .FromJust());
8400 9395
8401 // Check that we have access to other.p in env2 from env1. 9396 // Check that we have access to other.p in env2 from env1.
8402 Local<Value> result = CompileRun("other.p"); 9397 Local<Value> result = CompileRun("other.p");
8403 CHECK(result->IsInt32()); 9398 CHECK(result->IsInt32());
8404 CHECK_EQ(42, result->Int32Value()); 9399 CHECK_EQ(42, result->Int32Value(env1.local()).FromJust());
8405 9400
8406 // Hold on to global from env2 and detach global from env2. 9401 // Hold on to global from env2 and detach global from env2.
8407 Local<v8::Object> global2 = env2->Global(); 9402 Local<v8::Object> global2 = env2->Global();
8408 env2->DetachGlobal(); 9403 env2->DetachGlobal();
8409 9404
8410 // Check that the global has been detached. No other.p property can 9405 // Check that the global has been detached. No other.p property can
8411 // be found. 9406 // be found.
8412 result = CompileRun("other.p"); 9407 result = CompileRun("other.p");
8413 CHECK(result.IsEmpty()); 9408 CHECK(result.IsEmpty());
8414 9409
8415 // Reuse global2 for env3. 9410 // Reuse global2 for env3.
8416 v8::Handle<Context> env3 = Context::New(env1->GetIsolate(), 9411 v8::Local<Context> env3 = Context::New(
8417 0, 9412 env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(), global2);
8418 v8::Handle<v8::ObjectTemplate>(), 9413 CHECK(global2->Equals(env1.local(), env3->Global()).FromJust());
8419 global2);
8420 CHECK(global2->Equals(env3->Global()));
8421 9414
8422 // Start by using the same security token for env3 as for env1 and env2. 9415 // Start by using the same security token for env3 as for env1 and env2.
8423 env3->SetSecurityToken(foo); 9416 env3->SetSecurityToken(foo);
8424 9417
8425 // Create a property on the global object in env3. 9418 // Create a property on the global object in env3.
8426 { 9419 {
8427 v8::Context::Scope scope(env3); 9420 v8::Context::Scope scope(env3);
8428 env3->Global()->Set(v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24)); 9421 CHECK(env3->Global()
9422 ->Set(env3, v8_str("p"), v8::Integer::New(env3->GetIsolate(), 24))
9423 .FromJust());
8429 } 9424 }
8430 9425
8431 // Check that other.p is now the property in env3 and that we have access. 9426 // Check that other.p is now the property in env3 and that we have access.
8432 result = CompileRun("other.p"); 9427 result = CompileRun("other.p");
8433 CHECK(result->IsInt32()); 9428 CHECK(result->IsInt32());
8434 CHECK_EQ(24, result->Int32Value()); 9429 CHECK_EQ(24, result->Int32Value(env3).FromJust());
8435 9430
8436 // Change security token for env3 to something different from env1 and env2. 9431 // Change security token for env3 to something different from env1 and env2.
8437 env3->SetSecurityToken(v8_str("bar")); 9432 env3->SetSecurityToken(v8_str("bar"));
8438 9433
8439 // Check that we do not have access to other.p in env1. |other| is now 9434 // 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, 9435 // the global object for env3 which has a different security token,
8441 // so access should be blocked. 9436 // so access should be blocked.
8442 result = CompileRun("other.p"); 9437 result = CompileRun("other.p");
8443 CHECK(result.IsEmpty()); 9438 CHECK(result.IsEmpty());
8444 } 9439 }
8445 9440
8446 9441
8447 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) { 9442 void GetThisX(const v8::FunctionCallbackInfo<v8::Value>& info) {
9443 v8::Local<v8::Context> context = info.GetIsolate()->GetCurrentContext();
8448 info.GetReturnValue().Set( 9444 info.GetReturnValue().Set(
8449 info.GetIsolate()->GetCurrentContext()->Global()->Get(v8_str("x"))); 9445 context->Global()->Get(context, v8_str("x")).ToLocalChecked());
8450 } 9446 }
8451 9447
8452 9448
8453 TEST(DetachedAccesses) { 9449 TEST(DetachedAccesses) {
8454 LocalContext env1; 9450 LocalContext env1;
8455 v8::HandleScope scope(env1->GetIsolate()); 9451 v8::HandleScope scope(env1->GetIsolate());
8456 9452
8457 // Create second environment. 9453 // Create second environment.
8458 Local<ObjectTemplate> inner_global_template = 9454 Local<ObjectTemplate> inner_global_template =
8459 FunctionTemplate::New(env1->GetIsolate())->InstanceTemplate(); 9455 FunctionTemplate::New(env1->GetIsolate())->InstanceTemplate();
8460 inner_global_template ->SetAccessorProperty( 9456 inner_global_template ->SetAccessorProperty(
8461 v8_str("this_x"), FunctionTemplate::New(env1->GetIsolate(), GetThisX)); 9457 v8_str("this_x"), FunctionTemplate::New(env1->GetIsolate(), GetThisX));
8462 v8::Local<Context> env2 = 9458 v8::Local<Context> env2 =
8463 Context::New(env1->GetIsolate(), NULL, inner_global_template); 9459 Context::New(env1->GetIsolate(), NULL, inner_global_template);
8464 9460
8465 Local<Value> foo = v8_str("foo"); 9461 Local<Value> foo = v8_str("foo");
8466 9462
8467 // Set same security token for env1 and env2. 9463 // Set same security token for env1 and env2.
8468 env1->SetSecurityToken(foo); 9464 env1->SetSecurityToken(foo);
8469 env2->SetSecurityToken(foo); 9465 env2->SetSecurityToken(foo);
8470 9466
8471 env1->Global()->Set(v8_str("x"), v8_str("env1_x")); 9467 CHECK(env1->Global()
9468 ->Set(env1.local(), v8_str("x"), v8_str("env1_x"))
9469 .FromJust());
8472 9470
8473 { 9471 {
8474 v8::Context::Scope scope(env2); 9472 v8::Context::Scope scope(env2);
8475 env2->Global()->Set(v8_str("x"), v8_str("env2_x")); 9473 CHECK(env2->Global()->Set(env2, v8_str("x"), v8_str("env2_x")).FromJust());
8476 CompileRun( 9474 CompileRun(
8477 "function bound_x() { return x; }" 9475 "function bound_x() { return x; }"
8478 "function get_x() { return this.x; }" 9476 "function get_x() { return this.x; }"
8479 "function get_x_w() { return (function() {return this.x;})(); }"); 9477 "function get_x_w() { return (function() {return this.x;})(); }");
8480 env1->Global()->Set(v8_str("bound_x"), CompileRun("bound_x")); 9478 // SHOULD BE env2 ???
jochen (gone - plz use gerrit) 2015/11/24 12:42:25 env1 is ok here
vogelheim 2015/11/26 10:57:32 Done.
8481 env1->Global()->Set(v8_str("get_x"), CompileRun("get_x")); 9479 CHECK(env1->Global()
8482 env1->Global()->Set(v8_str("get_x_w"), CompileRun("get_x_w")); 9480 ->Set(env1.local(), v8_str("bound_x"), CompileRun("bound_x"))
8483 env1->Global()->Set( 9481 .FromJust());
8484 v8_str("this_x"), 9482 CHECK(env1->Global()
8485 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get")); 9483 ->Set(env1.local(), v8_str("get_x"), CompileRun("get_x"))
9484 .FromJust());
9485 CHECK(env1->Global()
9486 ->Set(env1.local(), v8_str("get_x_w"), CompileRun("get_x_w"))
9487 .FromJust());
9488 env1->Global()
9489 ->Set(env1.local(), v8_str("this_x"),
9490 CompileRun("Object.getOwnPropertyDescriptor(this, 'this_x').get"))
9491 .FromJust();
8486 } 9492 }
8487 9493
8488 Local<Object> env2_global = env2->Global(); 9494 Local<Object> env2_global = env2->Global();
8489 env2->DetachGlobal(); 9495 env2->DetachGlobal();
8490 9496
8491 Local<Value> result; 9497 Local<Value> result;
8492 result = CompileRun("bound_x()"); 9498 result = CompileRun("bound_x()");
8493 CHECK(v8_str("env2_x")->Equals(result)); 9499 CHECK(v8_str("env2_x")->Equals(env1.local(), result).FromJust());
8494 result = CompileRun("get_x()"); 9500 result = CompileRun("get_x()");
8495 CHECK(result.IsEmpty()); 9501 CHECK(result.IsEmpty());
8496 result = CompileRun("get_x_w()"); 9502 result = CompileRun("get_x_w()");
8497 CHECK(result.IsEmpty()); 9503 CHECK(result.IsEmpty());
8498 result = CompileRun("this_x()"); 9504 result = CompileRun("this_x()");
8499 CHECK(v8_str("env2_x")->Equals(result)); 9505 CHECK(v8_str("env2_x")->Equals(env1.local(), result).FromJust());
8500 9506
8501 // Reattach env2's proxy 9507 // Reattach env2's proxy
8502 env2 = Context::New(env1->GetIsolate(), 9508 env2 = Context::New(env1->GetIsolate(), 0, v8::Local<v8::ObjectTemplate>(),
8503 0,
8504 v8::Handle<v8::ObjectTemplate>(),
8505 env2_global); 9509 env2_global);
8506 env2->SetSecurityToken(foo); 9510 env2->SetSecurityToken(foo);
8507 { 9511 {
8508 v8::Context::Scope scope(env2); 9512 v8::Context::Scope scope(env2);
8509 env2->Global()->Set(v8_str("x"), v8_str("env3_x")); 9513 CHECK(env2->Global()->Set(env2, v8_str("x"), v8_str("env3_x")).FromJust());
8510 env2->Global()->Set(v8_str("env1"), env1->Global()); 9514 CHECK(env2->Global()->Set(env2, v8_str("env1"), env1->Global()).FromJust());
8511 result = CompileRun( 9515 result = CompileRun(
8512 "results = [];" 9516 "results = [];"
8513 "for (var i = 0; i < 4; i++ ) {" 9517 "for (var i = 0; i < 4; i++ ) {"
8514 " results.push(env1.bound_x());" 9518 " results.push(env1.bound_x());"
8515 " results.push(env1.get_x());" 9519 " results.push(env1.get_x());"
8516 " results.push(env1.get_x_w());" 9520 " results.push(env1.get_x_w());"
8517 " results.push(env1.this_x());" 9521 " results.push(env1.this_x());"
8518 "}" 9522 "}"
8519 "results"); 9523 "results");
8520 Local<v8::Array> results = Local<v8::Array>::Cast(result); 9524 Local<v8::Array> results = Local<v8::Array>::Cast(result);
8521 CHECK_EQ(16u, results->Length()); 9525 CHECK_EQ(16u, results->Length());
8522 for (int i = 0; i < 16; i += 4) { 9526 for (int i = 0; i < 16; i += 4) {
8523 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); 9527 CHECK(v8_str("env2_x")
8524 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); 9528 ->Equals(env2, results->Get(env2, i + 0).ToLocalChecked())
8525 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); 9529 .FromJust());
8526 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); 9530 CHECK(v8_str("env1_x")
9531 ->Equals(env2, results->Get(env2, i + 1).ToLocalChecked())
9532 .FromJust());
9533 CHECK(v8_str("env3_x")
9534 ->Equals(env2, results->Get(env2, i + 2).ToLocalChecked())
9535 .FromJust());
9536 CHECK(v8_str("env2_x")
9537 ->Equals(env2, results->Get(env2, i + 3).ToLocalChecked())
9538 .FromJust());
8527 } 9539 }
8528 } 9540 }
8529 9541
8530 result = CompileRun( 9542 result = CompileRun(
8531 "results = [];" 9543 "results = [];"
8532 "for (var i = 0; i < 4; i++ ) {" 9544 "for (var i = 0; i < 4; i++ ) {"
8533 " results.push(bound_x());" 9545 " results.push(bound_x());"
8534 " results.push(get_x());" 9546 " results.push(get_x());"
8535 " results.push(get_x_w());" 9547 " results.push(get_x_w());"
8536 " results.push(this_x());" 9548 " results.push(this_x());"
8537 "}" 9549 "}"
8538 "results"); 9550 "results");
8539 Local<v8::Array> results = Local<v8::Array>::Cast(result); 9551 Local<v8::Array> results = Local<v8::Array>::Cast(result);
8540 CHECK_EQ(16u, results->Length()); 9552 CHECK_EQ(16u, results->Length());
8541 for (int i = 0; i < 16; i += 4) { 9553 for (int i = 0; i < 16; i += 4) {
8542 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); 9554 CHECK(v8_str("env2_x")
8543 CHECK(v8_str("env3_x")->Equals(results->Get(i + 1))); 9555 ->Equals(env1.local(),
8544 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); 9556 results->Get(env1.local(), i + 0).ToLocalChecked())
8545 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); 9557 .FromJust());
9558 CHECK(v8_str("env3_x")
9559 ->Equals(env1.local(),
9560 results->Get(env1.local(), i + 1).ToLocalChecked())
9561 .FromJust());
9562 CHECK(v8_str("env3_x")
9563 ->Equals(env1.local(),
9564 results->Get(env1.local(), i + 2).ToLocalChecked())
9565 .FromJust());
9566 CHECK(v8_str("env2_x")
9567 ->Equals(env1.local(),
9568 results->Get(env1.local(), i + 3).ToLocalChecked())
9569 .FromJust());
8546 } 9570 }
8547 9571
8548 result = CompileRun( 9572 result = CompileRun(
8549 "results = [];" 9573 "results = [];"
8550 "for (var i = 0; i < 4; i++ ) {" 9574 "for (var i = 0; i < 4; i++ ) {"
8551 " results.push(this.bound_x());" 9575 " results.push(this.bound_x());"
8552 " results.push(this.get_x());" 9576 " results.push(this.get_x());"
8553 " results.push(this.get_x_w());" 9577 " results.push(this.get_x_w());"
8554 " results.push(this.this_x());" 9578 " results.push(this.this_x());"
8555 "}" 9579 "}"
8556 "results"); 9580 "results");
8557 results = Local<v8::Array>::Cast(result); 9581 results = Local<v8::Array>::Cast(result);
8558 CHECK_EQ(16u, results->Length()); 9582 CHECK_EQ(16u, results->Length());
8559 for (int i = 0; i < 16; i += 4) { 9583 for (int i = 0; i < 16; i += 4) {
8560 CHECK(v8_str("env2_x")->Equals(results->Get(i + 0))); 9584 CHECK(v8_str("env2_x")
8561 CHECK(v8_str("env1_x")->Equals(results->Get(i + 1))); 9585 ->Equals(env1.local(),
8562 CHECK(v8_str("env3_x")->Equals(results->Get(i + 2))); 9586 results->Get(env1.local(), i + 0).ToLocalChecked())
8563 CHECK(v8_str("env2_x")->Equals(results->Get(i + 3))); 9587 .FromJust());
9588 CHECK(v8_str("env1_x")
9589 ->Equals(env1.local(),
9590 results->Get(env1.local(), i + 1).ToLocalChecked())
9591 .FromJust());
9592 CHECK(v8_str("env3_x")
9593 ->Equals(env1.local(),
9594 results->Get(env1.local(), i + 2).ToLocalChecked())
9595 .FromJust());
9596 CHECK(v8_str("env2_x")
9597 ->Equals(env1.local(),
9598 results->Get(env1.local(), i + 3).ToLocalChecked())
9599 .FromJust());
8564 } 9600 }
8565 } 9601 }
8566 9602
8567 9603
8568 static bool allowed_access = false; 9604 static bool allowed_access = false;
8569 static bool AccessBlocker(Local<v8::Context> accessing_context, 9605 static bool AccessBlocker(Local<v8::Context> accessing_context,
8570 Local<v8::Object> accessed_object) { 9606 Local<v8::Object> accessed_object) {
8571 return CcTest::isolate()->GetCurrentContext()->Global()->Equals( 9607 v8::Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
8572 accessed_object) || 9608 return context->Global()->Equals(context, accessed_object).FromJust() ||
8573 allowed_access; 9609 allowed_access;
8574 } 9610 }
8575 9611
8576 9612
8577 static int g_echo_value = -1; 9613 static int g_echo_value = -1;
8578 9614
8579 9615
8580 static void EchoGetter( 9616 static void EchoGetter(
8581 Local<String> name, 9617 Local<String> name,
8582 const v8::PropertyCallbackInfo<v8::Value>& info) { 9618 const v8::PropertyCallbackInfo<v8::Value>& info) {
8583 info.GetReturnValue().Set(v8_num(g_echo_value)); 9619 info.GetReturnValue().Set(v8_num(g_echo_value));
8584 } 9620 }
8585 9621
8586 9622
8587 static void EchoSetter(Local<String> name, 9623 static void EchoSetter(Local<String> name, Local<Value> value,
8588 Local<Value> value, 9624 const v8::PropertyCallbackInfo<void>& args) {
8589 const v8::PropertyCallbackInfo<void>&) {
8590 if (value->IsNumber()) 9625 if (value->IsNumber())
8591 g_echo_value = value->Int32Value(); 9626 g_echo_value =
9627 value->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust();
8592 } 9628 }
8593 9629
8594 9630
8595 static void UnreachableGetter( 9631 static void UnreachableGetter(
8596 Local<String> name, 9632 Local<String> name,
8597 const v8::PropertyCallbackInfo<v8::Value>& info) { 9633 const v8::PropertyCallbackInfo<v8::Value>& info) {
8598 CHECK(false); // This function should not be called.. 9634 CHECK(false); // This function should not be called..
8599 } 9635 }
8600 9636
8601 9637
8602 static void UnreachableSetter(Local<String>, 9638 static void UnreachableSetter(Local<String>,
8603 Local<Value>, 9639 Local<Value>,
8604 const v8::PropertyCallbackInfo<void>&) { 9640 const v8::PropertyCallbackInfo<void>&) {
8605 CHECK(false); // This function should nto be called. 9641 CHECK(false); // This function should nto be called.
8606 } 9642 }
8607 9643
8608 9644
8609 static void UnreachableFunction( 9645 static void UnreachableFunction(
8610 const v8::FunctionCallbackInfo<v8::Value>& info) { 9646 const v8::FunctionCallbackInfo<v8::Value>& info) {
8611 CHECK(false); // This function should not be called.. 9647 CHECK(false); // This function should not be called..
8612 } 9648 }
8613 9649
8614 9650
8615 TEST(AccessControl) { 9651 TEST(AccessControl) {
8616 v8::Isolate* isolate = CcTest::isolate(); 9652 v8::Isolate* isolate = CcTest::isolate();
8617 v8::HandleScope handle_scope(isolate); 9653 v8::HandleScope handle_scope(isolate);
8618 v8::Handle<v8::ObjectTemplate> global_template = 9654 v8::Local<v8::ObjectTemplate> global_template =
8619 v8::ObjectTemplate::New(isolate); 9655 v8::ObjectTemplate::New(isolate);
8620 9656
8621 global_template->SetAccessCheckCallback(AccessBlocker); 9657 global_template->SetAccessCheckCallback(AccessBlocker);
8622 9658
8623 // Add an accessor accessible by cross-domain JS code. 9659 // Add an accessor accessible by cross-domain JS code.
8624 global_template->SetAccessor( 9660 global_template->SetAccessor(
8625 v8_str("accessible_prop"), 9661 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)); 9662 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8629 9663
8630 9664
8631 // Add an accessor that is not accessible by cross-domain JS code. 9665 // Add an accessor that is not accessible by cross-domain JS code.
8632 global_template->SetAccessor(v8_str("blocked_prop"), 9666 global_template->SetAccessor(v8_str("blocked_prop"), UnreachableGetter,
8633 UnreachableGetter, UnreachableSetter, 9667 UnreachableSetter, v8::Local<Value>(),
8634 v8::Handle<Value>(),
8635 v8::DEFAULT); 9668 v8::DEFAULT);
8636 9669
8637 global_template->SetAccessorProperty( 9670 global_template->SetAccessorProperty(
8638 v8_str("blocked_js_prop"), 9671 v8_str("blocked_js_prop"),
8639 v8::FunctionTemplate::New(isolate, UnreachableFunction), 9672 v8::FunctionTemplate::New(isolate, UnreachableFunction),
8640 v8::FunctionTemplate::New(isolate, UnreachableFunction), 9673 v8::FunctionTemplate::New(isolate, UnreachableFunction),
8641 v8::None, 9674 v8::None,
8642 v8::DEFAULT); 9675 v8::DEFAULT);
8643 9676
8644 // Create an environment 9677 // Create an environment
8645 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); 9678 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
8646 context0->Enter(); 9679 context0->Enter();
8647 9680
8648 v8::Handle<v8::Object> global0 = context0->Global(); 9681 v8::Local<v8::Object> global0 = context0->Global();
8649 9682
8650 // Define a property with JS getter and setter. 9683 // Define a property with JS getter and setter.
8651 CompileRun( 9684 CompileRun(
8652 "function getter() { return 'getter'; };\n" 9685 "function getter() { return 'getter'; };\n"
8653 "function setter() { return 'setter'; }\n" 9686 "function setter() { return 'setter'; }\n"
8654 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); 9687 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})");
8655 9688
8656 Local<Value> getter = global0->Get(v8_str("getter")); 9689 Local<Value> getter =
8657 Local<Value> setter = global0->Get(v8_str("setter")); 9690 global0->Get(context0, v8_str("getter")).ToLocalChecked();
9691 Local<Value> setter =
9692 global0->Get(context0, v8_str("setter")).ToLocalChecked();
8658 9693
8659 // And define normal element. 9694 // And define normal element.
8660 global0->Set(239, v8_str("239")); 9695 CHECK(global0->Set(context0, 239, v8_str("239")).FromJust());
8661 9696
8662 // Define an element with JS getter and setter. 9697 // Define an element with JS getter and setter.
8663 CompileRun( 9698 CompileRun(
8664 "function el_getter() { return 'el_getter'; };\n" 9699 "function el_getter() { return 'el_getter'; };\n"
8665 "function el_setter() { return 'el_setter'; };\n" 9700 "function el_setter() { return 'el_setter'; };\n"
8666 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); 9701 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});");
8667 9702
8668 Local<Value> el_getter = global0->Get(v8_str("el_getter")); 9703 Local<Value> el_getter =
8669 Local<Value> el_setter = global0->Get(v8_str("el_setter")); 9704 global0->Get(context0, v8_str("el_getter")).ToLocalChecked();
9705 Local<Value> el_setter =
9706 global0->Get(context0, v8_str("el_setter")).ToLocalChecked();
8670 9707
8671 v8::HandleScope scope1(isolate); 9708 v8::HandleScope scope1(isolate);
8672 9709
8673 v8::Local<Context> context1 = Context::New(isolate); 9710 v8::Local<Context> context1 = Context::New(isolate);
8674 context1->Enter(); 9711 context1->Enter();
8675 9712
8676 v8::Handle<v8::Object> global1 = context1->Global(); 9713 v8::Local<v8::Object> global1 = context1->Global();
8677 global1->Set(v8_str("other"), global0); 9714 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust());
8678 9715
8679 // Access blocked property. 9716 // Access blocked property.
8680 CompileRun("other.blocked_prop = 1"); 9717 CompileRun("other.blocked_prop = 1");
8681 9718
8682 CHECK(CompileRun("other.blocked_prop").IsEmpty()); 9719 CHECK(CompileRun("other.blocked_prop").IsEmpty());
8683 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") 9720 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')")
8684 .IsEmpty()); 9721 .IsEmpty());
8685 CHECK( 9722 CHECK(
8686 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty()); 9723 CompileRun("propertyIsEnumerable.call(other, 'blocked_prop')").IsEmpty());
8687 9724
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
8724 9761
8725 allowed_access = true; 9762 allowed_access = true;
8726 9763
8727 ExpectString("other[42]", "el_getter"); 9764 ExpectString("other[42]", "el_getter");
8728 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter); 9765 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').get", el_getter);
8729 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter); 9766 ExpectObject("Object.getOwnPropertyDescriptor(other, '42').set", el_setter);
8730 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value"); 9767 ExpectUndefined("Object.getOwnPropertyDescriptor(other, '42').value");
8731 9768
8732 allowed_access = false; 9769 allowed_access = false;
8733 9770
8734 v8::Handle<Value> value; 9771 v8::Local<Value> value;
8735 9772
8736 // Access accessible property 9773 // Access accessible property
8737 value = CompileRun("other.accessible_prop = 3"); 9774 value = CompileRun("other.accessible_prop = 3");
8738 CHECK(value->IsNumber()); 9775 CHECK(value->IsNumber());
8739 CHECK_EQ(3, value->Int32Value()); 9776 CHECK_EQ(3, value->Int32Value(context1).FromJust());
8740 CHECK_EQ(3, g_echo_value); 9777 CHECK_EQ(3, g_echo_value);
8741 9778
8742 value = CompileRun("other.accessible_prop"); 9779 value = CompileRun("other.accessible_prop");
8743 CHECK(value->IsNumber()); 9780 CHECK(value->IsNumber());
8744 CHECK_EQ(3, value->Int32Value()); 9781 CHECK_EQ(3, value->Int32Value(context1).FromJust());
8745 9782
8746 value = CompileRun( 9783 value = CompileRun(
8747 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value"); 9784 "Object.getOwnPropertyDescriptor(other, 'accessible_prop').value");
8748 CHECK(value->IsNumber()); 9785 CHECK(value->IsNumber());
8749 CHECK_EQ(3, value->Int32Value()); 9786 CHECK_EQ(3, value->Int32Value(context1).FromJust());
8750 9787
8751 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')"); 9788 value = CompileRun("propertyIsEnumerable.call(other, 'accessible_prop')");
8752 CHECK(value->IsTrue()); 9789 CHECK(value->IsTrue());
8753 9790
8754 // Enumeration doesn't enumerate accessors from inaccessible objects in 9791 // Enumeration doesn't enumerate accessors from inaccessible objects in
8755 // the prototype chain even if the accessors are in themselves accessible. 9792 // the prototype chain even if the accessors are in themselves accessible.
8756 value = CompileRun( 9793 value = CompileRun(
8757 "(function() {" 9794 "(function() {"
8758 " var obj = { '__proto__': other };" 9795 " var obj = { '__proto__': other };"
8759 " try {" 9796 " try {"
8760 " for (var p in obj) {" 9797 " for (var p in obj) {"
8761 " if (p == 'accessible_prop' ||" 9798 " if (p == 'accessible_prop' ||"
8762 " p == 'blocked_js_prop' ||" 9799 " p == 'blocked_js_prop' ||"
8763 " p == 'blocked_js_prop') {" 9800 " p == 'blocked_js_prop') {"
8764 " return false;" 9801 " return false;"
8765 " }" 9802 " }"
8766 " }" 9803 " }"
8767 " return false;" 9804 " return false;"
8768 " } catch (e) {" 9805 " } catch (e) {"
8769 " return true;" 9806 " return true;"
8770 " }" 9807 " }"
8771 "})()"); 9808 "})()");
8772 CHECK(value->IsTrue()); 9809 CHECK(value->IsTrue());
8773 9810
8774 // Test that preventExtensions fails on a non-accessible object even if that 9811 // Test that preventExtensions fails on a non-accessible object even if that
8775 // object is already non-extensible. 9812 // object is already non-extensible.
8776 global1->Set(v8_str("checked_object"), global_template->NewInstance()); 9813 CHECK(global1->Set(context1, v8_str("checked_object"),
9814 global_template->NewInstance(context1).ToLocalChecked())
9815 .FromJust());
8777 allowed_access = true; 9816 allowed_access = true;
8778 CompileRun("Object.preventExtensions(checked_object)"); 9817 CompileRun("Object.preventExtensions(checked_object)");
8779 ExpectFalse("Object.isExtensible(checked_object)"); 9818 ExpectFalse("Object.isExtensible(checked_object)");
8780 allowed_access = false; 9819 allowed_access = false;
8781 CHECK(CompileRun("Object.preventExtensions(checked_object)").IsEmpty()); 9820 CHECK(CompileRun("Object.preventExtensions(checked_object)").IsEmpty());
8782 9821
8783 context1->Exit(); 9822 context1->Exit();
8784 context0->Exit(); 9823 context0->Exit();
8785 } 9824 }
8786 9825
8787 9826
8788 TEST(AccessControlES5) { 9827 TEST(AccessControlES5) {
8789 v8::Isolate* isolate = CcTest::isolate(); 9828 v8::Isolate* isolate = CcTest::isolate();
8790 v8::HandleScope handle_scope(isolate); 9829 v8::HandleScope handle_scope(isolate);
8791 v8::Handle<v8::ObjectTemplate> global_template = 9830 v8::Local<v8::ObjectTemplate> global_template =
8792 v8::ObjectTemplate::New(isolate); 9831 v8::ObjectTemplate::New(isolate);
8793 9832
8794 global_template->SetAccessCheckCallback(AccessBlocker); 9833 global_template->SetAccessCheckCallback(AccessBlocker);
8795 9834
8796 // Add accessible accessor. 9835 // Add accessible accessor.
8797 global_template->SetAccessor( 9836 global_template->SetAccessor(
8798 v8_str("accessible_prop"), 9837 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)); 9838 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8802 9839
8803 9840
8804 // Add an accessor that is not accessible by cross-domain JS code. 9841 // Add an accessor that is not accessible by cross-domain JS code.
8805 global_template->SetAccessor(v8_str("blocked_prop"), 9842 global_template->SetAccessor(v8_str("blocked_prop"), UnreachableGetter,
8806 UnreachableGetter, UnreachableSetter, 9843 UnreachableSetter, v8::Local<Value>(),
8807 v8::Handle<Value>(),
8808 v8::DEFAULT); 9844 v8::DEFAULT);
8809 9845
8810 // Create an environment 9846 // Create an environment
8811 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); 9847 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
8812 context0->Enter(); 9848 context0->Enter();
8813 9849
8814 v8::Handle<v8::Object> global0 = context0->Global(); 9850 v8::Local<v8::Object> global0 = context0->Global();
8815 9851
8816 v8::Local<Context> context1 = Context::New(isolate); 9852 v8::Local<Context> context1 = Context::New(isolate);
8817 context1->Enter(); 9853 context1->Enter();
8818 v8::Handle<v8::Object> global1 = context1->Global(); 9854 v8::Local<v8::Object> global1 = context1->Global();
8819 global1->Set(v8_str("other"), global0); 9855 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust());
8820 9856
8821 // Regression test for issue 1154. 9857 // Regression test for issue 1154.
8822 CHECK(CompileRun("Object.keys(other).length == 0")->BooleanValue()); 9858 CHECK(CompileRun("Object.keys(other).length == 0")
9859 ->BooleanValue(context1)
9860 .FromJust());
8823 CHECK(CompileRun("other.blocked_prop").IsEmpty()); 9861 CHECK(CompileRun("other.blocked_prop").IsEmpty());
8824 9862
8825 // Regression test for issue 1027. 9863 // Regression test for issue 1027.
8826 CompileRun("Object.defineProperty(\n" 9864 CompileRun("Object.defineProperty(\n"
8827 " other, 'blocked_prop', {configurable: false})"); 9865 " other, 'blocked_prop', {configurable: false})");
8828 CHECK(CompileRun("other.blocked_prop").IsEmpty()); 9866 CHECK(CompileRun("other.blocked_prop").IsEmpty());
8829 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')") 9867 CHECK(CompileRun("Object.getOwnPropertyDescriptor(other, 'blocked_prop')")
8830 .IsEmpty()); 9868 .IsEmpty());
8831 9869
8832 // Regression test for issue 1171. 9870 // Regression test for issue 1171.
(...skipping 26 matching lines...) Expand all
8859 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context, 9897 static bool AccessAlwaysBlocked(Local<v8::Context> accessing_context,
8860 Local<v8::Object> global) { 9898 Local<v8::Object> global) {
8861 i::PrintF("Access blocked.\n"); 9899 i::PrintF("Access blocked.\n");
8862 return false; 9900 return false;
8863 } 9901 }
8864 9902
8865 9903
8866 THREADED_TEST(AccessControlGetOwnPropertyNames) { 9904 THREADED_TEST(AccessControlGetOwnPropertyNames) {
8867 v8::Isolate* isolate = CcTest::isolate(); 9905 v8::Isolate* isolate = CcTest::isolate();
8868 v8::HandleScope handle_scope(isolate); 9906 v8::HandleScope handle_scope(isolate);
8869 v8::Handle<v8::ObjectTemplate> obj_template = 9907 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
8870 v8::ObjectTemplate::New(isolate);
8871 9908
8872 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 9909 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
8873 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); 9910 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
8874 9911
8875 // Add an accessor accessible by cross-domain JS code. 9912 // Add an accessor accessible by cross-domain JS code.
8876 obj_template->SetAccessor( 9913 obj_template->SetAccessor(
8877 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Handle<Value>(), 9914 v8_str("accessible_prop"), EchoGetter, EchoSetter, v8::Local<Value>(),
8878 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); 9915 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE));
8879 9916
8880 // Create an environment 9917 // Create an environment
8881 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 9918 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
8882 context0->Enter(); 9919 context0->Enter();
8883 9920
8884 v8::Handle<v8::Object> global0 = context0->Global(); 9921 v8::Local<v8::Object> global0 = context0->Global();
8885 9922
8886 v8::HandleScope scope1(CcTest::isolate()); 9923 v8::HandleScope scope1(CcTest::isolate());
8887 9924
8888 v8::Local<Context> context1 = Context::New(isolate); 9925 v8::Local<Context> context1 = Context::New(isolate);
8889 context1->Enter(); 9926 context1->Enter();
8890 9927
8891 v8::Handle<v8::Object> global1 = context1->Global(); 9928 v8::Local<v8::Object> global1 = context1->Global();
8892 global1->Set(v8_str("other"), global0); 9929 CHECK(global1->Set(context1, v8_str("other"), global0).FromJust());
8893 global1->Set(v8_str("object"), obj_template->NewInstance()); 9930 CHECK(global1->Set(context1, v8_str("object"),
9931 obj_template->NewInstance(context1).ToLocalChecked())
9932 .FromJust());
8894 9933
8895 v8::Handle<Value> value; 9934 v8::Local<Value> value;
8896 9935
8897 // Attempt to get the property names of the other global object and 9936 // Attempt to get the property names of the other global object and
8898 // of an object that requires access checks. Accessing the other 9937 // of an object that requires access checks. Accessing the other
8899 // global object should be blocked by access checks on the global 9938 // global object should be blocked by access checks on the global
8900 // proxy object. Accessing the object that requires access checks 9939 // proxy object. Accessing the object that requires access checks
8901 // is blocked by the access checks on the object itself. 9940 // is blocked by the access checks on the object itself.
8902 value = CompileRun( 9941 value = CompileRun(
8903 "var names = Object.getOwnPropertyNames(other);" 9942 "var names = Object.getOwnPropertyNames(other);"
8904 "names.length == 1 && names[0] == 'accessible_prop';"); 9943 "names.length == 1 && names[0] == 'accessible_prop';");
8905 CHECK(value->BooleanValue()); 9944 CHECK(value->BooleanValue(context1).FromJust());
8906 9945
8907 value = CompileRun( 9946 value = CompileRun(
8908 "var names = Object.getOwnPropertyNames(object);" 9947 "var names = Object.getOwnPropertyNames(object);"
8909 "names.length == 1 && names[0] == 'accessible_prop';"); 9948 "names.length == 1 && names[0] == 'accessible_prop';");
8910 CHECK(value->BooleanValue()); 9949 CHECK(value->BooleanValue(context1).FromJust());
8911 9950
8912 context1->Exit(); 9951 context1->Exit();
8913 context0->Exit(); 9952 context0->Exit();
8914 } 9953 }
8915 9954
8916 9955
8917 TEST(Regress470113) { 9956 TEST(Regress470113) {
8918 v8::Isolate* isolate = CcTest::isolate(); 9957 v8::Isolate* isolate = CcTest::isolate();
8919 v8::HandleScope handle_scope(isolate); 9958 v8::HandleScope handle_scope(isolate);
8920 v8::Handle<v8::ObjectTemplate> obj_template = 9959 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
8921 v8::ObjectTemplate::New(isolate);
8922 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); 9960 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
8923 LocalContext env; 9961 LocalContext env;
8924 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 9962 CHECK(env->Global()
9963 ->Set(env.local(), v8_str("prohibited"),
9964 obj_template->NewInstance(env.local()).ToLocalChecked())
9965 .FromJust());
8925 9966
8926 { 9967 {
8927 v8::TryCatch try_catch(isolate); 9968 v8::TryCatch try_catch(isolate);
8928 CompileRun( 9969 CompileRun(
8929 "'use strict';\n" 9970 "'use strict';\n"
8930 "class C extends Object {\n" 9971 "class C extends Object {\n"
8931 " m() { super.powned = 'Powned!'; }\n" 9972 " m() { super.powned = 'Powned!'; }\n"
8932 "}\n" 9973 "}\n"
8933 "let c = new C();\n" 9974 "let c = new C();\n"
8934 "c.m.call(prohibited)"); 9975 "c.m.call(prohibited)");
8935 9976
8936 CHECK(try_catch.HasCaught()); 9977 CHECK(try_catch.HasCaught());
8937 } 9978 }
8938 } 9979 }
8939 9980
8940 9981
8941 static void ConstTenGetter(Local<String> name, 9982 static void ConstTenGetter(Local<String> name,
8942 const v8::PropertyCallbackInfo<v8::Value>& info) { 9983 const v8::PropertyCallbackInfo<v8::Value>& info) {
8943 info.GetReturnValue().Set(v8_num(10)); 9984 info.GetReturnValue().Set(v8_num(10));
8944 } 9985 }
8945 9986
8946 9987
8947 THREADED_TEST(CrossDomainAccessors) { 9988 THREADED_TEST(CrossDomainAccessors) {
8948 v8::Isolate* isolate = CcTest::isolate(); 9989 v8::Isolate* isolate = CcTest::isolate();
8949 v8::HandleScope handle_scope(isolate); 9990 v8::HandleScope handle_scope(isolate);
8950 9991
8951 v8::Handle<v8::FunctionTemplate> func_template = 9992 v8::Local<v8::FunctionTemplate> func_template =
8952 v8::FunctionTemplate::New(isolate); 9993 v8::FunctionTemplate::New(isolate);
8953 9994
8954 v8::Handle<v8::ObjectTemplate> global_template = 9995 v8::Local<v8::ObjectTemplate> global_template =
8955 func_template->InstanceTemplate(); 9996 func_template->InstanceTemplate();
8956 9997
8957 v8::Handle<v8::ObjectTemplate> proto_template = 9998 v8::Local<v8::ObjectTemplate> proto_template =
8958 func_template->PrototypeTemplate(); 9999 func_template->PrototypeTemplate();
8959 10000
8960 // Add an accessor to proto that's accessible by cross-domain JS code. 10001 // Add an accessor to proto that's accessible by cross-domain JS code.
8961 proto_template->SetAccessor(v8_str("accessible"), 10002 proto_template->SetAccessor(v8_str("accessible"), ConstTenGetter, 0,
8962 ConstTenGetter, 0, 10003 v8::Local<Value>(), v8::ALL_CAN_READ);
8963 v8::Handle<Value>(),
8964 v8::ALL_CAN_READ);
8965 10004
8966 // Add an accessor that is not accessible by cross-domain JS code. 10005 // Add an accessor that is not accessible by cross-domain JS code.
8967 global_template->SetAccessor(v8_str("unreachable"), 10006 global_template->SetAccessor(v8_str("unreachable"), UnreachableGetter, 0,
8968 UnreachableGetter, 0, 10007 v8::Local<Value>(), v8::DEFAULT);
8969 v8::Handle<Value>(),
8970 v8::DEFAULT);
8971 10008
8972 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); 10009 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template);
8973 context0->Enter(); 10010 context0->Enter();
8974 10011
8975 Local<v8::Object> global = context0->Global(); 10012 Local<v8::Object> global = context0->Global();
8976 // Add a normal property that shadows 'accessible' 10013 // Add a normal property that shadows 'accessible'
8977 global->Set(v8_str("accessible"), v8_num(11)); 10014 CHECK(global->Set(context0, v8_str("accessible"), v8_num(11)).FromJust());
8978 10015
8979 // Enter a new context. 10016 // Enter a new context.
8980 v8::HandleScope scope1(CcTest::isolate()); 10017 v8::HandleScope scope1(CcTest::isolate());
8981 v8::Local<Context> context1 = Context::New(isolate); 10018 v8::Local<Context> context1 = Context::New(isolate);
8982 context1->Enter(); 10019 context1->Enter();
8983 10020
8984 v8::Handle<v8::Object> global1 = context1->Global(); 10021 v8::Local<v8::Object> global1 = context1->Global();
8985 global1->Set(v8_str("other"), global); 10022 CHECK(global1->Set(context1, v8_str("other"), global).FromJust());
8986 10023
8987 // Should return 10, instead of 11 10024 // Should return 10, instead of 11
8988 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); 10025 v8::Local<Value> value =
10026 v8_compile("other.accessible")->Run(context1).ToLocalChecked();
8989 CHECK(value->IsNumber()); 10027 CHECK(value->IsNumber());
8990 CHECK_EQ(10, value->Int32Value()); 10028 CHECK_EQ(10, value->Int32Value(context1).FromJust());
8991 10029
8992 value = v8_compile("other.unreachable")->Run(); 10030 v8::MaybeLocal<v8::Value> maybe_value =
8993 CHECK(value.IsEmpty()); 10031 v8_compile("other.unreachable")->Run(context1);
10032 CHECK(maybe_value.IsEmpty());
8994 10033
8995 context1->Exit(); 10034 context1->Exit();
8996 context0->Exit(); 10035 context0->Exit();
8997 } 10036 }
8998 10037
8999 10038
9000 static int access_count = 0; 10039 static int access_count = 0;
9001 10040
9002 static bool AccessCounter(Local<v8::Context> accessing_context, 10041 static bool AccessCounter(Local<v8::Context> accessing_context,
9003 Local<v8::Object> accessed_object) { 10042 Local<v8::Object> accessed_object) {
9004 access_count++; 10043 access_count++;
9005 return true; 10044 return true;
9006 } 10045 }
9007 10046
9008 10047
9009 // This one is too easily disturbed by other tests. 10048 // This one is too easily disturbed by other tests.
9010 TEST(AccessControlIC) { 10049 TEST(AccessControlIC) {
9011 access_count = 0; 10050 access_count = 0;
9012 10051
9013 v8::Isolate* isolate = CcTest::isolate(); 10052 v8::Isolate* isolate = CcTest::isolate();
9014 v8::HandleScope handle_scope(isolate); 10053 v8::HandleScope handle_scope(isolate);
9015 10054
9016 // Create an environment. 10055 // Create an environment.
9017 v8::Local<Context> context0 = Context::New(isolate); 10056 v8::Local<Context> context0 = Context::New(isolate);
9018 context0->Enter(); 10057 context0->Enter();
9019 10058
9020 // Create an object that requires access-check functions to be 10059 // Create an object that requires access-check functions to be
9021 // called for cross-domain access. 10060 // called for cross-domain access.
9022 v8::Handle<v8::ObjectTemplate> object_template = 10061 v8::Local<v8::ObjectTemplate> object_template =
9023 v8::ObjectTemplate::New(isolate); 10062 v8::ObjectTemplate::New(isolate);
9024 object_template->SetAccessCheckCallback(AccessCounter); 10063 object_template->SetAccessCheckCallback(AccessCounter);
9025 Local<v8::Object> object = object_template->NewInstance(); 10064 Local<v8::Object> object =
10065 object_template->NewInstance(context0).ToLocalChecked();
9026 10066
9027 v8::HandleScope scope1(isolate); 10067 v8::HandleScope scope1(isolate);
9028 10068
9029 // Create another environment. 10069 // Create another environment.
9030 v8::Local<Context> context1 = Context::New(isolate); 10070 v8::Local<Context> context1 = Context::New(isolate);
9031 context1->Enter(); 10071 context1->Enter();
9032 10072
9033 // Make easy access to the object from the other environment. 10073 // Make easy access to the object from the other environment.
9034 v8::Handle<v8::Object> global1 = context1->Global(); 10074 v8::Local<v8::Object> global1 = context1->Global();
9035 global1->Set(v8_str("obj"), object); 10075 CHECK(global1->Set(context1, v8_str("obj"), object).FromJust());
9036 10076
9037 v8::Handle<Value> value; 10077 v8::Local<Value> value;
9038 10078
9039 // Check that the named access-control function is called every time. 10079 // Check that the named access-control function is called every time.
9040 CompileRun("function testProp(obj) {" 10080 CompileRun("function testProp(obj) {"
9041 " for (var i = 0; i < 10; i++) obj.prop = 1;" 10081 " for (var i = 0; i < 10; i++) obj.prop = 1;"
9042 " for (var j = 0; j < 10; j++) obj.prop;" 10082 " for (var j = 0; j < 10; j++) obj.prop;"
9043 " return obj.prop" 10083 " return obj.prop"
9044 "}"); 10084 "}");
9045 value = CompileRun("testProp(obj)"); 10085 value = CompileRun("testProp(obj)");
9046 CHECK(value->IsNumber()); 10086 CHECK(value->IsNumber());
9047 CHECK_EQ(1, value->Int32Value()); 10087 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9048 CHECK_EQ(21, access_count); 10088 CHECK_EQ(21, access_count);
9049 10089
9050 // Check that the named access-control function is called every time. 10090 // Check that the named access-control function is called every time.
9051 CompileRun("var p = 'prop';" 10091 CompileRun("var p = 'prop';"
9052 "function testKeyed(obj) {" 10092 "function testKeyed(obj) {"
9053 " for (var i = 0; i < 10; i++) obj[p] = 1;" 10093 " for (var i = 0; i < 10; i++) obj[p] = 1;"
9054 " for (var j = 0; j < 10; j++) obj[p];" 10094 " for (var j = 0; j < 10; j++) obj[p];"
9055 " return obj[p];" 10095 " return obj[p];"
9056 "}"); 10096 "}");
9057 // Use obj which requires access checks. No inline caching is used 10097 // Use obj which requires access checks. No inline caching is used
9058 // in that case. 10098 // in that case.
9059 value = CompileRun("testKeyed(obj)"); 10099 value = CompileRun("testKeyed(obj)");
9060 CHECK(value->IsNumber()); 10100 CHECK(value->IsNumber());
9061 CHECK_EQ(1, value->Int32Value()); 10101 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9062 CHECK_EQ(42, access_count); 10102 CHECK_EQ(42, access_count);
9063 // Force the inline caches into generic state and try again. 10103 // Force the inline caches into generic state and try again.
9064 CompileRun("testKeyed({ a: 0 })"); 10104 CompileRun("testKeyed({ a: 0 })");
9065 CompileRun("testKeyed({ b: 0 })"); 10105 CompileRun("testKeyed({ b: 0 })");
9066 value = CompileRun("testKeyed(obj)"); 10106 value = CompileRun("testKeyed(obj)");
9067 CHECK(value->IsNumber()); 10107 CHECK(value->IsNumber());
9068 CHECK_EQ(1, value->Int32Value()); 10108 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9069 CHECK_EQ(63, access_count); 10109 CHECK_EQ(63, access_count);
9070 10110
9071 // Check that the indexed access-control function is called every time. 10111 // Check that the indexed access-control function is called every time.
9072 access_count = 0; 10112 access_count = 0;
9073 10113
9074 CompileRun("function testIndexed(obj) {" 10114 CompileRun("function testIndexed(obj) {"
9075 " for (var i = 0; i < 10; i++) obj[0] = 1;" 10115 " for (var i = 0; i < 10; i++) obj[0] = 1;"
9076 " for (var j = 0; j < 10; j++) obj[0];" 10116 " for (var j = 0; j < 10; j++) obj[0];"
9077 " return obj[0]" 10117 " return obj[0]"
9078 "}"); 10118 "}");
9079 value = CompileRun("testIndexed(obj)"); 10119 value = CompileRun("testIndexed(obj)");
9080 CHECK(value->IsNumber()); 10120 CHECK(value->IsNumber());
9081 CHECK_EQ(1, value->Int32Value()); 10121 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9082 CHECK_EQ(21, access_count); 10122 CHECK_EQ(21, access_count);
9083 // Force the inline caches into generic state. 10123 // Force the inline caches into generic state.
9084 CompileRun("testIndexed(new Array(1))"); 10124 CompileRun("testIndexed(new Array(1))");
9085 // Test that the indexed access check is called. 10125 // Test that the indexed access check is called.
9086 value = CompileRun("testIndexed(obj)"); 10126 value = CompileRun("testIndexed(obj)");
9087 CHECK(value->IsNumber()); 10127 CHECK(value->IsNumber());
9088 CHECK_EQ(1, value->Int32Value()); 10128 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9089 CHECK_EQ(42, access_count); 10129 CHECK_EQ(42, access_count);
9090 10130
9091 access_count = 0; 10131 access_count = 0;
9092 // Check that the named access check is called when invoking 10132 // Check that the named access check is called when invoking
9093 // functions on an object that requires access checks. 10133 // functions on an object that requires access checks.
9094 CompileRun("obj.f = function() {}"); 10134 CompileRun("obj.f = function() {}");
9095 CompileRun("function testCallNormal(obj) {" 10135 CompileRun("function testCallNormal(obj) {"
9096 " for (var i = 0; i < 10; i++) obj.f();" 10136 " for (var i = 0; i < 10; i++) obj.f();"
9097 "}"); 10137 "}");
9098 CompileRun("testCallNormal(obj)"); 10138 CompileRun("testCallNormal(obj)");
9099 printf("%i\n", access_count); 10139 printf("%i\n", access_count);
9100 CHECK_EQ(11, access_count); 10140 CHECK_EQ(11, access_count);
9101 10141
9102 // Force obj into slow case. 10142 // Force obj into slow case.
9103 value = CompileRun("delete obj.prop"); 10143 value = CompileRun("delete obj.prop");
9104 CHECK(value->BooleanValue()); 10144 CHECK(value->BooleanValue(context1).FromJust());
9105 // Force inline caches into dictionary probing mode. 10145 // Force inline caches into dictionary probing mode.
9106 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);"); 10146 CompileRun("var o = { x: 0 }; delete o.x; testProp(o);");
9107 // Test that the named access check is called. 10147 // Test that the named access check is called.
9108 value = CompileRun("testProp(obj);"); 10148 value = CompileRun("testProp(obj);");
9109 CHECK(value->IsNumber()); 10149 CHECK(value->IsNumber());
9110 CHECK_EQ(1, value->Int32Value()); 10150 CHECK_EQ(1, value->Int32Value(context1).FromJust());
9111 CHECK_EQ(33, access_count); 10151 CHECK_EQ(33, access_count);
9112 10152
9113 // Force the call inline cache into dictionary probing mode. 10153 // Force the call inline cache into dictionary probing mode.
9114 CompileRun("o.f = function() {}; testCallNormal(o)"); 10154 CompileRun("o.f = function() {}; testCallNormal(o)");
9115 // Test that the named access check is still called for each 10155 // Test that the named access check is still called for each
9116 // invocation of the function. 10156 // invocation of the function.
9117 value = CompileRun("testCallNormal(obj)"); 10157 value = CompileRun("testCallNormal(obj)");
9118 CHECK_EQ(43, access_count); 10158 CHECK_EQ(43, access_count);
9119 10159
9120 context1->Exit(); 10160 context1->Exit();
(...skipping 16 matching lines...) Expand all
9137 v8::Isolate* isolate = context->GetIsolate(); 10177 v8::Isolate* isolate = context->GetIsolate();
9138 v8::HandleScope handle_scope(isolate); 10178 v8::HandleScope handle_scope(isolate);
9139 10179
9140 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 10180 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
9141 Local<ObjectTemplate> instance = t->InstanceTemplate(); 10181 Local<ObjectTemplate> instance = t->InstanceTemplate();
9142 10182
9143 instance->Set(v8_str("x"), v8_num(42)); 10183 instance->Set(v8_str("x"), v8_num(42));
9144 instance->Set(v8_str("f"), 10184 instance->Set(v8_str("f"),
9145 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); 10185 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback));
9146 10186
9147 Local<Value> o = t->GetFunction()->NewInstance(); 10187 Local<Value> o = t->GetFunction(context.local())
10188 .ToLocalChecked()
10189 ->NewInstance(context.local())
10190 .ToLocalChecked();
9148 10191
9149 context->Global()->Set(v8_str("i"), o); 10192 CHECK(context->Global()->Set(context.local(), v8_str("i"), o).FromJust());
9150 Local<Value> value = CompileRun("i.x"); 10193 Local<Value> value = CompileRun("i.x");
9151 CHECK_EQ(42, value->Int32Value()); 10194 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
9152 10195
9153 value = CompileRun("i.f()"); 10196 value = CompileRun("i.f()");
9154 CHECK_EQ(12, value->Int32Value()); 10197 CHECK_EQ(12, value->Int32Value(context.local()).FromJust());
9155 } 10198 }
9156 10199
9157 10200
9158 static void GlobalObjectInstancePropertiesGet( 10201 static void GlobalObjectInstancePropertiesGet(
9159 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>&) { 10202 Local<Name> key, const v8::PropertyCallbackInfo<v8::Value>&) {
9160 ApiTestFuzzer::Fuzz(); 10203 ApiTestFuzzer::Fuzz();
9161 } 10204 }
9162 10205
9163 10206
9164 THREADED_TEST(GlobalObjectInstanceProperties) { 10207 THREADED_TEST(GlobalObjectInstanceProperties) {
(...skipping 27 matching lines...) Expand all
9192 "try { wrapper(true); } catch (e) { thrown = 1; };" 10235 "try { wrapper(true); } catch (e) { thrown = 1; };"
9193 "thrown"; 10236 "thrown";
9194 10237
9195 { 10238 {
9196 LocalContext env(NULL, instance_template); 10239 LocalContext env(NULL, instance_template);
9197 // Hold on to the global object so it can be used again in another 10240 // Hold on to the global object so it can be used again in another
9198 // environment initialization. 10241 // environment initialization.
9199 global_object = env->Global(); 10242 global_object = env->Global();
9200 10243
9201 Local<Value> value = CompileRun("x"); 10244 Local<Value> value = CompileRun("x");
9202 CHECK_EQ(42, value->Int32Value()); 10245 CHECK_EQ(42, value->Int32Value(env.local()).FromJust());
9203 value = CompileRun("f()"); 10246 value = CompileRun("f()");
9204 CHECK_EQ(12, value->Int32Value()); 10247 CHECK_EQ(12, value->Int32Value(env.local()).FromJust());
9205 value = CompileRun(script); 10248 value = CompileRun(script);
9206 CHECK_EQ(1, value->Int32Value()); 10249 CHECK_EQ(1, value->Int32Value(env.local()).FromJust());
9207 } 10250 }
9208 10251
9209 { 10252 {
9210 // Create new environment reusing the global object. 10253 // Create new environment reusing the global object.
9211 LocalContext env(NULL, instance_template, global_object); 10254 LocalContext env(NULL, instance_template, global_object);
9212 Local<Value> value = CompileRun("x"); 10255 Local<Value> value = CompileRun("x");
9213 CHECK_EQ(42, value->Int32Value()); 10256 CHECK_EQ(42, value->Int32Value(env.local()).FromJust());
9214 value = CompileRun("f()"); 10257 value = CompileRun("f()");
9215 CHECK_EQ(12, value->Int32Value()); 10258 CHECK_EQ(12, value->Int32Value(env.local()).FromJust());
9216 value = CompileRun(script); 10259 value = CompileRun(script);
9217 CHECK_EQ(1, value->Int32Value()); 10260 CHECK_EQ(1, value->Int32Value(env.local()).FromJust());
9218 } 10261 }
9219 } 10262 }
9220 10263
9221 10264
9222 THREADED_TEST(CallKnownGlobalReceiver) { 10265 THREADED_TEST(CallKnownGlobalReceiver) {
9223 v8::Isolate* isolate = CcTest::isolate(); 10266 v8::Isolate* isolate = CcTest::isolate();
9224 v8::HandleScope handle_scope(isolate); 10267 v8::HandleScope handle_scope(isolate);
9225 10268
9226 Local<Value> global_object; 10269 Local<Value> global_object;
9227 10270
(...skipping 19 matching lines...) Expand all
9247 LocalContext env(NULL, instance_template); 10290 LocalContext env(NULL, instance_template);
9248 // Hold on to the global object so it can be used again in another 10291 // Hold on to the global object so it can be used again in another
9249 // environment initialization. 10292 // environment initialization.
9250 global_object = env->Global(); 10293 global_object = env->Global();
9251 foo = CompileRun(script); 10294 foo = CompileRun(script);
9252 } 10295 }
9253 10296
9254 { 10297 {
9255 // Create new environment reusing the global object. 10298 // Create new environment reusing the global object.
9256 LocalContext env(NULL, instance_template, global_object); 10299 LocalContext env(NULL, instance_template, global_object);
9257 env->Global()->Set(v8_str("foo"), foo); 10300 CHECK(env->Global()->Set(env.local(), v8_str("foo"), foo).FromJust());
9258 CompileRun("foo()"); 10301 CompileRun("foo()");
9259 } 10302 }
9260 } 10303 }
9261 10304
9262 10305
9263 static void ShadowFunctionCallback( 10306 static void ShadowFunctionCallback(
9264 const v8::FunctionCallbackInfo<v8::Value>& args) { 10307 const v8::FunctionCallbackInfo<v8::Value>& args) {
9265 ApiTestFuzzer::Fuzz(); 10308 ApiTestFuzzer::Fuzz();
9266 args.GetReturnValue().Set(v8_num(42)); 10309 args.GetReturnValue().Set(v8_num(42));
9267 } 10310 }
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
9314 Local<ObjectTemplate> instance = t->InstanceTemplate(); 10357 Local<ObjectTemplate> instance = t->InstanceTemplate();
9315 10358
9316 proto->Set(v8_str("f"), 10359 proto->Set(v8_str("f"),
9317 v8::FunctionTemplate::New(isolate, 10360 v8::FunctionTemplate::New(isolate,
9318 ShadowFunctionCallback, 10361 ShadowFunctionCallback,
9319 Local<Value>())); 10362 Local<Value>()));
9320 proto->Set(v8_str("x"), v8_num(12)); 10363 proto->Set(v8_str("x"), v8_num(12));
9321 10364
9322 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); 10365 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter);
9323 10366
9324 Local<Value> o = t->GetFunction()->NewInstance(); 10367 Local<Value> o = t->GetFunction(context.local())
9325 context->Global()->Set(v8_str("__proto__"), o); 10368 .ToLocalChecked()
10369 ->NewInstance(context.local())
10370 .ToLocalChecked();
10371 CHECK(context->Global()
10372 ->Set(context.local(), v8_str("__proto__"), o)
10373 .FromJust());
9326 10374
9327 Local<Value> value = 10375 Local<Value> value =
9328 CompileRun("this.propertyIsEnumerable(0)"); 10376 CompileRun("this.propertyIsEnumerable(0)");
9329 CHECK(value->IsBoolean()); 10377 CHECK(value->IsBoolean());
9330 CHECK(!value->BooleanValue()); 10378 CHECK(!value->BooleanValue(context.local()).FromJust());
9331 10379
9332 value = CompileRun("x"); 10380 value = CompileRun("x");
9333 CHECK_EQ(12, value->Int32Value()); 10381 CHECK_EQ(12, value->Int32Value(context.local()).FromJust());
9334 10382
9335 value = CompileRun("f()"); 10383 value = CompileRun("f()");
9336 CHECK_EQ(42, value->Int32Value()); 10384 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
9337 10385
9338 CompileRun("y = 43"); 10386 CompileRun("y = 43");
9339 CHECK_EQ(1, shadow_y_setter_call_count); 10387 CHECK_EQ(1, shadow_y_setter_call_count);
9340 value = CompileRun("y"); 10388 value = CompileRun("y");
9341 CHECK_EQ(1, shadow_y_getter_call_count); 10389 CHECK_EQ(1, shadow_y_getter_call_count);
9342 CHECK_EQ(42, value->Int32Value()); 10390 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
9343 } 10391 }
9344 10392
9345 10393
9346 THREADED_TEST(HiddenPrototype) { 10394 THREADED_TEST(HiddenPrototype) {
9347 LocalContext context; 10395 LocalContext context;
9348 v8::Isolate* isolate = context->GetIsolate(); 10396 v8::Isolate* isolate = context->GetIsolate();
9349 v8::HandleScope handle_scope(isolate); 10397 v8::HandleScope handle_scope(isolate);
9350 10398
9351 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); 10399 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
9352 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); 10400 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0));
9353 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); 10401 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
9354 t1->SetHiddenPrototype(true); 10402 t1->SetHiddenPrototype(true);
9355 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); 10403 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1));
9356 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); 10404 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
9357 t2->SetHiddenPrototype(true); 10405 t2->SetHiddenPrototype(true);
9358 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); 10406 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2));
9359 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); 10407 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
9360 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); 10408 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3));
9361 10409
9362 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); 10410 Local<v8::Object> o0 = t0->GetFunction(context.local())
9363 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); 10411 .ToLocalChecked()
9364 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); 10412 ->NewInstance(context.local())
9365 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); 10413 .ToLocalChecked();
10414 Local<v8::Object> o1 = t1->GetFunction(context.local())
10415 .ToLocalChecked()
10416 ->NewInstance(context.local())
10417 .ToLocalChecked();
10418 Local<v8::Object> o2 = t2->GetFunction(context.local())
10419 .ToLocalChecked()
10420 ->NewInstance(context.local())
10421 .ToLocalChecked();
10422 Local<v8::Object> o3 = t3->GetFunction(context.local())
10423 .ToLocalChecked()
10424 ->NewInstance(context.local())
10425 .ToLocalChecked();
9366 10426
9367 // Setting the prototype on an object skips hidden prototypes. 10427 // Setting the prototype on an object skips hidden prototypes.
9368 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10428 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
9369 o0->Set(v8_str("__proto__"), o1); 10429 .ToLocalChecked()
9370 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10430 ->Int32Value(context.local())
9371 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10431 .FromJust());
9372 o0->Set(v8_str("__proto__"), o2); 10432 CHECK(o0->Set(context.local(), v8_str("__proto__"), o1).FromJust());
9373 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10433 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
9374 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10434 .ToLocalChecked()
9375 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); 10435 ->Int32Value(context.local())
9376 o0->Set(v8_str("__proto__"), o3); 10436 .FromJust());
9377 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10437 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
9378 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10438 .ToLocalChecked()
9379 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); 10439 ->Int32Value(context.local())
9380 CHECK_EQ(3, o0->Get(v8_str("u"))->Int32Value()); 10440 .FromJust());
10441 CHECK(o0->Set(context.local(), v8_str("__proto__"), o2).FromJust());
10442 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
10443 .ToLocalChecked()
10444 ->Int32Value(context.local())
10445 .FromJust());
10446 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
10447 .ToLocalChecked()
10448 ->Int32Value(context.local())
10449 .FromJust());
10450 CHECK_EQ(2, o0->Get(context.local(), v8_str("z"))
10451 .ToLocalChecked()
10452 ->Int32Value(context.local())
10453 .FromJust());
10454 CHECK(o0->Set(context.local(), v8_str("__proto__"), o3).FromJust());
10455 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
10456 .ToLocalChecked()
10457 ->Int32Value(context.local())
10458 .FromJust());
10459 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
10460 .ToLocalChecked()
10461 ->Int32Value(context.local())
10462 .FromJust());
10463 CHECK_EQ(2, o0->Get(context.local(), v8_str("z"))
10464 .ToLocalChecked()
10465 ->Int32Value(context.local())
10466 .FromJust());
10467 CHECK_EQ(3, o0->Get(context.local(), v8_str("u"))
10468 .ToLocalChecked()
10469 ->Int32Value(context.local())
10470 .FromJust());
9381 10471
9382 // Getting the prototype of o0 should get the first visible one 10472 // Getting the prototype of o0 should get the first visible one
9383 // which is o3. Therefore, z should not be defined on the prototype 10473 // which is o3. Therefore, z should not be defined on the prototype
9384 // object. 10474 // object.
9385 Local<Value> proto = o0->Get(v8_str("__proto__")); 10475 Local<Value> proto =
10476 o0->Get(context.local(), v8_str("__proto__")).ToLocalChecked();
9386 CHECK(proto->IsObject()); 10477 CHECK(proto->IsObject());
9387 CHECK(proto.As<v8::Object>()->Get(v8_str("z"))->IsUndefined()); 10478 CHECK(proto.As<v8::Object>()
10479 ->Get(context.local(), v8_str("z"))
10480 .ToLocalChecked()
10481 ->IsUndefined());
9388 } 10482 }
9389 10483
9390 10484
9391 THREADED_TEST(HiddenPrototypeSet) { 10485 THREADED_TEST(HiddenPrototypeSet) {
9392 LocalContext context; 10486 LocalContext context;
9393 v8::Isolate* isolate = context->GetIsolate(); 10487 v8::Isolate* isolate = context->GetIsolate();
9394 v8::HandleScope handle_scope(isolate); 10488 v8::HandleScope handle_scope(isolate);
9395 10489
9396 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(isolate); 10490 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(isolate);
9397 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(isolate); 10491 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(isolate);
9398 ht->SetHiddenPrototype(true); 10492 ht->SetHiddenPrototype(true);
9399 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(isolate); 10493 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(isolate);
9400 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); 10494 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0));
9401 10495
9402 Local<v8::Object> o = ot->GetFunction()->NewInstance(); 10496 Local<v8::Object> o = ot->GetFunction(context.local())
9403 Local<v8::Object> h = ht->GetFunction()->NewInstance(); 10497 .ToLocalChecked()
9404 Local<v8::Object> p = pt->GetFunction()->NewInstance(); 10498 ->NewInstance(context.local())
9405 o->Set(v8_str("__proto__"), h); 10499 .ToLocalChecked();
9406 h->Set(v8_str("__proto__"), p); 10500 Local<v8::Object> h = ht->GetFunction(context.local())
10501 .ToLocalChecked()
10502 ->NewInstance(context.local())
10503 .ToLocalChecked();
10504 Local<v8::Object> p = pt->GetFunction(context.local())
10505 .ToLocalChecked()
10506 ->NewInstance(context.local())
10507 .ToLocalChecked();
10508 CHECK(o->Set(context.local(), v8_str("__proto__"), h).FromJust());
10509 CHECK(h->Set(context.local(), v8_str("__proto__"), p).FromJust());
9407 10510
9408 // Setting a property that exists on the hidden prototype goes there. 10511 // Setting a property that exists on the hidden prototype goes there.
9409 o->Set(v8_str("x"), v8_num(7)); 10512 CHECK(o->Set(context.local(), v8_str("x"), v8_num(7)).FromJust());
9410 CHECK_EQ(7, o->Get(v8_str("x"))->Int32Value()); 10513 CHECK_EQ(7, o->Get(context.local(), v8_str("x"))
9411 CHECK_EQ(7, h->Get(v8_str("x"))->Int32Value()); 10514 .ToLocalChecked()
9412 CHECK(p->Get(v8_str("x"))->IsUndefined()); 10515 ->Int32Value(context.local())
10516 .FromJust());
10517 CHECK_EQ(7, h->Get(context.local(), v8_str("x"))
10518 .ToLocalChecked()
10519 ->Int32Value(context.local())
10520 .FromJust());
10521 CHECK(p->Get(context.local(), v8_str("x")).ToLocalChecked()->IsUndefined());
9413 10522
9414 // Setting a new property should not be forwarded to the hidden prototype. 10523 // Setting a new property should not be forwarded to the hidden prototype.
9415 o->Set(v8_str("y"), v8_num(6)); 10524 CHECK(o->Set(context.local(), v8_str("y"), v8_num(6)).FromJust());
9416 CHECK_EQ(6, o->Get(v8_str("y"))->Int32Value()); 10525 CHECK_EQ(6, o->Get(context.local(), v8_str("y"))
9417 CHECK(h->Get(v8_str("y"))->IsUndefined()); 10526 .ToLocalChecked()
9418 CHECK(p->Get(v8_str("y"))->IsUndefined()); 10527 ->Int32Value(context.local())
10528 .FromJust());
10529 CHECK(h->Get(context.local(), v8_str("y")).ToLocalChecked()->IsUndefined());
10530 CHECK(p->Get(context.local(), v8_str("y")).ToLocalChecked()->IsUndefined());
9419 10531
9420 // Setting a property that only exists on a prototype of the hidden prototype 10532 // Setting a property that only exists on a prototype of the hidden prototype
9421 // is treated normally again. 10533 // is treated normally again.
9422 p->Set(v8_str("z"), v8_num(8)); 10534 CHECK(p->Set(context.local(), v8_str("z"), v8_num(8)).FromJust());
9423 CHECK_EQ(8, o->Get(v8_str("z"))->Int32Value()); 10535 CHECK_EQ(8, o->Get(context.local(), v8_str("z"))
9424 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); 10536 .ToLocalChecked()
9425 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); 10537 ->Int32Value(context.local())
9426 o->Set(v8_str("z"), v8_num(9)); 10538 .FromJust());
9427 CHECK_EQ(9, o->Get(v8_str("z"))->Int32Value()); 10539 CHECK_EQ(8, h->Get(context.local(), v8_str("z"))
9428 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); 10540 .ToLocalChecked()
9429 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); 10541 ->Int32Value(context.local())
10542 .FromJust());
10543 CHECK_EQ(8, p->Get(context.local(), v8_str("z"))
10544 .ToLocalChecked()
10545 ->Int32Value(context.local())
10546 .FromJust());
10547 CHECK(o->Set(context.local(), v8_str("z"), v8_num(9)).FromJust());
10548 CHECK_EQ(9, o->Get(context.local(), v8_str("z"))
10549 .ToLocalChecked()
10550 ->Int32Value(context.local())
10551 .FromJust());
10552 CHECK_EQ(8, h->Get(context.local(), v8_str("z"))
10553 .ToLocalChecked()
10554 ->Int32Value(context.local())
10555 .FromJust());
10556 CHECK_EQ(8, p->Get(context.local(), v8_str("z"))
10557 .ToLocalChecked()
10558 ->Int32Value(context.local())
10559 .FromJust());
9430 } 10560 }
9431 10561
9432 10562
9433 // Regression test for issue 2457. 10563 // Regression test for issue 2457.
9434 THREADED_TEST(HiddenPrototypeIdentityHash) { 10564 THREADED_TEST(HiddenPrototypeIdentityHash) {
9435 LocalContext context; 10565 LocalContext context;
9436 v8::HandleScope handle_scope(context->GetIsolate()); 10566 v8::HandleScope handle_scope(context->GetIsolate());
9437 10567
9438 Handle<FunctionTemplate> t = FunctionTemplate::New(context->GetIsolate()); 10568 Local<FunctionTemplate> t = FunctionTemplate::New(context->GetIsolate());
9439 t->SetHiddenPrototype(true); 10569 t->SetHiddenPrototype(true);
9440 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75)); 10570 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75));
9441 Handle<Object> p = t->GetFunction()->NewInstance(); 10571 Local<Object> p = t->GetFunction(context.local())
9442 Handle<Object> o = Object::New(context->GetIsolate()); 10572 .ToLocalChecked()
9443 o->SetPrototype(p); 10573 ->NewInstance(context.local())
10574 .ToLocalChecked();
10575 Local<Object> o = Object::New(context->GetIsolate());
10576 CHECK(o->SetPrototype(context.local(), p).FromJust());
9444 10577
9445 int hash = o->GetIdentityHash(); 10578 int hash = o->GetIdentityHash();
9446 USE(hash); 10579 USE(hash);
9447 o->Set(v8_str("foo"), v8_num(42)); 10580 CHECK(o->Set(context.local(), v8_str("foo"), v8_num(42)).FromJust());
9448 DCHECK_EQ(hash, o->GetIdentityHash()); 10581 DCHECK_EQ(hash, o->GetIdentityHash());
9449 } 10582 }
9450 10583
9451 10584
9452 THREADED_TEST(SetPrototype) { 10585 THREADED_TEST(SetPrototype) {
9453 LocalContext context; 10586 LocalContext context;
9454 v8::Isolate* isolate = context->GetIsolate(); 10587 v8::Isolate* isolate = context->GetIsolate();
9455 v8::HandleScope handle_scope(isolate); 10588 v8::HandleScope handle_scope(isolate);
9456 10589
9457 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); 10590 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate);
9458 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); 10591 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0));
9459 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); 10592 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
9460 t1->SetHiddenPrototype(true); 10593 t1->SetHiddenPrototype(true);
9461 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); 10594 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1));
9462 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); 10595 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
9463 t2->SetHiddenPrototype(true); 10596 t2->SetHiddenPrototype(true);
9464 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); 10597 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2));
9465 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); 10598 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate);
9466 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); 10599 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3));
9467 10600
9468 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); 10601 Local<v8::Object> o0 = t0->GetFunction(context.local())
9469 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); 10602 .ToLocalChecked()
9470 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); 10603 ->NewInstance(context.local())
9471 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); 10604 .ToLocalChecked();
10605 Local<v8::Object> o1 = t1->GetFunction(context.local())
10606 .ToLocalChecked()
10607 ->NewInstance(context.local())
10608 .ToLocalChecked();
10609 Local<v8::Object> o2 = t2->GetFunction(context.local())
10610 .ToLocalChecked()
10611 ->NewInstance(context.local())
10612 .ToLocalChecked();
10613 Local<v8::Object> o3 = t3->GetFunction(context.local())
10614 .ToLocalChecked()
10615 ->NewInstance(context.local())
10616 .ToLocalChecked();
9472 10617
9473 // Setting the prototype on an object does not skip hidden prototypes. 10618 // Setting the prototype on an object does not skip hidden prototypes.
9474 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10619 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
9475 CHECK(o0->SetPrototype(o1)); 10620 .ToLocalChecked()
9476 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10621 ->Int32Value(context.local())
9477 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10622 .FromJust());
9478 CHECK(o1->SetPrototype(o2)); 10623 CHECK(o0->SetPrototype(context.local(), o1).FromJust());
9479 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10624 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
9480 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10625 .ToLocalChecked()
9481 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); 10626 ->Int32Value(context.local())
9482 CHECK(o2->SetPrototype(o3)); 10627 .FromJust());
9483 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); 10628 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
9484 CHECK_EQ(1, o0->Get(v8_str("y"))->Int32Value()); 10629 .ToLocalChecked()
9485 CHECK_EQ(2, o0->Get(v8_str("z"))->Int32Value()); 10630 ->Int32Value(context.local())
9486 CHECK_EQ(3, o0->Get(v8_str("u"))->Int32Value()); 10631 .FromJust());
10632 CHECK(o1->SetPrototype(context.local(), o2).FromJust());
10633 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
10634 .ToLocalChecked()
10635 ->Int32Value(context.local())
10636 .FromJust());
10637 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
10638 .ToLocalChecked()
10639 ->Int32Value(context.local())
10640 .FromJust());
10641 CHECK_EQ(2, o0->Get(context.local(), v8_str("z"))
10642 .ToLocalChecked()
10643 ->Int32Value(context.local())
10644 .FromJust());
10645 CHECK(o2->SetPrototype(context.local(), o3).FromJust());
10646 CHECK_EQ(0, o0->Get(context.local(), v8_str("x"))
10647 .ToLocalChecked()
10648 ->Int32Value(context.local())
10649 .FromJust());
10650 CHECK_EQ(1, o0->Get(context.local(), v8_str("y"))
10651 .ToLocalChecked()
10652 ->Int32Value(context.local())
10653 .FromJust());
10654 CHECK_EQ(2, o0->Get(context.local(), v8_str("z"))
10655 .ToLocalChecked()
10656 ->Int32Value(context.local())
10657 .FromJust());
10658 CHECK_EQ(3, o0->Get(context.local(), v8_str("u"))
10659 .ToLocalChecked()
10660 ->Int32Value(context.local())
10661 .FromJust());
9487 10662
9488 // Getting the prototype of o0 should get the first visible one 10663 // Getting the prototype of o0 should get the first visible one
9489 // which is o3. Therefore, z should not be defined on the prototype 10664 // which is o3. Therefore, z should not be defined on the prototype
9490 // object. 10665 // object.
9491 Local<Value> proto = o0->Get(v8_str("__proto__")); 10666 Local<Value> proto =
10667 o0->Get(context.local(), v8_str("__proto__")).ToLocalChecked();
9492 CHECK(proto->IsObject()); 10668 CHECK(proto->IsObject());
9493 CHECK(proto.As<v8::Object>()->Equals(o3)); 10669 CHECK(proto.As<v8::Object>()->Equals(context.local(), o3).FromJust());
9494 10670
9495 // However, Object::GetPrototype ignores hidden prototype. 10671 // However, Object::GetPrototype ignores hidden prototype.
9496 Local<Value> proto0 = o0->GetPrototype(); 10672 Local<Value> proto0 = o0->GetPrototype();
9497 CHECK(proto0->IsObject()); 10673 CHECK(proto0->IsObject());
9498 CHECK(proto0.As<v8::Object>()->Equals(o1)); 10674 CHECK(proto0.As<v8::Object>()->Equals(context.local(), o1).FromJust());
9499 10675
9500 Local<Value> proto1 = o1->GetPrototype(); 10676 Local<Value> proto1 = o1->GetPrototype();
9501 CHECK(proto1->IsObject()); 10677 CHECK(proto1->IsObject());
9502 CHECK(proto1.As<v8::Object>()->Equals(o2)); 10678 CHECK(proto1.As<v8::Object>()->Equals(context.local(), o2).FromJust());
9503 10679
9504 Local<Value> proto2 = o2->GetPrototype(); 10680 Local<Value> proto2 = o2->GetPrototype();
9505 CHECK(proto2->IsObject()); 10681 CHECK(proto2->IsObject());
9506 CHECK(proto2.As<v8::Object>()->Equals(o3)); 10682 CHECK(proto2.As<v8::Object>()->Equals(context.local(), o3).FromJust());
9507 } 10683 }
9508 10684
9509 10685
9510 // Getting property names of an object with a prototype chain that 10686 // Getting property names of an object with a prototype chain that
9511 // triggers dictionary elements in GetOwnPropertyNames() shouldn't 10687 // triggers dictionary elements in GetOwnPropertyNames() shouldn't
9512 // crash the runtime. 10688 // crash the runtime.
9513 THREADED_TEST(Regress91517) { 10689 THREADED_TEST(Regress91517) {
9514 i::FLAG_allow_natives_syntax = true; 10690 i::FLAG_allow_natives_syntax = true;
9515 LocalContext context; 10691 LocalContext context;
9516 v8::Isolate* isolate = context->GetIsolate(); 10692 v8::Isolate* isolate = context->GetIsolate();
(...skipping 13 matching lines...) Expand all
9530 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); 10706 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate);
9531 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); 10707 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4));
9532 10708
9533 // Force dictionary-based properties. 10709 // Force dictionary-based properties.
9534 i::ScopedVector<char> name_buf(1024); 10710 i::ScopedVector<char> name_buf(1024);
9535 for (int i = 1; i <= 1000; i++) { 10711 for (int i = 1; i <= 1000; i++) {
9536 i::SNPrintF(name_buf, "sdf%d", i); 10712 i::SNPrintF(name_buf, "sdf%d", i);
9537 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); 10713 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2));
9538 } 10714 }
9539 10715
9540 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); 10716 Local<v8::Object> o1 = t1->GetFunction(context.local())
9541 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); 10717 .ToLocalChecked()
9542 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); 10718 ->NewInstance(context.local())
9543 Local<v8::Object> o4 = t4->GetFunction()->NewInstance(); 10719 .ToLocalChecked();
10720 Local<v8::Object> o2 = t2->GetFunction(context.local())
10721 .ToLocalChecked()
10722 ->NewInstance(context.local())
10723 .ToLocalChecked();
10724 Local<v8::Object> o3 = t3->GetFunction(context.local())
10725 .ToLocalChecked()
10726 ->NewInstance(context.local())
10727 .ToLocalChecked();
10728 Local<v8::Object> o4 = t4->GetFunction(context.local())
10729 .ToLocalChecked()
10730 ->NewInstance(context.local())
10731 .ToLocalChecked();
9544 10732
9545 // Create prototype chain of hidden prototypes. 10733 // Create prototype chain of hidden prototypes.
9546 CHECK(o4->SetPrototype(o3)); 10734 CHECK(o4->SetPrototype(context.local(), o3).FromJust());
9547 CHECK(o3->SetPrototype(o2)); 10735 CHECK(o3->SetPrototype(context.local(), o2).FromJust());
9548 CHECK(o2->SetPrototype(o1)); 10736 CHECK(o2->SetPrototype(context.local(), o1).FromJust());
9549 10737
9550 // Call the runtime version of GetOwnPropertyNames() on the natively 10738 // Call the runtime version of GetOwnPropertyNames() on the natively
9551 // created object through JavaScript. 10739 // created object through JavaScript.
9552 context->Global()->Set(v8_str("obj"), o4); 10740 CHECK(context->Global()->Set(context.local(), v8_str("obj"), o4).FromJust());
9553 // PROPERTY_ATTRIBUTES_NONE = 0 10741 // PROPERTY_ATTRIBUTES_NONE = 0
9554 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); 10742 CompileRun("var names = %GetOwnPropertyNames(obj, 0);");
9555 10743
9556 ExpectInt32("names.length", 1006); 10744 ExpectInt32("names.length", 1006);
9557 ExpectTrue("names.indexOf(\"baz\") >= 0"); 10745 ExpectTrue("names.indexOf(\"baz\") >= 0");
9558 ExpectTrue("names.indexOf(\"boo\") >= 0"); 10746 ExpectTrue("names.indexOf(\"boo\") >= 0");
9559 ExpectTrue("names.indexOf(\"foo\") >= 0"); 10747 ExpectTrue("names.indexOf(\"foo\") >= 0");
9560 ExpectTrue("names.indexOf(\"fuz1\") >= 0"); 10748 ExpectTrue("names.indexOf(\"fuz1\") >= 0");
9561 ExpectTrue("names.indexOf(\"fuz2\") >= 0"); 10749 ExpectTrue("names.indexOf(\"fuz2\") >= 0");
9562 ExpectFalse("names[1005] == undefined"); 10750 ExpectFalse("names[1005] == undefined");
(...skipping 14 matching lines...) Expand all
9577 Local<v8::ObjectTemplate> i1 = t1->InstanceTemplate(); 10765 Local<v8::ObjectTemplate> i1 = t1->InstanceTemplate();
9578 i1->SetAccessor(v8_str("foo"), 10766 i1->SetAccessor(v8_str("foo"),
9579 SimpleAccessorGetter, SimpleAccessorSetter); 10767 SimpleAccessorGetter, SimpleAccessorSetter);
9580 i1->SetAccessor(v8_str("bar"), 10768 i1->SetAccessor(v8_str("bar"),
9581 SimpleAccessorGetter, SimpleAccessorSetter); 10769 SimpleAccessorGetter, SimpleAccessorSetter);
9582 i1->SetAccessor(v8_str("baz"), 10770 i1->SetAccessor(v8_str("baz"),
9583 SimpleAccessorGetter, SimpleAccessorSetter); 10771 SimpleAccessorGetter, SimpleAccessorSetter);
9584 i1->Set(v8_str("n1"), v8_num(1)); 10772 i1->Set(v8_str("n1"), v8_num(1));
9585 i1->Set(v8_str("n2"), v8_num(2)); 10773 i1->Set(v8_str("n2"), v8_num(2));
9586 10774
9587 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); 10775 Local<v8::Object> o1 = t1->GetFunction(context.local())
10776 .ToLocalChecked()
10777 ->NewInstance(context.local())
10778 .ToLocalChecked();
9588 Local<v8::FunctionTemplate> t2 = 10779 Local<v8::FunctionTemplate> t2 =
9589 v8::FunctionTemplate::New(context->GetIsolate()); 10780 v8::FunctionTemplate::New(context->GetIsolate());
9590 t2->SetHiddenPrototype(true); 10781 t2->SetHiddenPrototype(true);
9591 10782
9592 // Inherit from t1 and mark prototype as hidden. 10783 // Inherit from t1 and mark prototype as hidden.
9593 t2->Inherit(t1); 10784 t2->Inherit(t1);
9594 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4)); 10785 t2->InstanceTemplate()->Set(v8_str("mine"), v8_num(4));
9595 10786
9596 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); 10787 Local<v8::Object> o2 = t2->GetFunction(context.local())
9597 CHECK(o2->SetPrototype(o1)); 10788 .ToLocalChecked()
10789 ->NewInstance(context.local())
10790 .ToLocalChecked();
10791 CHECK(o2->SetPrototype(context.local(), o1).FromJust());
9598 10792
9599 v8::Local<v8::Symbol> sym = 10793 v8::Local<v8::Symbol> sym =
9600 v8::Symbol::New(context->GetIsolate(), v8_str("s1")); 10794 v8::Symbol::New(context->GetIsolate(), v8_str("s1"));
9601 o1->Set(sym, v8_num(3)); 10795 CHECK(o1->Set(context.local(), sym, v8_num(3)).FromJust());
9602 o1->SetPrivate(context.local(), 10796 o1->SetPrivate(context.local(),
9603 v8::Private::New(context->GetIsolate(), v8_str("h1")), 10797 v8::Private::New(context->GetIsolate(), v8_str("h1")),
9604 v8::Integer::New(context->GetIsolate(), 2013)) 10798 v8::Integer::New(context->GetIsolate(), 2013))
9605 .FromJust(); 10799 .FromJust();
9606 10800
9607 // Call the runtime version of GetOwnPropertyNames() on 10801 // Call the runtime version of GetOwnPropertyNames() on
9608 // the natively created object through JavaScript. 10802 // the natively created object through JavaScript.
9609 context->Global()->Set(v8_str("obj"), o2); 10803 CHECK(context->Global()->Set(context.local(), v8_str("obj"), o2).FromJust());
9610 context->Global()->Set(v8_str("sym"), sym); 10804 CHECK(context->Global()->Set(context.local(), v8_str("sym"), sym).FromJust());
9611 // PROPERTY_ATTRIBUTES_NONE = 0 10805 // PROPERTY_ATTRIBUTES_NONE = 0
9612 CompileRun("var names = %GetOwnPropertyNames(obj, 0);"); 10806 CompileRun("var names = %GetOwnPropertyNames(obj, 0);");
9613 10807
9614 ExpectInt32("names.length", 7); 10808 ExpectInt32("names.length", 7);
9615 ExpectTrue("names.indexOf(\"foo\") >= 0"); 10809 ExpectTrue("names.indexOf(\"foo\") >= 0");
9616 ExpectTrue("names.indexOf(\"bar\") >= 0"); 10810 ExpectTrue("names.indexOf(\"bar\") >= 0");
9617 ExpectTrue("names.indexOf(\"baz\") >= 0"); 10811 ExpectTrue("names.indexOf(\"baz\") >= 0");
9618 ExpectTrue("names.indexOf(\"n1\") >= 0"); 10812 ExpectTrue("names.indexOf(\"n1\") >= 0");
9619 ExpectTrue("names.indexOf(\"n2\") >= 0"); 10813 ExpectTrue("names.indexOf(\"n2\") >= 0");
9620 ExpectTrue("names.indexOf(sym) >= 0"); 10814 ExpectTrue("names.indexOf(sym) >= 0");
9621 ExpectTrue("names.indexOf(\"mine\") >= 0"); 10815 ExpectTrue("names.indexOf(\"mine\") >= 0");
9622 } 10816 }
9623 10817
9624 10818
9625 THREADED_TEST(FunctionReadOnlyPrototype) { 10819 THREADED_TEST(FunctionReadOnlyPrototype) {
9626 LocalContext context; 10820 LocalContext context;
9627 v8::Isolate* isolate = context->GetIsolate(); 10821 v8::Isolate* isolate = context->GetIsolate();
9628 v8::HandleScope handle_scope(isolate); 10822 v8::HandleScope handle_scope(isolate);
9629 10823
9630 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); 10824 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
9631 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 10825 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42));
9632 t1->ReadOnlyPrototype(); 10826 t1->ReadOnlyPrototype();
9633 context->Global()->Set(v8_str("func1"), t1->GetFunction()); 10827 CHECK(context->Global()
10828 ->Set(context.local(), v8_str("func1"),
10829 t1->GetFunction(context.local()).ToLocalChecked())
10830 .FromJust());
9634 // Configured value of ReadOnly flag. 10831 // Configured value of ReadOnly flag.
9635 CHECK(CompileRun( 10832 CHECK(
9636 "(function() {" 10833 CompileRun(
9637 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" 10834 "(function() {"
9638 " return (descriptor['writable'] == false);" 10835 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');"
9639 "})()")->BooleanValue()); 10836 " return (descriptor['writable'] == false);"
9640 CHECK_EQ(42, CompileRun("func1.prototype.x")->Int32Value()); 10837 "})()")
9641 CHECK_EQ(42, 10838 ->BooleanValue(context.local())
9642 CompileRun("func1.prototype = {}; func1.prototype.x")->Int32Value()); 10839 .FromJust());
10840 CHECK_EQ(
10841 42,
10842 CompileRun("func1.prototype.x")->Int32Value(context.local()).FromJust());
10843 CHECK_EQ(42, CompileRun("func1.prototype = {}; func1.prototype.x")
10844 ->Int32Value(context.local())
10845 .FromJust());
9643 10846
9644 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); 10847 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate);
9645 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 10848 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(isolate, 42));
9646 context->Global()->Set(v8_str("func2"), t2->GetFunction()); 10849 CHECK(context->Global()
10850 ->Set(context.local(), v8_str("func2"),
10851 t2->GetFunction(context.local()).ToLocalChecked())
10852 .FromJust());
9647 // Default value of ReadOnly flag. 10853 // Default value of ReadOnly flag.
9648 CHECK(CompileRun( 10854 CHECK(
9649 "(function() {" 10855 CompileRun(
9650 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" 10856 "(function() {"
9651 " return (descriptor['writable'] == true);" 10857 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');"
9652 "})()")->BooleanValue()); 10858 " return (descriptor['writable'] == true);"
9653 CHECK_EQ(42, CompileRun("func2.prototype.x")->Int32Value()); 10859 "})()")
10860 ->BooleanValue(context.local())
10861 .FromJust());
10862 CHECK_EQ(
10863 42,
10864 CompileRun("func2.prototype.x")->Int32Value(context.local()).FromJust());
9654 } 10865 }
9655 10866
9656 10867
9657 THREADED_TEST(SetPrototypeThrows) { 10868 THREADED_TEST(SetPrototypeThrows) {
9658 LocalContext context; 10869 LocalContext context;
9659 v8::Isolate* isolate = context->GetIsolate(); 10870 v8::Isolate* isolate = context->GetIsolate();
9660 v8::HandleScope handle_scope(isolate); 10871 v8::HandleScope handle_scope(isolate);
9661 10872
9662 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 10873 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
9663 10874
9664 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); 10875 Local<v8::Object> o0 = t->GetFunction(context.local())
9665 Local<v8::Object> o1 = t->GetFunction()->NewInstance(); 10876 .ToLocalChecked()
10877 ->NewInstance(context.local())
10878 .ToLocalChecked();
10879 Local<v8::Object> o1 = t->GetFunction(context.local())
10880 .ToLocalChecked()
10881 ->NewInstance(context.local())
10882 .ToLocalChecked();
9666 10883
9667 CHECK(o0->SetPrototype(o1)); 10884 CHECK(o0->SetPrototype(context.local(), o1).FromJust());
9668 // If setting the prototype leads to the cycle, SetPrototype should 10885 // If setting the prototype leads to the cycle, SetPrototype should
9669 // return false and keep VM in sane state. 10886 // return false and keep VM in sane state.
9670 v8::TryCatch try_catch(isolate); 10887 v8::TryCatch try_catch(isolate);
9671 CHECK(!o1->SetPrototype(o0)); 10888 CHECK(o1->SetPrototype(context.local(), o0).IsNothing());
9672 CHECK(!try_catch.HasCaught()); 10889 CHECK(!try_catch.HasCaught());
9673 DCHECK(!CcTest::i_isolate()->has_pending_exception()); 10890 DCHECK(!CcTest::i_isolate()->has_pending_exception());
9674 10891
9675 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()")->Int32Value()); 10892 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()")
10893 ->Int32Value(context.local())
10894 .FromJust());
9676 } 10895 }
9677 10896
9678 10897
9679 THREADED_TEST(FunctionRemovePrototype) { 10898 THREADED_TEST(FunctionRemovePrototype) {
9680 LocalContext context; 10899 LocalContext context;
9681 v8::Isolate* isolate = context->GetIsolate(); 10900 v8::Isolate* isolate = context->GetIsolate();
9682 v8::HandleScope handle_scope(isolate); 10901 v8::HandleScope handle_scope(isolate);
9683 10902
9684 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); 10903 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate);
9685 t1->RemovePrototype(); 10904 t1->RemovePrototype();
9686 Local<v8::Function> fun = t1->GetFunction(); 10905 Local<v8::Function> fun = t1->GetFunction(context.local()).ToLocalChecked();
9687 context->Global()->Set(v8_str("fun"), fun); 10906 CHECK(context->Global()->Set(context.local(), v8_str("fun"), fun).FromJust());
9688 CHECK(!CompileRun("'prototype' in fun")->BooleanValue()); 10907 CHECK(!CompileRun("'prototype' in fun")
10908 ->BooleanValue(context.local())
10909 .FromJust());
9689 10910
9690 v8::TryCatch try_catch(isolate); 10911 v8::TryCatch try_catch(isolate);
9691 CompileRun("new fun()"); 10912 CompileRun("new fun()");
9692 CHECK(try_catch.HasCaught()); 10913 CHECK(try_catch.HasCaught());
9693 10914
9694 try_catch.Reset(); 10915 try_catch.Reset();
9695 fun->NewInstance(); 10916 CHECK(fun->NewInstance(context.local()).IsEmpty());
9696 CHECK(try_catch.HasCaught()); 10917 CHECK(try_catch.HasCaught());
9697 } 10918 }
9698 10919
9699 10920
9700 THREADED_TEST(GetterSetterExceptions) { 10921 THREADED_TEST(GetterSetterExceptions) {
9701 LocalContext context; 10922 LocalContext context;
9702 v8::Isolate* isolate = context->GetIsolate(); 10923 v8::Isolate* isolate = context->GetIsolate();
9703 v8::HandleScope handle_scope(isolate); 10924 v8::HandleScope handle_scope(isolate);
9704 CompileRun( 10925 CompileRun(
9705 "function Foo() { };" 10926 "function Foo() { };"
9706 "function Throw() { throw 5; };" 10927 "function Throw() { throw 5; };"
9707 "var x = { };" 10928 "var x = { };"
9708 "x.__defineSetter__('set', Throw);" 10929 "x.__defineSetter__('set', Throw);"
9709 "x.__defineGetter__('get', Throw);"); 10930 "x.__defineGetter__('get', Throw);");
9710 Local<v8::Object> x = 10931 Local<v8::Object> x = Local<v8::Object>::Cast(
9711 Local<v8::Object>::Cast(context->Global()->Get(v8_str("x"))); 10932 context->Global()->Get(context.local(), v8_str("x")).ToLocalChecked());
9712 v8::TryCatch try_catch(isolate); 10933 v8::TryCatch try_catch(isolate);
9713 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); 10934 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8))
9714 x->Get(v8_str("get")); 10935 .IsNothing());
9715 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); 10936 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty());
9716 x->Get(v8_str("get")); 10937 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8))
9717 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); 10938 .IsNothing());
9718 x->Get(v8_str("get")); 10939 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty());
9719 x->Set(v8_str("set"), v8::Integer::New(isolate, 8)); 10940 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8))
9720 x->Get(v8_str("get")); 10941 .IsNothing());
10942 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty());
10943 CHECK(x->Set(context.local(), v8_str("set"), v8::Integer::New(isolate, 8))
10944 .IsNothing());
10945 CHECK(x->Get(context.local(), v8_str("get")).IsEmpty());
9721 } 10946 }
9722 10947
9723 10948
9724 THREADED_TEST(Constructor) { 10949 THREADED_TEST(Constructor) {
9725 LocalContext context; 10950 LocalContext context;
9726 v8::Isolate* isolate = context->GetIsolate(); 10951 v8::Isolate* isolate = context->GetIsolate();
9727 v8::HandleScope handle_scope(isolate); 10952 v8::HandleScope handle_scope(isolate);
9728 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 10953 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
9729 templ->SetClassName(v8_str("Fun")); 10954 templ->SetClassName(v8_str("Fun"));
9730 Local<Function> cons = templ->GetFunction(); 10955 Local<Function> cons = templ->GetFunction(context.local()).ToLocalChecked();
9731 context->Global()->Set(v8_str("Fun"), cons); 10956 CHECK(
9732 Local<v8::Object> inst = cons->NewInstance(); 10957 context->Global()->Set(context.local(), v8_str("Fun"), cons).FromJust());
10958 Local<v8::Object> inst = cons->NewInstance(context.local()).ToLocalChecked();
9733 i::Handle<i::JSReceiver> obj(v8::Utils::OpenHandle(*inst)); 10959 i::Handle<i::JSReceiver> obj(v8::Utils::OpenHandle(*inst));
9734 CHECK(obj->IsJSObject()); 10960 CHECK(obj->IsJSObject());
9735 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); 10961 Local<Value> value = CompileRun("(new Fun()).constructor === Fun");
9736 CHECK(value->BooleanValue()); 10962 CHECK(value->BooleanValue(context.local()).FromJust());
9737 } 10963 }
9738 10964
9739 10965
9740 static void ConstructorCallback( 10966 static void ConstructorCallback(
9741 const v8::FunctionCallbackInfo<v8::Value>& args) { 10967 const v8::FunctionCallbackInfo<v8::Value>& args) {
9742 ApiTestFuzzer::Fuzz(); 10968 ApiTestFuzzer::Fuzz();
9743 Local<Object> This; 10969 Local<Object> This;
9744 10970
10971 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
9745 if (args.IsConstructCall()) { 10972 if (args.IsConstructCall()) {
9746 Local<Object> Holder = args.Holder(); 10973 Local<Object> Holder = args.Holder();
9747 This = Object::New(args.GetIsolate()); 10974 This = Object::New(args.GetIsolate());
9748 Local<Value> proto = Holder->GetPrototype(); 10975 Local<Value> proto = Holder->GetPrototype();
9749 if (proto->IsObject()) { 10976 if (proto->IsObject()) {
9750 This->SetPrototype(proto); 10977 This->SetPrototype(context, proto).FromJust();
9751 } 10978 }
9752 } else { 10979 } else {
9753 This = args.This(); 10980 This = args.This();
9754 } 10981 }
9755 10982
9756 This->Set(v8_str("a"), args[0]); 10983 This->Set(context, v8_str("a"), args[0]).FromJust();
9757 args.GetReturnValue().Set(This); 10984 args.GetReturnValue().Set(This);
9758 } 10985 }
9759 10986
9760 10987
9761 static void FakeConstructorCallback( 10988 static void FakeConstructorCallback(
9762 const v8::FunctionCallbackInfo<v8::Value>& args) { 10989 const v8::FunctionCallbackInfo<v8::Value>& args) {
9763 ApiTestFuzzer::Fuzz(); 10990 ApiTestFuzzer::Fuzz();
9764 args.GetReturnValue().Set(args[0]); 10991 args.GetReturnValue().Set(args[0]);
9765 } 10992 }
9766 10993
9767 10994
9768 THREADED_TEST(ConstructorForObject) { 10995 THREADED_TEST(ConstructorForObject) {
9769 LocalContext context; 10996 LocalContext context;
9770 v8::Isolate* isolate = context->GetIsolate(); 10997 v8::Isolate* isolate = context->GetIsolate();
9771 v8::HandleScope handle_scope(isolate); 10998 v8::HandleScope handle_scope(isolate);
9772 10999
9773 { 11000 {
9774 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11001 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
9775 instance_template->SetCallAsFunctionHandler(ConstructorCallback); 11002 instance_template->SetCallAsFunctionHandler(ConstructorCallback);
9776 Local<Object> instance = instance_template->NewInstance(); 11003 Local<Object> instance =
9777 context->Global()->Set(v8_str("obj"), instance); 11004 instance_template->NewInstance(context.local()).ToLocalChecked();
11005 CHECK(context->Global()
11006 ->Set(context.local(), v8_str("obj"), instance)
11007 .FromJust());
9778 v8::TryCatch try_catch(isolate); 11008 v8::TryCatch try_catch(isolate);
9779 Local<Value> value; 11009 Local<Value> value;
9780 CHECK(!try_catch.HasCaught()); 11010 CHECK(!try_catch.HasCaught());
9781 11011
9782 // Call the Object's constructor with a 32-bit signed integer. 11012 // Call the Object's constructor with a 32-bit signed integer.
9783 value = CompileRun("(function() { var o = new obj(28); return o.a; })()"); 11013 value = CompileRun("(function() { var o = new obj(28); return o.a; })()");
9784 CHECK(!try_catch.HasCaught()); 11014 CHECK(!try_catch.HasCaught());
9785 CHECK(value->IsInt32()); 11015 CHECK(value->IsInt32());
9786 CHECK_EQ(28, value->Int32Value()); 11016 CHECK_EQ(28, value->Int32Value(context.local()).FromJust());
9787 11017
9788 Local<Value> args1[] = {v8_num(28)}; 11018 Local<Value> args1[] = {v8_num(28)};
9789 Local<Value> value_obj1 = instance->CallAsConstructor(1, args1); 11019 Local<Value> value_obj1 =
11020 instance->CallAsConstructor(context.local(), 1, args1).ToLocalChecked();
9790 CHECK(value_obj1->IsObject()); 11021 CHECK(value_obj1->IsObject());
9791 Local<Object> object1 = Local<Object>::Cast(value_obj1); 11022 Local<Object> object1 = Local<Object>::Cast(value_obj1);
9792 value = object1->Get(v8_str("a")); 11023 value = object1->Get(context.local(), v8_str("a")).ToLocalChecked();
9793 CHECK(value->IsInt32()); 11024 CHECK(value->IsInt32());
9794 CHECK(!try_catch.HasCaught()); 11025 CHECK(!try_catch.HasCaught());
9795 CHECK_EQ(28, value->Int32Value()); 11026 CHECK_EQ(28, value->Int32Value(context.local()).FromJust());
9796 11027
9797 // Call the Object's constructor with a String. 11028 // Call the Object's constructor with a String.
9798 value = 11029 value =
9799 CompileRun("(function() { var o = new obj('tipli'); return o.a; })()"); 11030 CompileRun("(function() { var o = new obj('tipli'); return o.a; })()");
9800 CHECK(!try_catch.HasCaught()); 11031 CHECK(!try_catch.HasCaught());
9801 CHECK(value->IsString()); 11032 CHECK(value->IsString());
9802 String::Utf8Value string_value1(value->ToString(isolate)); 11033 String::Utf8Value string_value1(
11034 value->ToString(context.local()).ToLocalChecked());
9803 CHECK_EQ(0, strcmp("tipli", *string_value1)); 11035 CHECK_EQ(0, strcmp("tipli", *string_value1));
9804 11036
9805 Local<Value> args2[] = {v8_str("tipli")}; 11037 Local<Value> args2[] = {v8_str("tipli")};
9806 Local<Value> value_obj2 = instance->CallAsConstructor(1, args2); 11038 Local<Value> value_obj2 =
11039 instance->CallAsConstructor(context.local(), 1, args2).ToLocalChecked();
9807 CHECK(value_obj2->IsObject()); 11040 CHECK(value_obj2->IsObject());
9808 Local<Object> object2 = Local<Object>::Cast(value_obj2); 11041 Local<Object> object2 = Local<Object>::Cast(value_obj2);
9809 value = object2->Get(v8_str("a")); 11042 value = object2->Get(context.local(), v8_str("a")).ToLocalChecked();
9810 CHECK(!try_catch.HasCaught()); 11043 CHECK(!try_catch.HasCaught());
9811 CHECK(value->IsString()); 11044 CHECK(value->IsString());
9812 String::Utf8Value string_value2(value->ToString(isolate)); 11045 String::Utf8Value string_value2(
11046 value->ToString(context.local()).ToLocalChecked());
9813 CHECK_EQ(0, strcmp("tipli", *string_value2)); 11047 CHECK_EQ(0, strcmp("tipli", *string_value2));
9814 11048
9815 // Call the Object's constructor with a Boolean. 11049 // Call the Object's constructor with a Boolean.
9816 value = CompileRun("(function() { var o = new obj(true); return o.a; })()"); 11050 value = CompileRun("(function() { var o = new obj(true); return o.a; })()");
9817 CHECK(!try_catch.HasCaught()); 11051 CHECK(!try_catch.HasCaught());
9818 CHECK(value->IsBoolean()); 11052 CHECK(value->IsBoolean());
9819 CHECK_EQ(true, value->BooleanValue()); 11053 CHECK_EQ(true, value->BooleanValue(context.local()).FromJust());
9820 11054
9821 Handle<Value> args3[] = {v8::True(isolate)}; 11055 Local<Value> args3[] = {v8::True(isolate)};
9822 Local<Value> value_obj3 = instance->CallAsConstructor(1, args3); 11056 Local<Value> value_obj3 =
11057 instance->CallAsConstructor(context.local(), 1, args3).ToLocalChecked();
9823 CHECK(value_obj3->IsObject()); 11058 CHECK(value_obj3->IsObject());
9824 Local<Object> object3 = Local<Object>::Cast(value_obj3); 11059 Local<Object> object3 = Local<Object>::Cast(value_obj3);
9825 value = object3->Get(v8_str("a")); 11060 value = object3->Get(context.local(), v8_str("a")).ToLocalChecked();
9826 CHECK(!try_catch.HasCaught()); 11061 CHECK(!try_catch.HasCaught());
9827 CHECK(value->IsBoolean()); 11062 CHECK(value->IsBoolean());
9828 CHECK_EQ(true, value->BooleanValue()); 11063 CHECK_EQ(true, value->BooleanValue(context.local()).FromJust());
9829 11064
9830 // Call the Object's constructor with undefined. 11065 // Call the Object's constructor with undefined.
9831 Handle<Value> args4[] = {v8::Undefined(isolate)}; 11066 Local<Value> args4[] = {v8::Undefined(isolate)};
9832 Local<Value> value_obj4 = instance->CallAsConstructor(1, args4); 11067 Local<Value> value_obj4 =
11068 instance->CallAsConstructor(context.local(), 1, args4).ToLocalChecked();
9833 CHECK(value_obj4->IsObject()); 11069 CHECK(value_obj4->IsObject());
9834 Local<Object> object4 = Local<Object>::Cast(value_obj4); 11070 Local<Object> object4 = Local<Object>::Cast(value_obj4);
9835 value = object4->Get(v8_str("a")); 11071 value = object4->Get(context.local(), v8_str("a")).ToLocalChecked();
9836 CHECK(!try_catch.HasCaught()); 11072 CHECK(!try_catch.HasCaught());
9837 CHECK(value->IsUndefined()); 11073 CHECK(value->IsUndefined());
9838 11074
9839 // Call the Object's constructor with null. 11075 // Call the Object's constructor with null.
9840 Handle<Value> args5[] = {v8::Null(isolate)}; 11076 Local<Value> args5[] = {v8::Null(isolate)};
9841 Local<Value> value_obj5 = instance->CallAsConstructor(1, args5); 11077 Local<Value> value_obj5 =
11078 instance->CallAsConstructor(context.local(), 1, args5).ToLocalChecked();
9842 CHECK(value_obj5->IsObject()); 11079 CHECK(value_obj5->IsObject());
9843 Local<Object> object5 = Local<Object>::Cast(value_obj5); 11080 Local<Object> object5 = Local<Object>::Cast(value_obj5);
9844 value = object5->Get(v8_str("a")); 11081 value = object5->Get(context.local(), v8_str("a")).ToLocalChecked();
9845 CHECK(!try_catch.HasCaught()); 11082 CHECK(!try_catch.HasCaught());
9846 CHECK(value->IsNull()); 11083 CHECK(value->IsNull());
9847 } 11084 }
9848 11085
9849 // Check exception handling when there is no constructor set for the Object. 11086 // Check exception handling when there is no constructor set for the Object.
9850 { 11087 {
9851 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11088 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
9852 Local<Object> instance = instance_template->NewInstance(); 11089 Local<Object> instance =
9853 context->Global()->Set(v8_str("obj2"), instance); 11090 instance_template->NewInstance(context.local()).ToLocalChecked();
11091 CHECK(context->Global()
11092 ->Set(context.local(), v8_str("obj2"), instance)
11093 .FromJust());
9854 v8::TryCatch try_catch(isolate); 11094 v8::TryCatch try_catch(isolate);
9855 Local<Value> value; 11095 Local<Value> value;
9856 CHECK(!try_catch.HasCaught()); 11096 CHECK(!try_catch.HasCaught());
9857 11097
9858 value = CompileRun("new obj2(28)"); 11098 value = CompileRun("new obj2(28)");
9859 CHECK(try_catch.HasCaught()); 11099 CHECK(try_catch.HasCaught());
9860 String::Utf8Value exception_value1(try_catch.Exception()); 11100 String::Utf8Value exception_value1(try_catch.Exception());
9861 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); 11101 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1));
9862 try_catch.Reset(); 11102 try_catch.Reset();
9863 11103
9864 Local<Value> args[] = {v8_num(29)}; 11104 Local<Value> args[] = {v8_num(29)};
9865 value = instance->CallAsConstructor(1, args); 11105 CHECK(instance->CallAsConstructor(context.local(), 1, args).IsEmpty());
9866 CHECK(try_catch.HasCaught()); 11106 CHECK(try_catch.HasCaught());
9867 String::Utf8Value exception_value2(try_catch.Exception()); 11107 String::Utf8Value exception_value2(try_catch.Exception());
9868 CHECK_EQ(0, 11108 CHECK_EQ(0,
9869 strcmp("TypeError: object is not a function", *exception_value2)); 11109 strcmp("TypeError: object is not a function", *exception_value2));
9870 try_catch.Reset(); 11110 try_catch.Reset();
9871 } 11111 }
9872 11112
9873 // Check the case when constructor throws exception. 11113 // Check the case when constructor throws exception.
9874 { 11114 {
9875 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11115 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
9876 instance_template->SetCallAsFunctionHandler(ThrowValue); 11116 instance_template->SetCallAsFunctionHandler(ThrowValue);
9877 Local<Object> instance = instance_template->NewInstance(); 11117 Local<Object> instance =
9878 context->Global()->Set(v8_str("obj3"), instance); 11118 instance_template->NewInstance(context.local()).ToLocalChecked();
11119 CHECK(context->Global()
11120 ->Set(context.local(), v8_str("obj3"), instance)
11121 .FromJust());
9879 v8::TryCatch try_catch(isolate); 11122 v8::TryCatch try_catch(isolate);
9880 Local<Value> value; 11123 Local<Value> value;
9881 CHECK(!try_catch.HasCaught()); 11124 CHECK(!try_catch.HasCaught());
9882 11125
9883 value = CompileRun("new obj3(22)"); 11126 value = CompileRun("new obj3(22)");
9884 CHECK(try_catch.HasCaught()); 11127 CHECK(try_catch.HasCaught());
9885 String::Utf8Value exception_value1(try_catch.Exception()); 11128 String::Utf8Value exception_value1(try_catch.Exception());
9886 CHECK_EQ(0, strcmp("22", *exception_value1)); 11129 CHECK_EQ(0, strcmp("22", *exception_value1));
9887 try_catch.Reset(); 11130 try_catch.Reset();
9888 11131
9889 Local<Value> args[] = {v8_num(23)}; 11132 Local<Value> args[] = {v8_num(23)};
9890 value = instance->CallAsConstructor(1, args); 11133 CHECK(instance->CallAsConstructor(context.local(), 1, args).IsEmpty());
9891 CHECK(try_catch.HasCaught()); 11134 CHECK(try_catch.HasCaught());
9892 String::Utf8Value exception_value2(try_catch.Exception()); 11135 String::Utf8Value exception_value2(try_catch.Exception());
9893 CHECK_EQ(0, strcmp("23", *exception_value2)); 11136 CHECK_EQ(0, strcmp("23", *exception_value2));
9894 try_catch.Reset(); 11137 try_catch.Reset();
9895 } 11138 }
9896 11139
9897 // Check whether constructor returns with an object or non-object. 11140 // Check whether constructor returns with an object or non-object.
9898 { 11141 {
9899 Local<FunctionTemplate> function_template = 11142 Local<FunctionTemplate> function_template =
9900 FunctionTemplate::New(isolate, FakeConstructorCallback); 11143 FunctionTemplate::New(isolate, FakeConstructorCallback);
9901 Local<Function> function = function_template->GetFunction(); 11144 Local<Function> function =
11145 function_template->GetFunction(context.local()).ToLocalChecked();
9902 Local<Object> instance1 = function; 11146 Local<Object> instance1 = function;
9903 context->Global()->Set(v8_str("obj4"), instance1); 11147 CHECK(context->Global()
11148 ->Set(context.local(), v8_str("obj4"), instance1)
11149 .FromJust());
9904 v8::TryCatch try_catch(isolate); 11150 v8::TryCatch try_catch(isolate);
9905 Local<Value> value; 11151 Local<Value> value;
9906 CHECK(!try_catch.HasCaught()); 11152 CHECK(!try_catch.HasCaught());
9907 11153
9908 CHECK(instance1->IsObject()); 11154 CHECK(instance1->IsObject());
9909 CHECK(instance1->IsFunction()); 11155 CHECK(instance1->IsFunction());
9910 11156
9911 value = CompileRun("new obj4(28)"); 11157 value = CompileRun("new obj4(28)");
9912 CHECK(!try_catch.HasCaught()); 11158 CHECK(!try_catch.HasCaught());
9913 CHECK(value->IsObject()); 11159 CHECK(value->IsObject());
9914 11160
9915 Local<Value> args1[] = {v8_num(28)}; 11161 Local<Value> args1[] = {v8_num(28)};
9916 value = instance1->CallAsConstructor(1, args1); 11162 value = instance1->CallAsConstructor(context.local(), 1, args1)
11163 .ToLocalChecked();
9917 CHECK(!try_catch.HasCaught()); 11164 CHECK(!try_catch.HasCaught());
9918 CHECK(value->IsObject()); 11165 CHECK(value->IsObject());
9919 11166
9920 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11167 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
9921 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback); 11168 instance_template->SetCallAsFunctionHandler(FakeConstructorCallback);
9922 Local<Object> instance2 = instance_template->NewInstance(); 11169 Local<Object> instance2 =
9923 context->Global()->Set(v8_str("obj5"), instance2); 11170 instance_template->NewInstance(context.local()).ToLocalChecked();
11171 CHECK(context->Global()
11172 ->Set(context.local(), v8_str("obj5"), instance2)
11173 .FromJust());
9924 CHECK(!try_catch.HasCaught()); 11174 CHECK(!try_catch.HasCaught());
9925 11175
9926 CHECK(instance2->IsObject()); 11176 CHECK(instance2->IsObject());
9927 CHECK(instance2->IsFunction()); 11177 CHECK(instance2->IsFunction());
9928 11178
9929 value = CompileRun("new obj5(28)"); 11179 value = CompileRun("new obj5(28)");
9930 CHECK(!try_catch.HasCaught()); 11180 CHECK(!try_catch.HasCaught());
9931 CHECK(!value->IsObject()); 11181 CHECK(!value->IsObject());
9932 11182
9933 Local<Value> args2[] = {v8_num(28)}; 11183 Local<Value> args2[] = {v8_num(28)};
9934 value = instance2->CallAsConstructor(1, args2); 11184 value = instance2->CallAsConstructor(context.local(), 1, args2)
11185 .ToLocalChecked();
9935 CHECK(!try_catch.HasCaught()); 11186 CHECK(!try_catch.HasCaught());
9936 CHECK(!value->IsObject()); 11187 CHECK(!value->IsObject());
9937 } 11188 }
9938 } 11189 }
9939 11190
9940 11191
9941 THREADED_TEST(FunctionDescriptorException) { 11192 THREADED_TEST(FunctionDescriptorException) {
9942 LocalContext context; 11193 LocalContext context;
9943 v8::Isolate* isolate = context->GetIsolate(); 11194 v8::Isolate* isolate = context->GetIsolate();
9944 v8::HandleScope handle_scope(isolate); 11195 v8::HandleScope handle_scope(isolate);
9945 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 11196 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
9946 templ->SetClassName(v8_str("Fun")); 11197 templ->SetClassName(v8_str("Fun"));
9947 Local<Function> cons = templ->GetFunction(); 11198 Local<Function> cons = templ->GetFunction(context.local()).ToLocalChecked();
9948 context->Global()->Set(v8_str("Fun"), cons); 11199 CHECK(
11200 context->Global()->Set(context.local(), v8_str("Fun"), cons).FromJust());
9949 Local<Value> value = CompileRun( 11201 Local<Value> value = CompileRun(
9950 "function test() {" 11202 "function test() {"
9951 " try {" 11203 " try {"
9952 " (new Fun()).blah()" 11204 " (new Fun()).blah()"
9953 " } catch (e) {" 11205 " } catch (e) {"
9954 " var str = String(e);" 11206 " var str = String(e);"
9955 // " if (str.indexOf('TypeError') == -1) return 1;" 11207 // " if (str.indexOf('TypeError') == -1) return 1;"
9956 // " if (str.indexOf('[object Fun]') != -1) return 2;" 11208 // " if (str.indexOf('[object Fun]') != -1) return 2;"
9957 // " if (str.indexOf('#<Fun>') == -1) return 3;" 11209 // " if (str.indexOf('#<Fun>') == -1) return 3;"
9958 " return 0;" 11210 " return 0;"
9959 " }" 11211 " }"
9960 " return 4;" 11212 " return 4;"
9961 "}" 11213 "}"
9962 "test();"); 11214 "test();");
9963 CHECK_EQ(0, value->Int32Value()); 11215 CHECK_EQ(0, value->Int32Value(context.local()).FromJust());
9964 } 11216 }
9965 11217
9966 11218
9967 THREADED_TEST(EvalAliasedDynamic) { 11219 THREADED_TEST(EvalAliasedDynamic) {
9968 LocalContext current; 11220 LocalContext current;
9969 v8::HandleScope scope(current->GetIsolate()); 11221 v8::HandleScope scope(current->GetIsolate());
9970 11222
9971 // Tests where aliased eval can only be resolved dynamically. 11223 // Tests where aliased eval can only be resolved dynamically.
9972 Local<Script> script = v8_compile( 11224 Local<Script> script = v8_compile(
9973 "function f(x) { " 11225 "function f(x) { "
9974 " var foo = 2;" 11226 " var foo = 2;"
9975 " with (x) { return eval('foo'); }" 11227 " with (x) { return eval('foo'); }"
9976 "}" 11228 "}"
9977 "foo = 0;" 11229 "foo = 0;"
9978 "result1 = f(new Object());" 11230 "result1 = f(new Object());"
9979 "result2 = f(this);" 11231 "result2 = f(this);"
9980 "var x = new Object();" 11232 "var x = new Object();"
9981 "x.eval = function(x) { return 1; };" 11233 "x.eval = function(x) { return 1; };"
9982 "result3 = f(x);"); 11234 "result3 = f(x);");
9983 script->Run(); 11235 script->Run(current.local()).ToLocalChecked();
9984 CHECK_EQ(2, current->Global()->Get(v8_str("result1"))->Int32Value()); 11236 CHECK_EQ(2, current->Global()
9985 CHECK_EQ(0, current->Global()->Get(v8_str("result2"))->Int32Value()); 11237 ->Get(current.local(), v8_str("result1"))
9986 CHECK_EQ(1, current->Global()->Get(v8_str("result3"))->Int32Value()); 11238 .ToLocalChecked()
11239 ->Int32Value(current.local())
11240 .FromJust());
11241 CHECK_EQ(0, current->Global()
11242 ->Get(current.local(), v8_str("result2"))
11243 .ToLocalChecked()
11244 ->Int32Value(current.local())
11245 .FromJust());
11246 CHECK_EQ(1, current->Global()
11247 ->Get(current.local(), v8_str("result3"))
11248 .ToLocalChecked()
11249 ->Int32Value(current.local())
11250 .FromJust());
9987 11251
9988 v8::TryCatch try_catch(current->GetIsolate()); 11252 v8::TryCatch try_catch(current->GetIsolate());
9989 script = v8_compile( 11253 script = v8_compile(
9990 "function f(x) { " 11254 "function f(x) { "
9991 " var bar = 2;" 11255 " var bar = 2;"
9992 " with (x) { return eval('bar'); }" 11256 " with (x) { return eval('bar'); }"
9993 "}" 11257 "}"
9994 "result4 = f(this)"); 11258 "result4 = f(this)");
9995 script->Run(); 11259 script->Run(current.local()).ToLocalChecked();
9996 CHECK(!try_catch.HasCaught()); 11260 CHECK(!try_catch.HasCaught());
9997 CHECK_EQ(2, current->Global()->Get(v8_str("result4"))->Int32Value()); 11261 CHECK_EQ(2, current->Global()
11262 ->Get(current.local(), v8_str("result4"))
11263 .ToLocalChecked()
11264 ->Int32Value(current.local())
11265 .FromJust());
9998 11266
9999 try_catch.Reset(); 11267 try_catch.Reset();
10000 } 11268 }
10001 11269
10002 11270
10003 THREADED_TEST(CrossEval) { 11271 THREADED_TEST(CrossEval) {
10004 v8::HandleScope scope(CcTest::isolate()); 11272 v8::HandleScope scope(CcTest::isolate());
10005 LocalContext other; 11273 LocalContext other;
10006 LocalContext current; 11274 LocalContext current;
10007 11275
10008 Local<String> token = v8_str("<security token>"); 11276 Local<String> token = v8_str("<security token>");
10009 other->SetSecurityToken(token); 11277 other->SetSecurityToken(token);
10010 current->SetSecurityToken(token); 11278 current->SetSecurityToken(token);
10011 11279
10012 // Set up reference from current to other. 11280 // Set up reference from current to other.
10013 current->Global()->Set(v8_str("other"), other->Global()); 11281 CHECK(current->Global()
11282 ->Set(current.local(), v8_str("other"), other->Global())
11283 .FromJust());
10014 11284
10015 // Check that new variables are introduced in other context. 11285 // Check that new variables are introduced in other context.
10016 Local<Script> script = v8_compile("other.eval('var foo = 1234')"); 11286 Local<Script> script = v8_compile("other.eval('var foo = 1234')");
10017 script->Run(); 11287 script->Run(current.local()).ToLocalChecked();
10018 Local<Value> foo = other->Global()->Get(v8_str("foo")); 11288 Local<Value> foo = other->Global()->Get(v8_str("foo"));
10019 CHECK_EQ(1234, foo->Int32Value()); 11289 CHECK_EQ(1234, foo->Int32Value(other.local()).FromJust());
10020 CHECK(!current->Global()->Has(v8_str("foo"))); 11290 CHECK(!current->Global()->Has(v8_str("foo")));
10021 11291
10022 // Check that writing to non-existing properties introduces them in 11292 // Check that writing to non-existing properties introduces them in
10023 // the other context. 11293 // the other context.
10024 script = v8_compile("other.eval('na = 1234')"); 11294 script = v8_compile("other.eval('na = 1234')");
10025 script->Run(); 11295 script->Run();
10026 CHECK_EQ(1234, other->Global()->Get(v8_str("na"))->Int32Value()); 11296 CHECK_EQ(
11297 1234,
11298 other->Global()->Get(v8_str("na"))->Int32Value(other.local()).FromJust());
10027 CHECK(!current->Global()->Has(v8_str("na"))); 11299 CHECK(!current->Global()->Has(v8_str("na")));
10028 11300
10029 // Check that global variables in current context are not visible in other 11301 // Check that global variables in current context are not visible in other
10030 // context. 11302 // context.
10031 v8::TryCatch try_catch(CcTest::isolate()); 11303 v8::TryCatch try_catch(CcTest::isolate());
10032 script = v8_compile("var bar = 42; other.eval('bar');"); 11304 script = v8_compile("var bar = 42; other.eval('bar');");
10033 Local<Value> result = script->Run(); 11305 Local<Value> result = script->Run();
10034 CHECK(try_catch.HasCaught()); 11306 CHECK(try_catch.HasCaught());
10035 try_catch.Reset(); 11307 try_catch.Reset();
10036 11308
10037 // Check that local variables in current context are not visible in other 11309 // Check that local variables in current context are not visible in other
10038 // context. 11310 // context.
10039 script = v8_compile( 11311 script = v8_compile(
10040 "(function() { " 11312 "(function() { "
10041 " var baz = 87;" 11313 " var baz = 87;"
10042 " return other.eval('baz');" 11314 " return other.eval('baz');"
10043 "})();"); 11315 "})();");
10044 result = script->Run(); 11316 result = script->Run();
10045 CHECK(try_catch.HasCaught()); 11317 CHECK(try_catch.HasCaught());
10046 try_catch.Reset(); 11318 try_catch.Reset();
10047 11319
10048 // Check that global variables in the other environment are visible 11320 // Check that global variables in the other environment are visible
10049 // when evaluting code. 11321 // when evaluting code.
10050 other->Global()->Set(v8_str("bis"), v8_num(1234)); 11322 CHECK(other->Global()
11323 ->Set(other.local(), v8_str("bis"), v8_num(1234))
11324 .FromJust());
10051 script = v8_compile("other.eval('bis')"); 11325 script = v8_compile("other.eval('bis')");
10052 CHECK_EQ(1234, script->Run()->Int32Value()); 11326 CHECK_EQ(1234, script->Run()->Int32Value(other.local()).FromJust());
10053 CHECK(!try_catch.HasCaught()); 11327 CHECK(!try_catch.HasCaught());
10054 11328
10055 // Check that the 'this' pointer points to the global object evaluating 11329 // Check that the 'this' pointer points to the global object evaluating
10056 // code. 11330 // code.
10057 other->Global()->Set(v8_str("t"), other->Global()); 11331 CHECK(other->Global()
11332 ->Set(other.local(), v8_str("t"), other->Global())
11333 .FromJust());
10058 script = v8_compile("other.eval('this == t')"); 11334 script = v8_compile("other.eval('this == t')");
10059 result = script->Run(); 11335 result = script->Run();
10060 CHECK(result->IsTrue()); 11336 CHECK(result->IsTrue());
10061 CHECK(!try_catch.HasCaught()); 11337 CHECK(!try_catch.HasCaught());
10062 11338
10063 // Check that variables introduced in with-statement are not visible in 11339 // Check that variables introduced in with-statement are not visible in
10064 // other context. 11340 // other context.
10065 script = v8_compile("with({x:2}){other.eval('x')}"); 11341 script = v8_compile("with({x:2}){other.eval('x')}");
10066 result = script->Run(); 11342 result = script->Run();
10067 CHECK(try_catch.HasCaught()); 11343 CHECK(try_catch.HasCaught());
(...skipping 11 matching lines...) Expand all
10079 // its global proxy works. 11355 // its global proxy works.
10080 THREADED_TEST(EvalInDetachedGlobal) { 11356 THREADED_TEST(EvalInDetachedGlobal) {
10081 v8::Isolate* isolate = CcTest::isolate(); 11357 v8::Isolate* isolate = CcTest::isolate();
10082 v8::HandleScope scope(isolate); 11358 v8::HandleScope scope(isolate);
10083 11359
10084 v8::Local<Context> context0 = Context::New(isolate); 11360 v8::Local<Context> context0 = Context::New(isolate);
10085 v8::Local<Context> context1 = Context::New(isolate); 11361 v8::Local<Context> context1 = Context::New(isolate);
10086 11362
10087 // Set up function in context0 that uses eval from context0. 11363 // Set up function in context0 that uses eval from context0.
10088 context0->Enter(); 11364 context0->Enter();
10089 v8::Handle<v8::Value> fun = CompileRun( 11365 v8::Local<v8::Value> fun = CompileRun(
10090 "var x = 42;" 11366 "var x = 42;"
10091 "(function() {" 11367 "(function() {"
10092 " var e = eval;" 11368 " var e = eval;"
10093 " return function(s) { return e(s); }" 11369 " return function(s) { return e(s); }"
10094 "})()"); 11370 "})()");
10095 context0->Exit(); 11371 context0->Exit();
10096 11372
10097 // Put the function into context1 and call it before and after 11373 // Put the function into context1 and call it before and after
10098 // detaching the global. Before detaching, the call succeeds and 11374 // detaching the global. Before detaching, the call succeeds and
10099 // after detaching and exception is thrown. 11375 // after detaching and exception is thrown.
10100 context1->Enter(); 11376 context1->Enter();
10101 context1->Global()->Set(v8_str("fun"), fun); 11377 CHECK(context1->Global()->Set(context1, v8_str("fun"), fun).FromJust());
10102 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); 11378 v8::Local<v8::Value> x_value = CompileRun("fun('x')");
10103 CHECK_EQ(42, x_value->Int32Value()); 11379 CHECK_EQ(42, x_value->Int32Value(context1).FromJust());
10104 context0->DetachGlobal(); 11380 context0->DetachGlobal();
10105 v8::TryCatch catcher(isolate); 11381 v8::TryCatch catcher(isolate);
10106 x_value = CompileRun("fun('x')"); 11382 x_value = CompileRun("fun('x')");
10107 CHECK_EQ(42, x_value->Int32Value()); 11383 CHECK_EQ(42, x_value->Int32Value(context1).FromJust());
10108 context1->Exit(); 11384 context1->Exit();
10109 } 11385 }
10110 11386
10111 11387
10112 THREADED_TEST(CrossLazyLoad) { 11388 THREADED_TEST(CrossLazyLoad) {
10113 v8::HandleScope scope(CcTest::isolate()); 11389 v8::HandleScope scope(CcTest::isolate());
10114 LocalContext other; 11390 LocalContext other;
10115 LocalContext current; 11391 LocalContext current;
10116 11392
10117 Local<String> token = v8_str("<security token>"); 11393 Local<String> token = v8_str("<security token>");
10118 other->SetSecurityToken(token); 11394 other->SetSecurityToken(token);
10119 current->SetSecurityToken(token); 11395 current->SetSecurityToken(token);
10120 11396
10121 // Set up reference from current to other. 11397 // Set up reference from current to other.
10122 current->Global()->Set(v8_str("other"), other->Global()); 11398 CHECK(current->Global()
11399 ->Set(current.local(), v8_str("other"), other->Global())
11400 .FromJust());
10123 11401
10124 // Trigger lazy loading in other context. 11402 // Trigger lazy loading in other context.
10125 Local<Script> script = v8_compile("other.eval('new Date(42)')"); 11403 Local<Script> script = v8_compile("other.eval('new Date(42)')");
10126 Local<Value> value = script->Run(); 11404 Local<Value> value = script->Run();
10127 CHECK_EQ(42.0, value->NumberValue()); 11405 CHECK_EQ(42.0, value->NumberValue());
10128 } 11406 }
10129 11407
10130 11408
10131 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) { 11409 static void call_as_function(const v8::FunctionCallbackInfo<v8::Value>& args) {
10132 ApiTestFuzzer::Fuzz(); 11410 ApiTestFuzzer::Fuzz();
10133 if (args.IsConstructCall()) { 11411 if (args.IsConstructCall()) {
10134 if (args[0]->IsInt32()) { 11412 if (args[0]->IsInt32()) {
10135 args.GetReturnValue().Set(v8_num(-args[0]->Int32Value())); 11413 args.GetReturnValue().Set(
11414 v8_num(-args[0]
11415 ->Int32Value(args.GetIsolate()->GetCurrentContext())
11416 .FromJust()));
10136 return; 11417 return;
10137 } 11418 }
10138 } 11419 }
10139 11420
10140 args.GetReturnValue().Set(args[0]); 11421 args.GetReturnValue().Set(args[0]);
10141 } 11422 }
10142 11423
10143 11424
10144 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { 11425 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) {
10145 args.GetReturnValue().Set(args.This()); 11426 args.GetReturnValue().Set(args.This());
10146 } 11427 }
10147 11428
10148 11429
10149 // Test that a call handler can be set for objects which will allow 11430 // 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 11431 // non-function objects created through the API to be called as
10151 // functions. 11432 // functions.
10152 THREADED_TEST(CallAsFunction) { 11433 THREADED_TEST(CallAsFunction) {
10153 LocalContext context; 11434 LocalContext context;
10154 v8::Isolate* isolate = context->GetIsolate(); 11435 v8::Isolate* isolate = context->GetIsolate();
10155 v8::HandleScope scope(isolate); 11436 v8::HandleScope scope(isolate);
10156 11437
10157 { 11438 {
10158 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 11439 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
10159 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); 11440 Local<ObjectTemplate> instance_template = t->InstanceTemplate();
10160 instance_template->SetCallAsFunctionHandler(call_as_function); 11441 instance_template->SetCallAsFunctionHandler(call_as_function);
10161 Local<v8::Object> instance = t->GetFunction()->NewInstance(); 11442 Local<v8::Object> instance = t->GetFunction(context.local())
10162 context->Global()->Set(v8_str("obj"), instance); 11443 .ToLocalChecked()
11444 ->NewInstance(context.local())
11445 .ToLocalChecked();
11446 CHECK(context->Global()
11447 ->Set(context.local(), v8_str("obj"), instance)
11448 .FromJust());
10163 v8::TryCatch try_catch(isolate); 11449 v8::TryCatch try_catch(isolate);
10164 Local<Value> value; 11450 Local<Value> value;
10165 CHECK(!try_catch.HasCaught()); 11451 CHECK(!try_catch.HasCaught());
10166 11452
10167 value = CompileRun("obj(42)"); 11453 value = CompileRun("obj(42)");
10168 CHECK(!try_catch.HasCaught()); 11454 CHECK(!try_catch.HasCaught());
10169 CHECK_EQ(42, value->Int32Value()); 11455 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
10170 11456
10171 value = CompileRun("(function(o){return o(49)})(obj)"); 11457 value = CompileRun("(function(o){return o(49)})(obj)");
10172 CHECK(!try_catch.HasCaught()); 11458 CHECK(!try_catch.HasCaught());
10173 CHECK_EQ(49, value->Int32Value()); 11459 CHECK_EQ(49, value->Int32Value(context.local()).FromJust());
10174 11460
10175 // test special case of call as function 11461 // test special case of call as function
10176 value = CompileRun("[obj]['0'](45)"); 11462 value = CompileRun("[obj]['0'](45)");
10177 CHECK(!try_catch.HasCaught()); 11463 CHECK(!try_catch.HasCaught());
10178 CHECK_EQ(45, value->Int32Value()); 11464 CHECK_EQ(45, value->Int32Value(context.local()).FromJust());
10179 11465
10180 value = CompileRun( 11466 value = CompileRun(
10181 "obj.call = Function.prototype.call;" 11467 "obj.call = Function.prototype.call;"
10182 "obj.call(null, 87)"); 11468 "obj.call(null, 87)");
10183 CHECK(!try_catch.HasCaught()); 11469 CHECK(!try_catch.HasCaught());
10184 CHECK_EQ(87, value->Int32Value()); 11470 CHECK_EQ(87, value->Int32Value(context.local()).FromJust());
10185 11471
10186 // Regression tests for bug #1116356: Calling call through call/apply 11472 // Regression tests for bug #1116356: Calling call through call/apply
10187 // must work for non-function receivers. 11473 // must work for non-function receivers.
10188 const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])"; 11474 const char* apply_99 = "Function.prototype.call.apply(obj, [this, 99])";
10189 value = CompileRun(apply_99); 11475 value = CompileRun(apply_99);
10190 CHECK(!try_catch.HasCaught()); 11476 CHECK(!try_catch.HasCaught());
10191 CHECK_EQ(99, value->Int32Value()); 11477 CHECK_EQ(99, value->Int32Value(context.local()).FromJust());
10192 11478
10193 const char* call_17 = "Function.prototype.call.call(obj, this, 17)"; 11479 const char* call_17 = "Function.prototype.call.call(obj, this, 17)";
10194 value = CompileRun(call_17); 11480 value = CompileRun(call_17);
10195 CHECK(!try_catch.HasCaught()); 11481 CHECK(!try_catch.HasCaught());
10196 CHECK_EQ(17, value->Int32Value()); 11482 CHECK_EQ(17, value->Int32Value(context.local()).FromJust());
10197 11483
10198 // Check that the call-as-function handler can be called through 11484 // Check that the call-as-function handler can be called through
10199 // new. 11485 // new.
10200 value = CompileRun("new obj(43)"); 11486 value = CompileRun("new obj(43)");
10201 CHECK(!try_catch.HasCaught()); 11487 CHECK(!try_catch.HasCaught());
10202 CHECK_EQ(-43, value->Int32Value()); 11488 CHECK_EQ(-43, value->Int32Value(context.local()).FromJust());
10203 11489
10204 // Check that the call-as-function handler can be called through 11490 // Check that the call-as-function handler can be called through
10205 // the API. 11491 // the API.
10206 v8::Handle<Value> args[] = {v8_num(28)}; 11492 v8::Local<Value> args[] = {v8_num(28)};
10207 value = instance->CallAsFunction(instance, 1, args); 11493 value = instance->CallAsFunction(instance, 1, args);
10208 CHECK(!try_catch.HasCaught()); 11494 CHECK(!try_catch.HasCaught());
10209 CHECK_EQ(28, value->Int32Value()); 11495 CHECK_EQ(28, value->Int32Value(context.local()).FromJust());
10210 } 11496 }
10211 11497
10212 { 11498 {
10213 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 11499 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
10214 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); 11500 Local<ObjectTemplate> instance_template(t->InstanceTemplate());
10215 USE(instance_template); 11501 USE(instance_template);
10216 Local<v8::Object> instance = t->GetFunction()->NewInstance(); 11502 Local<v8::Object> instance = t->GetFunction(context.local())
10217 context->Global()->Set(v8_str("obj2"), instance); 11503 .ToLocalChecked()
11504 ->NewInstance(context.local())
11505 .ToLocalChecked();
11506 CHECK(context->Global()
11507 ->Set(context.local(), v8_str("obj2"), instance)
11508 .FromJust());
10218 v8::TryCatch try_catch(isolate); 11509 v8::TryCatch try_catch(isolate);
10219 Local<Value> value; 11510 Local<Value> value;
10220 CHECK(!try_catch.HasCaught()); 11511 CHECK(!try_catch.HasCaught());
10221 11512
10222 // Call an object without call-as-function handler through the JS 11513 // Call an object without call-as-function handler through the JS
10223 value = CompileRun("obj2(28)"); 11514 value = CompileRun("obj2(28)");
10224 CHECK(value.IsEmpty()); 11515 CHECK(value.IsEmpty());
10225 CHECK(try_catch.HasCaught()); 11516 CHECK(try_catch.HasCaught());
10226 String::Utf8Value exception_value1(try_catch.Exception()); 11517 String::Utf8Value exception_value1(try_catch.Exception());
10227 // TODO(verwaest): Better message 11518 // TODO(verwaest): Better message
10228 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1)); 11519 CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1));
10229 try_catch.Reset(); 11520 try_catch.Reset();
10230 11521
10231 // Call an object without call-as-function handler through the API 11522 // Call an object without call-as-function handler through the API
10232 value = CompileRun("obj2(28)"); 11523 value = CompileRun("obj2(28)");
10233 v8::Handle<Value> args[] = {v8_num(28)}; 11524 v8::Local<Value> args[] = {v8_num(28)};
10234 value = instance->CallAsFunction(instance, 1, args); 11525 value = instance->CallAsFunction(instance, 1, args);
10235 CHECK(value.IsEmpty()); 11526 CHECK(value.IsEmpty());
10236 CHECK(try_catch.HasCaught()); 11527 CHECK(try_catch.HasCaught());
10237 String::Utf8Value exception_value2(try_catch.Exception()); 11528 String::Utf8Value exception_value2(try_catch.Exception());
10238 CHECK_EQ(0, 11529 CHECK_EQ(0,
10239 strcmp("TypeError: object is not a function", *exception_value2)); 11530 strcmp("TypeError: object is not a function", *exception_value2));
10240 try_catch.Reset(); 11531 try_catch.Reset();
10241 } 11532 }
10242 11533
10243 { 11534 {
10244 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 11535 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
10245 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); 11536 Local<ObjectTemplate> instance_template = t->InstanceTemplate();
10246 instance_template->SetCallAsFunctionHandler(ThrowValue); 11537 instance_template->SetCallAsFunctionHandler(ThrowValue);
10247 Local<v8::Object> instance = t->GetFunction()->NewInstance(); 11538 Local<v8::Object> instance = t->GetFunction(context.local())
10248 context->Global()->Set(v8_str("obj3"), instance); 11539 .ToLocalChecked()
11540 ->NewInstance(context.local())
11541 .ToLocalChecked();
11542 CHECK(context->Global()
11543 ->Set(context.local(), v8_str("obj3"), instance)
11544 .FromJust());
10249 v8::TryCatch try_catch(isolate); 11545 v8::TryCatch try_catch(isolate);
10250 Local<Value> value; 11546 Local<Value> value;
10251 CHECK(!try_catch.HasCaught()); 11547 CHECK(!try_catch.HasCaught());
10252 11548
10253 // Catch the exception which is thrown by call-as-function handler 11549 // Catch the exception which is thrown by call-as-function handler
10254 value = CompileRun("obj3(22)"); 11550 value = CompileRun("obj3(22)");
10255 CHECK(try_catch.HasCaught()); 11551 CHECK(try_catch.HasCaught());
10256 String::Utf8Value exception_value1(try_catch.Exception()); 11552 String::Utf8Value exception_value1(try_catch.Exception());
10257 CHECK_EQ(0, strcmp("22", *exception_value1)); 11553 CHECK_EQ(0, strcmp("22", *exception_value1));
10258 try_catch.Reset(); 11554 try_catch.Reset();
10259 11555
10260 v8::Handle<Value> args[] = {v8_num(23)}; 11556 v8::Local<Value> args[] = {v8_num(23)};
10261 value = instance->CallAsFunction(instance, 1, args); 11557 value = instance->CallAsFunction(instance, 1, args);
10262 CHECK(try_catch.HasCaught()); 11558 CHECK(try_catch.HasCaught());
10263 String::Utf8Value exception_value2(try_catch.Exception()); 11559 String::Utf8Value exception_value2(try_catch.Exception());
10264 CHECK_EQ(0, strcmp("23", *exception_value2)); 11560 CHECK_EQ(0, strcmp("23", *exception_value2));
10265 try_catch.Reset(); 11561 try_catch.Reset();
10266 } 11562 }
10267 11563
10268 { 11564 {
10269 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); 11565 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate);
10270 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); 11566 Local<ObjectTemplate> instance_template = t->InstanceTemplate();
10271 instance_template->SetCallAsFunctionHandler(ReturnThis); 11567 instance_template->SetCallAsFunctionHandler(ReturnThis);
10272 Local<v8::Object> instance = t->GetFunction()->NewInstance(); 11568 Local<v8::Object> instance = t->GetFunction(context.local())
11569 .ToLocalChecked()
11570 ->NewInstance(context.local())
11571 .ToLocalChecked();
10273 11572
10274 Local<v8::Value> a1 = 11573 Local<v8::Value> a1 =
10275 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL); 11574 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL);
10276 CHECK(a1->StrictEquals(instance)); 11575 CHECK(a1->StrictEquals(instance));
10277 Local<v8::Value> a2 = instance->CallAsFunction(v8::Null(isolate), 0, NULL); 11576 Local<v8::Value> a2 = instance->CallAsFunction(v8::Null(isolate), 0, NULL);
10278 CHECK(a2->StrictEquals(instance)); 11577 CHECK(a2->StrictEquals(instance));
10279 Local<v8::Value> a3 = instance->CallAsFunction(v8_num(42), 0, NULL); 11578 Local<v8::Value> a3 = instance->CallAsFunction(v8_num(42), 0, NULL);
10280 CHECK(a3->StrictEquals(instance)); 11579 CHECK(a3->StrictEquals(instance));
10281 Local<v8::Value> a4 = instance->CallAsFunction(v8_str("hello"), 0, NULL); 11580 Local<v8::Value> a4 = instance->CallAsFunction(v8_str("hello"), 0, NULL);
10282 CHECK(a4->StrictEquals(instance)); 11581 CHECK(a4->StrictEquals(instance));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
10336 11635
10337 // Check whether a non-function object is callable. 11636 // Check whether a non-function object is callable.
10338 THREADED_TEST(CallableObject) { 11637 THREADED_TEST(CallableObject) {
10339 LocalContext context; 11638 LocalContext context;
10340 v8::Isolate* isolate = context->GetIsolate(); 11639 v8::Isolate* isolate = context->GetIsolate();
10341 v8::HandleScope scope(isolate); 11640 v8::HandleScope scope(isolate);
10342 11641
10343 { 11642 {
10344 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11643 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10345 instance_template->SetCallAsFunctionHandler(call_as_function); 11644 instance_template->SetCallAsFunctionHandler(call_as_function);
10346 Local<Object> instance = instance_template->NewInstance(); 11645 Local<Object> instance =
11646 instance_template->NewInstance(context.local()).ToLocalChecked();
10347 v8::TryCatch try_catch(isolate); 11647 v8::TryCatch try_catch(isolate);
10348 11648
10349 CHECK(instance->IsCallable()); 11649 CHECK(instance->IsCallable());
10350 CHECK(!try_catch.HasCaught()); 11650 CHECK(!try_catch.HasCaught());
10351 } 11651 }
10352 11652
10353 { 11653 {
10354 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate); 11654 Local<ObjectTemplate> instance_template = ObjectTemplate::New(isolate);
10355 Local<Object> instance = instance_template->NewInstance(); 11655 Local<Object> instance =
11656 instance_template->NewInstance(context.local()).ToLocalChecked();
10356 v8::TryCatch try_catch(isolate); 11657 v8::TryCatch try_catch(isolate);
10357 11658
10358 CHECK(!instance->IsCallable()); 11659 CHECK(!instance->IsCallable());
10359 CHECK(!try_catch.HasCaught()); 11660 CHECK(!try_catch.HasCaught());
10360 } 11661 }
10361 11662
10362 { 11663 {
10363 Local<FunctionTemplate> function_template = 11664 Local<FunctionTemplate> function_template =
10364 FunctionTemplate::New(isolate, call_as_function); 11665 FunctionTemplate::New(isolate, call_as_function);
10365 Local<Function> function = function_template->GetFunction(); 11666 Local<Function> function =
11667 function_template->GetFunction(context.local()).ToLocalChecked();
10366 Local<Object> instance = function; 11668 Local<Object> instance = function;
10367 v8::TryCatch try_catch(isolate); 11669 v8::TryCatch try_catch(isolate);
10368 11670
10369 CHECK(instance->IsCallable()); 11671 CHECK(instance->IsCallable());
10370 CHECK(!try_catch.HasCaught()); 11672 CHECK(!try_catch.HasCaught());
10371 } 11673 }
10372 11674
10373 { 11675 {
10374 Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate); 11676 Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate);
10375 Local<Function> function = function_template->GetFunction(); 11677 Local<Function> function =
11678 function_template->GetFunction(context.local()).ToLocalChecked();
10376 Local<Object> instance = function; 11679 Local<Object> instance = function;
10377 v8::TryCatch try_catch(isolate); 11680 v8::TryCatch try_catch(isolate);
10378 11681
10379 CHECK(instance->IsCallable()); 11682 CHECK(instance->IsCallable());
10380 CHECK(!try_catch.HasCaught()); 11683 CHECK(!try_catch.HasCaught());
10381 } 11684 }
10382 } 11685 }
10383 11686
10384 11687
10385 static int Recurse(v8::Isolate* isolate, int depth, int iterations) { 11688 static int Recurse(v8::Isolate* isolate, int depth, int iterations) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
10436 } 11739 }
10437 11740
10438 static void FastApiCallback_TrivialSignature( 11741 static void FastApiCallback_TrivialSignature(
10439 const v8::FunctionCallbackInfo<v8::Value>& args) { 11742 const v8::FunctionCallbackInfo<v8::Value>& args) {
10440 ApiTestFuzzer::Fuzz(); 11743 ApiTestFuzzer::Fuzz();
10441 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature)); 11744 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_TrivialSignature));
10442 v8::Isolate* isolate = CcTest::isolate(); 11745 v8::Isolate* isolate = CcTest::isolate();
10443 CHECK_EQ(isolate, args.GetIsolate()); 11746 CHECK_EQ(isolate, args.GetIsolate());
10444 CHECK(args.This()->Equals(args.Holder())); 11747 CHECK(args.This()->Equals(args.Holder()));
10445 CHECK(args.Data()->Equals(v8_str("method_data"))); 11748 CHECK(args.Data()->Equals(v8_str("method_data")));
10446 args.GetReturnValue().Set(args[0]->Int32Value() + 1); 11749 args.GetReturnValue().Set(
11750 args[0]->Int32Value(isolate->GetCurrentContext()).FromJust() + 1);
10447 } 11751 }
10448 11752
10449 static void FastApiCallback_SimpleSignature( 11753 static void FastApiCallback_SimpleSignature(
10450 const v8::FunctionCallbackInfo<v8::Value>& args) { 11754 const v8::FunctionCallbackInfo<v8::Value>& args) {
10451 ApiTestFuzzer::Fuzz(); 11755 ApiTestFuzzer::Fuzz();
10452 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature)); 11756 CheckReturnValue(args, FUNCTION_ADDR(FastApiCallback_SimpleSignature));
10453 v8::Isolate* isolate = CcTest::isolate(); 11757 v8::Isolate* isolate = CcTest::isolate();
10454 CHECK_EQ(isolate, args.GetIsolate()); 11758 CHECK_EQ(isolate, args.GetIsolate());
10455 CHECK(args.This()->GetPrototype()->Equals(args.Holder())); 11759 CHECK(args.This()->GetPrototype()->Equals(args.Holder()));
10456 CHECK(args.Data()->Equals(v8_str("method_data"))); 11760 CHECK(args.Data()->Equals(v8_str("method_data")));
10457 // Note, we're using HasRealNamedProperty instead of Has to avoid 11761 // Note, we're using HasRealNamedProperty instead of Has to avoid
10458 // invoking the interceptor again. 11762 // invoking the interceptor again.
10459 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo"))); 11763 CHECK(args.Holder()->HasRealNamedProperty(v8_str("foo")));
10460 args.GetReturnValue().Set(args[0]->Int32Value() + 1); 11764 args.GetReturnValue().Set(
11765 args[0]->Int32Value(isolate->GetCurrentContext()).FromJust() + 1);
10461 } 11766 }
10462 11767
10463 11768
10464 // Helper to maximize the odds of object moving. 11769 // Helper to maximize the odds of object moving.
10465 static void GenerateSomeGarbage() { 11770 static void GenerateSomeGarbage() {
10466 CompileRun( 11771 CompileRun(
10467 "var garbage;" 11772 "var garbage;"
10468 "for (var i = 0; i < 1000; i++) {" 11773 "for (var i = 0; i < 1000; i++) {"
10469 " garbage = [1/i, \"garbage\" + i, garbage, {foo: garbage}];" 11774 " garbage = [1/i, \"garbage\" + i, garbage, {foo: garbage}];"
10470 "}" 11775 "}"
10471 "garbage = undefined;"); 11776 "garbage = undefined;");
10472 } 11777 }
10473 11778
10474 11779
10475 void DirectApiCallback(const v8::FunctionCallbackInfo<v8::Value>& args) { 11780 void DirectApiCallback(const v8::FunctionCallbackInfo<v8::Value>& args) {
10476 static int count = 0; 11781 static int count = 0;
10477 if (count++ % 3 == 0) { 11782 if (count++ % 3 == 0) {
10478 CcTest::heap()->CollectAllGarbage(); 11783 CcTest::heap()->CollectAllGarbage();
10479 // This should move the stub 11784 // This should move the stub
10480 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed 11785 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed
10481 } 11786 }
10482 } 11787 }
10483 11788
10484 11789
10485 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { 11790 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) {
10486 LocalContext context; 11791 LocalContext context;
10487 v8::Isolate* isolate = context->GetIsolate(); 11792 v8::Isolate* isolate = context->GetIsolate();
10488 v8::HandleScope scope(isolate); 11793 v8::HandleScope scope(isolate);
10489 v8::Handle<v8::ObjectTemplate> nativeobject_templ = 11794 v8::Local<v8::ObjectTemplate> nativeobject_templ =
10490 v8::ObjectTemplate::New(isolate); 11795 v8::ObjectTemplate::New(isolate);
10491 nativeobject_templ->Set(isolate, "callback", 11796 nativeobject_templ->Set(isolate, "callback",
10492 v8::FunctionTemplate::New(isolate, 11797 v8::FunctionTemplate::New(isolate,
10493 DirectApiCallback)); 11798 DirectApiCallback));
10494 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); 11799 v8::Local<v8::Object> nativeobject_obj =
10495 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); 11800 nativeobject_templ->NewInstance(context.local()).ToLocalChecked();
11801 CHECK(context->Global()
11802 ->Set(context.local(), v8_str("nativeobject"), nativeobject_obj)
11803 .FromJust());
10496 // call the api function multiple times to ensure direct call stub creation. 11804 // call the api function multiple times to ensure direct call stub creation.
10497 CompileRun( 11805 CompileRun(
10498 "function f() {" 11806 "function f() {"
10499 " for (var i = 1; i <= 30; i++) {" 11807 " for (var i = 1; i <= 30; i++) {"
10500 " nativeobject.callback();" 11808 " nativeobject.callback();"
10501 " }" 11809 " }"
10502 "}" 11810 "}"
10503 "f();"); 11811 "f();");
10504 } 11812 }
10505 11813
10506 11814
10507 void ThrowingDirectApiCallback( 11815 void ThrowingDirectApiCallback(
10508 const v8::FunctionCallbackInfo<v8::Value>& args) { 11816 const v8::FunctionCallbackInfo<v8::Value>& args) {
10509 args.GetIsolate()->ThrowException(v8_str("g")); 11817 args.GetIsolate()->ThrowException(v8_str("g"));
10510 } 11818 }
10511 11819
10512 11820
10513 THREADED_TEST(CallICFastApi_DirectCall_Throw) { 11821 THREADED_TEST(CallICFastApi_DirectCall_Throw) {
10514 LocalContext context; 11822 LocalContext context;
10515 v8::Isolate* isolate = context->GetIsolate(); 11823 v8::Isolate* isolate = context->GetIsolate();
10516 v8::HandleScope scope(isolate); 11824 v8::HandleScope scope(isolate);
10517 v8::Handle<v8::ObjectTemplate> nativeobject_templ = 11825 v8::Local<v8::ObjectTemplate> nativeobject_templ =
10518 v8::ObjectTemplate::New(isolate); 11826 v8::ObjectTemplate::New(isolate);
10519 nativeobject_templ->Set(isolate, "callback", 11827 nativeobject_templ->Set(isolate, "callback",
10520 v8::FunctionTemplate::New(isolate, 11828 v8::FunctionTemplate::New(isolate,
10521 ThrowingDirectApiCallback)); 11829 ThrowingDirectApiCallback));
10522 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); 11830 v8::Local<v8::Object> nativeobject_obj =
10523 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); 11831 nativeobject_templ->NewInstance(context.local()).ToLocalChecked();
11832 CHECK(context->Global()
11833 ->Set(context.local(), v8_str("nativeobject"), nativeobject_obj)
11834 .FromJust());
10524 // call the api function multiple times to ensure direct call stub creation. 11835 // call the api function multiple times to ensure direct call stub creation.
10525 v8::Handle<Value> result = CompileRun( 11836 v8::Local<Value> result = CompileRun(
10526 "var result = '';" 11837 "var result = '';"
10527 "function f() {" 11838 "function f() {"
10528 " for (var i = 1; i <= 5; i++) {" 11839 " for (var i = 1; i <= 5; i++) {"
10529 " try { nativeobject.callback(); } catch (e) { result += e; }" 11840 " try { nativeobject.callback(); } catch (e) { result += e; }"
10530 " }" 11841 " }"
10531 "}" 11842 "}"
10532 "f(); result;"); 11843 "f(); result;");
10533 CHECK(v8_str("ggggg")->Equals(result)); 11844 CHECK(v8_str("ggggg")->Equals(result));
10534 } 11845 }
10535 11846
10536 11847
10537 static int p_getter_count_3; 11848 static int p_getter_count_3;
10538 11849
10539 11850
10540 static Handle<Value> DoDirectGetter() { 11851 static Local<Value> DoDirectGetter() {
10541 if (++p_getter_count_3 % 3 == 0) { 11852 if (++p_getter_count_3 % 3 == 0) {
10542 CcTest::heap()->CollectAllGarbage(); 11853 CcTest::heap()->CollectAllGarbage();
10543 GenerateSomeGarbage(); 11854 GenerateSomeGarbage();
10544 } 11855 }
10545 return v8_str("Direct Getter Result"); 11856 return v8_str("Direct Getter Result");
10546 } 11857 }
10547 11858
10548 11859
10549 static void DirectGetterCallback( 11860 static void DirectGetterCallback(
10550 Local<String> name, 11861 Local<String> name,
10551 const v8::PropertyCallbackInfo<v8::Value>& info) { 11862 const v8::PropertyCallbackInfo<v8::Value>& info) {
10552 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback)); 11863 CheckReturnValue(info, FUNCTION_ADDR(DirectGetterCallback));
10553 info.GetReturnValue().Set(DoDirectGetter()); 11864 info.GetReturnValue().Set(DoDirectGetter());
10554 } 11865 }
10555 11866
10556 11867
10557 template<typename Accessor> 11868 template<typename Accessor>
10558 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) { 11869 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) {
10559 LocalContext context; 11870 LocalContext context;
10560 v8::Isolate* isolate = context->GetIsolate(); 11871 v8::Isolate* isolate = context->GetIsolate();
10561 v8::HandleScope scope(isolate); 11872 v8::HandleScope scope(isolate);
10562 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); 11873 v8::Local<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate);
10563 obj->SetAccessor(v8_str("p1"), accessor); 11874 obj->SetAccessor(v8_str("p1"), accessor);
10564 context->Global()->Set(v8_str("o1"), obj->NewInstance()); 11875 CHECK(context->Global()
11876 ->Set(context.local(), v8_str("o1"),
11877 obj->NewInstance(context.local()).ToLocalChecked())
11878 .FromJust());
10565 p_getter_count_3 = 0; 11879 p_getter_count_3 = 0;
10566 v8::Handle<v8::Value> result = CompileRun( 11880 v8::Local<v8::Value> result = CompileRun(
10567 "function f() {" 11881 "function f() {"
10568 " for (var i = 0; i < 30; i++) o1.p1;" 11882 " for (var i = 0; i < 30; i++) o1.p1;"
10569 " return o1.p1" 11883 " return o1.p1"
10570 "}" 11884 "}"
10571 "f();"); 11885 "f();");
10572 CHECK(v8_str("Direct Getter Result")->Equals(result)); 11886 CHECK(v8_str("Direct Getter Result")->Equals(result));
10573 CHECK_EQ(31, p_getter_count_3); 11887 CHECK_EQ(31, p_getter_count_3);
10574 } 11888 }
10575 11889
10576 11890
10577 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { 11891 THREADED_PROFILED_TEST(LoadICFastApi_DirectCall_GCMoveStub) {
10578 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback); 11892 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback);
10579 } 11893 }
10580 11894
10581 11895
10582 void ThrowingDirectGetterCallback( 11896 void ThrowingDirectGetterCallback(
10583 Local<String> name, 11897 Local<String> name,
10584 const v8::PropertyCallbackInfo<v8::Value>& info) { 11898 const v8::PropertyCallbackInfo<v8::Value>& info) {
10585 info.GetIsolate()->ThrowException(v8_str("g")); 11899 info.GetIsolate()->ThrowException(v8_str("g"));
10586 } 11900 }
10587 11901
10588 11902
10589 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { 11903 THREADED_TEST(LoadICFastApi_DirectCall_Throw) {
10590 LocalContext context; 11904 LocalContext context;
10591 v8::Isolate* isolate = context->GetIsolate(); 11905 v8::Isolate* isolate = context->GetIsolate();
10592 v8::HandleScope scope(isolate); 11906 v8::HandleScope scope(isolate);
10593 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate); 11907 v8::Local<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(isolate);
10594 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback); 11908 obj->SetAccessor(v8_str("p1"), ThrowingDirectGetterCallback);
10595 context->Global()->Set(v8_str("o1"), obj->NewInstance()); 11909 CHECK(context->Global()
10596 v8::Handle<Value> result = CompileRun( 11910 ->Set(context.local(), v8_str("o1"),
11911 obj->NewInstance(context.local()).ToLocalChecked())
11912 .FromJust());
11913 v8::Local<Value> result = CompileRun(
10597 "var result = '';" 11914 "var result = '';"
10598 "for (var i = 0; i < 5; i++) {" 11915 "for (var i = 0; i < 5; i++) {"
10599 " try { o1.p1; } catch (e) { result += e; }" 11916 " try { o1.p1; } catch (e) { result += e; }"
10600 "}" 11917 "}"
10601 "result;"); 11918 "result;");
10602 CHECK(v8_str("ggggg")->Equals(result)); 11919 CHECK(v8_str("ggggg")->Equals(result));
10603 } 11920 }
10604 11921
10605 11922
10606 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { 11923 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) {
10607 int interceptor_call_count = 0; 11924 int interceptor_call_count = 0;
10608 v8::Isolate* isolate = CcTest::isolate(); 11925 v8::Isolate* isolate = CcTest::isolate();
10609 v8::HandleScope scope(isolate); 11926 v8::HandleScope scope(isolate);
10610 v8::Handle<v8::FunctionTemplate> fun_templ = 11927 v8::Local<v8::FunctionTemplate> fun_templ =
10611 v8::FunctionTemplate::New(isolate); 11928 v8::FunctionTemplate::New(isolate);
10612 v8::Handle<v8::FunctionTemplate> method_templ = 11929 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10613 v8::FunctionTemplate::New(isolate, 11930 isolate, FastApiCallback_TrivialSignature, v8_str("method_data"),
10614 FastApiCallback_TrivialSignature, 11931 v8::Local<v8::Signature>());
10615 v8_str("method_data"), 11932 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); 11933 proto_templ->Set(v8_str("method"), method_templ);
10619 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11934 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10620 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 11935 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10621 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 11936 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10622 v8::External::New(isolate, &interceptor_call_count))); 11937 v8::External::New(isolate, &interceptor_call_count)));
10623 LocalContext context; 11938 LocalContext context;
10624 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 11939 v8::Local<v8::Function> fun =
11940 fun_templ->GetFunction(context.local()).ToLocalChecked();
10625 GenerateSomeGarbage(); 11941 GenerateSomeGarbage();
10626 context->Global()->Set(v8_str("o"), fun->NewInstance()); 11942 CHECK(context->Global()
11943 ->Set(context.local(), v8_str("o"),
11944 fun->NewInstance(context.local()).ToLocalChecked())
11945 .FromJust());
10627 CompileRun( 11946 CompileRun(
10628 "var result = 0;" 11947 "var result = 0;"
10629 "for (var i = 0; i < 100; i++) {" 11948 "for (var i = 0; i < 100; i++) {"
10630 " result = o.method(41);" 11949 " result = o.method(41);"
10631 "}"); 11950 "}");
10632 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11951 CHECK_EQ(42, context->Global()
11952 ->Get(v8_str("result"))
11953 ->Int32Value(context.local())
11954 .FromJust());
10633 CHECK_EQ(100, interceptor_call_count); 11955 CHECK_EQ(100, interceptor_call_count);
10634 } 11956 }
10635 11957
10636 11958
10637 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { 11959 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) {
10638 int interceptor_call_count = 0; 11960 int interceptor_call_count = 0;
10639 v8::Isolate* isolate = CcTest::isolate(); 11961 v8::Isolate* isolate = CcTest::isolate();
10640 v8::HandleScope scope(isolate); 11962 v8::HandleScope scope(isolate);
10641 v8::Handle<v8::FunctionTemplate> fun_templ = 11963 v8::Local<v8::FunctionTemplate> fun_templ =
10642 v8::FunctionTemplate::New(isolate); 11964 v8::FunctionTemplate::New(isolate);
10643 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 11965 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10644 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 11966 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10645 v8::Signature::New(isolate, fun_templ)); 11967 v8::Signature::New(isolate, fun_templ));
10646 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 11968 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10647 proto_templ->Set(v8_str("method"), method_templ); 11969 proto_templ->Set(v8_str("method"), method_templ);
10648 fun_templ->SetHiddenPrototype(true); 11970 fun_templ->SetHiddenPrototype(true);
10649 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 11971 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10650 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 11972 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10651 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 11973 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10652 v8::External::New(isolate, &interceptor_call_count))); 11974 v8::External::New(isolate, &interceptor_call_count)));
10653 LocalContext context; 11975 LocalContext context;
10654 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 11976 v8::Local<v8::Function> fun =
11977 fun_templ->GetFunction(context.local()).ToLocalChecked();
10655 GenerateSomeGarbage(); 11978 GenerateSomeGarbage();
10656 context->Global()->Set(v8_str("o"), fun->NewInstance()); 11979 CHECK(context->Global()
11980 ->Set(context.local(), v8_str("o"),
11981 fun->NewInstance(context.local()).ToLocalChecked())
11982 .FromJust());
10657 CompileRun( 11983 CompileRun(
10658 "o.foo = 17;" 11984 "o.foo = 17;"
10659 "var receiver = {};" 11985 "var receiver = {};"
10660 "receiver.__proto__ = o;" 11986 "receiver.__proto__ = o;"
10661 "var result = 0;" 11987 "var result = 0;"
10662 "for (var i = 0; i < 100; i++) {" 11988 "for (var i = 0; i < 100; i++) {"
10663 " result = receiver.method(41);" 11989 " result = receiver.method(41);"
10664 "}"); 11990 "}");
10665 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 11991 CHECK_EQ(42, context->Global()
11992 ->Get(v8_str("result"))
11993 ->Int32Value(context.local())
11994 .FromJust());
10666 CHECK_EQ(100, interceptor_call_count); 11995 CHECK_EQ(100, interceptor_call_count);
10667 } 11996 }
10668 11997
10669 11998
10670 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { 11999 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) {
10671 int interceptor_call_count = 0; 12000 int interceptor_call_count = 0;
10672 v8::Isolate* isolate = CcTest::isolate(); 12001 v8::Isolate* isolate = CcTest::isolate();
10673 v8::HandleScope scope(isolate); 12002 v8::HandleScope scope(isolate);
10674 v8::Handle<v8::FunctionTemplate> fun_templ = 12003 v8::Local<v8::FunctionTemplate> fun_templ =
10675 v8::FunctionTemplate::New(isolate); 12004 v8::FunctionTemplate::New(isolate);
10676 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12005 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10677 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12006 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10678 v8::Signature::New(isolate, fun_templ)); 12007 v8::Signature::New(isolate, fun_templ));
10679 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12008 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10680 proto_templ->Set(v8_str("method"), method_templ); 12009 proto_templ->Set(v8_str("method"), method_templ);
10681 fun_templ->SetHiddenPrototype(true); 12010 fun_templ->SetHiddenPrototype(true);
10682 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 12011 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10683 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 12012 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10684 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 12013 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10685 v8::External::New(isolate, &interceptor_call_count))); 12014 v8::External::New(isolate, &interceptor_call_count)));
10686 LocalContext context; 12015 LocalContext context;
10687 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12016 v8::Local<v8::Function> fun =
12017 fun_templ->GetFunction(context.local()).ToLocalChecked();
10688 GenerateSomeGarbage(); 12018 GenerateSomeGarbage();
10689 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12019 CHECK(context->Global()
12020 ->Set(context.local(), v8_str("o"),
12021 fun->NewInstance(context.local()).ToLocalChecked())
12022 .FromJust());
10690 CompileRun( 12023 CompileRun(
10691 "o.foo = 17;" 12024 "o.foo = 17;"
10692 "var receiver = {};" 12025 "var receiver = {};"
10693 "receiver.__proto__ = o;" 12026 "receiver.__proto__ = o;"
10694 "var result = 0;" 12027 "var result = 0;"
10695 "var saved_result = 0;" 12028 "var saved_result = 0;"
10696 "for (var i = 0; i < 100; i++) {" 12029 "for (var i = 0; i < 100; i++) {"
10697 " result = receiver.method(41);" 12030 " result = receiver.method(41);"
10698 " if (i == 50) {" 12031 " if (i == 50) {"
10699 " saved_result = result;" 12032 " saved_result = result;"
10700 " receiver = {method: function(x) { return x - 1 }};" 12033 " receiver = {method: function(x) { return x - 1 }};"
10701 " }" 12034 " }"
10702 "}"); 12035 "}");
10703 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 12036 CHECK_EQ(40, context->Global()
10704 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12037 ->Get(v8_str("result"))
12038 ->Int32Value(context.local())
12039 .FromJust());
12040 CHECK_EQ(42, context->Global()
12041 ->Get(v8_str("saved_result"))
12042 ->Int32Value(context.local())
12043 .FromJust());
10705 CHECK_GE(interceptor_call_count, 50); 12044 CHECK_GE(interceptor_call_count, 50);
10706 } 12045 }
10707 12046
10708 12047
10709 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { 12048 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) {
10710 int interceptor_call_count = 0; 12049 int interceptor_call_count = 0;
10711 v8::Isolate* isolate = CcTest::isolate(); 12050 v8::Isolate* isolate = CcTest::isolate();
10712 v8::HandleScope scope(isolate); 12051 v8::HandleScope scope(isolate);
10713 v8::Handle<v8::FunctionTemplate> fun_templ = 12052 v8::Local<v8::FunctionTemplate> fun_templ =
10714 v8::FunctionTemplate::New(isolate); 12053 v8::FunctionTemplate::New(isolate);
10715 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12054 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10716 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12055 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10717 v8::Signature::New(isolate, fun_templ)); 12056 v8::Signature::New(isolate, fun_templ));
10718 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12057 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10719 proto_templ->Set(v8_str("method"), method_templ); 12058 proto_templ->Set(v8_str("method"), method_templ);
10720 fun_templ->SetHiddenPrototype(true); 12059 fun_templ->SetHiddenPrototype(true);
10721 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 12060 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10722 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 12061 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10723 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 12062 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10724 v8::External::New(isolate, &interceptor_call_count))); 12063 v8::External::New(isolate, &interceptor_call_count)));
10725 LocalContext context; 12064 LocalContext context;
10726 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12065 v8::Local<v8::Function> fun =
12066 fun_templ->GetFunction(context.local()).ToLocalChecked();
10727 GenerateSomeGarbage(); 12067 GenerateSomeGarbage();
10728 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12068 CHECK(context->Global()
12069 ->Set(context.local(), v8_str("o"),
12070 fun->NewInstance(context.local()).ToLocalChecked())
12071 .FromJust());
10729 CompileRun( 12072 CompileRun(
10730 "o.foo = 17;" 12073 "o.foo = 17;"
10731 "var receiver = {};" 12074 "var receiver = {};"
10732 "receiver.__proto__ = o;" 12075 "receiver.__proto__ = o;"
10733 "var result = 0;" 12076 "var result = 0;"
10734 "var saved_result = 0;" 12077 "var saved_result = 0;"
10735 "for (var i = 0; i < 100; i++) {" 12078 "for (var i = 0; i < 100; i++) {"
10736 " result = receiver.method(41);" 12079 " result = receiver.method(41);"
10737 " if (i == 50) {" 12080 " if (i == 50) {"
10738 " saved_result = result;" 12081 " saved_result = result;"
10739 " o.method = function(x) { return x - 1 };" 12082 " o.method = function(x) { return x - 1 };"
10740 " }" 12083 " }"
10741 "}"); 12084 "}");
10742 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 12085 CHECK_EQ(40, context->Global()
10743 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12086 ->Get(v8_str("result"))
12087 ->Int32Value(context.local())
12088 .FromJust());
12089 CHECK_EQ(42, context->Global()
12090 ->Get(v8_str("saved_result"))
12091 ->Int32Value(context.local())
12092 .FromJust());
10744 CHECK_GE(interceptor_call_count, 50); 12093 CHECK_GE(interceptor_call_count, 50);
10745 } 12094 }
10746 12095
10747 12096
10748 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { 12097 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) {
10749 int interceptor_call_count = 0; 12098 int interceptor_call_count = 0;
10750 v8::Isolate* isolate = CcTest::isolate(); 12099 v8::Isolate* isolate = CcTest::isolate();
10751 v8::HandleScope scope(isolate); 12100 v8::HandleScope scope(isolate);
10752 v8::Handle<v8::FunctionTemplate> fun_templ = 12101 v8::Local<v8::FunctionTemplate> fun_templ =
10753 v8::FunctionTemplate::New(isolate); 12102 v8::FunctionTemplate::New(isolate);
10754 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12103 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10755 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12104 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10756 v8::Signature::New(isolate, fun_templ)); 12105 v8::Signature::New(isolate, fun_templ));
10757 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12106 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10758 proto_templ->Set(v8_str("method"), method_templ); 12107 proto_templ->Set(v8_str("method"), method_templ);
10759 fun_templ->SetHiddenPrototype(true); 12108 fun_templ->SetHiddenPrototype(true);
10760 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 12109 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10761 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 12110 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10762 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 12111 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10763 v8::External::New(isolate, &interceptor_call_count))); 12112 v8::External::New(isolate, &interceptor_call_count)));
10764 LocalContext context; 12113 LocalContext context;
10765 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12114 v8::Local<v8::Function> fun =
12115 fun_templ->GetFunction(context.local()).ToLocalChecked();
10766 GenerateSomeGarbage(); 12116 GenerateSomeGarbage();
10767 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12117 CHECK(context->Global()
12118 ->Set(context.local(), v8_str("o"),
12119 fun->NewInstance(context.local()).ToLocalChecked())
12120 .FromJust());
10768 v8::TryCatch try_catch(isolate); 12121 v8::TryCatch try_catch(isolate);
10769 CompileRun( 12122 CompileRun(
10770 "o.foo = 17;" 12123 "o.foo = 17;"
10771 "var receiver = {};" 12124 "var receiver = {};"
10772 "receiver.__proto__ = o;" 12125 "receiver.__proto__ = o;"
10773 "var result = 0;" 12126 "var result = 0;"
10774 "var saved_result = 0;" 12127 "var saved_result = 0;"
10775 "for (var i = 0; i < 100; i++) {" 12128 "for (var i = 0; i < 100; i++) {"
10776 " result = receiver.method(41);" 12129 " result = receiver.method(41);"
10777 " if (i == 50) {" 12130 " if (i == 50) {"
10778 " saved_result = result;" 12131 " saved_result = result;"
10779 " receiver = 333;" 12132 " receiver = 333;"
10780 " }" 12133 " }"
10781 "}"); 12134 "}");
10782 CHECK(try_catch.HasCaught()); 12135 CHECK(try_catch.HasCaught());
10783 // TODO(verwaest): Adjust message. 12136 // TODO(verwaest): Adjust message.
10784 CHECK(v8_str("TypeError: receiver.method is not a function") 12137 CHECK(v8_str("TypeError: receiver.method is not a function")
10785 ->Equals(try_catch.Exception()->ToString(isolate))); 12138 ->Equals(try_catch.Exception()->ToString(isolate)));
10786 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12139 CHECK_EQ(42, context->Global()
12140 ->Get(v8_str("saved_result"))
12141 ->Int32Value(context.local())
12142 .FromJust());
10787 CHECK_GE(interceptor_call_count, 50); 12143 CHECK_GE(interceptor_call_count, 50);
10788 } 12144 }
10789 12145
10790 12146
10791 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { 12147 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) {
10792 int interceptor_call_count = 0; 12148 int interceptor_call_count = 0;
10793 v8::Isolate* isolate = CcTest::isolate(); 12149 v8::Isolate* isolate = CcTest::isolate();
10794 v8::HandleScope scope(isolate); 12150 v8::HandleScope scope(isolate);
10795 v8::Handle<v8::FunctionTemplate> fun_templ = 12151 v8::Local<v8::FunctionTemplate> fun_templ =
10796 v8::FunctionTemplate::New(isolate); 12152 v8::FunctionTemplate::New(isolate);
10797 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12153 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10798 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12154 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10799 v8::Signature::New(isolate, fun_templ)); 12155 v8::Signature::New(isolate, fun_templ));
10800 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12156 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10801 proto_templ->Set(v8_str("method"), method_templ); 12157 proto_templ->Set(v8_str("method"), method_templ);
10802 fun_templ->SetHiddenPrototype(true); 12158 fun_templ->SetHiddenPrototype(true);
10803 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); 12159 v8::Local<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate();
10804 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 12160 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
10805 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, 12161 InterceptorCallICFastApi, NULL, NULL, NULL, NULL,
10806 v8::External::New(isolate, &interceptor_call_count))); 12162 v8::External::New(isolate, &interceptor_call_count)));
10807 LocalContext context; 12163 LocalContext context;
10808 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12164 v8::Local<v8::Function> fun =
12165 fun_templ->GetFunction(context.local()).ToLocalChecked();
10809 GenerateSomeGarbage(); 12166 GenerateSomeGarbage();
10810 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12167 CHECK(context->Global()
12168 ->Set(context.local(), v8_str("o"),
12169 fun->NewInstance(context.local()).ToLocalChecked())
12170 .FromJust());
10811 v8::TryCatch try_catch(isolate); 12171 v8::TryCatch try_catch(isolate);
10812 CompileRun( 12172 CompileRun(
10813 "o.foo = 17;" 12173 "o.foo = 17;"
10814 "var receiver = {};" 12174 "var receiver = {};"
10815 "receiver.__proto__ = o;" 12175 "receiver.__proto__ = o;"
10816 "var result = 0;" 12176 "var result = 0;"
10817 "var saved_result = 0;" 12177 "var saved_result = 0;"
10818 "for (var i = 0; i < 100; i++) {" 12178 "for (var i = 0; i < 100; i++) {"
10819 " result = receiver.method(41);" 12179 " result = receiver.method(41);"
10820 " if (i == 50) {" 12180 " if (i == 50) {"
10821 " saved_result = result;" 12181 " saved_result = result;"
10822 " receiver = {method: receiver.method};" 12182 " receiver = {method: receiver.method};"
10823 " }" 12183 " }"
10824 "}"); 12184 "}");
10825 CHECK(try_catch.HasCaught()); 12185 CHECK(try_catch.HasCaught());
10826 CHECK(v8_str("TypeError: Illegal invocation") 12186 CHECK(v8_str("TypeError: Illegal invocation")
10827 ->Equals(try_catch.Exception()->ToString(isolate))); 12187 ->Equals(try_catch.Exception()->ToString(isolate)));
10828 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12188 CHECK_EQ(42, context->Global()
12189 ->Get(v8_str("saved_result"))
12190 ->Int32Value(context.local())
12191 .FromJust());
10829 CHECK_GE(interceptor_call_count, 50); 12192 CHECK_GE(interceptor_call_count, 50);
10830 } 12193 }
10831 12194
10832 12195
10833 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { 12196 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) {
10834 v8::Isolate* isolate = CcTest::isolate(); 12197 v8::Isolate* isolate = CcTest::isolate();
10835 v8::HandleScope scope(isolate); 12198 v8::HandleScope scope(isolate);
10836 v8::Handle<v8::FunctionTemplate> fun_templ = 12199 v8::Local<v8::FunctionTemplate> fun_templ =
10837 v8::FunctionTemplate::New(isolate); 12200 v8::FunctionTemplate::New(isolate);
10838 v8::Handle<v8::FunctionTemplate> method_templ = 12201 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10839 v8::FunctionTemplate::New(isolate, 12202 isolate, FastApiCallback_TrivialSignature, v8_str("method_data"),
10840 FastApiCallback_TrivialSignature, 12203 v8::Local<v8::Signature>());
10841 v8_str("method_data"), 12204 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); 12205 proto_templ->Set(v8_str("method"), method_templ);
10845 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 12206 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
10846 USE(templ); 12207 USE(templ);
10847 LocalContext context; 12208 LocalContext context;
10848 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12209 v8::Local<v8::Function> fun =
12210 fun_templ->GetFunction(context.local()).ToLocalChecked();
10849 GenerateSomeGarbage(); 12211 GenerateSomeGarbage();
10850 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12212 CHECK(context->Global()
12213 ->Set(context.local(), v8_str("o"),
12214 fun->NewInstance(context.local()).ToLocalChecked())
12215 .FromJust());
10851 CompileRun( 12216 CompileRun(
10852 "var result = 0;" 12217 "var result = 0;"
10853 "for (var i = 0; i < 100; i++) {" 12218 "for (var i = 0; i < 100; i++) {"
10854 " result = o.method(41);" 12219 " result = o.method(41);"
10855 "}"); 12220 "}");
10856 12221
10857 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 12222 CHECK_EQ(42, context->Global()
12223 ->Get(v8_str("result"))
12224 ->Int32Value(context.local())
12225 .FromJust());
10858 } 12226 }
10859 12227
10860 12228
10861 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { 12229 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) {
10862 v8::Isolate* isolate = CcTest::isolate(); 12230 v8::Isolate* isolate = CcTest::isolate();
10863 v8::HandleScope scope(isolate); 12231 v8::HandleScope scope(isolate);
10864 v8::Handle<v8::FunctionTemplate> fun_templ = 12232 v8::Local<v8::FunctionTemplate> fun_templ =
10865 v8::FunctionTemplate::New(isolate); 12233 v8::FunctionTemplate::New(isolate);
10866 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12234 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10867 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12235 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10868 v8::Signature::New(isolate, fun_templ)); 12236 v8::Signature::New(isolate, fun_templ));
10869 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12237 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10870 proto_templ->Set(v8_str("method"), method_templ); 12238 proto_templ->Set(v8_str("method"), method_templ);
10871 fun_templ->SetHiddenPrototype(true); 12239 fun_templ->SetHiddenPrototype(true);
10872 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 12240 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
10873 CHECK(!templ.IsEmpty()); 12241 CHECK(!templ.IsEmpty());
10874 LocalContext context; 12242 LocalContext context;
10875 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12243 v8::Local<v8::Function> fun =
12244 fun_templ->GetFunction(context.local()).ToLocalChecked();
10876 GenerateSomeGarbage(); 12245 GenerateSomeGarbage();
10877 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12246 CHECK(context->Global()
12247 ->Set(context.local(), v8_str("o"),
12248 fun->NewInstance(context.local()).ToLocalChecked())
12249 .FromJust());
10878 CompileRun( 12250 CompileRun(
10879 "o.foo = 17;" 12251 "o.foo = 17;"
10880 "var receiver = {};" 12252 "var receiver = {};"
10881 "receiver.__proto__ = o;" 12253 "receiver.__proto__ = o;"
10882 "var result = 0;" 12254 "var result = 0;"
10883 "for (var i = 0; i < 100; i++) {" 12255 "for (var i = 0; i < 100; i++) {"
10884 " result = receiver.method(41);" 12256 " result = receiver.method(41);"
10885 "}"); 12257 "}");
10886 12258
10887 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); 12259 CHECK_EQ(42, context->Global()
12260 ->Get(v8_str("result"))
12261 ->Int32Value(context.local())
12262 .FromJust());
10888 } 12263 }
10889 12264
10890 12265
10891 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { 12266 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) {
10892 v8::Isolate* isolate = CcTest::isolate(); 12267 v8::Isolate* isolate = CcTest::isolate();
10893 v8::HandleScope scope(isolate); 12268 v8::HandleScope scope(isolate);
10894 v8::Handle<v8::FunctionTemplate> fun_templ = 12269 v8::Local<v8::FunctionTemplate> fun_templ =
10895 v8::FunctionTemplate::New(isolate); 12270 v8::FunctionTemplate::New(isolate);
10896 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12271 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10897 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12272 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10898 v8::Signature::New(isolate, fun_templ)); 12273 v8::Signature::New(isolate, fun_templ));
10899 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12274 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10900 proto_templ->Set(v8_str("method"), method_templ); 12275 proto_templ->Set(v8_str("method"), method_templ);
10901 fun_templ->SetHiddenPrototype(true); 12276 fun_templ->SetHiddenPrototype(true);
10902 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 12277 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
10903 CHECK(!templ.IsEmpty()); 12278 CHECK(!templ.IsEmpty());
10904 LocalContext context; 12279 LocalContext context;
10905 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12280 v8::Local<v8::Function> fun =
12281 fun_templ->GetFunction(context.local()).ToLocalChecked();
10906 GenerateSomeGarbage(); 12282 GenerateSomeGarbage();
10907 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12283 CHECK(context->Global()
12284 ->Set(context.local(), v8_str("o"),
12285 fun->NewInstance(context.local()).ToLocalChecked())
12286 .FromJust());
10908 CompileRun( 12287 CompileRun(
10909 "o.foo = 17;" 12288 "o.foo = 17;"
10910 "var receiver = {};" 12289 "var receiver = {};"
10911 "receiver.__proto__ = o;" 12290 "receiver.__proto__ = o;"
10912 "var result = 0;" 12291 "var result = 0;"
10913 "var saved_result = 0;" 12292 "var saved_result = 0;"
10914 "for (var i = 0; i < 100; i++) {" 12293 "for (var i = 0; i < 100; i++) {"
10915 " result = receiver.method(41);" 12294 " result = receiver.method(41);"
10916 " if (i == 50) {" 12295 " if (i == 50) {"
10917 " saved_result = result;" 12296 " saved_result = result;"
10918 " receiver = {method: function(x) { return x - 1 }};" 12297 " receiver = {method: function(x) { return x - 1 }};"
10919 " }" 12298 " }"
10920 "}"); 12299 "}");
10921 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); 12300 CHECK_EQ(40, context->Global()
10922 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12301 ->Get(v8_str("result"))
12302 ->Int32Value(context.local())
12303 .FromJust());
12304 CHECK_EQ(42, context->Global()
12305 ->Get(v8_str("saved_result"))
12306 ->Int32Value(context.local())
12307 .FromJust());
10923 } 12308 }
10924 12309
10925 12310
10926 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { 12311 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) {
10927 v8::Isolate* isolate = CcTest::isolate(); 12312 v8::Isolate* isolate = CcTest::isolate();
10928 v8::HandleScope scope(isolate); 12313 v8::HandleScope scope(isolate);
10929 v8::Handle<v8::FunctionTemplate> fun_templ = 12314 v8::Local<v8::FunctionTemplate> fun_templ =
10930 v8::FunctionTemplate::New(isolate); 12315 v8::FunctionTemplate::New(isolate);
10931 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12316 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10932 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12317 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10933 v8::Signature::New(isolate, fun_templ)); 12318 v8::Signature::New(isolate, fun_templ));
10934 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12319 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10935 proto_templ->Set(v8_str("method"), method_templ); 12320 proto_templ->Set(v8_str("method"), method_templ);
10936 fun_templ->SetHiddenPrototype(true); 12321 fun_templ->SetHiddenPrototype(true);
10937 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 12322 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
10938 CHECK(!templ.IsEmpty()); 12323 CHECK(!templ.IsEmpty());
10939 LocalContext context; 12324 LocalContext context;
10940 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12325 v8::Local<v8::Function> fun =
12326 fun_templ->GetFunction(context.local()).ToLocalChecked();
10941 GenerateSomeGarbage(); 12327 GenerateSomeGarbage();
10942 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12328 CHECK(context->Global()
12329 ->Set(context.local(), v8_str("o"),
12330 fun->NewInstance(context.local()).ToLocalChecked())
12331 .FromJust());
10943 v8::TryCatch try_catch(isolate); 12332 v8::TryCatch try_catch(isolate);
10944 CompileRun( 12333 CompileRun(
10945 "o.foo = 17;" 12334 "o.foo = 17;"
10946 "var receiver = {};" 12335 "var receiver = {};"
10947 "receiver.__proto__ = o;" 12336 "receiver.__proto__ = o;"
10948 "var result = 0;" 12337 "var result = 0;"
10949 "var saved_result = 0;" 12338 "var saved_result = 0;"
10950 "for (var i = 0; i < 100; i++) {" 12339 "for (var i = 0; i < 100; i++) {"
10951 " result = receiver.method(41);" 12340 " result = receiver.method(41);"
10952 " if (i == 50) {" 12341 " if (i == 50) {"
10953 " saved_result = result;" 12342 " saved_result = result;"
10954 " receiver = 333;" 12343 " receiver = 333;"
10955 " }" 12344 " }"
10956 "}"); 12345 "}");
10957 CHECK(try_catch.HasCaught()); 12346 CHECK(try_catch.HasCaught());
10958 // TODO(verwaest): Adjust message. 12347 // TODO(verwaest): Adjust message.
10959 CHECK(v8_str("TypeError: receiver.method is not a function") 12348 CHECK(v8_str("TypeError: receiver.method is not a function")
10960 ->Equals(try_catch.Exception()->ToString(isolate))); 12349 ->Equals(try_catch.Exception()->ToString(isolate)));
10961 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12350 CHECK_EQ(42, context->Global()
12351 ->Get(v8_str("saved_result"))
12352 ->Int32Value(context.local())
12353 .FromJust());
10962 } 12354 }
10963 12355
10964 12356
10965 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { 12357 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) {
10966 v8::Isolate* isolate = CcTest::isolate(); 12358 v8::Isolate* isolate = CcTest::isolate();
10967 v8::HandleScope scope(isolate); 12359 v8::HandleScope scope(isolate);
10968 v8::Handle<v8::FunctionTemplate> fun_templ = 12360 v8::Local<v8::FunctionTemplate> fun_templ =
10969 v8::FunctionTemplate::New(isolate); 12361 v8::FunctionTemplate::New(isolate);
10970 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( 12362 v8::Local<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New(
10971 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), 12363 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"),
10972 v8::Signature::New(isolate, fun_templ)); 12364 v8::Signature::New(isolate, fun_templ));
10973 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); 12365 v8::Local<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate();
10974 proto_templ->Set(v8_str("method"), method_templ); 12366 proto_templ->Set(v8_str("method"), method_templ);
10975 fun_templ->SetHiddenPrototype(true); 12367 fun_templ->SetHiddenPrototype(true);
10976 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); 12368 v8::Local<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate());
10977 CHECK(!templ.IsEmpty()); 12369 CHECK(!templ.IsEmpty());
10978 LocalContext context; 12370 LocalContext context;
10979 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); 12371 v8::Local<v8::Function> fun =
12372 fun_templ->GetFunction(context.local()).ToLocalChecked();
10980 GenerateSomeGarbage(); 12373 GenerateSomeGarbage();
10981 context->Global()->Set(v8_str("o"), fun->NewInstance()); 12374 CHECK(context->Global()
12375 ->Set(context.local(), v8_str("o"),
12376 fun->NewInstance(context.local()).ToLocalChecked())
12377 .FromJust());
10982 v8::TryCatch try_catch(isolate); 12378 v8::TryCatch try_catch(isolate);
10983 CompileRun( 12379 CompileRun(
10984 "o.foo = 17;" 12380 "o.foo = 17;"
10985 "var receiver = {};" 12381 "var receiver = {};"
10986 "receiver.__proto__ = o;" 12382 "receiver.__proto__ = o;"
10987 "var result = 0;" 12383 "var result = 0;"
10988 "var saved_result = 0;" 12384 "var saved_result = 0;"
10989 "for (var i = 0; i < 100; i++) {" 12385 "for (var i = 0; i < 100; i++) {"
10990 " result = receiver.method(41);" 12386 " result = receiver.method(41);"
10991 " if (i == 50) {" 12387 " if (i == 50) {"
10992 " saved_result = result;" 12388 " saved_result = result;"
10993 " receiver = Object.create(receiver);" 12389 " receiver = Object.create(receiver);"
10994 " }" 12390 " }"
10995 "}"); 12391 "}");
10996 CHECK(try_catch.HasCaught()); 12392 CHECK(try_catch.HasCaught());
10997 CHECK(v8_str("TypeError: Illegal invocation") 12393 CHECK(v8_str("TypeError: Illegal invocation")
10998 ->Equals(try_catch.Exception()->ToString(isolate))); 12394 ->Equals(try_catch.Exception()->ToString(isolate)));
10999 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); 12395 CHECK_EQ(42, context->Global()
12396 ->Get(v8_str("saved_result"))
12397 ->Int32Value(context.local())
12398 .FromJust());
11000 } 12399 }
11001 12400
11002 12401
11003 static void ThrowingGetter(Local<String> name, 12402 static void ThrowingGetter(Local<String> name,
11004 const v8::PropertyCallbackInfo<v8::Value>& info) { 12403 const v8::PropertyCallbackInfo<v8::Value>& info) {
11005 ApiTestFuzzer::Fuzz(); 12404 ApiTestFuzzer::Fuzz();
11006 info.GetIsolate()->ThrowException(Handle<Value>()); 12405 info.GetIsolate()->ThrowException(Local<Value>());
11007 info.GetReturnValue().SetUndefined(); 12406 info.GetReturnValue().SetUndefined();
11008 } 12407 }
11009 12408
11010 12409
11011 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { 12410 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) {
11012 LocalContext context; 12411 LocalContext context;
11013 HandleScope scope(context->GetIsolate()); 12412 HandleScope scope(context->GetIsolate());
11014 12413
11015 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 12414 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
11016 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); 12415 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate();
11017 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter); 12416 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter);
11018 12417
11019 Local<Object> instance = templ->GetFunction()->NewInstance(); 12418 Local<Object> instance = templ->GetFunction(context.local())
12419 .ToLocalChecked()
12420 ->NewInstance(context.local())
12421 .ToLocalChecked();
11020 12422
11021 Local<Object> another = Object::New(context->GetIsolate()); 12423 Local<Object> another = Object::New(context->GetIsolate());
11022 another->SetPrototype(instance); 12424 another->SetPrototype(instance);
11023 12425
11024 Local<Object> with_js_getter = CompileRun( 12426 Local<Object> with_js_getter = CompileRun(
11025 "o = {};\n" 12427 "o = {};\n"
11026 "o.__defineGetter__('f', function() { throw undefined; });\n" 12428 "o.__defineGetter__('f', function() { throw undefined; });\n"
11027 "o\n").As<Object>(); 12429 "o\n").As<Object>();
11028 CHECK(!with_js_getter.IsEmpty()); 12430 CHECK(!with_js_getter.IsEmpty());
11029 12431
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
11087 CompileRun("throw 'from JS';"); 12489 CompileRun("throw 'from JS';");
11088 CHECK(try_catch.HasCaught()); 12490 CHECK(try_catch.HasCaught());
11089 CHECK(!CcTest::i_isolate()->has_pending_exception()); 12491 CHECK(!CcTest::i_isolate()->has_pending_exception());
11090 CHECK(!CcTest::i_isolate()->has_scheduled_exception()); 12492 CHECK(!CcTest::i_isolate()->has_scheduled_exception());
11091 } 12493 }
11092 12494
11093 12495
11094 static int call_depth; 12496 static int call_depth;
11095 12497
11096 12498
11097 static void WithTryCatch(Handle<Message> message, Handle<Value> data) { 12499 static void WithTryCatch(Local<Message> message, Local<Value> data) {
11098 TryCatch try_catch(CcTest::isolate()); 12500 TryCatch try_catch(CcTest::isolate());
11099 } 12501 }
11100 12502
11101 12503
11102 static void ThrowFromJS(Handle<Message> message, Handle<Value> data) { 12504 static void ThrowFromJS(Local<Message> message, Local<Value> data) {
11103 if (--call_depth) CompileRun("throw 'ThrowInJS';"); 12505 if (--call_depth) CompileRun("throw 'ThrowInJS';");
11104 } 12506 }
11105 12507
11106 12508
11107 static void ThrowViaApi(Handle<Message> message, Handle<Value> data) { 12509 static void ThrowViaApi(Local<Message> message, Local<Value> data) {
11108 if (--call_depth) CcTest::isolate()->ThrowException(v8_str("ThrowViaApi")); 12510 if (--call_depth) CcTest::isolate()->ThrowException(v8_str("ThrowViaApi"));
11109 } 12511 }
11110 12512
11111 12513
11112 static void WebKitLike(Handle<Message> message, Handle<Value> data) { 12514 static void WebKitLike(Local<Message> message, Local<Value> data) {
11113 Handle<String> errorMessageString = message->Get(); 12515 Local<String> errorMessageString = message->Get();
11114 CHECK(!errorMessageString.IsEmpty()); 12516 CHECK(!errorMessageString.IsEmpty());
11115 message->GetStackTrace(); 12517 message->GetStackTrace();
11116 message->GetScriptOrigin().ResourceName(); 12518 message->GetScriptOrigin().ResourceName();
11117 } 12519 }
11118 12520
11119 12521
11120 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) { 12522 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) {
11121 LocalContext context; 12523 LocalContext context;
11122 v8::Isolate* isolate = context->GetIsolate(); 12524 v8::Isolate* isolate = context->GetIsolate();
11123 HandleScope scope(isolate); 12525 HandleScope scope(isolate);
11124 12526
11125 Local<Function> func = 12527 Local<Function> func =
11126 FunctionTemplate::New(isolate, 12528 FunctionTemplate::New(isolate, ThrowingCallbackWithTryCatch)
11127 ThrowingCallbackWithTryCatch)->GetFunction(); 12529 ->GetFunction(context.local())
11128 context->Global()->Set(v8_str("func"), func); 12530 .ToLocalChecked();
12531 CHECK(
12532 context->Global()->Set(context.local(), v8_str("func"), func).FromJust());
11129 12533
11130 MessageCallback callbacks[] = 12534 MessageCallback callbacks[] =
11131 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch }; 12535 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch };
11132 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) { 12536 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) {
11133 MessageCallback callback = callbacks[i]; 12537 MessageCallback callback = callbacks[i];
11134 if (callback != NULL) { 12538 if (callback != NULL) {
11135 V8::AddMessageListener(callback); 12539 V8::AddMessageListener(callback);
11136 } 12540 }
11137 // Some small number to control number of times message handler should 12541 // Some small number to control number of times message handler should
11138 // throw an exception. 12542 // throw an exception.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
11182 // instances. 12586 // instances.
11183 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter); 12587 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter);
11184 // Add 'g' twice. The 'g' added last should get called for instances. 12588 // Add 'g' twice. The 'g' added last should get called for instances.
11185 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter); 12589 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter);
11186 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter); 12590 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter);
11187 12591
11188 // Add 'h' as an accessor to the proto template with ReadOnly attributes 12592 // Add 'h' as an accessor to the proto template with ReadOnly attributes
11189 // so 'h' can be shadowed on the instance object. 12593 // so 'h' can be shadowed on the instance object.
11190 Local<ObjectTemplate> child_proto_templ = child_templ->PrototypeTemplate(); 12594 Local<ObjectTemplate> child_proto_templ = child_templ->PrototypeTemplate();
11191 child_proto_templ->SetAccessor(v8_str("h"), ParentGetter, 0, 12595 child_proto_templ->SetAccessor(v8_str("h"), ParentGetter, 0,
11192 v8::Handle<Value>(), v8::DEFAULT, v8::ReadOnly); 12596 v8::Local<Value>(), v8::DEFAULT, v8::ReadOnly);
11193 12597
11194 // Add 'i' as an accessor to the instance template with ReadOnly attributes 12598 // 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 12599 // but the attribute does not have effect because it is duplicated with
11196 // NULL setter. 12600 // NULL setter.
11197 child_instance_templ->SetAccessor(v8_str("i"), ChildGetter, 0, 12601 child_instance_templ->SetAccessor(v8_str("i"), ChildGetter, 0,
11198 v8::Handle<Value>(), v8::DEFAULT, v8::ReadOnly); 12602 v8::Local<Value>(), v8::DEFAULT,
11199 12603 v8::ReadOnly);
11200 12604
11201 12605
11202 // Instantiate the child template. 12606 // Instantiate the child template.
11203 Local<v8::Object> instance = child_templ->GetFunction()->NewInstance(); 12607 Local<v8::Object> instance = child_templ->GetFunction(context.local())
12608 .ToLocalChecked()
12609 ->NewInstance(context.local())
12610 .ToLocalChecked();
11204 12611
11205 // Check that the child function overrides the parent one. 12612 // Check that the child function overrides the parent one.
11206 context->Global()->Set(v8_str("o"), instance); 12613 CHECK(context->Global()
12614 ->Set(context.local(), v8_str("o"), instance)
12615 .FromJust());
11207 Local<Value> value = v8_compile("o.f")->Run(); 12616 Local<Value> value = v8_compile("o.f")->Run();
11208 // Check that the 'g' that was added last is hit. 12617 // Check that the 'g' that was added last is hit.
11209 CHECK_EQ(42, value->Int32Value()); 12618 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
11210 value = v8_compile("o.g")->Run(); 12619 value = v8_compile("o.g")->Run();
11211 CHECK_EQ(42, value->Int32Value()); 12620 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
11212 12621
11213 // Check that 'h' cannot be shadowed. 12622 // Check that 'h' cannot be shadowed.
11214 value = v8_compile("o.h = 3; o.h")->Run(); 12623 value = v8_compile("o.h = 3; o.h")->Run();
11215 CHECK_EQ(1, value->Int32Value()); 12624 CHECK_EQ(1, value->Int32Value(context.local()).FromJust());
11216 12625
11217 // Check that 'i' cannot be shadowed or changed. 12626 // Check that 'i' cannot be shadowed or changed.
11218 value = v8_compile("o.i = 3; o.i")->Run(); 12627 value = v8_compile("o.i = 3; o.i")->Run();
11219 CHECK_EQ(42, value->Int32Value()); 12628 CHECK_EQ(42, value->Int32Value(context.local()).FromJust());
11220 } 12629 }
11221 12630
11222 12631
11223 static void IsConstructHandler( 12632 static void IsConstructHandler(
11224 const v8::FunctionCallbackInfo<v8::Value>& args) { 12633 const v8::FunctionCallbackInfo<v8::Value>& args) {
11225 ApiTestFuzzer::Fuzz(); 12634 ApiTestFuzzer::Fuzz();
11226 args.GetReturnValue().Set(args.IsConstructCall()); 12635 args.GetReturnValue().Set(args.IsConstructCall());
11227 } 12636 }
11228 12637
11229 12638
11230 THREADED_TEST(IsConstructCall) { 12639 THREADED_TEST(IsConstructCall) {
11231 v8::Isolate* isolate = CcTest::isolate(); 12640 v8::Isolate* isolate = CcTest::isolate();
11232 v8::HandleScope scope(isolate); 12641 v8::HandleScope scope(isolate);
11233 12642
11234 // Function template with call handler. 12643 // Function template with call handler.
11235 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 12644 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
11236 templ->SetCallHandler(IsConstructHandler); 12645 templ->SetCallHandler(IsConstructHandler);
11237 12646
11238 LocalContext context; 12647 LocalContext context;
11239 12648
11240 context->Global()->Set(v8_str("f"), templ->GetFunction()); 12649 CHECK(context->Global()
12650 ->Set(context.local(), v8_str("f"),
12651 templ->GetFunction(context.local()).ToLocalChecked())
12652 .FromJust());
11241 Local<Value> value = v8_compile("f()")->Run(); 12653 Local<Value> value = v8_compile("f()")->Run();
11242 CHECK(!value->BooleanValue()); 12654 CHECK(!value->BooleanValue());
11243 value = v8_compile("new f()")->Run(); 12655 value = v8_compile("new f()")->Run();
11244 CHECK(value->BooleanValue()); 12656 CHECK(value->BooleanValue());
11245 } 12657 }
11246 12658
11247 12659
11248 THREADED_TEST(ObjectProtoToString) { 12660 THREADED_TEST(ObjectProtoToString) {
11249 v8::Isolate* isolate = CcTest::isolate(); 12661 v8::Isolate* isolate = CcTest::isolate();
11250 v8::HandleScope scope(isolate); 12662 v8::HandleScope scope(isolate);
11251 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); 12663 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate);
11252 templ->SetClassName(v8_str("MyClass")); 12664 templ->SetClassName(v8_str("MyClass"));
11253 12665
11254 LocalContext context; 12666 LocalContext context;
11255 12667
11256 Local<String> customized_tostring = v8_str("customized toString"); 12668 Local<String> customized_tostring = v8_str("customized toString");
11257 12669
11258 // Replace Object.prototype.toString 12670 // Replace Object.prototype.toString
11259 v8_compile("Object.prototype.toString = function() {" 12671 v8_compile("Object.prototype.toString = function() {"
11260 " return 'customized toString';" 12672 " return 'customized toString';"
11261 "}")->Run(); 12673 "}")->Run();
11262 12674
11263 // Normal ToString call should call replaced Object.prototype.toString 12675 // Normal ToString call should call replaced Object.prototype.toString
11264 Local<v8::Object> instance = templ->GetFunction()->NewInstance(); 12676 Local<v8::Object> instance = templ->GetFunction(context.local())
12677 .ToLocalChecked()
12678 ->NewInstance(context.local())
12679 .ToLocalChecked();
11265 Local<String> value = instance->ToString(isolate); 12680 Local<String> value = instance->ToString(isolate);
11266 CHECK(value->IsString() && value->Equals(customized_tostring)); 12681 CHECK(value->IsString() && value->Equals(customized_tostring));
11267 12682
11268 // ObjectProtoToString should not call replace toString function. 12683 // ObjectProtoToString should not call replace toString function.
11269 value = instance->ObjectProtoToString(); 12684 value = instance->ObjectProtoToString();
11270 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); 12685 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]")));
11271 12686
11272 // Check global 12687 // Check global
11273 value = context->Global()->ObjectProtoToString(); 12688 value = context->Global()->ObjectProtoToString();
11274 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); 12689 CHECK(value->IsString() && value->Equals(v8_str("[object global]")));
(...skipping 16 matching lines...) Expand all
11291 12706
11292 Local<String> customized_tostring = v8_str("customized toString"); 12707 Local<String> customized_tostring = v8_str("customized toString");
11293 12708
11294 // Replace Object.prototype.toString 12709 // Replace Object.prototype.toString
11295 CompileRun( 12710 CompileRun(
11296 "Object.prototype.toString = function() {" 12711 "Object.prototype.toString = function() {"
11297 " return 'customized toString';" 12712 " return 'customized toString';"
11298 "}"); 12713 "}");
11299 12714
11300 // Normal ToString call should call replaced Object.prototype.toString 12715 // Normal ToString call should call replaced Object.prototype.toString
11301 Local<v8::Object> instance = templ->GetFunction()->NewInstance(); 12716 Local<v8::Object> instance = templ->GetFunction(context.local())
12717 .ToLocalChecked()
12718 ->NewInstance(context.local())
12719 .ToLocalChecked();
11302 Local<String> value = instance->ToString(isolate); 12720 Local<String> value = instance->ToString(isolate);
11303 CHECK(value->IsString() && value->Equals(customized_tostring)); 12721 CHECK(value->IsString() && value->Equals(customized_tostring));
11304 12722
11305 // ObjectProtoToString should not call replace toString function. 12723 // ObjectProtoToString should not call replace toString function.
11306 value = instance->ObjectProtoToString(); 12724 value = instance->ObjectProtoToString();
11307 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]"))); 12725 CHECK(value->IsString() && value->Equals(v8_str("[object MyClass]")));
11308 12726
11309 // Check global 12727 // Check global
11310 value = context->Global()->ObjectProtoToString(); 12728 value = context->Global()->ObjectProtoToString();
11311 CHECK(value->IsString() && value->Equals(v8_str("[object global]"))); 12729 CHECK(value->IsString() && value->Equals(v8_str("[object global]")));
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
11634 13052
11635 static void ThrowInJS(const v8::FunctionCallbackInfo<v8::Value>& args) { 13053 static void ThrowInJS(const v8::FunctionCallbackInfo<v8::Value>& args) {
11636 v8::Isolate* isolate = args.GetIsolate(); 13054 v8::Isolate* isolate = args.GetIsolate();
11637 CHECK(v8::Locker::IsLocked(isolate)); 13055 CHECK(v8::Locker::IsLocked(isolate));
11638 ApiTestFuzzer::Fuzz(); 13056 ApiTestFuzzer::Fuzz();
11639 v8::Unlocker unlocker(isolate); 13057 v8::Unlocker unlocker(isolate);
11640 const char* code = "throw 7;"; 13058 const char* code = "throw 7;";
11641 { 13059 {
11642 v8::Locker nested_locker(isolate); 13060 v8::Locker nested_locker(isolate);
11643 v8::HandleScope scope(isolate); 13061 v8::HandleScope scope(isolate);
11644 v8::Handle<Value> exception; 13062 v8::Local<Value> exception;
11645 { 13063 {
11646 v8::TryCatch try_catch(isolate); 13064 v8::TryCatch try_catch(isolate);
11647 v8::Handle<Value> value = CompileRun(code); 13065 v8::Local<Value> value = CompileRun(code);
11648 CHECK(value.IsEmpty()); 13066 CHECK(value.IsEmpty());
11649 CHECK(try_catch.HasCaught()); 13067 CHECK(try_catch.HasCaught());
11650 // Make sure to wrap the exception in a new handle because 13068 // Make sure to wrap the exception in a new handle because
11651 // the handle returned from the TryCatch is destroyed 13069 // the handle returned from the TryCatch is destroyed
11652 // when the TryCatch is destroyed. 13070 // when the TryCatch is destroyed.
11653 exception = Local<Value>::New(isolate, try_catch.Exception()); 13071 exception = Local<Value>::New(isolate, try_catch.Exception());
11654 } 13072 }
11655 args.GetIsolate()->ThrowException(exception); 13073 args.GetIsolate()->ThrowException(exception);
11656 } 13074 }
11657 } 13075 }
11658 13076
11659 13077
11660 static void ThrowInJSNoCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { 13078 static void ThrowInJSNoCatch(const v8::FunctionCallbackInfo<v8::Value>& args) {
11661 CHECK(v8::Locker::IsLocked(CcTest::isolate())); 13079 CHECK(v8::Locker::IsLocked(CcTest::isolate()));
11662 ApiTestFuzzer::Fuzz(); 13080 ApiTestFuzzer::Fuzz();
11663 v8::Unlocker unlocker(CcTest::isolate()); 13081 v8::Unlocker unlocker(CcTest::isolate());
11664 const char* code = "throw 7;"; 13082 const char* code = "throw 7;";
11665 { 13083 {
11666 v8::Locker nested_locker(CcTest::isolate()); 13084 v8::Locker nested_locker(CcTest::isolate());
11667 v8::HandleScope scope(args.GetIsolate()); 13085 v8::HandleScope scope(args.GetIsolate());
11668 v8::Handle<Value> value = CompileRun(code); 13086 v8::Local<Value> value = CompileRun(code);
11669 CHECK(value.IsEmpty()); 13087 CHECK(value.IsEmpty());
11670 args.GetReturnValue().Set(v8_str("foo")); 13088 args.GetReturnValue().Set(v8_str("foo"));
11671 } 13089 }
11672 } 13090 }
11673 13091
11674 13092
11675 // These are locking tests that don't need to be run again 13093 // These are locking tests that don't need to be run again
11676 // as part of the locking aggregation tests. 13094 // as part of the locking aggregation tests.
11677 TEST(NestedLockers) { 13095 TEST(NestedLockers) {
11678 v8::Isolate* isolate = CcTest::isolate(); 13096 v8::Isolate* isolate = CcTest::isolate();
11679 v8::Locker locker(isolate); 13097 v8::Locker locker(isolate);
11680 CHECK(v8::Locker::IsLocked(isolate)); 13098 CHECK(v8::Locker::IsLocked(isolate));
11681 LocalContext env; 13099 LocalContext env;
11682 v8::HandleScope scope(env->GetIsolate()); 13100 v8::HandleScope scope(env->GetIsolate());
11683 Local<v8::FunctionTemplate> fun_templ = 13101 Local<v8::FunctionTemplate> fun_templ =
11684 v8::FunctionTemplate::New(isolate, ThrowInJS); 13102 v8::FunctionTemplate::New(isolate, ThrowInJS);
11685 Local<Function> fun = fun_templ->GetFunction(); 13103 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
11686 env->Global()->Set(v8_str("throw_in_js"), fun); 13104 CHECK(env->Global()->Set(env.local(), v8_str("throw_in_js"), fun).FromJust());
11687 Local<Script> script = v8_compile("(function () {" 13105 Local<Script> script = v8_compile("(function () {"
11688 " try {" 13106 " try {"
11689 " throw_in_js();" 13107 " throw_in_js();"
11690 " return 42;" 13108 " return 42;"
11691 " } catch (e) {" 13109 " } catch (e) {"
11692 " return e * 13;" 13110 " return e * 13;"
11693 " }" 13111 " }"
11694 "})();"); 13112 "})();");
11695 CHECK_EQ(91, script->Run()->Int32Value()); 13113 CHECK_EQ(91, script->Run()->Int32Value(env.local()).FromJust());
11696 } 13114 }
11697 13115
11698 13116
11699 // These are locking tests that don't need to be run again 13117 // These are locking tests that don't need to be run again
11700 // as part of the locking aggregation tests. 13118 // as part of the locking aggregation tests.
11701 TEST(NestedLockersNoTryCatch) { 13119 TEST(NestedLockersNoTryCatch) {
11702 v8::Locker locker(CcTest::isolate()); 13120 v8::Locker locker(CcTest::isolate());
11703 LocalContext env; 13121 LocalContext env;
11704 v8::HandleScope scope(env->GetIsolate()); 13122 v8::HandleScope scope(env->GetIsolate());
11705 Local<v8::FunctionTemplate> fun_templ = 13123 Local<v8::FunctionTemplate> fun_templ =
11706 v8::FunctionTemplate::New(env->GetIsolate(), ThrowInJSNoCatch); 13124 v8::FunctionTemplate::New(env->GetIsolate(), ThrowInJSNoCatch);
11707 Local<Function> fun = fun_templ->GetFunction(); 13125 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
11708 env->Global()->Set(v8_str("throw_in_js"), fun); 13126 CHECK(env->Global()->Set(env.local(), v8_str("throw_in_js"), fun).FromJust());
11709 Local<Script> script = v8_compile("(function () {" 13127 Local<Script> script = v8_compile("(function () {"
11710 " try {" 13128 " try {"
11711 " throw_in_js();" 13129 " throw_in_js();"
11712 " return 42;" 13130 " return 42;"
11713 " } catch (e) {" 13131 " } catch (e) {"
11714 " return e * 13;" 13132 " return e * 13;"
11715 " }" 13133 " }"
11716 "})();"); 13134 "})();");
11717 CHECK_EQ(91, script->Run()->Int32Value()); 13135 CHECK_EQ(91, script->Run()->Int32Value(env.local()).FromJust());
11718 } 13136 }
11719 13137
11720 13138
11721 THREADED_TEST(RecursiveLocking) { 13139 THREADED_TEST(RecursiveLocking) {
11722 v8::Locker locker(CcTest::isolate()); 13140 v8::Locker locker(CcTest::isolate());
11723 { 13141 {
11724 v8::Locker locker2(CcTest::isolate()); 13142 v8::Locker locker2(CcTest::isolate());
11725 CHECK(v8::Locker::IsLocked(CcTest::isolate())); 13143 CHECK(v8::Locker::IsLocked(CcTest::isolate()));
11726 } 13144 }
11727 } 13145 }
11728 13146
11729 13147
11730 static void UnlockForAMoment(const v8::FunctionCallbackInfo<v8::Value>& args) { 13148 static void UnlockForAMoment(const v8::FunctionCallbackInfo<v8::Value>& args) {
11731 ApiTestFuzzer::Fuzz(); 13149 ApiTestFuzzer::Fuzz();
11732 v8::Unlocker unlocker(CcTest::isolate()); 13150 v8::Unlocker unlocker(CcTest::isolate());
11733 } 13151 }
11734 13152
11735 13153
11736 THREADED_TEST(LockUnlockLock) { 13154 THREADED_TEST(LockUnlockLock) {
11737 { 13155 {
11738 v8::Locker locker(CcTest::isolate()); 13156 v8::Locker locker(CcTest::isolate());
11739 v8::HandleScope scope(CcTest::isolate()); 13157 v8::HandleScope scope(CcTest::isolate());
11740 LocalContext env; 13158 LocalContext env;
11741 Local<v8::FunctionTemplate> fun_templ = 13159 Local<v8::FunctionTemplate> fun_templ =
11742 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); 13160 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment);
11743 Local<Function> fun = fun_templ->GetFunction(); 13161 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
11744 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); 13162 CHECK(env->Global()
13163 ->Set(env.local(), v8_str("unlock_for_a_moment"), fun)
13164 .FromJust());
11745 Local<Script> script = v8_compile("(function () {" 13165 Local<Script> script = v8_compile("(function () {"
11746 " unlock_for_a_moment();" 13166 " unlock_for_a_moment();"
11747 " return 42;" 13167 " return 42;"
11748 "})();"); 13168 "})();");
11749 CHECK_EQ(42, script->Run()->Int32Value()); 13169 CHECK_EQ(42, script->Run()->Int32Value(env.local()).FromJust());
11750 } 13170 }
11751 { 13171 {
11752 v8::Locker locker(CcTest::isolate()); 13172 v8::Locker locker(CcTest::isolate());
11753 v8::HandleScope scope(CcTest::isolate()); 13173 v8::HandleScope scope(CcTest::isolate());
11754 LocalContext env; 13174 LocalContext env;
11755 Local<v8::FunctionTemplate> fun_templ = 13175 Local<v8::FunctionTemplate> fun_templ =
11756 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); 13176 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment);
11757 Local<Function> fun = fun_templ->GetFunction(); 13177 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
11758 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); 13178 CHECK(env->Global()
13179 ->Set(env.local(), v8_str("unlock_for_a_moment"), fun)
13180 .FromJust());
11759 Local<Script> script = v8_compile("(function () {" 13181 Local<Script> script = v8_compile("(function () {"
11760 " unlock_for_a_moment();" 13182 " unlock_for_a_moment();"
11761 " return 42;" 13183 " return 42;"
11762 "})();"); 13184 "})();");
11763 CHECK_EQ(42, script->Run()->Int32Value()); 13185 CHECK_EQ(42, script->Run()->Int32Value(env.local()).FromJust());
11764 } 13186 }
11765 } 13187 }
11766 13188
11767 13189
11768 static int GetGlobalObjectsCount() { 13190 static int GetGlobalObjectsCount() {
11769 int count = 0; 13191 int count = 0;
11770 i::HeapIterator it(CcTest::heap()); 13192 i::HeapIterator it(CcTest::heap());
11771 for (i::HeapObject* object = it.next(); object != NULL; object = it.next()) 13193 for (i::HeapObject* object = it.next(); object != NULL; object = it.next())
11772 if (object->IsJSGlobalObject()) { 13194 if (object->IsJSGlobalObject()) {
11773 i::JSGlobalObject* g = i::JSGlobalObject::cast(object); 13195 i::JSGlobalObject* g = i::JSGlobalObject::cast(object);
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
12022 CompileRun(source); 13444 CompileRun(source);
12023 } 13445 }
12024 { v8::HandleScope scope(CcTest::isolate()); 13446 { v8::HandleScope scope(CcTest::isolate());
12025 LocalContext context; 13447 LocalContext context;
12026 CompileRun(source); 13448 CompileRun(source);
12027 } 13449 }
12028 } 13450 }
12029 } 13451 }
12030 13452
12031 13453
12032 static v8::Handle<Value> NestedScope(v8::Local<Context> env) { 13454 static v8::Local<Value> NestedScope(v8::Local<Context> env) {
12033 v8::EscapableHandleScope inner(env->GetIsolate()); 13455 v8::EscapableHandleScope inner(env->GetIsolate());
12034 env->Enter(); 13456 env->Enter();
12035 v8::Local<Value> three = v8_num(3); 13457 v8::Local<Value> three = v8_num(3);
12036 v8::Local<Value> value = inner.Escape(three); 13458 v8::Local<Value> value = inner.Escape(three);
12037 env->Exit(); 13459 env->Exit();
12038 return value; 13460 return value;
12039 } 13461 }
12040 13462
12041 13463
12042 THREADED_TEST(NestedHandleScopeAndContexts) { 13464 THREADED_TEST(NestedHandleScopeAndContexts) {
12043 v8::Isolate* isolate = CcTest::isolate(); 13465 v8::Isolate* isolate = CcTest::isolate();
12044 v8::HandleScope outer(isolate); 13466 v8::HandleScope outer(isolate);
12045 v8::Local<Context> env = Context::New(isolate); 13467 v8::Local<Context> env = Context::New(isolate);
12046 env->Enter(); 13468 env->Enter();
12047 v8::Handle<Value> value = NestedScope(env); 13469 v8::Local<Value> value = NestedScope(env);
12048 v8::Handle<String> str(value->ToString(isolate)); 13470 v8::Local<String> str(value->ToString(isolate));
12049 CHECK(!str.IsEmpty()); 13471 CHECK(!str.IsEmpty());
12050 env->Exit(); 13472 env->Exit();
12051 } 13473 }
12052 13474
12053 13475
12054 static bool MatchPointers(void* key1, void* key2) { 13476 static bool MatchPointers(void* key1, void* key2) {
12055 return key1 == key2; 13477 return key1 == key2;
12056 } 13478 }
12057 13479
12058 13480
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
12285 } 13707 }
12286 13708
12287 13709
12288 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { 13710 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) {
12289 v8::HandleScope outer(isolate); 13711 v8::HandleScope outer(isolate);
12290 v8::Local<Context> env = Context::New(isolate); 13712 v8::Local<Context> env = Context::New(isolate);
12291 env->Enter(); 13713 env->Enter();
12292 13714
12293 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); 13715 Local<ObjectTemplate> t = ObjectTemplate::New(isolate);
12294 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback)); 13716 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback));
12295 env->Global()->Set(v8_str("obj"), t->NewInstance()); 13717 CHECK(env->Global()
13718 ->Set(env, v8_str("obj"), t->NewInstance(env).ToLocalChecked())
13719 .FromJust());
12296 13720
12297 const char* script = 13721 const char* script =
12298 "function bar() {\n" 13722 "function bar() {\n"
12299 " var sum = 0;\n" 13723 " var sum = 0;\n"
12300 " for (i = 0; i < 100; ++i)\n" 13724 " for (i = 0; i < 100; ++i)\n"
12301 " sum = foo(i);\n" 13725 " sum = foo(i);\n"
12302 " return sum;\n" 13726 " return sum;\n"
12303 "}\n" 13727 "}\n"
12304 "function foo(i) { return i * i; }\n" 13728 "function foo(i) { return i * i; }\n"
12305 "// Invoke on the runtime function.\n" 13729 "// Invoke on the runtime function.\n"
12306 "obj.asdf()"; 13730 "obj.asdf()";
12307 CompileRun(script); 13731 CompileRun(script);
12308 bar_func_ = i::Handle<i::JSFunction>::cast( 13732 bar_func_ = i::Handle<i::JSFunction>::cast(
12309 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar")))); 13733 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("bar"))));
12310 DCHECK(!bar_func_.is_null()); 13734 DCHECK(!bar_func_.is_null());
12311 13735
12312 foo_func_ = 13736 foo_func_ =
12313 i::Handle<i::JSFunction>::cast( 13737 i::Handle<i::JSFunction>::cast(
12314 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo")))); 13738 v8::Utils::OpenHandle(*env->Global()->Get(v8_str("foo"))));
12315 DCHECK(!foo_func_.is_null()); 13739 DCHECK(!foo_func_.is_null());
12316 13740
12317 v8::Handle<v8::Value> value = CompileRun("bar();"); 13741 v8::Local<v8::Value> value = CompileRun("bar();");
12318 CHECK(value->IsNumber()); 13742 CHECK(value->IsNumber());
12319 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); 13743 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value());
12320 13744
12321 // Test the optimized codegen path. 13745 // Test the optimized codegen path.
12322 value = CompileRun("%OptimizeFunctionOnNextCall(foo);" 13746 value = CompileRun("%OptimizeFunctionOnNextCall(foo);"
12323 "bar();"); 13747 "bar();");
12324 CHECK(value->IsNumber()); 13748 CHECK(value->IsNumber());
12325 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value()); 13749 CHECK_EQ(9801.0, v8::Number::Cast(*value)->Value());
12326 13750
12327 env->Exit(); 13751 env->Exit();
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
12672 LocalContext context; 14096 LocalContext context;
12673 v8::Isolate* isolate = context->GetIsolate(); 14097 v8::Isolate* isolate = context->GetIsolate();
12674 v8::HandleScope outer(isolate); 14098 v8::HandleScope outer(isolate);
12675 static v8::Persistent<v8::ObjectTemplate> templ; 14099 static v8::Persistent<v8::ObjectTemplate> templ;
12676 if (templ.IsEmpty()) { 14100 if (templ.IsEmpty()) {
12677 v8::EscapableHandleScope inner(isolate); 14101 v8::EscapableHandleScope inner(isolate);
12678 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(isolate); 14102 v8::Local<v8::ObjectTemplate> local = v8::ObjectTemplate::New(isolate);
12679 local->SetInternalFieldCount(1); 14103 local->SetInternalFieldCount(1);
12680 templ.Reset(isolate, inner.Escape(local)); 14104 templ.Reset(isolate, inner.Escape(local));
12681 } 14105 }
12682 v8::Handle<v8::Object> result = 14106 v8::Local<v8::Object> result =
12683 v8::Local<v8::ObjectTemplate>::New(isolate, templ)->NewInstance(); 14107 v8::Local<v8::ObjectTemplate>::New(isolate, templ)
14108 ->NewInstance(context.local())
14109 .ToLocalChecked();
12684 CHECK_EQ(1, result->InternalFieldCount()); 14110 CHECK_EQ(1, result->InternalFieldCount());
12685 } 14111 }
12686 14112
12687 14113
12688 // If part of the threaded tests, this test makes ThreadingTest fail 14114 // If part of the threaded tests, this test makes ThreadingTest fail
12689 // on mac. 14115 // on mac.
12690 TEST(CatchStackOverflow) { 14116 TEST(CatchStackOverflow) {
12691 LocalContext context; 14117 LocalContext context;
12692 v8::HandleScope scope(context->GetIsolate()); 14118 v8::HandleScope scope(context->GetIsolate());
12693 v8::TryCatch try_catch(context->GetIsolate()); 14119 v8::TryCatch try_catch(context->GetIsolate());
12694 v8::Handle<v8::Value> result = CompileRun( 14120 v8::Local<v8::Value> result = CompileRun(
12695 "function f() {" 14121 "function f() {"
12696 " return f();" 14122 " return f();"
12697 "}" 14123 "}"
12698 "" 14124 ""
12699 "f();"); 14125 "f();");
12700 CHECK(result.IsEmpty()); 14126 CHECK(result.IsEmpty());
12701 } 14127 }
12702 14128
12703 14129
12704 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, 14130 static void CheckTryCatchSourceInfo(v8::Local<v8::Script> script,
12705 const char* resource_name, 14131 const char* resource_name,
12706 int line_offset) { 14132 int line_offset) {
12707 v8::HandleScope scope(CcTest::isolate()); 14133 v8::HandleScope scope(CcTest::isolate());
12708 v8::TryCatch try_catch(CcTest::isolate()); 14134 v8::TryCatch try_catch(CcTest::isolate());
12709 v8::Handle<v8::Value> result = script->Run(); 14135 v8::Local<v8::Value> result = script->Run();
12710 CHECK(result.IsEmpty()); 14136 CHECK(result.IsEmpty());
12711 CHECK(try_catch.HasCaught()); 14137 CHECK(try_catch.HasCaught());
12712 v8::Handle<v8::Message> message = try_catch.Message(); 14138 v8::Local<v8::Message> message = try_catch.Message();
12713 CHECK(!message.IsEmpty()); 14139 CHECK(!message.IsEmpty());
12714 CHECK_EQ(10 + line_offset, message->GetLineNumber()); 14140 CHECK_EQ(10 + line_offset, message->GetLineNumber());
12715 CHECK_EQ(91, message->GetStartPosition()); 14141 CHECK_EQ(91, message->GetStartPosition());
12716 CHECK_EQ(92, message->GetEndPosition()); 14142 CHECK_EQ(92, message->GetEndPosition());
12717 CHECK_EQ(2, message->GetStartColumn()); 14143 CHECK_EQ(2, message->GetStartColumn());
12718 CHECK_EQ(3, message->GetEndColumn()); 14144 CHECK_EQ(3, message->GetEndColumn());
12719 v8::String::Utf8Value line(message->GetSourceLine()); 14145 v8::String::Utf8Value line(message->GetSourceLine());
12720 CHECK_EQ(0, strcmp(" throw 'nirk';", *line)); 14146 CHECK_EQ(0, strcmp(" throw 'nirk';", *line));
12721 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName()); 14147 v8::String::Utf8Value name(message->GetScriptOrigin().ResourceName());
12722 CHECK_EQ(0, strcmp(resource_name, *name)); 14148 CHECK_EQ(0, strcmp(resource_name, *name));
(...skipping 12 matching lines...) Expand all
12735 " return Baz();\n" 14161 " return Baz();\n"
12736 "}\n" 14162 "}\n"
12737 "\n" 14163 "\n"
12738 "function Baz() {\n" 14164 "function Baz() {\n"
12739 " throw 'nirk';\n" 14165 " throw 'nirk';\n"
12740 "}\n" 14166 "}\n"
12741 "\n" 14167 "\n"
12742 "Foo();\n"); 14168 "Foo();\n");
12743 14169
12744 const char* resource_name; 14170 const char* resource_name;
12745 v8::Handle<v8::Script> script; 14171 v8::Local<v8::Script> script;
12746 resource_name = "test.js"; 14172 resource_name = "test.js";
12747 script = CompileWithOrigin(source, resource_name); 14173 script = CompileWithOrigin(source, resource_name);
12748 CheckTryCatchSourceInfo(script, resource_name, 0); 14174 CheckTryCatchSourceInfo(script, resource_name, 0);
12749 14175
12750 resource_name = "test1.js"; 14176 resource_name = "test1.js";
12751 v8::ScriptOrigin origin1( 14177 v8::ScriptOrigin origin1(v8_str(resource_name));
12752 v8::String::NewFromUtf8(context->GetIsolate(), resource_name));
12753 script = v8::Script::Compile(source, &origin1); 14178 script = v8::Script::Compile(source, &origin1);
12754 CheckTryCatchSourceInfo(script, resource_name, 0); 14179 CheckTryCatchSourceInfo(script, resource_name, 0);
12755 14180
12756 resource_name = "test2.js"; 14181 resource_name = "test2.js";
12757 v8::ScriptOrigin origin2( 14182 v8::ScriptOrigin origin2(v8_str(resource_name),
12758 v8::String::NewFromUtf8(context->GetIsolate(), resource_name), 14183 v8::Integer::New(context->GetIsolate(), 7));
12759 v8::Integer::New(context->GetIsolate(), 7));
12760 script = v8::Script::Compile(source, &origin2); 14184 script = v8::Script::Compile(source, &origin2);
12761 CheckTryCatchSourceInfo(script, resource_name, 7); 14185 CheckTryCatchSourceInfo(script, resource_name, 7);
12762 } 14186 }
12763 14187
12764 14188
12765 THREADED_TEST(TryCatchSourceInfoForEOSError) { 14189 THREADED_TEST(TryCatchSourceInfoForEOSError) {
12766 LocalContext context; 14190 LocalContext context;
12767 v8::HandleScope scope(context->GetIsolate()); 14191 v8::HandleScope scope(context->GetIsolate());
12768 v8::TryCatch try_catch(context->GetIsolate()); 14192 v8::TryCatch try_catch(context->GetIsolate());
12769 v8::Script::Compile(v8_str("!\n")); 14193 v8::Script::Compile(v8_str("!\n"));
12770 CHECK(try_catch.HasCaught()); 14194 CHECK(try_catch.HasCaught());
12771 v8::Handle<v8::Message> message = try_catch.Message(); 14195 v8::Local<v8::Message> message = try_catch.Message();
12772 CHECK_EQ(1, message->GetLineNumber()); 14196 CHECK_EQ(1, message->GetLineNumber());
12773 CHECK_EQ(0, message->GetStartColumn()); 14197 CHECK_EQ(0, message->GetStartColumn());
12774 } 14198 }
12775 14199
12776 14200
12777 THREADED_TEST(CompilationCache) { 14201 THREADED_TEST(CompilationCache) {
12778 LocalContext context; 14202 LocalContext context;
12779 v8::HandleScope scope(context->GetIsolate()); 14203 v8::HandleScope scope(context->GetIsolate());
12780 v8::Handle<v8::String> source0 = 14204 v8::Local<v8::String> source0 = v8_str("1234");
12781 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); 14205 v8::Local<v8::String> source1 = v8_str("1234");
12782 v8::Handle<v8::String> source1 = 14206 v8::Local<v8::Script> script0 = CompileWithOrigin(source0, "test.js");
12783 v8::String::NewFromUtf8(context->GetIsolate(), "1234"); 14207 v8::Local<v8::Script> script1 = CompileWithOrigin(source1, "test.js");
12784 v8::Handle<v8::Script> script0 = CompileWithOrigin(source0, "test.js"); 14208 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 14209 v8::Script::Compile(source0); // different origin
12788 CHECK_EQ(1234, script0->Run()->Int32Value()); 14210 CHECK_EQ(1234, script0->Run()->Int32Value(context.local()).FromJust());
12789 CHECK_EQ(1234, script1->Run()->Int32Value()); 14211 CHECK_EQ(1234, script1->Run()->Int32Value(context.local()).FromJust());
12790 CHECK_EQ(1234, script2->Run()->Int32Value()); 14212 CHECK_EQ(1234, script2->Run()->Int32Value(context.local()).FromJust());
12791 } 14213 }
12792 14214
12793 14215
12794 static void FunctionNameCallback( 14216 static void FunctionNameCallback(
12795 const v8::FunctionCallbackInfo<v8::Value>& args) { 14217 const v8::FunctionCallbackInfo<v8::Value>& args) {
12796 ApiTestFuzzer::Fuzz(); 14218 ApiTestFuzzer::Fuzz();
12797 args.GetReturnValue().Set(v8_num(42)); 14219 args.GetReturnValue().Set(v8_num(42));
12798 } 14220 }
12799 14221
12800 14222
12801 THREADED_TEST(CallbackFunctionName) { 14223 THREADED_TEST(CallbackFunctionName) {
12802 LocalContext context; 14224 LocalContext context;
12803 v8::Isolate* isolate = context->GetIsolate(); 14225 v8::Isolate* isolate = context->GetIsolate();
12804 v8::HandleScope scope(isolate); 14226 v8::HandleScope scope(isolate);
12805 Local<ObjectTemplate> t = ObjectTemplate::New(isolate); 14227 Local<ObjectTemplate> t = ObjectTemplate::New(isolate);
12806 t->Set(v8_str("asdf"), 14228 t->Set(v8_str("asdf"),
12807 v8::FunctionTemplate::New(isolate, FunctionNameCallback)); 14229 v8::FunctionTemplate::New(isolate, FunctionNameCallback));
12808 context->Global()->Set(v8_str("obj"), t->NewInstance()); 14230 CHECK(context->Global()
12809 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name"); 14231 ->Set(context.local(), v8_str("obj"),
14232 t->NewInstance(context.local()).ToLocalChecked())
14233 .FromJust());
14234 v8::Local<v8::Value> value = CompileRun("obj.asdf.name");
12810 CHECK(value->IsString()); 14235 CHECK(value->IsString());
12811 v8::String::Utf8Value name(value); 14236 v8::String::Utf8Value name(value);
12812 CHECK_EQ(0, strcmp("asdf", *name)); 14237 CHECK_EQ(0, strcmp("asdf", *name));
12813 } 14238 }
12814 14239
12815 14240
12816 THREADED_TEST(DateAccess) { 14241 THREADED_TEST(DateAccess) {
12817 LocalContext context; 14242 LocalContext context;
12818 v8::HandleScope scope(context->GetIsolate()); 14243 v8::HandleScope scope(context->GetIsolate());
12819 v8::Handle<v8::Value> date = 14244 v8::Local<v8::Value> date =
12820 v8::Date::New(context->GetIsolate(), 1224744689038.0); 14245 v8::Date::New(context->GetIsolate(), 1224744689038.0);
12821 CHECK(date->IsDate()); 14246 CHECK(date->IsDate());
12822 CHECK_EQ(1224744689038.0, date.As<v8::Date>()->ValueOf()); 14247 CHECK_EQ(1224744689038.0, date.As<v8::Date>()->ValueOf());
12823 } 14248 }
12824 14249
12825 14250
12826 void CheckProperties(v8::Isolate* isolate, v8::Handle<v8::Value> val, 14251 void CheckProperties(v8::Isolate* isolate, v8::Local<v8::Value> val,
12827 unsigned elmc, const char* elmv[]) { 14252 unsigned elmc, const char* elmv[]) {
12828 v8::Handle<v8::Object> obj = val.As<v8::Object>(); 14253 v8::Local<v8::Object> obj = val.As<v8::Object>();
12829 v8::Handle<v8::Array> props = obj->GetPropertyNames(); 14254 v8::Local<v8::Array> props = obj->GetPropertyNames();
12830 CHECK_EQ(elmc, props->Length()); 14255 CHECK_EQ(elmc, props->Length());
12831 for (unsigned i = 0; i < elmc; i++) { 14256 for (unsigned i = 0; i < elmc; i++) {
12832 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); 14257 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i)));
12833 CHECK_EQ(0, strcmp(elmv[i], *elm)); 14258 CHECK_EQ(0, strcmp(elmv[i], *elm));
12834 } 14259 }
12835 } 14260 }
12836 14261
12837 14262
12838 void CheckOwnProperties(v8::Isolate* isolate, v8::Handle<v8::Value> val, 14263 void CheckOwnProperties(v8::Isolate* isolate, v8::Local<v8::Value> val,
12839 unsigned elmc, const char* elmv[]) { 14264 unsigned elmc, const char* elmv[]) {
12840 v8::Handle<v8::Object> obj = val.As<v8::Object>(); 14265 v8::Local<v8::Object> obj = val.As<v8::Object>();
12841 v8::Handle<v8::Array> props = obj->GetOwnPropertyNames(); 14266 v8::Local<v8::Array> props = obj->GetOwnPropertyNames();
12842 CHECK_EQ(elmc, props->Length()); 14267 CHECK_EQ(elmc, props->Length());
12843 for (unsigned i = 0; i < elmc; i++) { 14268 for (unsigned i = 0; i < elmc; i++) {
12844 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i))); 14269 v8::String::Utf8Value elm(props->Get(v8::Integer::New(isolate, i)));
12845 CHECK_EQ(0, strcmp(elmv[i], *elm)); 14270 CHECK_EQ(0, strcmp(elmv[i], *elm));
12846 } 14271 }
12847 } 14272 }
12848 14273
12849 14274
12850 THREADED_TEST(PropertyEnumeration) { 14275 THREADED_TEST(PropertyEnumeration) {
12851 LocalContext context; 14276 LocalContext context;
12852 v8::Isolate* isolate = context->GetIsolate(); 14277 v8::Isolate* isolate = context->GetIsolate();
12853 v8::HandleScope scope(isolate); 14278 v8::HandleScope scope(isolate);
12854 v8::Handle<v8::Value> obj = CompileRun( 14279 v8::Local<v8::Value> obj = CompileRun(
12855 "var result = [];" 14280 "var result = [];"
12856 "result[0] = {};" 14281 "result[0] = {};"
12857 "result[1] = {a: 1, b: 2};" 14282 "result[1] = {a: 1, b: 2};"
12858 "result[2] = [1, 2, 3];" 14283 "result[2] = [1, 2, 3];"
12859 "var proto = {x: 1, y: 2, z: 3};" 14284 "var proto = {x: 1, y: 2, z: 3};"
12860 "var x = { __proto__: proto, w: 0, z: 1 };" 14285 "var x = { __proto__: proto, w: 0, z: 1 };"
12861 "result[3] = x;" 14286 "result[3] = x;"
12862 "result;"); 14287 "result;");
12863 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); 14288 v8::Local<v8::Array> elms = obj.As<v8::Array>();
12864 CHECK_EQ(4u, elms->Length()); 14289 CHECK_EQ(4u, elms->Length());
12865 int elmc0 = 0; 14290 int elmc0 = 0;
12866 const char** elmv0 = NULL; 14291 const char** elmv0 = NULL;
12867 CheckProperties( 14292 CheckProperties(
12868 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); 14293 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0);
12869 CheckOwnProperties( 14294 CheckOwnProperties(
12870 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); 14295 isolate, elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0);
12871 int elmc1 = 2; 14296 int elmc1 = 2;
12872 const char* elmv1[] = {"a", "b"}; 14297 const char* elmv1[] = {"a", "b"};
12873 CheckProperties( 14298 CheckProperties(
(...skipping 14 matching lines...) Expand all
12888 const char* elmv4[] = {"w", "z"}; 14313 const char* elmv4[] = {"w", "z"};
12889 CheckOwnProperties( 14314 CheckOwnProperties(
12890 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4); 14315 isolate, elms->Get(v8::Integer::New(isolate, 3)), elmc4, elmv4);
12891 } 14316 }
12892 14317
12893 14318
12894 THREADED_TEST(PropertyEnumeration2) { 14319 THREADED_TEST(PropertyEnumeration2) {
12895 LocalContext context; 14320 LocalContext context;
12896 v8::Isolate* isolate = context->GetIsolate(); 14321 v8::Isolate* isolate = context->GetIsolate();
12897 v8::HandleScope scope(isolate); 14322 v8::HandleScope scope(isolate);
12898 v8::Handle<v8::Value> obj = CompileRun( 14323 v8::Local<v8::Value> obj = CompileRun(
12899 "var result = [];" 14324 "var result = [];"
12900 "result[0] = {};" 14325 "result[0] = {};"
12901 "result[1] = {a: 1, b: 2};" 14326 "result[1] = {a: 1, b: 2};"
12902 "result[2] = [1, 2, 3];" 14327 "result[2] = [1, 2, 3];"
12903 "var proto = {x: 1, y: 2, z: 3};" 14328 "var proto = {x: 1, y: 2, z: 3};"
12904 "var x = { __proto__: proto, w: 0, z: 1 };" 14329 "var x = { __proto__: proto, w: 0, z: 1 };"
12905 "result[3] = x;" 14330 "result[3] = x;"
12906 "result;"); 14331 "result;");
12907 v8::Handle<v8::Array> elms = obj.As<v8::Array>(); 14332 v8::Local<v8::Array> elms = obj.As<v8::Array>();
12908 CHECK_EQ(4u, elms->Length()); 14333 CHECK_EQ(4u, elms->Length());
12909 int elmc0 = 0; 14334 int elmc0 = 0;
12910 const char** elmv0 = NULL; 14335 const char** elmv0 = NULL;
12911 CheckProperties(isolate, 14336 CheckProperties(isolate,
12912 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0); 14337 elms->Get(v8::Integer::New(isolate, 0)), elmc0, elmv0);
12913 14338
12914 v8::Handle<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0)); 14339 v8::Local<v8::Value> val = elms->Get(v8::Integer::New(isolate, 0));
12915 v8::Handle<v8::Array> props = val.As<v8::Object>()->GetPropertyNames(); 14340 v8::Local<v8::Array> props = val.As<v8::Object>()->GetPropertyNames();
12916 CHECK_EQ(0u, props->Length()); 14341 CHECK_EQ(0u, props->Length());
12917 for (uint32_t i = 0; i < props->Length(); i++) { 14342 for (uint32_t i = 0; i < props->Length(); i++) {
12918 printf("p[%u]\n", i); 14343 printf("p[%u]\n", i);
12919 } 14344 }
12920 } 14345 }
12921 14346
12922 14347
12923 THREADED_TEST(AccessChecksReenabledCorrectly) { 14348 THREADED_TEST(AccessChecksReenabledCorrectly) {
12924 LocalContext context; 14349 LocalContext context;
12925 v8::Isolate* isolate = context->GetIsolate(); 14350 v8::Isolate* isolate = context->GetIsolate();
(...skipping 10 matching lines...) Expand all
12936 for (char j = '0'; j <= '9'; j++) { 14361 for (char j = '0'; j <= '9'; j++) {
12937 buf[1] = j; 14362 buf[1] = j;
12938 for (char k = '0'; k <= '9'; k++) { 14363 for (char k = '0'; k <= '9'; k++) {
12939 buf[2] = k; 14364 buf[2] = k;
12940 buf[3] = 0; 14365 buf[3] = 0;
12941 templ->Set(v8_str(buf), v8::Number::New(isolate, k)); 14366 templ->Set(v8_str(buf), v8::Number::New(isolate, k));
12942 } 14367 }
12943 } 14368 }
12944 } 14369 }
12945 14370
12946 Local<v8::Object> instance_1 = templ->NewInstance(); 14371 Local<v8::Object> instance_1 =
12947 context->Global()->Set(v8_str("obj_1"), instance_1); 14372 templ->NewInstance(context.local()).ToLocalChecked();
14373 CHECK(context->Global()
14374 ->Set(context.local(), v8_str("obj_1"), instance_1)
14375 .FromJust());
12948 14376
12949 Local<Value> value_1 = CompileRun("obj_1.a"); 14377 Local<Value> value_1 = CompileRun("obj_1.a");
12950 CHECK(value_1.IsEmpty()); 14378 CHECK(value_1.IsEmpty());
12951 14379
12952 Local<v8::Object> instance_2 = templ->NewInstance(); 14380 Local<v8::Object> instance_2 =
12953 context->Global()->Set(v8_str("obj_2"), instance_2); 14381 templ->NewInstance(context.local()).ToLocalChecked();
14382 CHECK(context->Global()
14383 ->Set(context.local(), v8_str("obj_2"), instance_2)
14384 .FromJust());
12954 14385
12955 Local<Value> value_2 = CompileRun("obj_2.a"); 14386 Local<Value> value_2 = CompileRun("obj_2.a");
12956 CHECK(value_2.IsEmpty()); 14387 CHECK(value_2.IsEmpty());
12957 } 14388 }
12958 14389
12959 14390
12960 // Tests that ScriptData can be serialized and deserialized. 14391 // Tests that ScriptData can be serialized and deserialized.
12961 TEST(PreCompileSerialization) { 14392 TEST(PreCompileSerialization) {
12962 v8::V8::Initialize(); 14393 v8::V8::Initialize();
12963 LocalContext env; 14394 LocalContext env;
(...skipping 25 matching lines...) Expand all
12989 // This tests that we do not allow dictionary load/call inline caches 14420 // This tests that we do not allow dictionary load/call inline caches
12990 // to use functions that have not yet been compiled. The potential 14421 // to use functions that have not yet been compiled. The potential
12991 // problem of loading a function that has not yet been compiled can 14422 // problem of loading a function that has not yet been compiled can
12992 // arise because we share code between contexts via the compilation 14423 // arise because we share code between contexts via the compilation
12993 // cache. 14424 // cache.
12994 THREADED_TEST(DictionaryICLoadedFunction) { 14425 THREADED_TEST(DictionaryICLoadedFunction) {
12995 v8::HandleScope scope(CcTest::isolate()); 14426 v8::HandleScope scope(CcTest::isolate());
12996 // Test LoadIC. 14427 // Test LoadIC.
12997 for (int i = 0; i < 2; i++) { 14428 for (int i = 0; i < 2; i++) {
12998 LocalContext context; 14429 LocalContext context;
12999 context->Global()->Set(v8_str("tmp"), v8::True(CcTest::isolate())); 14430 CHECK(context->Global()
14431 ->Set(context.local(), v8_str("tmp"), v8::True(CcTest::isolate()))
14432 .FromJust());
13000 context->Global()->Delete(v8_str("tmp")); 14433 context->Global()->Delete(v8_str("tmp"));
13001 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');"); 14434 CompileRun("for (var j = 0; j < 10; j++) new RegExp('');");
13002 } 14435 }
13003 // Test CallIC. 14436 // Test CallIC.
13004 for (int i = 0; i < 2; i++) { 14437 for (int i = 0; i < 2; i++) {
13005 LocalContext context; 14438 LocalContext context;
13006 context->Global()->Set(v8_str("tmp"), v8::True(CcTest::isolate())); 14439 CHECK(context->Global()
14440 ->Set(context.local(), v8_str("tmp"), v8::True(CcTest::isolate()))
14441 .FromJust());
13007 context->Global()->Delete(v8_str("tmp")); 14442 context->Global()->Delete(v8_str("tmp"));
13008 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); 14443 CompileRun("for (var j = 0; j < 10; j++) RegExp('')");
13009 } 14444 }
13010 } 14445 }
13011 14446
13012 14447
13013 // Test that cross-context new calls use the context of the callee to 14448 // Test that cross-context new calls use the context of the callee to
13014 // create the new JavaScript object. 14449 // create the new JavaScript object.
13015 THREADED_TEST(CrossContextNew) { 14450 THREADED_TEST(CrossContextNew) {
13016 v8::Isolate* isolate = CcTest::isolate(); 14451 v8::Isolate* isolate = CcTest::isolate();
13017 v8::HandleScope scope(isolate); 14452 v8::HandleScope scope(isolate);
13018 v8::Local<Context> context0 = Context::New(isolate); 14453 v8::Local<Context> context0 = Context::New(isolate);
13019 v8::Local<Context> context1 = Context::New(isolate); 14454 v8::Local<Context> context1 = Context::New(isolate);
13020 14455
13021 // Allow cross-domain access. 14456 // Allow cross-domain access.
13022 Local<String> token = v8_str("<security token>"); 14457 Local<String> token = v8_str("<security token>");
13023 context0->SetSecurityToken(token); 14458 context0->SetSecurityToken(token);
13024 context1->SetSecurityToken(token); 14459 context1->SetSecurityToken(token);
13025 14460
13026 // Set an 'x' property on the Object prototype and define a 14461 // Set an 'x' property on the Object prototype and define a
13027 // constructor function in context0. 14462 // constructor function in context0.
13028 context0->Enter(); 14463 context0->Enter();
13029 CompileRun("Object.prototype.x = 42; function C() {};"); 14464 CompileRun("Object.prototype.x = 42; function C() {};");
13030 context0->Exit(); 14465 context0->Exit();
13031 14466
13032 // Call the constructor function from context0 and check that the 14467 // Call the constructor function from context0 and check that the
13033 // result has the 'x' property. 14468 // result has the 'x' property.
13034 context1->Enter(); 14469 context1->Enter();
13035 context1->Global()->Set(v8_str("other"), context0->Global()); 14470 CHECK(context1->Global()
14471 ->Set(context1, v8_str("other"), context0->Global())
14472 .FromJust());
13036 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); 14473 Local<Value> value = CompileRun("var instance = new other.C(); instance.x");
13037 CHECK(value->IsInt32()); 14474 CHECK(value->IsInt32());
13038 CHECK_EQ(42, value->Int32Value()); 14475 CHECK_EQ(42, value->Int32Value(context1).FromJust());
13039 context1->Exit(); 14476 context1->Exit();
13040 } 14477 }
13041 14478
13042 14479
13043 // Verify that we can clone an object 14480 // Verify that we can clone an object
13044 TEST(ObjectClone) { 14481 TEST(ObjectClone) {
13045 LocalContext env; 14482 LocalContext env;
13046 v8::Isolate* isolate = env->GetIsolate(); 14483 v8::Isolate* isolate = env->GetIsolate();
13047 v8::HandleScope scope(isolate); 14484 v8::HandleScope scope(isolate);
13048 14485
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
13139 i::Vector<const uint16_t>(two_byte_string, 14576 i::Vector<const uint16_t>(two_byte_string,
13140 i::StrLength(c_string))); 14577 i::StrLength(c_string)));
13141 14578
13142 Local<String> lhs( 14579 Local<String> lhs(
13143 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( 14580 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte(
13144 &one_byte_resource).ToHandleChecked())); 14581 &one_byte_resource).ToHandleChecked()));
13145 Local<String> rhs( 14582 Local<String> rhs(
13146 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte( 14583 v8::Utils::ToLocal(factory->NewExternalStringFromOneByte(
13147 &one_byte_resource).ToHandleChecked())); 14584 &one_byte_resource).ToHandleChecked()));
13148 14585
13149 env->Global()->Set(v8_str("lhs"), lhs); 14586 CHECK(env->Global()->Set(env.local(), v8_str("lhs"), lhs).FromJust());
13150 env->Global()->Set(v8_str("rhs"), rhs); 14587 CHECK(env->Global()->Set(env.local(), v8_str("rhs"), rhs).FromJust());
13151 14588
13152 CompileRun( 14589 CompileRun(
13153 "var cons = lhs + rhs;" 14590 "var cons = lhs + rhs;"
13154 "var slice = lhs.substring(1, lhs.length - 1);" 14591 "var slice = lhs.substring(1, lhs.length - 1);"
13155 "var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);"); 14592 "var slice_on_cons = (lhs + rhs).substring(1, lhs.length *2 - 1);");
13156 14593
13157 CHECK(lhs->IsOneByte()); 14594 CHECK(lhs->IsOneByte());
13158 CHECK(rhs->IsOneByte()); 14595 CHECK(rhs->IsOneByte());
13159 14596
13160 MorphAString(*v8::Utils::OpenHandle(*lhs), &one_byte_resource, 14597 MorphAString(*v8::Utils::OpenHandle(*lhs), &one_byte_resource,
13161 &uc16_resource); 14598 &uc16_resource);
13162 MorphAString(*v8::Utils::OpenHandle(*rhs), &one_byte_resource, 14599 MorphAString(*v8::Utils::OpenHandle(*rhs), &one_byte_resource,
13163 &uc16_resource); 14600 &uc16_resource);
13164 14601
13165 // This should UTF-8 without flattening, since everything is ASCII. 14602 // This should UTF-8 without flattening, since everything is ASCII.
13166 Handle<String> cons = v8_compile("cons")->Run().As<String>(); 14603 Local<String> cons = v8_compile("cons")->Run().As<String>();
13167 CHECK_EQ(128, cons->Utf8Length()); 14604 CHECK_EQ(128, cons->Utf8Length());
13168 int nchars = -1; 14605 int nchars = -1;
13169 CHECK_EQ(129, cons->WriteUtf8(utf_buffer, -1, &nchars)); 14606 CHECK_EQ(129, cons->WriteUtf8(utf_buffer, -1, &nchars));
13170 CHECK_EQ(128, nchars); 14607 CHECK_EQ(128, nchars);
13171 CHECK_EQ(0, strcmp( 14608 CHECK_EQ(0, strcmp(
13172 utf_buffer, 14609 utf_buffer,
13173 "Now is the time for all good men to come to the aid of the party" 14610 "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")); 14611 "Now is the time for all good men to come to the aid of the party"));
13175 14612
13176 // Now do some stuff to make sure the strings are flattened, etc. 14613 // Now do some stuff to make sure the strings are flattened, etc.
13177 CompileRun( 14614 CompileRun(
13178 "/[^a-z]/.test(cons);" 14615 "/[^a-z]/.test(cons);"
13179 "/[^a-z]/.test(slice);" 14616 "/[^a-z]/.test(slice);"
13180 "/[^a-z]/.test(slice_on_cons);"); 14617 "/[^a-z]/.test(slice_on_cons);");
13181 const char* expected_cons = 14618 const char* expected_cons =
13182 "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"
13183 "Now is the time for all good men to come to the aid of the party"; 14620 "Now is the time for all good men to come to the aid of the party";
13184 const char* expected_slice = 14621 const char* expected_slice =
13185 "ow is the time for all good men to come to the aid of the part"; 14622 "ow is the time for all good men to come to the aid of the part";
13186 const char* expected_slice_on_cons = 14623 const char* expected_slice_on_cons =
13187 "ow is the time for all good men to come to the aid of the party" 14624 "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"; 14625 "Now is the time for all good men to come to the aid of the part";
13189 CHECK(String::NewFromUtf8(env->GetIsolate(), expected_cons) 14626 CHECK(v8_str(expected_cons)->Equals(env->Global()->Get(v8_str("cons"))));
13190 ->Equals(env->Global()->Get(v8_str("cons")))); 14627 CHECK(v8_str(expected_slice)->Equals(env->Global()->Get(v8_str("slice"))));
13191 CHECK(String::NewFromUtf8(env->GetIsolate(), expected_slice) 14628 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")))); 14629 ->Equals(env->Global()->Get(v8_str("slice_on_cons"))));
13195 } 14630 }
13196 i::DeleteArray(two_byte_string); 14631 i::DeleteArray(two_byte_string);
13197 } 14632 }
13198 14633
13199 14634
13200 TEST(CompileExternalTwoByteSource) { 14635 TEST(CompileExternalTwoByteSource) {
13201 LocalContext context; 14636 LocalContext context;
13202 v8::HandleScope scope(context->GetIsolate()); 14637 v8::HandleScope scope(context->GetIsolate());
13203 14638
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
13297 } 14732 }
13298 14733
13299 #endif // V8_INTERPRETED_REGEXP 14734 #endif // V8_INTERPRETED_REGEXP
13300 14735
13301 14736
13302 // Test that we cannot set a property on the global object if there 14737 // Test that we cannot set a property on the global object if there
13303 // is a read-only property in the prototype chain. 14738 // is a read-only property in the prototype chain.
13304 TEST(ReadOnlyPropertyInGlobalProto) { 14739 TEST(ReadOnlyPropertyInGlobalProto) {
13305 v8::Isolate* isolate = CcTest::isolate(); 14740 v8::Isolate* isolate = CcTest::isolate();
13306 v8::HandleScope scope(isolate); 14741 v8::HandleScope scope(isolate);
13307 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 14742 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
13308 LocalContext context(0, templ); 14743 LocalContext context(0, templ);
13309 v8::Handle<v8::Object> global = context->Global(); 14744 v8::Local<v8::Object> global = context->Global();
13310 v8::Handle<v8::Object> global_proto = 14745 v8::Local<v8::Object> global_proto =
13311 v8::Handle<v8::Object>::Cast(global->Get(v8_str("__proto__"))); 14746 v8::Local<v8::Object>::Cast(global->Get(v8_str("__proto__")));
13312 global_proto->ForceSet(v8_str("x"), v8::Integer::New(isolate, 0), 14747 global_proto->ForceSet(v8_str("x"), v8::Integer::New(isolate, 0),
13313 v8::ReadOnly); 14748 v8::ReadOnly);
13314 global_proto->ForceSet(v8_str("y"), v8::Integer::New(isolate, 0), 14749 global_proto->ForceSet(v8_str("y"), v8::Integer::New(isolate, 0),
13315 v8::ReadOnly); 14750 v8::ReadOnly);
13316 // Check without 'eval' or 'with'. 14751 // Check without 'eval' or 'with'.
13317 v8::Handle<v8::Value> res = 14752 v8::Local<v8::Value> res =
13318 CompileRun("function f() { x = 42; return x; }; f()"); 14753 CompileRun("function f() { x = 42; return x; }; f()");
13319 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); 14754 CHECK(v8::Integer::New(isolate, 0)->Equals(res));
13320 // Check with 'eval'. 14755 // Check with 'eval'.
13321 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()"); 14756 res = CompileRun("function f() { eval('1'); y = 43; return y; }; f()");
13322 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); 14757 CHECK(v8::Integer::New(isolate, 0)->Equals(res));
13323 // Check with 'with'. 14758 // Check with 'with'.
13324 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()"); 14759 res = CompileRun("function f() { with (this) { y = 44 }; return y; }; f()");
13325 CHECK(v8::Integer::New(isolate, 0)->Equals(res)); 14760 CHECK(v8::Integer::New(isolate, 0)->Equals(res));
13326 } 14761 }
13327 14762
(...skipping 30 matching lines...) Expand all
13358 } 14793 }
13359 14794
13360 14795
13361 TEST(ForceSet) { 14796 TEST(ForceSet) {
13362 force_set_get_count = 0; 14797 force_set_get_count = 0;
13363 force_set_set_count = 0; 14798 force_set_set_count = 0;
13364 pass_on_get = false; 14799 pass_on_get = false;
13365 14800
13366 v8::Isolate* isolate = CcTest::isolate(); 14801 v8::Isolate* isolate = CcTest::isolate();
13367 v8::HandleScope scope(isolate); 14802 v8::HandleScope scope(isolate);
13368 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 14803 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
13369 v8::Handle<v8::String> access_property = 14804 v8::Local<v8::String> access_property = v8_str("a");
13370 v8::String::NewFromUtf8(isolate, "a");
13371 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter); 14805 templ->SetAccessor(access_property, ForceSetGetter, ForceSetSetter);
13372 LocalContext context(NULL, templ); 14806 LocalContext context(NULL, templ);
13373 v8::Handle<v8::Object> global = context->Global(); 14807 v8::Local<v8::Object> global = context->Global();
13374 14808
13375 // Ordinary properties 14809 // Ordinary properties
13376 v8::Handle<v8::String> simple_property = 14810 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); 14811 global->ForceSet(simple_property, v8::Int32::New(isolate, 4), v8::ReadOnly);
13379 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14812 CHECK_EQ(
14813 4, global->Get(simple_property)->Int32Value(context.local()).FromJust());
13380 // This should fail because the property is read-only 14814 // This should fail because the property is read-only
13381 global->Set(simple_property, v8::Int32::New(isolate, 5)); 14815 global->Set(simple_property, v8::Int32::New(isolate, 5));
13382 CHECK_EQ(4, global->Get(simple_property)->Int32Value()); 14816 CHECK_EQ(
14817 4, global->Get(simple_property)->Int32Value(context.local()).FromJust());
13383 // This should succeed even though the property is read-only 14818 // This should succeed even though the property is read-only
13384 global->ForceSet(simple_property, v8::Int32::New(isolate, 6)); 14819 global->ForceSet(simple_property, v8::Int32::New(isolate, 6));
13385 CHECK_EQ(6, global->Get(simple_property)->Int32Value()); 14820 CHECK_EQ(
14821 6, global->Get(simple_property)->Int32Value(context.local()).FromJust());
13386 14822
13387 // Accessors 14823 // Accessors
13388 CHECK_EQ(0, force_set_set_count); 14824 CHECK_EQ(0, force_set_set_count);
13389 CHECK_EQ(0, force_set_get_count); 14825 CHECK_EQ(0, force_set_get_count);
13390 CHECK_EQ(3, global->Get(access_property)->Int32Value()); 14826 CHECK_EQ(
14827 3, global->Get(access_property)->Int32Value(context.local()).FromJust());
13391 // CHECK_EQ the property shouldn't override it, just call the setter 14828 // CHECK_EQ the property shouldn't override it, just call the setter
13392 // which in this case does nothing. 14829 // which in this case does nothing.
13393 global->Set(access_property, v8::Int32::New(isolate, 7)); 14830 global->Set(access_property, v8::Int32::New(isolate, 7));
13394 CHECK_EQ(3, global->Get(access_property)->Int32Value()); 14831 CHECK_EQ(
14832 3, global->Get(access_property)->Int32Value(context.local()).FromJust());
13395 CHECK_EQ(1, force_set_set_count); 14833 CHECK_EQ(1, force_set_set_count);
13396 CHECK_EQ(2, force_set_get_count); 14834 CHECK_EQ(2, force_set_get_count);
13397 // ForceSet doesn't call the accessors for now. 14835 // ForceSet doesn't call the accessors for now.
13398 // TODO(verwaest): Update once blink doesn't rely on ForceSet to delete api 14836 // TODO(verwaest): Update once blink doesn't rely on ForceSet to delete api
13399 // accessors. 14837 // accessors.
13400 global->ForceSet(access_property, v8::Int32::New(isolate, 8)); 14838 global->ForceSet(access_property, v8::Int32::New(isolate, 8));
13401 CHECK_EQ(8, global->Get(access_property)->Int32Value()); 14839 CHECK_EQ(
14840 8, global->Get(access_property)->Int32Value(context.local()).FromJust());
13402 CHECK_EQ(1, force_set_set_count); 14841 CHECK_EQ(1, force_set_set_count);
13403 CHECK_EQ(2, force_set_get_count); 14842 CHECK_EQ(2, force_set_get_count);
13404 } 14843 }
13405 14844
13406 14845
13407 TEST(ForceSetWithInterceptor) { 14846 TEST(ForceSetWithInterceptor) {
13408 v8::Isolate* isolate = CcTest::isolate(); 14847 v8::Isolate* isolate = CcTest::isolate();
13409 v8::HandleScope scope(isolate); 14848 v8::HandleScope scope(isolate);
13410 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 14849 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
13411 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 14850 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
13412 ForceSetInterceptGetter, ForceSetInterceptSetter)); 14851 ForceSetInterceptGetter, ForceSetInterceptSetter));
13413 pass_on_get = true; 14852 pass_on_get = true;
13414 LocalContext context(NULL, templ); 14853 LocalContext context(NULL, templ);
13415 v8::Handle<v8::Object> global = context->Global(); 14854 v8::Local<v8::Object> global = context->Global();
13416 14855
13417 force_set_get_count = 0; 14856 force_set_get_count = 0;
13418 force_set_set_count = 0; 14857 force_set_set_count = 0;
13419 pass_on_get = false; 14858 pass_on_get = false;
13420 14859
13421 v8::Handle<v8::String> some_property = 14860 v8::Local<v8::String> some_property = v8_str("a");
13422 v8::String::NewFromUtf8(isolate, "a");
13423 CHECK_EQ(0, force_set_set_count); 14861 CHECK_EQ(0, force_set_set_count);
13424 CHECK_EQ(0, force_set_get_count); 14862 CHECK_EQ(0, force_set_get_count);
13425 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14863 CHECK_EQ(3,
14864 global->Get(some_property)->Int32Value(context.local()).FromJust());
13426 // Setting the property shouldn't override it, just call the setter 14865 // Setting the property shouldn't override it, just call the setter
13427 // which in this case does nothing. 14866 // which in this case does nothing.
13428 global->Set(some_property, v8::Int32::New(isolate, 7)); 14867 global->Set(some_property, v8::Int32::New(isolate, 7));
13429 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14868 CHECK_EQ(3,
14869 global->Get(some_property)->Int32Value(context.local()).FromJust());
13430 CHECK_EQ(1, force_set_set_count); 14870 CHECK_EQ(1, force_set_set_count);
13431 CHECK_EQ(2, force_set_get_count); 14871 CHECK_EQ(2, force_set_get_count);
13432 // Getting the property when the interceptor returns an empty handle 14872 // Getting the property when the interceptor returns an empty handle
13433 // should yield undefined, since the property isn't present on the 14873 // should yield undefined, since the property isn't present on the
13434 // object itself yet. 14874 // object itself yet.
13435 pass_on_get = true; 14875 pass_on_get = true;
13436 CHECK(global->Get(some_property)->IsUndefined()); 14876 CHECK(global->Get(some_property)->IsUndefined());
13437 CHECK_EQ(1, force_set_set_count); 14877 CHECK_EQ(1, force_set_set_count);
13438 CHECK_EQ(3, force_set_get_count); 14878 CHECK_EQ(3, force_set_get_count);
13439 // Forcing the property to be set should cause the value to be 14879 // Forcing the property to be set should cause the value to be
13440 // set locally without calling the interceptor. 14880 // set locally without calling the interceptor.
13441 global->ForceSet(some_property, v8::Int32::New(isolate, 8)); 14881 global->ForceSet(some_property, v8::Int32::New(isolate, 8));
13442 CHECK_EQ(8, global->Get(some_property)->Int32Value()); 14882 CHECK_EQ(8,
14883 global->Get(some_property)->Int32Value(context.local()).FromJust());
13443 CHECK_EQ(1, force_set_set_count); 14884 CHECK_EQ(1, force_set_set_count);
13444 CHECK_EQ(4, force_set_get_count); 14885 CHECK_EQ(4, force_set_get_count);
13445 // Reenabling the interceptor should cause it to take precedence over 14886 // Reenabling the interceptor should cause it to take precedence over
13446 // the property 14887 // the property
13447 pass_on_get = false; 14888 pass_on_get = false;
13448 CHECK_EQ(3, global->Get(some_property)->Int32Value()); 14889 CHECK_EQ(3,
14890 global->Get(some_property)->Int32Value(context.local()).FromJust());
13449 CHECK_EQ(1, force_set_set_count); 14891 CHECK_EQ(1, force_set_set_count);
13450 CHECK_EQ(5, force_set_get_count); 14892 CHECK_EQ(5, force_set_get_count);
13451 // The interceptor should also work for other properties 14893 // The interceptor should also work for other properties
13452 CHECK_EQ(3, global->Get(v8::String::NewFromUtf8(isolate, "b")) 14894 CHECK_EQ(3, global->Get(v8_str("b"))->Int32Value(context.local()).FromJust());
13453 ->Int32Value());
13454 CHECK_EQ(1, force_set_set_count); 14895 CHECK_EQ(1, force_set_set_count);
13455 CHECK_EQ(6, force_set_get_count); 14896 CHECK_EQ(6, force_set_get_count);
13456 } 14897 }
13457 14898
13458 14899
13459 TEST(CreateDataProperty) { 14900 TEST(CreateDataProperty) {
13460 LocalContext env; 14901 LocalContext env;
13461 v8::Isolate* isolate = env->GetIsolate(); 14902 v8::Isolate* isolate = env->GetIsolate();
13462 v8::HandleScope handle_scope(isolate); 14903 v8::HandleScope handle_scope(isolate);
13463 14904
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
13690 } 15131 }
13691 15132
13692 15133
13693 // Check that a variable declaration with no explicit initialization 15134 // Check that a variable declaration with no explicit initialization
13694 // value does shadow an existing property in the prototype chain. 15135 // value does shadow an existing property in the prototype chain.
13695 THREADED_TEST(InitGlobalVarInProtoChain) { 15136 THREADED_TEST(InitGlobalVarInProtoChain) {
13696 LocalContext context; 15137 LocalContext context;
13697 v8::HandleScope scope(context->GetIsolate()); 15138 v8::HandleScope scope(context->GetIsolate());
13698 // Introduce a variable in the prototype chain. 15139 // Introduce a variable in the prototype chain.
13699 CompileRun("__proto__.x = 42"); 15140 CompileRun("__proto__.x = 42");
13700 v8::Handle<v8::Value> result = CompileRun("var x = 43; x"); 15141 v8::Local<v8::Value> result = CompileRun("var x = 43; x");
13701 CHECK(!result->IsUndefined()); 15142 CHECK(!result->IsUndefined());
13702 CHECK_EQ(43, result->Int32Value()); 15143 CHECK_EQ(43, result->Int32Value(context.local()).FromJust());
13703 } 15144 }
13704 15145
13705 15146
13706 // Regression test for issue 398. 15147 // Regression test for issue 398.
13707 // If a function is added to an object, creating a constant function 15148 // 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 15149 // field, and the result is cloned, replacing the constant function on the
13709 // original should not affect the clone. 15150 // original should not affect the clone.
13710 // See http://code.google.com/p/v8/issues/detail?id=398 15151 // See http://code.google.com/p/v8/issues/detail?id=398
13711 THREADED_TEST(ReplaceConstantFunction) { 15152 THREADED_TEST(ReplaceConstantFunction) {
13712 LocalContext context; 15153 LocalContext context;
13713 v8::Isolate* isolate = context->GetIsolate(); 15154 v8::Isolate* isolate = context->GetIsolate();
13714 v8::HandleScope scope(isolate); 15155 v8::HandleScope scope(isolate);
13715 v8::Handle<v8::Object> obj = v8::Object::New(isolate); 15156 v8::Local<v8::Object> obj = v8::Object::New(isolate);
13716 v8::Handle<v8::FunctionTemplate> func_templ = 15157 v8::Local<v8::FunctionTemplate> func_templ =
13717 v8::FunctionTemplate::New(isolate); 15158 v8::FunctionTemplate::New(isolate);
13718 v8::Handle<v8::String> foo_string = 15159 v8::Local<v8::String> foo_string = v8_str("foo");
13719 v8::String::NewFromUtf8(isolate, "foo"); 15160 obj->Set(foo_string,
13720 obj->Set(foo_string, func_templ->GetFunction()); 15161 func_templ->GetFunction(context.local()).ToLocalChecked());
13721 v8::Handle<v8::Object> obj_clone = obj->Clone(); 15162 v8::Local<v8::Object> obj_clone = obj->Clone();
13722 obj_clone->Set(foo_string, 15163 obj_clone->Set(foo_string, v8_str("Hello"));
13723 v8::String::NewFromUtf8(isolate, "Hello"));
13724 CHECK(!obj->Get(foo_string)->IsUndefined()); 15164 CHECK(!obj->Get(foo_string)->IsUndefined());
13725 } 15165 }
13726 15166
13727 15167
13728 static void CheckElementValue(i::Isolate* isolate, 15168 static void CheckElementValue(i::Isolate* isolate,
13729 int expected, 15169 int expected,
13730 i::Handle<i::Object> obj, 15170 i::Handle<i::Object> obj,
13731 int offset) { 15171 int offset) {
13732 i::Object* element = 15172 i::Object* element =
13733 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked(); 15173 *i::Object::GetElement(isolate, obj, offset).ToHandleChecked();
13734 CHECK_EQ(expected, i::Smi::cast(element)->value()); 15174 CHECK_EQ(expected, i::Smi::cast(element)->value());
13735 } 15175 }
13736 15176
13737 15177
13738 template <class ExternalArrayClass, class ElementType> 15178 template <class ExternalArrayClass, class ElementType>
13739 static void ObjectWithExternalArrayTestHelper(Handle<Context> context, 15179 static void ObjectWithExternalArrayTestHelper(Local<Context> context,
13740 v8::Handle<Object> obj, 15180 v8::Local<Object> obj,
13741 int element_count, 15181 int element_count,
13742 i::ExternalArrayType array_type, 15182 i::ExternalArrayType array_type,
13743 int64_t low, int64_t high) { 15183 int64_t low, int64_t high) {
13744 i::Handle<i::JSReceiver> jsobj = v8::Utils::OpenHandle(*obj); 15184 i::Handle<i::JSReceiver> jsobj = v8::Utils::OpenHandle(*obj);
13745 i::Isolate* isolate = jsobj->GetIsolate(); 15185 i::Isolate* isolate = jsobj->GetIsolate();
13746 obj->Set(v8_str("field"), 15186 obj->Set(v8_str("field"),
13747 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503)); 15187 v8::Int32::New(reinterpret_cast<v8::Isolate*>(isolate), 1503));
13748 context->Global()->Set(v8_str("ext_array"), obj); 15188 CHECK(context->Global()->Set(context, v8_str("ext_array"), obj).FromJust());
13749 v8::Handle<v8::Value> result = CompileRun("ext_array.field"); 15189 v8::Local<v8::Value> result = CompileRun("ext_array.field");
13750 CHECK_EQ(1503, result->Int32Value()); 15190 CHECK_EQ(1503, result->Int32Value(context).FromJust());
13751 result = CompileRun("ext_array[1]"); 15191 result = CompileRun("ext_array[1]");
13752 CHECK_EQ(1, result->Int32Value()); 15192 CHECK_EQ(1, result->Int32Value(context).FromJust());
13753 15193
13754 // Check assigned smis 15194 // Check assigned smis
13755 result = CompileRun("for (var i = 0; i < 8; i++) {" 15195 result = CompileRun("for (var i = 0; i < 8; i++) {"
13756 " ext_array[i] = i;" 15196 " ext_array[i] = i;"
13757 "}" 15197 "}"
13758 "var sum = 0;" 15198 "var sum = 0;"
13759 "for (var i = 0; i < 8; i++) {" 15199 "for (var i = 0; i < 8; i++) {"
13760 " sum += ext_array[i];" 15200 " sum += ext_array[i];"
13761 "}" 15201 "}"
13762 "sum;"); 15202 "sum;");
13763 15203
13764 CHECK_EQ(28, result->Int32Value()); 15204 CHECK_EQ(28, result->Int32Value(context).FromJust());
13765 // Check pass through of assigned smis 15205 // Check pass through of assigned smis
13766 result = CompileRun("var sum = 0;" 15206 result = CompileRun("var sum = 0;"
13767 "for (var i = 0; i < 8; i++) {" 15207 "for (var i = 0; i < 8; i++) {"
13768 " sum += ext_array[i] = ext_array[i] = -i;" 15208 " sum += ext_array[i] = ext_array[i] = -i;"
13769 "}" 15209 "}"
13770 "sum;"); 15210 "sum;");
13771 CHECK_EQ(-28, result->Int32Value()); 15211 CHECK_EQ(-28, result->Int32Value(context).FromJust());
13772 15212
13773 15213
13774 // Check assigned smis in reverse order 15214 // Check assigned smis in reverse order
13775 result = CompileRun("for (var i = 8; --i >= 0; ) {" 15215 result = CompileRun("for (var i = 8; --i >= 0; ) {"
13776 " ext_array[i] = i;" 15216 " ext_array[i] = i;"
13777 "}" 15217 "}"
13778 "var sum = 0;" 15218 "var sum = 0;"
13779 "for (var i = 0; i < 8; i++) {" 15219 "for (var i = 0; i < 8; i++) {"
13780 " sum += ext_array[i];" 15220 " sum += ext_array[i];"
13781 "}" 15221 "}"
13782 "sum;"); 15222 "sum;");
13783 CHECK_EQ(28, result->Int32Value()); 15223 CHECK_EQ(28, result->Int32Value(context).FromJust());
13784 15224
13785 // Check pass through of assigned HeapNumbers 15225 // Check pass through of assigned HeapNumbers
13786 result = CompileRun("var sum = 0;" 15226 result = CompileRun("var sum = 0;"
13787 "for (var i = 0; i < 16; i+=2) {" 15227 "for (var i = 0; i < 16; i+=2) {"
13788 " sum += ext_array[i] = ext_array[i] = (-i * 0.5);" 15228 " sum += ext_array[i] = ext_array[i] = (-i * 0.5);"
13789 "}" 15229 "}"
13790 "sum;"); 15230 "sum;");
13791 CHECK_EQ(-28, result->Int32Value()); 15231 CHECK_EQ(-28, result->Int32Value(context).FromJust());
13792 15232
13793 // Check assigned HeapNumbers 15233 // Check assigned HeapNumbers
13794 result = CompileRun("for (var i = 0; i < 16; i+=2) {" 15234 result = CompileRun("for (var i = 0; i < 16; i+=2) {"
13795 " ext_array[i] = (i * 0.5);" 15235 " ext_array[i] = (i * 0.5);"
13796 "}" 15236 "}"
13797 "var sum = 0;" 15237 "var sum = 0;"
13798 "for (var i = 0; i < 16; i+=2) {" 15238 "for (var i = 0; i < 16; i+=2) {"
13799 " sum += ext_array[i];" 15239 " sum += ext_array[i];"
13800 "}" 15240 "}"
13801 "sum;"); 15241 "sum;");
13802 CHECK_EQ(28, result->Int32Value()); 15242 CHECK_EQ(28, result->Int32Value(context).FromJust());
13803 15243
13804 // Check assigned HeapNumbers in reverse order 15244 // Check assigned HeapNumbers in reverse order
13805 result = CompileRun("for (var i = 14; i >= 0; i-=2) {" 15245 result = CompileRun("for (var i = 14; i >= 0; i-=2) {"
13806 " ext_array[i] = (i * 0.5);" 15246 " ext_array[i] = (i * 0.5);"
13807 "}" 15247 "}"
13808 "var sum = 0;" 15248 "var sum = 0;"
13809 "for (var i = 0; i < 16; i+=2) {" 15249 "for (var i = 0; i < 16; i+=2) {"
13810 " sum += ext_array[i];" 15250 " sum += ext_array[i];"
13811 "}" 15251 "}"
13812 "sum;"); 15252 "sum;");
13813 CHECK_EQ(28, result->Int32Value()); 15253 CHECK_EQ(28, result->Int32Value(context).FromJust());
13814 15254
13815 i::ScopedVector<char> test_buf(1024); 15255 i::ScopedVector<char> test_buf(1024);
13816 15256
13817 // Check legal boundary conditions. 15257 // Check legal boundary conditions.
13818 // The repeated loads and stores ensure the ICs are exercised. 15258 // The repeated loads and stores ensure the ICs are exercised.
13819 const char* boundary_program = 15259 const char* boundary_program =
13820 "var res = 0;" 15260 "var res = 0;"
13821 "for (var i = 0; i < 16; i++) {" 15261 "for (var i = 0; i < 16; i++) {"
13822 " ext_array[i] = %lld;" 15262 " ext_array[i] = %lld;"
13823 " if (i > 8) {" 15263 " if (i > 8) {"
(...skipping 19 matching lines...) Expand all
13843 "for (var i = 0; i < 8; i++) {" 15283 "for (var i = 0; i < 8; i++) {"
13844 " tmp_array[i] = i;" 15284 " tmp_array[i] = i;"
13845 " sum += tmp_array[i];" 15285 " sum += tmp_array[i];"
13846 " if (i == 4) {" 15286 " if (i == 4) {"
13847 " tmp_array = {};" 15287 " tmp_array = {};"
13848 " }" 15288 " }"
13849 "}" 15289 "}"
13850 "sum;"); 15290 "sum;");
13851 // Force GC to trigger verification. 15291 // Force GC to trigger verification.
13852 CcTest::heap()->CollectAllGarbage(); 15292 CcTest::heap()->CollectAllGarbage();
13853 CHECK_EQ(28, result->Int32Value()); 15293 CHECK_EQ(28, result->Int32Value(context).FromJust());
13854 15294
13855 // Make sure out-of-range loads do not throw. 15295 // Make sure out-of-range loads do not throw.
13856 i::SNPrintF(test_buf, 15296 i::SNPrintF(test_buf,
13857 "var caught_exception = false;" 15297 "var caught_exception = false;"
13858 "try {" 15298 "try {"
13859 " ext_array[%d];" 15299 " ext_array[%d];"
13860 "} catch (e) {" 15300 "} catch (e) {"
13861 " caught_exception = true;" 15301 " caught_exception = true;"
13862 "}" 15302 "}"
13863 "caught_exception;", 15303 "caught_exception;",
(...skipping 12 matching lines...) Expand all
13876 "caught_exception;", 15316 "caught_exception;",
13877 element_count); 15317 element_count);
13878 result = CompileRun(test_buf.start()); 15318 result = CompileRun(test_buf.start());
13879 CHECK_EQ(false, result->BooleanValue()); 15319 CHECK_EQ(false, result->BooleanValue());
13880 15320
13881 // Check other boundary conditions, values and operations. 15321 // Check other boundary conditions, values and operations.
13882 result = CompileRun("for (var i = 0; i < 8; i++) {" 15322 result = CompileRun("for (var i = 0; i < 8; i++) {"
13883 " ext_array[7] = undefined;" 15323 " ext_array[7] = undefined;"
13884 "}" 15324 "}"
13885 "ext_array[7];"); 15325 "ext_array[7];");
13886 CHECK_EQ(0, result->Int32Value()); 15326 CHECK_EQ(0, result->Int32Value(context).FromJust());
13887 if (array_type == i::kExternalFloat64Array || 15327 if (array_type == i::kExternalFloat64Array ||
13888 array_type == i::kExternalFloat32Array) { 15328 array_type == i::kExternalFloat32Array) {
13889 CHECK(std::isnan( 15329 CHECK(std::isnan(
13890 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number())); 15330 i::Object::GetElement(isolate, jsobj, 7).ToHandleChecked()->Number()));
13891 } else { 15331 } else {
13892 CheckElementValue(isolate, 0, jsobj, 7); 15332 CheckElementValue(isolate, 0, jsobj, 7);
13893 } 15333 }
13894 15334
13895 result = CompileRun("for (var i = 0; i < 8; i++) {" 15335 result = CompileRun("for (var i = 0; i < 8; i++) {"
13896 " ext_array[6] = '2.3';" 15336 " ext_array[6] = '2.3';"
13897 "}" 15337 "}"
13898 "ext_array[6];"); 15338 "ext_array[6];");
13899 CHECK_EQ(2, result->Int32Value()); 15339 CHECK_EQ(2, result->Int32Value(context).FromJust());
13900 CHECK_EQ(2, 15340 CHECK_EQ(2,
13901 static_cast<int>( 15341 static_cast<int>(
13902 i::Object::GetElement( 15342 i::Object::GetElement(
13903 isolate, jsobj, 6).ToHandleChecked()->Number())); 15343 isolate, jsobj, 6).ToHandleChecked()->Number()));
13904 15344
13905 if (array_type != i::kExternalFloat32Array && 15345 if (array_type != i::kExternalFloat32Array &&
13906 array_type != i::kExternalFloat64Array) { 15346 array_type != i::kExternalFloat64Array) {
13907 // Though the specification doesn't state it, be explicit about 15347 // Though the specification doesn't state it, be explicit about
13908 // converting NaNs and +/-Infinity to zero. 15348 // converting NaNs and +/-Infinity to zero.
13909 result = CompileRun("for (var i = 0; i < 8; i++) {" 15349 result = CompileRun("for (var i = 0; i < 8; i++) {"
13910 " ext_array[i] = 5;" 15350 " ext_array[i] = 5;"
13911 "}" 15351 "}"
13912 "for (var i = 0; i < 8; i++) {" 15352 "for (var i = 0; i < 8; i++) {"
13913 " ext_array[i] = NaN;" 15353 " ext_array[i] = NaN;"
13914 "}" 15354 "}"
13915 "ext_array[5];"); 15355 "ext_array[5];");
13916 CHECK_EQ(0, result->Int32Value()); 15356 CHECK_EQ(0, result->Int32Value(context).FromJust());
13917 CheckElementValue(isolate, 0, jsobj, 5); 15357 CheckElementValue(isolate, 0, jsobj, 5);
13918 15358
13919 result = CompileRun("for (var i = 0; i < 8; i++) {" 15359 result = CompileRun("for (var i = 0; i < 8; i++) {"
13920 " ext_array[i] = 5;" 15360 " ext_array[i] = 5;"
13921 "}" 15361 "}"
13922 "for (var i = 0; i < 8; i++) {" 15362 "for (var i = 0; i < 8; i++) {"
13923 " ext_array[i] = Infinity;" 15363 " ext_array[i] = Infinity;"
13924 "}" 15364 "}"
13925 "ext_array[5];"); 15365 "ext_array[5];");
13926 int expected_value = 15366 int expected_value =
13927 (array_type == i::kExternalUint8ClampedArray) ? 255 : 0; 15367 (array_type == i::kExternalUint8ClampedArray) ? 255 : 0;
13928 CHECK_EQ(expected_value, result->Int32Value()); 15368 CHECK_EQ(expected_value, result->Int32Value(context).FromJust());
13929 CheckElementValue(isolate, expected_value, jsobj, 5); 15369 CheckElementValue(isolate, expected_value, jsobj, 5);
13930 15370
13931 result = CompileRun("for (var i = 0; i < 8; i++) {" 15371 result = CompileRun("for (var i = 0; i < 8; i++) {"
13932 " ext_array[i] = 5;" 15372 " ext_array[i] = 5;"
13933 "}" 15373 "}"
13934 "for (var i = 0; i < 8; i++) {" 15374 "for (var i = 0; i < 8; i++) {"
13935 " ext_array[i] = -Infinity;" 15375 " ext_array[i] = -Infinity;"
13936 "}" 15376 "}"
13937 "ext_array[5];"); 15377 "ext_array[5];");
13938 CHECK_EQ(0, result->Int32Value()); 15378 CHECK_EQ(0, result->Int32Value(context).FromJust());
13939 CheckElementValue(isolate, 0, jsobj, 5); 15379 CheckElementValue(isolate, 0, jsobj, 5);
13940 15380
13941 // Check truncation behavior of integral arrays. 15381 // Check truncation behavior of integral arrays.
13942 const char* unsigned_data = 15382 const char* unsigned_data =
13943 "var source_data = [0.6, 10.6];" 15383 "var source_data = [0.6, 10.6];"
13944 "var expected_results = [0, 10];"; 15384 "var expected_results = [0, 10];";
13945 const char* signed_data = 15385 const char* signed_data =
13946 "var source_data = [0.6, 10.6, -0.6, -10.6];" 15386 "var source_data = [0.6, 10.6, -0.6, -10.6];"
13947 "var expected_results = [0, 10, 0, -10];"; 15387 "var expected_results = [0, 10, 0, -10];";
13948 const char* pixel_data = 15388 const char* pixel_data =
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
13983 " sum += (ext_array[i] += 1);" 15423 " sum += (ext_array[i] += 1);"
13984 " sum += (ext_array[i] -= 1);" 15424 " sum += (ext_array[i] -= 1);"
13985 " } " 15425 " } "
13986 " return sum;" 15426 " return sum;"
13987 "}" 15427 "}"
13988 "sum=0;" 15428 "sum=0;"
13989 "for (var i=0;i<10000;++i) {" 15429 "for (var i=0;i<10000;++i) {"
13990 " sum=ee_op_test_complex_func(sum);" 15430 " sum=ee_op_test_complex_func(sum);"
13991 "}" 15431 "}"
13992 "sum;"); 15432 "sum;");
13993 CHECK_EQ(16000000, result->Int32Value()); 15433 CHECK_EQ(16000000, result->Int32Value(context).FromJust());
13994 15434
13995 // Test count operations 15435 // Test count operations
13996 result = CompileRun("function ee_op_test_count_func(sum) {" 15436 result = CompileRun("function ee_op_test_count_func(sum) {"
13997 " for (var i = 0; i < 40; ++i) {" 15437 " for (var i = 0; i < 40; ++i) {"
13998 " sum += (++ext_array[i]);" 15438 " sum += (++ext_array[i]);"
13999 " sum += (--ext_array[i]);" 15439 " sum += (--ext_array[i]);"
14000 " } " 15440 " } "
14001 " return sum;" 15441 " return sum;"
14002 "}" 15442 "}"
14003 "sum=0;" 15443 "sum=0;"
14004 "for (var i=0;i<10000;++i) {" 15444 "for (var i=0;i<10000;++i) {"
14005 " sum=ee_op_test_count_func(sum);" 15445 " sum=ee_op_test_count_func(sum);"
14006 "}" 15446 "}"
14007 "sum;"); 15447 "sum;");
14008 CHECK_EQ(16000000, result->Int32Value()); 15448 CHECK_EQ(16000000, result->Int32Value(context).FromJust());
14009 15449
14010 result = CompileRun("ext_array[3] = 33;" 15450 result = CompileRun("ext_array[3] = 33;"
14011 "delete ext_array[3];" 15451 "delete ext_array[3];"
14012 "ext_array[3];"); 15452 "ext_array[3];");
14013 CHECK_EQ(33, result->Int32Value()); 15453 CHECK_EQ(33, result->Int32Value(context).FromJust());
14014 15454
14015 result = CompileRun("ext_array[0] = 10; ext_array[1] = 11;" 15455 result = CompileRun("ext_array[0] = 10; ext_array[1] = 11;"
14016 "ext_array[2] = 12; ext_array[3] = 13;" 15456 "ext_array[2] = 12; ext_array[3] = 13;"
14017 "ext_array.__defineGetter__('2'," 15457 "ext_array.__defineGetter__('2',"
14018 "function() { return 120; });" 15458 "function() { return 120; });"
14019 "ext_array[2];"); 15459 "ext_array[2];");
14020 CHECK_EQ(12, result->Int32Value()); 15460 CHECK_EQ(12, result->Int32Value(context).FromJust());
14021 15461
14022 result = CompileRun("var js_array = new Array(40);" 15462 result = CompileRun("var js_array = new Array(40);"
14023 "js_array[0] = 77;" 15463 "js_array[0] = 77;"
14024 "js_array;"); 15464 "js_array;");
14025 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); 15465 CHECK_EQ(77, v8::Object::Cast(*result)
15466 ->Get(v8_str("0"))
15467 ->Int32Value(context)
15468 .FromJust());
14026 15469
14027 result = CompileRun("ext_array[1] = 23;" 15470 result = CompileRun("ext_array[1] = 23;"
14028 "ext_array.__proto__ = [];" 15471 "ext_array.__proto__ = [];"
14029 "js_array.__proto__ = ext_array;" 15472 "js_array.__proto__ = ext_array;"
14030 "js_array.concat(ext_array);"); 15473 "js_array.concat(ext_array);");
14031 CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value()); 15474 CHECK_EQ(77, v8::Object::Cast(*result)
14032 CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value()); 15475 ->Get(v8_str("0"))
15476 ->Int32Value(context)
15477 .FromJust());
15478 CHECK_EQ(23, v8::Object::Cast(*result)
15479 ->Get(v8_str("1"))
15480 ->Int32Value(context)
15481 .FromJust());
14033 15482
14034 result = CompileRun("ext_array[1] = 23;"); 15483 result = CompileRun("ext_array[1] = 23;");
14035 CHECK_EQ(23, result->Int32Value()); 15484 CHECK_EQ(23, result->Int32Value(context).FromJust());
14036 } 15485 }
14037 15486
14038 15487
14039 template <class FixedTypedArrayClass, i::ElementsKind elements_kind, 15488 template <class FixedTypedArrayClass, i::ElementsKind elements_kind,
14040 class ElementType> 15489 class ElementType>
14041 static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type, 15490 static void FixedTypedArrayTestHelper(i::ExternalArrayType array_type,
14042 ElementType low, ElementType high) { 15491 ElementType low, ElementType high) {
14043 i::FLAG_allow_natives_syntax = true; 15492 i::FLAG_allow_natives_syntax = true;
14044 LocalContext context; 15493 LocalContext context;
14045 i::Isolate* isolate = CcTest::i_isolate(); 15494 i::Isolate* isolate = CcTest::i_isolate();
(...skipping 10 matching lines...) Expand all
14056 CcTest::heap()->CollectAllGarbage(); 15505 CcTest::heap()->CollectAllGarbage();
14057 for (int i = 0; i < kElementCount; i++) { 15506 for (int i = 0; i < kElementCount; i++) {
14058 fixed_array->set(i, static_cast<ElementType>(i)); 15507 fixed_array->set(i, static_cast<ElementType>(i));
14059 } 15508 }
14060 // Force GC to trigger verification. 15509 // Force GC to trigger verification.
14061 CcTest::heap()->CollectAllGarbage(); 15510 CcTest::heap()->CollectAllGarbage();
14062 for (int i = 0; i < kElementCount; i++) { 15511 for (int i = 0; i < kElementCount; i++) {
14063 CHECK_EQ(static_cast<int64_t>(static_cast<ElementType>(i)), 15512 CHECK_EQ(static_cast<int64_t>(static_cast<ElementType>(i)),
14064 static_cast<int64_t>(fixed_array->get_scalar(i))); 15513 static_cast<int64_t>(fixed_array->get_scalar(i)));
14065 } 15514 }
14066 v8::Handle<v8::Object> obj = v8::Utils::ToLocal(jsobj); 15515 v8::Local<v8::Object> obj = v8::Utils::ToLocal(jsobj);
14067 15516
14068 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>( 15517 ObjectWithExternalArrayTestHelper<FixedTypedArrayClass, ElementType>(
14069 context.local(), obj, kElementCount, array_type, 15518 context.local(), obj, kElementCount, array_type,
14070 static_cast<int64_t>(low), 15519 static_cast<int64_t>(low),
14071 static_cast<int64_t>(high)); 15520 static_cast<int64_t>(high));
14072 } 15521 }
14073 15522
14074 15523
14075 THREADED_TEST(FixedUint8Array) { 15524 THREADED_TEST(FixedUint8Array) {
14076 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>( 15525 FixedTypedArrayTestHelper<i::FixedUint8Array, i::UINT8_ELEMENTS, uint8_t>(
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
14369 v8::SharedArrayBuffer::New(isolate, backing_store.start(), 2 + kSize); 15818 v8::SharedArrayBuffer::New(isolate, backing_store.start(), 2 + kSize);
14370 Local<v8::DataView> dv = 15819 Local<v8::DataView> dv =
14371 v8::DataView::New(ab, 2, kSize); 15820 v8::DataView::New(ab, 2, kSize);
14372 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv); 15821 CheckInternalFieldsAreZero<v8::ArrayBufferView>(dv);
14373 CHECK_EQ(2u, dv->ByteOffset()); 15822 CHECK_EQ(2u, dv->ByteOffset());
14374 CHECK_EQ(kSize, static_cast<int>(dv->ByteLength())); 15823 CHECK_EQ(kSize, static_cast<int>(dv->ByteLength()));
14375 CHECK(ab->Equals(dv->Buffer())); 15824 CHECK(ab->Equals(dv->Buffer()));
14376 } 15825 }
14377 15826
14378 15827
14379 #define IS_ARRAY_BUFFER_VIEW_TEST(View) \ 15828 #define IS_ARRAY_BUFFER_VIEW_TEST(View) \
14380 THREADED_TEST(Is##View) { \ 15829 THREADED_TEST(Is##View) { \
14381 LocalContext env; \ 15830 LocalContext env; \
14382 v8::Isolate* isolate = env->GetIsolate(); \ 15831 v8::Isolate* isolate = env->GetIsolate(); \
14383 v8::HandleScope handle_scope(isolate); \ 15832 v8::HandleScope handle_scope(isolate); \
14384 \ 15833 \
14385 Handle<Value> result = CompileRun( \ 15834 Local<Value> result = CompileRun( \
14386 "var ab = new ArrayBuffer(128);" \ 15835 "var ab = new ArrayBuffer(128);" \
14387 "new " #View "(ab)"); \ 15836 "new " #View "(ab)"); \
14388 CHECK(result->IsArrayBufferView()); \ 15837 CHECK(result->IsArrayBufferView()); \
14389 CHECK(result->Is##View()); \ 15838 CHECK(result->Is##View()); \
14390 CheckInternalFieldsAreZero<v8::ArrayBufferView>(result.As<v8::View>()); \ 15839 CheckInternalFieldsAreZero<v8::ArrayBufferView>(result.As<v8::View>()); \
14391 } 15840 }
14392 15841
14393 IS_ARRAY_BUFFER_VIEW_TEST(Uint8Array) 15842 IS_ARRAY_BUFFER_VIEW_TEST(Uint8Array)
14394 IS_ARRAY_BUFFER_VIEW_TEST(Int8Array) 15843 IS_ARRAY_BUFFER_VIEW_TEST(Int8Array)
14395 IS_ARRAY_BUFFER_VIEW_TEST(Uint16Array) 15844 IS_ARRAY_BUFFER_VIEW_TEST(Uint16Array)
14396 IS_ARRAY_BUFFER_VIEW_TEST(Int16Array) 15845 IS_ARRAY_BUFFER_VIEW_TEST(Int16Array)
14397 IS_ARRAY_BUFFER_VIEW_TEST(Uint32Array) 15846 IS_ARRAY_BUFFER_VIEW_TEST(Uint32Array)
14398 IS_ARRAY_BUFFER_VIEW_TEST(Int32Array) 15847 IS_ARRAY_BUFFER_VIEW_TEST(Int32Array)
14399 IS_ARRAY_BUFFER_VIEW_TEST(Float32Array) 15848 IS_ARRAY_BUFFER_VIEW_TEST(Float32Array)
14400 IS_ARRAY_BUFFER_VIEW_TEST(Float64Array) 15849 IS_ARRAY_BUFFER_VIEW_TEST(Float64Array)
14401 IS_ARRAY_BUFFER_VIEW_TEST(Uint8ClampedArray) 15850 IS_ARRAY_BUFFER_VIEW_TEST(Uint8ClampedArray)
14402 IS_ARRAY_BUFFER_VIEW_TEST(DataView) 15851 IS_ARRAY_BUFFER_VIEW_TEST(DataView)
14403 15852
14404 #undef IS_ARRAY_BUFFER_VIEW_TEST 15853 #undef IS_ARRAY_BUFFER_VIEW_TEST
14405 15854
14406 15855
14407 15856
14408 THREADED_TEST(ScriptContextDependence) { 15857 THREADED_TEST(ScriptContextDependence) {
14409 LocalContext c1; 15858 LocalContext c1;
14410 v8::HandleScope scope(c1->GetIsolate()); 15859 v8::HandleScope scope(c1->GetIsolate());
14411 const char *source = "foo"; 15860 const char *source = "foo";
14412 v8::Handle<v8::Script> dep = v8_compile(source); 15861 v8::Local<v8::Script> dep = v8_compile(source);
14413 v8::ScriptCompiler::Source script_source(v8::String::NewFromUtf8( 15862 v8::ScriptCompiler::Source script_source(
14414 c1->GetIsolate(), source)); 15863 v8::String::NewFromUtf8(c1->GetIsolate(), source,
14415 v8::Handle<v8::UnboundScript> indep = 15864 v8::NewStringType::kNormal)
15865 .ToLocalChecked());
15866 v8::Local<v8::UnboundScript> indep =
14416 v8::ScriptCompiler::CompileUnbound(c1->GetIsolate(), &script_source); 15867 v8::ScriptCompiler::CompileUnbound(c1->GetIsolate(), &script_source);
14417 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo"), 15868 c1->Global()->Set(v8::String::NewFromUtf8(c1->GetIsolate(), "foo",
15869 v8::NewStringType::kNormal)
15870 .ToLocalChecked(),
14418 v8::Integer::New(c1->GetIsolate(), 100)); 15871 v8::Integer::New(c1->GetIsolate(), 100));
14419 CHECK_EQ(dep->Run()->Int32Value(), 100); 15872 CHECK_EQ(dep->Run()->Int32Value(c1.local()).FromJust(), 100);
14420 CHECK_EQ(indep->BindToCurrentContext()->Run()->Int32Value(), 100); 15873 CHECK_EQ(
15874 indep->BindToCurrentContext()->Run()->Int32Value(c1.local()).FromJust(),
15875 100);
14421 LocalContext c2; 15876 LocalContext c2;
14422 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo"), 15877 c2->Global()->Set(v8::String::NewFromUtf8(c2->GetIsolate(), "foo",
15878 v8::NewStringType::kNormal)
15879 .ToLocalChecked(),
14423 v8::Integer::New(c2->GetIsolate(), 101)); 15880 v8::Integer::New(c2->GetIsolate(), 101));
14424 CHECK_EQ(dep->Run()->Int32Value(), 100); 15881 CHECK_EQ(dep->Run()->Int32Value(c2.local()).FromJust(), 100);
14425 CHECK_EQ(indep->BindToCurrentContext()->Run()->Int32Value(), 101); 15882 CHECK_EQ(
15883 indep->BindToCurrentContext()->Run()->Int32Value(c2.local()).FromJust(),
15884 101);
14426 } 15885 }
14427 15886
14428 15887
14429 THREADED_TEST(StackTrace) { 15888 THREADED_TEST(StackTrace) {
14430 LocalContext context; 15889 LocalContext context;
14431 v8::HandleScope scope(context->GetIsolate()); 15890 v8::HandleScope scope(context->GetIsolate());
14432 v8::TryCatch try_catch(context->GetIsolate()); 15891 v8::TryCatch try_catch(context->GetIsolate());
14433 const char *source = "function foo() { FAIL.FAIL; }; foo();"; 15892 const char *source = "function foo() { FAIL.FAIL; }; foo();";
14434 v8::Handle<v8::String> src = 15893 v8::Local<v8::String> src = v8_str(source);
14435 v8::String::NewFromUtf8(context->GetIsolate(), source); 15894 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)); 15895 v8::ScriptCompiler::Source script_source(src, v8::ScriptOrigin(origin));
14439 v8::ScriptCompiler::CompileUnbound(context->GetIsolate(), &script_source) 15896 v8::ScriptCompiler::CompileUnbound(context->GetIsolate(), &script_source)
14440 ->BindToCurrentContext() 15897 ->BindToCurrentContext()
14441 ->Run(); 15898 ->Run();
14442 CHECK(try_catch.HasCaught()); 15899 CHECK(try_catch.HasCaught());
14443 v8::String::Utf8Value stack(try_catch.StackTrace()); 15900 v8::String::Utf8Value stack(try_catch.StackTrace());
14444 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); 15901 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL);
14445 } 15902 }
14446 15903
14447 15904
14448 // Checks that a StackFrame has certain expected values. 15905 // Checks that a StackFrame has certain expected values.
14449 void checkStackFrame(const char* expected_script_name, 15906 void checkStackFrame(const char* expected_script_name,
14450 const char* expected_func_name, int expected_line_number, 15907 const char* expected_func_name, int expected_line_number,
14451 int expected_column, bool is_eval, bool is_constructor, 15908 int expected_column, bool is_eval, bool is_constructor,
14452 v8::Handle<v8::StackFrame> frame) { 15909 v8::Local<v8::StackFrame> frame) {
14453 v8::HandleScope scope(CcTest::isolate()); 15910 v8::HandleScope scope(CcTest::isolate());
14454 v8::String::Utf8Value func_name(frame->GetFunctionName()); 15911 v8::String::Utf8Value func_name(frame->GetFunctionName());
14455 v8::String::Utf8Value script_name(frame->GetScriptName()); 15912 v8::String::Utf8Value script_name(frame->GetScriptName());
14456 if (*script_name == NULL) { 15913 if (*script_name == NULL) {
14457 // The situation where there is no associated script, like for evals. 15914 // The situation where there is no associated script, like for evals.
14458 CHECK(expected_script_name == NULL); 15915 CHECK(expected_script_name == NULL);
14459 } else { 15916 } else {
14460 CHECK(strstr(*script_name, expected_script_name) != NULL); 15917 CHECK(strstr(*script_name, expected_script_name) != NULL);
14461 } 15918 }
14462 CHECK(strstr(*func_name, expected_func_name) != NULL); 15919 CHECK(strstr(*func_name, expected_func_name) != NULL);
(...skipping 10 matching lines...) Expand all
14473 const int kOverviewTest = 1; 15930 const int kOverviewTest = 1;
14474 const int kDetailedTest = 2; 15931 const int kDetailedTest = 2;
14475 const int kFunctionName = 3; 15932 const int kFunctionName = 3;
14476 const int kDisplayName = 4; 15933 const int kDisplayName = 4;
14477 const int kFunctionNameAndDisplayName = 5; 15934 const int kFunctionNameAndDisplayName = 5;
14478 const int kDisplayNameIsNotString = 6; 15935 const int kDisplayNameIsNotString = 6;
14479 const int kFunctionNameIsNotString = 7; 15936 const int kFunctionNameIsNotString = 7;
14480 15937
14481 DCHECK(args.Length() == 1); 15938 DCHECK(args.Length() == 1);
14482 15939
14483 int testGroup = args[0]->Int32Value(); 15940 v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext();
15941 int testGroup = args[0]->Int32Value(context).FromJust();
14484 if (testGroup == kOverviewTest) { 15942 if (testGroup == kOverviewTest) {
14485 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 15943 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14486 args.GetIsolate(), 10, v8::StackTrace::kOverview); 15944 args.GetIsolate(), 10, v8::StackTrace::kOverview);
14487 CHECK_EQ(4, stackTrace->GetFrameCount()); 15945 CHECK_EQ(4, stackTrace->GetFrameCount());
14488 checkStackFrame(origin, "bar", 2, 10, false, false, 15946 checkStackFrame(origin, "bar", 2, 10, false, false,
14489 stackTrace->GetFrame(0)); 15947 stackTrace->GetFrame(0));
14490 checkStackFrame(origin, "foo", 6, 3, false, false, 15948 checkStackFrame(origin, "foo", 6, 3, false, false,
14491 stackTrace->GetFrame(1)); 15949 stackTrace->GetFrame(1));
14492 // This is the source string inside the eval which has the call to foo. 15950 // This is the source string inside the eval which has the call to foo.
14493 checkStackFrame(NULL, "", 1, 1, false, false, stackTrace->GetFrame(2)); 15951 checkStackFrame(NULL, "", 1, 1, false, false, stackTrace->GetFrame(2));
14494 // The last frame is an anonymous function which has the initial eval call. 15952 // The last frame is an anonymous function which has the initial eval call.
14495 checkStackFrame(origin, "", 8, 7, false, false, stackTrace->GetFrame(3)); 15953 checkStackFrame(origin, "", 8, 7, false, false, stackTrace->GetFrame(3));
14496 15954
14497 CHECK(stackTrace->AsArray()->IsArray()); 15955 CHECK(stackTrace->AsArray()->IsArray());
14498 } else if (testGroup == kDetailedTest) { 15956 } else if (testGroup == kDetailedTest) {
14499 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 15957 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
14500 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 15958 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
14501 CHECK_EQ(4, stackTrace->GetFrameCount()); 15959 CHECK_EQ(4, stackTrace->GetFrameCount());
14502 checkStackFrame(origin, "bat", 4, 22, false, false, 15960 checkStackFrame(origin, "bat", 4, 22, false, false,
14503 stackTrace->GetFrame(0)); 15961 stackTrace->GetFrame(0));
14504 checkStackFrame(origin, "baz", 8, 3, false, true, 15962 checkStackFrame(origin, "baz", 8, 3, false, true,
14505 stackTrace->GetFrame(1)); 15963 stackTrace->GetFrame(1));
14506 bool is_eval = true; 15964 bool is_eval = true;
14507 // This is the source string inside the eval which has the call to baz. 15965 // 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)); 15966 checkStackFrame(NULL, "", 1, 1, is_eval, false, stackTrace->GetFrame(2));
14509 // The last frame is an anonymous function which has the initial eval call. 15967 // 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
14542 } 16000 }
14543 } 16001 }
14544 16002
14545 16003
14546 // Tests the C++ StackTrace API. 16004 // Tests the C++ StackTrace API.
14547 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. 16005 // TODO(3074796): Reenable this as a THREADED_TEST once it passes.
14548 // THREADED_TEST(CaptureStackTrace) { 16006 // THREADED_TEST(CaptureStackTrace) {
14549 TEST(CaptureStackTrace) { 16007 TEST(CaptureStackTrace) {
14550 v8::Isolate* isolate = CcTest::isolate(); 16008 v8::Isolate* isolate = CcTest::isolate();
14551 v8::HandleScope scope(isolate); 16009 v8::HandleScope scope(isolate);
14552 v8::Handle<v8::String> origin = 16010 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); 16011 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
14555 templ->Set(v8_str("AnalyzeStackInNativeCode"), 16012 templ->Set(v8_str("AnalyzeStackInNativeCode"),
14556 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); 16013 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode));
14557 LocalContext context(0, templ); 16014 LocalContext context(0, templ);
14558 16015
14559 // Test getting OVERVIEW information. Should ignore information that is not 16016 // Test getting OVERVIEW information. Should ignore information that is not
14560 // script name, function name, line number, and column offset. 16017 // script name, function name, line number, and column offset.
14561 const char *overview_source = 16018 const char *overview_source =
14562 "function bar() {\n" 16019 "function bar() {\n"
14563 " var y; AnalyzeStackInNativeCode(1);\n" 16020 " var y; AnalyzeStackInNativeCode(1);\n"
14564 "}\n" 16021 "}\n"
14565 "function foo() {\n" 16022 "function foo() {\n"
14566 "\n" 16023 "\n"
14567 " bar();\n" 16024 " bar();\n"
14568 "}\n" 16025 "}\n"
14569 "var x;eval('new foo();');"; 16026 "var x;eval('new foo();');";
14570 v8::Handle<v8::String> overview_src = 16027 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, 16028 v8::ScriptCompiler::Source script_source(overview_src,
14573 v8::ScriptOrigin(origin)); 16029 v8::ScriptOrigin(origin));
14574 v8::Handle<Value> overview_result( 16030 v8::Local<Value> overview_result(
14575 v8::ScriptCompiler::CompileUnbound(isolate, &script_source) 16031 v8::ScriptCompiler::CompileUnbound(isolate, &script_source)
14576 ->BindToCurrentContext() 16032 ->BindToCurrentContext()
14577 ->Run()); 16033 ->Run());
14578 CHECK(!overview_result.IsEmpty()); 16034 CHECK(!overview_result.IsEmpty());
14579 CHECK(overview_result->IsObject()); 16035 CHECK(overview_result->IsObject());
14580 16036
14581 // Test getting DETAILED information. 16037 // Test getting DETAILED information.
14582 const char *detailed_source = 16038 const char *detailed_source =
14583 "function bat() {AnalyzeStackInNativeCode(2);\n" 16039 "function bat() {AnalyzeStackInNativeCode(2);\n"
14584 "}\n" 16040 "}\n"
14585 "\n" 16041 "\n"
14586 "function baz() {\n" 16042 "function baz() {\n"
14587 " bat();\n" 16043 " bat();\n"
14588 "}\n" 16044 "}\n"
14589 "eval('new baz();');"; 16045 "eval('new baz();');";
14590 v8::Handle<v8::String> detailed_src = 16046 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. 16047 // Make the script using a non-zero line and column offset.
14593 v8::Handle<v8::Integer> line_offset = v8::Integer::New(isolate, 3); 16048 v8::Local<v8::Integer> line_offset = v8::Integer::New(isolate, 3);
14594 v8::Handle<v8::Integer> column_offset = v8::Integer::New(isolate, 5); 16049 v8::Local<v8::Integer> column_offset = v8::Integer::New(isolate, 5);
14595 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); 16050 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset);
14596 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin); 16051 v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin);
14597 v8::Handle<v8::UnboundScript> detailed_script( 16052 v8::Local<v8::UnboundScript> detailed_script(
14598 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2)); 16053 v8::ScriptCompiler::CompileUnbound(isolate, &script_source2));
14599 v8::Handle<Value> detailed_result( 16054 v8::Local<Value> detailed_result(
14600 detailed_script->BindToCurrentContext()->Run()); 16055 detailed_script->BindToCurrentContext()->Run());
14601 CHECK(!detailed_result.IsEmpty()); 16056 CHECK(!detailed_result.IsEmpty());
14602 CHECK(detailed_result->IsObject()); 16057 CHECK(detailed_result->IsObject());
14603 16058
14604 // Test using function.name and function.displayName in stack trace 16059 // Test using function.name and function.displayName in stack trace
14605 const char* function_name_source = 16060 const char* function_name_source =
14606 "function bar(function_name, display_name, testGroup) {\n" 16061 "function bar(function_name, display_name, testGroup) {\n"
14607 " var f = function() { AnalyzeStackInNativeCode(testGroup); };\n" 16062 " var f = function() { AnalyzeStackInNativeCode(testGroup); };\n"
14608 " if (function_name) {\n" 16063 " if (function_name) {\n"
14609 " Object.defineProperty(f, 'name', { value: function_name });\n" 16064 " Object.defineProperty(f, 'name', { value: function_name });\n"
(...skipping 14 matching lines...) Expand all
14624 v8::ScriptOrigin(origin)); 16079 v8::ScriptOrigin(origin));
14625 v8::Handle<Value> function_name_result( 16080 v8::Handle<Value> function_name_result(
14626 v8::ScriptCompiler::CompileUnbound(isolate, &script_source3) 16081 v8::ScriptCompiler::CompileUnbound(isolate, &script_source3)
14627 ->BindToCurrentContext() 16082 ->BindToCurrentContext()
14628 ->Run()); 16083 ->Run());
14629 CHECK(!function_name_result.IsEmpty()); 16084 CHECK(!function_name_result.IsEmpty());
14630 } 16085 }
14631 16086
14632 16087
14633 static void StackTraceForUncaughtExceptionListener( 16088 static void StackTraceForUncaughtExceptionListener(
14634 v8::Handle<v8::Message> message, 16089 v8::Local<v8::Message> message, v8::Local<Value>) {
14635 v8::Handle<Value>) {
14636 report_count++; 16090 report_count++;
14637 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16091 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14638 CHECK_EQ(2, stack_trace->GetFrameCount()); 16092 CHECK_EQ(2, stack_trace->GetFrameCount());
14639 checkStackFrame("origin", "foo", 2, 3, false, false, 16093 checkStackFrame("origin", "foo", 2, 3, false, false,
14640 stack_trace->GetFrame(0)); 16094 stack_trace->GetFrame(0));
14641 checkStackFrame("origin", "bar", 5, 3, false, false, 16095 checkStackFrame("origin", "bar", 5, 3, false, false,
14642 stack_trace->GetFrame(1)); 16096 stack_trace->GetFrame(1));
14643 } 16097 }
14644 16098
14645 16099
14646 TEST(CaptureStackTraceForUncaughtException) { 16100 TEST(CaptureStackTraceForUncaughtException) {
14647 report_count = 0; 16101 report_count = 0;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
14712 " 'isConstructor'];\n" 16166 " 'isConstructor'];\n"
14713 "for (var i = 0; i < setters.length; i++) {\n" 16167 "for (var i = 0; i < setters.length; i++) {\n"
14714 " var prop = setters[i];\n" 16168 " var prop = setters[i];\n"
14715 " Object.prototype.__defineSetter__(prop, function() { throw prop; });\n" 16169 " Object.prototype.__defineSetter__(prop, function() { throw prop; });\n"
14716 "}\n"); 16170 "}\n");
14717 CompileRun("throw 'exception';"); 16171 CompileRun("throw 'exception';");
14718 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 16172 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
14719 } 16173 }
14720 16174
14721 16175
14722 static void StackTraceFunctionNameListener(v8::Handle<v8::Message> message, 16176 static void StackTraceFunctionNameListener(v8::Local<v8::Message> message,
14723 v8::Handle<Value>) { 16177 v8::Local<Value>) {
14724 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16178 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14725 CHECK_EQ(5, stack_trace->GetFrameCount()); 16179 CHECK_EQ(5, stack_trace->GetFrameCount());
14726 checkStackFrame("origin", "foo:0", 4, 7, false, false, 16180 checkStackFrame("origin", "foo:0", 4, 7, false, false,
14727 stack_trace->GetFrame(0)); 16181 stack_trace->GetFrame(0));
14728 checkStackFrame("origin", "foo:1", 5, 27, false, false, 16182 checkStackFrame("origin", "foo:1", 5, 27, false, false,
14729 stack_trace->GetFrame(1)); 16183 stack_trace->GetFrame(1));
14730 checkStackFrame("origin", "foo", 5, 27, false, false, 16184 checkStackFrame("origin", "foo", 5, 27, false, false,
14731 stack_trace->GetFrame(2)); 16185 stack_trace->GetFrame(2));
14732 checkStackFrame("origin", "foo", 5, 27, false, false, 16186 checkStackFrame("origin", "foo", 5, 27, false, false,
14733 stack_trace->GetFrame(3)); 16187 stack_trace->GetFrame(3));
14734 checkStackFrame("origin", "", 1, 14, false, false, stack_trace->GetFrame(4)); 16188 checkStackFrame("origin", "", 1, 14, false, false, stack_trace->GetFrame(4));
(...skipping 25 matching lines...) Expand all
14760 "origin"); 16214 "origin");
14761 16215
14762 v8::V8::AddMessageListener(StackTraceFunctionNameListener); 16216 v8::V8::AddMessageListener(StackTraceFunctionNameListener);
14763 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 16217 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
14764 CompileRunWithOrigin("gen('foo', 3)();", "origin"); 16218 CompileRunWithOrigin("gen('foo', 3)();", "origin");
14765 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 16219 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
14766 v8::V8::RemoveMessageListeners(StackTraceFunctionNameListener); 16220 v8::V8::RemoveMessageListeners(StackTraceFunctionNameListener);
14767 } 16221 }
14768 16222
14769 16223
14770 static void RethrowStackTraceHandler(v8::Handle<v8::Message> message, 16224 static void RethrowStackTraceHandler(v8::Local<v8::Message> message,
14771 v8::Handle<v8::Value> data) { 16225 v8::Local<v8::Value> data) {
14772 // Use the frame where JavaScript is called from. 16226 // Use the frame where JavaScript is called from.
14773 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16227 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14774 CHECK(!stack_trace.IsEmpty()); 16228 CHECK(!stack_trace.IsEmpty());
14775 int frame_count = stack_trace->GetFrameCount(); 16229 int frame_count = stack_trace->GetFrameCount();
14776 CHECK_EQ(3, frame_count); 16230 CHECK_EQ(3, frame_count);
14777 int line_number[] = {1, 2, 5}; 16231 int line_number[] = {1, 2, 5};
14778 for (int i = 0; i < frame_count; i++) { 16232 for (int i = 0; i < frame_count; i++) {
14779 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); 16233 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber());
14780 } 16234 }
14781 } 16235 }
14782 16236
14783 16237
(...skipping 20 matching lines...) Expand all
14804 " } \n" 16258 " } \n"
14805 "} \n"; 16259 "} \n";
14806 v8::V8::AddMessageListener(RethrowStackTraceHandler); 16260 v8::V8::AddMessageListener(RethrowStackTraceHandler);
14807 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 16261 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
14808 CompileRun(source); 16262 CompileRun(source);
14809 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 16263 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
14810 v8::V8::RemoveMessageListeners(RethrowStackTraceHandler); 16264 v8::V8::RemoveMessageListeners(RethrowStackTraceHandler);
14811 } 16265 }
14812 16266
14813 16267
14814 static void RethrowPrimitiveStackTraceHandler(v8::Handle<v8::Message> message, 16268 static void RethrowPrimitiveStackTraceHandler(v8::Local<v8::Message> message,
14815 v8::Handle<v8::Value> data) { 16269 v8::Local<v8::Value> data) {
14816 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16270 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14817 CHECK(!stack_trace.IsEmpty()); 16271 CHECK(!stack_trace.IsEmpty());
14818 int frame_count = stack_trace->GetFrameCount(); 16272 int frame_count = stack_trace->GetFrameCount();
14819 CHECK_EQ(2, frame_count); 16273 CHECK_EQ(2, frame_count);
14820 int line_number[] = {3, 7}; 16274 int line_number[] = {3, 7};
14821 for (int i = 0; i < frame_count; i++) { 16275 for (int i = 0; i < frame_count; i++) {
14822 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber()); 16276 CHECK_EQ(line_number[i], stack_trace->GetFrame(i)->GetLineNumber());
14823 } 16277 }
14824 } 16278 }
14825 16279
14826 16280
(...skipping 13 matching lines...) Expand all
14840 " t(e1) \n" 16294 " t(e1) \n"
14841 "} \n"; 16295 "} \n";
14842 v8::V8::AddMessageListener(RethrowPrimitiveStackTraceHandler); 16296 v8::V8::AddMessageListener(RethrowPrimitiveStackTraceHandler);
14843 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 16297 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
14844 CompileRun(source); 16298 CompileRun(source);
14845 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 16299 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
14846 v8::V8::RemoveMessageListeners(RethrowPrimitiveStackTraceHandler); 16300 v8::V8::RemoveMessageListeners(RethrowPrimitiveStackTraceHandler);
14847 } 16301 }
14848 16302
14849 16303
14850 static void RethrowExistingStackTraceHandler(v8::Handle<v8::Message> message, 16304 static void RethrowExistingStackTraceHandler(v8::Local<v8::Message> message,
14851 v8::Handle<v8::Value> data) { 16305 v8::Local<v8::Value> data) {
14852 // Use the frame where JavaScript is called from. 16306 // Use the frame where JavaScript is called from.
14853 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16307 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14854 CHECK(!stack_trace.IsEmpty()); 16308 CHECK(!stack_trace.IsEmpty());
14855 CHECK_EQ(1, stack_trace->GetFrameCount()); 16309 CHECK_EQ(1, stack_trace->GetFrameCount());
14856 CHECK_EQ(1, stack_trace->GetFrame(0)->GetLineNumber()); 16310 CHECK_EQ(1, stack_trace->GetFrame(0)->GetLineNumber());
14857 } 16311 }
14858 16312
14859 16313
14860 // Test that the stack trace is captured when the error object is created and 16314 // Test that the stack trace is captured when the error object is created and
14861 // not where it is thrown. 16315 // not where it is thrown.
14862 TEST(RethrowExistingStackTrace) { 16316 TEST(RethrowExistingStackTrace) {
14863 LocalContext env; 16317 LocalContext env;
14864 v8::HandleScope scope(env->GetIsolate()); 16318 v8::HandleScope scope(env->GetIsolate());
14865 const char* source = 16319 const char* source =
14866 "var e = new Error(); \n" 16320 "var e = new Error(); \n"
14867 "throw e; \n"; 16321 "throw e; \n";
14868 v8::V8::AddMessageListener(RethrowExistingStackTraceHandler); 16322 v8::V8::AddMessageListener(RethrowExistingStackTraceHandler);
14869 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true); 16323 v8::V8::SetCaptureStackTraceForUncaughtExceptions(true);
14870 CompileRun(source); 16324 CompileRun(source);
14871 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false); 16325 v8::V8::SetCaptureStackTraceForUncaughtExceptions(false);
14872 v8::V8::RemoveMessageListeners(RethrowExistingStackTraceHandler); 16326 v8::V8::RemoveMessageListeners(RethrowExistingStackTraceHandler);
14873 } 16327 }
14874 16328
14875 16329
14876 static void RethrowBogusErrorStackTraceHandler(v8::Handle<v8::Message> message, 16330 static void RethrowBogusErrorStackTraceHandler(v8::Local<v8::Message> message,
14877 v8::Handle<v8::Value> data) { 16331 v8::Local<v8::Value> data) {
14878 // Use the frame where JavaScript is called from. 16332 // Use the frame where JavaScript is called from.
14879 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16333 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14880 CHECK(!stack_trace.IsEmpty()); 16334 CHECK(!stack_trace.IsEmpty());
14881 CHECK_EQ(1, stack_trace->GetFrameCount()); 16335 CHECK_EQ(1, stack_trace->GetFrameCount());
14882 CHECK_EQ(2, stack_trace->GetFrame(0)->GetLineNumber()); 16336 CHECK_EQ(2, stack_trace->GetFrame(0)->GetLineNumber());
14883 } 16337 }
14884 16338
14885 16339
14886 // Test that the stack trace is captured where the bogus Error object is thrown. 16340 // Test that the stack trace is captured where the bogus Error object is thrown.
14887 TEST(RethrowBogusErrorStackTrace) { 16341 TEST(RethrowBogusErrorStackTrace) {
14888 LocalContext env; 16342 LocalContext env;
14889 v8::HandleScope scope(env->GetIsolate()); 16343 v8::HandleScope scope(env->GetIsolate());
(...skipping 15 matching lines...) Expand all
14905 int promise_reject_msg_column_number = -1; 16359 int promise_reject_msg_column_number = -1;
14906 int promise_reject_line_number = -1; 16360 int promise_reject_line_number = -1;
14907 int promise_reject_column_number = -1; 16361 int promise_reject_column_number = -1;
14908 int promise_reject_frame_count = -1; 16362 int promise_reject_frame_count = -1;
14909 16363
14910 void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) { 16364 void PromiseRejectCallback(v8::PromiseRejectMessage reject_message) {
14911 if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) { 16365 if (reject_message.GetEvent() == v8::kPromiseRejectWithNoHandler) {
14912 promise_reject_counter++; 16366 promise_reject_counter++;
14913 CcTest::global()->Set(v8_str("rejected"), reject_message.GetPromise()); 16367 CcTest::global()->Set(v8_str("rejected"), reject_message.GetPromise());
14914 CcTest::global()->Set(v8_str("value"), reject_message.GetValue()); 16368 CcTest::global()->Set(v8_str("value"), reject_message.GetValue());
14915 v8::Handle<v8::Message> message = 16369 v8::Local<v8::Message> message =
14916 v8::Exception::CreateMessage(reject_message.GetValue()); 16370 v8::Exception::CreateMessage(reject_message.GetValue());
14917 v8::Handle<v8::StackTrace> stack_trace = message->GetStackTrace(); 16371 v8::Local<v8::StackTrace> stack_trace = message->GetStackTrace();
14918 16372
14919 promise_reject_msg_line_number = message->GetLineNumber(); 16373 promise_reject_msg_line_number = message->GetLineNumber();
14920 promise_reject_msg_column_number = message->GetStartColumn() + 1; 16374 promise_reject_msg_column_number = message->GetStartColumn() + 1;
14921 16375
14922 if (!stack_trace.IsEmpty()) { 16376 if (!stack_trace.IsEmpty()) {
14923 promise_reject_frame_count = stack_trace->GetFrameCount(); 16377 promise_reject_frame_count = stack_trace->GetFrameCount();
14924 if (promise_reject_frame_count > 0) { 16378 if (promise_reject_frame_count > 0) {
14925 CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro"))); 16379 CHECK(stack_trace->GetFrame(0)->GetScriptName()->Equals(v8_str("pro")));
14926 promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber(); 16380 promise_reject_line_number = stack_trace->GetFrame(0)->GetLineNumber();
14927 promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn(); 16381 promise_reject_column_number = stack_trace->GetFrame(0)->GetColumn();
14928 } else { 16382 } else {
14929 promise_reject_line_number = -1; 16383 promise_reject_line_number = -1;
14930 promise_reject_column_number = -1; 16384 promise_reject_column_number = -1;
14931 } 16385 }
14932 } 16386 }
14933 } else { 16387 } else {
14934 promise_revoke_counter++; 16388 promise_revoke_counter++;
14935 CcTest::global()->Set(v8_str("revoked"), reject_message.GetPromise()); 16389 CcTest::global()->Set(v8_str("revoked"), reject_message.GetPromise());
14936 CHECK(reject_message.GetValue().IsEmpty()); 16390 CHECK(reject_message.GetValue().IsEmpty());
14937 } 16391 }
14938 } 16392 }
14939 16393
14940 16394
14941 v8::Handle<v8::Promise> GetPromise(const char* name) { 16395 v8::Local<v8::Promise> GetPromise(const char* name) {
14942 return v8::Handle<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name))); 16396 return v8::Local<v8::Promise>::Cast(CcTest::global()->Get(v8_str(name)));
14943 } 16397 }
14944 16398
14945 16399
14946 v8::Handle<v8::Value> RejectValue() { 16400 v8::Local<v8::Value> RejectValue() {
14947 return CcTest::global()->Get(v8_str("value")); 16401 return CcTest::global()->Get(v8_str("value"));
14948 } 16402 }
14949 16403
14950 16404
14951 void ResetPromiseStates() { 16405 void ResetPromiseStates() {
14952 promise_reject_counter = 0; 16406 promise_reject_counter = 0;
14953 promise_revoke_counter = 0; 16407 promise_revoke_counter = 0;
14954 promise_reject_msg_line_number = -1; 16408 promise_reject_msg_line_number = -1;
14955 promise_reject_msg_column_number = -1; 16409 promise_reject_msg_column_number = -1;
14956 promise_reject_line_number = -1; 16410 promise_reject_line_number = -1;
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
15275 CHECK_EQ(5, promise_reject_line_number); 16729 CHECK_EQ(5, promise_reject_line_number);
15276 CHECK_EQ(10, promise_reject_column_number); 16730 CHECK_EQ(10, promise_reject_column_number);
15277 CHECK_EQ(2, promise_reject_msg_line_number); 16731 CHECK_EQ(2, promise_reject_msg_line_number);
15278 CHECK_EQ(7, promise_reject_msg_column_number); 16732 CHECK_EQ(7, promise_reject_msg_column_number);
15279 } 16733 }
15280 16734
15281 16735
15282 void AnalyzeStackOfEvalWithSourceURL( 16736 void AnalyzeStackOfEvalWithSourceURL(
15283 const v8::FunctionCallbackInfo<v8::Value>& args) { 16737 const v8::FunctionCallbackInfo<v8::Value>& args) {
15284 v8::HandleScope scope(args.GetIsolate()); 16738 v8::HandleScope scope(args.GetIsolate());
15285 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16739 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
15286 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 16740 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
15287 CHECK_EQ(5, stackTrace->GetFrameCount()); 16741 CHECK_EQ(5, stackTrace->GetFrameCount());
15288 v8::Handle<v8::String> url = v8_str("eval_url"); 16742 v8::Local<v8::String> url = v8_str("eval_url");
15289 for (int i = 0; i < 3; i++) { 16743 for (int i = 0; i < 3; i++) {
15290 v8::Handle<v8::String> name = 16744 v8::Local<v8::String> name =
15291 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16745 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
15292 CHECK(!name.IsEmpty()); 16746 CHECK(!name.IsEmpty());
15293 CHECK(url->Equals(name)); 16747 CHECK(url->Equals(name));
15294 } 16748 }
15295 } 16749 }
15296 16750
15297 16751
15298 TEST(SourceURLInStackTrace) { 16752 TEST(SourceURLInStackTrace) {
15299 v8::Isolate* isolate = CcTest::isolate(); 16753 v8::Isolate* isolate = CcTest::isolate();
15300 v8::HandleScope scope(isolate); 16754 v8::HandleScope scope(isolate);
(...skipping 22 matching lines...) Expand all
15323 i::SNPrintF(code, source, "//@ sourceURL=eval_url"); 16777 i::SNPrintF(code, source, "//@ sourceURL=eval_url");
15324 CHECK(CompileRun(code.start())->IsUndefined()); 16778 CHECK(CompileRun(code.start())->IsUndefined());
15325 } 16779 }
15326 16780
15327 16781
15328 static int scriptIdInStack[2]; 16782 static int scriptIdInStack[2];
15329 16783
15330 void AnalyzeScriptIdInStack( 16784 void AnalyzeScriptIdInStack(
15331 const v8::FunctionCallbackInfo<v8::Value>& args) { 16785 const v8::FunctionCallbackInfo<v8::Value>& args) {
15332 v8::HandleScope scope(args.GetIsolate()); 16786 v8::HandleScope scope(args.GetIsolate());
15333 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16787 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
15334 args.GetIsolate(), 10, v8::StackTrace::kScriptId); 16788 args.GetIsolate(), 10, v8::StackTrace::kScriptId);
15335 CHECK_EQ(2, stackTrace->GetFrameCount()); 16789 CHECK_EQ(2, stackTrace->GetFrameCount());
15336 for (int i = 0; i < 2; i++) { 16790 for (int i = 0; i < 2; i++) {
15337 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); 16791 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId();
15338 } 16792 }
15339 } 16793 }
15340 16794
15341 16795
15342 TEST(ScriptIdInStackTrace) { 16796 TEST(ScriptIdInStackTrace) {
15343 v8::Isolate* isolate = CcTest::isolate(); 16797 v8::Isolate* isolate = CcTest::isolate();
15344 v8::HandleScope scope(isolate); 16798 v8::HandleScope scope(isolate);
15345 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 16799 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
15346 templ->Set(v8_str("AnalyzeScriptIdInStack"), 16800 templ->Set(v8_str("AnalyzeScriptIdInStack"),
15347 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); 16801 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack));
15348 LocalContext context(0, templ); 16802 LocalContext context(0, templ);
15349 16803
15350 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( 16804 v8::Local<v8::String> scriptSource = v8_str(
15351 isolate, 16805 "function foo() {\n"
15352 "function foo() {\n" 16806 " AnalyzeScriptIdInStack();"
15353 " AnalyzeScriptIdInStack();" 16807 "}\n"
15354 "}\n" 16808 "foo();\n");
15355 "foo();\n");
15356 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test"); 16809 v8::Local<v8::Script> script = CompileWithOrigin(scriptSource, "test");
15357 script->Run(); 16810 script->Run();
15358 for (int i = 0; i < 2; i++) { 16811 for (int i = 0; i < 2; i++) {
15359 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); 16812 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo);
15360 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId()); 16813 CHECK_EQ(scriptIdInStack[i], script->GetUnboundScript()->GetId());
15361 } 16814 }
15362 } 16815 }
15363 16816
15364 16817
15365 void AnalyzeStackOfInlineScriptWithSourceURL( 16818 void AnalyzeStackOfInlineScriptWithSourceURL(
15366 const v8::FunctionCallbackInfo<v8::Value>& args) { 16819 const v8::FunctionCallbackInfo<v8::Value>& args) {
15367 v8::HandleScope scope(args.GetIsolate()); 16820 v8::HandleScope scope(args.GetIsolate());
15368 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16821 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
15369 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 16822 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
15370 CHECK_EQ(4, stackTrace->GetFrameCount()); 16823 CHECK_EQ(4, stackTrace->GetFrameCount());
15371 v8::Handle<v8::String> url = v8_str("source_url"); 16824 v8::Local<v8::String> url = v8_str("source_url");
15372 for (int i = 0; i < 3; i++) { 16825 for (int i = 0; i < 3; i++) {
15373 v8::Handle<v8::String> name = 16826 v8::Local<v8::String> name =
15374 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16827 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
15375 CHECK(!name.IsEmpty()); 16828 CHECK(!name.IsEmpty());
15376 CHECK(url->Equals(name)); 16829 CHECK(url->Equals(name));
15377 } 16830 }
15378 } 16831 }
15379 16832
15380 16833
15381 TEST(InlineScriptWithSourceURLInStackTrace) { 16834 TEST(InlineScriptWithSourceURLInStackTrace) {
15382 v8::Isolate* isolate = CcTest::isolate(); 16835 v8::Isolate* isolate = CcTest::isolate();
15383 v8::HandleScope scope(isolate); 16836 v8::HandleScope scope(isolate);
(...skipping 20 matching lines...) Expand all
15404 i::SNPrintF(code, source, "//# sourceURL=source_url"); 16857 i::SNPrintF(code, source, "//# sourceURL=source_url");
15405 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); 16858 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined());
15406 i::SNPrintF(code, source, "//@ sourceURL=source_url"); 16859 i::SNPrintF(code, source, "//@ sourceURL=source_url");
15407 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined()); 16860 CHECK(CompileRunWithOrigin(code.start(), "url", 0, 1)->IsUndefined());
15408 } 16861 }
15409 16862
15410 16863
15411 void AnalyzeStackOfDynamicScriptWithSourceURL( 16864 void AnalyzeStackOfDynamicScriptWithSourceURL(
15412 const v8::FunctionCallbackInfo<v8::Value>& args) { 16865 const v8::FunctionCallbackInfo<v8::Value>& args) {
15413 v8::HandleScope scope(args.GetIsolate()); 16866 v8::HandleScope scope(args.GetIsolate());
15414 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( 16867 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(
15415 args.GetIsolate(), 10, v8::StackTrace::kDetailed); 16868 args.GetIsolate(), 10, v8::StackTrace::kDetailed);
15416 CHECK_EQ(4, stackTrace->GetFrameCount()); 16869 CHECK_EQ(4, stackTrace->GetFrameCount());
15417 v8::Handle<v8::String> url = v8_str("source_url"); 16870 v8::Local<v8::String> url = v8_str("source_url");
15418 for (int i = 0; i < 3; i++) { 16871 for (int i = 0; i < 3; i++) {
15419 v8::Handle<v8::String> name = 16872 v8::Local<v8::String> name =
15420 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); 16873 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL();
15421 CHECK(!name.IsEmpty()); 16874 CHECK(!name.IsEmpty());
15422 CHECK(url->Equals(name)); 16875 CHECK(url->Equals(name));
15423 } 16876 }
15424 } 16877 }
15425 16878
15426 16879
15427 TEST(DynamicWithSourceURLInStackTrace) { 16880 TEST(DynamicWithSourceURLInStackTrace) {
15428 v8::Isolate* isolate = CcTest::isolate(); 16881 v8::Isolate* isolate = CcTest::isolate();
15429 v8::HandleScope scope(isolate); 16882 v8::HandleScope scope(isolate);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
15488 " eval(scriptContents);\n" 16941 " eval(scriptContents);\n"
15489 " foo(); }\n" 16942 " foo(); }\n"
15490 "outer();\n" 16943 "outer();\n"
15491 "//# sourceURL=outer_url"; 16944 "//# sourceURL=outer_url";
15492 16945
15493 v8::TryCatch try_catch(context->GetIsolate()); 16946 v8::TryCatch try_catch(context->GetIsolate());
15494 CompileRun(source); 16947 CompileRun(source);
15495 CHECK(try_catch.HasCaught()); 16948 CHECK(try_catch.HasCaught());
15496 16949
15497 Local<v8::Message> message = try_catch.Message(); 16950 Local<v8::Message> message = try_catch.Message();
15498 Handle<Value> sourceURL = 16951 Local<Value> sourceURL = message->GetScriptOrigin().ResourceName();
15499 message->GetScriptOrigin().ResourceName();
15500 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); 16952 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url"));
15501 } 16953 }
15502 16954
15503 16955
15504 TEST(RecursionWithSourceURLInMessageScriptResourceNameOrSourceURL) { 16956 TEST(RecursionWithSourceURLInMessageScriptResourceNameOrSourceURL) {
15505 LocalContext context; 16957 LocalContext context;
15506 v8::HandleScope scope(context->GetIsolate()); 16958 v8::HandleScope scope(context->GetIsolate());
15507 16959
15508 const char *source = 16960 const char *source =
15509 "function outer() {\n" 16961 "function outer() {\n"
15510 " var scriptContents = \"function boo(){ boo(); }\\\n" 16962 " var scriptContents = \"function boo(){ boo(); }\\\n"
15511 " //# sourceURL=source_url\";\n" 16963 " //# sourceURL=source_url\";\n"
15512 " eval(scriptContents);\n" 16964 " eval(scriptContents);\n"
15513 " boo(); }\n" 16965 " boo(); }\n"
15514 "outer();\n" 16966 "outer();\n"
15515 "//# sourceURL=outer_url"; 16967 "//# sourceURL=outer_url";
15516 16968
15517 v8::TryCatch try_catch(context->GetIsolate()); 16969 v8::TryCatch try_catch(context->GetIsolate());
15518 CompileRun(source); 16970 CompileRun(source);
15519 CHECK(try_catch.HasCaught()); 16971 CHECK(try_catch.HasCaught());
15520 16972
15521 Local<v8::Message> message = try_catch.Message(); 16973 Local<v8::Message> message = try_catch.Message();
15522 Handle<Value> sourceURL = 16974 Local<Value> sourceURL = message->GetScriptOrigin().ResourceName();
15523 message->GetScriptOrigin().ResourceName();
15524 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url")); 16975 CHECK_EQ(0, strcmp(*v8::String::Utf8Value(sourceURL), "source_url"));
15525 } 16976 }
15526 16977
15527 16978
15528 static void CreateGarbageInOldSpace() { 16979 static void CreateGarbageInOldSpace() {
15529 i::Factory* factory = CcTest::i_isolate()->factory(); 16980 i::Factory* factory = CcTest::i_isolate()->factory();
15530 v8::HandleScope scope(CcTest::isolate()); 16981 v8::HandleScope scope(CcTest::isolate());
15531 i::AlwaysAllocateScope always_allocate(CcTest::i_isolate()); 16982 i::AlwaysAllocateScope always_allocate(CcTest::i_isolate());
15532 for (int i = 0; i < 1000; i++) { 16983 for (int i = 0; i < 1000; i++) {
15533 factory->NewFixedArray(1000, i::TENURED); 16984 factory->NewFixedArray(1000, i::TENURED);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
15603 uint32_t* set_limit = ComputeStackLimit(stack_breathing_room); 17054 uint32_t* set_limit = ComputeStackLimit(stack_breathing_room);
15604 17055
15605 // Set stack limit. 17056 // Set stack limit.
15606 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); 17057 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit));
15607 17058
15608 // Execute a script. 17059 // Execute a script.
15609 LocalContext env; 17060 LocalContext env;
15610 v8::HandleScope scope(env->GetIsolate()); 17061 v8::HandleScope scope(env->GetIsolate());
15611 Local<v8::FunctionTemplate> fun_templ = 17062 Local<v8::FunctionTemplate> fun_templ =
15612 v8::FunctionTemplate::New(env->GetIsolate(), GetStackLimitCallback); 17063 v8::FunctionTemplate::New(env->GetIsolate(), GetStackLimitCallback);
15613 Local<Function> fun = fun_templ->GetFunction(); 17064 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
15614 env->Global()->Set(v8_str("get_stack_limit"), fun); 17065 CHECK(env->Global()
17066 ->Set(env.local(), v8_str("get_stack_limit"), fun)
17067 .FromJust());
15615 CompileRun("get_stack_limit();"); 17068 CompileRun("get_stack_limit();");
15616 17069
15617 CHECK(stack_limit == set_limit); 17070 CHECK(stack_limit == set_limit);
15618 } 17071 }
15619 17072
15620 17073
15621 TEST(SetStackLimitInThread) { 17074 TEST(SetStackLimitInThread) {
15622 uint32_t* set_limit; 17075 uint32_t* set_limit;
15623 { 17076 {
15624 v8::Locker locker(CcTest::isolate()); 17077 v8::Locker locker(CcTest::isolate());
15625 set_limit = ComputeStackLimit(stack_breathing_room); 17078 set_limit = ComputeStackLimit(stack_breathing_room);
15626 17079
15627 // Set stack limit. 17080 // Set stack limit.
15628 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit)); 17081 CcTest::isolate()->SetStackLimit(reinterpret_cast<uintptr_t>(set_limit));
15629 17082
15630 // Execute a script. 17083 // Execute a script.
15631 v8::HandleScope scope(CcTest::isolate()); 17084 v8::HandleScope scope(CcTest::isolate());
15632 LocalContext env; 17085 LocalContext env;
15633 Local<v8::FunctionTemplate> fun_templ = 17086 Local<v8::FunctionTemplate> fun_templ =
15634 v8::FunctionTemplate::New(CcTest::isolate(), GetStackLimitCallback); 17087 v8::FunctionTemplate::New(CcTest::isolate(), GetStackLimitCallback);
15635 Local<Function> fun = fun_templ->GetFunction(); 17088 Local<Function> fun = fun_templ->GetFunction(env.local()).ToLocalChecked();
15636 env->Global()->Set(v8_str("get_stack_limit"), fun); 17089 CHECK(env->Global()
17090 ->Set(env.local(), v8_str("get_stack_limit"), fun)
17091 .FromJust());
15637 CompileRun("get_stack_limit();"); 17092 CompileRun("get_stack_limit();");
15638 17093
15639 CHECK(stack_limit == set_limit); 17094 CHECK(stack_limit == set_limit);
15640 } 17095 }
15641 { 17096 {
15642 v8::Locker locker(CcTest::isolate()); 17097 v8::Locker locker(CcTest::isolate());
15643 CHECK(stack_limit == set_limit); 17098 CHECK(stack_limit == set_limit);
15644 } 17099 }
15645 } 17100 }
15646 17101
(...skipping 12 matching lines...) Expand all
15659 17114
15660 class VisitorImpl : public v8::ExternalResourceVisitor { 17115 class VisitorImpl : public v8::ExternalResourceVisitor {
15661 public: 17116 public:
15662 explicit VisitorImpl(TestResource** resource) { 17117 explicit VisitorImpl(TestResource** resource) {
15663 for (int i = 0; i < 4; i++) { 17118 for (int i = 0; i < 4; i++) {
15664 resource_[i] = resource[i]; 17119 resource_[i] = resource[i];
15665 found_resource_[i] = false; 17120 found_resource_[i] = false;
15666 } 17121 }
15667 } 17122 }
15668 virtual ~VisitorImpl() {} 17123 virtual ~VisitorImpl() {}
15669 virtual void VisitExternalString(v8::Handle<v8::String> string) { 17124 virtual void VisitExternalString(v8::Local<v8::String> string) {
15670 if (!string->IsExternal()) { 17125 if (!string->IsExternal()) {
15671 CHECK(string->IsExternalOneByte()); 17126 CHECK(string->IsExternalOneByte());
15672 return; 17127 return;
15673 } 17128 }
15674 v8::String::ExternalStringResource* resource = 17129 v8::String::ExternalStringResource* resource =
15675 string->GetExternalStringResource(); 17130 string->GetExternalStringResource();
15676 CHECK(resource); 17131 CHECK(resource);
15677 for (int i = 0; i < 4; i++) { 17132 for (int i = 0; i < 4; i++) {
15678 if (resource_[i] == resource) { 17133 if (resource_[i] == resource) {
15679 CHECK(!found_resource_[i]); 17134 CHECK(!found_resource_[i]);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
15746 TestResource* resource[4]; 17201 TestResource* resource[4];
15747 resource[0] = new TestResource(two_byte_string); 17202 resource[0] = new TestResource(two_byte_string);
15748 v8::Local<v8::String> string0 = 17203 v8::Local<v8::String> string0 =
15749 v8::String::NewExternal(env->GetIsolate(), resource[0]); 17204 v8::String::NewExternal(env->GetIsolate(), resource[0]);
15750 resource[1] = new TestResource(two_byte_string, NULL, false); 17205 resource[1] = new TestResource(two_byte_string, NULL, false);
15751 v8::Local<v8::String> string1 = 17206 v8::Local<v8::String> string1 =
15752 v8::String::NewExternal(env->GetIsolate(), resource[1]); 17207 v8::String::NewExternal(env->GetIsolate(), resource[1]);
15753 17208
15754 // Externalized symbol. 17209 // Externalized symbol.
15755 resource[2] = new TestResource(two_byte_string, NULL, false); 17210 resource[2] = new TestResource(two_byte_string, NULL, false);
15756 v8::Local<v8::String> string2 = v8::String::NewFromUtf8( 17211 v8::Local<v8::String> string2 =
15757 env->GetIsolate(), string, v8::String::kInternalizedString); 17212 v8::String::NewFromUtf8(env->GetIsolate(), string,
17213 v8::NewStringType::kInternalized)
17214 .ToLocalChecked();
15758 CHECK(string2->MakeExternal(resource[2])); 17215 CHECK(string2->MakeExternal(resource[2]));
15759 17216
15760 // Symbolized External. 17217 // Symbolized External.
15761 resource[3] = new TestResource(AsciiToTwoByteString("Some other string")); 17218 resource[3] = new TestResource(AsciiToTwoByteString("Some other string"));
15762 v8::Local<v8::String> string3 = 17219 v8::Local<v8::String> string3 =
15763 v8::String::NewExternal(env->GetIsolate(), resource[3]); 17220 v8::String::NewExternal(env->GetIsolate(), resource[3]);
15764 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string. 17221 CcTest::heap()->CollectAllAvailableGarbage(); // Tenure string.
15765 // Turn into a symbol. 17222 // Turn into a symbol.
15766 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3); 17223 i::Handle<i::String> string3_i = v8::Utils::OpenHandle(*string3);
15767 CHECK(!CcTest::i_isolate()->factory()->InternalizeString( 17224 CHECK(!CcTest::i_isolate()->factory()->InternalizeString(
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
15923 -infinity, 17380 -infinity,
15924 -qnan, 17381 -qnan,
15925 -snan 17382 -snan
15926 }; 17383 };
15927 int num_test_values = 20; 17384 int num_test_values = 20;
15928 17385
15929 for (int i = 0; i < num_test_values; i++) { 17386 for (int i = 0; i < num_test_values; i++) {
15930 double test_value = test_values[i]; 17387 double test_value = test_values[i];
15931 17388
15932 // Check that Number::New preserves non-NaNs and quiets SNaNs. 17389 // Check that Number::New preserves non-NaNs and quiets SNaNs.
15933 v8::Handle<v8::Value> number = v8::Number::New(isolate, test_value); 17390 v8::Local<v8::Value> number = v8::Number::New(isolate, test_value);
15934 double stored_number = number->NumberValue(); 17391 double stored_number = number->NumberValue();
15935 if (!std::isnan(test_value)) { 17392 if (!std::isnan(test_value)) {
15936 CHECK_EQ(test_value, stored_number); 17393 CHECK_EQ(test_value, stored_number);
15937 } else { 17394 } else {
15938 uint64_t stored_bits = DoubleToBits(stored_number); 17395 uint64_t stored_bits = DoubleToBits(stored_number);
15939 // Check if quiet nan (bits 51..62 all set). 17396 // Check if quiet nan (bits 51..62 all set).
15940 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ 17397 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \
15941 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ 17398 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \
15942 !defined(USE_SIMULATOR) 17399 !defined(USE_SIMULATOR)
15943 // Most significant fraction bit for quiet nan is set to 0 17400 // Most significant fraction bit for quiet nan is set to 0
15944 // on MIPS architecture. Allowed by IEEE-754. 17401 // on MIPS architecture. Allowed by IEEE-754.
15945 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); 17402 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff));
15946 #else 17403 #else
15947 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); 17404 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff));
15948 #endif 17405 #endif
15949 } 17406 }
15950 17407
15951 // Check that Date::New preserves non-NaNs in the date range and 17408 // Check that Date::New preserves non-NaNs in the date range and
15952 // quiets SNaNs. 17409 // quiets SNaNs.
15953 v8::Handle<v8::Value> date = 17410 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); 17411 double expected_stored_date = DoubleToDateTime(test_value);
15956 double stored_date = date->NumberValue(); 17412 double stored_date = date->NumberValue();
15957 if (!std::isnan(expected_stored_date)) { 17413 if (!std::isnan(expected_stored_date)) {
15958 CHECK_EQ(expected_stored_date, stored_date); 17414 CHECK_EQ(expected_stored_date, stored_date);
15959 } else { 17415 } else {
15960 uint64_t stored_bits = DoubleToBits(stored_date); 17416 uint64_t stored_bits = DoubleToBits(stored_date);
15961 // Check if quiet nan (bits 51..62 all set). 17417 // Check if quiet nan (bits 51..62 all set).
15962 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \ 17418 #if (defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64)) && \
15963 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \ 17419 !defined(_MIPS_ARCH_MIPS64R6) && !defined(_MIPS_ARCH_MIPS32R6) && \
15964 !defined(USE_SIMULATOR) 17420 !defined(USE_SIMULATOR)
15965 // Most significant fraction bit for quiet nan is set to 0 17421 // Most significant fraction bit for quiet nan is set to 0
15966 // on MIPS architecture. Allowed by IEEE-754. 17422 // on MIPS architecture. Allowed by IEEE-754.
15967 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff)); 17423 CHECK_EQ(0xffe, static_cast<int>((stored_bits >> 51) & 0xfff));
15968 #else 17424 #else
15969 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff)); 17425 CHECK_EQ(0xfff, static_cast<int>((stored_bits >> 51) & 0xfff));
15970 #endif 17426 #endif
15971 } 17427 }
15972 } 17428 }
15973 } 17429 }
15974 17430
15975 17431
15976 static void SpaghettiIncident( 17432 static void SpaghettiIncident(
15977 const v8::FunctionCallbackInfo<v8::Value>& args) { 17433 const v8::FunctionCallbackInfo<v8::Value>& args) {
15978 v8::HandleScope scope(args.GetIsolate()); 17434 v8::HandleScope scope(args.GetIsolate());
15979 v8::TryCatch tc(args.GetIsolate()); 17435 v8::TryCatch tc(args.GetIsolate());
15980 v8::Handle<v8::String> str(args[0]->ToString(args.GetIsolate())); 17436 v8::Local<v8::String> str(args[0]->ToString(args.GetIsolate()));
15981 USE(str); 17437 USE(str);
15982 if (tc.HasCaught()) 17438 if (tc.HasCaught())
15983 tc.ReThrow(); 17439 tc.ReThrow();
15984 } 17440 }
15985 17441
15986 17442
15987 // Test that an exception can be propagated down through a spaghetti 17443 // Test that an exception can be propagated down through a spaghetti
15988 // stack using ReThrow. 17444 // stack using ReThrow.
15989 THREADED_TEST(SpaghettiStackReThrow) { 17445 THREADED_TEST(SpaghettiStackReThrow) {
15990 v8::Isolate* isolate = CcTest::isolate(); 17446 v8::Isolate* isolate = CcTest::isolate();
15991 v8::HandleScope scope(isolate); 17447 v8::HandleScope scope(isolate);
15992 LocalContext context; 17448 LocalContext context;
15993 context->Global()->Set( 17449 context->Global()->Set(v8_str("s"),
15994 v8::String::NewFromUtf8(isolate, "s"), 17450 v8::FunctionTemplate::New(isolate, SpaghettiIncident)
15995 v8::FunctionTemplate::New(isolate, SpaghettiIncident)->GetFunction()); 17451 ->GetFunction(context.local())
17452 .ToLocalChecked());
15996 v8::TryCatch try_catch(isolate); 17453 v8::TryCatch try_catch(isolate);
15997 CompileRun( 17454 CompileRun(
15998 "var i = 0;" 17455 "var i = 0;"
15999 "var o = {" 17456 "var o = {"
16000 " toString: function () {" 17457 " toString: function () {"
16001 " if (i == 10) {" 17458 " if (i == 10) {"
16002 " throw 'Hey!';" 17459 " throw 'Hey!';"
16003 " } else {" 17460 " } else {"
16004 " i++;" 17461 " i++;"
16005 " return s(o);" 17462 " return s(o);"
(...skipping 20 matching lines...) Expand all
16026 other_context = Context::New(isolate); 17483 other_context = Context::New(isolate);
16027 17484
16028 // Context-dependent context data creates reference from the compilation 17485 // Context-dependent context data creates reference from the compilation
16029 // cache to the global object. 17486 // cache to the global object.
16030 const char* source_simple = "1"; 17487 const char* source_simple = "1";
16031 { 17488 {
16032 v8::HandleScope scope(isolate); 17489 v8::HandleScope scope(isolate);
16033 v8::Local<Context> context = Context::New(isolate); 17490 v8::Local<Context> context = Context::New(isolate);
16034 17491
16035 context->Enter(); 17492 context->Enter();
16036 Local<v8::String> obj = v8::String::NewFromUtf8(isolate, ""); 17493 Local<v8::String> obj = v8_str("");
16037 context->SetEmbedderData(0, obj); 17494 context->SetEmbedderData(0, obj);
16038 CompileRun(source_simple); 17495 CompileRun(source_simple);
16039 context->Exit(); 17496 context->Exit();
16040 } 17497 }
16041 isolate->ContextDisposedNotification(); 17498 isolate->ContextDisposedNotification();
16042 for (gc_count = 1; gc_count < 10; gc_count++) { 17499 for (gc_count = 1; gc_count < 10; gc_count++) {
16043 other_context->Enter(); 17500 other_context->Enter();
16044 CompileRun(source_simple); 17501 CompileRun(source_simple);
16045 other_context->Exit(); 17502 other_context->Exit();
16046 CcTest::heap()->CollectAllGarbage(); 17503 CcTest::heap()->CollectAllGarbage();
(...skipping 28 matching lines...) Expand all
16075 // compilation cache to the global object. 17532 // compilation cache to the global object.
16076 const char* source_exception = "function f(){throw 1;} f()"; 17533 const char* source_exception = "function f(){throw 1;} f()";
16077 { 17534 {
16078 v8::HandleScope scope(isolate); 17535 v8::HandleScope scope(isolate);
16079 v8::Local<Context> context = Context::New(isolate); 17536 v8::Local<Context> context = Context::New(isolate);
16080 17537
16081 context->Enter(); 17538 context->Enter();
16082 v8::TryCatch try_catch(isolate); 17539 v8::TryCatch try_catch(isolate);
16083 CompileRun(source_exception); 17540 CompileRun(source_exception);
16084 CHECK(try_catch.HasCaught()); 17541 CHECK(try_catch.HasCaught());
16085 v8::Handle<v8::Message> message = try_catch.Message(); 17542 v8::Local<v8::Message> message = try_catch.Message();
16086 CHECK(!message.IsEmpty()); 17543 CHECK(!message.IsEmpty());
16087 CHECK_EQ(1, message->GetLineNumber()); 17544 CHECK_EQ(1, message->GetLineNumber());
16088 context->Exit(); 17545 context->Exit();
16089 } 17546 }
16090 isolate->ContextDisposedNotification(); 17547 isolate->ContextDisposedNotification();
16091 for (gc_count = 1; gc_count < 10; gc_count++) { 17548 for (gc_count = 1; gc_count < 10; gc_count++) {
16092 other_context->Enter(); 17549 other_context->Enter();
16093 CompileRun(source_exception); 17550 CompileRun(source_exception);
16094 other_context->Exit(); 17551 other_context->Exit();
16095 CcTest::heap()->CollectAllGarbage(); 17552 CcTest::heap()->CollectAllGarbage();
16096 if (GetGlobalObjectsCount() == 1) break; 17553 if (GetGlobalObjectsCount() == 1) break;
16097 } 17554 }
16098 CHECK_GE(2, gc_count); 17555 CHECK_GE(2, gc_count);
16099 CHECK_EQ(1, GetGlobalObjectsCount()); 17556 CHECK_EQ(1, GetGlobalObjectsCount());
16100 17557
16101 isolate->ContextDisposedNotification(); 17558 isolate->ContextDisposedNotification();
16102 } 17559 }
16103 17560
16104 17561
16105 THREADED_TEST(ScriptOrigin) { 17562 THREADED_TEST(ScriptOrigin) {
16106 LocalContext env; 17563 LocalContext env;
16107 v8::HandleScope scope(env->GetIsolate()); 17564 v8::HandleScope scope(env->GetIsolate());
16108 v8::ScriptOrigin origin = v8::ScriptOrigin( 17565 v8::ScriptOrigin origin = v8::ScriptOrigin(
16109 v8::String::NewFromUtf8(env->GetIsolate(), "test"), 17566 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()), 17567 v8::Integer::New(env->GetIsolate(), 1), v8::True(env->GetIsolate()),
16112 v8::Handle<v8::Integer>(), v8::True(env->GetIsolate()), 17568 v8::Local<v8::Integer>(), v8::True(env->GetIsolate()),
16113 v8::String::NewFromUtf8(env->GetIsolate(), "http://sourceMapUrl"), 17569 v8_str("http://sourceMapUrl"), v8::True(env->GetIsolate()));
16114 v8::True(env->GetIsolate())); 17570 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(); 17571 v8::Script::Compile(script, &origin)->Run();
16118 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17572 v8::Local<v8::Function> f =
16119 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 17573 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f")));
16120 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17574 v8::Local<v8::Function> g =
16121 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 17575 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g")));
16122 17576
16123 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin(); 17577 v8::ScriptOrigin script_origin_f = f->GetScriptOrigin();
16124 CHECK_EQ(0, strcmp("test", 17578 CHECK_EQ(0, strcmp("test",
16125 *v8::String::Utf8Value(script_origin_f.ResourceName()))); 17579 *v8::String::Utf8Value(script_origin_f.ResourceName())));
16126 CHECK_EQ(1, script_origin_f.ResourceLineOffset()->Int32Value()); 17580 CHECK_EQ(
17581 1,
17582 script_origin_f.ResourceLineOffset()->Int32Value(env.local()).FromJust());
16127 CHECK(script_origin_f.Options().IsSharedCrossOrigin()); 17583 CHECK(script_origin_f.Options().IsSharedCrossOrigin());
16128 CHECK(script_origin_f.Options().IsEmbedderDebugScript()); 17584 CHECK(script_origin_f.Options().IsEmbedderDebugScript());
16129 CHECK(script_origin_f.Options().IsOpaque()); 17585 CHECK(script_origin_f.Options().IsOpaque());
16130 printf("is name = %d\n", script_origin_f.SourceMapUrl()->IsUndefined()); 17586 printf("is name = %d\n", script_origin_f.SourceMapUrl()->IsUndefined());
16131 17587
16132 CHECK_EQ(0, strcmp("http://sourceMapUrl", 17588 CHECK_EQ(0, strcmp("http://sourceMapUrl",
16133 *v8::String::Utf8Value(script_origin_f.SourceMapUrl()))); 17589 *v8::String::Utf8Value(script_origin_f.SourceMapUrl())));
16134 17590
16135 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin(); 17591 v8::ScriptOrigin script_origin_g = g->GetScriptOrigin();
16136 CHECK_EQ(0, strcmp("test", 17592 CHECK_EQ(0, strcmp("test",
16137 *v8::String::Utf8Value(script_origin_g.ResourceName()))); 17593 *v8::String::Utf8Value(script_origin_g.ResourceName())));
16138 CHECK_EQ(1, script_origin_g.ResourceLineOffset()->Int32Value()); 17594 CHECK_EQ(
17595 1,
17596 script_origin_g.ResourceLineOffset()->Int32Value(env.local()).FromJust());
16139 CHECK(script_origin_g.Options().IsSharedCrossOrigin()); 17597 CHECK(script_origin_g.Options().IsSharedCrossOrigin());
16140 CHECK(script_origin_g.Options().IsEmbedderDebugScript()); 17598 CHECK(script_origin_g.Options().IsEmbedderDebugScript());
16141 CHECK(script_origin_g.Options().IsOpaque()); 17599 CHECK(script_origin_g.Options().IsOpaque());
16142 CHECK_EQ(0, strcmp("http://sourceMapUrl", 17600 CHECK_EQ(0, strcmp("http://sourceMapUrl",
16143 *v8::String::Utf8Value(script_origin_g.SourceMapUrl()))); 17601 *v8::String::Utf8Value(script_origin_g.SourceMapUrl())));
16144 } 17602 }
16145 17603
16146 17604
16147 THREADED_TEST(FunctionGetInferredName) { 17605 THREADED_TEST(FunctionGetInferredName) {
16148 LocalContext env; 17606 LocalContext env;
16149 v8::HandleScope scope(env->GetIsolate()); 17607 v8::HandleScope scope(env->GetIsolate());
16150 v8::ScriptOrigin origin = 17608 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
16151 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 17609 v8::Local<v8::String> script =
16152 v8::Handle<v8::String> script = v8::String::NewFromUtf8( 17610 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(); 17611 v8::Script::Compile(script, &origin)->Run();
16156 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17612 v8::Local<v8::Function> f =
16157 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 17613 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f")));
16158 CHECK_EQ(0, 17614 CHECK_EQ(0,
16159 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName()))); 17615 strcmp("foo.bar.baz", *v8::String::Utf8Value(f->GetInferredName())));
16160 } 17616 }
16161 17617
16162 17618
16163 THREADED_TEST(FunctionGetDebugName) { 17619 THREADED_TEST(FunctionGetDebugName) {
16164 LocalContext env; 17620 LocalContext env;
16165 v8::HandleScope scope(env->GetIsolate()); 17621 v8::HandleScope scope(env->GetIsolate());
16166 const char* code = 17622 const char* code =
16167 "var error = false;" 17623 "var error = false;"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
16261 " throw new Error();" 17717 " throw new Error();"
16262 "});" 17718 "});"
16263 "function f() {};" 17719 "function f() {};"
16264 "f.displayName = { 'foo': 6, toString: function() {" 17720 "f.displayName = { 'foo': 6, toString: function() {"
16265 " error = true;" 17721 " error = true;"
16266 " return 'wrong_display_name';" 17722 " return 'wrong_display_name';"
16267 "}};" 17723 "}};"
16268 "var g = function() {" 17724 "var g = function() {"
16269 " arguments.callee.displayName = 'set_in_runtime';" 17725 " arguments.callee.displayName = 'set_in_runtime';"
16270 "}; g();"; 17726 "}; g();";
16271 v8::ScriptOrigin origin = 17727 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
16272 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 17728 v8::Script::Compile(v8_str(code), &origin)->Run();
16273 v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), code), &origin) 17729 v8::Local<v8::Value> error = env->Global()->Get(v8_str("error"));
16274 ->Run(); 17730 v8::Local<v8::Function> a =
16275 v8::Local<v8::Value> error = 17731 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("a")));
16276 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "error")); 17732 v8::Local<v8::Function> b =
16277 v8::Local<v8::Function> a = v8::Local<v8::Function>::Cast( 17733 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("b")));
16278 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "a"))); 17734 v8::Local<v8::Function> c =
16279 v8::Local<v8::Function> b = v8::Local<v8::Function>::Cast( 17735 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("c")));
16280 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "b"))); 17736 v8::Local<v8::Function> d =
16281 v8::Local<v8::Function> c = v8::Local<v8::Function>::Cast( 17737 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("d")));
16282 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "c"))); 17738 v8::Local<v8::Function> e =
16283 v8::Local<v8::Function> d = v8::Local<v8::Function>::Cast( 17739 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("e")));
16284 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "d"))); 17740 v8::Local<v8::Function> f =
16285 v8::Local<v8::Function> e = v8::Local<v8::Function>::Cast( 17741 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f")));
16286 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "e"))); 17742 v8::Local<v8::Function> g =
16287 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17743 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()); 17744 CHECK_EQ(false, error->BooleanValue());
16292 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName()))); 17745 CHECK_EQ(0, strcmp("display_a", *v8::String::Utf8Value(a->GetDisplayName())));
16293 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName()))); 17746 CHECK_EQ(0, strcmp("display_b", *v8::String::Utf8Value(b->GetDisplayName())));
16294 CHECK(c->GetDisplayName()->IsUndefined()); 17747 CHECK(c->GetDisplayName()->IsUndefined());
16295 CHECK(d->GetDisplayName()->IsUndefined()); 17748 CHECK(d->GetDisplayName()->IsUndefined());
16296 CHECK(e->GetDisplayName()->IsUndefined()); 17749 CHECK(e->GetDisplayName()->IsUndefined());
16297 CHECK(f->GetDisplayName()->IsUndefined()); 17750 CHECK(f->GetDisplayName()->IsUndefined());
16298 CHECK_EQ( 17751 CHECK_EQ(
16299 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName()))); 17752 0, strcmp("set_in_runtime", *v8::String::Utf8Value(g->GetDisplayName())));
16300 } 17753 }
16301 17754
16302 17755
16303 THREADED_TEST(ScriptLineNumber) { 17756 THREADED_TEST(ScriptLineNumber) {
16304 LocalContext env; 17757 LocalContext env;
16305 v8::HandleScope scope(env->GetIsolate()); 17758 v8::HandleScope scope(env->GetIsolate());
16306 v8::ScriptOrigin origin = 17759 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
16307 v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 17760 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(); 17761 v8::Script::Compile(script, &origin)->Run();
16311 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17762 v8::Local<v8::Function> f =
16312 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 17763 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f")));
16313 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17764 v8::Local<v8::Function> g =
16314 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 17765 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g")));
16315 CHECK_EQ(0, f->GetScriptLineNumber()); 17766 CHECK_EQ(0, f->GetScriptLineNumber());
16316 CHECK_EQ(2, g->GetScriptLineNumber()); 17767 CHECK_EQ(2, g->GetScriptLineNumber());
16317 } 17768 }
16318 17769
16319 17770
16320 THREADED_TEST(ScriptColumnNumber) { 17771 THREADED_TEST(ScriptColumnNumber) {
16321 LocalContext env; 17772 LocalContext env;
16322 v8::Isolate* isolate = env->GetIsolate(); 17773 v8::Isolate* isolate = env->GetIsolate();
16323 v8::HandleScope scope(isolate); 17774 v8::HandleScope scope(isolate);
16324 v8::ScriptOrigin origin = 17775 v8::ScriptOrigin origin =
16325 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test"), 17776 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3),
16326 v8::Integer::New(isolate, 3),
16327 v8::Integer::New(isolate, 2)); 17777 v8::Integer::New(isolate, 2));
16328 v8::Handle<v8::String> script = v8::String::NewFromUtf8( 17778 v8::Local<v8::String> script =
16329 isolate, "function foo() {}\n\n function bar() {}"); 17779 v8_str("function foo() {}\n\n function bar() {}");
16330 v8::Script::Compile(script, &origin)->Run(); 17780 v8::Script::Compile(script, &origin)->Run();
16331 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 17781 v8::Local<v8::Function> foo =
16332 env->Global()->Get(v8::String::NewFromUtf8(isolate, "foo"))); 17782 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo")));
16333 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( 17783 v8::Local<v8::Function> bar =
16334 env->Global()->Get(v8::String::NewFromUtf8(isolate, "bar"))); 17784 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar")));
16335 CHECK_EQ(14, foo->GetScriptColumnNumber()); 17785 CHECK_EQ(14, foo->GetScriptColumnNumber());
16336 CHECK_EQ(17, bar->GetScriptColumnNumber()); 17786 CHECK_EQ(17, bar->GetScriptColumnNumber());
16337 } 17787 }
16338 17788
16339 17789
16340 THREADED_TEST(FunctionIsBuiltin) { 17790 THREADED_TEST(FunctionIsBuiltin) {
16341 LocalContext env; 17791 LocalContext env;
16342 v8::Isolate* isolate = env->GetIsolate(); 17792 v8::Isolate* isolate = env->GetIsolate();
16343 v8::HandleScope scope(isolate); 17793 v8::HandleScope scope(isolate);
16344 v8::Local<v8::Function> f; 17794 v8::Local<v8::Function> f;
16345 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor")); 17795 f = v8::Local<v8::Function>::Cast(CompileRun("Math.floor"));
16346 CHECK(f->IsBuiltin()); 17796 CHECK(f->IsBuiltin());
16347 f = v8::Local<v8::Function>::Cast(CompileRun("Object")); 17797 f = v8::Local<v8::Function>::Cast(CompileRun("Object"));
16348 CHECK(f->IsBuiltin()); 17798 CHECK(f->IsBuiltin());
16349 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__")); 17799 f = v8::Local<v8::Function>::Cast(CompileRun("Object.__defineSetter__"));
16350 CHECK(f->IsBuiltin()); 17800 CHECK(f->IsBuiltin());
16351 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString")); 17801 f = v8::Local<v8::Function>::Cast(CompileRun("Array.prototype.toString"));
16352 CHECK(f->IsBuiltin()); 17802 CHECK(f->IsBuiltin());
16353 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;")); 17803 f = v8::Local<v8::Function>::Cast(CompileRun("function a() {}; a;"));
16354 CHECK(!f->IsBuiltin()); 17804 CHECK(!f->IsBuiltin());
16355 } 17805 }
16356 17806
16357 17807
16358 THREADED_TEST(FunctionGetScriptId) { 17808 THREADED_TEST(FunctionGetScriptId) {
16359 LocalContext env; 17809 LocalContext env;
16360 v8::Isolate* isolate = env->GetIsolate(); 17810 v8::Isolate* isolate = env->GetIsolate();
16361 v8::HandleScope scope(isolate); 17811 v8::HandleScope scope(isolate);
16362 v8::ScriptOrigin origin = 17812 v8::ScriptOrigin origin =
16363 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test"), 17813 v8::ScriptOrigin(v8_str("test"), v8::Integer::New(isolate, 3),
16364 v8::Integer::New(isolate, 3),
16365 v8::Integer::New(isolate, 2)); 17814 v8::Integer::New(isolate, 2));
16366 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( 17815 v8::Local<v8::String> scriptSource =
16367 isolate, "function foo() {}\n\n function bar() {}"); 17816 v8_str("function foo() {}\n\n function bar() {}");
16368 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); 17817 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin));
16369 script->Run(); 17818 script->Run();
16370 v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 17819 v8::Local<v8::Function> foo =
16371 env->Global()->Get(v8::String::NewFromUtf8(isolate, "foo"))); 17820 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("foo")));
16372 v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( 17821 v8::Local<v8::Function> bar =
16373 env->Global()->Get(v8::String::NewFromUtf8(isolate, "bar"))); 17822 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("bar")));
16374 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId()); 17823 CHECK_EQ(script->GetUnboundScript()->GetId(), foo->ScriptId());
16375 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId()); 17824 CHECK_EQ(script->GetUnboundScript()->GetId(), bar->ScriptId());
16376 } 17825 }
16377 17826
16378 17827
16379 THREADED_TEST(FunctionGetBoundFunction) { 17828 THREADED_TEST(FunctionGetBoundFunction) {
16380 LocalContext env; 17829 LocalContext env;
16381 v8::HandleScope scope(env->GetIsolate()); 17830 v8::HandleScope scope(env->GetIsolate());
16382 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::NewFromUtf8( 17831 v8::ScriptOrigin origin = v8::ScriptOrigin(v8_str("test"));
16383 env->GetIsolate(), "test")); 17832 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" 17833 "var a = new Object();\n"
16387 "a.x = 1;\n" 17834 "a.x = 1;\n"
16388 "function f () { return this.x };\n" 17835 "function f () { return this.x };\n"
16389 "var g = f.bind(a);\n" 17836 "var g = f.bind(a);\n"
16390 "var b = g();"); 17837 "var b = g();");
16391 v8::Script::Compile(script, &origin)->Run(); 17838 v8::Script::Compile(script, &origin)->Run();
16392 v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 17839 v8::Local<v8::Function> f =
16393 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 17840 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("f")));
16394 v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 17841 v8::Local<v8::Function> g =
16395 env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 17842 v8::Local<v8::Function>::Cast(env->Global()->Get(v8_str("g")));
16396 CHECK(g->GetBoundFunction()->IsFunction()); 17843 CHECK(g->GetBoundFunction()->IsFunction());
16397 Local<v8::Function> original_function = Local<v8::Function>::Cast( 17844 Local<v8::Function> original_function = Local<v8::Function>::Cast(
16398 g->GetBoundFunction()); 17845 g->GetBoundFunction());
16399 CHECK(f->GetName()->Equals(original_function->GetName())); 17846 CHECK(f->GetName()->Equals(original_function->GetName()));
16400 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber()); 17847 CHECK_EQ(f->GetScriptLineNumber(), original_function->GetScriptLineNumber());
16401 CHECK_EQ(f->GetScriptColumnNumber(), 17848 CHECK_EQ(f->GetScriptColumnNumber(),
16402 original_function->GetScriptColumnNumber()); 17849 original_function->GetScriptColumnNumber());
16403 } 17850 }
16404 17851
16405 17852
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
16441 } 17888 }
16442 17889
16443 17890
16444 TEST(SetterOnConstructorPrototype) { 17891 TEST(SetterOnConstructorPrototype) {
16445 v8::Isolate* isolate = CcTest::isolate(); 17892 v8::Isolate* isolate = CcTest::isolate();
16446 v8::HandleScope scope(isolate); 17893 v8::HandleScope scope(isolate);
16447 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 17894 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
16448 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, 17895 templ->SetAccessor(v8_str("x"), GetterWhichReturns42,
16449 SetterWhichSetsYOnThisTo23); 17896 SetterWhichSetsYOnThisTo23);
16450 LocalContext context; 17897 LocalContext context;
16451 context->Global()->Set(v8_str("P"), templ->NewInstance()); 17898 CHECK(context->Global()
17899 ->Set(context.local(), v8_str("P"),
17900 templ->NewInstance(context.local()).ToLocalChecked())
17901 .FromJust());
16452 CompileRun("function C1() {" 17902 CompileRun("function C1() {"
16453 " this.x = 23;" 17903 " this.x = 23;"
16454 "};" 17904 "};"
16455 "C1.prototype = P;" 17905 "C1.prototype = P;"
16456 "function C2() {" 17906 "function C2() {"
16457 " this.x = 23" 17907 " this.x = 23"
16458 "};" 17908 "};"
16459 "C2.prototype = { };" 17909 "C2.prototype = { };"
16460 "C2.prototype.__proto__ = P;"); 17910 "C2.prototype.__proto__ = P;");
16461 17911
16462 v8::Local<v8::Script> script; 17912 v8::Local<v8::Script> script;
16463 script = v8_compile("new C1();"); 17913 script = v8_compile("new C1();");
16464 for (int i = 0; i < 10; i++) { 17914 for (int i = 0; i < 10; i++) {
16465 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); 17915 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run());
16466 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); 17916 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16467 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); 17917 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16468 } 17918 }
16469 17919
16470 script = v8_compile("new C2();"); 17920 script = v8_compile("new C2();");
16471 for (int i = 0; i < 10; i++) { 17921 for (int i = 0; i < 10; i++) {
16472 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); 17922 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run());
16473 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value()); 17923 CHECK_EQ(42, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16474 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value()); 17924 CHECK_EQ(23, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16475 } 17925 }
16476 } 17926 }
16477 17927
16478 17928
16479 static void NamedPropertyGetterWhichReturns42( 17929 static void NamedPropertyGetterWhichReturns42(
16480 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { 17930 Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) {
16481 info.GetReturnValue().Set(v8_num(42)); 17931 info.GetReturnValue().Set(v8_num(42));
16482 } 17932 }
16483 17933
16484 17934
16485 static void NamedPropertySetterWhichSetsYOnThisTo23( 17935 static void NamedPropertySetterWhichSetsYOnThisTo23(
16486 Local<Name> name, Local<Value> value, 17936 Local<Name> name, Local<Value> value,
16487 const v8::PropertyCallbackInfo<v8::Value>& info) { 17937 const v8::PropertyCallbackInfo<v8::Value>& info) {
16488 if (name->Equals(v8_str("x"))) { 17938 if (name->Equals(v8_str("x"))) {
16489 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23)); 17939 Local<Object>::Cast(info.This())->Set(v8_str("y"), v8_num(23));
16490 } 17940 }
16491 } 17941 }
16492 17942
16493 17943
16494 THREADED_TEST(InterceptorOnConstructorPrototype) { 17944 THREADED_TEST(InterceptorOnConstructorPrototype) {
16495 v8::Isolate* isolate = CcTest::isolate(); 17945 v8::Isolate* isolate = CcTest::isolate();
16496 v8::HandleScope scope(isolate); 17946 v8::HandleScope scope(isolate);
16497 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 17947 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
16498 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 17948 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
16499 NamedPropertyGetterWhichReturns42, 17949 NamedPropertyGetterWhichReturns42,
16500 NamedPropertySetterWhichSetsYOnThisTo23)); 17950 NamedPropertySetterWhichSetsYOnThisTo23));
16501 LocalContext context; 17951 LocalContext context;
16502 context->Global()->Set(v8_str("P"), templ->NewInstance()); 17952 CHECK(context->Global()
17953 ->Set(context.local(), v8_str("P"),
17954 templ->NewInstance(context.local()).ToLocalChecked())
17955 .FromJust());
16503 CompileRun("function C1() {" 17956 CompileRun("function C1() {"
16504 " this.x = 23;" 17957 " this.x = 23;"
16505 "};" 17958 "};"
16506 "C1.prototype = P;" 17959 "C1.prototype = P;"
16507 "function C2() {" 17960 "function C2() {"
16508 " this.x = 23" 17961 " this.x = 23"
16509 "};" 17962 "};"
16510 "C2.prototype = { };" 17963 "C2.prototype = { };"
16511 "C2.prototype.__proto__ = P;"); 17964 "C2.prototype.__proto__ = P;");
16512 17965
16513 v8::Local<v8::Script> script; 17966 v8::Local<v8::Script> script;
16514 script = v8_compile("new C1();"); 17967 script = v8_compile("new C1();");
16515 for (int i = 0; i < 10; i++) { 17968 for (int i = 0; i < 10; i++) {
16516 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); 17969 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run());
16517 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); 17970 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16518 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); 17971 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16519 } 17972 }
16520 17973
16521 script = v8_compile("new C2();"); 17974 script = v8_compile("new C2();");
16522 for (int i = 0; i < 10; i++) { 17975 for (int i = 0; i < 10; i++) {
16523 v8::Handle<v8::Object> c2 = v8::Handle<v8::Object>::Cast(script->Run()); 17976 v8::Local<v8::Object> c2 = v8::Local<v8::Object>::Cast(script->Run());
16524 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value()); 17977 CHECK_EQ(23, c2->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16525 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value()); 17978 CHECK_EQ(42, c2->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16526 } 17979 }
16527 } 17980 }
16528 17981
16529 17982
16530 TEST(Regress618) { 17983 TEST(Regress618) {
16531 const char* source = "function C1() {" 17984 const char* source = "function C1() {"
16532 " this.x = 23;" 17985 " this.x = 23;"
16533 "};" 17986 "};"
16534 "C1.prototype = P;"; 17987 "C1.prototype = P;";
16535 17988
16536 LocalContext context; 17989 LocalContext context;
16537 v8::Isolate* isolate = context->GetIsolate(); 17990 v8::Isolate* isolate = context->GetIsolate();
16538 v8::HandleScope scope(isolate); 17991 v8::HandleScope scope(isolate);
16539 v8::Local<v8::Script> script; 17992 v8::Local<v8::Script> script;
16540 17993
16541 // Use a simple object as prototype. 17994 // Use a simple object as prototype.
16542 v8::Local<v8::Object> prototype = v8::Object::New(isolate); 17995 v8::Local<v8::Object> prototype = v8::Object::New(isolate);
16543 prototype->Set(v8_str("y"), v8_num(42)); 17996 prototype->Set(v8_str("y"), v8_num(42));
16544 context->Global()->Set(v8_str("P"), prototype); 17997 CHECK(context->Global()
17998 ->Set(context.local(), v8_str("P"), prototype)
17999 .FromJust());
16545 18000
16546 // This compile will add the code to the compilation cache. 18001 // This compile will add the code to the compilation cache.
16547 CompileRun(source); 18002 CompileRun(source);
16548 18003
16549 script = v8_compile("new C1();"); 18004 script = v8_compile("new C1();");
16550 // Allow enough iterations for the inobject slack tracking logic 18005 // Allow enough iterations for the inobject slack tracking logic
16551 // to finalize instance size and install the fast construct stub. 18006 // to finalize instance size and install the fast construct stub.
16552 for (int i = 0; i < 256; i++) { 18007 for (int i = 0; i < 256; i++) {
16553 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); 18008 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run());
16554 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value()); 18009 CHECK_EQ(23, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16555 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value()); 18010 CHECK_EQ(42, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16556 } 18011 }
16557 18012
16558 // Use an API object with accessors as prototype. 18013 // Use an API object with accessors as prototype.
16559 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 18014 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
16560 templ->SetAccessor(v8_str("x"), GetterWhichReturns42, 18015 templ->SetAccessor(v8_str("x"), GetterWhichReturns42,
16561 SetterWhichSetsYOnThisTo23); 18016 SetterWhichSetsYOnThisTo23);
16562 context->Global()->Set(v8_str("P"), templ->NewInstance()); 18017 CHECK(context->Global()
18018 ->Set(context.local(), v8_str("P"),
18019 templ->NewInstance(context.local()).ToLocalChecked())
18020 .FromJust());
16563 18021
16564 // This compile will get the code from the compilation cache. 18022 // This compile will get the code from the compilation cache.
16565 CompileRun(source); 18023 CompileRun(source);
16566 18024
16567 script = v8_compile("new C1();"); 18025 script = v8_compile("new C1();");
16568 for (int i = 0; i < 10; i++) { 18026 for (int i = 0; i < 10; i++) {
16569 v8::Handle<v8::Object> c1 = v8::Handle<v8::Object>::Cast(script->Run()); 18027 v8::Local<v8::Object> c1 = v8::Local<v8::Object>::Cast(script->Run());
16570 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value()); 18028 CHECK_EQ(42, c1->Get(v8_str("x"))->Int32Value(context.local()).FromJust());
16571 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value()); 18029 CHECK_EQ(23, c1->Get(v8_str("y"))->Int32Value(context.local()).FromJust());
16572 } 18030 }
16573 } 18031 }
16574 18032
16575 v8::Isolate* gc_callbacks_isolate = NULL; 18033 v8::Isolate* gc_callbacks_isolate = NULL;
16576 int prologue_call_count = 0; 18034 int prologue_call_count = 0;
16577 int epilogue_call_count = 0; 18035 int epilogue_call_count = 0;
16578 int prologue_call_count_second = 0; 18036 int prologue_call_count_second = 0;
16579 int epilogue_call_count_second = 0; 18037 int epilogue_call_count_second = 0;
16580 int prologue_call_count_alloc = 0; 18038 int prologue_call_count_alloc = 0;
16581 int epilogue_call_count_alloc = 0; 18039 int epilogue_call_count_alloc = 0;
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
16805 CHECK(string->IsOneByteRepresentation()); 18263 CHECK(string->IsOneByteRepresentation());
16806 i::ConsString* cons = i::ConsString::cast(*string); 18264 i::ConsString* cons = i::ConsString::cast(*string);
16807 CHECK_EQ(0, cons->second()->length()); 18265 CHECK_EQ(0, cons->second()->length());
16808 CHECK(cons->first()->IsTwoByteRepresentation()); 18266 CHECK(cons->first()->IsTwoByteRepresentation());
16809 } 18267 }
16810 18268
16811 // Check that some string operations work. 18269 // Check that some string operations work.
16812 18270
16813 // Atom RegExp. 18271 // Atom RegExp.
16814 Local<Value> reresult = CompileRun("str2.match(/abel/g).length;"); 18272 Local<Value> reresult = CompileRun("str2.match(/abel/g).length;");
16815 CHECK_EQ(6, reresult->Int32Value()); 18273 CHECK_EQ(6, reresult->Int32Value(context.local()).FromJust());
16816 18274
16817 // Nonatom RegExp. 18275 // Nonatom RegExp.
16818 reresult = CompileRun("str2.match(/abe./g).length;"); 18276 reresult = CompileRun("str2.match(/abe./g).length;");
16819 CHECK_EQ(6, reresult->Int32Value()); 18277 CHECK_EQ(6, reresult->Int32Value(context.local()).FromJust());
16820 18278
16821 reresult = CompileRun("str2.search(/bel/g);"); 18279 reresult = CompileRun("str2.search(/bel/g);");
16822 CHECK_EQ(1, reresult->Int32Value()); 18280 CHECK_EQ(1, reresult->Int32Value(context.local()).FromJust());
16823 18281
16824 reresult = CompileRun("str2.search(/be./g);"); 18282 reresult = CompileRun("str2.search(/be./g);");
16825 CHECK_EQ(1, reresult->Int32Value()); 18283 CHECK_EQ(1, reresult->Int32Value(context.local()).FromJust());
16826 18284
16827 ExpectTrue("/bel/g.test(str2);"); 18285 ExpectTrue("/bel/g.test(str2);");
16828 18286
16829 ExpectTrue("/be./g.test(str2);"); 18287 ExpectTrue("/be./g.test(str2);");
16830 18288
16831 reresult = CompileRun("/bel/g.exec(str2);"); 18289 reresult = CompileRun("/bel/g.exec(str2);");
16832 CHECK(!reresult->IsNull()); 18290 CHECK(!reresult->IsNull());
16833 18291
16834 reresult = CompileRun("/be./g.exec(str2);"); 18292 reresult = CompileRun("/be./g.exec(str2);");
16835 CHECK(!reresult->IsNull()); 18293 CHECK(!reresult->IsNull());
16836 18294
16837 ExpectString("str2.substring(2, 10);", "elspenda"); 18295 ExpectString("str2.substring(2, 10);", "elspenda");
16838 18296
16839 ExpectString("str2.substring(2, 20);", "elspendabelabelspe"); 18297 ExpectString("str2.substring(2, 20);", "elspendabelabelspe");
16840 18298
16841 ExpectString("str2.charAt(2);", "e"); 18299 ExpectString("str2.charAt(2);", "e");
16842 18300
16843 ExpectObject("str2.indexOf('els');", indexof); 18301 ExpectObject("str2.indexOf('els');", indexof);
16844 18302
16845 ExpectObject("str2.lastIndexOf('dab');", lastindexof); 18303 ExpectObject("str2.lastIndexOf('dab');", lastindexof);
16846 18304
16847 reresult = CompileRun("str2.charCodeAt(2);"); 18305 reresult = CompileRun("str2.charCodeAt(2);");
16848 CHECK_EQ(static_cast<int32_t>('e'), reresult->Int32Value()); 18306 CHECK_EQ(static_cast<int32_t>('e'),
18307 reresult->Int32Value(context.local()).FromJust());
16849 } 18308 }
16850 18309
16851 18310
16852 TEST(ContainsOnlyOneByte) { 18311 TEST(ContainsOnlyOneByte) {
16853 v8::V8::Initialize(); 18312 v8::V8::Initialize();
16854 v8::Isolate* isolate = CcTest::isolate(); 18313 v8::Isolate* isolate = CcTest::isolate();
16855 v8::HandleScope scope(isolate); 18314 v8::HandleScope scope(isolate);
16856 // Make a buffer long enough that it won't automatically be converted. 18315 // Make a buffer long enough that it won't automatically be converted.
16857 const int length = 512; 18316 const int length = 512;
16858 // Ensure word aligned assignment. 18317 // Ensure word aligned assignment.
16859 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t); 18318 const int aligned_length = length*sizeof(uintptr_t)/sizeof(uint16_t);
16860 v8::base::SmartArrayPointer<uintptr_t> aligned_contents( 18319 v8::base::SmartArrayPointer<uintptr_t> aligned_contents(
16861 new uintptr_t[aligned_length]); 18320 new uintptr_t[aligned_length]);
16862 uint16_t* string_contents = 18321 uint16_t* string_contents =
16863 reinterpret_cast<uint16_t*>(aligned_contents.get()); 18322 reinterpret_cast<uint16_t*>(aligned_contents.get());
16864 // Set to contain only one byte. 18323 // Set to contain only one byte.
16865 for (int i = 0; i < length-1; i++) { 18324 for (int i = 0; i < length-1; i++) {
16866 string_contents[i] = 0x41; 18325 string_contents[i] = 0x41;
16867 } 18326 }
16868 string_contents[length-1] = 0; 18327 string_contents[length-1] = 0;
16869 // Simple case. 18328 // Simple case.
16870 Handle<String> string = 18329 Local<String> string = String::NewExternal(
16871 String::NewExternal(isolate, 18330 isolate, new TestResource(string_contents, NULL, false));
16872 new TestResource(string_contents, NULL, false));
16873 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18331 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
16874 // Counter example. 18332 // Counter example.
16875 string = String::NewFromTwoByte(isolate, string_contents); 18333 string = String::NewFromTwoByte(isolate, string_contents);
16876 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18334 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
16877 // Test left right and balanced cons strings. 18335 // Test left right and balanced cons strings.
16878 Handle<String> base = String::NewFromUtf8(isolate, "a"); 18336 Local<String> base = v8_str("a");
16879 Handle<String> left = base; 18337 Local<String> left = base;
16880 Handle<String> right = base; 18338 Local<String> right = base;
16881 for (int i = 0; i < 1000; i++) { 18339 for (int i = 0; i < 1000; i++) {
16882 left = String::Concat(base, left); 18340 left = String::Concat(base, left);
16883 right = String::Concat(right, base); 18341 right = String::Concat(right, base);
16884 } 18342 }
16885 Handle<String> balanced = String::Concat(left, base); 18343 Local<String> balanced = String::Concat(left, base);
16886 balanced = String::Concat(balanced, right); 18344 balanced = String::Concat(balanced, right);
16887 Handle<String> cons_strings[] = {left, balanced, right}; 18345 Local<String> cons_strings[] = {left, balanced, right};
16888 Handle<String> two_byte = 18346 Local<String> two_byte = String::NewExternal(
16889 String::NewExternal(isolate, 18347 isolate, new TestResource(string_contents, NULL, false));
16890 new TestResource(string_contents, NULL, false));
16891 USE(two_byte); USE(cons_strings); 18348 USE(two_byte); USE(cons_strings);
16892 for (size_t i = 0; i < arraysize(cons_strings); i++) { 18349 for (size_t i = 0; i < arraysize(cons_strings); i++) {
16893 // Base assumptions. 18350 // Base assumptions.
16894 string = cons_strings[i]; 18351 string = cons_strings[i];
16895 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte()); 18352 CHECK(string->IsOneByte() && string->ContainsOnlyOneByte());
16896 // Test left and right concatentation. 18353 // Test left and right concatentation.
16897 string = String::Concat(two_byte, cons_strings[i]); 18354 string = String::Concat(two_byte, cons_strings[i]);
16898 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18355 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
16899 string = String::Concat(cons_strings[i], two_byte); 18356 string = String::Concat(cons_strings[i], two_byte);
16900 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte()); 18357 CHECK(!string->IsOneByte() && string->ContainsOnlyOneByte());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
16936 // invocation. Then force the callback to be called from va 18393 // invocation. Then force the callback to be called from va
16937 18394
16938 v8::V8::Initialize(); 18395 v8::V8::Initialize();
16939 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC); 18396 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckCallbackGC);
16940 18397
16941 v8::Isolate* isolate = CcTest::isolate(); 18398 v8::Isolate* isolate = CcTest::isolate();
16942 v8::HandleScope scope(isolate); 18399 v8::HandleScope scope(isolate);
16943 18400
16944 // Create an ObjectTemplate for global objects and install access 18401 // Create an ObjectTemplate for global objects and install access
16945 // check callbacks that will block access. 18402 // check callbacks that will block access.
16946 v8::Handle<v8::ObjectTemplate> global_template = 18403 v8::Local<v8::ObjectTemplate> global_template =
16947 v8::ObjectTemplate::New(isolate); 18404 v8::ObjectTemplate::New(isolate);
16948 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 18405 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
16949 18406
16950 // Create a context and set an x property on it's global object. 18407 // Create a context and set an x property on it's global object.
16951 LocalContext context0(NULL, global_template); 18408 LocalContext context0(NULL, global_template);
16952 context0->Global()->Set(v8_str("x"), v8_num(42)); 18409 CHECK(context0->Global()
16953 v8::Handle<v8::Object> global0 = context0->Global(); 18410 ->Set(context0.local(), v8_str("x"), v8_num(42))
18411 .FromJust());
18412 v8::Local<v8::Object> global0 = context0->Global();
16954 18413
16955 // Create a context with a different security token so that the 18414 // Create a context with a different security token so that the
16956 // failed access check callback will be called on each access. 18415 // failed access check callback will be called on each access.
16957 LocalContext context1(NULL, global_template); 18416 LocalContext context1(NULL, global_template);
16958 context1->Global()->Set(v8_str("other"), global0); 18417 CHECK(context1->Global()
18418 ->Set(context1.local(), v8_str("other"), global0)
18419 .FromJust());
16959 18420
16960 v8::TryCatch try_catch(isolate); 18421 v8::TryCatch try_catch(isolate);
16961 18422
16962 // Get property with failed access check. 18423 // Get property with failed access check.
16963 CHECK(CompileRun("other.x").IsEmpty()); 18424 CHECK(CompileRun("other.x").IsEmpty());
16964 CHECK(try_catch.HasCaught()); 18425 CHECK(try_catch.HasCaught());
16965 try_catch.Reset(); 18426 try_catch.Reset();
16966 18427
16967 // Get element with failed access check. 18428 // Get element with failed access check.
16968 CHECK(CompileRun("other[0]").IsEmpty()); 18429 CHECK(CompileRun("other[0]").IsEmpty());
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
17541 public: 19002 public:
17542 explicit Visitor42(v8::Persistent<v8::Object>* object) 19003 explicit Visitor42(v8::Persistent<v8::Object>* object)
17543 : counter_(0), object_(object) { } 19004 : counter_(0), object_(object) { }
17544 19005
17545 virtual void VisitPersistentHandle(Persistent<Value>* value, 19006 virtual void VisitPersistentHandle(Persistent<Value>* value,
17546 uint16_t class_id) { 19007 uint16_t class_id) {
17547 if (class_id != 42) return; 19008 if (class_id != 42) return;
17548 CHECK_EQ(42, value->WrapperClassId()); 19009 CHECK_EQ(42, value->WrapperClassId());
17549 v8::Isolate* isolate = CcTest::isolate(); 19010 v8::Isolate* isolate = CcTest::isolate();
17550 v8::HandleScope handle_scope(isolate); 19011 v8::HandleScope handle_scope(isolate);
17551 v8::Handle<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value); 19012 v8::Local<v8::Value> handle = v8::Local<v8::Value>::New(isolate, *value);
17552 v8::Handle<v8::Value> object = 19013 v8::Local<v8::Value> object = v8::Local<v8::Object>::New(isolate, *object_);
17553 v8::Local<v8::Object>::New(isolate, *object_);
17554 CHECK(handle->IsObject()); 19014 CHECK(handle->IsObject());
17555 CHECK(Handle<Object>::Cast(handle)->Equals(object)); 19015 CHECK(Local<Object>::Cast(handle)->Equals(object));
17556 ++counter_; 19016 ++counter_;
17557 } 19017 }
17558 19018
17559 int counter_; 19019 int counter_;
17560 v8::Persistent<v8::Object>* object_; 19020 v8::Persistent<v8::Object>* object_;
17561 }; 19021 };
17562 19022
17563 19023
17564 TEST(PersistentHandleVisitor) { 19024 TEST(PersistentHandleVisitor) {
17565 LocalContext context; 19025 LocalContext context;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
17615 object2.Reset(); 19075 object2.Reset();
17616 } 19076 }
17617 19077
17618 19078
17619 TEST(RegExp) { 19079 TEST(RegExp) {
17620 i::FLAG_harmony_regexps = true; 19080 i::FLAG_harmony_regexps = true;
17621 i::FLAG_harmony_unicode_regexps = true; 19081 i::FLAG_harmony_unicode_regexps = true;
17622 LocalContext context; 19082 LocalContext context;
17623 v8::HandleScope scope(context->GetIsolate()); 19083 v8::HandleScope scope(context->GetIsolate());
17624 19084
17625 v8::Handle<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone); 19085 v8::Local<v8::RegExp> re = v8::RegExp::New(v8_str("foo"), v8::RegExp::kNone);
17626 CHECK(re->IsRegExp()); 19086 CHECK(re->IsRegExp());
17627 CHECK(re->GetSource()->Equals(v8_str("foo"))); 19087 CHECK(re->GetSource()->Equals(v8_str("foo")));
17628 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); 19088 CHECK_EQ(v8::RegExp::kNone, re->GetFlags());
17629 19089
17630 re = v8::RegExp::New(v8_str("bar"), 19090 re = v8::RegExp::New(v8_str("bar"),
17631 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | 19091 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase |
17632 v8::RegExp::kGlobal)); 19092 v8::RegExp::kGlobal));
17633 CHECK(re->IsRegExp()); 19093 CHECK(re->IsRegExp());
17634 CHECK(re->GetSource()->Equals(v8_str("bar"))); 19094 CHECK(re->GetSource()->Equals(v8_str("bar")));
17635 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal, 19095 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kGlobal,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
17672 CHECK_EQ(v8::RegExp::kNone, re->GetFlags()); 19132 CHECK_EQ(v8::RegExp::kNone, re->GetFlags());
17673 19133
17674 re = v8::RegExp::New(v8_str("foobarbaz"), 19134 re = v8::RegExp::New(v8_str("foobarbaz"),
17675 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase | 19135 static_cast<v8::RegExp::Flags>(v8::RegExp::kIgnoreCase |
17676 v8::RegExp::kMultiline)); 19136 v8::RegExp::kMultiline));
17677 CHECK(re->IsRegExp()); 19137 CHECK(re->IsRegExp());
17678 CHECK(re->GetSource()->Equals(v8_str("foobarbaz"))); 19138 CHECK(re->GetSource()->Equals(v8_str("foobarbaz")));
17679 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline, 19139 CHECK_EQ(v8::RegExp::kIgnoreCase | v8::RegExp::kMultiline,
17680 static_cast<int>(re->GetFlags())); 19140 static_cast<int>(re->GetFlags()));
17681 19141
17682 context->Global()->Set(v8_str("re"), re); 19142 CHECK(context->Global()->Set(context.local(), v8_str("re"), re).FromJust());
17683 ExpectTrue("re.test('FoobarbaZ')"); 19143 ExpectTrue("re.test('FoobarbaZ')");
17684 19144
17685 // RegExps are objects on which you can set properties. 19145 // RegExps are objects on which you can set properties.
17686 re->Set(v8_str("property"), v8::Integer::New(context->GetIsolate(), 32)); 19146 re->Set(v8_str("property"), v8::Integer::New(context->GetIsolate(), 32));
17687 v8::Handle<v8::Value> value(CompileRun("re.property")); 19147 v8::Local<v8::Value> value(CompileRun("re.property"));
17688 CHECK_EQ(32, value->Int32Value()); 19148 CHECK_EQ(32, value->Int32Value(context.local()).FromJust());
17689 19149
17690 v8::TryCatch try_catch(context->GetIsolate()); 19150 v8::TryCatch try_catch(context->GetIsolate());
17691 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone); 19151 re = v8::RegExp::New(v8_str("foo["), v8::RegExp::kNone);
17692 CHECK(re.IsEmpty()); 19152 CHECK(re.IsEmpty());
17693 CHECK(try_catch.HasCaught()); 19153 CHECK(try_catch.HasCaught());
17694 context->Global()->Set(v8_str("ex"), try_catch.Exception()); 19154 CHECK(context->Global()
19155 ->Set(context.local(), v8_str("ex"), try_catch.Exception())
19156 .FromJust());
17695 ExpectTrue("ex instanceof SyntaxError"); 19157 ExpectTrue("ex instanceof SyntaxError");
17696 } 19158 }
17697 19159
17698 19160
17699 THREADED_TEST(Equals) { 19161 THREADED_TEST(Equals) {
17700 LocalContext localContext; 19162 LocalContext localContext;
17701 v8::HandleScope handleScope(localContext->GetIsolate()); 19163 v8::HandleScope handleScope(localContext->GetIsolate());
17702 19164
17703 v8::Handle<v8::Object> globalProxy = localContext->Global(); 19165 v8::Local<v8::Object> globalProxy = localContext->Global();
17704 v8::Handle<Value> global = globalProxy->GetPrototype(); 19166 v8::Local<Value> global = globalProxy->GetPrototype();
17705 19167
17706 CHECK(global->StrictEquals(global)); 19168 CHECK(global->StrictEquals(global));
17707 CHECK(!global->StrictEquals(globalProxy)); 19169 CHECK(!global->StrictEquals(globalProxy));
17708 CHECK(!globalProxy->StrictEquals(global)); 19170 CHECK(!globalProxy->StrictEquals(global));
17709 CHECK(globalProxy->StrictEquals(globalProxy)); 19171 CHECK(globalProxy->StrictEquals(globalProxy));
17710 19172
17711 CHECK(global->Equals(global)); 19173 CHECK(global->Equals(global));
17712 CHECK(!global->Equals(globalProxy)); 19174 CHECK(!global->Equals(globalProxy));
17713 CHECK(!globalProxy->Equals(global)); 19175 CHECK(!globalProxy->Equals(global));
17714 CHECK(globalProxy->Equals(globalProxy)); 19176 CHECK(globalProxy->Equals(globalProxy));
17715 } 19177 }
17716 19178
17717 19179
17718 static void Getter(v8::Local<v8::Name> property, 19180 static void Getter(v8::Local<v8::Name> property,
17719 const v8::PropertyCallbackInfo<v8::Value>& info) { 19181 const v8::PropertyCallbackInfo<v8::Value>& info) {
17720 info.GetReturnValue().Set(v8_str("42!")); 19182 info.GetReturnValue().Set(v8_str("42!"));
17721 } 19183 }
17722 19184
17723 19185
17724 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) { 19186 static void Enumerator(const v8::PropertyCallbackInfo<v8::Array>& info) {
17725 v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate()); 19187 v8::Local<v8::Array> result = v8::Array::New(info.GetIsolate());
17726 result->Set(0, v8_str("universalAnswer")); 19188 result->Set(0, v8_str("universalAnswer"));
17727 info.GetReturnValue().Set(result); 19189 info.GetReturnValue().Set(result);
17728 } 19190 }
17729 19191
17730 19192
17731 TEST(NamedEnumeratorAndForIn) { 19193 TEST(NamedEnumeratorAndForIn) {
17732 LocalContext context; 19194 LocalContext context;
17733 v8::Isolate* isolate = context->GetIsolate(); 19195 v8::Isolate* isolate = context->GetIsolate();
17734 v8::HandleScope handle_scope(isolate); 19196 v8::HandleScope handle_scope(isolate);
17735 v8::Context::Scope context_scope(context.local()); 19197 v8::Context::Scope context_scope(context.local());
17736 19198
17737 v8::Handle<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate); 19199 v8::Local<v8::ObjectTemplate> tmpl = v8::ObjectTemplate::New(isolate);
17738 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL, 19200 tmpl->SetHandler(v8::NamedPropertyHandlerConfiguration(Getter, NULL, NULL,
17739 NULL, Enumerator)); 19201 NULL, Enumerator));
17740 context->Global()->Set(v8_str("o"), tmpl->NewInstance()); 19202 CHECK(context->Global()
17741 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( 19203 ->Set(context.local(), v8_str("o"),
17742 "var result = []; for (var k in o) result.push(k); result")); 19204 tmpl->NewInstance(context.local()).ToLocalChecked())
19205 .FromJust());
19206 v8::Local<v8::Array> result = v8::Local<v8::Array>::Cast(
19207 CompileRun("var result = []; for (var k in o) result.push(k); result"));
17743 CHECK_EQ(1u, result->Length()); 19208 CHECK_EQ(1u, result->Length());
17744 CHECK(v8_str("universalAnswer")->Equals(result->Get(0))); 19209 CHECK(v8_str("universalAnswer")->Equals(result->Get(0)));
17745 } 19210 }
17746 19211
17747 19212
17748 TEST(DefinePropertyPostDetach) { 19213 TEST(DefinePropertyPostDetach) {
17749 LocalContext context; 19214 LocalContext context;
17750 v8::HandleScope scope(context->GetIsolate()); 19215 v8::HandleScope scope(context->GetIsolate());
17751 v8::Handle<v8::Object> proxy = context->Global(); 19216 v8::Local<v8::Object> proxy = context->Global();
17752 v8::Handle<v8::Function> define_property = 19217 v8::Local<v8::Function> define_property =
17753 CompileRun("(function() {" 19218 CompileRun(
17754 " Object.defineProperty(" 19219 "(function() {"
17755 " this," 19220 " Object.defineProperty("
17756 " 1," 19221 " this,"
17757 " { configurable: true, enumerable: true, value: 3 });" 19222 " 1,"
17758 "})").As<Function>(); 19223 " { configurable: true, enumerable: true, value: 3 });"
19224 "})")
19225 .As<Function>();
17759 context->DetachGlobal(); 19226 context->DetachGlobal();
17760 define_property->Call(proxy, 0, NULL); 19227 define_property->Call(proxy, 0, NULL);
17761 } 19228 }
17762 19229
17763 19230
17764 static void InstallContextId(v8::Handle<Context> context, int id) { 19231 static void InstallContextId(v8::Local<Context> context, int id) {
17765 Context::Scope scope(context); 19232 Context::Scope scope(context);
17766 CompileRun("Object.prototype").As<Object>()-> 19233 CHECK(CompileRun("Object.prototype")
17767 Set(v8_str("context_id"), v8::Integer::New(context->GetIsolate(), id)); 19234 .As<Object>()
19235 ->Set(context, v8_str("context_id"),
19236 v8::Integer::New(context->GetIsolate(), id))
19237 .FromJust());
17768 } 19238 }
17769 19239
17770 19240
17771 static void CheckContextId(v8::Handle<Object> object, int expected) { 19241 static void CheckContextId(v8::Local<Object> object, int expected) {
17772 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); 19242 CHECK_EQ(expected, object->Get(v8_str("context_id"))
19243 ->Int32Value(CcTest::isolate()->GetCurrentContext())
19244 .FromJust());
17773 } 19245 }
17774 19246
17775 19247
17776 THREADED_TEST(CreationContext) { 19248 THREADED_TEST(CreationContext) {
17777 v8::Isolate* isolate = CcTest::isolate(); 19249 v8::Isolate* isolate = CcTest::isolate();
17778 HandleScope handle_scope(isolate); 19250 HandleScope handle_scope(isolate);
17779 Handle<Context> context1 = Context::New(isolate); 19251 Local<Context> context1 = Context::New(isolate);
17780 InstallContextId(context1, 1); 19252 InstallContextId(context1, 1);
17781 Handle<Context> context2 = Context::New(isolate); 19253 Local<Context> context2 = Context::New(isolate);
17782 InstallContextId(context2, 2); 19254 InstallContextId(context2, 2);
17783 Handle<Context> context3 = Context::New(isolate); 19255 Local<Context> context3 = Context::New(isolate);
17784 InstallContextId(context3, 3); 19256 InstallContextId(context3, 3);
17785 19257
17786 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(isolate); 19258 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(isolate);
17787 19259
17788 Local<Object> object1; 19260 Local<Object> object1;
17789 Local<Function> func1; 19261 Local<Function> func1;
17790 { 19262 {
17791 Context::Scope scope(context1); 19263 Context::Scope scope(context1);
17792 object1 = Object::New(isolate); 19264 object1 = Object::New(isolate);
17793 func1 = tmpl->GetFunction(); 19265 func1 = tmpl->GetFunction(context1).ToLocalChecked();
17794 } 19266 }
17795 19267
17796 Local<Object> object2; 19268 Local<Object> object2;
17797 Local<Function> func2; 19269 Local<Function> func2;
17798 { 19270 {
17799 Context::Scope scope(context2); 19271 Context::Scope scope(context2);
17800 object2 = Object::New(isolate); 19272 object2 = Object::New(isolate);
17801 func2 = tmpl->GetFunction(); 19273 func2 = tmpl->GetFunction(context2).ToLocalChecked();
17802 } 19274 }
17803 19275
17804 Local<Object> instance1; 19276 Local<Object> instance1;
17805 Local<Object> instance2; 19277 Local<Object> instance2;
17806 19278
17807 { 19279 {
17808 Context::Scope scope(context3); 19280 Context::Scope scope(context3);
17809 instance1 = func1->NewInstance(); 19281 instance1 = func1->NewInstance(context3).ToLocalChecked();
17810 instance2 = func2->NewInstance(); 19282 instance2 = func2->NewInstance(context3).ToLocalChecked();
17811 } 19283 }
17812 19284
17813 { 19285 {
17814 Handle<Context> other_context = Context::New(isolate); 19286 Local<Context> other_context = Context::New(isolate);
17815 Context::Scope scope(other_context); 19287 Context::Scope scope(other_context);
17816 CHECK(object1->CreationContext() == context1); 19288 CHECK(object1->CreationContext() == context1);
17817 CheckContextId(object1, 1); 19289 CheckContextId(object1, 1);
17818 CHECK(func1->CreationContext() == context1); 19290 CHECK(func1->CreationContext() == context1);
17819 CheckContextId(func1, 1); 19291 CheckContextId(func1, 1);
17820 CHECK(instance1->CreationContext() == context1); 19292 CHECK(instance1->CreationContext() == context1);
17821 CheckContextId(instance1, 1); 19293 CheckContextId(instance1, 1);
17822 CHECK(object2->CreationContext() == context2); 19294 CHECK(object2->CreationContext() == context2);
17823 CheckContextId(object2, 2); 19295 CheckContextId(object2, 2);
17824 CHECK(func2->CreationContext() == context2); 19296 CHECK(func2->CreationContext() == context2);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
17856 CHECK(func2->CreationContext() == context2); 19328 CHECK(func2->CreationContext() == context2);
17857 CheckContextId(func2, 2); 19329 CheckContextId(func2, 2);
17858 CHECK(instance2->CreationContext() == context2); 19330 CHECK(instance2->CreationContext() == context2);
17859 CheckContextId(instance2, 2); 19331 CheckContextId(instance2, 2);
17860 } 19332 }
17861 } 19333 }
17862 19334
17863 19335
17864 THREADED_TEST(CreationContextOfJsFunction) { 19336 THREADED_TEST(CreationContextOfJsFunction) {
17865 HandleScope handle_scope(CcTest::isolate()); 19337 HandleScope handle_scope(CcTest::isolate());
17866 Handle<Context> context = Context::New(CcTest::isolate()); 19338 Local<Context> context = Context::New(CcTest::isolate());
17867 InstallContextId(context, 1); 19339 InstallContextId(context, 1);
17868 19340
17869 Local<Object> function; 19341 Local<Object> function;
17870 { 19342 {
17871 Context::Scope scope(context); 19343 Context::Scope scope(context);
17872 function = CompileRun("function foo() {}; foo").As<Object>(); 19344 function = CompileRun("function foo() {}; foo").As<Object>();
17873 } 19345 }
17874 19346
17875 Handle<Context> other_context = Context::New(CcTest::isolate()); 19347 Local<Context> other_context = Context::New(CcTest::isolate());
17876 Context::Scope scope(other_context); 19348 Context::Scope scope(other_context);
17877 CHECK(function->CreationContext() == context); 19349 CHECK(function->CreationContext() == context);
17878 CheckContextId(function, 1); 19350 CheckContextId(function, 1);
17879 } 19351 }
17880 19352
17881 19353
17882 void HasOwnPropertyIndexedPropertyGetter( 19354 void HasOwnPropertyIndexedPropertyGetter(
17883 uint32_t index, 19355 uint32_t index,
17884 const v8::PropertyCallbackInfo<v8::Value>& info) { 19356 const v8::PropertyCallbackInfo<v8::Value>& info) {
17885 if (index == 42) info.GetReturnValue().Set(v8_str("yes")); 19357 if (index == 42) info.GetReturnValue().Set(v8_str("yes"));
(...skipping 29 matching lines...) Expand all
17915 const v8::PropertyCallbackInfo<v8::Value>& info) { 19387 const v8::PropertyCallbackInfo<v8::Value>& info) {
17916 info.GetReturnValue().Set(v8_str("yes")); 19388 info.GetReturnValue().Set(v8_str("yes"));
17917 } 19389 }
17918 19390
17919 19391
17920 TEST(HasOwnProperty) { 19392 TEST(HasOwnProperty) {
17921 LocalContext env; 19393 LocalContext env;
17922 v8::Isolate* isolate = env->GetIsolate(); 19394 v8::Isolate* isolate = env->GetIsolate();
17923 v8::HandleScope scope(isolate); 19395 v8::HandleScope scope(isolate);
17924 { // Check normal properties and defined getters. 19396 { // Check normal properties and defined getters.
17925 Handle<Value> value = CompileRun( 19397 Local<Value> value = CompileRun(
17926 "function Foo() {" 19398 "function Foo() {"
17927 " this.foo = 11;" 19399 " this.foo = 11;"
17928 " this.__defineGetter__('baz', function() { return 1; });" 19400 " this.__defineGetter__('baz', function() { return 1; });"
17929 "};" 19401 "};"
17930 "function Bar() { " 19402 "function Bar() { "
17931 " this.bar = 13;" 19403 " this.bar = 13;"
17932 " this.__defineGetter__('bla', function() { return 2; });" 19404 " this.__defineGetter__('bla', function() { return 2; });"
17933 "};" 19405 "};"
17934 "Bar.prototype = new Foo();" 19406 "Bar.prototype = new Foo();"
17935 "new Bar();"); 19407 "new Bar();");
17936 CHECK(value->IsObject()); 19408 CHECK(value->IsObject());
17937 Handle<Object> object = value->ToObject(isolate); 19409 Local<Object> object = value->ToObject(isolate);
17938 CHECK(object->Has(v8_str("foo"))); 19410 CHECK(object->Has(v8_str("foo")));
17939 CHECK(!object->HasOwnProperty(v8_str("foo"))); 19411 CHECK(!object->HasOwnProperty(v8_str("foo")));
17940 CHECK(object->HasOwnProperty(v8_str("bar"))); 19412 CHECK(object->HasOwnProperty(v8_str("bar")));
17941 CHECK(object->Has(v8_str("baz"))); 19413 CHECK(object->Has(v8_str("baz")));
17942 CHECK(!object->HasOwnProperty(v8_str("baz"))); 19414 CHECK(!object->HasOwnProperty(v8_str("baz")));
17943 CHECK(object->HasOwnProperty(v8_str("bla"))); 19415 CHECK(object->HasOwnProperty(v8_str("bla")));
17944 } 19416 }
17945 { // Check named getter interceptors. 19417 { // Check named getter interceptors.
17946 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19418 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17947 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19419 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
17948 HasOwnPropertyNamedPropertyGetter)); 19420 HasOwnPropertyNamedPropertyGetter));
17949 Handle<Object> instance = templ->NewInstance(); 19421 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17950 CHECK(!instance->HasOwnProperty(v8_str("42"))); 19422 CHECK(!instance->HasOwnProperty(v8_str("42")));
17951 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19423 CHECK(instance->HasOwnProperty(v8_str("foo")));
17952 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19424 CHECK(!instance->HasOwnProperty(v8_str("bar")));
17953 } 19425 }
17954 { // Check indexed getter interceptors. 19426 { // Check indexed getter interceptors.
17955 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19427 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17956 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19428 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
17957 HasOwnPropertyIndexedPropertyGetter)); 19429 HasOwnPropertyIndexedPropertyGetter));
17958 Handle<Object> instance = templ->NewInstance(); 19430 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17959 CHECK(instance->HasOwnProperty(v8_str("42"))); 19431 CHECK(instance->HasOwnProperty(v8_str("42")));
17960 CHECK(!instance->HasOwnProperty(v8_str("43"))); 19432 CHECK(!instance->HasOwnProperty(v8_str("43")));
17961 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19433 CHECK(!instance->HasOwnProperty(v8_str("foo")));
17962 } 19434 }
17963 { // Check named query interceptors. 19435 { // Check named query interceptors.
17964 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19436 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17965 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19437 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
17966 0, 0, HasOwnPropertyNamedPropertyQuery)); 19438 0, 0, HasOwnPropertyNamedPropertyQuery));
17967 Handle<Object> instance = templ->NewInstance(); 19439 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17968 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19440 CHECK(instance->HasOwnProperty(v8_str("foo")));
17969 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19441 CHECK(!instance->HasOwnProperty(v8_str("bar")));
17970 } 19442 }
17971 { // Check indexed query interceptors. 19443 { // Check indexed query interceptors.
17972 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19444 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17973 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19445 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
17974 0, 0, HasOwnPropertyIndexedPropertyQuery)); 19446 0, 0, HasOwnPropertyIndexedPropertyQuery));
17975 Handle<Object> instance = templ->NewInstance(); 19447 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17976 CHECK(instance->HasOwnProperty(v8_str("42"))); 19448 CHECK(instance->HasOwnProperty(v8_str("42")));
17977 CHECK(!instance->HasOwnProperty(v8_str("41"))); 19449 CHECK(!instance->HasOwnProperty(v8_str("41")));
17978 } 19450 }
17979 { // Check callbacks. 19451 { // Check callbacks.
17980 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19452 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17981 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter); 19453 templ->SetAccessor(v8_str("foo"), HasOwnPropertyAccessorGetter);
17982 Handle<Object> instance = templ->NewInstance(); 19454 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17983 CHECK(instance->HasOwnProperty(v8_str("foo"))); 19455 CHECK(instance->HasOwnProperty(v8_str("foo")));
17984 CHECK(!instance->HasOwnProperty(v8_str("bar"))); 19456 CHECK(!instance->HasOwnProperty(v8_str("bar")));
17985 } 19457 }
17986 { // Check that query wins on disagreement. 19458 { // Check that query wins on disagreement.
17987 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19459 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
17988 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( 19460 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(
17989 HasOwnPropertyNamedPropertyGetter, 0, 19461 HasOwnPropertyNamedPropertyGetter, 0,
17990 HasOwnPropertyNamedPropertyQuery2)); 19462 HasOwnPropertyNamedPropertyQuery2));
17991 Handle<Object> instance = templ->NewInstance(); 19463 Local<Object> instance = templ->NewInstance(env.local()).ToLocalChecked();
17992 CHECK(!instance->HasOwnProperty(v8_str("foo"))); 19464 CHECK(!instance->HasOwnProperty(v8_str("foo")));
17993 CHECK(instance->HasOwnProperty(v8_str("bar"))); 19465 CHECK(instance->HasOwnProperty(v8_str("bar")));
17994 } 19466 }
17995 } 19467 }
17996 19468
17997 19469
17998 TEST(IndexedInterceptorWithStringProto) { 19470 TEST(IndexedInterceptorWithStringProto) {
17999 v8::Isolate* isolate = CcTest::isolate(); 19471 v8::Isolate* isolate = CcTest::isolate();
18000 v8::HandleScope scope(isolate); 19472 v8::HandleScope scope(isolate);
18001 Handle<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19473 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18002 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration( 19474 templ->SetHandler(v8::IndexedPropertyHandlerConfiguration(
18003 NULL, NULL, HasOwnPropertyIndexedPropertyQuery)); 19475 NULL, NULL, HasOwnPropertyIndexedPropertyQuery));
18004 LocalContext context; 19476 LocalContext context;
18005 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 19477 CHECK(context->Global()
19478 ->Set(context.local(), v8_str("obj"),
19479 templ->NewInstance(context.local()).ToLocalChecked())
19480 .FromJust());
18006 CompileRun("var s = new String('foobar'); obj.__proto__ = s;"); 19481 CompileRun("var s = new String('foobar'); obj.__proto__ = s;");
18007 // These should be intercepted. 19482 // These should be intercepted.
18008 CHECK(CompileRun("42 in obj")->BooleanValue()); 19483 CHECK(CompileRun("42 in obj")->BooleanValue());
18009 CHECK(CompileRun("'42' in obj")->BooleanValue()); 19484 CHECK(CompileRun("'42' in obj")->BooleanValue());
18010 // These should fall through to the String prototype. 19485 // These should fall through to the String prototype.
18011 CHECK(CompileRun("0 in obj")->BooleanValue()); 19486 CHECK(CompileRun("0 in obj")->BooleanValue());
18012 CHECK(CompileRun("'0' in obj")->BooleanValue()); 19487 CHECK(CompileRun("'0' in obj")->BooleanValue());
18013 // And these should both fail. 19488 // And these should both fail.
18014 CHECK(!CompileRun("32 in obj")->BooleanValue()); 19489 CHECK(!CompileRun("32 in obj")->BooleanValue());
18015 CHECK(!CompileRun("'32' in obj")->BooleanValue()); 19490 CHECK(!CompileRun("'32' in obj")->BooleanValue());
18016 } 19491 }
18017 19492
18018 19493
18019 void CheckCodeGenerationAllowed() { 19494 void CheckCodeGenerationAllowed() {
18020 Handle<Value> result = CompileRun("eval('42')"); 19495 Local<v8::Context> context = CcTest::isolate()->GetCurrentContext();
18021 CHECK_EQ(42, result->Int32Value()); 19496 Local<Value> result = CompileRun("eval('42')");
19497 CHECK_EQ(42, result->Int32Value(context).FromJust());
18022 result = CompileRun("(function(e) { return e('42'); })(eval)"); 19498 result = CompileRun("(function(e) { return e('42'); })(eval)");
18023 CHECK_EQ(42, result->Int32Value()); 19499 CHECK_EQ(42, result->Int32Value(context).FromJust());
18024 result = CompileRun("var f = new Function('return 42'); f()"); 19500 result = CompileRun("var f = new Function('return 42'); f()");
18025 CHECK_EQ(42, result->Int32Value()); 19501 CHECK_EQ(42, result->Int32Value(context).FromJust());
18026 } 19502 }
18027 19503
18028 19504
18029 void CheckCodeGenerationDisallowed() { 19505 void CheckCodeGenerationDisallowed() {
18030 TryCatch try_catch(CcTest::isolate()); 19506 TryCatch try_catch(CcTest::isolate());
18031 19507
18032 Handle<Value> result = CompileRun("eval('42')"); 19508 Local<Value> result = CompileRun("eval('42')");
18033 CHECK(result.IsEmpty()); 19509 CHECK(result.IsEmpty());
18034 CHECK(try_catch.HasCaught()); 19510 CHECK(try_catch.HasCaught());
18035 try_catch.Reset(); 19511 try_catch.Reset();
18036 19512
18037 result = CompileRun("(function(e) { return e('42'); })(eval)"); 19513 result = CompileRun("(function(e) { return e('42'); })(eval)");
18038 CHECK(result.IsEmpty()); 19514 CHECK(result.IsEmpty());
18039 CHECK(try_catch.HasCaught()); 19515 CHECK(try_catch.HasCaught());
18040 try_catch.Reset(); 19516 try_catch.Reset();
18041 19517
18042 result = CompileRun("var f = new Function('return 42'); f()"); 19518 result = CompileRun("var f = new Function('return 42'); f()");
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
18085 CHECK(!context->IsCodeGenerationFromStringsAllowed()); 19561 CHECK(!context->IsCodeGenerationFromStringsAllowed());
18086 CheckCodeGenerationDisallowed(); 19562 CheckCodeGenerationDisallowed();
18087 } 19563 }
18088 19564
18089 19565
18090 TEST(SetErrorMessageForCodeGenFromStrings) { 19566 TEST(SetErrorMessageForCodeGenFromStrings) {
18091 LocalContext context; 19567 LocalContext context;
18092 v8::HandleScope scope(context->GetIsolate()); 19568 v8::HandleScope scope(context->GetIsolate());
18093 TryCatch try_catch(context->GetIsolate()); 19569 TryCatch try_catch(context->GetIsolate());
18094 19570
18095 Handle<String> message = v8_str("Message"); 19571 Local<String> message = v8_str("Message");
18096 Handle<String> expected_message = v8_str("Uncaught EvalError: Message"); 19572 Local<String> expected_message = v8_str("Uncaught EvalError: Message");
18097 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed); 19573 V8::SetAllowCodeGenerationFromStringsCallback(&CodeGenerationDisallowed);
18098 context->AllowCodeGenerationFromStrings(false); 19574 context->AllowCodeGenerationFromStrings(false);
18099 context->SetErrorMessageForCodeGenerationFromStrings(message); 19575 context->SetErrorMessageForCodeGenerationFromStrings(message);
18100 Handle<Value> result = CompileRun("eval('42')"); 19576 Local<Value> result = CompileRun("eval('42')");
18101 CHECK(result.IsEmpty()); 19577 CHECK(result.IsEmpty());
18102 CHECK(try_catch.HasCaught()); 19578 CHECK(try_catch.HasCaught());
18103 Handle<String> actual_message = try_catch.Message()->Get(); 19579 Local<String> actual_message = try_catch.Message()->Get();
18104 CHECK(expected_message->Equals(actual_message)); 19580 CHECK(expected_message->Equals(actual_message));
18105 } 19581 }
18106 19582
18107 19583
18108 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { 19584 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) {
18109 } 19585 }
18110 19586
18111 19587
18112 THREADED_TEST(CallAPIFunctionOnNonObject) { 19588 THREADED_TEST(CallAPIFunctionOnNonObject) {
18113 LocalContext context; 19589 LocalContext context;
18114 v8::Isolate* isolate = context->GetIsolate(); 19590 v8::Isolate* isolate = context->GetIsolate();
18115 v8::HandleScope scope(isolate); 19591 v8::HandleScope scope(isolate);
18116 Handle<FunctionTemplate> templ = 19592 Local<FunctionTemplate> templ =
18117 v8::FunctionTemplate::New(isolate, NonObjectThis); 19593 v8::FunctionTemplate::New(isolate, NonObjectThis);
18118 Handle<Function> function = templ->GetFunction(); 19594 Local<Function> function =
18119 context->Global()->Set(v8_str("f"), function); 19595 templ->GetFunction(context.local()).ToLocalChecked();
19596 CHECK(context->Global()
19597 ->Set(context.local(), v8_str("f"), function)
19598 .FromJust());
18120 TryCatch try_catch(isolate); 19599 TryCatch try_catch(isolate);
18121 CompileRun("f.call(2)"); 19600 CompileRun("f.call(2)");
18122 } 19601 }
18123 19602
18124 19603
18125 // Regression test for issue 1470. 19604 // Regression test for issue 1470.
18126 THREADED_TEST(ReadOnlyIndexedProperties) { 19605 THREADED_TEST(ReadOnlyIndexedProperties) {
18127 v8::Isolate* isolate = CcTest::isolate(); 19606 v8::Isolate* isolate = CcTest::isolate();
18128 v8::HandleScope scope(isolate); 19607 v8::HandleScope scope(isolate);
18129 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 19608 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
18130 19609
18131 LocalContext context; 19610 LocalContext context;
18132 Local<v8::Object> obj = templ->NewInstance(); 19611 Local<v8::Object> obj = templ->NewInstance(context.local()).ToLocalChecked();
18133 context->Global()->Set(v8_str("obj"), obj); 19612 CHECK(context->Global()->Set(context.local(), v8_str("obj"), obj).FromJust());
18134 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly); 19613 obj->ForceSet(v8_str("1"), v8_str("DONT_CHANGE"), v8::ReadOnly);
18135 obj->Set(v8_str("1"), v8_str("foobar")); 19614 obj->Set(v8_str("1"), v8_str("foobar"));
18136 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("1")))); 19615 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_str("1"))));
18137 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly); 19616 obj->ForceSet(v8_num(2), v8_str("DONT_CHANGE"), v8::ReadOnly);
18138 obj->Set(v8_num(2), v8_str("foobar")); 19617 obj->Set(v8_num(2), v8_str("foobar"));
18139 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_num(2)))); 19618 CHECK(v8_str("DONT_CHANGE")->Equals(obj->Get(v8_num(2))));
18140 19619
18141 // Test non-smi case. 19620 // Test non-smi case.
18142 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly); 19621 obj->ForceSet(v8_str("2000000000"), v8_str("DONT_CHANGE"), v8::ReadOnly);
18143 obj->Set(v8_str("2000000000"), v8_str("foobar")); 19622 obj->Set(v8_str("2000000000"), v8_str("foobar"));
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
18202 protected_hidden_proto_template->SetHiddenPrototype(true); 19681 protected_hidden_proto_template->SetHiddenPrototype(true);
18203 19682
18204 // Context for "foreign" objects used in test. 19683 // Context for "foreign" objects used in test.
18205 Local<Context> context = v8::Context::New(isolate); 19684 Local<Context> context = v8::Context::New(isolate);
18206 context->Enter(); 19685 context->Enter();
18207 19686
18208 // Plain object, no security check. 19687 // Plain object, no security check.
18209 Local<Object> simple_object = Object::New(isolate); 19688 Local<Object> simple_object = Object::New(isolate);
18210 19689
18211 // Object with explicit security check. 19690 // Object with explicit security check.
18212 Local<Object> protected_object = no_proto_template->NewInstance(); 19691 Local<Object> protected_object =
19692 no_proto_template->NewInstance(context).ToLocalChecked();
18213 19693
18214 // JSGlobalProxy object, always have security check. 19694 // JSGlobalProxy object, always have security check.
18215 Local<Object> proxy_object = context->Global(); 19695 Local<Object> proxy_object = context->Global();
18216 19696
18217 // Global object, the prototype of proxy_object. No security checks. 19697 // Global object, the prototype of proxy_object. No security checks.
18218 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate); 19698 Local<Object> global_object = proxy_object->GetPrototype()->ToObject(isolate);
18219 19699
18220 // Hidden prototype without security check. 19700 // Hidden prototype without security check.
18221 Local<Object> hidden_prototype = 19701 Local<Object> hidden_prototype = hidden_proto_template->GetFunction(context)
18222 hidden_proto_template->GetFunction()->NewInstance(); 19702 .ToLocalChecked()
19703 ->NewInstance(context)
19704 .ToLocalChecked();
18223 Local<Object> object_with_hidden = 19705 Local<Object> object_with_hidden =
18224 Object::New(isolate); 19706 Object::New(isolate);
18225 object_with_hidden->SetPrototype(hidden_prototype); 19707 object_with_hidden->SetPrototype(hidden_prototype);
18226 19708
18227 context->Exit(); 19709 context->Exit();
18228 19710
18229 // Template for object for second context. Values to test are put on it as 19711 // Template for object for second context. Values to test are put on it as
18230 // properties. 19712 // properties.
18231 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate); 19713 Local<ObjectTemplate> global_template = ObjectTemplate::New(isolate);
18232 global_template->Set(v8_str("simple"), simple_object); 19714 global_template->Set(v8_str("simple"), simple_object);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
18303 19785
18304 CompileRun("function ownfunc() { return { 0: this.id, " 19786 CompileRun("function ownfunc() { return { 0: this.id, "
18305 " 1: this, " 19787 " 1: this, "
18306 " toString: function() { " 19788 " toString: function() { "
18307 " return this[0];" 19789 " return this[0];"
18308 " }" 19790 " }"
18309 " };" 19791 " };"
18310 "}" 19792 "}"
18311 "var id = 'o';" 19793 "var id = 'o';"
18312 "ownfunc"); 19794 "ownfunc");
18313 context->Global()->Set(v8_str("func"), foreign_function); 19795 CHECK(context->Global()
19796 ->Set(context.local(), v8_str("func"), foreign_function)
19797 .FromJust());
18314 19798
18315 // Sanity check the contexts. 19799 // Sanity check the contexts.
18316 CHECK(i->Equals(foreign_context->Global()->Get(id))); 19800 CHECK(i->Equals(foreign_context->Global()->Get(id)));
18317 CHECK(o->Equals(context->Global()->Get(id))); 19801 CHECK(o->Equals(context->Global()->Get(id)));
18318 19802
18319 // Checking local function's receiver. 19803 // Checking local function's receiver.
18320 // Calling function using its call/apply methods. 19804 // Calling function using its call/apply methods.
18321 TestReceiver(o, context->Global(), "ownfunc.call()"); 19805 TestReceiver(o, context->Global(), "ownfunc.call()");
18322 TestReceiver(o, context->Global(), "ownfunc.apply()"); 19806 TestReceiver(o, context->Global(), "ownfunc.apply()");
18323 // Making calls through built-in functions. 19807 // Making calls through built-in functions.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
18366 } 19850 }
18367 19851
18368 19852
18369 void CallCompletedCallback2() { 19853 void CallCompletedCallback2() {
18370 v8::base::OS::Print("Firing callback 2.\n"); 19854 v8::base::OS::Print("Firing callback 2.\n");
18371 callback_fired ^= 2; // Toggle second bit. 19855 callback_fired ^= 2; // Toggle second bit.
18372 } 19856 }
18373 19857
18374 19858
18375 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) { 19859 void RecursiveCall(const v8::FunctionCallbackInfo<v8::Value>& args) {
18376 int32_t level = args[0]->Int32Value(); 19860 int32_t level =
19861 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust();
18377 if (level < 3) { 19862 if (level < 3) {
18378 level++; 19863 level++;
18379 v8::base::OS::Print("Entering recursion level %d.\n", level); 19864 v8::base::OS::Print("Entering recursion level %d.\n", level);
18380 char script[64]; 19865 char script[64];
18381 i::Vector<char> script_vector(script, sizeof(script)); 19866 i::Vector<char> script_vector(script, sizeof(script));
18382 i::SNPrintF(script_vector, "recursion(%d)", level); 19867 i::SNPrintF(script_vector, "recursion(%d)", level);
18383 CompileRun(script_vector.start()); 19868 CompileRun(script_vector.start());
18384 v8::base::OS::Print("Leaving recursion level %d.\n", level); 19869 v8::base::OS::Print("Leaving recursion level %d.\n", level);
18385 CHECK_EQ(0, callback_fired); 19870 CHECK_EQ(0, callback_fired);
18386 } else { 19871 } else {
18387 v8::base::OS::Print("Recursion ends.\n"); 19872 v8::base::OS::Print("Recursion ends.\n");
18388 CHECK_EQ(0, callback_fired); 19873 CHECK_EQ(0, callback_fired);
18389 } 19874 }
18390 } 19875 }
18391 19876
18392 19877
18393 TEST(CallCompletedCallback) { 19878 TEST(CallCompletedCallback) {
18394 LocalContext env; 19879 LocalContext env;
18395 v8::HandleScope scope(env->GetIsolate()); 19880 v8::HandleScope scope(env->GetIsolate());
18396 v8::Handle<v8::FunctionTemplate> recursive_runtime = 19881 v8::Local<v8::FunctionTemplate> recursive_runtime =
18397 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); 19882 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall);
18398 env->Global()->Set(v8_str("recursion"), 19883 env->Global()->Set(
18399 recursive_runtime->GetFunction()); 19884 v8_str("recursion"),
19885 recursive_runtime->GetFunction(env.local()).ToLocalChecked());
18400 // Adding the same callback a second time has no effect. 19886 // Adding the same callback a second time has no effect.
18401 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); 19887 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
18402 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1); 19888 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback1);
18403 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2); 19889 env->GetIsolate()->AddCallCompletedCallback(CallCompletedCallback2);
18404 v8::base::OS::Print("--- Script (1) ---\n"); 19890 v8::base::OS::Print("--- Script (1) ---\n");
18405 Local<Script> script = v8::Script::Compile( 19891 Local<Script> script = v8::Script::Compile(v8_str("recursion(0)"));
18406 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)"));
18407 script->Run(); 19892 script->Run();
18408 CHECK_EQ(3, callback_fired); 19893 CHECK_EQ(3, callback_fired);
18409 19894
18410 v8::base::OS::Print("\n--- Script (2) ---\n"); 19895 v8::base::OS::Print("\n--- Script (2) ---\n");
18411 callback_fired = 0; 19896 callback_fired = 0;
18412 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1); 19897 env->GetIsolate()->RemoveCallCompletedCallback(CallCompletedCallback1);
18413 script->Run(); 19898 script->Run();
18414 CHECK_EQ(2, callback_fired); 19899 CHECK_EQ(2, callback_fired);
18415 19900
18416 v8::base::OS::Print("\n--- Function ---\n"); 19901 v8::base::OS::Print("\n--- Function ---\n");
18417 callback_fired = 0; 19902 callback_fired = 0;
18418 Local<Function> recursive_function = 19903 Local<Function> recursive_function =
18419 Local<Function>::Cast(env->Global()->Get(v8_str("recursion"))); 19904 Local<Function>::Cast(env->Global()->Get(v8_str("recursion")));
18420 v8::Handle<Value> args[] = { v8_num(0) }; 19905 v8::Local<Value> args[] = {v8_num(0)};
18421 recursive_function->Call(env->Global(), 1, args); 19906 recursive_function->Call(env->Global(), 1, args);
18422 CHECK_EQ(2, callback_fired); 19907 CHECK_EQ(2, callback_fired);
18423 } 19908 }
18424 19909
18425 19910
18426 void CallCompletedCallbackNoException() { 19911 void CallCompletedCallbackNoException() {
18427 v8::HandleScope scope(CcTest::isolate()); 19912 v8::HandleScope scope(CcTest::isolate());
18428 CompileRun("1+1;"); 19913 CompileRun("1+1;");
18429 } 19914 }
18430 19915
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
18471 } 19956 }
18472 19957
18473 19958
18474 TEST(EnqueueMicrotask) { 19959 TEST(EnqueueMicrotask) {
18475 LocalContext env; 19960 LocalContext env;
18476 v8::HandleScope scope(env->GetIsolate()); 19961 v8::HandleScope scope(env->GetIsolate());
18477 CompileRun( 19962 CompileRun(
18478 "var ext1Calls = 0;" 19963 "var ext1Calls = 0;"
18479 "var ext2Calls = 0;"); 19964 "var ext2Calls = 0;");
18480 CompileRun("1+1;"); 19965 CompileRun("1+1;");
18481 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value()); 19966 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18482 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); 19967 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18483 19968
18484 env->GetIsolate()->EnqueueMicrotask( 19969 env->GetIsolate()->EnqueueMicrotask(
18485 Function::New(env->GetIsolate(), MicrotaskOne)); 19970 Function::New(env->GetIsolate(), MicrotaskOne));
18486 CompileRun("1+1;"); 19971 CompileRun("1+1;");
18487 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); 19972 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18488 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); 19973 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18489 19974
18490 env->GetIsolate()->EnqueueMicrotask( 19975 env->GetIsolate()->EnqueueMicrotask(
18491 Function::New(env->GetIsolate(), MicrotaskOne)); 19976 Function::New(env->GetIsolate(), MicrotaskOne));
18492 env->GetIsolate()->EnqueueMicrotask( 19977 env->GetIsolate()->EnqueueMicrotask(
18493 Function::New(env->GetIsolate(), MicrotaskTwo)); 19978 Function::New(env->GetIsolate(), MicrotaskTwo));
18494 CompileRun("1+1;"); 19979 CompileRun("1+1;");
18495 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 19980 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18496 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); 19981 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18497 19982
18498 env->GetIsolate()->EnqueueMicrotask( 19983 env->GetIsolate()->EnqueueMicrotask(
18499 Function::New(env->GetIsolate(), MicrotaskTwo)); 19984 Function::New(env->GetIsolate(), MicrotaskTwo));
18500 CompileRun("1+1;"); 19985 CompileRun("1+1;");
18501 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 19986 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18502 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); 19987 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18503 19988
18504 CompileRun("1+1;"); 19989 CompileRun("1+1;");
18505 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 19990 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18506 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); 19991 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18507 19992
18508 g_passed_to_three = NULL; 19993 g_passed_to_three = NULL;
18509 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree); 19994 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree);
18510 CompileRun("1+1;"); 19995 CompileRun("1+1;");
18511 CHECK(!g_passed_to_three); 19996 CHECK(!g_passed_to_three);
18512 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 19997 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18513 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); 19998 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18514 19999
18515 int dummy; 20000 int dummy;
18516 env->GetIsolate()->EnqueueMicrotask( 20001 env->GetIsolate()->EnqueueMicrotask(
18517 Function::New(env->GetIsolate(), MicrotaskOne)); 20002 Function::New(env->GetIsolate(), MicrotaskOne));
18518 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy); 20003 env->GetIsolate()->EnqueueMicrotask(MicrotaskThree, &dummy);
18519 env->GetIsolate()->EnqueueMicrotask( 20004 env->GetIsolate()->EnqueueMicrotask(
18520 Function::New(env->GetIsolate(), MicrotaskTwo)); 20005 Function::New(env->GetIsolate(), MicrotaskTwo));
18521 CompileRun("1+1;"); 20006 CompileRun("1+1;");
18522 CHECK_EQ(&dummy, g_passed_to_three); 20007 CHECK_EQ(&dummy, g_passed_to_three);
18523 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value()); 20008 CHECK_EQ(3, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18524 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); 20009 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18525 g_passed_to_three = NULL; 20010 g_passed_to_three = NULL;
18526 } 20011 }
18527 20012
18528 20013
18529 static void MicrotaskExceptionOne( 20014 static void MicrotaskExceptionOne(
18530 const v8::FunctionCallbackInfo<Value>& info) { 20015 const v8::FunctionCallbackInfo<Value>& info) {
18531 v8::HandleScope scope(info.GetIsolate()); 20016 v8::HandleScope scope(info.GetIsolate());
18532 CompileRun("exception1Calls++;"); 20017 CompileRun("exception1Calls++;");
18533 info.GetIsolate()->ThrowException( 20018 info.GetIsolate()->ThrowException(
18534 v8::Exception::Error(v8_str("first"))); 20019 v8::Exception::Error(v8_str("first")));
(...skipping 16 matching lines...) Expand all
18551 CompileRun( 20036 CompileRun(
18552 "var exception1Calls = 0;" 20037 "var exception1Calls = 0;"
18553 "var exception2Calls = 0;"); 20038 "var exception2Calls = 0;");
18554 isolate->EnqueueMicrotask( 20039 isolate->EnqueueMicrotask(
18555 Function::New(isolate, MicrotaskExceptionOne)); 20040 Function::New(isolate, MicrotaskExceptionOne));
18556 isolate->EnqueueMicrotask( 20041 isolate->EnqueueMicrotask(
18557 Function::New(isolate, MicrotaskExceptionTwo)); 20042 Function::New(isolate, MicrotaskExceptionTwo));
18558 TryCatch try_catch(isolate); 20043 TryCatch try_catch(isolate);
18559 CompileRun("1+1;"); 20044 CompileRun("1+1;");
18560 CHECK(!try_catch.HasCaught()); 20045 CHECK(!try_catch.HasCaught());
18561 CHECK_EQ(1, CompileRun("exception1Calls")->Int32Value()); 20046 CHECK_EQ(1,
18562 CHECK_EQ(1, CompileRun("exception2Calls")->Int32Value()); 20047 CompileRun("exception1Calls")->Int32Value(env.local()).FromJust());
20048 CHECK_EQ(1,
20049 CompileRun("exception2Calls")->Int32Value(env.local()).FromJust());
18563 } 20050 }
18564 20051
18565 20052
18566 TEST(SetAutorunMicrotasks) { 20053 TEST(SetAutorunMicrotasks) {
18567 LocalContext env; 20054 LocalContext env;
18568 v8::HandleScope scope(env->GetIsolate()); 20055 v8::HandleScope scope(env->GetIsolate());
18569 CompileRun( 20056 CompileRun(
18570 "var ext1Calls = 0;" 20057 "var ext1Calls = 0;"
18571 "var ext2Calls = 0;"); 20058 "var ext2Calls = 0;");
18572 CompileRun("1+1;"); 20059 CompileRun("1+1;");
18573 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value()); 20060 CHECK_EQ(0, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18574 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); 20061 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18575 20062
18576 env->GetIsolate()->EnqueueMicrotask( 20063 env->GetIsolate()->EnqueueMicrotask(
18577 Function::New(env->GetIsolate(), MicrotaskOne)); 20064 Function::New(env->GetIsolate(), MicrotaskOne));
18578 CompileRun("1+1;"); 20065 CompileRun("1+1;");
18579 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); 20066 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18580 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); 20067 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18581 20068
18582 env->GetIsolate()->SetAutorunMicrotasks(false); 20069 env->GetIsolate()->SetAutorunMicrotasks(false);
18583 env->GetIsolate()->EnqueueMicrotask( 20070 env->GetIsolate()->EnqueueMicrotask(
18584 Function::New(env->GetIsolate(), MicrotaskOne)); 20071 Function::New(env->GetIsolate(), MicrotaskOne));
18585 env->GetIsolate()->EnqueueMicrotask( 20072 env->GetIsolate()->EnqueueMicrotask(
18586 Function::New(env->GetIsolate(), MicrotaskTwo)); 20073 Function::New(env->GetIsolate(), MicrotaskTwo));
18587 CompileRun("1+1;"); 20074 CompileRun("1+1;");
18588 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); 20075 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18589 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value()); 20076 CHECK_EQ(0, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18590 20077
18591 env->GetIsolate()->RunMicrotasks(); 20078 env->GetIsolate()->RunMicrotasks();
18592 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20079 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18593 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); 20080 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18594 20081
18595 env->GetIsolate()->EnqueueMicrotask( 20082 env->GetIsolate()->EnqueueMicrotask(
18596 Function::New(env->GetIsolate(), MicrotaskTwo)); 20083 Function::New(env->GetIsolate(), MicrotaskTwo));
18597 CompileRun("1+1;"); 20084 CompileRun("1+1;");
18598 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20085 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18599 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value()); 20086 CHECK_EQ(1, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18600 20087
18601 env->GetIsolate()->RunMicrotasks(); 20088 env->GetIsolate()->RunMicrotasks();
18602 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20089 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18603 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value()); 20090 CHECK_EQ(2, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18604 20091
18605 env->GetIsolate()->SetAutorunMicrotasks(true); 20092 env->GetIsolate()->SetAutorunMicrotasks(true);
18606 env->GetIsolate()->EnqueueMicrotask( 20093 env->GetIsolate()->EnqueueMicrotask(
18607 Function::New(env->GetIsolate(), MicrotaskTwo)); 20094 Function::New(env->GetIsolate(), MicrotaskTwo));
18608 CompileRun("1+1;"); 20095 CompileRun("1+1;");
18609 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20096 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18610 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); 20097 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18611 20098
18612 env->GetIsolate()->EnqueueMicrotask( 20099 env->GetIsolate()->EnqueueMicrotask(
18613 Function::New(env->GetIsolate(), MicrotaskTwo)); 20100 Function::New(env->GetIsolate(), MicrotaskTwo));
18614 { 20101 {
18615 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate()); 20102 v8::Isolate::SuppressMicrotaskExecutionScope scope(env->GetIsolate());
18616 CompileRun("1+1;"); 20103 CompileRun("1+1;");
18617 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20104 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18618 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value()); 20105 CHECK_EQ(3, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18619 } 20106 }
18620 20107
18621 CompileRun("1+1;"); 20108 CompileRun("1+1;");
18622 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value()); 20109 CHECK_EQ(2, CompileRun("ext1Calls")->Int32Value(env.local()).FromJust());
18623 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value()); 20110 CHECK_EQ(4, CompileRun("ext2Calls")->Int32Value(env.local()).FromJust());
18624 } 20111 }
18625 20112
18626 20113
18627 TEST(RunMicrotasksWithoutEnteringContext) { 20114 TEST(RunMicrotasksWithoutEnteringContext) {
18628 v8::Isolate* isolate = CcTest::isolate(); 20115 v8::Isolate* isolate = CcTest::isolate();
18629 HandleScope handle_scope(isolate); 20116 HandleScope handle_scope(isolate);
18630 isolate->SetAutorunMicrotasks(false); 20117 isolate->SetAutorunMicrotasks(false);
18631 Handle<Context> context = Context::New(isolate); 20118 Local<Context> context = Context::New(isolate);
18632 { 20119 {
18633 Context::Scope context_scope(context); 20120 Context::Scope context_scope(context);
18634 CompileRun("var ext1Calls = 0;"); 20121 CompileRun("var ext1Calls = 0;");
18635 isolate->EnqueueMicrotask(Function::New(isolate, MicrotaskOne)); 20122 isolate->EnqueueMicrotask(Function::New(isolate, MicrotaskOne));
18636 } 20123 }
18637 isolate->RunMicrotasks(); 20124 isolate->RunMicrotasks();
18638 { 20125 {
18639 Context::Scope context_scope(context); 20126 Context::Scope context_scope(context);
18640 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value()); 20127 CHECK_EQ(1, CompileRun("ext1Calls")->Int32Value(context).FromJust());
18641 } 20128 }
18642 isolate->SetAutorunMicrotasks(true); 20129 isolate->SetAutorunMicrotasks(true);
18643 } 20130 }
18644 20131
18645 20132
18646 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) { 20133 static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) {
18647 v8::DebugEvent event = event_details.GetEvent(); 20134 v8::DebugEvent event = event_details.GetEvent();
18648 if (event != v8::Break) return; 20135 if (event != v8::Break) return;
18649 Handle<Object> exec_state = event_details.GetExecutionState(); 20136 Local<Object> exec_state = event_details.GetExecutionState();
18650 Handle<Value> break_id = exec_state->Get(v8_str("break_id")); 20137 Local<Value> break_id = exec_state->Get(v8_str("break_id"));
18651 CompileRun("function f(id) { new FrameDetails(id, 0); }"); 20138 CompileRun("function f(id) { new FrameDetails(id, 0); }");
18652 Handle<Function> fun = 20139 Local<Function> fun =
18653 Handle<Function>::Cast(CcTest::global()->Get(v8_str("f"))); 20140 Local<Function>::Cast(CcTest::global()->Get(v8_str("f")));
18654 fun->Call(CcTest::global(), 1, &break_id); 20141 fun->Call(CcTest::global(), 1, &break_id);
18655 } 20142 }
18656 20143
18657 20144
18658 TEST(Regress385349) { 20145 TEST(Regress385349) {
18659 i::FLAG_allow_natives_syntax = true; 20146 i::FLAG_allow_natives_syntax = true;
18660 v8::Isolate* isolate = CcTest::isolate(); 20147 v8::Isolate* isolate = CcTest::isolate();
18661 HandleScope handle_scope(isolate); 20148 HandleScope handle_scope(isolate);
18662 isolate->SetAutorunMicrotasks(false); 20149 isolate->SetAutorunMicrotasks(false);
18663 Handle<Context> context = Context::New(isolate); 20150 Local<Context> context = Context::New(isolate);
18664 v8::Debug::SetDebugEventListener(DebugEventInObserver); 20151 v8::Debug::SetDebugEventListener(DebugEventInObserver);
18665 { 20152 {
18666 Context::Scope context_scope(context); 20153 Context::Scope context_scope(context);
18667 CompileRun("var obj = {};" 20154 CompileRun("var obj = {};"
18668 "Object.observe(obj, function(changes) { debugger; });" 20155 "Object.observe(obj, function(changes) { debugger; });"
18669 "obj.a = 0;"); 20156 "obj.a = 0;");
18670 } 20157 }
18671 isolate->RunMicrotasks(); 20158 isolate->RunMicrotasks();
18672 isolate->SetAutorunMicrotasks(true); 20159 isolate->SetAutorunMicrotasks(true);
18673 v8::Debug::SetDebugEventListener(NULL); 20160 v8::Debug::SetDebugEventListener(NULL);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
18916 } 20403 }
18917 20404
18918 20405
18919 THREADED_TEST(InstanceCheckOnInstanceAccessor) { 20406 THREADED_TEST(InstanceCheckOnInstanceAccessor) {
18920 v8::internal::FLAG_allow_natives_syntax = true; 20407 v8::internal::FLAG_allow_natives_syntax = true;
18921 LocalContext context; 20408 LocalContext context;
18922 v8::HandleScope scope(context->GetIsolate()); 20409 v8::HandleScope scope(context->GetIsolate());
18923 20410
18924 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 20411 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
18925 Local<ObjectTemplate> inst = templ->InstanceTemplate(); 20412 Local<ObjectTemplate> inst = templ->InstanceTemplate();
18926 inst->SetAccessor(v8_str("foo"), 20413 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter,
18927 InstanceCheckedGetter, InstanceCheckedSetter, 20414 Local<Value>(), v8::DEFAULT, v8::None,
18928 Handle<Value>(),
18929 v8::DEFAULT,
18930 v8::None,
18931 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20415 v8::AccessorSignature::New(context->GetIsolate(), templ));
18932 context->Global()->Set(v8_str("f"), templ->GetFunction()); 20416 CHECK(context->Global()
20417 ->Set(context.local(), v8_str("f"),
20418 templ->GetFunction(context.local()).ToLocalChecked())
20419 .FromJust());
18933 20420
18934 printf("Testing positive ...\n"); 20421 printf("Testing positive ...\n");
18935 CompileRun("var obj = new f();"); 20422 CompileRun("var obj = new f();");
18936 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20423 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj"))));
18937 CheckInstanceCheckedAccessors(true); 20424 CheckInstanceCheckedAccessors(true);
18938 20425
18939 printf("Testing negative ...\n"); 20426 printf("Testing negative ...\n");
18940 CompileRun("var obj = {};" 20427 CompileRun("var obj = {};"
18941 "obj.__proto__ = new f();"); 20428 "obj.__proto__ = new f();");
18942 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20429 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj"))));
(...skipping 12 matching lines...) Expand all
18955 20442
18956 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) { 20443 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) {
18957 v8::internal::FLAG_allow_natives_syntax = true; 20444 v8::internal::FLAG_allow_natives_syntax = true;
18958 LocalContext context; 20445 LocalContext context;
18959 v8::HandleScope scope(context->GetIsolate()); 20446 v8::HandleScope scope(context->GetIsolate());
18960 20447
18961 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 20448 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
18962 Local<ObjectTemplate> inst = templ->InstanceTemplate(); 20449 Local<ObjectTemplate> inst = templ->InstanceTemplate();
18963 templ->InstanceTemplate()->SetNamedPropertyHandler(EmptyInterceptorGetter, 20450 templ->InstanceTemplate()->SetNamedPropertyHandler(EmptyInterceptorGetter,
18964 EmptyInterceptorSetter); 20451 EmptyInterceptorSetter);
18965 inst->SetAccessor(v8_str("foo"), 20452 inst->SetAccessor(v8_str("foo"), InstanceCheckedGetter, InstanceCheckedSetter,
18966 InstanceCheckedGetter, InstanceCheckedSetter, 20453 Local<Value>(), v8::DEFAULT, v8::None,
18967 Handle<Value>(),
18968 v8::DEFAULT,
18969 v8::None,
18970 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20454 v8::AccessorSignature::New(context->GetIsolate(), templ));
18971 context->Global()->Set(v8_str("f"), templ->GetFunction()); 20455 CHECK(context->Global()
20456 ->Set(context.local(), v8_str("f"),
20457 templ->GetFunction(context.local()).ToLocalChecked())
20458 .FromJust());
18972 20459
18973 printf("Testing positive ...\n"); 20460 printf("Testing positive ...\n");
18974 CompileRun("var obj = new f();"); 20461 CompileRun("var obj = new f();");
18975 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20462 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj"))));
18976 CheckInstanceCheckedAccessors(true); 20463 CheckInstanceCheckedAccessors(true);
18977 20464
18978 printf("Testing negative ...\n"); 20465 printf("Testing negative ...\n");
18979 CompileRun("var obj = {};" 20466 CompileRun("var obj = {};"
18980 "obj.__proto__ = new f();"); 20467 "obj.__proto__ = new f();");
18981 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20468 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj"))));
18982 CheckInstanceCheckedAccessors(false); 20469 CheckInstanceCheckedAccessors(false);
18983 } 20470 }
18984 20471
18985 20472
18986 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { 20473 THREADED_TEST(InstanceCheckOnPrototypeAccessor) {
18987 v8::internal::FLAG_allow_natives_syntax = true; 20474 v8::internal::FLAG_allow_natives_syntax = true;
18988 LocalContext context; 20475 LocalContext context;
18989 v8::HandleScope scope(context->GetIsolate()); 20476 v8::HandleScope scope(context->GetIsolate());
18990 20477
18991 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); 20478 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate());
18992 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); 20479 Local<ObjectTemplate> proto = templ->PrototypeTemplate();
18993 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter, 20480 proto->SetAccessor(v8_str("foo"), InstanceCheckedGetter,
18994 InstanceCheckedSetter, Handle<Value>(), v8::DEFAULT, 20481 InstanceCheckedSetter, Local<Value>(), v8::DEFAULT,
18995 v8::None, 20482 v8::None,
18996 v8::AccessorSignature::New(context->GetIsolate(), templ)); 20483 v8::AccessorSignature::New(context->GetIsolate(), templ));
18997 context->Global()->Set(v8_str("f"), templ->GetFunction()); 20484 CHECK(context->Global()
20485 ->Set(context.local(), v8_str("f"),
20486 templ->GetFunction(context.local()).ToLocalChecked())
20487 .FromJust());
18998 20488
18999 printf("Testing positive ...\n"); 20489 printf("Testing positive ...\n");
19000 CompileRun("var obj = new f();"); 20490 CompileRun("var obj = new f();");
19001 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20491 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj"))));
19002 CheckInstanceCheckedAccessors(true); 20492 CheckInstanceCheckedAccessors(true);
19003 20493
19004 printf("Testing negative ...\n"); 20494 printf("Testing negative ...\n");
19005 CompileRun("var obj = {};" 20495 CompileRun("var obj = {};"
19006 "obj.__proto__ = new f();"); 20496 "obj.__proto__ = new f();");
19007 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); 20497 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj"))));
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
19067 LocalContext context; 20557 LocalContext context;
19068 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate()); 20558 Local<ObjectTemplate> templ = ObjectTemplate::New(context->GetIsolate());
19069 if (interceptor) { 20559 if (interceptor) {
19070 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(FooGetInterceptor, 20560 templ->SetHandler(v8::NamedPropertyHandlerConfiguration(FooGetInterceptor,
19071 FooSetInterceptor)); 20561 FooSetInterceptor));
19072 } else { 20562 } else {
19073 templ->SetAccessor(v8_str("foo"), 20563 templ->SetAccessor(v8_str("foo"),
19074 GetterWhichReturns42, 20564 GetterWhichReturns42,
19075 SetterWhichSetsYOnThisTo23); 20565 SetterWhichSetsYOnThisTo23);
19076 } 20566 }
19077 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20567 CHECK(context->Global()
20568 ->Set(context.local(), v8_str("obj"),
20569 templ->NewInstance(context.local()).ToLocalChecked())
20570 .FromJust());
19078 20571
19079 // Turn monomorphic on slow object with native accessor, then turn 20572 // Turn monomorphic on slow object with native accessor, then turn
19080 // polymorphic, finally optimize to create negative lookup and fail. 20573 // polymorphic, finally optimize to create negative lookup and fail.
19081 CompileRun(do_store ? 20574 CompileRun(do_store ?
19082 "function f(x) { x.foo = void 0; }" : 20575 "function f(x) { x.foo = void 0; }" :
19083 "function f(x) { return x.foo; }"); 20576 "function f(x) { return x.foo; }");
19084 CompileRun("obj.y = void 0;"); 20577 CompileRun("obj.y = void 0;");
19085 if (!interceptor) { 20578 if (!interceptor) {
19086 CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);"); 20579 CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);");
19087 } 20580 }
19088 CompileRun("obj.__proto__ = null;" 20581 CompileRun("obj.__proto__ = null;"
19089 "f(obj); f(obj); f(obj);"); 20582 "f(obj); f(obj); f(obj);");
19090 if (polymorphic) { 20583 if (polymorphic) {
19091 CompileRun("f({});"); 20584 CompileRun("f({});");
19092 } 20585 }
19093 CompileRun("obj.y = void 0;" 20586 CompileRun("obj.y = void 0;"
19094 "%OptimizeFunctionOnNextCall(f);"); 20587 "%OptimizeFunctionOnNextCall(f);");
19095 if (remove_accessor) { 20588 if (remove_accessor) {
19096 CompileRun("delete obj.foo;"); 20589 CompileRun("delete obj.foo;");
19097 } 20590 }
19098 CompileRun("var result = f(obj);"); 20591 CompileRun("var result = f(obj);");
19099 if (do_store) { 20592 if (do_store) {
19100 CompileRun("result = obj.y;"); 20593 CompileRun("result = obj.y;");
19101 } 20594 }
19102 if (remove_accessor && !interceptor) { 20595 if (remove_accessor && !interceptor) {
19103 CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); 20596 CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
19104 } else { 20597 } else {
19105 CHECK_EQ(do_store ? 23 : 42, 20598 CHECK_EQ(do_store ? 23 : 42, context->Global()
19106 context->Global()->Get(v8_str("result"))->Int32Value()); 20599 ->Get(v8_str("result"))
20600 ->Int32Value(context.local())
20601 .FromJust());
19107 } 20602 }
19108 } 20603 }
19109 20604
19110 20605
19111 THREADED_TEST(Regress137002a) { 20606 THREADED_TEST(Regress137002a) {
19112 i::FLAG_allow_natives_syntax = true; 20607 i::FLAG_allow_natives_syntax = true;
19113 i::FLAG_compilation_cache = false; 20608 i::FLAG_compilation_cache = false;
19114 v8::HandleScope scope(CcTest::isolate()); 20609 v8::HandleScope scope(CcTest::isolate());
19115 for (int i = 0; i < 16; i++) { 20610 for (int i = 0; i < 16; i++) {
19116 Helper137002(i & 8, i & 4, i & 2, i & 1); 20611 Helper137002(i & 8, i & 4, i & 2, i & 1);
19117 } 20612 }
19118 } 20613 }
19119 20614
19120 20615
19121 THREADED_TEST(Regress137002b) { 20616 THREADED_TEST(Regress137002b) {
19122 i::FLAG_allow_natives_syntax = true; 20617 i::FLAG_allow_natives_syntax = true;
19123 LocalContext context; 20618 LocalContext context;
19124 v8::Isolate* isolate = context->GetIsolate(); 20619 v8::Isolate* isolate = context->GetIsolate();
19125 v8::HandleScope scope(isolate); 20620 v8::HandleScope scope(isolate);
19126 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 20621 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19127 templ->SetAccessor(v8_str("foo"), 20622 templ->SetAccessor(v8_str("foo"),
19128 GetterWhichReturns42, 20623 GetterWhichReturns42,
19129 SetterWhichSetsYOnThisTo23); 20624 SetterWhichSetsYOnThisTo23);
19130 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20625 CHECK(context->Global()
20626 ->Set(context.local(), v8_str("obj"),
20627 templ->NewInstance(context.local()).ToLocalChecked())
20628 .FromJust());
19131 20629
19132 // Turn monomorphic on slow object with native accessor, then just 20630 // Turn monomorphic on slow object with native accessor, then just
19133 // delete the property and fail. 20631 // delete the property and fail.
19134 CompileRun("function load(x) { return x.foo; }" 20632 CompileRun("function load(x) { return x.foo; }"
19135 "function store(x) { x.foo = void 0; }" 20633 "function store(x) { x.foo = void 0; }"
19136 "function keyed_load(x, key) { return x[key]; }" 20634 "function keyed_load(x, key) { return x[key]; }"
19137 // Second version of function has a different source (add void 0) 20635 // Second version of function has a different source (add void 0)
19138 // so that it does not share code with the first version. This 20636 // so that it does not share code with the first version. This
19139 // ensures that the ICs are monomorphic. 20637 // ensures that the ICs are monomorphic.
19140 "function load2(x) { void 0; return x.foo; }" 20638 "function load2(x) { void 0; return x.foo; }"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
19189 20687
19190 THREADED_TEST(Regress142088) { 20688 THREADED_TEST(Regress142088) {
19191 i::FLAG_allow_natives_syntax = true; 20689 i::FLAG_allow_natives_syntax = true;
19192 LocalContext context; 20690 LocalContext context;
19193 v8::Isolate* isolate = context->GetIsolate(); 20691 v8::Isolate* isolate = context->GetIsolate();
19194 v8::HandleScope scope(isolate); 20692 v8::HandleScope scope(isolate);
19195 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 20693 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19196 templ->SetAccessor(v8_str("foo"), 20694 templ->SetAccessor(v8_str("foo"),
19197 GetterWhichReturns42, 20695 GetterWhichReturns42,
19198 SetterWhichSetsYOnThisTo23); 20696 SetterWhichSetsYOnThisTo23);
19199 context->Global()->Set(v8_str("obj"), templ->NewInstance()); 20697 CHECK(context->Global()
20698 ->Set(context.local(), v8_str("obj"),
20699 templ->NewInstance(context.local()).ToLocalChecked())
20700 .FromJust());
19200 20701
19201 CompileRun("function load(x) { return x.foo; }" 20702 CompileRun("function load(x) { return x.foo; }"
19202 "var o = Object.create(obj);" 20703 "var o = Object.create(obj);"
19203 "%OptimizeObjectForAddingMultipleProperties(obj, 1);" 20704 "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
19204 "load(o); load(o); load(o); load(o);"); 20705 "load(o); load(o); load(o); load(o);");
19205 } 20706 }
19206 20707
19207 20708
19208 THREADED_TEST(Regress137496) { 20709 THREADED_TEST(Regress137496) {
19209 i::FLAG_expose_gc = true; 20710 i::FLAG_expose_gc = true;
19210 LocalContext context; 20711 LocalContext context;
19211 v8::HandleScope scope(context->GetIsolate()); 20712 v8::HandleScope scope(context->GetIsolate());
19212 20713
19213 // Compile a try-finally clause where the finally block causes a GC 20714 // Compile a try-finally clause where the finally block causes a GC
19214 // while there still is a message pending for external reporting. 20715 // while there still is a message pending for external reporting.
19215 TryCatch try_catch(context->GetIsolate()); 20716 TryCatch try_catch(context->GetIsolate());
19216 try_catch.SetVerbose(true); 20717 try_catch.SetVerbose(true);
19217 CompileRun("try { throw new Error(); } finally { gc(); }"); 20718 CompileRun("try { throw new Error(); } finally { gc(); }");
19218 CHECK(try_catch.HasCaught()); 20719 CHECK(try_catch.HasCaught());
19219 } 20720 }
19220 20721
19221 20722
19222 THREADED_TEST(Regress157124) { 20723 THREADED_TEST(Regress157124) {
19223 LocalContext context; 20724 LocalContext context;
19224 v8::Isolate* isolate = context->GetIsolate(); 20725 v8::Isolate* isolate = context->GetIsolate();
19225 v8::HandleScope scope(isolate); 20726 v8::HandleScope scope(isolate);
19226 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 20727 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19227 Local<Object> obj = templ->NewInstance(); 20728 Local<Object> obj = templ->NewInstance(context.local()).ToLocalChecked();
19228 obj->GetIdentityHash(); 20729 obj->GetIdentityHash();
19229 obj->DeletePrivate(context.local(), 20730 obj->DeletePrivate(context.local(),
19230 v8::Private::ForApi(isolate, v8_str("Bug"))) 20731 v8::Private::ForApi(isolate, v8_str("Bug")))
19231 .FromJust(); 20732 .FromJust();
19232 } 20733 }
19233 20734
19234 20735
19235 THREADED_TEST(Regress2535) { 20736 THREADED_TEST(Regress2535) {
19236 LocalContext context; 20737 LocalContext context;
19237 v8::HandleScope scope(context->GetIsolate()); 20738 v8::HandleScope scope(context->GetIsolate());
(...skipping 20 matching lines...) Expand all
19258 } 20759 }
19259 20760
19260 20761
19261 THREADED_TEST(Regress260106) { 20762 THREADED_TEST(Regress260106) {
19262 LocalContext context; 20763 LocalContext context;
19263 v8::Isolate* isolate = context->GetIsolate(); 20764 v8::Isolate* isolate = context->GetIsolate();
19264 v8::HandleScope scope(isolate); 20765 v8::HandleScope scope(isolate);
19265 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, 20766 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate,
19266 DummyCallHandler); 20767 DummyCallHandler);
19267 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); 20768 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;");
19268 Local<Function> function = templ->GetFunction(); 20769 Local<Function> function =
20770 templ->GetFunction(context.local()).ToLocalChecked();
19269 CHECK(!function.IsEmpty()); 20771 CHECK(!function.IsEmpty());
19270 CHECK(function->IsFunction()); 20772 CHECK(function->IsFunction());
19271 } 20773 }
19272 20774
19273 20775
19274 THREADED_TEST(JSONParseObject) { 20776 THREADED_TEST(JSONParseObject) {
19275 LocalContext context; 20777 LocalContext context;
19276 HandleScope scope(context->GetIsolate()); 20778 HandleScope scope(context->GetIsolate());
19277 Local<Value> obj = v8::JSON::Parse(v8_str("{\"x\":42}")); 20779 Local<Value> obj = v8::JSON::Parse(v8_str("{\"x\":42}"));
19278 Handle<Object> global = context->Global(); 20780 Local<Object> global = context->Global();
19279 global->Set(v8_str("obj"), obj); 20781 global->Set(v8_str("obj"), obj);
19280 ExpectString("JSON.stringify(obj)", "{\"x\":42}"); 20782 ExpectString("JSON.stringify(obj)", "{\"x\":42}");
19281 } 20783 }
19282 20784
19283 20785
19284 THREADED_TEST(JSONParseNumber) { 20786 THREADED_TEST(JSONParseNumber) {
19285 LocalContext context; 20787 LocalContext context;
19286 HandleScope scope(context->GetIsolate()); 20788 HandleScope scope(context->GetIsolate());
19287 Local<Value> obj = v8::JSON::Parse(v8_str("42")); 20789 Local<Value> obj = v8::JSON::Parse(v8_str("42"));
19288 Handle<Object> global = context->Global(); 20790 Local<Object> global = context->Global();
19289 global->Set(v8_str("obj"), obj); 20791 global->Set(v8_str("obj"), obj);
19290 ExpectString("JSON.stringify(obj)", "42"); 20792 ExpectString("JSON.stringify(obj)", "42");
19291 } 20793 }
19292 20794
19293 20795
19294 #if V8_OS_POSIX && !V8_OS_NACL 20796 #if V8_OS_POSIX && !V8_OS_NACL
19295 class ThreadInterruptTest { 20797 class ThreadInterruptTest {
19296 public: 20798 public:
19297 ThreadInterruptTest() : sem_(0), sem_value_(0) { } 20799 ThreadInterruptTest() : sem_(0), sem_value_(0) { }
19298 ~ThreadInterruptTest() {} 20800 ~ThreadInterruptTest() {}
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
19360 } 20862 }
19361 20863
19362 20864
19363 TEST(JSONStringifyAccessCheck) { 20865 TEST(JSONStringifyAccessCheck) {
19364 v8::V8::Initialize(); 20866 v8::V8::Initialize();
19365 v8::Isolate* isolate = CcTest::isolate(); 20867 v8::Isolate* isolate = CcTest::isolate();
19366 v8::HandleScope scope(isolate); 20868 v8::HandleScope scope(isolate);
19367 20869
19368 // Create an ObjectTemplate for global objects and install access 20870 // Create an ObjectTemplate for global objects and install access
19369 // check callbacks that will block access. 20871 // check callbacks that will block access.
19370 v8::Handle<v8::ObjectTemplate> global_template = 20872 v8::Local<v8::ObjectTemplate> global_template =
19371 v8::ObjectTemplate::New(isolate); 20873 v8::ObjectTemplate::New(isolate);
19372 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 20874 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
19373 20875
19374 // Create a context and set an x property on it's global object. 20876 // Create a context and set an x property on it's global object.
19375 LocalContext context0(NULL, global_template); 20877 LocalContext context0(NULL, global_template);
19376 v8::Handle<v8::Object> global0 = context0->Global(); 20878 v8::Local<v8::Object> global0 = context0->Global();
19377 global0->Set(v8_str("x"), v8_num(42)); 20879 global0->Set(v8_str("x"), v8_num(42));
19378 ExpectString("JSON.stringify(this)", "{\"x\":42}"); 20880 ExpectString("JSON.stringify(this)", "{\"x\":42}");
19379 20881
19380 for (int i = 0; i < 2; i++) { 20882 for (int i = 0; i < 2; i++) {
19381 if (i == 1) { 20883 if (i == 1) {
19382 // Install a toJSON function on the second run. 20884 // Install a toJSON function on the second run.
19383 v8::Handle<v8::FunctionTemplate> toJSON = 20885 v8::Local<v8::FunctionTemplate> toJSON =
19384 v8::FunctionTemplate::New(isolate, UnreachableCallback); 20886 v8::FunctionTemplate::New(isolate, UnreachableCallback);
19385 20887
19386 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); 20888 global0->Set(v8_str("toJSON"),
20889 toJSON->GetFunction(context0.local()).ToLocalChecked());
19387 } 20890 }
19388 // Create a context with a different security token so that the 20891 // Create a context with a different security token so that the
19389 // failed access check callback will be called on each access. 20892 // failed access check callback will be called on each access.
19390 LocalContext context1(NULL, global_template); 20893 LocalContext context1(NULL, global_template);
19391 context1->Global()->Set(v8_str("other"), global0); 20894 CHECK(context1->Global()
20895 ->Set(context1.local(), v8_str("other"), global0)
20896 .FromJust());
19392 20897
19393 CHECK(CompileRun("JSON.stringify(other)").IsEmpty()); 20898 CHECK(CompileRun("JSON.stringify(other)").IsEmpty());
19394 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty()); 20899 CHECK(CompileRun("JSON.stringify({ 'a' : other, 'b' : ['c'] })").IsEmpty());
19395 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty()); 20900 CHECK(CompileRun("JSON.stringify([other, 'b', 'c'])").IsEmpty());
19396 } 20901 }
19397 } 20902 }
19398 20903
19399 20904
19400 bool access_check_fail_thrown = false; 20905 bool access_check_fail_thrown = false;
19401 bool catch_callback_called = false; 20906 bool catch_callback_called = false;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
19448 20953
19449 TEST(AccessCheckThrows) { 20954 TEST(AccessCheckThrows) {
19450 i::FLAG_allow_natives_syntax = true; 20955 i::FLAG_allow_natives_syntax = true;
19451 v8::V8::Initialize(); 20956 v8::V8::Initialize();
19452 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows); 20957 v8::V8::SetFailedAccessCheckCallbackFunction(&FailedAccessCheckThrows);
19453 v8::Isolate* isolate = CcTest::isolate(); 20958 v8::Isolate* isolate = CcTest::isolate();
19454 v8::HandleScope scope(isolate); 20959 v8::HandleScope scope(isolate);
19455 20960
19456 // Create an ObjectTemplate for global objects and install access 20961 // Create an ObjectTemplate for global objects and install access
19457 // check callbacks that will block access. 20962 // check callbacks that will block access.
19458 v8::Handle<v8::ObjectTemplate> global_template = 20963 v8::Local<v8::ObjectTemplate> global_template =
19459 v8::ObjectTemplate::New(isolate); 20964 v8::ObjectTemplate::New(isolate);
19460 global_template->SetAccessCheckCallback(AccessAlwaysBlocked); 20965 global_template->SetAccessCheckCallback(AccessAlwaysBlocked);
19461 20966
19462 // Create a context and set an x property on it's global object. 20967 // Create a context and set an x property on it's global object.
19463 LocalContext context0(NULL, global_template); 20968 LocalContext context0(NULL, global_template);
19464 v8::Handle<v8::Object> global0 = context0->Global(); 20969 v8::Local<v8::Object> global0 = context0->Global();
19465 20970
19466 // Create a context with a different security token so that the 20971 // Create a context with a different security token so that the
19467 // failed access check callback will be called on each access. 20972 // failed access check callback will be called on each access.
19468 LocalContext context1(NULL, global_template); 20973 LocalContext context1(NULL, global_template);
19469 context1->Global()->Set(v8_str("other"), global0); 20974 CHECK(context1->Global()
20975 ->Set(context1.local(), v8_str("other"), global0)
20976 .FromJust());
19470 20977
19471 v8::Handle<v8::FunctionTemplate> catcher_fun = 20978 v8::Local<v8::FunctionTemplate> catcher_fun =
19472 v8::FunctionTemplate::New(isolate, CatcherCallback); 20979 v8::FunctionTemplate::New(isolate, CatcherCallback);
19473 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction()); 20980 CHECK(context1->Global()
20981 ->Set(context1.local(), v8_str("catcher"),
20982 catcher_fun->GetFunction(context1.local()).ToLocalChecked())
20983 .FromJust());
19474 20984
19475 v8::Handle<v8::FunctionTemplate> has_own_property_fun = 20985 v8::Local<v8::FunctionTemplate> has_own_property_fun =
19476 v8::FunctionTemplate::New(isolate, HasOwnPropertyCallback); 20986 v8::FunctionTemplate::New(isolate, HasOwnPropertyCallback);
19477 context1->Global()->Set(v8_str("has_own_property"), 20987 CHECK(context1->Global()
19478 has_own_property_fun->GetFunction()); 20988 ->Set(context1.local(), v8_str("has_own_property"),
20989 has_own_property_fun->GetFunction(context1.local())
20990 .ToLocalChecked())
20991 .FromJust());
19479 20992
19480 { 20993 {
19481 v8::TryCatch try_catch(isolate); 20994 v8::TryCatch try_catch(isolate);
19482 access_check_fail_thrown = false; 20995 access_check_fail_thrown = false;
19483 CompileRun("other.x;"); 20996 CompileRun("other.x;");
19484 CHECK(access_check_fail_thrown); 20997 CHECK(access_check_fail_thrown);
19485 CHECK(try_catch.HasCaught()); 20998 CHECK(try_catch.HasCaught());
19486 } 20999 }
19487 21000
19488 CheckCorrectThrow("other.x"); 21001 CheckCorrectThrow("other.x");
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
19601 InterruptThread i_thread; 21114 InterruptThread i_thread;
19602 }; 21115 };
19603 21116
19604 21117
19605 class RequestInterruptTestWithFunctionCall 21118 class RequestInterruptTestWithFunctionCall
19606 : public RequestInterruptTestBaseWithSimpleInterrupt { 21119 : public RequestInterruptTestBaseWithSimpleInterrupt {
19607 public: 21120 public:
19608 virtual void TestBody() { 21121 virtual void TestBody() {
19609 Local<Function> func = Function::New( 21122 Local<Function> func = Function::New(
19610 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); 21123 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this));
19611 env_->Global()->Set(v8_str("ShouldContinue"), func); 21124 CHECK(env_->Global()
21125 ->Set(env_.local(), v8_str("ShouldContinue"), func)
21126 .FromJust());
19612 21127
19613 CompileRun("while (ShouldContinue()) { }"); 21128 CompileRun("while (ShouldContinue()) { }");
19614 } 21129 }
19615 }; 21130 };
19616 21131
19617 21132
19618 class RequestInterruptTestWithMethodCall 21133 class RequestInterruptTestWithMethodCall
19619 : public RequestInterruptTestBaseWithSimpleInterrupt { 21134 : public RequestInterruptTestBaseWithSimpleInterrupt {
19620 public: 21135 public:
19621 virtual void TestBody() { 21136 virtual void TestBody() {
19622 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21137 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
19623 v8::Local<v8::Template> proto = t->PrototypeTemplate(); 21138 v8::Local<v8::Template> proto = t->PrototypeTemplate();
19624 proto->Set(v8_str("shouldContinue"), Function::New( 21139 proto->Set(v8_str("shouldContinue"), Function::New(
19625 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); 21140 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)));
19626 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); 21141 CHECK(env_->Global()
21142 ->Set(env_.local(), v8_str("Klass"),
21143 t->GetFunction(env_.local()).ToLocalChecked())
21144 .FromJust());
19627 21145
19628 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); 21146 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }");
19629 } 21147 }
19630 }; 21148 };
19631 21149
19632 21150
19633 class RequestInterruptTestWithAccessor 21151 class RequestInterruptTestWithAccessor
19634 : public RequestInterruptTestBaseWithSimpleInterrupt { 21152 : public RequestInterruptTestBaseWithSimpleInterrupt {
19635 public: 21153 public:
19636 virtual void TestBody() { 21154 virtual void TestBody() {
19637 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21155 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
19638 v8::Local<v8::Template> proto = t->PrototypeTemplate(); 21156 v8::Local<v8::Template> proto = t->PrototypeTemplate();
19639 proto->SetAccessorProperty(v8_str("shouldContinue"), FunctionTemplate::New( 21157 proto->SetAccessorProperty(v8_str("shouldContinue"), FunctionTemplate::New(
19640 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); 21158 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)));
19641 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); 21159 CHECK(env_->Global()
21160 ->Set(env_.local(), v8_str("Klass"),
21161 t->GetFunction(env_.local()).ToLocalChecked())
21162 .FromJust());
19642 21163
19643 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); 21164 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }");
19644 } 21165 }
19645 }; 21166 };
19646 21167
19647 21168
19648 class RequestInterruptTestWithNativeAccessor 21169 class RequestInterruptTestWithNativeAccessor
19649 : public RequestInterruptTestBaseWithSimpleInterrupt { 21170 : public RequestInterruptTestBaseWithSimpleInterrupt {
19650 public: 21171 public:
19651 virtual void TestBody() { 21172 virtual void TestBody() {
19652 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21173 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
19653 t->InstanceTemplate()->SetNativeDataProperty( 21174 t->InstanceTemplate()->SetNativeDataProperty(
19654 v8_str("shouldContinue"), 21175 v8_str("shouldContinue"),
19655 &ShouldContinueNativeGetter, 21176 &ShouldContinueNativeGetter,
19656 NULL, 21177 NULL,
19657 v8::External::New(isolate_, this)); 21178 v8::External::New(isolate_, this));
19658 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); 21179 CHECK(env_->Global()
21180 ->Set(env_.local(), v8_str("Klass"),
21181 t->GetFunction(env_.local()).ToLocalChecked())
21182 .FromJust());
19659 21183
19660 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }"); 21184 CompileRun("var obj = new Klass; while (obj.shouldContinue) { }");
19661 } 21185 }
19662 21186
19663 private: 21187 private:
19664 static void ShouldContinueNativeGetter( 21188 static void ShouldContinueNativeGetter(
19665 Local<String> property, 21189 Local<String> property,
19666 const v8::PropertyCallbackInfo<v8::Value>& info) { 21190 const v8::PropertyCallbackInfo<v8::Value>& info) {
19667 RequestInterruptTestBase* test = 21191 RequestInterruptTestBase* test =
19668 reinterpret_cast<RequestInterruptTestBase*>( 21192 reinterpret_cast<RequestInterruptTestBase*>(
19669 info.Data().As<v8::External>()->Value()); 21193 info.Data().As<v8::External>()->Value());
19670 info.GetReturnValue().Set(test->ShouldContinue()); 21194 info.GetReturnValue().Set(test->ShouldContinue());
19671 } 21195 }
19672 }; 21196 };
19673 21197
19674 21198
19675 class RequestInterruptTestWithMethodCallAndInterceptor 21199 class RequestInterruptTestWithMethodCallAndInterceptor
19676 : public RequestInterruptTestBaseWithSimpleInterrupt { 21200 : public RequestInterruptTestBaseWithSimpleInterrupt {
19677 public: 21201 public:
19678 virtual void TestBody() { 21202 virtual void TestBody() {
19679 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_); 21203 v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
19680 v8::Local<v8::Template> proto = t->PrototypeTemplate(); 21204 v8::Local<v8::Template> proto = t->PrototypeTemplate();
19681 proto->Set(v8_str("shouldContinue"), Function::New( 21205 proto->Set(v8_str("shouldContinue"), Function::New(
19682 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this))); 21206 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)));
19683 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate(); 21207 v8::Local<v8::ObjectTemplate> instance_template = t->InstanceTemplate();
19684 instance_template->SetHandler( 21208 instance_template->SetHandler(
19685 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor)); 21209 v8::NamedPropertyHandlerConfiguration(EmptyInterceptor));
19686 21210
19687 env_->Global()->Set(v8_str("Klass"), t->GetFunction()); 21211 CHECK(env_->Global()
21212 ->Set(env_.local(), v8_str("Klass"),
21213 t->GetFunction(env_.local()).ToLocalChecked())
21214 .FromJust());
19688 21215
19689 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }"); 21216 CompileRun("var obj = new Klass; while (obj.shouldContinue()) { }");
19690 } 21217 }
19691 21218
19692 private: 21219 private:
19693 static void EmptyInterceptor( 21220 static void EmptyInterceptor(
19694 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {} 21221 Local<Name> property, const v8::PropertyCallbackInfo<v8::Value>& info) {}
19695 }; 21222 };
19696 21223
19697 21224
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
19784 public: 21311 public:
19785 RequestMultipleInterrupts() : i_thread(this), counter_(0) {} 21312 RequestMultipleInterrupts() : i_thread(this), counter_(0) {}
19786 21313
19787 virtual void StartInterruptThread() { 21314 virtual void StartInterruptThread() {
19788 i_thread.Start(); 21315 i_thread.Start();
19789 } 21316 }
19790 21317
19791 virtual void TestBody() { 21318 virtual void TestBody() {
19792 Local<Function> func = Function::New( 21319 Local<Function> func = Function::New(
19793 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this)); 21320 isolate_, ShouldContinueCallback, v8::External::New(isolate_, this));
19794 env_->Global()->Set(v8_str("ShouldContinue"), func); 21321 CHECK(env_->Global()
21322 ->Set(env_.local(), v8_str("ShouldContinue"), func)
21323 .FromJust());
19795 21324
19796 CompileRun("while (ShouldContinue()) { }"); 21325 CompileRun("while (ShouldContinue()) { }");
19797 } 21326 }
19798 21327
19799 private: 21328 private:
19800 class InterruptThread : public v8::base::Thread { 21329 class InterruptThread : public v8::base::Thread {
19801 public: 21330 public:
19802 enum { NUM_INTERRUPTS = 10 }; 21331 enum { NUM_INTERRUPTS = 10 };
19803 explicit InterruptThread(RequestMultipleInterrupts* test) 21332 explicit InterruptThread(RequestMultipleInterrupts* test)
19804 : Thread(Options("RequestInterruptTest")), test_(test) {} 21333 : Thread(Options("RequestInterruptTest")), test_(test) {}
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
19855 } 21384 }
19856 21385
19857 21386
19858 THREADED_TEST(FunctionNew) { 21387 THREADED_TEST(FunctionNew) {
19859 LocalContext env; 21388 LocalContext env;
19860 v8::Isolate* isolate = env->GetIsolate(); 21389 v8::Isolate* isolate = env->GetIsolate();
19861 v8::HandleScope scope(isolate); 21390 v8::HandleScope scope(isolate);
19862 Local<Object> data = v8::Object::New(isolate); 21391 Local<Object> data = v8::Object::New(isolate);
19863 function_new_expected_env = data; 21392 function_new_expected_env = data;
19864 Local<Function> func = Function::New(isolate, FunctionNewCallback, data); 21393 Local<Function> func = Function::New(isolate, FunctionNewCallback, data);
19865 env->Global()->Set(v8_str("func"), func); 21394 CHECK(env->Global()->Set(env.local(), v8_str("func"), func).FromJust());
19866 Local<Value> result = CompileRun("func();"); 21395 Local<Value> result = CompileRun("func();");
19867 CHECK(v8::Integer::New(isolate, 17)->Equals(result)); 21396 CHECK(v8::Integer::New(isolate, 17)->Equals(result));
19868 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); 21397 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate);
19869 // Verify function not cached 21398 // Verify function not cached
19870 auto serial_number = handle( 21399 auto serial_number = handle(
19871 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func)) 21400 i::Smi::cast(i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*func))
19872 ->shared() 21401 ->shared()
19873 ->get_api_func_data() 21402 ->get_api_func_data()
19874 ->serial_number()), 21403 ->serial_number()),
19875 i_isolate); 21404 i_isolate);
19876 auto cache = i_isolate->function_cache(); 21405 auto cache = i_isolate->function_cache();
19877 CHECK(cache->Lookup(serial_number)->IsTheHole()); 21406 CHECK(cache->Lookup(serial_number)->IsTheHole());
19878 // Verify that each Function::New creates a new function instance 21407 // Verify that each Function::New creates a new function instance
19879 Local<Object> data2 = v8::Object::New(isolate); 21408 Local<Object> data2 = v8::Object::New(isolate);
19880 function_new_expected_env = data2; 21409 function_new_expected_env = data2;
19881 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2); 21410 Local<Function> func2 = Function::New(isolate, FunctionNewCallback, data2);
19882 CHECK(!func2->IsNull()); 21411 CHECK(!func2->IsNull());
19883 CHECK(!func->Equals(func2)); 21412 CHECK(!func->Equals(func2));
19884 env->Global()->Set(v8_str("func2"), func2); 21413 CHECK(env->Global()->Set(env.local(), v8_str("func2"), func2).FromJust());
19885 Local<Value> result2 = CompileRun("func2();"); 21414 Local<Value> result2 = CompileRun("func2();");
19886 CHECK(v8::Integer::New(isolate, 17)->Equals(result2)); 21415 CHECK(v8::Integer::New(isolate, 17)->Equals(result2));
19887 } 21416 }
19888 21417
19889 21418
19890 TEST(EscapeableHandleScope) { 21419 TEST(EscapeableHandleScope) {
19891 HandleScope outer_scope(CcTest::isolate()); 21420 HandleScope outer_scope(CcTest::isolate());
19892 LocalContext context; 21421 LocalContext context;
19893 const int runs = 10; 21422 const int runs = 10;
19894 Local<String> values[runs]; 21423 Local<String> values[runs];
(...skipping 19 matching lines...) Expand all
19914 CHECK(info.Holder() != info.This()); 21443 CHECK(info.Holder() != info.This());
19915 } 21444 }
19916 21445
19917 21446
19918 TEST(Regress239669) { 21447 TEST(Regress239669) {
19919 LocalContext context; 21448 LocalContext context;
19920 v8::Isolate* isolate = context->GetIsolate(); 21449 v8::Isolate* isolate = context->GetIsolate();
19921 v8::HandleScope scope(isolate); 21450 v8::HandleScope scope(isolate);
19922 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate); 21451 Local<ObjectTemplate> templ = ObjectTemplate::New(isolate);
19923 templ->SetAccessor(v8_str("x"), 0, SetterWhichExpectsThisAndHolderToDiffer); 21452 templ->SetAccessor(v8_str("x"), 0, SetterWhichExpectsThisAndHolderToDiffer);
19924 context->Global()->Set(v8_str("P"), templ->NewInstance()); 21453 CHECK(context->Global()
21454 ->Set(context.local(), v8_str("P"),
21455 templ->NewInstance(context.local()).ToLocalChecked())
21456 .FromJust());
19925 CompileRun( 21457 CompileRun(
19926 "function C1() {" 21458 "function C1() {"
19927 " this.x = 23;" 21459 " this.x = 23;"
19928 "};" 21460 "};"
19929 "C1.prototype = P;" 21461 "C1.prototype = P;"
19930 "for (var i = 0; i < 4; i++ ) {" 21462 "for (var i = 0; i < 4; i++ ) {"
19931 " new C1();" 21463 " new C1();"
19932 "}"); 21464 "}");
19933 } 21465 }
19934 21466
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
19998 signature = v8::Signature::New(isolate, parent_template); 21530 signature = v8::Signature::New(isolate, parent_template);
19999 break; 21531 break;
20000 } 21532 }
20001 signature_template = function_template->InstanceTemplate(); 21533 signature_template = function_template->InstanceTemplate();
20002 } 21534 }
20003 // Global object must pass checks. 21535 // Global object must pass checks.
20004 Local<v8::Context> context = 21536 Local<v8::Context> context =
20005 v8::Context::New(isolate, NULL, signature_template); 21537 v8::Context::New(isolate, NULL, signature_template);
20006 v8::Context::Scope context_scope(context); 21538 v8::Context::Scope context_scope(context);
20007 // Install regular object that can pass signature checks. 21539 // Install regular object that can pass signature checks.
20008 Local<Object> function_receiver = signature_template->NewInstance(); 21540 Local<Object> function_receiver =
20009 context->Global()->Set(v8_str("function_receiver"), function_receiver); 21541 signature_template->NewInstance(context).ToLocalChecked();
21542 CHECK(context->Global()
21543 ->Set(context, v8_str("function_receiver"), function_receiver)
21544 .FromJust());
20010 // Get the holder objects. 21545 // Get the holder objects.
20011 Local<Object> inner_global = 21546 Local<Object> inner_global =
20012 Local<Object>::Cast(context->Global()->GetPrototype()); 21547 Local<Object>::Cast(context->Global()->GetPrototype());
20013 // Install functions on hidden prototype object if there is one. 21548 // Install functions on hidden prototype object if there is one.
20014 data = Object::New(isolate); 21549 data = Object::New(isolate);
20015 Local<FunctionTemplate> function_template = FunctionTemplate::New( 21550 Local<FunctionTemplate> function_template = FunctionTemplate::New(
20016 isolate, OptimizationCallback, data, signature); 21551 isolate, OptimizationCallback, data, signature);
20017 Local<Function> function = function_template->GetFunction(); 21552 Local<Function> function =
21553 function_template->GetFunction(context).ToLocalChecked();
20018 Local<Object> global_holder = inner_global; 21554 Local<Object> global_holder = inner_global;
20019 Local<Object> function_holder = function_receiver; 21555 Local<Object> function_holder = function_receiver;
20020 if (signature_type == kSignatureOnPrototype) { 21556 if (signature_type == kSignatureOnPrototype) {
20021 function_holder = Local<Object>::Cast(function_holder->GetPrototype()); 21557 function_holder = Local<Object>::Cast(function_holder->GetPrototype());
20022 global_holder = Local<Object>::Cast(global_holder->GetPrototype()); 21558 global_holder = Local<Object>::Cast(global_holder->GetPrototype());
20023 } 21559 }
20024 global_holder->Set(v8_str("g_f"), function); 21560 global_holder->Set(v8_str("g_f"), function);
20025 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function); 21561 global_holder->SetAccessorProperty(v8_str("g_acc"), function, function);
20026 function_holder->Set(v8_str("f"), function); 21562 function_holder->Set(v8_str("f"), function);
20027 function_holder->SetAccessorProperty(v8_str("acc"), function, function); 21563 function_holder->SetAccessorProperty(v8_str("acc"), function, function);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
20115 ApiCallOptimizationChecker checker; 21651 ApiCallOptimizationChecker checker;
20116 checker.RunAll(); 21652 checker.RunAll();
20117 } 21653 }
20118 21654
20119 21655
20120 TEST(FunctionCallOptimizationMultipleArgs) { 21656 TEST(FunctionCallOptimizationMultipleArgs) {
20121 i::FLAG_allow_natives_syntax = true; 21657 i::FLAG_allow_natives_syntax = true;
20122 LocalContext context; 21658 LocalContext context;
20123 v8::Isolate* isolate = context->GetIsolate(); 21659 v8::Isolate* isolate = context->GetIsolate();
20124 v8::HandleScope scope(isolate); 21660 v8::HandleScope scope(isolate);
20125 Handle<Object> global = context->Global(); 21661 Local<Object> global = context->Global();
20126 Local<v8::Function> function = Function::New(isolate, Returns42); 21662 Local<v8::Function> function = Function::New(isolate, Returns42);
20127 global->Set(v8_str("x"), function); 21663 global->Set(v8_str("x"), function);
20128 CompileRun( 21664 CompileRun(
20129 "function x_wrap() {\n" 21665 "function x_wrap() {\n"
20130 " for (var i = 0; i < 5; i++) {\n" 21666 " for (var i = 0; i < 5; i++) {\n"
20131 " x(1,2,3);\n" 21667 " x(1,2,3);\n"
20132 " }\n" 21668 " }\n"
20133 "}\n" 21669 "}\n"
20134 "x_wrap();\n" 21670 "x_wrap();\n"
20135 "%OptimizeFunctionOnNextCall(x_wrap);" 21671 "%OptimizeFunctionOnNextCall(x_wrap);"
20136 "x_wrap();\n"); 21672 "x_wrap();\n");
20137 } 21673 }
20138 21674
20139 21675
20140 static void ReturnsSymbolCallback( 21676 static void ReturnsSymbolCallback(
20141 const v8::FunctionCallbackInfo<v8::Value>& info) { 21677 const v8::FunctionCallbackInfo<v8::Value>& info) {
20142 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate())); 21678 info.GetReturnValue().Set(v8::Symbol::New(info.GetIsolate()));
20143 } 21679 }
20144 21680
20145 21681
20146 TEST(ApiCallbackCanReturnSymbols) { 21682 TEST(ApiCallbackCanReturnSymbols) {
20147 i::FLAG_allow_natives_syntax = true; 21683 i::FLAG_allow_natives_syntax = true;
20148 LocalContext context; 21684 LocalContext context;
20149 v8::Isolate* isolate = context->GetIsolate(); 21685 v8::Isolate* isolate = context->GetIsolate();
20150 v8::HandleScope scope(isolate); 21686 v8::HandleScope scope(isolate);
20151 Handle<Object> global = context->Global(); 21687 Local<Object> global = context->Global();
20152 Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback); 21688 Local<v8::Function> function = Function::New(isolate, ReturnsSymbolCallback);
20153 global->Set(v8_str("x"), function); 21689 global->Set(v8_str("x"), function);
20154 CompileRun( 21690 CompileRun(
20155 "function x_wrap() {\n" 21691 "function x_wrap() {\n"
20156 " for (var i = 0; i < 5; i++) {\n" 21692 " for (var i = 0; i < 5; i++) {\n"
20157 " x();\n" 21693 " x();\n"
20158 " }\n" 21694 " }\n"
20159 "}\n" 21695 "}\n"
20160 "x_wrap();\n" 21696 "x_wrap();\n"
20161 "%OptimizeFunctionOnNextCall(x_wrap);" 21697 "%OptimizeFunctionOnNextCall(x_wrap);"
20162 "x_wrap();\n"); 21698 "x_wrap();\n");
20163 } 21699 }
20164 21700
20165 21701
20166 TEST(EmptyApiCallback) { 21702 TEST(EmptyApiCallback) {
20167 LocalContext context; 21703 LocalContext context;
20168 auto isolate = context->GetIsolate(); 21704 auto isolate = context->GetIsolate();
20169 v8::HandleScope scope(isolate); 21705 v8::HandleScope scope(isolate);
20170 auto global = context->Global(); 21706 auto global = context->Global();
20171 auto function = FunctionTemplate::New(isolate)->GetFunction(); 21707 auto function = FunctionTemplate::New(isolate)
21708 ->GetFunction(context.local())
21709 .ToLocalChecked();
20172 global->Set(v8_str("x"), function); 21710 global->Set(v8_str("x"), function);
20173 21711
20174 auto result = CompileRun("x()"); 21712 auto result = CompileRun("x()");
20175 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); 21713 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy());
20176 21714
20177 result = CompileRun("x(1,2,3)"); 21715 result = CompileRun("x(1,2,3)");
20178 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy()); 21716 CHECK(v8::Utils::OpenHandle(*result)->IsJSGlobalProxy());
20179 21717
20180 result = CompileRun("7 + x.call(3) + 11"); 21718 result = CompileRun("7 + x.call(3) + 11");
20181 CHECK(result->IsInt32()); 21719 CHECK(result->IsInt32());
20182 CHECK_EQ(21, result->Int32Value()); 21720 CHECK_EQ(21, result->Int32Value(context.local()).FromJust());
20183 21721
20184 result = CompileRun("7 + x.call(3, 101, 102, 103, 104) + 11"); 21722 result = CompileRun("7 + x.call(3, 101, 102, 103, 104) + 11");
20185 CHECK(result->IsInt32()); 21723 CHECK(result->IsInt32());
20186 CHECK_EQ(21, result->Int32Value()); 21724 CHECK_EQ(21, result->Int32Value(context.local()).FromJust());
20187 21725
20188 result = CompileRun("var y = []; x.call(y)"); 21726 result = CompileRun("var y = []; x.call(y)");
20189 CHECK(result->IsArray()); 21727 CHECK(result->IsArray());
20190 21728
20191 result = CompileRun("x.call(y, 1, 2, 3, 4)"); 21729 result = CompileRun("x.call(y, 1, 2, 3, 4)");
20192 CHECK(result->IsArray()); 21730 CHECK(result->IsArray());
20193 } 21731 }
20194 21732
20195 21733
20196 TEST(SimpleSignatureCheck) { 21734 TEST(SimpleSignatureCheck) {
20197 LocalContext context; 21735 LocalContext context;
20198 auto isolate = context->GetIsolate(); 21736 auto isolate = context->GetIsolate();
20199 v8::HandleScope scope(isolate); 21737 v8::HandleScope scope(isolate);
20200 auto global = context->Global(); 21738 auto global = context->Global();
20201 auto sig_obj = FunctionTemplate::New(isolate); 21739 auto sig_obj = FunctionTemplate::New(isolate);
20202 auto sig = v8::Signature::New(isolate, sig_obj); 21740 auto sig = v8::Signature::New(isolate, sig_obj);
20203 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); 21741 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
20204 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); 21742 global->Set(v8_str("sig_obj"),
20205 global->Set(v8_str("x"), x->GetFunction()); 21743 sig_obj->GetFunction(context.local()).ToLocalChecked());
21744 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked());
20206 CompileRun("var s = new sig_obj();"); 21745 CompileRun("var s = new sig_obj();");
20207 { 21746 {
20208 TryCatch try_catch(isolate); 21747 TryCatch try_catch(isolate);
20209 CompileRun("x()"); 21748 CompileRun("x()");
20210 CHECK(try_catch.HasCaught()); 21749 CHECK(try_catch.HasCaught());
20211 } 21750 }
20212 { 21751 {
20213 TryCatch try_catch(isolate); 21752 TryCatch try_catch(isolate);
20214 CompileRun("x.call(1)"); 21753 CompileRun("x.call(1)");
20215 CHECK(try_catch.HasCaught()); 21754 CHECK(try_catch.HasCaught());
20216 } 21755 }
20217 { 21756 {
20218 TryCatch try_catch(isolate); 21757 TryCatch try_catch(isolate);
20219 auto result = CompileRun("s.x = x; s.x()"); 21758 auto result = CompileRun("s.x = x; s.x()");
20220 CHECK(!try_catch.HasCaught()); 21759 CHECK(!try_catch.HasCaught());
20221 CHECK_EQ(42, result->Int32Value()); 21760 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20222 } 21761 }
20223 { 21762 {
20224 TryCatch try_catch(isolate); 21763 TryCatch try_catch(isolate);
20225 auto result = CompileRun("x.call(s)"); 21764 auto result = CompileRun("x.call(s)");
20226 CHECK(!try_catch.HasCaught()); 21765 CHECK(!try_catch.HasCaught());
20227 CHECK_EQ(42, result->Int32Value()); 21766 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20228 } 21767 }
20229 } 21768 }
20230 21769
20231 21770
20232 TEST(ChainSignatureCheck) { 21771 TEST(ChainSignatureCheck) {
20233 LocalContext context; 21772 LocalContext context;
20234 auto isolate = context->GetIsolate(); 21773 auto isolate = context->GetIsolate();
20235 v8::HandleScope scope(isolate); 21774 v8::HandleScope scope(isolate);
20236 auto global = context->Global(); 21775 auto global = context->Global();
20237 auto sig_obj = FunctionTemplate::New(isolate); 21776 auto sig_obj = FunctionTemplate::New(isolate);
20238 auto sig = v8::Signature::New(isolate, sig_obj); 21777 auto sig = v8::Signature::New(isolate, sig_obj);
20239 for (int i = 0; i < 4; ++i) { 21778 for (int i = 0; i < 4; ++i) {
20240 auto temp = FunctionTemplate::New(isolate); 21779 auto temp = FunctionTemplate::New(isolate);
20241 temp->Inherit(sig_obj); 21780 temp->Inherit(sig_obj);
20242 sig_obj = temp; 21781 sig_obj = temp;
20243 } 21782 }
20244 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); 21783 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
20245 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); 21784 global->Set(v8_str("sig_obj"),
20246 global->Set(v8_str("x"), x->GetFunction()); 21785 sig_obj->GetFunction(context.local()).ToLocalChecked());
21786 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked());
20247 CompileRun("var s = new sig_obj();"); 21787 CompileRun("var s = new sig_obj();");
20248 { 21788 {
20249 TryCatch try_catch(isolate); 21789 TryCatch try_catch(isolate);
20250 CompileRun("x()"); 21790 CompileRun("x()");
20251 CHECK(try_catch.HasCaught()); 21791 CHECK(try_catch.HasCaught());
20252 } 21792 }
20253 { 21793 {
20254 TryCatch try_catch(isolate); 21794 TryCatch try_catch(isolate);
20255 CompileRun("x.call(1)"); 21795 CompileRun("x.call(1)");
20256 CHECK(try_catch.HasCaught()); 21796 CHECK(try_catch.HasCaught());
20257 } 21797 }
20258 { 21798 {
20259 TryCatch try_catch(isolate); 21799 TryCatch try_catch(isolate);
20260 auto result = CompileRun("s.x = x; s.x()"); 21800 auto result = CompileRun("s.x = x; s.x()");
20261 CHECK(!try_catch.HasCaught()); 21801 CHECK(!try_catch.HasCaught());
20262 CHECK_EQ(42, result->Int32Value()); 21802 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20263 } 21803 }
20264 { 21804 {
20265 TryCatch try_catch(isolate); 21805 TryCatch try_catch(isolate);
20266 auto result = CompileRun("x.call(s)"); 21806 auto result = CompileRun("x.call(s)");
20267 CHECK(!try_catch.HasCaught()); 21807 CHECK(!try_catch.HasCaught());
20268 CHECK_EQ(42, result->Int32Value()); 21808 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20269 } 21809 }
20270 } 21810 }
20271 21811
20272 21812
20273 TEST(PrototypeSignatureCheck) { 21813 TEST(PrototypeSignatureCheck) {
20274 LocalContext context; 21814 LocalContext context;
20275 auto isolate = context->GetIsolate(); 21815 auto isolate = context->GetIsolate();
20276 v8::HandleScope scope(isolate); 21816 v8::HandleScope scope(isolate);
20277 auto global = context->Global(); 21817 auto global = context->Global();
20278 auto sig_obj = FunctionTemplate::New(isolate); 21818 auto sig_obj = FunctionTemplate::New(isolate);
20279 sig_obj->SetHiddenPrototype(true); 21819 sig_obj->SetHiddenPrototype(true);
20280 auto sig = v8::Signature::New(isolate, sig_obj); 21820 auto sig = v8::Signature::New(isolate, sig_obj);
20281 auto x = FunctionTemplate::New(isolate, Returns42, Handle<Value>(), sig); 21821 auto x = FunctionTemplate::New(isolate, Returns42, Local<Value>(), sig);
20282 global->Set(v8_str("sig_obj"), sig_obj->GetFunction()); 21822 global->Set(v8_str("sig_obj"),
20283 global->Set(v8_str("x"), x->GetFunction()); 21823 sig_obj->GetFunction(context.local()).ToLocalChecked());
21824 global->Set(v8_str("x"), x->GetFunction(context.local()).ToLocalChecked());
20284 CompileRun("s = {}; s.__proto__ = new sig_obj();"); 21825 CompileRun("s = {}; s.__proto__ = new sig_obj();");
20285 { 21826 {
20286 TryCatch try_catch(isolate); 21827 TryCatch try_catch(isolate);
20287 CompileRun("x()"); 21828 CompileRun("x()");
20288 CHECK(try_catch.HasCaught()); 21829 CHECK(try_catch.HasCaught());
20289 } 21830 }
20290 { 21831 {
20291 TryCatch try_catch(isolate); 21832 TryCatch try_catch(isolate);
20292 CompileRun("x.call(1)"); 21833 CompileRun("x.call(1)");
20293 CHECK(try_catch.HasCaught()); 21834 CHECK(try_catch.HasCaught());
20294 } 21835 }
20295 { 21836 {
20296 TryCatch try_catch(isolate); 21837 TryCatch try_catch(isolate);
20297 auto result = CompileRun("s.x = x; s.x()"); 21838 auto result = CompileRun("s.x = x; s.x()");
20298 CHECK(!try_catch.HasCaught()); 21839 CHECK(!try_catch.HasCaught());
20299 CHECK_EQ(42, result->Int32Value()); 21840 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20300 } 21841 }
20301 { 21842 {
20302 TryCatch try_catch(isolate); 21843 TryCatch try_catch(isolate);
20303 auto result = CompileRun("x.call(s)"); 21844 auto result = CompileRun("x.call(s)");
20304 CHECK(!try_catch.HasCaught()); 21845 CHECK(!try_catch.HasCaught());
20305 CHECK_EQ(42, result->Int32Value()); 21846 CHECK_EQ(42, result->Int32Value(context.local()).FromJust());
20306 } 21847 }
20307 } 21848 }
20308 21849
20309 21850
20310 static const char* last_event_message; 21851 static const char* last_event_message;
20311 static int last_event_status; 21852 static int last_event_status;
20312 void StoringEventLoggerCallback(const char* message, int status) { 21853 void StoringEventLoggerCallback(const char* message, int status) {
20313 last_event_message = message; 21854 last_event_message = message;
20314 last_event_status = status; 21855 last_event_status = status;
20315 } 21856 }
(...skipping 11 matching lines...) Expand all
20327 histogramTimer.Stop(); 21868 histogramTimer.Stop();
20328 CHECK_EQ(0, strcmp("V8.Test", last_event_message)); 21869 CHECK_EQ(0, strcmp("V8.Test", last_event_message));
20329 CHECK_EQ(1, last_event_status); 21870 CHECK_EQ(1, last_event_status);
20330 } 21871 }
20331 21872
20332 21873
20333 TEST(Promises) { 21874 TEST(Promises) {
20334 LocalContext context; 21875 LocalContext context;
20335 v8::Isolate* isolate = context->GetIsolate(); 21876 v8::Isolate* isolate = context->GetIsolate();
20336 v8::HandleScope scope(isolate); 21877 v8::HandleScope scope(isolate);
20337 Handle<Object> global = context->Global(); 21878 Local<Object> global = context->Global();
20338 21879
20339 // Creation. 21880 // Creation.
20340 Handle<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); 21881 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate);
20341 Handle<v8::Promise::Resolver> rr = v8::Promise::Resolver::New(isolate); 21882 Local<v8::Promise::Resolver> rr = v8::Promise::Resolver::New(isolate);
20342 Handle<v8::Promise> p = pr->GetPromise(); 21883 Local<v8::Promise> p = pr->GetPromise();
20343 Handle<v8::Promise> r = rr->GetPromise(); 21884 Local<v8::Promise> r = rr->GetPromise();
20344 CHECK_EQ(isolate, p->GetIsolate()); 21885 CHECK_EQ(isolate, p->GetIsolate());
20345 21886
20346 // IsPromise predicate. 21887 // IsPromise predicate.
20347 CHECK(p->IsPromise()); 21888 CHECK(p->IsPromise());
20348 CHECK(r->IsPromise()); 21889 CHECK(r->IsPromise());
20349 Handle<Value> o = v8::Object::New(isolate); 21890 Local<Value> o = v8::Object::New(isolate);
20350 CHECK(!o->IsPromise()); 21891 CHECK(!o->IsPromise());
20351 21892
20352 // Resolution and rejection. 21893 // Resolution and rejection.
20353 pr->Resolve(v8::Integer::New(isolate, 1)); 21894 pr->Resolve(v8::Integer::New(isolate, 1));
20354 CHECK(p->IsPromise()); 21895 CHECK(p->IsPromise());
20355 rr->Reject(v8::Integer::New(isolate, 2)); 21896 rr->Reject(v8::Integer::New(isolate, 2));
20356 CHECK(r->IsPromise()); 21897 CHECK(r->IsPromise());
20357 21898
20358 // Chaining non-pending promises. 21899 // Chaining non-pending promises.
20359 CompileRun( 21900 CompileRun(
20360 "var x1 = 0;\n" 21901 "var x1 = 0;\n"
20361 "var x2 = 0;\n" 21902 "var x2 = 0;\n"
20362 "function f1(x) { x1 = x; return x+1 };\n" 21903 "function f1(x) { x1 = x; return x+1 };\n"
20363 "function f2(x) { x2 = x; return x+1 };\n"); 21904 "function f2(x) { x2 = x; return x+1 };\n");
20364 Handle<Function> f1 = Handle<Function>::Cast(global->Get(v8_str("f1"))); 21905 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1")));
20365 Handle<Function> f2 = Handle<Function>::Cast(global->Get(v8_str("f2"))); 21906 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2")));
20366 21907
20367 p->Chain(f1); 21908 p->Chain(f1);
20368 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 21909 CHECK_EQ(0,
21910 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
20369 isolate->RunMicrotasks(); 21911 isolate->RunMicrotasks();
20370 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); 21912 CHECK_EQ(1,
21913 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
20371 21914
20372 p->Catch(f2); 21915 p->Catch(f2);
20373 isolate->RunMicrotasks(); 21916 isolate->RunMicrotasks();
20374 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21917 CHECK_EQ(0,
21918 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20375 21919
20376 r->Catch(f2); 21920 r->Catch(f2);
20377 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21921 CHECK_EQ(0,
21922 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20378 isolate->RunMicrotasks(); 21923 isolate->RunMicrotasks();
20379 CHECK_EQ(2, global->Get(v8_str("x2"))->Int32Value()); 21924 CHECK_EQ(2,
21925 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20380 21926
20381 r->Chain(f1); 21927 r->Chain(f1);
20382 isolate->RunMicrotasks(); 21928 isolate->RunMicrotasks();
20383 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); 21929 CHECK_EQ(1,
21930 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
20384 21931
20385 // Chaining pending promises. 21932 // Chaining pending promises.
20386 CompileRun("x1 = x2 = 0;"); 21933 CompileRun("x1 = x2 = 0;");
20387 pr = v8::Promise::Resolver::New(isolate); 21934 pr = v8::Promise::Resolver::New(isolate);
20388 rr = v8::Promise::Resolver::New(isolate); 21935 rr = v8::Promise::Resolver::New(isolate);
20389 21936
20390 pr->GetPromise()->Chain(f1); 21937 pr->GetPromise()->Chain(f1);
20391 rr->GetPromise()->Catch(f2); 21938 rr->GetPromise()->Catch(f2);
20392 isolate->RunMicrotasks(); 21939 isolate->RunMicrotasks();
20393 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 21940 CHECK_EQ(0,
20394 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21941 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21942 CHECK_EQ(0,
21943 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20395 21944
20396 pr->Resolve(v8::Integer::New(isolate, 1)); 21945 pr->Resolve(v8::Integer::New(isolate, 1));
20397 rr->Reject(v8::Integer::New(isolate, 2)); 21946 rr->Reject(v8::Integer::New(isolate, 2));
20398 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 21947 CHECK_EQ(0,
20399 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21948 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21949 CHECK_EQ(0,
21950 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20400 21951
20401 isolate->RunMicrotasks(); 21952 isolate->RunMicrotasks();
20402 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); 21953 CHECK_EQ(1,
20403 CHECK_EQ(2, global->Get(v8_str("x2"))->Int32Value()); 21954 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21955 CHECK_EQ(2,
21956 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20404 21957
20405 // Multi-chaining. 21958 // Multi-chaining.
20406 CompileRun("x1 = x2 = 0;"); 21959 CompileRun("x1 = x2 = 0;");
20407 pr = v8::Promise::Resolver::New(isolate); 21960 pr = v8::Promise::Resolver::New(isolate);
20408 pr->GetPromise()->Chain(f1)->Chain(f2); 21961 pr->GetPromise()->Chain(f1)->Chain(f2);
20409 pr->Resolve(v8::Integer::New(isolate, 3)); 21962 pr->Resolve(v8::Integer::New(isolate, 3));
20410 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 21963 CHECK_EQ(0,
20411 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21964 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21965 CHECK_EQ(0,
21966 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20412 isolate->RunMicrotasks(); 21967 isolate->RunMicrotasks();
20413 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); 21968 CHECK_EQ(3,
20414 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); 21969 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21970 CHECK_EQ(4,
21971 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20415 21972
20416 CompileRun("x1 = x2 = 0;"); 21973 CompileRun("x1 = x2 = 0;");
20417 rr = v8::Promise::Resolver::New(isolate); 21974 rr = v8::Promise::Resolver::New(isolate);
20418 rr->GetPromise()->Catch(f1)->Chain(f2); 21975 rr->GetPromise()->Catch(f1)->Chain(f2);
20419 rr->Reject(v8::Integer::New(isolate, 3)); 21976 rr->Reject(v8::Integer::New(isolate, 3));
20420 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 21977 CHECK_EQ(0,
20421 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 21978 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21979 CHECK_EQ(0,
21980 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20422 isolate->RunMicrotasks(); 21981 isolate->RunMicrotasks();
20423 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); 21982 CHECK_EQ(3,
20424 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); 21983 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
21984 CHECK_EQ(4,
21985 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20425 } 21986 }
20426 21987
20427 21988
20428 TEST(PromiseThen) { 21989 TEST(PromiseThen) {
20429 LocalContext context; 21990 LocalContext context;
20430 v8::Isolate* isolate = context->GetIsolate(); 21991 v8::Isolate* isolate = context->GetIsolate();
20431 v8::HandleScope scope(isolate); 21992 v8::HandleScope scope(isolate);
20432 Handle<Object> global = context->Global(); 21993 Local<Object> global = context->Global();
20433 21994
20434 // Creation. 21995 // Creation.
20435 Handle<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate); 21996 Local<v8::Promise::Resolver> pr = v8::Promise::Resolver::New(isolate);
20436 Handle<v8::Promise::Resolver> qr = v8::Promise::Resolver::New(isolate); 21997 Local<v8::Promise::Resolver> qr = v8::Promise::Resolver::New(isolate);
20437 Handle<v8::Promise> p = pr->GetPromise(); 21998 Local<v8::Promise> p = pr->GetPromise();
20438 Handle<v8::Promise> q = qr->GetPromise(); 21999 Local<v8::Promise> q = qr->GetPromise();
20439 22000
20440 CHECK(p->IsPromise()); 22001 CHECK(p->IsPromise());
20441 CHECK(q->IsPromise()); 22002 CHECK(q->IsPromise());
20442 22003
20443 pr->Resolve(v8::Integer::New(isolate, 1)); 22004 pr->Resolve(v8::Integer::New(isolate, 1));
20444 qr->Resolve(p); 22005 qr->Resolve(p);
20445 22006
20446 // Chaining non-pending promises. 22007 // Chaining non-pending promises.
20447 CompileRun( 22008 CompileRun(
20448 "var x1 = 0;\n" 22009 "var x1 = 0;\n"
20449 "var x2 = 0;\n" 22010 "var x2 = 0;\n"
20450 "function f1(x) { x1 = x; return x+1 };\n" 22011 "function f1(x) { x1 = x; return x+1 };\n"
20451 "function f2(x) { x2 = x; return x+1 };\n"); 22012 "function f2(x) { x2 = x; return x+1 };\n");
20452 Handle<Function> f1 = Handle<Function>::Cast(global->Get(v8_str("f1"))); 22013 Local<Function> f1 = Local<Function>::Cast(global->Get(v8_str("f1")));
20453 Handle<Function> f2 = Handle<Function>::Cast(global->Get(v8_str("f2"))); 22014 Local<Function> f2 = Local<Function>::Cast(global->Get(v8_str("f2")));
20454 22015
20455 // TODO(caitp): remove tests once PromiseChain is removed, per bug 3237 22016 // TODO(caitp): remove tests once PromiseChain is removed, per bug 3237
20456 /* q->Chain(f1); 22017 /* q->Chain(f1);
20457 CHECK(global->Get(v8_str2("x1"))->IsNumber()); 22018 CHECK(global->Get(v8_str2("x1"))->IsNumber());
20458 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 22019 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value());
20459 isolate->RunMicrotasks(); 22020 isolate->RunMicrotasks();
20460 CHECK(!global->Get(v8_str("x1"))->IsNumber()); 22021 CHECK(!global->Get(v8_str("x1"))->IsNumber());
20461 CHECK(p->Equals(global->Get(v8_str("x1")))); */ 22022 CHECK(p->Equals(global->Get(v8_str("x1")))); */
20462 22023
20463 // Then 22024 // Then
20464 CompileRun("x1 = x2 = 0;"); 22025 CompileRun("x1 = x2 = 0;");
20465 q->Then(f1); 22026 q->Then(f1);
20466 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 22027 CHECK_EQ(0,
22028 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
20467 isolate->RunMicrotasks(); 22029 isolate->RunMicrotasks();
20468 CHECK_EQ(1, global->Get(v8_str("x1"))->Int32Value()); 22030 CHECK_EQ(1,
22031 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
20469 22032
20470 // Then 22033 // Then
20471 CompileRun("x1 = x2 = 0;"); 22034 CompileRun("x1 = x2 = 0;");
20472 pr = v8::Promise::Resolver::New(isolate); 22035 pr = v8::Promise::Resolver::New(isolate);
20473 qr = v8::Promise::Resolver::New(isolate); 22036 qr = v8::Promise::Resolver::New(isolate);
20474 22037
20475 qr->Resolve(pr); 22038 qr->Resolve(pr);
20476 qr->GetPromise()->Then(f1)->Then(f2); 22039 qr->GetPromise()->Then(f1)->Then(f2);
20477 22040
20478 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 22041 CHECK_EQ(0,
20479 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 22042 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22043 CHECK_EQ(0,
22044 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20480 isolate->RunMicrotasks(); 22045 isolate->RunMicrotasks();
20481 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 22046 CHECK_EQ(0,
20482 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 22047 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22048 CHECK_EQ(0,
22049 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20483 22050
20484 pr->Resolve(v8::Integer::New(isolate, 3)); 22051 pr->Resolve(v8::Integer::New(isolate, 3));
20485 22052
20486 CHECK_EQ(0, global->Get(v8_str("x1"))->Int32Value()); 22053 CHECK_EQ(0,
20487 CHECK_EQ(0, global->Get(v8_str("x2"))->Int32Value()); 22054 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22055 CHECK_EQ(0,
22056 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20488 isolate->RunMicrotasks(); 22057 isolate->RunMicrotasks();
20489 CHECK_EQ(3, global->Get(v8_str("x1"))->Int32Value()); 22058 CHECK_EQ(3,
20490 CHECK_EQ(4, global->Get(v8_str("x2"))->Int32Value()); 22059 global->Get(v8_str("x1"))->Int32Value(context.local()).FromJust());
22060 CHECK_EQ(4,
22061 global->Get(v8_str("x2"))->Int32Value(context.local()).FromJust());
20491 } 22062 }
20492 22063
20493 22064
20494 TEST(DisallowJavascriptExecutionScope) { 22065 TEST(DisallowJavascriptExecutionScope) {
20495 LocalContext context; 22066 LocalContext context;
20496 v8::Isolate* isolate = context->GetIsolate(); 22067 v8::Isolate* isolate = context->GetIsolate();
20497 v8::HandleScope scope(isolate); 22068 v8::HandleScope scope(isolate);
20498 v8::Isolate::DisallowJavascriptExecutionScope no_js( 22069 v8::Isolate::DisallowJavascriptExecutionScope no_js(
20499 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE); 22070 isolate, v8::Isolate::DisallowJavascriptExecutionScope::CRASH_ON_FAILURE);
20500 CompileRun("2+2"); 22071 CompileRun("2+2");
(...skipping 24 matching lines...) Expand all
20525 CompileRun("1+1"); 22096 CompileRun("1+1");
20526 CHECK(try_catch.HasCaught()); 22097 CHECK(try_catch.HasCaught());
20527 } 22098 }
20528 22099
20529 22100
20530 TEST(Regress354123) { 22101 TEST(Regress354123) {
20531 LocalContext current; 22102 LocalContext current;
20532 v8::Isolate* isolate = current->GetIsolate(); 22103 v8::Isolate* isolate = current->GetIsolate();
20533 v8::HandleScope scope(isolate); 22104 v8::HandleScope scope(isolate);
20534 22105
20535 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate); 22106 v8::Local<v8::ObjectTemplate> templ = v8::ObjectTemplate::New(isolate);
20536 templ->SetAccessCheckCallback(AccessCounter); 22107 templ->SetAccessCheckCallback(AccessCounter);
20537 current->Global()->Set(v8_str("friend"), templ->NewInstance()); 22108 CHECK(current->Global()
22109 ->Set(current.local(), v8_str("friend"),
22110 templ->NewInstance(current.local()).ToLocalChecked())
22111 .FromJust());
20538 22112
20539 // Test access using __proto__ from the prototype chain. 22113 // Test access using __proto__ from the prototype chain.
20540 access_count = 0; 22114 access_count = 0;
20541 CompileRun("friend.__proto__ = {};"); 22115 CompileRun("friend.__proto__ = {};");
20542 CHECK_EQ(2, access_count); 22116 CHECK_EQ(2, access_count);
20543 CompileRun("friend.__proto__;"); 22117 CompileRun("friend.__proto__;");
20544 CHECK_EQ(4, access_count); 22118 CHECK_EQ(4, access_count);
20545 22119
20546 // Test access using __proto__ as a hijacked function (A). 22120 // Test access using __proto__ as a hijacked function (A).
20547 access_count = 0; 22121 access_count = 0;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
20596 isolate, &script_source); 22170 isolate, &script_source);
20597 Local<Value> script_name = script->GetUnboundScript()->GetScriptName(); 22171 Local<Value> script_name = script->GetUnboundScript()->GetScriptName();
20598 CHECK(!script_name.IsEmpty()); 22172 CHECK(!script_name.IsEmpty());
20599 CHECK(script_name->IsString()); 22173 CHECK(script_name->IsString());
20600 String::Utf8Value utf8_name(script_name); 22174 String::Utf8Value utf8_name(script_name);
20601 CHECK_EQ(0, strcmp(url, *utf8_name)); 22175 CHECK_EQ(0, strcmp(url, *utf8_name));
20602 int line_number = script->GetUnboundScript()->GetLineNumber(0); 22176 int line_number = script->GetUnboundScript()->GetLineNumber(0);
20603 CHECK_EQ(13, line_number); 22177 CHECK_EQ(13, line_number);
20604 } 22178 }
20605 22179
20606 void CheckMagicComments(Handle<Script> script, const char* expected_source_url, 22180 void CheckMagicComments(Local<Script> script, const char* expected_source_url,
20607 const char* expected_source_mapping_url) { 22181 const char* expected_source_mapping_url) {
20608 if (expected_source_url != NULL) { 22182 if (expected_source_url != NULL) {
20609 v8::String::Utf8Value url(script->GetUnboundScript()->GetSourceURL()); 22183 v8::String::Utf8Value url(script->GetUnboundScript()->GetSourceURL());
20610 CHECK_EQ(0, strcmp(expected_source_url, *url)); 22184 CHECK_EQ(0, strcmp(expected_source_url, *url));
20611 } else { 22185 } else {
20612 CHECK(script->GetUnboundScript()->GetSourceURL()->IsUndefined()); 22186 CHECK(script->GetUnboundScript()->GetSourceURL()->IsUndefined());
20613 } 22187 }
20614 if (expected_source_mapping_url != NULL) { 22188 if (expected_source_mapping_url != NULL) {
20615 v8::String::Utf8Value url( 22189 v8::String::Utf8Value url(
20616 script->GetUnboundScript()->GetSourceMappingURL()); 22190 script->GetUnboundScript()->GetSourceMappingURL());
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
20705 Local<Value> desc = x->GetOwnPropertyDescriptor(v8_str("no_prop")); 22279 Local<Value> desc = x->GetOwnPropertyDescriptor(v8_str("no_prop"));
20706 CHECK(desc->IsUndefined()); 22280 CHECK(desc->IsUndefined());
20707 desc = x->GetOwnPropertyDescriptor(v8_str("p0")); 22281 desc = x->GetOwnPropertyDescriptor(v8_str("p0"));
20708 CHECK(v8_num(12)->Equals(Local<Object>::Cast(desc)->Get(v8_str("value")))); 22282 CHECK(v8_num(12)->Equals(Local<Object>::Cast(desc)->Get(v8_str("value"))));
20709 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); 22283 desc = x->GetOwnPropertyDescriptor(v8_str("p1"));
20710 Local<Function> set = 22284 Local<Function> set =
20711 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); 22285 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set")));
20712 Local<Function> get = 22286 Local<Function> get =
20713 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); 22287 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get")));
20714 CHECK(v8_num(13)->Equals(get->Call(x, 0, NULL))); 22288 CHECK(v8_num(13)->Equals(get->Call(x, 0, NULL)));
20715 Handle<Value> args[] = { v8_num(14) }; 22289 Local<Value> args[] = {v8_num(14)};
20716 set->Call(x, 1, args); 22290 set->Call(x, 1, args);
20717 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL))); 22291 CHECK(v8_num(14)->Equals(get->Call(x, 0, NULL)));
20718 } 22292 }
20719 22293
20720 22294
20721 TEST(Regress411877) { 22295 TEST(Regress411877) {
20722 v8::Isolate* isolate = CcTest::isolate(); 22296 v8::Isolate* isolate = CcTest::isolate();
20723 v8::HandleScope handle_scope(isolate); 22297 v8::HandleScope handle_scope(isolate);
20724 v8::Handle<v8::ObjectTemplate> object_template = 22298 v8::Local<v8::ObjectTemplate> object_template =
20725 v8::ObjectTemplate::New(isolate); 22299 v8::ObjectTemplate::New(isolate);
20726 object_template->SetAccessCheckCallback(AccessCounter); 22300 object_template->SetAccessCheckCallback(AccessCounter);
20727 22301
20728 v8::Handle<Context> context = Context::New(isolate); 22302 v8::Local<Context> context = Context::New(isolate);
20729 v8::Context::Scope context_scope(context); 22303 v8::Context::Scope context_scope(context);
20730 22304
20731 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 22305 CHECK(context->Global()
22306 ->Set(context, v8_str("o"),
22307 object_template->NewInstance(context).ToLocalChecked())
22308 .FromJust());
20732 CompileRun("Object.getOwnPropertyNames(o)"); 22309 CompileRun("Object.getOwnPropertyNames(o)");
20733 } 22310 }
20734 22311
20735 22312
20736 TEST(GetHiddenPropertyTableAfterAccessCheck) { 22313 TEST(GetHiddenPropertyTableAfterAccessCheck) {
20737 v8::Isolate* isolate = CcTest::isolate(); 22314 v8::Isolate* isolate = CcTest::isolate();
20738 v8::HandleScope handle_scope(isolate); 22315 v8::HandleScope handle_scope(isolate);
20739 v8::Handle<v8::ObjectTemplate> object_template = 22316 v8::Local<v8::ObjectTemplate> object_template =
20740 v8::ObjectTemplate::New(isolate); 22317 v8::ObjectTemplate::New(isolate);
20741 object_template->SetAccessCheckCallback(AccessCounter); 22318 object_template->SetAccessCheckCallback(AccessCounter);
20742 22319
20743 v8::Handle<Context> context = Context::New(isolate); 22320 v8::Local<Context> context = Context::New(isolate);
20744 v8::Context::Scope context_scope(context); 22321 v8::Context::Scope context_scope(context);
20745 22322
20746 v8::Handle<v8::Object> obj = object_template->NewInstance(); 22323 v8::Local<v8::Object> obj =
22324 object_template->NewInstance(context).ToLocalChecked();
20747 obj->Set(v8_str("key"), v8_str("value")); 22325 obj->Set(v8_str("key"), v8_str("value"));
20748 obj->Delete(v8_str("key")); 22326 obj->Delete(v8_str("key"));
20749 22327
20750 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")), 22328 obj->SetPrivate(context, v8::Private::New(isolate, v8_str("hidden key 2")),
20751 v8_str("hidden value 2")) 22329 v8_str("hidden value 2"))
20752 .FromJust(); 22330 .FromJust();
20753 } 22331 }
20754 22332
20755 22333
20756 TEST(Regress411793) { 22334 TEST(Regress411793) {
20757 v8::Isolate* isolate = CcTest::isolate(); 22335 v8::Isolate* isolate = CcTest::isolate();
20758 v8::HandleScope handle_scope(isolate); 22336 v8::HandleScope handle_scope(isolate);
20759 v8::Handle<v8::ObjectTemplate> object_template = 22337 v8::Local<v8::ObjectTemplate> object_template =
20760 v8::ObjectTemplate::New(isolate); 22338 v8::ObjectTemplate::New(isolate);
20761 object_template->SetAccessCheckCallback(AccessCounter); 22339 object_template->SetAccessCheckCallback(AccessCounter);
20762 22340
20763 v8::Handle<Context> context = Context::New(isolate); 22341 v8::Local<Context> context = Context::New(isolate);
20764 v8::Context::Scope context_scope(context); 22342 v8::Context::Scope context_scope(context);
20765 22343
20766 context->Global()->Set(v8_str("o"), object_template->NewInstance()); 22344 CHECK(context->Global()
22345 ->Set(context, v8_str("o"),
22346 object_template->NewInstance(context).ToLocalChecked())
22347 .FromJust());
20767 CompileRun( 22348 CompileRun(
20768 "Object.defineProperty(o, 'key', " 22349 "Object.defineProperty(o, 'key', "
20769 " { get: function() {}, set: function() {} });"); 22350 " { get: function() {}, set: function() {} });");
20770 } 22351 }
20771 22352
20772 class TestSourceStream : public v8::ScriptCompiler::ExternalSourceStream { 22353 class TestSourceStream : public v8::ScriptCompiler::ExternalSourceStream {
20773 public: 22354 public:
20774 explicit TestSourceStream(const char** chunks) : chunks_(chunks), index_(0) {} 22355 explicit TestSourceStream(const char** chunks) : chunks_(chunks), index_(0) {}
20775 22356
20776 virtual size_t GetMoreData(const uint8_t** src) { 22357 virtual size_t GetMoreData(const uint8_t** src) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
20832 // TestSourceStream::GetMoreData won't block, so it's OK to just run the 22413 // TestSourceStream::GetMoreData won't block, so it's OK to just run the
20833 // task here in the main thread. 22414 // task here in the main thread.
20834 task->Run(); 22415 task->Run();
20835 delete task; 22416 delete task;
20836 22417
20837 // Possible errors are only produced while compiling. 22418 // Possible errors are only produced while compiling.
20838 CHECK_EQ(false, try_catch.HasCaught()); 22419 CHECK_EQ(false, try_catch.HasCaught());
20839 22420
20840 v8::ScriptOrigin origin(v8_str("http://foo.com")); 22421 v8::ScriptOrigin origin(v8_str("http://foo.com"));
20841 char* full_source = TestSourceStream::FullSourceString(chunks); 22422 char* full_source = TestSourceStream::FullSourceString(chunks);
20842 v8::Handle<Script> script = v8::ScriptCompiler::Compile( 22423 v8::Local<Script> script = v8::ScriptCompiler::Compile(
20843 isolate, &source, v8_str(full_source), origin); 22424 isolate, &source, v8_str(full_source), origin);
20844 if (expected_success) { 22425 if (expected_success) {
20845 CHECK(!script.IsEmpty()); 22426 CHECK(!script.IsEmpty());
20846 v8::Handle<Value> result(script->Run()); 22427 v8::Local<Value> result(script->Run());
20847 // All scripts are supposed to return the fixed value 13 when ran. 22428 // All scripts are supposed to return the fixed value 13 when ran.
20848 CHECK_EQ(13, result->Int32Value()); 22429 CHECK_EQ(13, result->Int32Value(env.local()).FromJust());
20849 CheckMagicComments(script, expected_source_url, 22430 CheckMagicComments(script, expected_source_url,
20850 expected_source_mapping_url); 22431 expected_source_mapping_url);
20851 } else { 22432 } else {
20852 CHECK(script.IsEmpty()); 22433 CHECK(script.IsEmpty());
20853 CHECK(try_catch.HasCaught()); 22434 CHECK(try_catch.HasCaught());
20854 } 22435 }
20855 delete[] full_source; 22436 delete[] full_source;
20856 } 22437 }
20857 22438
20858 22439
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
21107 task->Run(); 22688 task->Run();
21108 delete task; 22689 delete task;
21109 22690
21110 CHECK(!try_catch.HasCaught()); 22691 CHECK(!try_catch.HasCaught());
21111 22692
21112 v8::ScriptOrigin origin(v8_str("http://foo.com")); 22693 v8::ScriptOrigin origin(v8_str("http://foo.com"));
21113 char* full_source = TestSourceStream::FullSourceString(chunks); 22694 char* full_source = TestSourceStream::FullSourceString(chunks);
21114 22695
21115 EnableDebugger(); 22696 EnableDebugger();
21116 22697
21117 v8::Handle<Script> script = v8::ScriptCompiler::Compile( 22698 v8::Local<Script> script = v8::ScriptCompiler::Compile(
21118 isolate, &source, v8_str(full_source), origin); 22699 isolate, &source, v8_str(full_source), origin);
21119 22700
21120 Maybe<uint32_t> result = 22701 Maybe<uint32_t> result =
21121 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local()); 22702 script->Run(env.local()).ToLocalChecked()->Uint32Value(env.local());
21122 CHECK_EQ(3U, result.FromMaybe(0)); 22703 CHECK_EQ(3U, result.FromMaybe(0));
21123 22704
21124 delete[] full_source; 22705 delete[] full_source;
21125 22706
21126 DisableDebugger(); 22707 DisableDebugger();
21127 } 22708 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
21211 v8::ScriptCompiler::StartStreamingScript(isolate, &source); 22792 v8::ScriptCompiler::StartStreamingScript(isolate, &source);
21212 task->Run(); 22793 task->Run();
21213 delete task; 22794 delete task;
21214 22795
21215 // Parsing should succeed (the script will be parsed and compiled in a context 22796 // Parsing should succeed (the script will be parsed and compiled in a context
21216 // independent way, so the error is not detected). 22797 // independent way, so the error is not detected).
21217 CHECK_EQ(false, try_catch.HasCaught()); 22798 CHECK_EQ(false, try_catch.HasCaught());
21218 22799
21219 v8::ScriptOrigin origin(v8_str("http://foo.com")); 22800 v8::ScriptOrigin origin(v8_str("http://foo.com"));
21220 char* full_source = TestSourceStream::FullSourceString(chunks); 22801 char* full_source = TestSourceStream::FullSourceString(chunks);
21221 v8::Handle<Script> script = v8::ScriptCompiler::Compile( 22802 v8::Local<Script> script = v8::ScriptCompiler::Compile(
21222 isolate, &source, v8_str(full_source), origin); 22803 isolate, &source, v8_str(full_source), origin);
21223 CHECK(!script.IsEmpty()); 22804 CHECK(!script.IsEmpty());
21224 CHECK_EQ(false, try_catch.HasCaught()); 22805 CHECK_EQ(false, try_catch.HasCaught());
21225 22806
21226 // Running the script exposes the error. 22807 // Running the script exposes the error.
21227 v8::Handle<Value> result(script->Run()); 22808 v8::Local<Value> result(script->Run());
21228 CHECK(result.IsEmpty()); 22809 CHECK(result.IsEmpty());
21229 CHECK(try_catch.HasCaught()); 22810 CHECK(try_catch.HasCaught());
21230 delete[] full_source; 22811 delete[] full_source;
21231 } 22812 }
21232 22813
21233 22814
21234 TEST(CodeCache) { 22815 TEST(CodeCache) {
21235 v8::Isolate::CreateParams create_params; 22816 v8::Isolate::CreateParams create_params;
21236 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); 22817 create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
21237 22818
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
21270 v8::ScriptCompiler::Source source(source_string, script_origin, cache); 22851 v8::ScriptCompiler::Source source(source_string, script_origin, cache);
21271 v8::ScriptCompiler::CompileOptions option = 22852 v8::ScriptCompiler::CompileOptions option =
21272 v8::ScriptCompiler::kConsumeCodeCache; 22853 v8::ScriptCompiler::kConsumeCodeCache;
21273 v8::Local<v8::Script> script; 22854 v8::Local<v8::Script> script;
21274 { 22855 {
21275 i::DisallowCompilation no_compile( 22856 i::DisallowCompilation no_compile(
21276 reinterpret_cast<i::Isolate*>(isolate2)); 22857 reinterpret_cast<i::Isolate*>(isolate2));
21277 script = v8::ScriptCompiler::Compile(context, &source, option) 22858 script = v8::ScriptCompiler::Compile(context, &source, option)
21278 .ToLocalChecked(); 22859 .ToLocalChecked();
21279 } 22860 }
21280 CHECK_EQ(2, script->Run()->ToInt32(isolate2)->Int32Value()); 22861 CHECK_EQ(2,
22862 script->Run()->ToInt32(isolate2)->Int32Value(context).FromJust());
21281 } 22863 }
21282 isolate2->Dispose(); 22864 isolate2->Dispose();
21283 } 22865 }
21284 22866
21285 22867
21286 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) { 22868 void TestInvalidCacheData(v8::ScriptCompiler::CompileOptions option) {
21287 const char* garbage = "garbage garbage garbage garbage garbage garbage"; 22869 const char* garbage = "garbage garbage garbage garbage garbage garbage";
21288 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage); 22870 const uint8_t* data = reinterpret_cast<const uint8_t*>(garbage);
21289 int length = 16; 22871 int length = 16;
21290 v8::ScriptCompiler::CachedData* cached_data = 22872 v8::ScriptCompiler::CachedData* cached_data =
21291 new v8::ScriptCompiler::CachedData(data, length); 22873 new v8::ScriptCompiler::CachedData(data, length);
21292 DCHECK(!cached_data->rejected); 22874 DCHECK(!cached_data->rejected);
21293 v8::ScriptOrigin origin(v8_str("origin")); 22875 v8::ScriptOrigin origin(v8_str("origin"));
21294 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data); 22876 v8::ScriptCompiler::Source source(v8_str("42"), origin, cached_data);
21295 v8::Handle<v8::Script> script = 22877 v8::Local<v8::Script> script =
21296 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option); 22878 v8::ScriptCompiler::Compile(CcTest::isolate(), &source, option);
21297 CHECK(cached_data->rejected); 22879 CHECK(cached_data->rejected);
21298 CHECK_EQ(42, script->Run()->Int32Value()); 22880 CHECK_EQ(42, script->Run()
22881 ->Int32Value(CcTest::isolate()->GetCurrentContext())
22882 .FromJust());
21299 } 22883 }
21300 22884
21301 22885
21302 TEST(InvalidCacheData) { 22886 TEST(InvalidCacheData) {
21303 v8::V8::Initialize(); 22887 v8::V8::Initialize();
21304 v8::HandleScope scope(CcTest::isolate()); 22888 v8::HandleScope scope(CcTest::isolate());
21305 LocalContext context; 22889 LocalContext context;
21306 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache); 22890 TestInvalidCacheData(v8::ScriptCompiler::kConsumeParserCache);
21307 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache); 22891 TestInvalidCacheData(v8::ScriptCompiler::kConsumeCodeCache);
21308 } 22892 }
21309 22893
21310 22894
21311 TEST(ParserCacheRejectedGracefully) { 22895 TEST(ParserCacheRejectedGracefully) {
21312 i::FLAG_min_preparse_length = 0; 22896 i::FLAG_min_preparse_length = 0;
21313 v8::V8::Initialize(); 22897 v8::V8::Initialize();
21314 v8::HandleScope scope(CcTest::isolate()); 22898 v8::HandleScope scope(CcTest::isolate());
21315 LocalContext context; 22899 LocalContext context;
21316 // Produce valid cached data. 22900 // Produce valid cached data.
21317 v8::ScriptOrigin origin(v8_str("origin")); 22901 v8::ScriptOrigin origin(v8_str("origin"));
21318 v8::Local<v8::String> source_str = v8_str("function foo() {}"); 22902 v8::Local<v8::String> source_str = v8_str("function foo() {}");
21319 v8::ScriptCompiler::Source source(source_str, origin); 22903 v8::ScriptCompiler::Source source(source_str, origin);
21320 v8::Handle<v8::Script> script = v8::ScriptCompiler::Compile( 22904 v8::Local<v8::Script> script = v8::ScriptCompiler::Compile(
21321 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache); 22905 CcTest::isolate(), &source, v8::ScriptCompiler::kProduceParserCache);
21322 CHECK(!script.IsEmpty()); 22906 CHECK(!script.IsEmpty());
21323 const v8::ScriptCompiler::CachedData* original_cached_data = 22907 const v8::ScriptCompiler::CachedData* original_cached_data =
21324 source.GetCachedData(); 22908 source.GetCachedData();
21325 CHECK(original_cached_data != NULL); 22909 CHECK(original_cached_data != NULL);
21326 CHECK(original_cached_data->data != NULL); 22910 CHECK(original_cached_data->data != NULL);
21327 CHECK(!original_cached_data->rejected); 22911 CHECK(!original_cached_data->rejected);
21328 CHECK_GT(original_cached_data->length, 0); 22912 CHECK_GT(original_cached_data->length, 0);
21329 // Recompiling the same script with it won't reject the data. 22913 // Recompiling the same script with it won't reject the data.
21330 { 22914 {
21331 v8::ScriptCompiler::Source source_with_cached_data( 22915 v8::ScriptCompiler::Source source_with_cached_data(
21332 source_str, origin, 22916 source_str, origin,
21333 new v8::ScriptCompiler::CachedData(original_cached_data->data, 22917 new v8::ScriptCompiler::CachedData(original_cached_data->data,
21334 original_cached_data->length)); 22918 original_cached_data->length));
21335 v8::Handle<v8::Script> script = 22919 v8::Local<v8::Script> script =
21336 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, 22920 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data,
21337 v8::ScriptCompiler::kConsumeParserCache); 22921 v8::ScriptCompiler::kConsumeParserCache);
21338 CHECK(!script.IsEmpty()); 22922 CHECK(!script.IsEmpty());
21339 const v8::ScriptCompiler::CachedData* new_cached_data = 22923 const v8::ScriptCompiler::CachedData* new_cached_data =
21340 source_with_cached_data.GetCachedData(); 22924 source_with_cached_data.GetCachedData();
21341 CHECK(new_cached_data != NULL); 22925 CHECK(new_cached_data != NULL);
21342 CHECK(!new_cached_data->rejected); 22926 CHECK(!new_cached_data->rejected);
21343 } 22927 }
21344 // Compile an incompatible script with the cached data. The new script doesn't 22928 // 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 22929 // 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. 22930 // cached data will be incompatible with it and will be rejected.
21347 { 22931 {
21348 v8::Local<v8::String> incompatible_source_str = 22932 v8::Local<v8::String> incompatible_source_str =
21349 v8_str(" function foo() {}"); 22933 v8_str(" function foo() {}");
21350 v8::ScriptCompiler::Source source_with_cached_data( 22934 v8::ScriptCompiler::Source source_with_cached_data(
21351 incompatible_source_str, origin, 22935 incompatible_source_str, origin,
21352 new v8::ScriptCompiler::CachedData(original_cached_data->data, 22936 new v8::ScriptCompiler::CachedData(original_cached_data->data,
21353 original_cached_data->length)); 22937 original_cached_data->length));
21354 v8::Handle<v8::Script> script = 22938 v8::Local<v8::Script> script =
21355 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data, 22939 v8::ScriptCompiler::Compile(CcTest::isolate(), &source_with_cached_data,
21356 v8::ScriptCompiler::kConsumeParserCache); 22940 v8::ScriptCompiler::kConsumeParserCache);
21357 CHECK(!script.IsEmpty()); 22941 CHECK(!script.IsEmpty());
21358 const v8::ScriptCompiler::CachedData* new_cached_data = 22942 const v8::ScriptCompiler::CachedData* new_cached_data =
21359 source_with_cached_data.GetCachedData(); 22943 source_with_cached_data.GetCachedData();
21360 CHECK(new_cached_data != NULL); 22944 CHECK(new_cached_data != NULL);
21361 CHECK(new_cached_data->rejected); 22945 CHECK(new_cached_data->rejected);
21362 } 22946 }
21363 } 22947 }
21364 22948
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
21413 CHECK_EQ(should_be_neuterable, result->IsNeuterable()); 22997 CHECK_EQ(should_be_neuterable, result->IsNeuterable());
21414 } 22998 }
21415 22999
21416 23000
21417 TEST(GetPrototypeAccessControl) { 23001 TEST(GetPrototypeAccessControl) {
21418 i::FLAG_allow_natives_syntax = true; 23002 i::FLAG_allow_natives_syntax = true;
21419 v8::Isolate* isolate = CcTest::isolate(); 23003 v8::Isolate* isolate = CcTest::isolate();
21420 v8::HandleScope handle_scope(isolate); 23004 v8::HandleScope handle_scope(isolate);
21421 LocalContext env; 23005 LocalContext env;
21422 23006
21423 v8::Handle<v8::ObjectTemplate> obj_template = 23007 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
21424 v8::ObjectTemplate::New(isolate);
21425 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked); 23008 obj_template->SetAccessCheckCallback(AccessAlwaysBlocked);
21426 23009
21427 env->Global()->Set(v8_str("prohibited"), obj_template->NewInstance()); 23010 CHECK(env->Global()
23011 ->Set(env.local(), v8_str("prohibited"),
23012 obj_template->NewInstance(env.local()).ToLocalChecked())
23013 .FromJust());
21428 23014
21429 CHECK(CompileRun( 23015 CHECK(CompileRun(
21430 "function f() { return %_GetPrototype(prohibited); }" 23016 "function f() { return %_GetPrototype(prohibited); }"
21431 "%OptimizeFunctionOnNextCall(f);" 23017 "%OptimizeFunctionOnNextCall(f);"
21432 "f();")->IsNull()); 23018 "f();")->IsNull());
21433 } 23019 }
21434 23020
21435 23021
21436 TEST(GetPrototypeHidden) { 23022 TEST(GetPrototypeHidden) {
21437 i::FLAG_allow_natives_syntax = true; 23023 i::FLAG_allow_natives_syntax = true;
21438 v8::Isolate* isolate = CcTest::isolate(); 23024 v8::Isolate* isolate = CcTest::isolate();
21439 v8::HandleScope handle_scope(isolate); 23025 v8::HandleScope handle_scope(isolate);
21440 LocalContext env; 23026 LocalContext env;
21441 23027
21442 Handle<FunctionTemplate> t = FunctionTemplate::New(isolate); 23028 Local<FunctionTemplate> t = FunctionTemplate::New(isolate);
21443 t->SetHiddenPrototype(true); 23029 t->SetHiddenPrototype(true);
21444 Handle<Object> proto = t->GetFunction()->NewInstance(); 23030 Local<Object> proto = t->GetFunction(env.local())
21445 Handle<Object> object = Object::New(isolate); 23031 .ToLocalChecked()
21446 Handle<Object> proto2 = Object::New(isolate); 23032 ->NewInstance(env.local())
23033 .ToLocalChecked();
23034 Local<Object> object = Object::New(isolate);
23035 Local<Object> proto2 = Object::New(isolate);
21447 object->SetPrototype(proto); 23036 object->SetPrototype(proto);
21448 proto->SetPrototype(proto2); 23037 proto->SetPrototype(proto2);
21449 23038
21450 env->Global()->Set(v8_str("object"), object); 23039 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust());
21451 env->Global()->Set(v8_str("proto"), proto); 23040 CHECK(env->Global()->Set(env.local(), v8_str("proto"), proto).FromJust());
21452 env->Global()->Set(v8_str("proto2"), proto2); 23041 CHECK(env->Global()->Set(env.local(), v8_str("proto2"), proto2).FromJust());
21453 23042
21454 v8::Handle<v8::Value> result = CompileRun("%_GetPrototype(object)"); 23043 v8::Local<v8::Value> result = CompileRun("%_GetPrototype(object)");
21455 CHECK(result->Equals(proto2)); 23044 CHECK(result->Equals(proto2));
21456 23045
21457 result = CompileRun( 23046 result = CompileRun(
21458 "function f() { return %_GetPrototype(object); }" 23047 "function f() { return %_GetPrototype(object); }"
21459 "%OptimizeFunctionOnNextCall(f);" 23048 "%OptimizeFunctionOnNextCall(f);"
21460 "f()"); 23049 "f()");
21461 CHECK(result->Equals(proto2)); 23050 CHECK(result->Equals(proto2));
21462 } 23051 }
21463 23052
21464 23053
21465 TEST(ClassPrototypeCreationContext) { 23054 TEST(ClassPrototypeCreationContext) {
21466 v8::Isolate* isolate = CcTest::isolate(); 23055 v8::Isolate* isolate = CcTest::isolate();
21467 v8::HandleScope handle_scope(isolate); 23056 v8::HandleScope handle_scope(isolate);
21468 LocalContext env; 23057 LocalContext env;
21469 23058
21470 Handle<Object> result = Handle<Object>::Cast( 23059 Local<Object> result = Local<Object>::Cast(
21471 CompileRun("'use strict'; class Example { }; Example.prototype")); 23060 CompileRun("'use strict'; class Example { }; Example.prototype"));
21472 CHECK(env.local() == result->CreationContext()); 23061 CHECK(env.local() == result->CreationContext());
21473 } 23062 }
21474 23063
21475 23064
21476 TEST(SimpleStreamingScriptWithSourceURL) { 23065 TEST(SimpleStreamingScriptWithSourceURL) {
21477 const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo();\n", 23066 const char* chunks[] = {"function foo() { ret", "urn 13; } f", "oo();\n",
21478 "//# sourceURL=bar2.js\n", NULL}; 23067 "//# sourceURL=bar2.js\n", NULL};
21479 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, true, 23068 RunStreamingTest(chunks, v8::ScriptCompiler::StreamedSource::UTF8, true,
21480 "bar2.js"); 23069 "bar2.js");
(...skipping 20 matching lines...) Expand all
21501 v8::Isolate* isolate = CcTest::isolate(); 23090 v8::Isolate* isolate = CcTest::isolate();
21502 v8::HandleScope handle_scope(isolate); 23091 v8::HandleScope handle_scope(isolate);
21503 const int length = i::String::kMaxLength + 1; 23092 const int length = i::String::kMaxLength + 1;
21504 const int buffer_size = length * sizeof(uint16_t); 23093 const int buffer_size = length * sizeof(uint16_t);
21505 void* buffer = malloc(buffer_size); 23094 void* buffer = malloc(buffer_size);
21506 if (buffer == NULL) return; 23095 if (buffer == NULL) return;
21507 memset(buffer, 'A', buffer_size); 23096 memset(buffer, 'A', buffer_size);
21508 { 23097 {
21509 v8::TryCatch try_catch(isolate); 23098 v8::TryCatch try_catch(isolate);
21510 char* data = reinterpret_cast<char*>(buffer); 23099 char* data = reinterpret_cast<char*>(buffer);
21511 CHECK(v8::String::NewFromUtf8(isolate, data, v8::String::kNormalString, 23100 CHECK(v8::String::NewFromUtf8(isolate, data, v8::NewStringType::kNormal,
21512 length).IsEmpty()); 23101 length)
23102 .IsEmpty());
21513 CHECK(!try_catch.HasCaught()); 23103 CHECK(!try_catch.HasCaught());
21514 } 23104 }
21515 { 23105 {
21516 v8::TryCatch try_catch(isolate); 23106 v8::TryCatch try_catch(isolate);
21517 uint8_t* data = reinterpret_cast<uint8_t*>(buffer); 23107 uint8_t* data = reinterpret_cast<uint8_t*>(buffer);
21518 CHECK(v8::String::NewFromOneByte(isolate, data, v8::String::kNormalString, 23108 CHECK(v8::String::NewFromOneByte(isolate, data, v8::NewStringType::kNormal,
21519 length).IsEmpty()); 23109 length)
23110 .IsEmpty());
21520 CHECK(!try_catch.HasCaught()); 23111 CHECK(!try_catch.HasCaught());
21521 } 23112 }
21522 { 23113 {
21523 v8::TryCatch try_catch(isolate); 23114 v8::TryCatch try_catch(isolate);
21524 uint16_t* data = reinterpret_cast<uint16_t*>(buffer); 23115 uint16_t* data = reinterpret_cast<uint16_t*>(buffer);
21525 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::String::kNormalString, 23116 CHECK(v8::String::NewFromTwoByte(isolate, data, v8::NewStringType::kNormal,
21526 length).IsEmpty()); 23117 length)
23118 .IsEmpty());
21527 CHECK(!try_catch.HasCaught()); 23119 CHECK(!try_catch.HasCaught());
21528 } 23120 }
21529 free(buffer); 23121 free(buffer);
21530 } 23122 }
21531 23123
21532 23124
21533 TEST(SealHandleScope) { 23125 TEST(SealHandleScope) {
21534 v8::Isolate* isolate = CcTest::isolate(); 23126 v8::Isolate* isolate = CcTest::isolate();
21535 v8::HandleScope handle_scope(isolate); 23127 v8::HandleScope handle_scope(isolate);
21536 LocalContext env; 23128 LocalContext env;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
21576 Local<v8::Object> accessed_object) { 23168 Local<v8::Object> accessed_object) {
21577 access_was_called = true; 23169 access_was_called = true;
21578 return false; 23170 return false;
21579 } 23171 }
21580 23172
21581 23173
21582 TEST(StrongModeAccessCheckAllowed) { 23174 TEST(StrongModeAccessCheckAllowed) {
21583 i::FLAG_strong_mode = true; 23175 i::FLAG_strong_mode = true;
21584 v8::Isolate* isolate = CcTest::isolate(); 23176 v8::Isolate* isolate = CcTest::isolate();
21585 v8::HandleScope handle_scope(isolate); 23177 v8::HandleScope handle_scope(isolate);
21586 v8::Handle<Value> value; 23178 v8::Local<Value> value;
21587 access_was_called = false; 23179 access_was_called = false;
21588 23180
21589 v8::Handle<v8::ObjectTemplate> obj_template = 23181 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
21590 v8::ObjectTemplate::New(isolate);
21591 23182
21592 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 23183 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
21593 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag); 23184 obj_template->SetAccessCheckCallback(AccessAlwaysAllowedWithFlag);
21594 23185
21595 // Create an environment 23186 // Create an environment
21596 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 23187 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
21597 context0->Enter(); 23188 context0->Enter();
21598 v8::Handle<v8::Object> global0 = context0->Global(); 23189 v8::Local<v8::Object> global0 = context0->Global();
21599 global0->Set(v8_str("object"), obj_template->NewInstance()); 23190 global0->Set(v8_str("object"),
23191 obj_template->NewInstance(context0).ToLocalChecked());
21600 { 23192 {
21601 v8::TryCatch try_catch(isolate); 23193 v8::TryCatch try_catch(isolate);
21602 value = CompileRun("'use strong'; object.x"); 23194 value = CompileRun("'use strong'; object.x");
21603 CHECK(!try_catch.HasCaught()); 23195 CHECK(!try_catch.HasCaught());
21604 CHECK(!access_was_called); 23196 CHECK(!access_was_called);
21605 CHECK_EQ(42, value->Int32Value()); 23197 CHECK_EQ(42, value->Int32Value(context0).FromJust());
21606 } 23198 }
21607 { 23199 {
21608 v8::TryCatch try_catch(isolate); 23200 v8::TryCatch try_catch(isolate);
21609 value = CompileRun("'use strong'; object.foo"); 23201 value = CompileRun("'use strong'; object.foo");
21610 CHECK(try_catch.HasCaught()); 23202 CHECK(try_catch.HasCaught());
21611 CHECK(!access_was_called); 23203 CHECK(!access_was_called);
21612 } 23204 }
21613 { 23205 {
21614 v8::TryCatch try_catch(isolate); 23206 v8::TryCatch try_catch(isolate);
21615 value = CompileRun("'use strong'; object[10]"); 23207 value = CompileRun("'use strong'; object[10]");
21616 CHECK(try_catch.HasCaught()); 23208 CHECK(try_catch.HasCaught());
21617 CHECK(!access_was_called); 23209 CHECK(!access_was_called);
21618 } 23210 }
21619 23211
21620 // Create an environment 23212 // Create an environment
21621 v8::Local<Context> context1 = Context::New(isolate); 23213 v8::Local<Context> context1 = Context::New(isolate);
21622 context1->Enter(); 23214 context1->Enter();
21623 v8::Handle<v8::Object> global1 = context1->Global(); 23215 v8::Local<v8::Object> global1 = context1->Global();
21624 global1->Set(v8_str("object"), obj_template->NewInstance()); 23216 global1->Set(v8_str("object"),
23217 obj_template->NewInstance(context1).ToLocalChecked());
21625 { 23218 {
21626 v8::TryCatch try_catch(isolate); 23219 v8::TryCatch try_catch(isolate);
21627 value = CompileRun("'use strong'; object.x"); 23220 value = CompileRun("'use strong'; object.x");
21628 CHECK(!try_catch.HasCaught()); 23221 CHECK(!try_catch.HasCaught());
21629 CHECK(access_was_called); 23222 CHECK(access_was_called);
21630 CHECK_EQ(42, value->Int32Value()); 23223 CHECK_EQ(42, value->Int32Value(context1).FromJust());
21631 } 23224 }
21632 access_was_called = false; 23225 access_was_called = false;
21633 { 23226 {
21634 v8::TryCatch try_catch(isolate); 23227 v8::TryCatch try_catch(isolate);
21635 value = CompileRun("'use strong'; object.foo"); 23228 value = CompileRun("'use strong'; object.foo");
21636 CHECK(try_catch.HasCaught()); 23229 CHECK(try_catch.HasCaught());
21637 CHECK(access_was_called); 23230 CHECK(access_was_called);
21638 } 23231 }
21639 access_was_called = false; 23232 access_was_called = false;
21640 { 23233 {
21641 v8::TryCatch try_catch(isolate); 23234 v8::TryCatch try_catch(isolate);
21642 value = CompileRun("'use strong'; object[10]"); 23235 value = CompileRun("'use strong'; object[10]");
21643 CHECK(try_catch.HasCaught()); 23236 CHECK(try_catch.HasCaught());
21644 CHECK(access_was_called); 23237 CHECK(access_was_called);
21645 } 23238 }
21646 23239
21647 context1->Exit(); 23240 context1->Exit();
21648 context0->Exit(); 23241 context0->Exit();
21649 } 23242 }
21650 23243
21651 23244
21652 TEST(StrongModeAccessCheckBlocked) { 23245 TEST(StrongModeAccessCheckBlocked) {
21653 i::FLAG_strong_mode = true; 23246 i::FLAG_strong_mode = true;
21654 v8::Isolate* isolate = CcTest::isolate(); 23247 v8::Isolate* isolate = CcTest::isolate();
21655 v8::HandleScope handle_scope(isolate); 23248 v8::HandleScope handle_scope(isolate);
21656 v8::Handle<Value> value; 23249 v8::Local<Value> value;
21657 access_was_called = false; 23250 access_was_called = false;
21658 23251
21659 v8::Handle<v8::ObjectTemplate> obj_template = 23252 v8::Local<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(isolate);
21660 v8::ObjectTemplate::New(isolate);
21661 23253
21662 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42)); 23254 obj_template->Set(v8_str("x"), v8::Integer::New(isolate, 42));
21663 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag); 23255 obj_template->SetAccessCheckCallback(AccessAlwaysBlockedWithFlag);
21664 23256
21665 // Create an environment 23257 // Create an environment
21666 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); 23258 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template);
21667 context0->Enter(); 23259 context0->Enter();
21668 v8::Handle<v8::Object> global0 = context0->Global(); 23260 v8::Local<v8::Object> global0 = context0->Global();
21669 global0->Set(v8_str("object"), obj_template->NewInstance()); 23261 global0->Set(v8_str("object"),
23262 obj_template->NewInstance(context0).ToLocalChecked());
21670 { 23263 {
21671 v8::TryCatch try_catch(isolate); 23264 v8::TryCatch try_catch(isolate);
21672 value = CompileRun("'use strong'; object.x"); 23265 value = CompileRun("'use strong'; object.x");
21673 CHECK(!try_catch.HasCaught()); 23266 CHECK(!try_catch.HasCaught());
21674 CHECK(!access_was_called); 23267 CHECK(!access_was_called);
21675 CHECK_EQ(42, value->Int32Value()); 23268 CHECK_EQ(42, value->Int32Value(context0).FromJust());
21676 } 23269 }
21677 { 23270 {
21678 v8::TryCatch try_catch(isolate); 23271 v8::TryCatch try_catch(isolate);
21679 value = CompileRun("'use strong'; object.foo"); 23272 value = CompileRun("'use strong'; object.foo");
21680 CHECK(try_catch.HasCaught()); 23273 CHECK(try_catch.HasCaught());
21681 CHECK(!access_was_called); 23274 CHECK(!access_was_called);
21682 } 23275 }
21683 { 23276 {
21684 v8::TryCatch try_catch(isolate); 23277 v8::TryCatch try_catch(isolate);
21685 value = CompileRun("'use strong'; object[10]"); 23278 value = CompileRun("'use strong'; object[10]");
21686 CHECK(try_catch.HasCaught()); 23279 CHECK(try_catch.HasCaught());
21687 CHECK(!access_was_called); 23280 CHECK(!access_was_called);
21688 } 23281 }
21689 23282
21690 // Create an environment 23283 // Create an environment
21691 v8::Local<Context> context1 = Context::New(isolate); 23284 v8::Local<Context> context1 = Context::New(isolate);
21692 context1->Enter(); 23285 context1->Enter();
21693 v8::Handle<v8::Object> global1 = context1->Global(); 23286 v8::Local<v8::Object> global1 = context1->Global();
21694 global1->Set(v8_str("object"), obj_template->NewInstance()); 23287 global1->Set(v8_str("object"),
23288 obj_template->NewInstance(context1).ToLocalChecked());
21695 { 23289 {
21696 v8::TryCatch try_catch(isolate); 23290 v8::TryCatch try_catch(isolate);
21697 value = CompileRun("'use strong'; object.x"); 23291 value = CompileRun("'use strong'; object.x");
21698 CHECK(try_catch.HasCaught()); 23292 CHECK(try_catch.HasCaught());
21699 CHECK(access_was_called); 23293 CHECK(access_was_called);
21700 } 23294 }
21701 access_was_called = false; 23295 access_was_called = false;
21702 { 23296 {
21703 v8::TryCatch try_catch(isolate); 23297 v8::TryCatch try_catch(isolate);
21704 value = CompileRun("'use strong'; object.foo"); 23298 value = CompileRun("'use strong'; object.foo");
(...skipping 29 matching lines...) Expand all
21734 } 23328 }
21735 23329
21736 { 23330 {
21737 v8::TryCatch try_catch(isolate); 23331 v8::TryCatch try_catch(isolate);
21738 fun->Call(v8::Undefined(isolate), 0, nullptr); 23332 fun->Call(v8::Undefined(isolate), 0, nullptr);
21739 CHECK(try_catch.HasCaught()); 23333 CHECK(try_catch.HasCaught());
21740 } 23334 }
21741 23335
21742 { 23336 {
21743 v8::TryCatch try_catch(isolate); 23337 v8::TryCatch try_catch(isolate);
21744 v8::Handle<Value> args[] = {v8_num(42)}; 23338 v8::Local<Value> args[] = {v8_num(42)};
21745 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23339 fun->Call(v8::Undefined(isolate), arraysize(args), args);
21746 CHECK(!try_catch.HasCaught()); 23340 CHECK(!try_catch.HasCaught());
21747 } 23341 }
21748 23342
21749 { 23343 {
21750 v8::TryCatch try_catch(isolate); 23344 v8::TryCatch try_catch(isolate);
21751 v8::Handle<Value> args[] = {v8_num(42), v8_num(555)}; 23345 v8::Local<Value> args[] = {v8_num(42), v8_num(555)};
21752 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23346 fun->Call(v8::Undefined(isolate), arraysize(args), args);
21753 CHECK(!try_catch.HasCaught()); 23347 CHECK(!try_catch.HasCaught());
21754 } 23348 }
21755 } 23349 }
21756 23350
21757 23351
21758 TEST(StrongModeArityCallFromApi2) { 23352 TEST(StrongModeArityCallFromApi2) {
21759 i::FLAG_strong_mode = true; 23353 i::FLAG_strong_mode = true;
21760 LocalContext env; 23354 LocalContext env;
21761 v8::Isolate* isolate = env->GetIsolate(); 23355 v8::Isolate* isolate = env->GetIsolate();
(...skipping 10 matching lines...) Expand all
21772 } 23366 }
21773 23367
21774 { 23368 {
21775 v8::TryCatch try_catch(isolate); 23369 v8::TryCatch try_catch(isolate);
21776 fun->Call(v8::Undefined(isolate), 0, nullptr); 23370 fun->Call(v8::Undefined(isolate), 0, nullptr);
21777 CHECK(try_catch.HasCaught()); 23371 CHECK(try_catch.HasCaught());
21778 } 23372 }
21779 23373
21780 { 23374 {
21781 v8::TryCatch try_catch(isolate); 23375 v8::TryCatch try_catch(isolate);
21782 v8::Handle<Value> args[] = {v8_num(42)}; 23376 v8::Local<Value> args[] = {v8_num(42)};
21783 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23377 fun->Call(v8::Undefined(isolate), arraysize(args), args);
21784 CHECK(!try_catch.HasCaught()); 23378 CHECK(!try_catch.HasCaught());
21785 } 23379 }
21786 23380
21787 { 23381 {
21788 v8::TryCatch try_catch(isolate); 23382 v8::TryCatch try_catch(isolate);
21789 v8::Handle<Value> args[] = {v8_num(42), v8_num(555)}; 23383 v8::Local<Value> args[] = {v8_num(42), v8_num(555)};
21790 fun->Call(v8::Undefined(isolate), arraysize(args), args); 23384 fun->Call(v8::Undefined(isolate), arraysize(args), args);
21791 CHECK(!try_catch.HasCaught()); 23385 CHECK(!try_catch.HasCaught());
21792 } 23386 }
21793 } 23387 }
21794 23388
21795 23389
21796 TEST(StrongObjectDelete) { 23390 TEST(StrongObjectDelete) {
21797 i::FLAG_strong_mode = true; 23391 i::FLAG_strong_mode = true;
21798 LocalContext env; 23392 LocalContext env;
21799 v8::Isolate* isolate = env->GetIsolate(); 23393 v8::Isolate* isolate = env->GetIsolate();
(...skipping 10 matching lines...) Expand all
21810 obj->ForceSet(v8_str("2"), v8_num(1), v8::None); 23404 obj->ForceSet(v8_str("2"), v8_num(1), v8::None);
21811 CHECK(obj->HasOwnProperty(v8_str("foo"))); 23405 CHECK(obj->HasOwnProperty(v8_str("foo")));
21812 CHECK(obj->HasOwnProperty(v8_str("2"))); 23406 CHECK(obj->HasOwnProperty(v8_str("2")));
21813 CHECK(!obj->Delete(v8_str("foo"))); 23407 CHECK(!obj->Delete(v8_str("foo")));
21814 CHECK(!obj->Delete(2)); 23408 CHECK(!obj->Delete(2));
21815 } 23409 }
21816 23410
21817 23411
21818 static void ExtrasBindingTestRuntimeFunction( 23412 static void ExtrasBindingTestRuntimeFunction(
21819 const v8::FunctionCallbackInfo<v8::Value>& args) { 23413 const v8::FunctionCallbackInfo<v8::Value>& args) {
21820 CHECK_EQ(3, args[0]->Int32Value()); 23414 CHECK_EQ(
23415 3,
23416 args[0]->Int32Value(args.GetIsolate()->GetCurrentContext()).FromJust());
21821 args.GetReturnValue().Set(v8_num(7)); 23417 args.GetReturnValue().Set(v8_num(7));
21822 } 23418 }
21823 23419
21824 23420
21825 TEST(ExtrasBindingObject) { 23421 TEST(ExtrasBindingObject) {
21826 v8::Isolate* isolate = CcTest::isolate(); 23422 v8::Isolate* isolate = CcTest::isolate();
21827 v8::HandleScope handle_scope(isolate); 23423 v8::HandleScope handle_scope(isolate);
21828 LocalContext env; 23424 LocalContext env;
21829 23425
21830 // standalone.gypi ensures we include the test-extra.js file, which should 23426 // standalone.gypi ensures we include the test-extra.js file, which should
21831 // export the tested functions. 23427 // export the tested functions.
21832 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23428 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
21833 23429
21834 auto func = 23430 auto func =
21835 binding->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>(); 23431 binding->Get(v8_str("testExtraShouldReturnFive")).As<v8::Function>();
21836 auto undefined = v8::Undefined(isolate); 23432 auto undefined = v8::Undefined(isolate);
21837 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); 23433 auto result = func->Call(undefined, 0, {}).As<v8::Number>();
21838 CHECK_EQ(5, result->Int32Value()); 23434 CHECK_EQ(5, result->Int32Value(env.local()).FromJust());
21839 23435
21840 v8::Handle<v8::FunctionTemplate> runtimeFunction = 23436 v8::Local<v8::FunctionTemplate> runtimeFunction =
21841 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); 23437 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction);
21842 binding->Set(v8_str("runtime"), runtimeFunction->GetFunction()); 23438 binding->Set(v8_str("runtime"),
23439 runtimeFunction->GetFunction(env.local()).ToLocalChecked());
21843 func = 23440 func =
21844 binding->Get(v8_str("testExtraShouldCallToRuntime")).As<v8::Function>(); 23441 binding->Get(v8_str("testExtraShouldCallToRuntime")).As<v8::Function>();
21845 result = func->Call(undefined, 0, {}).As<v8::Number>(); 23442 result = func->Call(undefined, 0, {}).As<v8::Number>();
21846 CHECK_EQ(7, result->Int32Value()); 23443 CHECK_EQ(7, result->Int32Value(env.local()).FromJust());
21847 } 23444 }
21848 23445
21849 23446
21850 TEST(ExperimentalExtras) { 23447 TEST(ExperimentalExtras) {
21851 i::FLAG_experimental_extras = true; 23448 i::FLAG_experimental_extras = true;
21852 23449
21853 v8::Isolate* isolate = CcTest::isolate(); 23450 v8::Isolate* isolate = CcTest::isolate();
21854 v8::HandleScope handle_scope(isolate); 23451 v8::HandleScope handle_scope(isolate);
21855 LocalContext env; 23452 LocalContext env;
21856 23453
21857 // standalone.gypi ensures we include the test-experimental-extra.js file, 23454 // standalone.gypi ensures we include the test-experimental-extra.js file,
21858 // which should export the tested functions. 23455 // which should export the tested functions.
21859 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23456 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
21860 23457
21861 auto func = binding->Get(v8_str("testExperimentalExtraShouldReturnTen")) 23458 auto func = binding->Get(v8_str("testExperimentalExtraShouldReturnTen"))
21862 .As<v8::Function>(); 23459 .As<v8::Function>();
21863 auto undefined = v8::Undefined(isolate); 23460 auto undefined = v8::Undefined(isolate);
21864 auto result = func->Call(undefined, 0, {}).As<v8::Number>(); 23461 auto result = func->Call(undefined, 0, {}).As<v8::Number>();
21865 CHECK_EQ(10, result->Int32Value()); 23462 CHECK_EQ(10, result->Int32Value(env.local()).FromJust());
21866 23463
21867 v8::Handle<v8::FunctionTemplate> runtimeFunction = 23464 v8::Local<v8::FunctionTemplate> runtimeFunction =
21868 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction); 23465 v8::FunctionTemplate::New(isolate, ExtrasBindingTestRuntimeFunction);
21869 binding->Set(v8_str("runtime"), runtimeFunction->GetFunction()); 23466 binding->Set(v8_str("runtime"),
23467 runtimeFunction->GetFunction(env.local()).ToLocalChecked());
21870 func = binding->Get(v8_str("testExperimentalExtraShouldCallToRuntime")) 23468 func = binding->Get(v8_str("testExperimentalExtraShouldCallToRuntime"))
21871 .As<v8::Function>(); 23469 .As<v8::Function>();
21872 result = func->Call(undefined, 0, {}).As<v8::Number>(); 23470 result = func->Call(undefined, 0, {}).As<v8::Number>();
21873 CHECK_EQ(7, result->Int32Value()); 23471 CHECK_EQ(7, result->Int32Value(env.local()).FromJust());
21874 } 23472 }
21875 23473
21876 23474
21877 TEST(ExtrasUtilsObject) { 23475 TEST(ExtrasUtilsObject) {
21878 LocalContext context; 23476 LocalContext context;
21879 v8::Isolate* isolate = context->GetIsolate(); 23477 v8::Isolate* isolate = context->GetIsolate();
21880 v8::HandleScope handle_scope(isolate); 23478 v8::HandleScope handle_scope(isolate);
21881 23479
21882 LocalContext env; 23480 LocalContext env;
21883 v8::Local<v8::Object> binding = env->GetExtrasBindingObject(); 23481 v8::Local<v8::Object> binding = env->GetExtrasBindingObject();
21884 23482
21885 auto func = binding->Get(v8_str("testExtraCanUseUtils")).As<v8::Function>(); 23483 auto func = binding->Get(v8_str("testExtraCanUseUtils")).As<v8::Function>();
21886 auto undefined = v8::Undefined(isolate); 23484 auto undefined = v8::Undefined(isolate);
21887 auto result = func->Call(undefined, 0, {}).As<v8::Object>(); 23485 auto result = func->Call(undefined, 0, {}).As<v8::Object>();
21888 23486
21889 auto private_symbol = result->Get(v8_str("privateSymbol")).As<v8::Symbol>(); 23487 auto private_symbol = result->Get(v8_str("privateSymbol")).As<v8::Symbol>();
21890 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol); 23488 i::Handle<i::Symbol> ips = v8::Utils::OpenHandle(*private_symbol);
21891 CHECK_EQ(true, ips->IsPrivate()); 23489 CHECK_EQ(true, ips->IsPrivate());
21892 23490
21893 CompileRun("var result = 0; function store(x) { result = x; }"); 23491 CompileRun("var result = 0; function store(x) { result = x; }");
21894 auto store = CompileRun("store").As<v8::Function>(); 23492 auto store = CompileRun("store").As<v8::Function>();
21895 23493
21896 auto fulfilled_promise = 23494 auto fulfilled_promise =
21897 result->Get(v8_str("fulfilledPromise")).As<v8::Promise>(); 23495 result->Get(v8_str("fulfilledPromise")).As<v8::Promise>();
21898 fulfilled_promise->Then(store); 23496 fulfilled_promise->Then(store);
21899 isolate->RunMicrotasks(); 23497 isolate->RunMicrotasks();
21900 CHECK_EQ(1, CompileRun("result")->Int32Value()); 23498 CHECK_EQ(1, CompileRun("result")->Int32Value(env.local()).FromJust());
21901 23499
21902 auto fulfilled_promise_2 = 23500 auto fulfilled_promise_2 =
21903 result->Get(v8_str("fulfilledPromise2")).As<v8::Promise>(); 23501 result->Get(v8_str("fulfilledPromise2")).As<v8::Promise>();
21904 fulfilled_promise_2->Then(store); 23502 fulfilled_promise_2->Then(store);
21905 isolate->RunMicrotasks(); 23503 isolate->RunMicrotasks();
21906 CHECK_EQ(2, CompileRun("result")->Int32Value()); 23504 CHECK_EQ(2, CompileRun("result")->Int32Value(env.local()).FromJust());
21907 23505
21908 auto rejected_promise = 23506 auto rejected_promise =
21909 result->Get(v8_str("rejectedPromise")).As<v8::Promise>(); 23507 result->Get(v8_str("rejectedPromise")).As<v8::Promise>();
21910 rejected_promise->Catch(store); 23508 rejected_promise->Catch(store);
21911 isolate->RunMicrotasks(); 23509 isolate->RunMicrotasks();
21912 CHECK_EQ(3, CompileRun("result")->Int32Value()); 23510 CHECK_EQ(3, CompileRun("result")->Int32Value(env.local()).FromJust());
21913 } 23511 }
21914 23512
21915 23513
21916 TEST(Map) { 23514 TEST(Map) {
21917 v8::Isolate* isolate = CcTest::isolate(); 23515 v8::Isolate* isolate = CcTest::isolate();
21918 v8::HandleScope handle_scope(isolate); 23516 v8::HandleScope handle_scope(isolate);
21919 LocalContext env; 23517 LocalContext env;
21920 23518
21921 v8::Local<v8::Map> map = v8::Map::New(isolate); 23519 v8::Local<v8::Map> map = v8::Map::New(isolate);
21922 CHECK(map->IsObject()); 23520 CHECK(map->IsObject());
(...skipping 16 matching lines...) Expand all
21939 CHECK_EQ(2U, map->Size()); 23537 CHECK_EQ(2U, map->Size());
21940 23538
21941 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust()); 23539 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 1)).FromJust());
21942 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust()); 23540 CHECK(map->Has(env.local(), v8::Integer::New(isolate, 3)).FromJust());
21943 23541
21944 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust()); 23542 CHECK(!map->Has(env.local(), v8::Integer::New(isolate, 2)).FromJust());
21945 CHECK(!map->Has(env.local(), map).FromJust()); 23543 CHECK(!map->Has(env.local(), map).FromJust());
21946 23544
21947 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1)) 23545 CHECK_EQ(2, map->Get(env.local(), v8::Integer::New(isolate, 1))
21948 .ToLocalChecked() 23546 .ToLocalChecked()
21949 ->Int32Value()); 23547 ->Int32Value(env.local())
23548 .FromJust());
21950 CHECK_EQ(4, map->Get(env.local(), v8::Integer::New(isolate, 3)) 23549 CHECK_EQ(4, map->Get(env.local(), v8::Integer::New(isolate, 3))
21951 .ToLocalChecked() 23550 .ToLocalChecked()
21952 ->Int32Value()); 23551 ->Int32Value(env.local())
23552 .FromJust());
21953 23553
21954 CHECK(map->Get(env.local(), v8::Integer::New(isolate, 42)) 23554 CHECK(map->Get(env.local(), v8::Integer::New(isolate, 42))
21955 .ToLocalChecked() 23555 .ToLocalChecked()
21956 ->IsUndefined()); 23556 ->IsUndefined());
21957 23557
21958 CHECK(!map->Set(env.local(), map, map).IsEmpty()); 23558 CHECK(!map->Set(env.local(), map, map).IsEmpty());
21959 CHECK_EQ(3U, map->Size()); 23559 CHECK_EQ(3U, map->Size());
21960 CHECK(map->Has(env.local(), map).FromJust()); 23560 CHECK(map->Has(env.local(), map).FromJust());
21961 23561
21962 CHECK(map->Delete(env.local(), map).FromJust()); 23562 CHECK(map->Delete(env.local(), map).FromJust());
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
22016 v8::Isolate* isolate = CcTest::isolate(); 23616 v8::Isolate* isolate = CcTest::isolate();
22017 v8::HandleScope scope(isolate); 23617 v8::HandleScope scope(isolate);
22018 v8::Local<v8::FunctionTemplate> parent = FunctionTemplate::New(isolate); 23618 v8::Local<v8::FunctionTemplate> parent = FunctionTemplate::New(isolate);
22019 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, parent); 23619 v8::Local<v8::Signature> signature = v8::Signature::New(isolate, parent);
22020 auto returns_42 = 23620 auto returns_42 =
22021 v8::FunctionTemplate::New(isolate, Returns42, Local<Value>(), signature); 23621 v8::FunctionTemplate::New(isolate, Returns42, Local<Value>(), signature);
22022 parent->PrototypeTemplate()->SetAccessorProperty(v8_str("age"), returns_42); 23622 parent->PrototypeTemplate()->SetAccessorProperty(v8_str("age"), returns_42);
22023 v8::Local<v8::FunctionTemplate> child = v8::FunctionTemplate::New(isolate); 23623 v8::Local<v8::FunctionTemplate> child = v8::FunctionTemplate::New(isolate);
22024 child->Inherit(parent); 23624 child->Inherit(parent);
22025 LocalContext env; 23625 LocalContext env;
22026 env->Global()->Set(v8_str("Child"), child->GetFunction()); 23626 CHECK(env->Global()
23627 ->Set(env.local(), v8_str("Child"),
23628 child->GetFunction(env.local()).ToLocalChecked())
23629 .FromJust());
22027 23630
22028 // Make sure there's a compiled stub for "Child.prototype.age" in the cache. 23631 // Make sure there's a compiled stub for "Child.prototype.age" in the cache.
22029 CompileRun( 23632 CompileRun(
22030 "var real = new Child();\n" 23633 "var real = new Child();\n"
22031 "for (var i = 0; i < 3; ++i) {\n" 23634 "for (var i = 0; i < 3; ++i) {\n"
22032 " real.age;\n" 23635 " real.age;\n"
22033 "}\n"); 23636 "}\n");
22034 23637
22035 // Check that the cached stub is never used. 23638 // Check that the cached stub is never used.
22036 ExpectInt32( 23639 ExpectInt32(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
22099 23702
22100 bool NoAbortOnUncaughtException(v8::Isolate* isolate) { 23703 bool NoAbortOnUncaughtException(v8::Isolate* isolate) {
22101 ++nb_uncaught_exception_callback_calls; 23704 ++nb_uncaught_exception_callback_calls;
22102 return false; 23705 return false;
22103 } 23706 }
22104 23707
22105 23708
22106 TEST(AbortOnUncaughtExceptionNoAbort) { 23709 TEST(AbortOnUncaughtExceptionNoAbort) {
22107 v8::Isolate* isolate = CcTest::isolate(); 23710 v8::Isolate* isolate = CcTest::isolate();
22108 v8::HandleScope handle_scope(isolate); 23711 v8::HandleScope handle_scope(isolate);
22109 v8::Handle<v8::ObjectTemplate> global_template = 23712 v8::Local<v8::ObjectTemplate> global_template =
22110 v8::ObjectTemplate::New(isolate); 23713 v8::ObjectTemplate::New(isolate);
22111 LocalContext env(NULL, global_template); 23714 LocalContext env(NULL, global_template);
22112 23715
22113 i::FLAG_abort_on_uncaught_exception = true; 23716 i::FLAG_abort_on_uncaught_exception = true;
22114 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException); 23717 isolate->SetAbortOnUncaughtExceptionCallback(NoAbortOnUncaughtException);
22115 23718
22116 CompileRun("function boom() { throw new Error(\"boom\") }"); 23719 CompileRun("function boom() { throw new Error(\"boom\") }");
22117 23720
22118 v8::Local<v8::Object> global_object = env->Global(); 23721 v8::Local<v8::Object> global_object = env->Global();
22119 v8::Local<v8::Function> foo = 23722 v8::Local<v8::Function> foo =
22120 v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom"))); 23723 v8::Local<v8::Function>::Cast(global_object->Get(v8_str("boom")));
22121 23724
22122 foo->Call(global_object, 0, NULL); 23725 foo->Call(global_object, 0, NULL);
22123 23726
22124 CHECK_EQ(1, nb_uncaught_exception_callback_calls); 23727 CHECK_EQ(1, nb_uncaught_exception_callback_calls);
22125 } 23728 }
22126 23729
22127 23730
22128 TEST(AccessCheckedIsConcatSpreadable) { 23731 TEST(AccessCheckedIsConcatSpreadable) {
22129 i::FLAG_harmony_concat_spreadable = true; 23732 i::FLAG_harmony_concat_spreadable = true;
22130 v8::Isolate* isolate = CcTest::isolate(); 23733 v8::Isolate* isolate = CcTest::isolate();
22131 HandleScope scope(isolate); 23734 HandleScope scope(isolate);
22132 LocalContext env; 23735 LocalContext env;
22133 23736
22134 // Object with access check 23737 // Object with access check
22135 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate); 23738 Local<ObjectTemplate> spreadable_template = v8::ObjectTemplate::New(isolate);
22136 spreadable_template->SetAccessCheckCallback(AccessBlocker); 23739 spreadable_template->SetAccessCheckCallback(AccessBlocker);
22137 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate), 23740 spreadable_template->Set(v8::Symbol::GetIsConcatSpreadable(isolate),
22138 v8::Boolean::New(isolate, true)); 23741 v8::Boolean::New(isolate, true));
22139 Local<Object> object = spreadable_template->NewInstance(); 23742 Local<Object> object =
23743 spreadable_template->NewInstance(env.local()).ToLocalChecked();
22140 23744
22141 allowed_access = true; 23745 allowed_access = true;
22142 env->Global()->Set(v8_str("object"), object); 23746 CHECK(env->Global()->Set(env.local(), v8_str("object"), object).FromJust());
22143 object->Set(v8_str("length"), v8_num(2)); 23747 object->Set(v8_str("length"), v8_num(2));
22144 object->Set(0U, v8_str("a")); 23748 object->Set(0U, v8_str("a"));
22145 object->Set(1U, v8_str("b")); 23749 object->Set(1U, v8_str("b"));
22146 23750
22147 // Access check is allowed, and the object is spread 23751 // Access check is allowed, and the object is spread
22148 CompileRun("var result = [].concat(object)"); 23752 CompileRun("var result = [].concat(object)");
22149 ExpectTrue("Array.isArray(result)"); 23753 ExpectTrue("Array.isArray(result)");
22150 ExpectString("result[0]", "a"); 23754 ExpectString("result[0]", "a");
22151 ExpectString("result[1]", "b"); 23755 ExpectString("result[1]", "b");
22152 ExpectTrue("result.length === 2"); 23756 ExpectTrue("result.length === 2");
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
22201 23805
22202 23806
22203 TEST(ObjectTemplateIntrinsics) { 23807 TEST(ObjectTemplateIntrinsics) {
22204 v8::Isolate* isolate = CcTest::isolate(); 23808 v8::Isolate* isolate = CcTest::isolate();
22205 v8::HandleScope scope(isolate); 23809 v8::HandleScope scope(isolate);
22206 LocalContext env; 23810 LocalContext env;
22207 23811
22208 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate); 23812 Local<ObjectTemplate> object_template = v8::ObjectTemplate::New(isolate);
22209 object_template->SetIntrinsicDataProperty(v8_str("values"), 23813 object_template->SetIntrinsicDataProperty(v8_str("values"),
22210 v8::kArrayProto_values); 23814 v8::kArrayProto_values);
22211 Local<Object> object = object_template->NewInstance(); 23815 Local<Object> object =
23816 object_template->NewInstance(env.local()).ToLocalChecked();
22212 23817
22213 env->Global()->Set(v8_str("obj1"), object); 23818 CHECK(env->Global()->Set(env.local(), v8_str("obj1"), object).FromJust());
22214 ExpectString("typeof obj1.values", "function"); 23819 ExpectString("typeof obj1.values", "function");
22215 23820
22216 auto values = Local<Function>::Cast(object->Get(v8_str("values"))); 23821 auto values = Local<Function>::Cast(object->Get(v8_str("values")));
22217 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values)); 23822 auto fn = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values));
22218 auto ctx = v8::Utils::OpenHandle(*env.local()); 23823 auto ctx = v8::Utils::OpenHandle(*env.local());
22219 CHECK_EQ(fn->GetCreationContext(), *ctx); 23824 CHECK_EQ(fn->GetCreationContext(), *ctx);
22220 23825
22221 { 23826 {
22222 LocalContext env2; 23827 LocalContext env2;
22223 Local<Object> object2 = object_template->NewInstance(); 23828 Local<Object> object2 =
22224 env2->Global()->Set(v8_str("obj2"), object2); 23829 object_template->NewInstance(env2.local()).ToLocalChecked();
23830 CHECK(
23831 env2->Global()->Set(env2.local(), v8_str("obj2"), object2).FromJust());
22225 ExpectString("typeof obj2.values", "function"); 23832 ExpectString("typeof obj2.values", "function");
22226 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values"))); 23833 CHECK_NE(*object->Get(v8_str("values")), *object2->Get(v8_str("values")));
22227 23834
22228 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values"))); 23835 auto values2 = Local<Function>::Cast(object2->Get(v8_str("values")));
22229 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2)); 23836 auto fn2 = i::Handle<i::JSFunction>::cast(v8::Utils::OpenHandle(*values2));
22230 auto ctx2 = v8::Utils::OpenHandle(*env2.local()); 23837 auto ctx2 = v8::Utils::OpenHandle(*env2.local());
22231 CHECK_EQ(fn2->GetCreationContext(), *ctx2); 23838 CHECK_EQ(fn2->GetCreationContext(), *ctx2);
22232 } 23839 }
22233 } 23840 }
OLDNEW
« no previous file with comments | « test/cctest/cctest.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698