OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 CHECK_EQ(10, signature_callback_count); | 245 CHECK_EQ(10, signature_callback_count); |
246 } else { | 246 } else { |
247 CHECK_EQ(v8_str("TypeError: Illegal invocation"), | 247 CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
248 try_catch.Exception()->ToString()); | 248 try_catch.Exception()->ToString()); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 | 252 |
253 THREADED_TEST(ReceiverSignature) { | 253 THREADED_TEST(ReceiverSignature) { |
254 LocalContext env; | 254 LocalContext env; |
255 v8::HandleScope scope(env->GetIsolate()); | 255 v8::Isolate* isolate = env->GetIsolate(); |
| 256 v8::HandleScope scope(isolate); |
256 // Setup templates. | 257 // Setup templates. |
257 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); | 258 v8::Handle<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
258 v8::Handle<v8::Signature> sig = v8::Signature::New(env->GetIsolate(), fun); | 259 v8::Handle<v8::Signature> sig = v8::Signature::New(isolate, fun); |
259 v8::Handle<v8::FunctionTemplate> callback_sig = | 260 v8::Handle<v8::FunctionTemplate> callback_sig = |
260 v8::FunctionTemplate::New( | 261 v8::FunctionTemplate::New( |
261 IncrementingSignatureCallback, Local<Value>(), sig); | 262 isolate, IncrementingSignatureCallback, Local<Value>(), sig); |
262 v8::Handle<v8::FunctionTemplate> callback = | 263 v8::Handle<v8::FunctionTemplate> callback = |
263 v8::FunctionTemplate::New(IncrementingSignatureCallback); | 264 v8::FunctionTemplate::New(isolate, IncrementingSignatureCallback); |
264 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(); | 265 v8::Handle<v8::FunctionTemplate> sub_fun = v8::FunctionTemplate::New(isolate); |
265 sub_fun->Inherit(fun); | 266 sub_fun->Inherit(fun); |
266 v8::Handle<v8::FunctionTemplate> unrel_fun = v8::FunctionTemplate::New(); | 267 v8::Handle<v8::FunctionTemplate> unrel_fun = |
| 268 v8::FunctionTemplate::New(isolate); |
267 // Install properties. | 269 // Install properties. |
268 v8::Handle<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); | 270 v8::Handle<v8::ObjectTemplate> fun_proto = fun->PrototypeTemplate(); |
269 fun_proto->Set(v8_str("prop_sig"), callback_sig); | 271 fun_proto->Set(v8_str("prop_sig"), callback_sig); |
270 fun_proto->Set(v8_str("prop"), callback); | 272 fun_proto->Set(v8_str("prop"), callback); |
271 fun_proto->SetAccessorProperty( | 273 fun_proto->SetAccessorProperty( |
272 v8_str("accessor_sig"), callback_sig, callback_sig); | 274 v8_str("accessor_sig"), callback_sig, callback_sig); |
273 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); | 275 fun_proto->SetAccessorProperty(v8_str("accessor"), callback, callback); |
274 // Instantiate templates. | 276 // Instantiate templates. |
275 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); | 277 Local<Value> fun_instance = fun->InstanceTemplate()->NewInstance(); |
276 Local<Value> sub_fun_instance = sub_fun->InstanceTemplate()->NewInstance(); | 278 Local<Value> sub_fun_instance = sub_fun->InstanceTemplate()->NewInstance(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 TestSignature("test_object.accessor_sig;", test_object); | 320 TestSignature("test_object.accessor_sig;", test_object); |
319 TestSignature("test_object[accessor_sig_key];", test_object); | 321 TestSignature("test_object[accessor_sig_key];", test_object); |
320 TestSignature("test_object.accessor_sig = 1;", test_object); | 322 TestSignature("test_object.accessor_sig = 1;", test_object); |
321 TestSignature("test_object[accessor_sig_key] = 1;", test_object); | 323 TestSignature("test_object[accessor_sig_key] = 1;", test_object); |
322 } | 324 } |
323 } | 325 } |
324 | 326 |
325 | 327 |
326 THREADED_TEST(ArgumentSignature) { | 328 THREADED_TEST(ArgumentSignature) { |
327 LocalContext env; | 329 LocalContext env; |
328 v8::HandleScope scope(env->GetIsolate()); | 330 v8::Isolate* isolate = env->GetIsolate(); |
329 v8::Handle<v8::FunctionTemplate> cons = v8::FunctionTemplate::New(); | 331 v8::HandleScope scope(isolate); |
| 332 v8::Handle<v8::FunctionTemplate> cons = v8::FunctionTemplate::New(isolate); |
330 cons->SetClassName(v8_str("Cons")); | 333 cons->SetClassName(v8_str("Cons")); |
331 v8::Handle<v8::Signature> sig = v8::Signature::New( | 334 v8::Handle<v8::Signature> sig = v8::Signature::New( |
332 env->GetIsolate(), v8::Handle<v8::FunctionTemplate>(), 1, &cons); | 335 isolate, v8::Handle<v8::FunctionTemplate>(), 1, &cons); |
333 v8::Handle<v8::FunctionTemplate> fun = | 336 v8::Handle<v8::FunctionTemplate> fun = |
334 v8::FunctionTemplate::New(SignatureCallback, v8::Handle<Value>(), sig); | 337 v8::FunctionTemplate::New(isolate, |
| 338 SignatureCallback, |
| 339 v8::Handle<Value>(), |
| 340 sig); |
335 env->Global()->Set(v8_str("Cons"), cons->GetFunction()); | 341 env->Global()->Set(v8_str("Cons"), cons->GetFunction()); |
336 env->Global()->Set(v8_str("Fun1"), fun->GetFunction()); | 342 env->Global()->Set(v8_str("Fun1"), fun->GetFunction()); |
337 | 343 |
338 v8::Handle<Value> value1 = CompileRun("Fun1(4) == '';"); | 344 v8::Handle<Value> value1 = CompileRun("Fun1(4) == '';"); |
339 CHECK(value1->IsTrue()); | 345 CHECK(value1->IsTrue()); |
340 | 346 |
341 v8::Handle<Value> value2 = CompileRun("Fun1(new Cons()) == '[object Cons]';"); | 347 v8::Handle<Value> value2 = CompileRun("Fun1(new Cons()) == '[object Cons]';"); |
342 CHECK(value2->IsTrue()); | 348 CHECK(value2->IsTrue()); |
343 | 349 |
344 v8::Handle<Value> value3 = CompileRun("Fun1() == '';"); | 350 v8::Handle<Value> value3 = CompileRun("Fun1() == '';"); |
345 CHECK(value3->IsTrue()); | 351 CHECK(value3->IsTrue()); |
346 | 352 |
347 v8::Handle<v8::FunctionTemplate> cons1 = v8::FunctionTemplate::New(); | 353 v8::Handle<v8::FunctionTemplate> cons1 = v8::FunctionTemplate::New(isolate); |
348 cons1->SetClassName(v8_str("Cons1")); | 354 cons1->SetClassName(v8_str("Cons1")); |
349 v8::Handle<v8::FunctionTemplate> cons2 = v8::FunctionTemplate::New(); | 355 v8::Handle<v8::FunctionTemplate> cons2 = v8::FunctionTemplate::New(isolate); |
350 cons2->SetClassName(v8_str("Cons2")); | 356 cons2->SetClassName(v8_str("Cons2")); |
351 v8::Handle<v8::FunctionTemplate> cons3 = v8::FunctionTemplate::New(); | 357 v8::Handle<v8::FunctionTemplate> cons3 = v8::FunctionTemplate::New(isolate); |
352 cons3->SetClassName(v8_str("Cons3")); | 358 cons3->SetClassName(v8_str("Cons3")); |
353 | 359 |
354 v8::Handle<v8::FunctionTemplate> args[3] = { cons1, cons2, cons3 }; | 360 v8::Handle<v8::FunctionTemplate> args[3] = { cons1, cons2, cons3 }; |
355 v8::Handle<v8::Signature> wsig = v8::Signature::New( | 361 v8::Handle<v8::Signature> wsig = v8::Signature::New( |
356 env->GetIsolate(), v8::Handle<v8::FunctionTemplate>(), 3, args); | 362 isolate, v8::Handle<v8::FunctionTemplate>(), 3, args); |
357 v8::Handle<v8::FunctionTemplate> fun2 = | 363 v8::Handle<v8::FunctionTemplate> fun2 = |
358 v8::FunctionTemplate::New(SignatureCallback, v8::Handle<Value>(), wsig); | 364 v8::FunctionTemplate::New(isolate, |
| 365 SignatureCallback, |
| 366 v8::Handle<Value>(), |
| 367 wsig); |
359 | 368 |
360 env->Global()->Set(v8_str("Cons1"), cons1->GetFunction()); | 369 env->Global()->Set(v8_str("Cons1"), cons1->GetFunction()); |
361 env->Global()->Set(v8_str("Cons2"), cons2->GetFunction()); | 370 env->Global()->Set(v8_str("Cons2"), cons2->GetFunction()); |
362 env->Global()->Set(v8_str("Cons3"), cons3->GetFunction()); | 371 env->Global()->Set(v8_str("Cons3"), cons3->GetFunction()); |
363 env->Global()->Set(v8_str("Fun2"), fun2->GetFunction()); | 372 env->Global()->Set(v8_str("Fun2"), fun2->GetFunction()); |
364 v8::Handle<Value> value4 = CompileRun( | 373 v8::Handle<Value> value4 = CompileRun( |
365 "Fun2(new Cons1(), new Cons2(), new Cons3()) ==" | 374 "Fun2(new Cons1(), new Cons2(), new Cons3()) ==" |
366 "'[object Cons1],[object Cons2],[object Cons3]'"); | 375 "'[object Cons1],[object Cons2],[object Cons3]'"); |
367 CHECK(value4->IsTrue()); | 376 CHECK(value4->IsTrue()); |
368 | 377 |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 info.GetReturnValue().Set(v8_num(239)); | 1022 info.GetReturnValue().Set(v8_num(239)); |
1014 } | 1023 } |
1015 | 1024 |
1016 | 1025 |
1017 template<typename Handler> | 1026 template<typename Handler> |
1018 static void TestFunctionTemplateInitializer(Handler handler, | 1027 static void TestFunctionTemplateInitializer(Handler handler, |
1019 Handler handler_2) { | 1028 Handler handler_2) { |
1020 // Test constructor calls. | 1029 // Test constructor calls. |
1021 { | 1030 { |
1022 LocalContext env; | 1031 LocalContext env; |
1023 v8::HandleScope scope(env->GetIsolate()); | 1032 v8::Isolate* isolate = env->GetIsolate(); |
| 1033 v8::HandleScope scope(isolate); |
1024 | 1034 |
1025 Local<v8::FunctionTemplate> fun_templ = | 1035 Local<v8::FunctionTemplate> fun_templ = |
1026 v8::FunctionTemplate::New(handler); | 1036 v8::FunctionTemplate::New(isolate, handler); |
1027 Local<Function> fun = fun_templ->GetFunction(); | 1037 Local<Function> fun = fun_templ->GetFunction(); |
1028 env->Global()->Set(v8_str("obj"), fun); | 1038 env->Global()->Set(v8_str("obj"), fun); |
1029 Local<Script> script = v8_compile("obj()"); | 1039 Local<Script> script = v8_compile("obj()"); |
1030 for (int i = 0; i < 30; i++) { | 1040 for (int i = 0; i < 30; i++) { |
1031 CHECK_EQ(102, script->Run()->Int32Value()); | 1041 CHECK_EQ(102, script->Run()->Int32Value()); |
1032 } | 1042 } |
1033 } | 1043 } |
1034 // Use SetCallHandler to initialize a function template, should work like | 1044 // Use SetCallHandler to initialize a function template, should work like |
1035 // the previous one. | 1045 // the previous one. |
1036 { | 1046 { |
1037 LocalContext env; | 1047 LocalContext env; |
1038 v8::HandleScope scope(env->GetIsolate()); | 1048 v8::Isolate* isolate = env->GetIsolate(); |
| 1049 v8::HandleScope scope(isolate); |
1039 | 1050 |
1040 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 1051 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
1041 fun_templ->SetCallHandler(handler_2); | 1052 fun_templ->SetCallHandler(handler_2); |
1042 Local<Function> fun = fun_templ->GetFunction(); | 1053 Local<Function> fun = fun_templ->GetFunction(); |
1043 env->Global()->Set(v8_str("obj"), fun); | 1054 env->Global()->Set(v8_str("obj"), fun); |
1044 Local<Script> script = v8_compile("obj()"); | 1055 Local<Script> script = v8_compile("obj()"); |
1045 for (int i = 0; i < 30; i++) { | 1056 for (int i = 0; i < 30; i++) { |
1046 CHECK_EQ(102, script->Run()->Int32Value()); | 1057 CHECK_EQ(102, script->Run()->Int32Value()); |
1047 } | 1058 } |
1048 } | 1059 } |
1049 } | 1060 } |
1050 | 1061 |
1051 | 1062 |
1052 template<typename Constructor, typename Accessor> | 1063 template<typename Constructor, typename Accessor> |
1053 static void TestFunctionTemplateAccessor(Constructor constructor, | 1064 static void TestFunctionTemplateAccessor(Constructor constructor, |
1054 Accessor accessor) { | 1065 Accessor accessor) { |
1055 LocalContext env; | 1066 LocalContext env; |
1056 v8::HandleScope scope(env->GetIsolate()); | 1067 v8::HandleScope scope(env->GetIsolate()); |
1057 | 1068 |
1058 Local<v8::FunctionTemplate> fun_templ = | 1069 Local<v8::FunctionTemplate> fun_templ = |
1059 v8::FunctionTemplate::New(constructor); | 1070 v8::FunctionTemplate::New(env->GetIsolate(), constructor); |
1060 fun_templ->SetClassName(v8_str("funky")); | 1071 fun_templ->SetClassName(v8_str("funky")); |
1061 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); | 1072 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); |
1062 Local<Function> fun = fun_templ->GetFunction(); | 1073 Local<Function> fun = fun_templ->GetFunction(); |
1063 env->Global()->Set(v8_str("obj"), fun); | 1074 env->Global()->Set(v8_str("obj"), fun); |
1064 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); | 1075 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); |
1065 CHECK_EQ(v8_str("[object funky]"), result); | 1076 CHECK_EQ(v8_str("[object funky]"), result); |
1066 CompileRun("var obj_instance = new obj();"); | 1077 CompileRun("var obj_instance = new obj();"); |
1067 Local<Script> script; | 1078 Local<Script> script; |
1068 script = v8_compile("obj_instance.x"); | 1079 script = v8_compile("obj_instance.x"); |
1069 for (int i = 0; i < 30; i++) { | 1080 for (int i = 0; i < 30; i++) { |
(...skipping 19 matching lines...) Expand all Loading... |
1089 } | 1100 } |
1090 | 1101 |
1091 | 1102 |
1092 template<typename Callback> | 1103 template<typename Callback> |
1093 static void TestSimpleCallback(Callback callback) { | 1104 static void TestSimpleCallback(Callback callback) { |
1094 LocalContext env; | 1105 LocalContext env; |
1095 v8::HandleScope scope(env->GetIsolate()); | 1106 v8::HandleScope scope(env->GetIsolate()); |
1096 | 1107 |
1097 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 1108 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
1098 object_template->Set(env->GetIsolate(), "callback", | 1109 object_template->Set(env->GetIsolate(), "callback", |
1099 v8::FunctionTemplate::New(callback)); | 1110 v8::FunctionTemplate::New(env->GetIsolate(), callback)); |
1100 v8::Local<v8::Object> object = object_template->NewInstance(); | 1111 v8::Local<v8::Object> object = object_template->NewInstance(); |
1101 (*env)->Global()->Set(v8_str("callback_object"), object); | 1112 (*env)->Global()->Set(v8_str("callback_object"), object); |
1102 v8::Handle<v8::Script> script; | 1113 v8::Handle<v8::Script> script; |
1103 script = v8_compile("callback_object.callback(17)"); | 1114 script = v8_compile("callback_object.callback(17)"); |
1104 for (int i = 0; i < 30; i++) { | 1115 for (int i = 0; i < 30; i++) { |
1105 CHECK_EQ(51424, script->Run()->Int32Value()); | 1116 CHECK_EQ(51424, script->Run()->Int32Value()); |
1106 } | 1117 } |
1107 script = v8_compile("callback_object.callback(17, 24)"); | 1118 script = v8_compile("callback_object.callback(17, 24)"); |
1108 for (int i = 0; i < 30; i++) { | 1119 for (int i = 0; i < 30; i++) { |
1109 CHECK_EQ(51425, script->Run()->Int32Value()); | 1120 CHECK_EQ(51425, script->Run()->Int32Value()); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1192 info.GetReturnValue().Set(object); | 1203 info.GetReturnValue().Set(object); |
1193 } | 1204 } |
1194 | 1205 |
1195 template<typename T> | 1206 template<typename T> |
1196 Handle<Value> TestFastReturnValues() { | 1207 Handle<Value> TestFastReturnValues() { |
1197 LocalContext env; | 1208 LocalContext env; |
1198 v8::EscapableHandleScope scope(env->GetIsolate()); | 1209 v8::EscapableHandleScope scope(env->GetIsolate()); |
1199 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 1210 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
1200 v8::FunctionCallback callback = &FastReturnValueCallback<T>; | 1211 v8::FunctionCallback callback = &FastReturnValueCallback<T>; |
1201 object_template->Set(env->GetIsolate(), "callback", | 1212 object_template->Set(env->GetIsolate(), "callback", |
1202 v8::FunctionTemplate::New(callback)); | 1213 v8::FunctionTemplate::New(env->GetIsolate(), callback)); |
1203 v8::Local<v8::Object> object = object_template->NewInstance(); | 1214 v8::Local<v8::Object> object = object_template->NewInstance(); |
1204 (*env)->Global()->Set(v8_str("callback_object"), object); | 1215 (*env)->Global()->Set(v8_str("callback_object"), object); |
1205 return scope.Escape(CompileRun("callback_object.callback()")); | 1216 return scope.Escape(CompileRun("callback_object.callback()")); |
1206 } | 1217 } |
1207 | 1218 |
1208 | 1219 |
1209 THREADED_PROFILED_TEST(FastReturnValues) { | 1220 THREADED_PROFILED_TEST(FastReturnValues) { |
1210 LocalContext env; | 1221 LocalContext env; |
1211 v8::HandleScope scope(CcTest::isolate()); | 1222 v8::HandleScope scope(CcTest::isolate()); |
1212 v8::Handle<v8::Value> value; | 1223 v8::Handle<v8::Value> value; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 value = TestFastReturnValues<Object>(); | 1279 value = TestFastReturnValues<Object>(); |
1269 CHECK(value->IsObject()); | 1280 CHECK(value->IsObject()); |
1270 fast_return_value_object_is_empty = true; | 1281 fast_return_value_object_is_empty = true; |
1271 value = TestFastReturnValues<Object>(); | 1282 value = TestFastReturnValues<Object>(); |
1272 CHECK(value->IsUndefined()); | 1283 CHECK(value->IsUndefined()); |
1273 } | 1284 } |
1274 | 1285 |
1275 | 1286 |
1276 THREADED_TEST(FunctionTemplateSetLength) { | 1287 THREADED_TEST(FunctionTemplateSetLength) { |
1277 LocalContext env; | 1288 LocalContext env; |
1278 v8::HandleScope scope(env->GetIsolate()); | 1289 v8::Isolate* isolate = env->GetIsolate(); |
| 1290 v8::HandleScope scope(isolate); |
1279 { | 1291 { |
1280 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New( | 1292 Local<v8::FunctionTemplate> fun_templ = |
1281 handle_callback, Handle<v8::Value>(), Handle<v8::Signature>(), 23); | 1293 v8::FunctionTemplate::New(isolate, |
| 1294 handle_callback, |
| 1295 Handle<v8::Value>(), |
| 1296 Handle<v8::Signature>(), |
| 1297 23); |
1282 Local<Function> fun = fun_templ->GetFunction(); | 1298 Local<Function> fun = fun_templ->GetFunction(); |
1283 env->Global()->Set(v8_str("obj"), fun); | 1299 env->Global()->Set(v8_str("obj"), fun); |
1284 Local<Script> script = v8_compile("obj.length"); | 1300 Local<Script> script = v8_compile("obj.length"); |
1285 CHECK_EQ(23, script->Run()->Int32Value()); | 1301 CHECK_EQ(23, script->Run()->Int32Value()); |
1286 } | 1302 } |
1287 { | 1303 { |
1288 Local<v8::FunctionTemplate> fun_templ = | 1304 Local<v8::FunctionTemplate> fun_templ = |
1289 v8::FunctionTemplate::New(handle_callback); | 1305 v8::FunctionTemplate::New(isolate, handle_callback); |
1290 fun_templ->SetLength(22); | 1306 fun_templ->SetLength(22); |
1291 Local<Function> fun = fun_templ->GetFunction(); | 1307 Local<Function> fun = fun_templ->GetFunction(); |
1292 env->Global()->Set(v8_str("obj"), fun); | 1308 env->Global()->Set(v8_str("obj"), fun); |
1293 Local<Script> script = v8_compile("obj.length"); | 1309 Local<Script> script = v8_compile("obj.length"); |
1294 CHECK_EQ(22, script->Run()->Int32Value()); | 1310 CHECK_EQ(22, script->Run()->Int32Value()); |
1295 } | 1311 } |
1296 { | 1312 { |
1297 // Without setting length it defaults to 0. | 1313 // Without setting length it defaults to 0. |
1298 Local<v8::FunctionTemplate> fun_templ = | 1314 Local<v8::FunctionTemplate> fun_templ = |
1299 v8::FunctionTemplate::New(handle_callback); | 1315 v8::FunctionTemplate::New(isolate, handle_callback); |
1300 Local<Function> fun = fun_templ->GetFunction(); | 1316 Local<Function> fun = fun_templ->GetFunction(); |
1301 env->Global()->Set(v8_str("obj"), fun); | 1317 env->Global()->Set(v8_str("obj"), fun); |
1302 Local<Script> script = v8_compile("obj.length"); | 1318 Local<Script> script = v8_compile("obj.length"); |
1303 CHECK_EQ(0, script->Run()->Int32Value()); | 1319 CHECK_EQ(0, script->Run()->Int32Value()); |
1304 } | 1320 } |
1305 } | 1321 } |
1306 | 1322 |
1307 | 1323 |
1308 static void* expected_ptr; | 1324 static void* expected_ptr; |
1309 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1325 static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1310 void* ptr = v8::External::Cast(*args.Data())->Value(); | 1326 void* ptr = v8::External::Cast(*args.Data())->Value(); |
1311 CHECK_EQ(expected_ptr, ptr); | 1327 CHECK_EQ(expected_ptr, ptr); |
1312 args.GetReturnValue().Set(true); | 1328 args.GetReturnValue().Set(true); |
1313 } | 1329 } |
1314 | 1330 |
1315 | 1331 |
1316 static void TestExternalPointerWrapping() { | 1332 static void TestExternalPointerWrapping() { |
1317 LocalContext env; | 1333 LocalContext env; |
1318 v8::HandleScope scope(env->GetIsolate()); | 1334 v8::Isolate* isolate = env->GetIsolate(); |
| 1335 v8::HandleScope scope(isolate); |
1319 | 1336 |
1320 v8::Handle<v8::Value> data = | 1337 v8::Handle<v8::Value> data = |
1321 v8::External::New(env->GetIsolate(), expected_ptr); | 1338 v8::External::New(isolate, expected_ptr); |
1322 | 1339 |
1323 v8::Handle<v8::Object> obj = v8::Object::New(); | 1340 v8::Handle<v8::Object> obj = v8::Object::New(); |
1324 obj->Set(v8_str("func"), | 1341 obj->Set(v8_str("func"), |
1325 v8::FunctionTemplate::New(callback, data)->GetFunction()); | 1342 v8::FunctionTemplate::New(isolate, callback, data)->GetFunction()); |
1326 env->Global()->Set(v8_str("obj"), obj); | 1343 env->Global()->Set(v8_str("obj"), obj); |
1327 | 1344 |
1328 CHECK(CompileRun( | 1345 CHECK(CompileRun( |
1329 "function foo() {\n" | 1346 "function foo() {\n" |
1330 " for (var i = 0; i < 13; i++) obj.func();\n" | 1347 " for (var i = 0; i < 13; i++) obj.func();\n" |
1331 "}\n" | 1348 "}\n" |
1332 "foo(), true")->BooleanValue()); | 1349 "foo(), true")->BooleanValue()); |
1333 } | 1350 } |
1334 | 1351 |
1335 | 1352 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1374 TestExternalPointerWrapping(); | 1391 TestExternalPointerWrapping(); |
1375 | 1392 |
1376 expected_ptr = reinterpret_cast<void*>(0xdeadbeefdeadbeef + 1); | 1393 expected_ptr = reinterpret_cast<void*>(0xdeadbeefdeadbeef + 1); |
1377 TestExternalPointerWrapping(); | 1394 TestExternalPointerWrapping(); |
1378 #endif | 1395 #endif |
1379 } | 1396 } |
1380 | 1397 |
1381 | 1398 |
1382 THREADED_TEST(FindInstanceInPrototypeChain) { | 1399 THREADED_TEST(FindInstanceInPrototypeChain) { |
1383 LocalContext env; | 1400 LocalContext env; |
1384 v8::HandleScope scope(env->GetIsolate()); | 1401 v8::Isolate* isolate = env->GetIsolate(); |
| 1402 v8::HandleScope scope(isolate); |
1385 | 1403 |
1386 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(); | 1404 Local<v8::FunctionTemplate> base = v8::FunctionTemplate::New(isolate); |
1387 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(); | 1405 Local<v8::FunctionTemplate> derived = v8::FunctionTemplate::New(isolate); |
1388 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(); | 1406 Local<v8::FunctionTemplate> other = v8::FunctionTemplate::New(isolate); |
1389 derived->Inherit(base); | 1407 derived->Inherit(base); |
1390 | 1408 |
1391 Local<v8::Function> base_function = base->GetFunction(); | 1409 Local<v8::Function> base_function = base->GetFunction(); |
1392 Local<v8::Function> derived_function = derived->GetFunction(); | 1410 Local<v8::Function> derived_function = derived->GetFunction(); |
1393 Local<v8::Function> other_function = other->GetFunction(); | 1411 Local<v8::Function> other_function = other->GetFunction(); |
1394 | 1412 |
1395 Local<v8::Object> base_instance = base_function->NewInstance(); | 1413 Local<v8::Object> base_instance = base_function->NewInstance(); |
1396 Local<v8::Object> derived_instance = derived_function->NewInstance(); | 1414 Local<v8::Object> derived_instance = derived_function->NewInstance(); |
1397 Local<v8::Object> derived_instance2 = derived_function->NewInstance(); | 1415 Local<v8::Object> derived_instance2 = derived_function->NewInstance(); |
1398 Local<v8::Object> other_instance = other_function->NewInstance(); | 1416 Local<v8::Object> other_instance = other_function->NewInstance(); |
(...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1749 | 1767 |
1750 | 1768 |
1751 static void GetM(Local<String> name, | 1769 static void GetM(Local<String> name, |
1752 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1770 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1753 ApiTestFuzzer::Fuzz(); | 1771 ApiTestFuzzer::Fuzz(); |
1754 info.GetReturnValue().Set(v8_num(876)); | 1772 info.GetReturnValue().Set(v8_num(876)); |
1755 } | 1773 } |
1756 | 1774 |
1757 | 1775 |
1758 THREADED_TEST(GlobalPrototype) { | 1776 THREADED_TEST(GlobalPrototype) { |
1759 v8::HandleScope scope(CcTest::isolate()); | 1777 v8::Isolate* isolate = CcTest::isolate(); |
1760 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); | 1778 v8::HandleScope scope(isolate); |
| 1779 v8::Handle<v8::FunctionTemplate> func_templ = |
| 1780 v8::FunctionTemplate::New(isolate); |
1761 func_templ->PrototypeTemplate()->Set( | 1781 func_templ->PrototypeTemplate()->Set( |
1762 CcTest::isolate(), "dummy", v8::FunctionTemplate::New(DummyCallHandler)); | 1782 isolate, "dummy", v8::FunctionTemplate::New(isolate, DummyCallHandler)); |
1763 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); | 1783 v8::Handle<ObjectTemplate> templ = func_templ->InstanceTemplate(); |
1764 templ->Set(CcTest::isolate(), "x", v8_num(200)); | 1784 templ->Set(isolate, "x", v8_num(200)); |
1765 templ->SetAccessor(v8_str("m"), GetM); | 1785 templ->SetAccessor(v8_str("m"), GetM); |
1766 LocalContext env(0, templ); | 1786 LocalContext env(0, templ); |
1767 v8::Handle<Script> script(v8_compile("dummy()")); | 1787 v8::Handle<Script> script(v8_compile("dummy()")); |
1768 v8::Handle<Value> result(script->Run()); | 1788 v8::Handle<Value> result(script->Run()); |
1769 CHECK_EQ(13.4, result->NumberValue()); | 1789 CHECK_EQ(13.4, result->NumberValue()); |
1770 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); | 1790 CHECK_EQ(200, v8_compile("x")->Run()->Int32Value()); |
1771 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); | 1791 CHECK_EQ(876, v8_compile("m")->Run()->Int32Value()); |
1772 } | 1792 } |
1773 | 1793 |
1774 | 1794 |
1775 THREADED_TEST(ObjectTemplate) { | 1795 THREADED_TEST(ObjectTemplate) { |
1776 v8::HandleScope scope(CcTest::isolate()); | 1796 v8::Isolate* isolate = CcTest::isolate(); |
| 1797 v8::HandleScope scope(isolate); |
1777 Local<ObjectTemplate> templ1 = ObjectTemplate::New(); | 1798 Local<ObjectTemplate> templ1 = ObjectTemplate::New(); |
1778 templ1->Set(CcTest::isolate(), "x", v8_num(10)); | 1799 templ1->Set(isolate, "x", v8_num(10)); |
1779 templ1->Set(CcTest::isolate(), "y", v8_num(13)); | 1800 templ1->Set(isolate, "y", v8_num(13)); |
1780 LocalContext env; | 1801 LocalContext env; |
1781 Local<v8::Object> instance1 = templ1->NewInstance(); | 1802 Local<v8::Object> instance1 = templ1->NewInstance(); |
1782 env->Global()->Set(v8_str("p"), instance1); | 1803 env->Global()->Set(v8_str("p"), instance1); |
1783 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); | 1804 CHECK(v8_compile("(p.x == 10)")->Run()->BooleanValue()); |
1784 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); | 1805 CHECK(v8_compile("(p.y == 13)")->Run()->BooleanValue()); |
1785 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(); | 1806 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
1786 fun->PrototypeTemplate()->Set(CcTest::isolate(), "nirk", v8_num(123)); | 1807 fun->PrototypeTemplate()->Set(isolate, "nirk", v8_num(123)); |
1787 Local<ObjectTemplate> templ2 = fun->InstanceTemplate(); | 1808 Local<ObjectTemplate> templ2 = fun->InstanceTemplate(); |
1788 templ2->Set(CcTest::isolate(), "a", v8_num(12)); | 1809 templ2->Set(isolate, "a", v8_num(12)); |
1789 templ2->Set(CcTest::isolate(), "b", templ1); | 1810 templ2->Set(isolate, "b", templ1); |
1790 Local<v8::Object> instance2 = templ2->NewInstance(); | 1811 Local<v8::Object> instance2 = templ2->NewInstance(); |
1791 env->Global()->Set(v8_str("q"), instance2); | 1812 env->Global()->Set(v8_str("q"), instance2); |
1792 CHECK(v8_compile("(q.nirk == 123)")->Run()->BooleanValue()); | 1813 CHECK(v8_compile("(q.nirk == 123)")->Run()->BooleanValue()); |
1793 CHECK(v8_compile("(q.a == 12)")->Run()->BooleanValue()); | 1814 CHECK(v8_compile("(q.a == 12)")->Run()->BooleanValue()); |
1794 CHECK(v8_compile("(q.b.x == 10)")->Run()->BooleanValue()); | 1815 CHECK(v8_compile("(q.b.x == 10)")->Run()->BooleanValue()); |
1795 CHECK(v8_compile("(q.b.y == 13)")->Run()->BooleanValue()); | 1816 CHECK(v8_compile("(q.b.y == 13)")->Run()->BooleanValue()); |
1796 } | 1817 } |
1797 | 1818 |
1798 | 1819 |
1799 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) { | 1820 static void GetFlabby(const v8::FunctionCallbackInfo<v8::Value>& args) { |
1800 ApiTestFuzzer::Fuzz(); | 1821 ApiTestFuzzer::Fuzz(); |
1801 args.GetReturnValue().Set(v8_num(17.2)); | 1822 args.GetReturnValue().Set(v8_num(17.2)); |
1802 } | 1823 } |
1803 | 1824 |
1804 | 1825 |
1805 static void GetKnurd(Local<String> property, | 1826 static void GetKnurd(Local<String> property, |
1806 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1827 const v8::PropertyCallbackInfo<v8::Value>& info) { |
1807 ApiTestFuzzer::Fuzz(); | 1828 ApiTestFuzzer::Fuzz(); |
1808 info.GetReturnValue().Set(v8_num(15.2)); | 1829 info.GetReturnValue().Set(v8_num(15.2)); |
1809 } | 1830 } |
1810 | 1831 |
1811 | 1832 |
1812 THREADED_TEST(DescriptorInheritance) { | 1833 THREADED_TEST(DescriptorInheritance) { |
1813 v8::HandleScope scope(CcTest::isolate()); | 1834 v8::Isolate* isolate = CcTest::isolate(); |
1814 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New(); | 1835 v8::HandleScope scope(isolate); |
1815 super->PrototypeTemplate()->Set(CcTest::isolate(), "flabby", | 1836 v8::Handle<v8::FunctionTemplate> super = v8::FunctionTemplate::New(isolate); |
1816 v8::FunctionTemplate::New(GetFlabby)); | 1837 super->PrototypeTemplate()->Set(isolate, "flabby", |
1817 super->PrototypeTemplate()->Set(CcTest::isolate(), "PI", v8_num(3.14)); | 1838 v8::FunctionTemplate::New(isolate, |
| 1839 GetFlabby)); |
| 1840 super->PrototypeTemplate()->Set(isolate, "PI", v8_num(3.14)); |
1818 | 1841 |
1819 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); | 1842 super->InstanceTemplate()->SetAccessor(v8_str("knurd"), GetKnurd); |
1820 | 1843 |
1821 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(); | 1844 v8::Handle<v8::FunctionTemplate> base1 = v8::FunctionTemplate::New(isolate); |
1822 base1->Inherit(super); | 1845 base1->Inherit(super); |
1823 base1->PrototypeTemplate()->Set(CcTest::isolate(), "v1", v8_num(20.1)); | 1846 base1->PrototypeTemplate()->Set(isolate, "v1", v8_num(20.1)); |
1824 | 1847 |
1825 v8::Handle<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(); | 1848 v8::Handle<v8::FunctionTemplate> base2 = v8::FunctionTemplate::New(isolate); |
1826 base2->Inherit(super); | 1849 base2->Inherit(super); |
1827 base2->PrototypeTemplate()->Set(CcTest::isolate(), "v2", v8_num(10.1)); | 1850 base2->PrototypeTemplate()->Set(isolate, "v2", v8_num(10.1)); |
1828 | 1851 |
1829 LocalContext env; | 1852 LocalContext env; |
1830 | 1853 |
1831 env->Global()->Set(v8_str("s"), super->GetFunction()); | 1854 env->Global()->Set(v8_str("s"), super->GetFunction()); |
1832 env->Global()->Set(v8_str("base1"), base1->GetFunction()); | 1855 env->Global()->Set(v8_str("base1"), base1->GetFunction()); |
1833 env->Global()->Set(v8_str("base2"), base2->GetFunction()); | 1856 env->Global()->Set(v8_str("base2"), base2->GetFunction()); |
1834 | 1857 |
1835 // Checks right __proto__ chain. | 1858 // Checks right __proto__ chain. |
1836 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype")->BooleanValue()); | 1859 CHECK(CompileRun("base1.prototype.__proto__ == s.prototype")->BooleanValue()); |
1837 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype")->BooleanValue()); | 1860 CHECK(CompileRun("base2.prototype.__proto__ == s.prototype")->BooleanValue()); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1945 | 1968 |
1946 void AddInterceptor(Handle<FunctionTemplate> templ, | 1969 void AddInterceptor(Handle<FunctionTemplate> templ, |
1947 v8::NamedPropertyGetterCallback getter, | 1970 v8::NamedPropertyGetterCallback getter, |
1948 v8::NamedPropertySetterCallback setter) { | 1971 v8::NamedPropertySetterCallback setter) { |
1949 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); | 1972 templ->InstanceTemplate()->SetNamedPropertyHandler(getter, setter); |
1950 } | 1973 } |
1951 | 1974 |
1952 | 1975 |
1953 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { | 1976 THREADED_TEST(EmptyInterceptorDoesNotShadowAccessors) { |
1954 v8::HandleScope scope(CcTest::isolate()); | 1977 v8::HandleScope scope(CcTest::isolate()); |
1955 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 1978 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
1956 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 1979 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
1957 child->Inherit(parent); | 1980 child->Inherit(parent); |
1958 AddAccessor(parent, v8_str("age"), | 1981 AddAccessor(parent, v8_str("age"), |
1959 SimpleAccessorGetter, SimpleAccessorSetter); | 1982 SimpleAccessorGetter, SimpleAccessorSetter); |
1960 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); | 1983 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); |
1961 LocalContext env; | 1984 LocalContext env; |
1962 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 1985 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
1963 CompileRun("var child = new Child;" | 1986 CompileRun("var child = new Child;" |
1964 "child.age = 10;"); | 1987 "child.age = 10;"); |
1965 ExpectBoolean("child.hasOwnProperty('age')", false); | 1988 ExpectBoolean("child.hasOwnProperty('age')", false); |
1966 ExpectInt32("child.age", 10); | 1989 ExpectInt32("child.age", 10); |
1967 ExpectInt32("child.accessor_age", 10); | 1990 ExpectInt32("child.accessor_age", 10); |
1968 } | 1991 } |
1969 | 1992 |
1970 | 1993 |
1971 THREADED_TEST(EmptyInterceptorDoesNotShadowJSAccessors) { | 1994 THREADED_TEST(EmptyInterceptorDoesNotShadowJSAccessors) { |
1972 v8::HandleScope scope(CcTest::isolate()); | 1995 v8::Isolate* isolate = CcTest::isolate(); |
1973 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 1996 v8::HandleScope scope(isolate); |
1974 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 1997 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate); |
| 1998 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate); |
1975 child->Inherit(parent); | 1999 child->Inherit(parent); |
1976 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); | 2000 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); |
1977 LocalContext env; | 2001 LocalContext env; |
1978 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2002 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
1979 CompileRun("var child = new Child;" | 2003 CompileRun("var child = new Child;" |
1980 "var parent = child.__proto__;" | 2004 "var parent = child.__proto__;" |
1981 "Object.defineProperty(parent, 'age', " | 2005 "Object.defineProperty(parent, 'age', " |
1982 " {get: function(){ return this.accessor_age; }, " | 2006 " {get: function(){ return this.accessor_age; }, " |
1983 " set: function(v){ this.accessor_age = v; }, " | 2007 " set: function(v){ this.accessor_age = v; }, " |
1984 " enumerable: true, configurable: true});" | 2008 " enumerable: true, configurable: true});" |
1985 "child.age = 10;"); | 2009 "child.age = 10;"); |
1986 ExpectBoolean("child.hasOwnProperty('age')", false); | 2010 ExpectBoolean("child.hasOwnProperty('age')", false); |
1987 ExpectInt32("child.age", 10); | 2011 ExpectInt32("child.age", 10); |
1988 ExpectInt32("child.accessor_age", 10); | 2012 ExpectInt32("child.accessor_age", 10); |
1989 } | 2013 } |
1990 | 2014 |
1991 | 2015 |
1992 THREADED_TEST(EmptyInterceptorDoesNotAffectJSProperties) { | 2016 THREADED_TEST(EmptyInterceptorDoesNotAffectJSProperties) { |
1993 v8::HandleScope scope(CcTest::isolate()); | 2017 v8::Isolate* isolate = CcTest::isolate(); |
1994 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 2018 v8::HandleScope scope(isolate); |
1995 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 2019 Handle<FunctionTemplate> parent = FunctionTemplate::New(isolate); |
| 2020 Handle<FunctionTemplate> child = FunctionTemplate::New(isolate); |
1996 child->Inherit(parent); | 2021 child->Inherit(parent); |
1997 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); | 2022 AddInterceptor(child, EmptyInterceptorGetter, EmptyInterceptorSetter); |
1998 LocalContext env; | 2023 LocalContext env; |
1999 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2024 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2000 CompileRun("var child = new Child;" | 2025 CompileRun("var child = new Child;" |
2001 "var parent = child.__proto__;" | 2026 "var parent = child.__proto__;" |
2002 "parent.name = 'Alice';"); | 2027 "parent.name = 'Alice';"); |
2003 ExpectBoolean("child.hasOwnProperty('name')", false); | 2028 ExpectBoolean("child.hasOwnProperty('name')", false); |
2004 ExpectString("child.name", "Alice"); | 2029 ExpectString("child.name", "Alice"); |
2005 CompileRun("child.name = 'Bob';"); | 2030 CompileRun("child.name = 'Bob';"); |
2006 ExpectString("child.name", "Bob"); | 2031 ExpectString("child.name", "Bob"); |
2007 ExpectBoolean("child.hasOwnProperty('name')", true); | 2032 ExpectBoolean("child.hasOwnProperty('name')", true); |
2008 ExpectString("parent.name", "Alice"); | 2033 ExpectString("parent.name", "Alice"); |
2009 } | 2034 } |
2010 | 2035 |
2011 | 2036 |
2012 THREADED_TEST(SwitchFromInterceptorToAccessor) { | 2037 THREADED_TEST(SwitchFromInterceptorToAccessor) { |
2013 v8::HandleScope scope(CcTest::isolate()); | 2038 v8::HandleScope scope(CcTest::isolate()); |
2014 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 2039 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
2015 AddAccessor(templ, v8_str("age"), | 2040 AddAccessor(templ, v8_str("age"), |
2016 SimpleAccessorGetter, SimpleAccessorSetter); | 2041 SimpleAccessorGetter, SimpleAccessorSetter); |
2017 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 2042 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
2018 LocalContext env; | 2043 LocalContext env; |
2019 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 2044 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
2020 CompileRun("var obj = new Obj;" | 2045 CompileRun("var obj = new Obj;" |
2021 "function setAge(i){ obj.age = i; };" | 2046 "function setAge(i){ obj.age = i; };" |
2022 "for(var i = 0; i <= 10000; i++) setAge(i);"); | 2047 "for(var i = 0; i <= 10000; i++) setAge(i);"); |
2023 // All i < 10000 go to the interceptor. | 2048 // All i < 10000 go to the interceptor. |
2024 ExpectInt32("obj.interceptor_age", 9999); | 2049 ExpectInt32("obj.interceptor_age", 9999); |
2025 // The last i goes to the accessor. | 2050 // The last i goes to the accessor. |
2026 ExpectInt32("obj.accessor_age", 10000); | 2051 ExpectInt32("obj.accessor_age", 10000); |
2027 } | 2052 } |
2028 | 2053 |
2029 | 2054 |
2030 THREADED_TEST(SwitchFromAccessorToInterceptor) { | 2055 THREADED_TEST(SwitchFromAccessorToInterceptor) { |
2031 v8::HandleScope scope(CcTest::isolate()); | 2056 v8::HandleScope scope(CcTest::isolate()); |
2032 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 2057 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
2033 AddAccessor(templ, v8_str("age"), | 2058 AddAccessor(templ, v8_str("age"), |
2034 SimpleAccessorGetter, SimpleAccessorSetter); | 2059 SimpleAccessorGetter, SimpleAccessorSetter); |
2035 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 2060 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
2036 LocalContext env; | 2061 LocalContext env; |
2037 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 2062 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
2038 CompileRun("var obj = new Obj;" | 2063 CompileRun("var obj = new Obj;" |
2039 "function setAge(i){ obj.age = i; };" | 2064 "function setAge(i){ obj.age = i; };" |
2040 "for(var i = 20000; i >= 9999; i--) setAge(i);"); | 2065 "for(var i = 20000; i >= 9999; i--) setAge(i);"); |
2041 // All i >= 10000 go to the accessor. | 2066 // All i >= 10000 go to the accessor. |
2042 ExpectInt32("obj.accessor_age", 10000); | 2067 ExpectInt32("obj.accessor_age", 10000); |
2043 // The last i goes to the interceptor. | 2068 // The last i goes to the interceptor. |
2044 ExpectInt32("obj.interceptor_age", 9999); | 2069 ExpectInt32("obj.interceptor_age", 9999); |
2045 } | 2070 } |
2046 | 2071 |
2047 | 2072 |
2048 THREADED_TEST(SwitchFromInterceptorToAccessorWithInheritance) { | 2073 THREADED_TEST(SwitchFromInterceptorToAccessorWithInheritance) { |
2049 v8::HandleScope scope(CcTest::isolate()); | 2074 v8::HandleScope scope(CcTest::isolate()); |
2050 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 2075 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
2051 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 2076 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
2052 child->Inherit(parent); | 2077 child->Inherit(parent); |
2053 AddAccessor(parent, v8_str("age"), | 2078 AddAccessor(parent, v8_str("age"), |
2054 SimpleAccessorGetter, SimpleAccessorSetter); | 2079 SimpleAccessorGetter, SimpleAccessorSetter); |
2055 AddInterceptor(child, InterceptorGetter, InterceptorSetter); | 2080 AddInterceptor(child, InterceptorGetter, InterceptorSetter); |
2056 LocalContext env; | 2081 LocalContext env; |
2057 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2082 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2058 CompileRun("var child = new Child;" | 2083 CompileRun("var child = new Child;" |
2059 "function setAge(i){ child.age = i; };" | 2084 "function setAge(i){ child.age = i; };" |
2060 "for(var i = 0; i <= 10000; i++) setAge(i);"); | 2085 "for(var i = 0; i <= 10000; i++) setAge(i);"); |
2061 // All i < 10000 go to the interceptor. | 2086 // All i < 10000 go to the interceptor. |
2062 ExpectInt32("child.interceptor_age", 9999); | 2087 ExpectInt32("child.interceptor_age", 9999); |
2063 // The last i goes to the accessor. | 2088 // The last i goes to the accessor. |
2064 ExpectInt32("child.accessor_age", 10000); | 2089 ExpectInt32("child.accessor_age", 10000); |
2065 } | 2090 } |
2066 | 2091 |
2067 | 2092 |
2068 THREADED_TEST(SwitchFromAccessorToInterceptorWithInheritance) { | 2093 THREADED_TEST(SwitchFromAccessorToInterceptorWithInheritance) { |
2069 v8::HandleScope scope(CcTest::isolate()); | 2094 v8::HandleScope scope(CcTest::isolate()); |
2070 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 2095 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
2071 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 2096 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
2072 child->Inherit(parent); | 2097 child->Inherit(parent); |
2073 AddAccessor(parent, v8_str("age"), | 2098 AddAccessor(parent, v8_str("age"), |
2074 SimpleAccessorGetter, SimpleAccessorSetter); | 2099 SimpleAccessorGetter, SimpleAccessorSetter); |
2075 AddInterceptor(child, InterceptorGetter, InterceptorSetter); | 2100 AddInterceptor(child, InterceptorGetter, InterceptorSetter); |
2076 LocalContext env; | 2101 LocalContext env; |
2077 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2102 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2078 CompileRun("var child = new Child;" | 2103 CompileRun("var child = new Child;" |
2079 "function setAge(i){ child.age = i; };" | 2104 "function setAge(i){ child.age = i; };" |
2080 "for(var i = 20000; i >= 9999; i--) setAge(i);"); | 2105 "for(var i = 20000; i >= 9999; i--) setAge(i);"); |
2081 // All i >= 10000 go to the accessor. | 2106 // All i >= 10000 go to the accessor. |
2082 ExpectInt32("child.accessor_age", 10000); | 2107 ExpectInt32("child.accessor_age", 10000); |
2083 // The last i goes to the interceptor. | 2108 // The last i goes to the interceptor. |
2084 ExpectInt32("child.interceptor_age", 9999); | 2109 ExpectInt32("child.interceptor_age", 9999); |
2085 } | 2110 } |
2086 | 2111 |
2087 | 2112 |
2088 THREADED_TEST(SwitchFromInterceptorToJSAccessor) { | 2113 THREADED_TEST(SwitchFromInterceptorToJSAccessor) { |
2089 v8::HandleScope scope(CcTest::isolate()); | 2114 v8::HandleScope scope(CcTest::isolate()); |
2090 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 2115 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
2091 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 2116 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
2092 LocalContext env; | 2117 LocalContext env; |
2093 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 2118 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
2094 CompileRun("var obj = new Obj;" | 2119 CompileRun("var obj = new Obj;" |
2095 "function setter(i) { this.accessor_age = i; };" | 2120 "function setter(i) { this.accessor_age = i; };" |
2096 "function getter() { return this.accessor_age; };" | 2121 "function getter() { return this.accessor_age; };" |
2097 "function setAge(i) { obj.age = i; };" | 2122 "function setAge(i) { obj.age = i; };" |
2098 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" | 2123 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" |
2099 "for(var i = 0; i <= 10000; i++) setAge(i);"); | 2124 "for(var i = 0; i <= 10000; i++) setAge(i);"); |
2100 // All i < 10000 go to the interceptor. | 2125 // All i < 10000 go to the interceptor. |
2101 ExpectInt32("obj.interceptor_age", 9999); | 2126 ExpectInt32("obj.interceptor_age", 9999); |
2102 // The last i goes to the JavaScript accessor. | 2127 // The last i goes to the JavaScript accessor. |
2103 ExpectInt32("obj.accessor_age", 10000); | 2128 ExpectInt32("obj.accessor_age", 10000); |
2104 // The installed JavaScript getter is still intact. | 2129 // The installed JavaScript getter is still intact. |
2105 // This last part is a regression test for issue 1651 and relies on the fact | 2130 // This last part is a regression test for issue 1651 and relies on the fact |
2106 // that both interceptor and accessor are being installed on the same object. | 2131 // that both interceptor and accessor are being installed on the same object. |
2107 ExpectInt32("obj.age", 10000); | 2132 ExpectInt32("obj.age", 10000); |
2108 ExpectBoolean("obj.hasOwnProperty('age')", true); | 2133 ExpectBoolean("obj.hasOwnProperty('age')", true); |
2109 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); | 2134 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); |
2110 } | 2135 } |
2111 | 2136 |
2112 | 2137 |
2113 THREADED_TEST(SwitchFromJSAccessorToInterceptor) { | 2138 THREADED_TEST(SwitchFromJSAccessorToInterceptor) { |
2114 v8::HandleScope scope(CcTest::isolate()); | 2139 v8::HandleScope scope(CcTest::isolate()); |
2115 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 2140 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
2116 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 2141 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
2117 LocalContext env; | 2142 LocalContext env; |
2118 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 2143 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
2119 CompileRun("var obj = new Obj;" | 2144 CompileRun("var obj = new Obj;" |
2120 "function setter(i) { this.accessor_age = i; };" | 2145 "function setter(i) { this.accessor_age = i; };" |
2121 "function getter() { return this.accessor_age; };" | 2146 "function getter() { return this.accessor_age; };" |
2122 "function setAge(i) { obj.age = i; };" | 2147 "function setAge(i) { obj.age = i; };" |
2123 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" | 2148 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" |
2124 "for(var i = 20000; i >= 9999; i--) setAge(i);"); | 2149 "for(var i = 20000; i >= 9999; i--) setAge(i);"); |
2125 // All i >= 10000 go to the accessor. | 2150 // All i >= 10000 go to the accessor. |
2126 ExpectInt32("obj.accessor_age", 10000); | 2151 ExpectInt32("obj.accessor_age", 10000); |
2127 // The last i goes to the interceptor. | 2152 // The last i goes to the interceptor. |
2128 ExpectInt32("obj.interceptor_age", 9999); | 2153 ExpectInt32("obj.interceptor_age", 9999); |
2129 // The installed JavaScript getter is still intact. | 2154 // The installed JavaScript getter is still intact. |
2130 // This last part is a regression test for issue 1651 and relies on the fact | 2155 // This last part is a regression test for issue 1651 and relies on the fact |
2131 // that both interceptor and accessor are being installed on the same object. | 2156 // that both interceptor and accessor are being installed on the same object. |
2132 ExpectInt32("obj.age", 10000); | 2157 ExpectInt32("obj.age", 10000); |
2133 ExpectBoolean("obj.hasOwnProperty('age')", true); | 2158 ExpectBoolean("obj.hasOwnProperty('age')", true); |
2134 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); | 2159 ExpectUndefined("Object.getOwnPropertyDescriptor(obj, 'age').value"); |
2135 } | 2160 } |
2136 | 2161 |
2137 | 2162 |
2138 THREADED_TEST(SwitchFromInterceptorToProperty) { | 2163 THREADED_TEST(SwitchFromInterceptorToProperty) { |
2139 v8::HandleScope scope(CcTest::isolate()); | 2164 v8::HandleScope scope(CcTest::isolate()); |
2140 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 2165 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
2141 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 2166 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
2142 child->Inherit(parent); | 2167 child->Inherit(parent); |
2143 AddInterceptor(child, InterceptorGetter, InterceptorSetter); | 2168 AddInterceptor(child, InterceptorGetter, InterceptorSetter); |
2144 LocalContext env; | 2169 LocalContext env; |
2145 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2170 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2146 CompileRun("var child = new Child;" | 2171 CompileRun("var child = new Child;" |
2147 "function setAge(i){ child.age = i; };" | 2172 "function setAge(i){ child.age = i; };" |
2148 "for(var i = 0; i <= 10000; i++) setAge(i);"); | 2173 "for(var i = 0; i <= 10000; i++) setAge(i);"); |
2149 // All i < 10000 go to the interceptor. | 2174 // All i < 10000 go to the interceptor. |
2150 ExpectInt32("child.interceptor_age", 9999); | 2175 ExpectInt32("child.interceptor_age", 9999); |
2151 // The last i goes to child's own property. | 2176 // The last i goes to child's own property. |
2152 ExpectInt32("child.age", 10000); | 2177 ExpectInt32("child.age", 10000); |
2153 } | 2178 } |
2154 | 2179 |
2155 | 2180 |
2156 THREADED_TEST(SwitchFromPropertyToInterceptor) { | 2181 THREADED_TEST(SwitchFromPropertyToInterceptor) { |
2157 v8::HandleScope scope(CcTest::isolate()); | 2182 v8::HandleScope scope(CcTest::isolate()); |
2158 Handle<FunctionTemplate> parent = FunctionTemplate::New(); | 2183 Handle<FunctionTemplate> parent = FunctionTemplate::New(CcTest::isolate()); |
2159 Handle<FunctionTemplate> child = FunctionTemplate::New(); | 2184 Handle<FunctionTemplate> child = FunctionTemplate::New(CcTest::isolate()); |
2160 child->Inherit(parent); | 2185 child->Inherit(parent); |
2161 AddInterceptor(child, InterceptorGetter, InterceptorSetter); | 2186 AddInterceptor(child, InterceptorGetter, InterceptorSetter); |
2162 LocalContext env; | 2187 LocalContext env; |
2163 env->Global()->Set(v8_str("Child"), child->GetFunction()); | 2188 env->Global()->Set(v8_str("Child"), child->GetFunction()); |
2164 CompileRun("var child = new Child;" | 2189 CompileRun("var child = new Child;" |
2165 "function setAge(i){ child.age = i; };" | 2190 "function setAge(i){ child.age = i; };" |
2166 "for(var i = 20000; i >= 9999; i--) setAge(i);"); | 2191 "for(var i = 20000; i >= 9999; i--) setAge(i);"); |
2167 // All i >= 10000 go to child's own property. | 2192 // All i >= 10000 go to child's own property. |
2168 ExpectInt32("child.age", 10000); | 2193 ExpectInt32("child.age", 10000); |
2169 // The last i goes to the interceptor. | 2194 // The last i goes to the interceptor. |
2170 ExpectInt32("child.interceptor_age", 9999); | 2195 ExpectInt32("child.interceptor_age", 9999); |
2171 } | 2196 } |
2172 | 2197 |
2173 | 2198 |
2174 THREADED_TEST(NamedPropertyHandlerGetter) { | 2199 THREADED_TEST(NamedPropertyHandlerGetter) { |
2175 echo_named_call_count = 0; | 2200 echo_named_call_count = 0; |
2176 v8::HandleScope scope(CcTest::isolate()); | 2201 v8::HandleScope scope(CcTest::isolate()); |
2177 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 2202 v8::Handle<v8::FunctionTemplate> templ = |
| 2203 v8::FunctionTemplate::New(CcTest::isolate()); |
2178 templ->InstanceTemplate()->SetNamedPropertyHandler(EchoNamedProperty, | 2204 templ->InstanceTemplate()->SetNamedPropertyHandler(EchoNamedProperty, |
2179 0, 0, 0, 0, | 2205 0, 0, 0, 0, |
2180 v8_str("data")); | 2206 v8_str("data")); |
2181 LocalContext env; | 2207 LocalContext env; |
2182 env->Global()->Set(v8_str("obj"), | 2208 env->Global()->Set(v8_str("obj"), |
2183 templ->GetFunction()->NewInstance()); | 2209 templ->GetFunction()->NewInstance()); |
2184 CHECK_EQ(echo_named_call_count, 0); | 2210 CHECK_EQ(echo_named_call_count, 0); |
2185 v8_compile("obj.x")->Run(); | 2211 v8_compile("obj.x")->Run(); |
2186 CHECK_EQ(echo_named_call_count, 1); | 2212 CHECK_EQ(echo_named_call_count, 1); |
2187 const char* code = "var str = 'oddle'; obj[str] + obj.poddle;"; | 2213 const char* code = "var str = 'oddle'; obj[str] + obj.poddle;"; |
(...skipping 14 matching lines...) Expand all Loading... |
2202 uint32_t index, | 2228 uint32_t index, |
2203 const v8::PropertyCallbackInfo<v8::Value>& info) { | 2229 const v8::PropertyCallbackInfo<v8::Value>& info) { |
2204 ApiTestFuzzer::Fuzz(); | 2230 ApiTestFuzzer::Fuzz(); |
2205 CHECK_EQ(v8_num(637), info.Data()); | 2231 CHECK_EQ(v8_num(637), info.Data()); |
2206 echo_indexed_call_count++; | 2232 echo_indexed_call_count++; |
2207 info.GetReturnValue().Set(v8_num(index)); | 2233 info.GetReturnValue().Set(v8_num(index)); |
2208 } | 2234 } |
2209 | 2235 |
2210 | 2236 |
2211 THREADED_TEST(IndexedPropertyHandlerGetter) { | 2237 THREADED_TEST(IndexedPropertyHandlerGetter) { |
2212 v8::HandleScope scope(CcTest::isolate()); | 2238 v8::Isolate* isolate = CcTest::isolate(); |
2213 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 2239 v8::HandleScope scope(isolate); |
| 2240 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2214 templ->InstanceTemplate()->SetIndexedPropertyHandler(EchoIndexedProperty, | 2241 templ->InstanceTemplate()->SetIndexedPropertyHandler(EchoIndexedProperty, |
2215 0, 0, 0, 0, | 2242 0, 0, 0, 0, |
2216 v8_num(637)); | 2243 v8_num(637)); |
2217 LocalContext env; | 2244 LocalContext env; |
2218 env->Global()->Set(v8_str("obj"), | 2245 env->Global()->Set(v8_str("obj"), |
2219 templ->GetFunction()->NewInstance()); | 2246 templ->GetFunction()->NewInstance()); |
2220 Local<Script> script = v8_compile("obj[900]"); | 2247 Local<Script> script = v8_compile("obj[900]"); |
2221 CHECK_EQ(script->Run()->Int32Value(), 900); | 2248 CHECK_EQ(script->Run()->Int32Value(), 900); |
2222 } | 2249 } |
2223 | 2250 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2306 void CheckThisNamedPropertyEnumerator( | 2333 void CheckThisNamedPropertyEnumerator( |
2307 const v8::PropertyCallbackInfo<v8::Array>& info) { | 2334 const v8::PropertyCallbackInfo<v8::Array>& info) { |
2308 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyEnumerator)); | 2335 CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyEnumerator)); |
2309 ApiTestFuzzer::Fuzz(); | 2336 ApiTestFuzzer::Fuzz(); |
2310 CHECK(info.This()->Equals(bottom)); | 2337 CHECK(info.This()->Equals(bottom)); |
2311 } | 2338 } |
2312 | 2339 |
2313 | 2340 |
2314 THREADED_PROFILED_TEST(PropertyHandlerInPrototype) { | 2341 THREADED_PROFILED_TEST(PropertyHandlerInPrototype) { |
2315 LocalContext env; | 2342 LocalContext env; |
2316 v8::HandleScope scope(env->GetIsolate()); | 2343 v8::Isolate* isolate = env->GetIsolate(); |
| 2344 v8::HandleScope scope(isolate); |
2317 | 2345 |
2318 // Set up a prototype chain with three interceptors. | 2346 // Set up a prototype chain with three interceptors. |
2319 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 2347 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2320 templ->InstanceTemplate()->SetIndexedPropertyHandler( | 2348 templ->InstanceTemplate()->SetIndexedPropertyHandler( |
2321 CheckThisIndexedPropertyHandler, | 2349 CheckThisIndexedPropertyHandler, |
2322 CheckThisIndexedPropertySetter, | 2350 CheckThisIndexedPropertySetter, |
2323 CheckThisIndexedPropertyQuery, | 2351 CheckThisIndexedPropertyQuery, |
2324 CheckThisIndexedPropertyDeleter, | 2352 CheckThisIndexedPropertyDeleter, |
2325 CheckThisIndexedPropertyEnumerator); | 2353 CheckThisIndexedPropertyEnumerator); |
2326 | 2354 |
2327 templ->InstanceTemplate()->SetNamedPropertyHandler( | 2355 templ->InstanceTemplate()->SetNamedPropertyHandler( |
2328 CheckThisNamedPropertyHandler, | 2356 CheckThisNamedPropertyHandler, |
2329 CheckThisNamedPropertySetter, | 2357 CheckThisNamedPropertySetter, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2373 static void PrePropertyHandlerQuery( | 2401 static void PrePropertyHandlerQuery( |
2374 Local<String> key, | 2402 Local<String> key, |
2375 const v8::PropertyCallbackInfo<v8::Integer>& info) { | 2403 const v8::PropertyCallbackInfo<v8::Integer>& info) { |
2376 if (v8_str("pre")->Equals(key)) { | 2404 if (v8_str("pre")->Equals(key)) { |
2377 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); | 2405 info.GetReturnValue().Set(static_cast<int32_t>(v8::None)); |
2378 } | 2406 } |
2379 } | 2407 } |
2380 | 2408 |
2381 | 2409 |
2382 THREADED_TEST(PrePropertyHandler) { | 2410 THREADED_TEST(PrePropertyHandler) { |
2383 v8::HandleScope scope(CcTest::isolate()); | 2411 v8::Isolate* isolate = CcTest::isolate(); |
2384 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); | 2412 v8::HandleScope scope(isolate); |
| 2413 v8::Handle<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
2385 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet, | 2414 desc->InstanceTemplate()->SetNamedPropertyHandler(PrePropertyHandlerGet, |
2386 0, | 2415 0, |
2387 PrePropertyHandlerQuery); | 2416 PrePropertyHandlerQuery); |
2388 LocalContext env(NULL, desc->InstanceTemplate()); | 2417 LocalContext env(NULL, desc->InstanceTemplate()); |
2389 Script::Compile(v8_str( | 2418 Script::Compile(v8_str( |
2390 "var pre = 'Object: pre'; var on = 'Object: on';"))->Run(); | 2419 "var pre = 'Object: pre'; var on = 'Object: on';"))->Run(); |
2391 v8::Handle<Value> result_pre = Script::Compile(v8_str("pre"))->Run(); | 2420 v8::Handle<Value> result_pre = Script::Compile(v8_str("pre"))->Run(); |
2392 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre); | 2421 CHECK_EQ(v8_str("PrePropertyHandler: pre"), result_pre); |
2393 v8::Handle<Value> result_on = Script::Compile(v8_str("on"))->Run(); | 2422 v8::Handle<Value> result_on = Script::Compile(v8_str("on"))->Run(); |
2394 CHECK_EQ(v8_str("Object: on"), result_on); | 2423 CHECK_EQ(v8_str("Object: on"), result_on); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2430 } | 2459 } |
2431 args.This()->Set(v8_str("depth"), v8::Integer::New(depth + 1)); | 2460 args.This()->Set(v8_str("depth"), v8::Integer::New(depth + 1)); |
2432 v8::Handle<Value> function = | 2461 v8::Handle<Value> function = |
2433 args.This()->Get(v8_str("callFunctionRecursively")); | 2462 args.This()->Get(v8_str("callFunctionRecursively")); |
2434 args.GetReturnValue().Set( | 2463 args.GetReturnValue().Set( |
2435 function.As<Function>()->Call(args.This(), 0, NULL)); | 2464 function.As<Function>()->Call(args.This(), 0, NULL)); |
2436 } | 2465 } |
2437 | 2466 |
2438 | 2467 |
2439 THREADED_TEST(DeepCrossLanguageRecursion) { | 2468 THREADED_TEST(DeepCrossLanguageRecursion) { |
2440 v8::HandleScope scope(CcTest::isolate()); | 2469 v8::Isolate* isolate = CcTest::isolate(); |
| 2470 v8::HandleScope scope(isolate); |
2441 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); | 2471 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); |
2442 global->Set(v8_str("callScriptRecursively"), | 2472 global->Set(v8_str("callScriptRecursively"), |
2443 v8::FunctionTemplate::New(CallScriptRecursivelyCall)); | 2473 v8::FunctionTemplate::New(isolate, CallScriptRecursivelyCall)); |
2444 global->Set(v8_str("callFunctionRecursively"), | 2474 global->Set(v8_str("callFunctionRecursively"), |
2445 v8::FunctionTemplate::New(CallFunctionRecursivelyCall)); | 2475 v8::FunctionTemplate::New(isolate, CallFunctionRecursivelyCall)); |
2446 LocalContext env(NULL, global); | 2476 LocalContext env(NULL, global); |
2447 | 2477 |
2448 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); | 2478 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); |
2449 call_recursively_script = v8_compile("callScriptRecursively()"); | 2479 call_recursively_script = v8_compile("callScriptRecursively()"); |
2450 call_recursively_script->Run(); | 2480 call_recursively_script->Run(); |
2451 call_recursively_script = v8::Handle<Script>(); | 2481 call_recursively_script = v8::Handle<Script>(); |
2452 | 2482 |
2453 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); | 2483 env->Global()->Set(v8_str("depth"), v8::Integer::New(0)); |
2454 Script::Compile(v8_str("callFunctionRecursively()"))->Run(); | 2484 Script::Compile(v8_str("callFunctionRecursively()"))->Run(); |
2455 } | 2485 } |
(...skipping 26 matching lines...) Expand all Loading... |
2482 v8::Handle<Value> otto = Script::Compile(v8_str( | 2512 v8::Handle<Value> otto = Script::Compile(v8_str( |
2483 "try { with (obj) { otto; } } catch (e) { e; }"))->Run(); | 2513 "try { with (obj) { otto; } } catch (e) { e; }"))->Run(); |
2484 CHECK_EQ(v8_str("otto"), otto); | 2514 CHECK_EQ(v8_str("otto"), otto); |
2485 v8::Handle<Value> netto = Script::Compile(v8_str( | 2515 v8::Handle<Value> netto = Script::Compile(v8_str( |
2486 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run(); | 2516 "try { with (obj) { netto = 4; } } catch (e) { e; }"))->Run(); |
2487 CHECK_EQ(v8_str("netto"), netto); | 2517 CHECK_EQ(v8_str("netto"), netto); |
2488 } | 2518 } |
2489 | 2519 |
2490 | 2520 |
2491 THREADED_TEST(FunctionPrototype) { | 2521 THREADED_TEST(FunctionPrototype) { |
2492 v8::HandleScope scope(CcTest::isolate()); | 2522 v8::Isolate* isolate = CcTest::isolate(); |
2493 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(); | 2523 v8::HandleScope scope(isolate); |
| 2524 Local<v8::FunctionTemplate> Foo = v8::FunctionTemplate::New(isolate); |
2494 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); | 2525 Foo->PrototypeTemplate()->Set(v8_str("plak"), v8_num(321)); |
2495 LocalContext env; | 2526 LocalContext env; |
2496 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); | 2527 env->Global()->Set(v8_str("Foo"), Foo->GetFunction()); |
2497 Local<Script> script = Script::Compile(v8_str("Foo.prototype.plak")); | 2528 Local<Script> script = Script::Compile(v8_str("Foo.prototype.plak")); |
2498 CHECK_EQ(script->Run()->Int32Value(), 321); | 2529 CHECK_EQ(script->Run()->Int32Value(), 321); |
2499 } | 2530 } |
2500 | 2531 |
2501 | 2532 |
2502 THREADED_TEST(InternalFields) { | 2533 THREADED_TEST(InternalFields) { |
2503 LocalContext env; | 2534 LocalContext env; |
2504 v8::HandleScope scope(env->GetIsolate()); | 2535 v8::Isolate* isolate = env->GetIsolate(); |
| 2536 v8::HandleScope scope(isolate); |
2505 | 2537 |
2506 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 2538 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2507 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 2539 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
2508 instance_templ->SetInternalFieldCount(1); | 2540 instance_templ->SetInternalFieldCount(1); |
2509 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 2541 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); |
2510 CHECK_EQ(1, obj->InternalFieldCount()); | 2542 CHECK_EQ(1, obj->InternalFieldCount()); |
2511 CHECK(obj->GetInternalField(0)->IsUndefined()); | 2543 CHECK(obj->GetInternalField(0)->IsUndefined()); |
2512 obj->SetInternalField(0, v8_num(17)); | 2544 obj->SetInternalField(0, v8_num(17)); |
2513 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); | 2545 CHECK_EQ(17, obj->GetInternalField(0)->Int32Value()); |
2514 } | 2546 } |
2515 | 2547 |
2516 | 2548 |
(...skipping 25 matching lines...) Expand all Loading... |
2542 void* value) { | 2574 void* value) { |
2543 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); | 2575 CHECK_EQ(0, static_cast<int>(reinterpret_cast<uintptr_t>(value) & 0x1)); |
2544 obj->SetAlignedPointerInInternalField(0, value); | 2576 obj->SetAlignedPointerInInternalField(0, value); |
2545 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 2577 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
2546 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); | 2578 CHECK_EQ(value, obj->GetAlignedPointerFromInternalField(0)); |
2547 } | 2579 } |
2548 | 2580 |
2549 | 2581 |
2550 THREADED_TEST(InternalFieldsAlignedPointers) { | 2582 THREADED_TEST(InternalFieldsAlignedPointers) { |
2551 LocalContext env; | 2583 LocalContext env; |
2552 v8::HandleScope scope(env->GetIsolate()); | 2584 v8::Isolate* isolate = env->GetIsolate(); |
| 2585 v8::HandleScope scope(isolate); |
2553 | 2586 |
2554 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 2587 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
2555 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 2588 Local<v8::ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
2556 instance_templ->SetInternalFieldCount(1); | 2589 instance_templ->SetInternalFieldCount(1); |
2557 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); | 2590 Local<v8::Object> obj = templ->GetFunction()->NewInstance(); |
2558 CHECK_EQ(1, obj->InternalFieldCount()); | 2591 CHECK_EQ(1, obj->InternalFieldCount()); |
2559 | 2592 |
2560 CheckAlignedPointerInInternalField(obj, NULL); | 2593 CheckAlignedPointerInInternalField(obj, NULL); |
2561 | 2594 |
2562 int* heap_allocated = new int[100]; | 2595 int* heap_allocated = new int[100]; |
2563 CheckAlignedPointerInInternalField(obj, heap_allocated); | 2596 CheckAlignedPointerInInternalField(obj, heap_allocated); |
2564 delete[] heap_allocated; | 2597 delete[] heap_allocated; |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3173 | 3206 |
3174 static bool interceptor_for_hidden_properties_called; | 3207 static bool interceptor_for_hidden_properties_called; |
3175 static void InterceptorForHiddenProperties( | 3208 static void InterceptorForHiddenProperties( |
3176 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { | 3209 Local<String> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
3177 interceptor_for_hidden_properties_called = true; | 3210 interceptor_for_hidden_properties_called = true; |
3178 } | 3211 } |
3179 | 3212 |
3180 | 3213 |
3181 THREADED_TEST(HiddenPropertiesWithInterceptors) { | 3214 THREADED_TEST(HiddenPropertiesWithInterceptors) { |
3182 LocalContext context; | 3215 LocalContext context; |
3183 v8::HandleScope scope(context->GetIsolate()); | 3216 v8::Isolate* isolate = context->GetIsolate(); |
| 3217 v8::HandleScope scope(isolate); |
3184 | 3218 |
3185 interceptor_for_hidden_properties_called = false; | 3219 interceptor_for_hidden_properties_called = false; |
3186 | 3220 |
3187 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); | 3221 v8::Local<v8::String> key = v8_str("api-test::hidden-key"); |
3188 | 3222 |
3189 // Associate an interceptor with an object and start setting hidden values. | 3223 // Associate an interceptor with an object and start setting hidden values. |
3190 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 3224 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
3191 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); | 3225 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); |
3192 instance_templ->SetNamedPropertyHandler(InterceptorForHiddenProperties); | 3226 instance_templ->SetNamedPropertyHandler(InterceptorForHiddenProperties); |
3193 Local<v8::Function> function = fun_templ->GetFunction(); | 3227 Local<v8::Function> function = fun_templ->GetFunction(); |
3194 Local<v8::Object> obj = function->NewInstance(); | 3228 Local<v8::Object> obj = function->NewInstance(); |
3195 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2302))); | 3229 CHECK(obj->SetHiddenValue(key, v8::Integer::New(2302))); |
3196 CHECK_EQ(2302, obj->GetHiddenValue(key)->Int32Value()); | 3230 CHECK_EQ(2302, obj->GetHiddenValue(key)->Int32Value()); |
3197 CHECK(!interceptor_for_hidden_properties_called); | 3231 CHECK(!interceptor_for_hidden_properties_called); |
3198 } | 3232 } |
3199 | 3233 |
3200 | 3234 |
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4191 v8::EscapableHandleScope scope(args.GetIsolate()); | 4225 v8::EscapableHandleScope scope(args.GetIsolate()); |
4192 ApiTestFuzzer::Fuzz(); | 4226 ApiTestFuzzer::Fuzz(); |
4193 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); | 4227 Local<v8::Array> result = v8::Array::New(args.GetIsolate(), args.Length()); |
4194 for (int i = 0; i < args.Length(); i++) | 4228 for (int i = 0; i < args.Length(); i++) |
4195 result->Set(i, args[i]); | 4229 result->Set(i, args[i]); |
4196 args.GetReturnValue().Set(scope.Escape(result)); | 4230 args.GetReturnValue().Set(scope.Escape(result)); |
4197 } | 4231 } |
4198 | 4232 |
4199 | 4233 |
4200 THREADED_TEST(Vector) { | 4234 THREADED_TEST(Vector) { |
4201 v8::HandleScope scope(CcTest::isolate()); | 4235 v8::Isolate* isolate = CcTest::isolate(); |
| 4236 v8::HandleScope scope(isolate); |
4202 Local<ObjectTemplate> global = ObjectTemplate::New(); | 4237 Local<ObjectTemplate> global = ObjectTemplate::New(); |
4203 global->Set(v8_str("f"), v8::FunctionTemplate::New(HandleF)); | 4238 global->Set(v8_str("f"), v8::FunctionTemplate::New(isolate, HandleF)); |
4204 LocalContext context(0, global); | 4239 LocalContext context(0, global); |
4205 | 4240 |
4206 const char* fun = "f()"; | 4241 const char* fun = "f()"; |
4207 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); | 4242 Local<v8::Array> a0 = CompileRun(fun).As<v8::Array>(); |
4208 CHECK_EQ(0, a0->Length()); | 4243 CHECK_EQ(0, a0->Length()); |
4209 | 4244 |
4210 const char* fun2 = "f(11)"; | 4245 const char* fun2 = "f(11)"; |
4211 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); | 4246 Local<v8::Array> a1 = CompileRun(fun2).As<v8::Array>(); |
4212 CHECK_EQ(1, a1->Length()); | 4247 CHECK_EQ(1, a1->Length()); |
4213 CHECK_EQ(11, a1->Get(0)->Int32Value()); | 4248 CHECK_EQ(11, a1->Get(0)->Int32Value()); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4377 // Set heap limits. | 4412 // Set heap limits. |
4378 static const int K = 1024; | 4413 static const int K = 1024; |
4379 v8::ResourceConstraints constraints; | 4414 v8::ResourceConstraints constraints; |
4380 constraints.set_max_young_space_size(256 * K); | 4415 constraints.set_max_young_space_size(256 * K); |
4381 constraints.set_max_old_space_size(5 * K * K); | 4416 constraints.set_max_old_space_size(5 * K * K); |
4382 v8::SetResourceConstraints(CcTest::isolate(), &constraints); | 4417 v8::SetResourceConstraints(CcTest::isolate(), &constraints); |
4383 | 4418 |
4384 v8::HandleScope scope(CcTest::isolate()); | 4419 v8::HandleScope scope(CcTest::isolate()); |
4385 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4420 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4386 templ->Set(v8_str("ProvokeOutOfMemory"), | 4421 templ->Set(v8_str("ProvokeOutOfMemory"), |
4387 v8::FunctionTemplate::New(ProvokeOutOfMemory)); | 4422 v8::FunctionTemplate::New(CcTest::isolate(), ProvokeOutOfMemory)); |
4388 LocalContext context(0, templ); | 4423 LocalContext context(0, templ); |
4389 v8::V8::IgnoreOutOfMemoryException(); | 4424 v8::V8::IgnoreOutOfMemoryException(); |
4390 Local<Value> result = CompileRun( | 4425 Local<Value> result = CompileRun( |
4391 "var thrown = false;" | 4426 "var thrown = false;" |
4392 "try {" | 4427 "try {" |
4393 " ProvokeOutOfMemory();" | 4428 " ProvokeOutOfMemory();" |
4394 "} catch (e) {" | 4429 "} catch (e) {" |
4395 " thrown = true;" | 4430 " thrown = true;" |
4396 "}"); | 4431 "}"); |
4397 // Check for out of memory state. | 4432 // Check for out of memory state. |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4657 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run(); | 4692 Local<Value> result = v8::Script::Compile(args[0]->ToString())->Run(); |
4658 CHECK(!try_catch.HasCaught() || result.IsEmpty()); | 4693 CHECK(!try_catch.HasCaught() || result.IsEmpty()); |
4659 args.GetReturnValue().Set(try_catch.HasCaught()); | 4694 args.GetReturnValue().Set(try_catch.HasCaught()); |
4660 } | 4695 } |
4661 | 4696 |
4662 | 4697 |
4663 THREADED_TEST(APICatch) { | 4698 THREADED_TEST(APICatch) { |
4664 v8::HandleScope scope(CcTest::isolate()); | 4699 v8::HandleScope scope(CcTest::isolate()); |
4665 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4700 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4666 templ->Set(v8_str("ThrowFromC"), | 4701 templ->Set(v8_str("ThrowFromC"), |
4667 v8::FunctionTemplate::New(ThrowFromC)); | 4702 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); |
4668 LocalContext context(0, templ); | 4703 LocalContext context(0, templ); |
4669 CompileRun( | 4704 CompileRun( |
4670 "var thrown = false;" | 4705 "var thrown = false;" |
4671 "try {" | 4706 "try {" |
4672 " ThrowFromC();" | 4707 " ThrowFromC();" |
4673 "} catch (e) {" | 4708 "} catch (e) {" |
4674 " thrown = true;" | 4709 " thrown = true;" |
4675 "}"); | 4710 "}"); |
4676 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); | 4711 Local<Value> thrown = context->Global()->Get(v8_str("thrown")); |
4677 CHECK(thrown->BooleanValue()); | 4712 CHECK(thrown->BooleanValue()); |
4678 } | 4713 } |
4679 | 4714 |
4680 | 4715 |
4681 THREADED_TEST(APIThrowTryCatch) { | 4716 THREADED_TEST(APIThrowTryCatch) { |
4682 v8::HandleScope scope(CcTest::isolate()); | 4717 v8::HandleScope scope(CcTest::isolate()); |
4683 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4718 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4684 templ->Set(v8_str("ThrowFromC"), | 4719 templ->Set(v8_str("ThrowFromC"), |
4685 v8::FunctionTemplate::New(ThrowFromC)); | 4720 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); |
4686 LocalContext context(0, templ); | 4721 LocalContext context(0, templ); |
4687 v8::TryCatch try_catch; | 4722 v8::TryCatch try_catch; |
4688 CompileRun("ThrowFromC();"); | 4723 CompileRun("ThrowFromC();"); |
4689 CHECK(try_catch.HasCaught()); | 4724 CHECK(try_catch.HasCaught()); |
4690 } | 4725 } |
4691 | 4726 |
4692 | 4727 |
4693 // Test that a try-finally block doesn't shadow a try-catch block | 4728 // Test that a try-finally block doesn't shadow a try-catch block |
4694 // when setting up an external handler. | 4729 // when setting up an external handler. |
4695 // | 4730 // |
4696 // BUG(271): Some of the exception propagation does not work on the | 4731 // BUG(271): Some of the exception propagation does not work on the |
4697 // ARM simulator because the simulator separates the C++ stack and the | 4732 // ARM simulator because the simulator separates the C++ stack and the |
4698 // JS stack. This test therefore fails on the simulator. The test is | 4733 // JS stack. This test therefore fails on the simulator. The test is |
4699 // not threaded to allow the threading tests to run on the simulator. | 4734 // not threaded to allow the threading tests to run on the simulator. |
4700 TEST(TryCatchInTryFinally) { | 4735 TEST(TryCatchInTryFinally) { |
4701 v8::HandleScope scope(CcTest::isolate()); | 4736 v8::HandleScope scope(CcTest::isolate()); |
4702 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4737 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4703 templ->Set(v8_str("CCatcher"), | 4738 templ->Set(v8_str("CCatcher"), |
4704 v8::FunctionTemplate::New(CCatcher)); | 4739 v8::FunctionTemplate::New(CcTest::isolate(), CCatcher)); |
4705 LocalContext context(0, templ); | 4740 LocalContext context(0, templ); |
4706 Local<Value> result = CompileRun("try {" | 4741 Local<Value> result = CompileRun("try {" |
4707 " try {" | 4742 " try {" |
4708 " CCatcher('throw 7;');" | 4743 " CCatcher('throw 7;');" |
4709 " } finally {" | 4744 " } finally {" |
4710 " }" | 4745 " }" |
4711 "} catch (e) {" | 4746 "} catch (e) {" |
4712 "}"); | 4747 "}"); |
4713 CHECK(result->IsTrue()); | 4748 CHECK(result->IsTrue()); |
4714 } | 4749 } |
(...skipping 10 matching lines...) Expand all Loading... |
4725 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { | 4760 static void Fail(const v8::FunctionCallbackInfo<v8::Value>& args) { |
4726 ApiTestFuzzer::Fuzz(); | 4761 ApiTestFuzzer::Fuzz(); |
4727 CHECK(false); | 4762 CHECK(false); |
4728 } | 4763 } |
4729 | 4764 |
4730 | 4765 |
4731 // Test that overwritten methods are not invoked on uncaught exception | 4766 // Test that overwritten methods are not invoked on uncaught exception |
4732 // formatting. However, they are invoked when performing normal error | 4767 // formatting. However, they are invoked when performing normal error |
4733 // string conversions. | 4768 // string conversions. |
4734 TEST(APIThrowMessageOverwrittenToString) { | 4769 TEST(APIThrowMessageOverwrittenToString) { |
4735 v8::HandleScope scope(CcTest::isolate()); | 4770 v8::Isolate* isolate = CcTest::isolate(); |
| 4771 v8::HandleScope scope(isolate); |
4736 v8::V8::AddMessageListener(check_reference_error_message); | 4772 v8::V8::AddMessageListener(check_reference_error_message); |
4737 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4773 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4738 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(Fail)); | 4774 templ->Set(v8_str("fail"), v8::FunctionTemplate::New(isolate, Fail)); |
4739 LocalContext context(NULL, templ); | 4775 LocalContext context(NULL, templ); |
4740 CompileRun("asdf;"); | 4776 CompileRun("asdf;"); |
4741 CompileRun("var limit = {};" | 4777 CompileRun("var limit = {};" |
4742 "limit.valueOf = fail;" | 4778 "limit.valueOf = fail;" |
4743 "Error.stackTraceLimit = limit;"); | 4779 "Error.stackTraceLimit = limit;"); |
4744 CompileRun("asdf"); | 4780 CompileRun("asdf"); |
4745 CompileRun("Array.prototype.pop = fail;"); | 4781 CompileRun("Array.prototype.pop = fail;"); |
4746 CompileRun("Object.prototype.hasOwnProperty = fail;"); | 4782 CompileRun("Object.prototype.hasOwnProperty = fail;"); |
4747 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); | 4783 CompileRun("Object.prototype.toString = function f() { return 'Yikes'; }"); |
4748 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); | 4784 CompileRun("Number.prototype.toString = function f() { return 'Yikes'; }"); |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4853 message_received = true; | 4889 message_received = true; |
4854 } | 4890 } |
4855 | 4891 |
4856 | 4892 |
4857 TEST(APIThrowMessage) { | 4893 TEST(APIThrowMessage) { |
4858 message_received = false; | 4894 message_received = false; |
4859 v8::HandleScope scope(CcTest::isolate()); | 4895 v8::HandleScope scope(CcTest::isolate()); |
4860 v8::V8::AddMessageListener(receive_message); | 4896 v8::V8::AddMessageListener(receive_message); |
4861 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4897 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4862 templ->Set(v8_str("ThrowFromC"), | 4898 templ->Set(v8_str("ThrowFromC"), |
4863 v8::FunctionTemplate::New(ThrowFromC)); | 4899 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); |
4864 LocalContext context(0, templ); | 4900 LocalContext context(0, templ); |
4865 CompileRun("ThrowFromC();"); | 4901 CompileRun("ThrowFromC();"); |
4866 CHECK(message_received); | 4902 CHECK(message_received); |
4867 v8::V8::RemoveMessageListeners(receive_message); | 4903 v8::V8::RemoveMessageListeners(receive_message); |
4868 } | 4904 } |
4869 | 4905 |
4870 | 4906 |
4871 TEST(APIThrowMessageAndVerboseTryCatch) { | 4907 TEST(APIThrowMessageAndVerboseTryCatch) { |
4872 message_received = false; | 4908 message_received = false; |
4873 v8::HandleScope scope(CcTest::isolate()); | 4909 v8::HandleScope scope(CcTest::isolate()); |
4874 v8::V8::AddMessageListener(receive_message); | 4910 v8::V8::AddMessageListener(receive_message); |
4875 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4911 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4876 templ->Set(v8_str("ThrowFromC"), | 4912 templ->Set(v8_str("ThrowFromC"), |
4877 v8::FunctionTemplate::New(ThrowFromC)); | 4913 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); |
4878 LocalContext context(0, templ); | 4914 LocalContext context(0, templ); |
4879 v8::TryCatch try_catch; | 4915 v8::TryCatch try_catch; |
4880 try_catch.SetVerbose(true); | 4916 try_catch.SetVerbose(true); |
4881 Local<Value> result = CompileRun("ThrowFromC();"); | 4917 Local<Value> result = CompileRun("ThrowFromC();"); |
4882 CHECK(try_catch.HasCaught()); | 4918 CHECK(try_catch.HasCaught()); |
4883 CHECK(result.IsEmpty()); | 4919 CHECK(result.IsEmpty()); |
4884 CHECK(message_received); | 4920 CHECK(message_received); |
4885 v8::V8::RemoveMessageListeners(receive_message); | 4921 v8::V8::RemoveMessageListeners(receive_message); |
4886 } | 4922 } |
4887 | 4923 |
(...skipping 10 matching lines...) Expand all Loading... |
4898 CHECK(result.IsEmpty()); | 4934 CHECK(result.IsEmpty()); |
4899 CHECK(message_received); | 4935 CHECK(message_received); |
4900 v8::V8::RemoveMessageListeners(receive_message); | 4936 v8::V8::RemoveMessageListeners(receive_message); |
4901 } | 4937 } |
4902 | 4938 |
4903 | 4939 |
4904 THREADED_TEST(ExternalScriptException) { | 4940 THREADED_TEST(ExternalScriptException) { |
4905 v8::HandleScope scope(CcTest::isolate()); | 4941 v8::HandleScope scope(CcTest::isolate()); |
4906 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4942 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4907 templ->Set(v8_str("ThrowFromC"), | 4943 templ->Set(v8_str("ThrowFromC"), |
4908 v8::FunctionTemplate::New(ThrowFromC)); | 4944 v8::FunctionTemplate::New(CcTest::isolate(), ThrowFromC)); |
4909 LocalContext context(0, templ); | 4945 LocalContext context(0, templ); |
4910 | 4946 |
4911 v8::TryCatch try_catch; | 4947 v8::TryCatch try_catch; |
4912 Local<Script> script | 4948 Local<Script> script |
4913 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';")); | 4949 = Script::Compile(v8_str("ThrowFromC(); throw 'panama';")); |
4914 Local<Value> result = script->Run(); | 4950 Local<Value> result = script->Run(); |
4915 CHECK(result.IsEmpty()); | 4951 CHECK(result.IsEmpty()); |
4916 CHECK(try_catch.HasCaught()); | 4952 CHECK(try_catch.HasCaught()); |
4917 String::Utf8Value exception_value(try_catch.Exception()); | 4953 String::Utf8Value exception_value(try_catch.Exception()); |
4918 CHECK_EQ("konto", *exception_value); | 4954 CHECK_EQ("konto", *exception_value); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5000 // | 5036 // |
5001 // Each entry is an activation, either JS or C. The index is the count at that | 5037 // Each entry is an activation, either JS or C. The index is the count at that |
5002 // level. Stars identify activations with exception handlers, the @ identifies | 5038 // level. Stars identify activations with exception handlers, the @ identifies |
5003 // the exception handler that should catch the exception. | 5039 // the exception handler that should catch the exception. |
5004 // | 5040 // |
5005 // BUG(271): Some of the exception propagation does not work on the | 5041 // BUG(271): Some of the exception propagation does not work on the |
5006 // ARM simulator because the simulator separates the C++ stack and the | 5042 // ARM simulator because the simulator separates the C++ stack and the |
5007 // JS stack. This test therefore fails on the simulator. The test is | 5043 // JS stack. This test therefore fails on the simulator. The test is |
5008 // not threaded to allow the threading tests to run on the simulator. | 5044 // not threaded to allow the threading tests to run on the simulator. |
5009 TEST(ExceptionOrder) { | 5045 TEST(ExceptionOrder) { |
5010 v8::HandleScope scope(CcTest::isolate()); | 5046 v8::Isolate* isolate = CcTest::isolate(); |
| 5047 v8::HandleScope scope(isolate); |
5011 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 5048 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
5012 templ->Set(v8_str("check"), v8::FunctionTemplate::New(JSCheck)); | 5049 templ->Set(v8_str("check"), v8::FunctionTemplate::New(isolate, JSCheck)); |
5013 templ->Set(v8_str("CThrowCountDown"), | 5050 templ->Set(v8_str("CThrowCountDown"), |
5014 v8::FunctionTemplate::New(CThrowCountDown)); | 5051 v8::FunctionTemplate::New(isolate, CThrowCountDown)); |
5015 LocalContext context(0, templ); | 5052 LocalContext context(0, templ); |
5016 CompileRun( | 5053 CompileRun( |
5017 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {" | 5054 "function JSThrowCountDown(count, jsInterval, cInterval, expected) {" |
5018 " if (count == 0) throw 'FromJS';" | 5055 " if (count == 0) throw 'FromJS';" |
5019 " if (count % jsInterval == 0) {" | 5056 " if (count % jsInterval == 0) {" |
5020 " try {" | 5057 " try {" |
5021 " var value = CThrowCountDown(count - 1," | 5058 " var value = CThrowCountDown(count - 1," |
5022 " jsInterval," | 5059 " jsInterval," |
5023 " cInterval," | 5060 " cInterval," |
5024 " expected);" | 5061 " expected);" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5064 | 5101 |
5065 | 5102 |
5066 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5103 void ThrowValue(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5067 ApiTestFuzzer::Fuzz(); | 5104 ApiTestFuzzer::Fuzz(); |
5068 CHECK_EQ(1, args.Length()); | 5105 CHECK_EQ(1, args.Length()); |
5069 args.GetIsolate()->ThrowException(args[0]); | 5106 args.GetIsolate()->ThrowException(args[0]); |
5070 } | 5107 } |
5071 | 5108 |
5072 | 5109 |
5073 THREADED_TEST(ThrowValues) { | 5110 THREADED_TEST(ThrowValues) { |
5074 v8::HandleScope scope(CcTest::isolate()); | 5111 v8::Isolate* isolate = CcTest::isolate(); |
| 5112 v8::HandleScope scope(isolate); |
5075 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 5113 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
5076 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(ThrowValue)); | 5114 templ->Set(v8_str("Throw"), v8::FunctionTemplate::New(isolate, ThrowValue)); |
5077 LocalContext context(0, templ); | 5115 LocalContext context(0, templ); |
5078 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( | 5116 v8::Handle<v8::Array> result = v8::Handle<v8::Array>::Cast(CompileRun( |
5079 "function Run(obj) {" | 5117 "function Run(obj) {" |
5080 " try {" | 5118 " try {" |
5081 " Throw(obj);" | 5119 " Throw(obj);" |
5082 " } catch (e) {" | 5120 " } catch (e) {" |
5083 " return e;" | 5121 " return e;" |
5084 " }" | 5122 " }" |
5085 " return 'no exception';" | 5123 " return 'no exception';" |
5086 "}" | 5124 "}" |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5133 } | 5171 } |
5134 | 5172 |
5135 | 5173 |
5136 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { | 5174 void WithTryCatch(const v8::FunctionCallbackInfo<v8::Value>& args) { |
5137 v8::TryCatch try_catch; | 5175 v8::TryCatch try_catch; |
5138 } | 5176 } |
5139 | 5177 |
5140 | 5178 |
5141 THREADED_TEST(TryCatchAndFinally) { | 5179 THREADED_TEST(TryCatchAndFinally) { |
5142 LocalContext context; | 5180 LocalContext context; |
5143 v8::HandleScope scope(context->GetIsolate()); | 5181 v8::Isolate* isolate = context->GetIsolate(); |
| 5182 v8::HandleScope scope(isolate); |
5144 context->Global()->Set( | 5183 context->Global()->Set( |
5145 v8_str("native_with_try_catch"), | 5184 v8_str("native_with_try_catch"), |
5146 v8::FunctionTemplate::New(WithTryCatch)->GetFunction()); | 5185 v8::FunctionTemplate::New(isolate, WithTryCatch)->GetFunction()); |
5147 v8::TryCatch try_catch; | 5186 v8::TryCatch try_catch; |
5148 CHECK(!try_catch.HasCaught()); | 5187 CHECK(!try_catch.HasCaught()); |
5149 CompileRun( | 5188 CompileRun( |
5150 "try {\n" | 5189 "try {\n" |
5151 " throw new Error('a');\n" | 5190 " throw new Error('a');\n" |
5152 "} finally {\n" | 5191 "} finally {\n" |
5153 " native_with_try_catch();\n" | 5192 " native_with_try_catch();\n" |
5154 "}\n"); | 5193 "}\n"); |
5155 CHECK(try_catch.HasCaught()); | 5194 CHECK(try_catch.HasCaught()); |
5156 } | 5195 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5202 try_catch.ReThrow(); | 5241 try_catch.ReThrow(); |
5203 } | 5242 } |
5204 | 5243 |
5205 | 5244 |
5206 // This test ensures that an outer TryCatch in the following situation: | 5245 // This test ensures that an outer TryCatch in the following situation: |
5207 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError | 5246 // C++/TryCatch -> JS -> C++/TryCatch -> JS w/ SyntaxError |
5208 // does not clobber the Message object generated for the inner TryCatch. | 5247 // does not clobber the Message object generated for the inner TryCatch. |
5209 // This exercises the ability of TryCatch.ReThrow() to restore the | 5248 // This exercises the ability of TryCatch.ReThrow() to restore the |
5210 // inner pending Message before throwing the exception again. | 5249 // inner pending Message before throwing the exception again. |
5211 TEST(TryCatchMixedNesting) { | 5250 TEST(TryCatchMixedNesting) { |
5212 v8::HandleScope scope(CcTest::isolate()); | 5251 v8::Isolate* isolate = CcTest::isolate(); |
| 5252 v8::HandleScope scope(isolate); |
5213 v8::V8::Initialize(); | 5253 v8::V8::Initialize(); |
5214 v8::TryCatch try_catch; | 5254 v8::TryCatch try_catch; |
5215 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 5255 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
5216 templ->Set(v8_str("TryCatchMixedNestingHelper"), | 5256 templ->Set(v8_str("TryCatchMixedNestingHelper"), |
5217 v8::FunctionTemplate::New(TryCatchMixedNestingHelper)); | 5257 v8::FunctionTemplate::New(isolate, TryCatchMixedNestingHelper)); |
5218 LocalContext context(0, templ); | 5258 LocalContext context(0, templ); |
5219 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1); | 5259 CompileRunWithOrigin("TryCatchMixedNestingHelper();\n", "outer", 1, 1); |
5220 TryCatchMixedNestingCheck(&try_catch); | 5260 TryCatchMixedNestingCheck(&try_catch); |
5221 } | 5261 } |
5222 | 5262 |
5223 | 5263 |
5224 THREADED_TEST(Equality) { | 5264 THREADED_TEST(Equality) { |
5225 LocalContext context; | 5265 LocalContext context; |
5226 v8::Isolate* isolate = context->GetIsolate(); | 5266 v8::Isolate* isolate = context->GetIsolate(); |
5227 v8::HandleScope scope(context->GetIsolate()); | 5267 v8::HandleScope scope(context->GetIsolate()); |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5710 const v8::PropertyCallbackInfo<v8::Value>& info) { | 5750 const v8::PropertyCallbackInfo<v8::Value>& info) { |
5711 // Set x on the prototype object and do not handle the get request. | 5751 // Set x on the prototype object and do not handle the get request. |
5712 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); | 5752 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); |
5713 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); | 5753 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); |
5714 } | 5754 } |
5715 | 5755 |
5716 | 5756 |
5717 // This is a regression test for http://crbug.com/20104. Map | 5757 // This is a regression test for http://crbug.com/20104. Map |
5718 // transitions should not interfere with post interceptor lookup. | 5758 // transitions should not interfere with post interceptor lookup. |
5719 THREADED_TEST(NamedInterceptorMapTransitionRead) { | 5759 THREADED_TEST(NamedInterceptorMapTransitionRead) { |
5720 v8::HandleScope scope(CcTest::isolate()); | 5760 v8::Isolate* isolate = CcTest::isolate(); |
5721 Local<v8::FunctionTemplate> function_template = v8::FunctionTemplate::New(); | 5761 v8::HandleScope scope(isolate); |
| 5762 Local<v8::FunctionTemplate> function_template = |
| 5763 v8::FunctionTemplate::New(isolate); |
5722 Local<v8::ObjectTemplate> instance_template | 5764 Local<v8::ObjectTemplate> instance_template |
5723 = function_template->InstanceTemplate(); | 5765 = function_template->InstanceTemplate(); |
5724 instance_template->SetNamedPropertyHandler(SetXOnPrototypeGetter); | 5766 instance_template->SetNamedPropertyHandler(SetXOnPrototypeGetter); |
5725 LocalContext context; | 5767 LocalContext context; |
5726 context->Global()->Set(v8_str("F"), function_template->GetFunction()); | 5768 context->Global()->Set(v8_str("F"), function_template->GetFunction()); |
5727 // Create an instance of F and introduce a map transition for x. | 5769 // Create an instance of F and introduce a map transition for x. |
5728 CompileRun("var o = new F(); o.x = 23;"); | 5770 CompileRun("var o = new F(); o.x = 23;"); |
5729 // Create an instance of F and invoke the getter. The result should be 23. | 5771 // Create an instance of F and invoke the getter. The result should be 23. |
5730 Local<Value> result = CompileRun("o = new F(); o.x"); | 5772 Local<Value> result = CompileRun("o = new F(); o.x"); |
5731 CHECK_EQ(result->Int32Value(), 23); | 5773 CHECK_EQ(result->Int32Value(), 23); |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6167 " }" | 6209 " }" |
6168 " 'PASSED'" | 6210 " 'PASSED'" |
6169 "} catch(e) {" | 6211 "} catch(e) {" |
6170 " e" | 6212 " e" |
6171 "}"; | 6213 "}"; |
6172 ExpectString(code, "PASSED"); | 6214 ExpectString(code, "PASSED"); |
6173 } | 6215 } |
6174 | 6216 |
6175 | 6217 |
6176 THREADED_TEST(MultiContexts) { | 6218 THREADED_TEST(MultiContexts) { |
6177 v8::HandleScope scope(CcTest::isolate()); | 6219 v8::Isolate* isolate = CcTest::isolate(); |
| 6220 v8::HandleScope scope(isolate); |
6178 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(); | 6221 v8::Handle<ObjectTemplate> templ = ObjectTemplate::New(); |
6179 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(DummyCallHandler)); | 6222 templ->Set(v8_str("dummy"), v8::FunctionTemplate::New(isolate, |
| 6223 DummyCallHandler)); |
6180 | 6224 |
6181 Local<String> password = v8_str("Password"); | 6225 Local<String> password = v8_str("Password"); |
6182 | 6226 |
6183 // Create an environment | 6227 // Create an environment |
6184 LocalContext context0(0, templ); | 6228 LocalContext context0(0, templ); |
6185 context0->SetSecurityToken(password); | 6229 context0->SetSecurityToken(password); |
6186 v8::Handle<v8::Object> global0 = context0->Global(); | 6230 v8::Handle<v8::Object> global0 = context0->Global(); |
6187 global0->Set(v8_str("custom"), v8_num(1234)); | 6231 global0->Set(v8_str("custom"), v8_num(1234)); |
6188 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); | 6232 CHECK_EQ(1234, global0->Get(v8_str("custom"))->Int32Value()); |
6189 | 6233 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6256 LocalContext env1; | 6300 LocalContext env1; |
6257 Local<Script> script1 = Script::Compile(source); | 6301 Local<Script> script1 = Script::Compile(source); |
6258 CHECK_EQ(8901.0, script1->Run()->NumberValue()); | 6302 CHECK_EQ(8901.0, script1->Run()->NumberValue()); |
6259 } | 6303 } |
6260 | 6304 |
6261 | 6305 |
6262 THREADED_TEST(UndetectableObject) { | 6306 THREADED_TEST(UndetectableObject) { |
6263 LocalContext env; | 6307 LocalContext env; |
6264 v8::HandleScope scope(env->GetIsolate()); | 6308 v8::HandleScope scope(env->GetIsolate()); |
6265 | 6309 |
6266 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); | 6310 Local<v8::FunctionTemplate> desc = |
| 6311 v8::FunctionTemplate::New(env->GetIsolate()); |
6267 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6312 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6268 | 6313 |
6269 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6314 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
6270 env->Global()->Set(v8_str("undetectable"), obj); | 6315 env->Global()->Set(v8_str("undetectable"), obj); |
6271 | 6316 |
6272 ExpectString("undetectable.toString()", "[object Object]"); | 6317 ExpectString("undetectable.toString()", "[object Object]"); |
6273 ExpectString("typeof undetectable", "undefined"); | 6318 ExpectString("typeof undetectable", "undefined"); |
6274 ExpectString("typeof(undetectable)", "undefined"); | 6319 ExpectString("typeof(undetectable)", "undefined"); |
6275 ExpectBoolean("typeof undetectable == 'undefined'", true); | 6320 ExpectBoolean("typeof undetectable == 'undefined'", true); |
6276 ExpectBoolean("typeof undetectable == 'object'", false); | 6321 ExpectBoolean("typeof undetectable == 'object'", false); |
(...skipping 20 matching lines...) Expand all Loading... |
6297 ExpectBoolean("undetectable===null", false); | 6342 ExpectBoolean("undetectable===null", false); |
6298 ExpectBoolean("null===undetectable", false); | 6343 ExpectBoolean("null===undetectable", false); |
6299 ExpectBoolean("undetectable===undefined", false); | 6344 ExpectBoolean("undetectable===undefined", false); |
6300 ExpectBoolean("undefined===undetectable", false); | 6345 ExpectBoolean("undefined===undetectable", false); |
6301 ExpectBoolean("undetectable===undetectable", true); | 6346 ExpectBoolean("undetectable===undetectable", true); |
6302 } | 6347 } |
6303 | 6348 |
6304 | 6349 |
6305 THREADED_TEST(VoidLiteral) { | 6350 THREADED_TEST(VoidLiteral) { |
6306 LocalContext env; | 6351 LocalContext env; |
6307 v8::HandleScope scope(env->GetIsolate()); | 6352 v8::Isolate* isolate = env->GetIsolate(); |
| 6353 v8::HandleScope scope(isolate); |
6308 | 6354 |
6309 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); | 6355 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
6310 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6356 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6311 | 6357 |
6312 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6358 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
6313 env->Global()->Set(v8_str("undetectable"), obj); | 6359 env->Global()->Set(v8_str("undetectable"), obj); |
6314 | 6360 |
6315 ExpectBoolean("undefined == void 0", true); | 6361 ExpectBoolean("undefined == void 0", true); |
6316 ExpectBoolean("undetectable == void 0", true); | 6362 ExpectBoolean("undetectable == void 0", true); |
6317 ExpectBoolean("null == void 0", true); | 6363 ExpectBoolean("null == void 0", true); |
6318 ExpectBoolean("undefined === void 0", true); | 6364 ExpectBoolean("undefined === void 0", true); |
6319 ExpectBoolean("undetectable === void 0", false); | 6365 ExpectBoolean("undetectable === void 0", false); |
(...skipping 20 matching lines...) Expand all Loading... |
6340 " } catch(e) {" | 6386 " } catch(e) {" |
6341 " return e.toString();" | 6387 " return e.toString();" |
6342 " }" | 6388 " }" |
6343 "})()", | 6389 "})()", |
6344 "ReferenceError: x is not defined"); | 6390 "ReferenceError: x is not defined"); |
6345 } | 6391 } |
6346 | 6392 |
6347 | 6393 |
6348 THREADED_TEST(ExtensibleOnUndetectable) { | 6394 THREADED_TEST(ExtensibleOnUndetectable) { |
6349 LocalContext env; | 6395 LocalContext env; |
6350 v8::HandleScope scope(env->GetIsolate()); | 6396 v8::Isolate* isolate = env->GetIsolate(); |
| 6397 v8::HandleScope scope(isolate); |
6351 | 6398 |
6352 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); | 6399 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(isolate); |
6353 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 6400 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
6354 | 6401 |
6355 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 6402 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
6356 env->Global()->Set(v8_str("undetectable"), obj); | 6403 env->Global()->Set(v8_str("undetectable"), obj); |
6357 | 6404 |
6358 Local<String> source = v8_str("undetectable.x = 42;" | 6405 Local<String> source = v8_str("undetectable.x = 42;" |
6359 "undetectable.x"); | 6406 "undetectable.x"); |
6360 | 6407 |
6361 Local<Script> script = Script::Compile(source); | 6408 Local<Script> script = Script::Compile(source); |
6362 | 6409 |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6476 const v8::FunctionCallbackInfo<v8::Value>& args) { | 6523 const v8::FunctionCallbackInfo<v8::Value>& args) { |
6477 ApiTestFuzzer::Fuzz(); | 6524 ApiTestFuzzer::Fuzz(); |
6478 } | 6525 } |
6479 | 6526 |
6480 | 6527 |
6481 THREADED_TEST(GlobalObjectTemplate) { | 6528 THREADED_TEST(GlobalObjectTemplate) { |
6482 v8::Isolate* isolate = CcTest::isolate(); | 6529 v8::Isolate* isolate = CcTest::isolate(); |
6483 v8::HandleScope handle_scope(isolate); | 6530 v8::HandleScope handle_scope(isolate); |
6484 Local<ObjectTemplate> global_template = ObjectTemplate::New(); | 6531 Local<ObjectTemplate> global_template = ObjectTemplate::New(); |
6485 global_template->Set(v8_str("JSNI_Log"), | 6532 global_template->Set(v8_str("JSNI_Log"), |
6486 v8::FunctionTemplate::New(HandleLogDelegator)); | 6533 v8::FunctionTemplate::New(isolate, HandleLogDelegator)); |
6487 v8::Local<Context> context = Context::New(isolate, 0, global_template); | 6534 v8::Local<Context> context = Context::New(isolate, 0, global_template); |
6488 Context::Scope context_scope(context); | 6535 Context::Scope context_scope(context); |
6489 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); | 6536 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); |
6490 } | 6537 } |
6491 | 6538 |
6492 | 6539 |
6493 static const char* kSimpleExtensionSource = | 6540 static const char* kSimpleExtensionSource = |
6494 "function Foo() {" | 6541 "function Foo() {" |
6495 " return 4;" | 6542 " return 4;" |
6496 "}"; | 6543 "}"; |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6709 public: | 6756 public: |
6710 NativeFunctionExtension(const char* name, | 6757 NativeFunctionExtension(const char* name, |
6711 const char* source, | 6758 const char* source, |
6712 v8::FunctionCallback fun = &Echo) | 6759 v8::FunctionCallback fun = &Echo) |
6713 : Extension(name, source), | 6760 : Extension(name, source), |
6714 function_(fun) { } | 6761 function_(fun) { } |
6715 | 6762 |
6716 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( | 6763 virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate( |
6717 v8::Isolate* isolate, | 6764 v8::Isolate* isolate, |
6718 v8::Handle<v8::String> name) { | 6765 v8::Handle<v8::String> name) { |
6719 return v8::FunctionTemplate::New(function_); | 6766 return v8::FunctionTemplate::New(isolate, function_); |
6720 } | 6767 } |
6721 | 6768 |
6722 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { | 6769 static void Echo(const v8::FunctionCallbackInfo<v8::Value>& args) { |
6723 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); | 6770 if (args.Length() >= 1) args.GetReturnValue().Set(args[0]); |
6724 } | 6771 } |
6725 private: | 6772 private: |
6726 v8::FunctionCallback function_; | 6773 v8::FunctionCallback function_; |
6727 }; | 6774 }; |
6728 | 6775 |
6729 | 6776 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6839 v8::Isolate* isolate, | 6886 v8::Isolate* isolate, |
6840 v8::Handle<String> name); | 6887 v8::Handle<String> name); |
6841 }; | 6888 }; |
6842 | 6889 |
6843 | 6890 |
6844 static int lookup_count = 0; | 6891 static int lookup_count = 0; |
6845 v8::Handle<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate( | 6892 v8::Handle<v8::FunctionTemplate> FunctionExtension::GetNativeFunctionTemplate( |
6846 v8::Isolate* isolate, v8::Handle<String> name) { | 6893 v8::Isolate* isolate, v8::Handle<String> name) { |
6847 lookup_count++; | 6894 lookup_count++; |
6848 if (name->Equals(v8_str("A"))) { | 6895 if (name->Equals(v8_str("A"))) { |
6849 return v8::FunctionTemplate::New(CallFun, v8::Integer::New(8)); | 6896 return v8::FunctionTemplate::New(isolate, CallFun, v8::Integer::New(8)); |
6850 } else if (name->Equals(v8_str("B"))) { | 6897 } else if (name->Equals(v8_str("B"))) { |
6851 return v8::FunctionTemplate::New(CallFun, v8::Integer::New(7)); | 6898 return v8::FunctionTemplate::New(isolate, CallFun, v8::Integer::New(7)); |
6852 } else if (name->Equals(v8_str("C"))) { | 6899 } else if (name->Equals(v8_str("C"))) { |
6853 return v8::FunctionTemplate::New(CallFun, v8::Integer::New(6)); | 6900 return v8::FunctionTemplate::New(isolate, CallFun, v8::Integer::New(6)); |
6854 } else { | 6901 } else { |
6855 return v8::Handle<v8::FunctionTemplate>(); | 6902 return v8::Handle<v8::FunctionTemplate>(); |
6856 } | 6903 } |
6857 } | 6904 } |
6858 | 6905 |
6859 | 6906 |
6860 THREADED_TEST(FunctionLookup) { | 6907 THREADED_TEST(FunctionLookup) { |
6861 v8::RegisterExtension(new FunctionExtension()); | 6908 v8::RegisterExtension(new FunctionExtension()); |
6862 v8::HandleScope handle_scope(CcTest::isolate()); | 6909 v8::HandleScope handle_scope(CcTest::isolate()); |
6863 static const char* exts[1] = { "functiontest" }; | 6910 static const char* exts[1] = { "functiontest" }; |
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7197 CHECK_EQ(v8::Integer::New(1, isolate), args[0]); | 7244 CHECK_EQ(v8::Integer::New(1, isolate), args[0]); |
7198 CHECK_EQ(v8::Integer::New(2, isolate), args[1]); | 7245 CHECK_EQ(v8::Integer::New(2, isolate), args[1]); |
7199 CHECK_EQ(v8::Integer::New(3, isolate), args[2]); | 7246 CHECK_EQ(v8::Integer::New(3, isolate), args[2]); |
7200 CHECK_EQ(v8::Undefined(isolate), args[3]); | 7247 CHECK_EQ(v8::Undefined(isolate), args[3]); |
7201 v8::HandleScope scope(args.GetIsolate()); | 7248 v8::HandleScope scope(args.GetIsolate()); |
7202 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 7249 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
7203 } | 7250 } |
7204 | 7251 |
7205 | 7252 |
7206 THREADED_TEST(Arguments) { | 7253 THREADED_TEST(Arguments) { |
7207 v8::HandleScope scope(CcTest::isolate()); | 7254 v8::Isolate* isolate = CcTest::isolate(); |
| 7255 v8::HandleScope scope(isolate); |
7208 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); | 7256 v8::Handle<v8::ObjectTemplate> global = ObjectTemplate::New(); |
7209 global->Set(v8_str("f"), v8::FunctionTemplate::New(ArgumentsTestCallback)); | 7257 global->Set(v8_str("f"), |
| 7258 v8::FunctionTemplate::New(isolate, ArgumentsTestCallback)); |
7210 LocalContext context(NULL, global); | 7259 LocalContext context(NULL, global); |
7211 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); | 7260 args_fun = context->Global()->Get(v8_str("f")).As<Function>(); |
7212 v8_compile("f(1, 2, 3)")->Run(); | 7261 v8_compile("f(1, 2, 3)")->Run(); |
7213 } | 7262 } |
7214 | 7263 |
7215 | 7264 |
7216 static void NoBlockGetterX(Local<String> name, | 7265 static void NoBlockGetterX(Local<String> name, |
7217 const v8::PropertyCallbackInfo<v8::Value>&) { | 7266 const v8::PropertyCallbackInfo<v8::Value>&) { |
7218 } | 7267 } |
7219 | 7268 |
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8055 LocalContext context; | 8104 LocalContext context; |
8056 v8::Handle<v8::Object> holder = obj->NewInstance(); | 8105 v8::Handle<v8::Object> holder = obj->NewInstance(); |
8057 context->Global()->Set(v8_str("holder"), holder); | 8106 context->Global()->Set(v8_str("holder"), holder); |
8058 v8::Handle<Value> result = CompileRun( | 8107 v8::Handle<Value> result = CompileRun( |
8059 "holder.y = 11; holder.y = 12; holder.y"); | 8108 "holder.y = 11; holder.y = 12; holder.y"); |
8060 CHECK_EQ(12, result->Uint32Value()); | 8109 CHECK_EQ(12, result->Uint32Value()); |
8061 } | 8110 } |
8062 | 8111 |
8063 | 8112 |
8064 THREADED_TEST(TypeSwitch) { | 8113 THREADED_TEST(TypeSwitch) { |
8065 v8::HandleScope scope(CcTest::isolate()); | 8114 v8::Isolate* isolate = CcTest::isolate(); |
8066 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(); | 8115 v8::HandleScope scope(isolate); |
8067 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(); | 8116 v8::Handle<v8::FunctionTemplate> templ1 = v8::FunctionTemplate::New(isolate); |
8068 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(); | 8117 v8::Handle<v8::FunctionTemplate> templ2 = v8::FunctionTemplate::New(isolate); |
| 8118 v8::Handle<v8::FunctionTemplate> templ3 = v8::FunctionTemplate::New(isolate); |
8069 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 }; | 8119 v8::Handle<v8::FunctionTemplate> templs[3] = { templ1, templ2, templ3 }; |
8070 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); | 8120 v8::Handle<v8::TypeSwitch> type_switch = v8::TypeSwitch::New(3, templs); |
8071 LocalContext context; | 8121 LocalContext context; |
8072 v8::Handle<v8::Object> obj0 = v8::Object::New(); | 8122 v8::Handle<v8::Object> obj0 = v8::Object::New(); |
8073 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance(); | 8123 v8::Handle<v8::Object> obj1 = templ1->GetFunction()->NewInstance(); |
8074 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance(); | 8124 v8::Handle<v8::Object> obj2 = templ2->GetFunction()->NewInstance(); |
8075 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance(); | 8125 v8::Handle<v8::Object> obj3 = templ3->GetFunction()->NewInstance(); |
8076 for (int i = 0; i < 10; i++) { | 8126 for (int i = 0; i < 10; i++) { |
8077 CHECK_EQ(0, type_switch->match(obj0)); | 8127 CHECK_EQ(0, type_switch->match(obj0)); |
8078 CHECK_EQ(1, type_switch->match(obj1)); | 8128 CHECK_EQ(1, type_switch->match(obj1)); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8136 v8::Handle<Value>) { | 8186 v8::Handle<Value>) { |
8137 report_count++; | 8187 report_count++; |
8138 } | 8188 } |
8139 | 8189 |
8140 | 8190 |
8141 // Counts uncaught exceptions, but other tests running in parallel | 8191 // Counts uncaught exceptions, but other tests running in parallel |
8142 // also have uncaught exceptions. | 8192 // also have uncaught exceptions. |
8143 TEST(ApiUncaughtException) { | 8193 TEST(ApiUncaughtException) { |
8144 report_count = 0; | 8194 report_count = 0; |
8145 LocalContext env; | 8195 LocalContext env; |
8146 v8::HandleScope scope(env->GetIsolate()); | 8196 v8::Isolate* isolate = env->GetIsolate(); |
| 8197 v8::HandleScope scope(isolate); |
8147 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); | 8198 v8::V8::AddMessageListener(ApiUncaughtExceptionTestListener); |
8148 | 8199 |
8149 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(TroubleCallback); | 8200 Local<v8::FunctionTemplate> fun = |
| 8201 v8::FunctionTemplate::New(isolate, TroubleCallback); |
8150 v8::Local<v8::Object> global = env->Global(); | 8202 v8::Local<v8::Object> global = env->Global(); |
8151 global->Set(v8_str("trouble"), fun->GetFunction()); | 8203 global->Set(v8_str("trouble"), fun->GetFunction()); |
8152 | 8204 |
8153 Script::Compile(v8_str("function trouble_callee() {" | 8205 Script::Compile(v8_str("function trouble_callee() {" |
8154 " var x = null;" | 8206 " var x = null;" |
8155 " return x.foo;" | 8207 " return x.foo;" |
8156 "};" | 8208 "};" |
8157 "function trouble_caller() {" | 8209 "function trouble_caller() {" |
8158 " trouble();" | 8210 " trouble();" |
8159 "};"))->Run(); | 8211 "};"))->Run(); |
(...skipping 16 matching lines...) Expand all Loading... |
8176 v8::String::Utf8Value name(message->GetScriptResourceName()); | 8228 v8::String::Utf8Value name(message->GetScriptResourceName()); |
8177 CHECK_EQ(script_resource_name, *name); | 8229 CHECK_EQ(script_resource_name, *name); |
8178 CHECK_EQ(3, message->GetLineNumber()); | 8230 CHECK_EQ(3, message->GetLineNumber()); |
8179 v8::String::Utf8Value source_line(message->GetSourceLine()); | 8231 v8::String::Utf8Value source_line(message->GetSourceLine()); |
8180 CHECK_EQ(" new o.foo();", *source_line); | 8232 CHECK_EQ(" new o.foo();", *source_line); |
8181 } | 8233 } |
8182 | 8234 |
8183 | 8235 |
8184 TEST(ExceptionInNativeScript) { | 8236 TEST(ExceptionInNativeScript) { |
8185 LocalContext env; | 8237 LocalContext env; |
8186 v8::HandleScope scope(env->GetIsolate()); | 8238 v8::Isolate* isolate = env->GetIsolate(); |
| 8239 v8::HandleScope scope(isolate); |
8187 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); | 8240 v8::V8::AddMessageListener(ExceptionInNativeScriptTestListener); |
8188 | 8241 |
8189 Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(TroubleCallback); | 8242 Local<v8::FunctionTemplate> fun = |
| 8243 v8::FunctionTemplate::New(isolate, TroubleCallback); |
8190 v8::Local<v8::Object> global = env->Global(); | 8244 v8::Local<v8::Object> global = env->Global(); |
8191 global->Set(v8_str("trouble"), fun->GetFunction()); | 8245 global->Set(v8_str("trouble"), fun->GetFunction()); |
8192 | 8246 |
8193 Script::Compile( | 8247 Script::Compile( |
8194 v8_str( | 8248 v8_str( |
8195 "function trouble() {\n" | 8249 "function trouble() {\n" |
8196 " var o = {};\n" | 8250 " var o = {};\n" |
8197 " new o.foo();\n" | 8251 " new o.foo();\n" |
8198 "};"), | 8252 "};"), |
8199 v8::String::NewFromUtf8(env->GetIsolate(), script_resource_name))->Run(); | 8253 v8::String::NewFromUtf8(isolate, script_resource_name))->Run(); |
8200 Local<Value> trouble = global->Get(v8_str("trouble")); | 8254 Local<Value> trouble = global->Get(v8_str("trouble")); |
8201 CHECK(trouble->IsFunction()); | 8255 CHECK(trouble->IsFunction()); |
8202 Function::Cast(*trouble)->Call(global, 0, NULL); | 8256 Function::Cast(*trouble)->Call(global, 0, NULL); |
8203 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); | 8257 v8::V8::RemoveMessageListeners(ExceptionInNativeScriptTestListener); |
8204 } | 8258 } |
8205 | 8259 |
8206 | 8260 |
8207 TEST(CompilationErrorUsingTryCatchHandler) { | 8261 TEST(CompilationErrorUsingTryCatchHandler) { |
8208 LocalContext env; | 8262 LocalContext env; |
8209 v8::HandleScope scope(env->GetIsolate()); | 8263 v8::HandleScope scope(env->GetIsolate()); |
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8762 // Add an accessor accessible by cross-domain JS code. | 8816 // Add an accessor accessible by cross-domain JS code. |
8763 global_template->SetAccessor( | 8817 global_template->SetAccessor( |
8764 v8_str("accessible_prop"), | 8818 v8_str("accessible_prop"), |
8765 EchoGetter, EchoSetter, | 8819 EchoGetter, EchoSetter, |
8766 v8::Handle<Value>(), | 8820 v8::Handle<Value>(), |
8767 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 8821 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
8768 | 8822 |
8769 | 8823 |
8770 global_template->SetAccessorProperty( | 8824 global_template->SetAccessorProperty( |
8771 v8_str("accessible_js_prop"), | 8825 v8_str("accessible_js_prop"), |
8772 v8::FunctionTemplate::New(EchoGetter), | 8826 v8::FunctionTemplate::New(isolate, EchoGetter), |
8773 v8::FunctionTemplate::New(EchoSetter), | 8827 v8::FunctionTemplate::New(isolate, EchoSetter), |
8774 v8::None, | 8828 v8::None, |
8775 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 8829 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
8776 | 8830 |
8777 // Add an accessor that is not accessible by cross-domain JS code. | 8831 // Add an accessor that is not accessible by cross-domain JS code. |
8778 global_template->SetAccessor(v8_str("blocked_prop"), | 8832 global_template->SetAccessor(v8_str("blocked_prop"), |
8779 UnreachableGetter, UnreachableSetter, | 8833 UnreachableGetter, UnreachableSetter, |
8780 v8::Handle<Value>(), | 8834 v8::Handle<Value>(), |
8781 v8::DEFAULT); | 8835 v8::DEFAULT); |
8782 | 8836 |
8783 global_template->SetAccessorProperty( | 8837 global_template->SetAccessorProperty( |
8784 v8_str("blocked_js_prop"), | 8838 v8_str("blocked_js_prop"), |
8785 v8::FunctionTemplate::New(UnreachableFunction), | 8839 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
8786 v8::FunctionTemplate::New(UnreachableFunction), | 8840 v8::FunctionTemplate::New(isolate, UnreachableFunction), |
8787 v8::None, | 8841 v8::None, |
8788 v8::DEFAULT); | 8842 v8::DEFAULT); |
8789 | 8843 |
8790 // Create an environment | 8844 // Create an environment |
8791 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); | 8845 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
8792 context0->Enter(); | 8846 context0->Enter(); |
8793 | 8847 |
8794 v8::Handle<v8::Object> global0 = context0->Global(); | 8848 v8::Handle<v8::Object> global0 = context0->Global(); |
8795 | 8849 |
8796 // Define a property with JS getter and setter. | 8850 // Define a property with JS getter and setter. |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9209 static void ConstTenGetter(Local<String> name, | 9263 static void ConstTenGetter(Local<String> name, |
9210 const v8::PropertyCallbackInfo<v8::Value>& info) { | 9264 const v8::PropertyCallbackInfo<v8::Value>& info) { |
9211 info.GetReturnValue().Set(v8_num(10)); | 9265 info.GetReturnValue().Set(v8_num(10)); |
9212 } | 9266 } |
9213 | 9267 |
9214 | 9268 |
9215 THREADED_TEST(CrossDomainAccessors) { | 9269 THREADED_TEST(CrossDomainAccessors) { |
9216 v8::Isolate* isolate = CcTest::isolate(); | 9270 v8::Isolate* isolate = CcTest::isolate(); |
9217 v8::HandleScope handle_scope(isolate); | 9271 v8::HandleScope handle_scope(isolate); |
9218 | 9272 |
9219 v8::Handle<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(); | 9273 v8::Handle<v8::FunctionTemplate> func_template = |
| 9274 v8::FunctionTemplate::New(isolate); |
9220 | 9275 |
9221 v8::Handle<v8::ObjectTemplate> global_template = | 9276 v8::Handle<v8::ObjectTemplate> global_template = |
9222 func_template->InstanceTemplate(); | 9277 func_template->InstanceTemplate(); |
9223 | 9278 |
9224 v8::Handle<v8::ObjectTemplate> proto_template = | 9279 v8::Handle<v8::ObjectTemplate> proto_template = |
9225 func_template->PrototypeTemplate(); | 9280 func_template->PrototypeTemplate(); |
9226 | 9281 |
9227 // Add an accessor to proto that's accessible by cross-domain JS code. | 9282 // Add an accessor to proto that's accessible by cross-domain JS code. |
9228 proto_template->SetAccessor(v8_str("accessible"), | 9283 proto_template->SetAccessor(v8_str("accessible"), |
9229 ConstTenGetter, 0, | 9284 ConstTenGetter, 0, |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9575 | 9630 |
9576 static void InstanceFunctionCallback( | 9631 static void InstanceFunctionCallback( |
9577 const v8::FunctionCallbackInfo<v8::Value>& args) { | 9632 const v8::FunctionCallbackInfo<v8::Value>& args) { |
9578 ApiTestFuzzer::Fuzz(); | 9633 ApiTestFuzzer::Fuzz(); |
9579 args.GetReturnValue().Set(v8_num(12)); | 9634 args.GetReturnValue().Set(v8_num(12)); |
9580 } | 9635 } |
9581 | 9636 |
9582 | 9637 |
9583 THREADED_TEST(InstanceProperties) { | 9638 THREADED_TEST(InstanceProperties) { |
9584 LocalContext context; | 9639 LocalContext context; |
9585 v8::HandleScope handle_scope(context->GetIsolate()); | 9640 v8::Isolate* isolate = context->GetIsolate(); |
| 9641 v8::HandleScope handle_scope(isolate); |
9586 | 9642 |
9587 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 9643 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9588 Local<ObjectTemplate> instance = t->InstanceTemplate(); | 9644 Local<ObjectTemplate> instance = t->InstanceTemplate(); |
9589 | 9645 |
9590 instance->Set(v8_str("x"), v8_num(42)); | 9646 instance->Set(v8_str("x"), v8_num(42)); |
9591 instance->Set(v8_str("f"), | 9647 instance->Set(v8_str("f"), |
9592 v8::FunctionTemplate::New(InstanceFunctionCallback)); | 9648 v8::FunctionTemplate::New(isolate, InstanceFunctionCallback)); |
9593 | 9649 |
9594 Local<Value> o = t->GetFunction()->NewInstance(); | 9650 Local<Value> o = t->GetFunction()->NewInstance(); |
9595 | 9651 |
9596 context->Global()->Set(v8_str("i"), o); | 9652 context->Global()->Set(v8_str("i"), o); |
9597 Local<Value> value = Script::Compile(v8_str("i.x"))->Run(); | 9653 Local<Value> value = Script::Compile(v8_str("i.x"))->Run(); |
9598 CHECK_EQ(42, value->Int32Value()); | 9654 CHECK_EQ(42, value->Int32Value()); |
9599 | 9655 |
9600 value = Script::Compile(v8_str("i.f()"))->Run(); | 9656 value = Script::Compile(v8_str("i.f()"))->Run(); |
9601 CHECK_EQ(12, value->Int32Value()); | 9657 CHECK_EQ(12, value->Int32Value()); |
9602 } | 9658 } |
9603 | 9659 |
9604 | 9660 |
9605 static void GlobalObjectInstancePropertiesGet( | 9661 static void GlobalObjectInstancePropertiesGet( |
9606 Local<String> key, | 9662 Local<String> key, |
9607 const v8::PropertyCallbackInfo<v8::Value>&) { | 9663 const v8::PropertyCallbackInfo<v8::Value>&) { |
9608 ApiTestFuzzer::Fuzz(); | 9664 ApiTestFuzzer::Fuzz(); |
9609 } | 9665 } |
9610 | 9666 |
9611 | 9667 |
9612 THREADED_TEST(GlobalObjectInstanceProperties) { | 9668 THREADED_TEST(GlobalObjectInstanceProperties) { |
9613 v8::HandleScope handle_scope(CcTest::isolate()); | 9669 v8::Isolate* isolate = CcTest::isolate(); |
| 9670 v8::HandleScope handle_scope(isolate); |
9614 | 9671 |
9615 Local<Value> global_object; | 9672 Local<Value> global_object; |
9616 | 9673 |
9617 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 9674 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9618 t->InstanceTemplate()->SetNamedPropertyHandler( | 9675 t->InstanceTemplate()->SetNamedPropertyHandler( |
9619 GlobalObjectInstancePropertiesGet); | 9676 GlobalObjectInstancePropertiesGet); |
9620 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 9677 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
9621 instance_template->Set(v8_str("x"), v8_num(42)); | 9678 instance_template->Set(v8_str("x"), v8_num(42)); |
9622 instance_template->Set(v8_str("f"), | 9679 instance_template->Set(v8_str("f"), |
9623 v8::FunctionTemplate::New(InstanceFunctionCallback)); | 9680 v8::FunctionTemplate::New(isolate, |
| 9681 InstanceFunctionCallback)); |
9624 | 9682 |
9625 // The script to check how Crankshaft compiles missing global function | 9683 // The script to check how Crankshaft compiles missing global function |
9626 // invocations. function g is not defined and should throw on call. | 9684 // invocations. function g is not defined and should throw on call. |
9627 const char* script = | 9685 const char* script = |
9628 "function wrapper(call) {" | 9686 "function wrapper(call) {" |
9629 " var x = 0, y = 1;" | 9687 " var x = 0, y = 1;" |
9630 " for (var i = 0; i < 1000; i++) {" | 9688 " for (var i = 0; i < 1000; i++) {" |
9631 " x += i * 100;" | 9689 " x += i * 100;" |
9632 " y += i * 100;" | 9690 " y += i * 100;" |
9633 " }" | 9691 " }" |
(...skipping 25 matching lines...) Expand all Loading... |
9659 CHECK_EQ(42, value->Int32Value()); | 9717 CHECK_EQ(42, value->Int32Value()); |
9660 value = Script::Compile(v8_str("f()"))->Run(); | 9718 value = Script::Compile(v8_str("f()"))->Run(); |
9661 CHECK_EQ(12, value->Int32Value()); | 9719 CHECK_EQ(12, value->Int32Value()); |
9662 value = Script::Compile(v8_str(script))->Run(); | 9720 value = Script::Compile(v8_str(script))->Run(); |
9663 CHECK_EQ(1, value->Int32Value()); | 9721 CHECK_EQ(1, value->Int32Value()); |
9664 } | 9722 } |
9665 } | 9723 } |
9666 | 9724 |
9667 | 9725 |
9668 THREADED_TEST(CallKnownGlobalReceiver) { | 9726 THREADED_TEST(CallKnownGlobalReceiver) { |
9669 v8::HandleScope handle_scope(CcTest::isolate()); | 9727 v8::Isolate* isolate = CcTest::isolate(); |
| 9728 v8::HandleScope handle_scope(isolate); |
9670 | 9729 |
9671 Local<Value> global_object; | 9730 Local<Value> global_object; |
9672 | 9731 |
9673 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 9732 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9674 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 9733 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
9675 | 9734 |
9676 // The script to check that we leave global object not | 9735 // The script to check that we leave global object not |
9677 // global object proxy on stack when we deoptimize from inside | 9736 // global object proxy on stack when we deoptimize from inside |
9678 // arguments evaluation. | 9737 // arguments evaluation. |
9679 // To provoke error we need to both force deoptimization | 9738 // To provoke error we need to both force deoptimization |
9680 // from arguments evaluation and to force CallIC to take | 9739 // from arguments evaluation and to force CallIC to take |
9681 // CallIC_Miss code path that can't cope with global proxy. | 9740 // CallIC_Miss code path that can't cope with global proxy. |
9682 const char* script = | 9741 const char* script = |
9683 "function bar(x, y) { try { } finally { } }" | 9742 "function bar(x, y) { try { } finally { } }" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9738 } | 9797 } |
9739 | 9798 |
9740 | 9799 |
9741 static void ShadowNamedGet(Local<String> key, | 9800 static void ShadowNamedGet(Local<String> key, |
9742 const v8::PropertyCallbackInfo<v8::Value>&) { | 9801 const v8::PropertyCallbackInfo<v8::Value>&) { |
9743 } | 9802 } |
9744 | 9803 |
9745 | 9804 |
9746 THREADED_TEST(ShadowObject) { | 9805 THREADED_TEST(ShadowObject) { |
9747 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; | 9806 shadow_y = shadow_y_setter_call_count = shadow_y_getter_call_count = 0; |
9748 v8::HandleScope handle_scope(CcTest::isolate()); | 9807 v8::Isolate* isolate = CcTest::isolate(); |
| 9808 v8::HandleScope handle_scope(isolate); |
9749 | 9809 |
9750 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 9810 Local<ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
9751 LocalContext context(NULL, global_template); | 9811 LocalContext context(NULL, global_template); |
9752 | 9812 |
9753 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 9813 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
9754 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet); | 9814 t->InstanceTemplate()->SetNamedPropertyHandler(ShadowNamedGet); |
9755 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet); | 9815 t->InstanceTemplate()->SetIndexedPropertyHandler(ShadowIndexedGet); |
9756 Local<ObjectTemplate> proto = t->PrototypeTemplate(); | 9816 Local<ObjectTemplate> proto = t->PrototypeTemplate(); |
9757 Local<ObjectTemplate> instance = t->InstanceTemplate(); | 9817 Local<ObjectTemplate> instance = t->InstanceTemplate(); |
9758 | 9818 |
9759 proto->Set(v8_str("f"), | 9819 proto->Set(v8_str("f"), |
9760 v8::FunctionTemplate::New(ShadowFunctionCallback, Local<Value>())); | 9820 v8::FunctionTemplate::New(isolate, |
| 9821 ShadowFunctionCallback, |
| 9822 Local<Value>())); |
9761 proto->Set(v8_str("x"), v8_num(12)); | 9823 proto->Set(v8_str("x"), v8_num(12)); |
9762 | 9824 |
9763 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); | 9825 instance->SetAccessor(v8_str("y"), ShadowYGetter, ShadowYSetter); |
9764 | 9826 |
9765 Local<Value> o = t->GetFunction()->NewInstance(); | 9827 Local<Value> o = t->GetFunction()->NewInstance(); |
9766 context->Global()->Set(v8_str("__proto__"), o); | 9828 context->Global()->Set(v8_str("__proto__"), o); |
9767 | 9829 |
9768 Local<Value> value = | 9830 Local<Value> value = |
9769 Script::Compile(v8_str("this.propertyIsEnumerable(0)"))->Run(); | 9831 Script::Compile(v8_str("this.propertyIsEnumerable(0)"))->Run(); |
9770 CHECK(value->IsBoolean()); | 9832 CHECK(value->IsBoolean()); |
9771 CHECK(!value->BooleanValue()); | 9833 CHECK(!value->BooleanValue()); |
9772 | 9834 |
9773 value = Script::Compile(v8_str("x"))->Run(); | 9835 value = Script::Compile(v8_str("x"))->Run(); |
9774 CHECK_EQ(12, value->Int32Value()); | 9836 CHECK_EQ(12, value->Int32Value()); |
9775 | 9837 |
9776 value = Script::Compile(v8_str("f()"))->Run(); | 9838 value = Script::Compile(v8_str("f()"))->Run(); |
9777 CHECK_EQ(42, value->Int32Value()); | 9839 CHECK_EQ(42, value->Int32Value()); |
9778 | 9840 |
9779 Script::Compile(v8_str("y = 43"))->Run(); | 9841 Script::Compile(v8_str("y = 43"))->Run(); |
9780 CHECK_EQ(1, shadow_y_setter_call_count); | 9842 CHECK_EQ(1, shadow_y_setter_call_count); |
9781 value = Script::Compile(v8_str("y"))->Run(); | 9843 value = Script::Compile(v8_str("y"))->Run(); |
9782 CHECK_EQ(1, shadow_y_getter_call_count); | 9844 CHECK_EQ(1, shadow_y_getter_call_count); |
9783 CHECK_EQ(42, value->Int32Value()); | 9845 CHECK_EQ(42, value->Int32Value()); |
9784 } | 9846 } |
9785 | 9847 |
9786 | 9848 |
9787 THREADED_TEST(HiddenPrototype) { | 9849 THREADED_TEST(HiddenPrototype) { |
9788 LocalContext context; | 9850 LocalContext context; |
9789 v8::HandleScope handle_scope(context->GetIsolate()); | 9851 v8::Isolate* isolate = context->GetIsolate(); |
| 9852 v8::HandleScope handle_scope(isolate); |
9790 | 9853 |
9791 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(); | 9854 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
9792 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 9855 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9793 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 9856 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9794 t1->SetHiddenPrototype(true); | 9857 t1->SetHiddenPrototype(true); |
9795 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); | 9858 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); |
9796 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); | 9859 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9797 t2->SetHiddenPrototype(true); | 9860 t2->SetHiddenPrototype(true); |
9798 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); | 9861 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); |
9799 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(); | 9862 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
9800 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); | 9863 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); |
9801 | 9864 |
9802 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); | 9865 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); |
9803 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 9866 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); |
9804 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 9867 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); |
9805 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 9868 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); |
9806 | 9869 |
9807 // Setting the prototype on an object skips hidden prototypes. | 9870 // Setting the prototype on an object skips hidden prototypes. |
9808 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 9871 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); |
9809 o0->Set(v8_str("__proto__"), o1); | 9872 o0->Set(v8_str("__proto__"), o1); |
(...skipping 13 matching lines...) Expand all Loading... |
9823 // which is o3. Therefore, z should not be defined on the prototype | 9886 // which is o3. Therefore, z should not be defined on the prototype |
9824 // object. | 9887 // object. |
9825 Local<Value> proto = o0->Get(v8_str("__proto__")); | 9888 Local<Value> proto = o0->Get(v8_str("__proto__")); |
9826 CHECK(proto->IsObject()); | 9889 CHECK(proto->IsObject()); |
9827 CHECK(proto.As<v8::Object>()->Get(v8_str("z"))->IsUndefined()); | 9890 CHECK(proto.As<v8::Object>()->Get(v8_str("z"))->IsUndefined()); |
9828 } | 9891 } |
9829 | 9892 |
9830 | 9893 |
9831 THREADED_TEST(HiddenPrototypeSet) { | 9894 THREADED_TEST(HiddenPrototypeSet) { |
9832 LocalContext context; | 9895 LocalContext context; |
9833 v8::HandleScope handle_scope(context->GetIsolate()); | 9896 v8::Isolate* isolate = context->GetIsolate(); |
| 9897 v8::HandleScope handle_scope(isolate); |
9834 | 9898 |
9835 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(); | 9899 Local<v8::FunctionTemplate> ot = v8::FunctionTemplate::New(isolate); |
9836 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(); | 9900 Local<v8::FunctionTemplate> ht = v8::FunctionTemplate::New(isolate); |
9837 ht->SetHiddenPrototype(true); | 9901 ht->SetHiddenPrototype(true); |
9838 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(); | 9902 Local<v8::FunctionTemplate> pt = v8::FunctionTemplate::New(isolate); |
9839 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 9903 ht->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9840 | 9904 |
9841 Local<v8::Object> o = ot->GetFunction()->NewInstance(); | 9905 Local<v8::Object> o = ot->GetFunction()->NewInstance(); |
9842 Local<v8::Object> h = ht->GetFunction()->NewInstance(); | 9906 Local<v8::Object> h = ht->GetFunction()->NewInstance(); |
9843 Local<v8::Object> p = pt->GetFunction()->NewInstance(); | 9907 Local<v8::Object> p = pt->GetFunction()->NewInstance(); |
9844 o->Set(v8_str("__proto__"), h); | 9908 o->Set(v8_str("__proto__"), h); |
9845 h->Set(v8_str("__proto__"), p); | 9909 h->Set(v8_str("__proto__"), p); |
9846 | 9910 |
9847 // Setting a property that exists on the hidden prototype goes there. | 9911 // Setting a property that exists on the hidden prototype goes there. |
9848 o->Set(v8_str("x"), v8_num(7)); | 9912 o->Set(v8_str("x"), v8_num(7)); |
(...skipping 18 matching lines...) Expand all Loading... |
9867 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); | 9931 CHECK_EQ(8, h->Get(v8_str("z"))->Int32Value()); |
9868 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); | 9932 CHECK_EQ(8, p->Get(v8_str("z"))->Int32Value()); |
9869 } | 9933 } |
9870 | 9934 |
9871 | 9935 |
9872 // Regression test for issue 2457. | 9936 // Regression test for issue 2457. |
9873 THREADED_TEST(HiddenPrototypeIdentityHash) { | 9937 THREADED_TEST(HiddenPrototypeIdentityHash) { |
9874 LocalContext context; | 9938 LocalContext context; |
9875 v8::HandleScope handle_scope(context->GetIsolate()); | 9939 v8::HandleScope handle_scope(context->GetIsolate()); |
9876 | 9940 |
9877 Handle<FunctionTemplate> t = FunctionTemplate::New(); | 9941 Handle<FunctionTemplate> t = FunctionTemplate::New(context->GetIsolate()); |
9878 t->SetHiddenPrototype(true); | 9942 t->SetHiddenPrototype(true); |
9879 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75)); | 9943 t->InstanceTemplate()->Set(v8_str("foo"), v8_num(75)); |
9880 Handle<Object> p = t->GetFunction()->NewInstance(); | 9944 Handle<Object> p = t->GetFunction()->NewInstance(); |
9881 Handle<Object> o = Object::New(); | 9945 Handle<Object> o = Object::New(); |
9882 o->SetPrototype(p); | 9946 o->SetPrototype(p); |
9883 | 9947 |
9884 int hash = o->GetIdentityHash(); | 9948 int hash = o->GetIdentityHash(); |
9885 USE(hash); | 9949 USE(hash); |
9886 o->Set(v8_str("foo"), v8_num(42)); | 9950 o->Set(v8_str("foo"), v8_num(42)); |
9887 ASSERT_EQ(hash, o->GetIdentityHash()); | 9951 ASSERT_EQ(hash, o->GetIdentityHash()); |
9888 } | 9952 } |
9889 | 9953 |
9890 | 9954 |
9891 THREADED_TEST(SetPrototype) { | 9955 THREADED_TEST(SetPrototype) { |
9892 LocalContext context; | 9956 LocalContext context; |
9893 v8::HandleScope handle_scope(context->GetIsolate()); | 9957 v8::Isolate* isolate = context->GetIsolate(); |
| 9958 v8::HandleScope handle_scope(isolate); |
9894 | 9959 |
9895 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(); | 9960 Local<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(isolate); |
9896 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); | 9961 t0->InstanceTemplate()->Set(v8_str("x"), v8_num(0)); |
9897 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 9962 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9898 t1->SetHiddenPrototype(true); | 9963 t1->SetHiddenPrototype(true); |
9899 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); | 9964 t1->InstanceTemplate()->Set(v8_str("y"), v8_num(1)); |
9900 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); | 9965 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9901 t2->SetHiddenPrototype(true); | 9966 t2->SetHiddenPrototype(true); |
9902 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); | 9967 t2->InstanceTemplate()->Set(v8_str("z"), v8_num(2)); |
9903 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(); | 9968 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
9904 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); | 9969 t3->InstanceTemplate()->Set(v8_str("u"), v8_num(3)); |
9905 | 9970 |
9906 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); | 9971 Local<v8::Object> o0 = t0->GetFunction()->NewInstance(); |
9907 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 9972 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); |
9908 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); | 9973 Local<v8::Object> o2 = t2->GetFunction()->NewInstance(); |
9909 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); | 9974 Local<v8::Object> o3 = t3->GetFunction()->NewInstance(); |
9910 | 9975 |
9911 // Setting the prototype on an object does not skip hidden prototypes. | 9976 // Setting the prototype on an object does not skip hidden prototypes. |
9912 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); | 9977 CHECK_EQ(0, o0->Get(v8_str("x"))->Int32Value()); |
9913 CHECK(o0->SetPrototype(o1)); | 9978 CHECK(o0->SetPrototype(o1)); |
(...skipping 30 matching lines...) Expand all Loading... |
9944 CHECK_EQ(proto2.As<v8::Object>(), o3); | 10009 CHECK_EQ(proto2.As<v8::Object>(), o3); |
9945 } | 10010 } |
9946 | 10011 |
9947 | 10012 |
9948 // Getting property names of an object with a prototype chain that | 10013 // Getting property names of an object with a prototype chain that |
9949 // triggers dictionary elements in GetLocalPropertyNames() shouldn't | 10014 // triggers dictionary elements in GetLocalPropertyNames() shouldn't |
9950 // crash the runtime. | 10015 // crash the runtime. |
9951 THREADED_TEST(Regress91517) { | 10016 THREADED_TEST(Regress91517) { |
9952 i::FLAG_allow_natives_syntax = true; | 10017 i::FLAG_allow_natives_syntax = true; |
9953 LocalContext context; | 10018 LocalContext context; |
9954 v8::HandleScope handle_scope(context->GetIsolate()); | 10019 v8::Isolate* isolate = context->GetIsolate(); |
| 10020 v8::HandleScope handle_scope(isolate); |
9955 | 10021 |
9956 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 10022 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
9957 t1->SetHiddenPrototype(true); | 10023 t1->SetHiddenPrototype(true); |
9958 t1->InstanceTemplate()->Set(v8_str("foo"), v8_num(1)); | 10024 t1->InstanceTemplate()->Set(v8_str("foo"), v8_num(1)); |
9959 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); | 10025 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
9960 t2->SetHiddenPrototype(true); | 10026 t2->SetHiddenPrototype(true); |
9961 t2->InstanceTemplate()->Set(v8_str("fuz1"), v8_num(2)); | 10027 t2->InstanceTemplate()->Set(v8_str("fuz1"), v8_num(2)); |
9962 t2->InstanceTemplate()->Set(v8_str("objects"), v8::Object::New()); | 10028 t2->InstanceTemplate()->Set(v8_str("objects"), v8::Object::New()); |
9963 t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2)); | 10029 t2->InstanceTemplate()->Set(v8_str("fuz2"), v8_num(2)); |
9964 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(); | 10030 Local<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(isolate); |
9965 t3->SetHiddenPrototype(true); | 10031 t3->SetHiddenPrototype(true); |
9966 t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3)); | 10032 t3->InstanceTemplate()->Set(v8_str("boo"), v8_num(3)); |
9967 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(); | 10033 Local<v8::FunctionTemplate> t4 = v8::FunctionTemplate::New(isolate); |
9968 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); | 10034 t4->InstanceTemplate()->Set(v8_str("baz"), v8_num(4)); |
9969 | 10035 |
9970 // Force dictionary-based properties. | 10036 // Force dictionary-based properties. |
9971 i::ScopedVector<char> name_buf(1024); | 10037 i::ScopedVector<char> name_buf(1024); |
9972 for (int i = 1; i <= 1000; i++) { | 10038 for (int i = 1; i <= 1000; i++) { |
9973 i::OS::SNPrintF(name_buf, "sdf%d", i); | 10039 i::OS::SNPrintF(name_buf, "sdf%d", i); |
9974 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); | 10040 t2->InstanceTemplate()->Set(v8_str(name_buf.start()), v8_num(2)); |
9975 } | 10041 } |
9976 | 10042 |
9977 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); | 10043 Local<v8::Object> o1 = t1->GetFunction()->NewInstance(); |
(...skipping 16 matching lines...) Expand all Loading... |
9994 ExpectTrue("names.indexOf(\"boo\") >= 0"); | 10060 ExpectTrue("names.indexOf(\"boo\") >= 0"); |
9995 ExpectTrue("names.indexOf(\"foo\") >= 0"); | 10061 ExpectTrue("names.indexOf(\"foo\") >= 0"); |
9996 ExpectTrue("names.indexOf(\"fuz1\") >= 0"); | 10062 ExpectTrue("names.indexOf(\"fuz1\") >= 0"); |
9997 ExpectTrue("names.indexOf(\"fuz2\") >= 0"); | 10063 ExpectTrue("names.indexOf(\"fuz2\") >= 0"); |
9998 ExpectFalse("names[1005] == undefined"); | 10064 ExpectFalse("names[1005] == undefined"); |
9999 } | 10065 } |
10000 | 10066 |
10001 | 10067 |
10002 THREADED_TEST(FunctionReadOnlyPrototype) { | 10068 THREADED_TEST(FunctionReadOnlyPrototype) { |
10003 LocalContext context; | 10069 LocalContext context; |
10004 v8::HandleScope handle_scope(context->GetIsolate()); | 10070 v8::Isolate* isolate = context->GetIsolate(); |
| 10071 v8::HandleScope handle_scope(isolate); |
10005 | 10072 |
10006 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 10073 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
10007 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); | 10074 t1->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); |
10008 t1->ReadOnlyPrototype(); | 10075 t1->ReadOnlyPrototype(); |
10009 context->Global()->Set(v8_str("func1"), t1->GetFunction()); | 10076 context->Global()->Set(v8_str("func1"), t1->GetFunction()); |
10010 // Configured value of ReadOnly flag. | 10077 // Configured value of ReadOnly flag. |
10011 CHECK(CompileRun( | 10078 CHECK(CompileRun( |
10012 "(function() {" | 10079 "(function() {" |
10013 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" | 10080 " descriptor = Object.getOwnPropertyDescriptor(func1, 'prototype');" |
10014 " return (descriptor['writable'] == false);" | 10081 " return (descriptor['writable'] == false);" |
10015 "})()")->BooleanValue()); | 10082 "})()")->BooleanValue()); |
10016 CHECK_EQ(42, CompileRun("func1.prototype.x")->Int32Value()); | 10083 CHECK_EQ(42, CompileRun("func1.prototype.x")->Int32Value()); |
10017 CHECK_EQ(42, | 10084 CHECK_EQ(42, |
10018 CompileRun("func1.prototype = {}; func1.prototype.x")->Int32Value()); | 10085 CompileRun("func1.prototype = {}; func1.prototype.x")->Int32Value()); |
10019 | 10086 |
10020 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); | 10087 Local<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(isolate); |
10021 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); | 10088 t2->PrototypeTemplate()->Set(v8_str("x"), v8::Integer::New(42)); |
10022 context->Global()->Set(v8_str("func2"), t2->GetFunction()); | 10089 context->Global()->Set(v8_str("func2"), t2->GetFunction()); |
10023 // Default value of ReadOnly flag. | 10090 // Default value of ReadOnly flag. |
10024 CHECK(CompileRun( | 10091 CHECK(CompileRun( |
10025 "(function() {" | 10092 "(function() {" |
10026 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" | 10093 " descriptor = Object.getOwnPropertyDescriptor(func2, 'prototype');" |
10027 " return (descriptor['writable'] == true);" | 10094 " return (descriptor['writable'] == true);" |
10028 "})()")->BooleanValue()); | 10095 "})()")->BooleanValue()); |
10029 CHECK_EQ(42, CompileRun("func2.prototype.x")->Int32Value()); | 10096 CHECK_EQ(42, CompileRun("func2.prototype.x")->Int32Value()); |
10030 } | 10097 } |
10031 | 10098 |
10032 | 10099 |
10033 THREADED_TEST(SetPrototypeThrows) { | 10100 THREADED_TEST(SetPrototypeThrows) { |
10034 LocalContext context; | 10101 LocalContext context; |
10035 v8::HandleScope handle_scope(context->GetIsolate()); | 10102 v8::Isolate* isolate = context->GetIsolate(); |
| 10103 v8::HandleScope handle_scope(isolate); |
10036 | 10104 |
10037 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 10105 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10038 | 10106 |
10039 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); | 10107 Local<v8::Object> o0 = t->GetFunction()->NewInstance(); |
10040 Local<v8::Object> o1 = t->GetFunction()->NewInstance(); | 10108 Local<v8::Object> o1 = t->GetFunction()->NewInstance(); |
10041 | 10109 |
10042 CHECK(o0->SetPrototype(o1)); | 10110 CHECK(o0->SetPrototype(o1)); |
10043 // If setting the prototype leads to the cycle, SetPrototype should | 10111 // If setting the prototype leads to the cycle, SetPrototype should |
10044 // return false and keep VM in sane state. | 10112 // return false and keep VM in sane state. |
10045 v8::TryCatch try_catch; | 10113 v8::TryCatch try_catch; |
10046 CHECK(!o1->SetPrototype(o0)); | 10114 CHECK(!o1->SetPrototype(o0)); |
10047 CHECK(!try_catch.HasCaught()); | 10115 CHECK(!try_catch.HasCaught()); |
10048 ASSERT(!CcTest::i_isolate()->has_pending_exception()); | 10116 ASSERT(!CcTest::i_isolate()->has_pending_exception()); |
10049 | 10117 |
10050 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()")->Int32Value()); | 10118 CHECK_EQ(42, CompileRun("function f() { return 42; }; f()")->Int32Value()); |
10051 } | 10119 } |
10052 | 10120 |
10053 | 10121 |
10054 THREADED_TEST(FunctionRemovePrototype) { | 10122 THREADED_TEST(FunctionRemovePrototype) { |
10055 LocalContext context; | 10123 LocalContext context; |
10056 v8::HandleScope handle_scope(context->GetIsolate()); | 10124 v8::Isolate* isolate = context->GetIsolate(); |
| 10125 v8::HandleScope handle_scope(isolate); |
10057 | 10126 |
10058 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); | 10127 Local<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(isolate); |
10059 t1->RemovePrototype(); | 10128 t1->RemovePrototype(); |
10060 Local<v8::Function> fun = t1->GetFunction(); | 10129 Local<v8::Function> fun = t1->GetFunction(); |
10061 context->Global()->Set(v8_str("fun"), fun); | 10130 context->Global()->Set(v8_str("fun"), fun); |
10062 CHECK(!CompileRun("'prototype' in fun")->BooleanValue()); | 10131 CHECK(!CompileRun("'prototype' in fun")->BooleanValue()); |
10063 | 10132 |
10064 v8::TryCatch try_catch; | 10133 v8::TryCatch try_catch; |
10065 CompileRun("new fun()"); | 10134 CompileRun("new fun()"); |
10066 CHECK(try_catch.HasCaught()); | 10135 CHECK(try_catch.HasCaught()); |
10067 | 10136 |
10068 try_catch.Reset(); | 10137 try_catch.Reset(); |
(...skipping 20 matching lines...) Expand all Loading... |
10089 x->Get(v8_str("get")); | 10158 x->Get(v8_str("get")); |
10090 x->Set(v8_str("set"), v8::Integer::New(8)); | 10159 x->Set(v8_str("set"), v8::Integer::New(8)); |
10091 x->Get(v8_str("get")); | 10160 x->Get(v8_str("get")); |
10092 x->Set(v8_str("set"), v8::Integer::New(8)); | 10161 x->Set(v8_str("set"), v8::Integer::New(8)); |
10093 x->Get(v8_str("get")); | 10162 x->Get(v8_str("get")); |
10094 } | 10163 } |
10095 | 10164 |
10096 | 10165 |
10097 THREADED_TEST(Constructor) { | 10166 THREADED_TEST(Constructor) { |
10098 LocalContext context; | 10167 LocalContext context; |
10099 v8::HandleScope handle_scope(context->GetIsolate()); | 10168 v8::Isolate* isolate = context->GetIsolate(); |
10100 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 10169 v8::HandleScope handle_scope(isolate); |
| 10170 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
10101 templ->SetClassName(v8_str("Fun")); | 10171 templ->SetClassName(v8_str("Fun")); |
10102 Local<Function> cons = templ->GetFunction(); | 10172 Local<Function> cons = templ->GetFunction(); |
10103 context->Global()->Set(v8_str("Fun"), cons); | 10173 context->Global()->Set(v8_str("Fun"), cons); |
10104 Local<v8::Object> inst = cons->NewInstance(); | 10174 Local<v8::Object> inst = cons->NewInstance(); |
10105 i::Handle<i::JSObject> obj(v8::Utils::OpenHandle(*inst)); | 10175 i::Handle<i::JSObject> obj(v8::Utils::OpenHandle(*inst)); |
10106 CHECK(obj->IsJSObject()); | 10176 CHECK(obj->IsJSObject()); |
10107 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); | 10177 Local<Value> value = CompileRun("(new Fun()).constructor === Fun"); |
10108 CHECK(value->BooleanValue()); | 10178 CHECK(value->BooleanValue()); |
10109 } | 10179 } |
10110 | 10180 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10257 Local<Value> args[] = { v8_num(23) }; | 10327 Local<Value> args[] = { v8_num(23) }; |
10258 value = instance->CallAsConstructor(1, args); | 10328 value = instance->CallAsConstructor(1, args); |
10259 CHECK(try_catch.HasCaught()); | 10329 CHECK(try_catch.HasCaught()); |
10260 String::Utf8Value exception_value2(try_catch.Exception()); | 10330 String::Utf8Value exception_value2(try_catch.Exception()); |
10261 CHECK_EQ("23", *exception_value2); | 10331 CHECK_EQ("23", *exception_value2); |
10262 try_catch.Reset(); | 10332 try_catch.Reset(); |
10263 } | 10333 } |
10264 | 10334 |
10265 // Check whether constructor returns with an object or non-object. | 10335 // Check whether constructor returns with an object or non-object. |
10266 { Local<FunctionTemplate> function_template = | 10336 { Local<FunctionTemplate> function_template = |
10267 FunctionTemplate::New(FakeConstructorCallback); | 10337 FunctionTemplate::New(isolate, FakeConstructorCallback); |
10268 Local<Function> function = function_template->GetFunction(); | 10338 Local<Function> function = function_template->GetFunction(); |
10269 Local<Object> instance1 = function; | 10339 Local<Object> instance1 = function; |
10270 context->Global()->Set(v8_str("obj4"), instance1); | 10340 context->Global()->Set(v8_str("obj4"), instance1); |
10271 v8::TryCatch try_catch; | 10341 v8::TryCatch try_catch; |
10272 Local<Value> value; | 10342 Local<Value> value; |
10273 CHECK(!try_catch.HasCaught()); | 10343 CHECK(!try_catch.HasCaught()); |
10274 | 10344 |
10275 CHECK(instance1->IsObject()); | 10345 CHECK(instance1->IsObject()); |
10276 CHECK(instance1->IsFunction()); | 10346 CHECK(instance1->IsFunction()); |
10277 | 10347 |
(...skipping 22 matching lines...) Expand all Loading... |
10300 Local<Value> args2[] = { v8_num(28) }; | 10370 Local<Value> args2[] = { v8_num(28) }; |
10301 value = instance2->CallAsConstructor(1, args2); | 10371 value = instance2->CallAsConstructor(1, args2); |
10302 CHECK(!try_catch.HasCaught()); | 10372 CHECK(!try_catch.HasCaught()); |
10303 CHECK(!value->IsObject()); | 10373 CHECK(!value->IsObject()); |
10304 } | 10374 } |
10305 } | 10375 } |
10306 | 10376 |
10307 | 10377 |
10308 THREADED_TEST(FunctionDescriptorException) { | 10378 THREADED_TEST(FunctionDescriptorException) { |
10309 LocalContext context; | 10379 LocalContext context; |
10310 v8::HandleScope handle_scope(context->GetIsolate()); | 10380 v8::Isolate* isolate = context->GetIsolate(); |
10311 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 10381 v8::HandleScope handle_scope(isolate); |
| 10382 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
10312 templ->SetClassName(v8_str("Fun")); | 10383 templ->SetClassName(v8_str("Fun")); |
10313 Local<Function> cons = templ->GetFunction(); | 10384 Local<Function> cons = templ->GetFunction(); |
10314 context->Global()->Set(v8_str("Fun"), cons); | 10385 context->Global()->Set(v8_str("Fun"), cons); |
10315 Local<Value> value = CompileRun( | 10386 Local<Value> value = CompileRun( |
10316 "function test() {" | 10387 "function test() {" |
10317 " try {" | 10388 " try {" |
10318 " (new Fun()).blah()" | 10389 " (new Fun()).blah()" |
10319 " } catch (e) {" | 10390 " } catch (e) {" |
10320 " var str = String(e);" | 10391 " var str = String(e);" |
10321 " if (str.indexOf('TypeError') == -1) return 1;" | 10392 " if (str.indexOf('TypeError') == -1) return 1;" |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10518 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 10589 static void ReturnThis(const v8::FunctionCallbackInfo<v8::Value>& args) { |
10519 args.GetReturnValue().Set(args.This()); | 10590 args.GetReturnValue().Set(args.This()); |
10520 } | 10591 } |
10521 | 10592 |
10522 | 10593 |
10523 // Test that a call handler can be set for objects which will allow | 10594 // Test that a call handler can be set for objects which will allow |
10524 // non-function objects created through the API to be called as | 10595 // non-function objects created through the API to be called as |
10525 // functions. | 10596 // functions. |
10526 THREADED_TEST(CallAsFunction) { | 10597 THREADED_TEST(CallAsFunction) { |
10527 LocalContext context; | 10598 LocalContext context; |
10528 v8::HandleScope scope(context->GetIsolate()); | 10599 v8::Isolate* isolate = context->GetIsolate(); |
| 10600 v8::HandleScope scope(isolate); |
10529 | 10601 |
10530 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 10602 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10531 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 10603 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10532 instance_template->SetCallAsFunctionHandler(call_as_function); | 10604 instance_template->SetCallAsFunctionHandler(call_as_function); |
10533 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 10605 Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
10534 context->Global()->Set(v8_str("obj"), instance); | 10606 context->Global()->Set(v8_str("obj"), instance); |
10535 v8::TryCatch try_catch; | 10607 v8::TryCatch try_catch; |
10536 Local<Value> value; | 10608 Local<Value> value; |
10537 CHECK(!try_catch.HasCaught()); | 10609 CHECK(!try_catch.HasCaught()); |
10538 | 10610 |
10539 value = CompileRun("obj(42)"); | 10611 value = CompileRun("obj(42)"); |
10540 CHECK(!try_catch.HasCaught()); | 10612 CHECK(!try_catch.HasCaught()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10573 CHECK_EQ(-43, value->Int32Value()); | 10645 CHECK_EQ(-43, value->Int32Value()); |
10574 | 10646 |
10575 // Check that the call-as-function handler can be called through | 10647 // Check that the call-as-function handler can be called through |
10576 // the API. | 10648 // the API. |
10577 v8::Handle<Value> args[] = { v8_num(28) }; | 10649 v8::Handle<Value> args[] = { v8_num(28) }; |
10578 value = instance->CallAsFunction(instance, 1, args); | 10650 value = instance->CallAsFunction(instance, 1, args); |
10579 CHECK(!try_catch.HasCaught()); | 10651 CHECK(!try_catch.HasCaught()); |
10580 CHECK_EQ(28, value->Int32Value()); | 10652 CHECK_EQ(28, value->Int32Value()); |
10581 } | 10653 } |
10582 | 10654 |
10583 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 10655 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10584 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); | 10656 Local<ObjectTemplate> instance_template(t->InstanceTemplate()); |
10585 USE(instance_template); | 10657 USE(instance_template); |
10586 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 10658 Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
10587 context->Global()->Set(v8_str("obj2"), instance); | 10659 context->Global()->Set(v8_str("obj2"), instance); |
10588 v8::TryCatch try_catch; | 10660 v8::TryCatch try_catch; |
10589 Local<Value> value; | 10661 Local<Value> value; |
10590 CHECK(!try_catch.HasCaught()); | 10662 CHECK(!try_catch.HasCaught()); |
10591 | 10663 |
10592 // Call an object without call-as-function handler through the JS | 10664 // Call an object without call-as-function handler through the JS |
10593 value = CompileRun("obj2(28)"); | 10665 value = CompileRun("obj2(28)"); |
10594 CHECK(value.IsEmpty()); | 10666 CHECK(value.IsEmpty()); |
10595 CHECK(try_catch.HasCaught()); | 10667 CHECK(try_catch.HasCaught()); |
10596 String::Utf8Value exception_value1(try_catch.Exception()); | 10668 String::Utf8Value exception_value1(try_catch.Exception()); |
10597 CHECK_EQ("TypeError: Property 'obj2' of object #<Object> is not a function", | 10669 CHECK_EQ("TypeError: Property 'obj2' of object #<Object> is not a function", |
10598 *exception_value1); | 10670 *exception_value1); |
10599 try_catch.Reset(); | 10671 try_catch.Reset(); |
10600 | 10672 |
10601 // Call an object without call-as-function handler through the API | 10673 // Call an object without call-as-function handler through the API |
10602 value = CompileRun("obj2(28)"); | 10674 value = CompileRun("obj2(28)"); |
10603 v8::Handle<Value> args[] = { v8_num(28) }; | 10675 v8::Handle<Value> args[] = { v8_num(28) }; |
10604 value = instance->CallAsFunction(instance, 1, args); | 10676 value = instance->CallAsFunction(instance, 1, args); |
10605 CHECK(value.IsEmpty()); | 10677 CHECK(value.IsEmpty()); |
10606 CHECK(try_catch.HasCaught()); | 10678 CHECK(try_catch.HasCaught()); |
10607 String::Utf8Value exception_value2(try_catch.Exception()); | 10679 String::Utf8Value exception_value2(try_catch.Exception()); |
10608 CHECK_EQ("TypeError: [object Object] is not a function", *exception_value2); | 10680 CHECK_EQ("TypeError: [object Object] is not a function", *exception_value2); |
10609 try_catch.Reset(); | 10681 try_catch.Reset(); |
10610 } | 10682 } |
10611 | 10683 |
10612 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | 10684 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10613 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 10685 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10614 instance_template->SetCallAsFunctionHandler(ThrowValue); | 10686 instance_template->SetCallAsFunctionHandler(ThrowValue); |
10615 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 10687 Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
10616 context->Global()->Set(v8_str("obj3"), instance); | 10688 context->Global()->Set(v8_str("obj3"), instance); |
10617 v8::TryCatch try_catch; | 10689 v8::TryCatch try_catch; |
10618 Local<Value> value; | 10690 Local<Value> value; |
10619 CHECK(!try_catch.HasCaught()); | 10691 CHECK(!try_catch.HasCaught()); |
10620 | 10692 |
10621 // Catch the exception which is thrown by call-as-function handler | 10693 // Catch the exception which is thrown by call-as-function handler |
10622 value = CompileRun("obj3(22)"); | 10694 value = CompileRun("obj3(22)"); |
10623 CHECK(try_catch.HasCaught()); | 10695 CHECK(try_catch.HasCaught()); |
10624 String::Utf8Value exception_value1(try_catch.Exception()); | 10696 String::Utf8Value exception_value1(try_catch.Exception()); |
10625 CHECK_EQ("22", *exception_value1); | 10697 CHECK_EQ("22", *exception_value1); |
10626 try_catch.Reset(); | 10698 try_catch.Reset(); |
10627 | 10699 |
10628 v8::Handle<Value> args[] = { v8_num(23) }; | 10700 v8::Handle<Value> args[] = { v8_num(23) }; |
10629 value = instance->CallAsFunction(instance, 1, args); | 10701 value = instance->CallAsFunction(instance, 1, args); |
10630 CHECK(try_catch.HasCaught()); | 10702 CHECK(try_catch.HasCaught()); |
10631 String::Utf8Value exception_value2(try_catch.Exception()); | 10703 String::Utf8Value exception_value2(try_catch.Exception()); |
10632 CHECK_EQ("23", *exception_value2); | 10704 CHECK_EQ("23", *exception_value2); |
10633 try_catch.Reset(); | 10705 try_catch.Reset(); |
10634 } | 10706 } |
10635 | 10707 |
10636 { v8::Isolate* isolate = context->GetIsolate(); | 10708 { Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate); |
10637 Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(); | |
10638 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); | 10709 Local<ObjectTemplate> instance_template = t->InstanceTemplate(); |
10639 instance_template->SetCallAsFunctionHandler(ReturnThis); | 10710 instance_template->SetCallAsFunctionHandler(ReturnThis); |
10640 Local<v8::Object> instance = t->GetFunction()->NewInstance(); | 10711 Local<v8::Object> instance = t->GetFunction()->NewInstance(); |
10641 | 10712 |
10642 Local<v8::Value> a1 = | 10713 Local<v8::Value> a1 = |
10643 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL); | 10714 instance->CallAsFunction(v8::Undefined(isolate), 0, NULL); |
10644 CHECK(a1->StrictEquals(instance)); | 10715 CHECK(a1->StrictEquals(instance)); |
10645 Local<v8::Value> a2 = | 10716 Local<v8::Value> a2 = |
10646 instance->CallAsFunction(v8::Null(isolate), 0, NULL); | 10717 instance->CallAsFunction(v8::Null(isolate), 0, NULL); |
10647 CHECK(a2->StrictEquals(instance)); | 10718 CHECK(a2->StrictEquals(instance)); |
10648 Local<v8::Value> a3 = | 10719 Local<v8::Value> a3 = |
10649 instance->CallAsFunction(v8_num(42), 0, NULL); | 10720 instance->CallAsFunction(v8_num(42), 0, NULL); |
10650 CHECK(a3->StrictEquals(instance)); | 10721 CHECK(a3->StrictEquals(instance)); |
10651 Local<v8::Value> a4 = | 10722 Local<v8::Value> a4 = |
10652 instance->CallAsFunction(v8_str("hello"), 0, NULL); | 10723 instance->CallAsFunction(v8_str("hello"), 0, NULL); |
10653 CHECK(a4->StrictEquals(instance)); | 10724 CHECK(a4->StrictEquals(instance)); |
10654 Local<v8::Value> a5 = | 10725 Local<v8::Value> a5 = |
10655 instance->CallAsFunction(v8::True(isolate), 0, NULL); | 10726 instance->CallAsFunction(v8::True(isolate), 0, NULL); |
10656 CHECK(a5->StrictEquals(instance)); | 10727 CHECK(a5->StrictEquals(instance)); |
10657 } | 10728 } |
10658 | 10729 |
10659 { v8::Isolate* isolate = context->GetIsolate(); | 10730 { CompileRun( |
10660 CompileRun( | |
10661 "function ReturnThisSloppy() {" | 10731 "function ReturnThisSloppy() {" |
10662 " return this;" | 10732 " return this;" |
10663 "}" | 10733 "}" |
10664 "function ReturnThisStrict() {" | 10734 "function ReturnThisStrict() {" |
10665 " 'use strict';" | 10735 " 'use strict';" |
10666 " return this;" | 10736 " return this;" |
10667 "}"); | 10737 "}"); |
10668 Local<Function> ReturnThisSloppy = | 10738 Local<Function> ReturnThisSloppy = |
10669 Local<Function>::Cast( | 10739 Local<Function>::Cast( |
10670 context->Global()->Get(v8_str("ReturnThisSloppy"))); | 10740 context->Global()->Get(v8_str("ReturnThisSloppy"))); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10706 Local<v8::Value> a10 = | 10776 Local<v8::Value> a10 = |
10707 ReturnThisStrict->CallAsFunction(v8::True(isolate), 0, NULL); | 10777 ReturnThisStrict->CallAsFunction(v8::True(isolate), 0, NULL); |
10708 CHECK(a10->StrictEquals(v8::True(isolate))); | 10778 CHECK(a10->StrictEquals(v8::True(isolate))); |
10709 } | 10779 } |
10710 } | 10780 } |
10711 | 10781 |
10712 | 10782 |
10713 // Check whether a non-function object is callable. | 10783 // Check whether a non-function object is callable. |
10714 THREADED_TEST(CallableObject) { | 10784 THREADED_TEST(CallableObject) { |
10715 LocalContext context; | 10785 LocalContext context; |
10716 v8::HandleScope scope(context->GetIsolate()); | 10786 v8::Isolate* isolate = context->GetIsolate(); |
| 10787 v8::HandleScope scope(isolate); |
10717 | 10788 |
10718 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | 10789 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
10719 instance_template->SetCallAsFunctionHandler(call_as_function); | 10790 instance_template->SetCallAsFunctionHandler(call_as_function); |
10720 Local<Object> instance = instance_template->NewInstance(); | 10791 Local<Object> instance = instance_template->NewInstance(); |
10721 v8::TryCatch try_catch; | 10792 v8::TryCatch try_catch; |
10722 | 10793 |
10723 CHECK(instance->IsCallable()); | 10794 CHECK(instance->IsCallable()); |
10724 CHECK(!try_catch.HasCaught()); | 10795 CHECK(!try_catch.HasCaught()); |
10725 } | 10796 } |
10726 | 10797 |
10727 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); | 10798 { Local<ObjectTemplate> instance_template = ObjectTemplate::New(); |
10728 Local<Object> instance = instance_template->NewInstance(); | 10799 Local<Object> instance = instance_template->NewInstance(); |
10729 v8::TryCatch try_catch; | 10800 v8::TryCatch try_catch; |
10730 | 10801 |
10731 CHECK(!instance->IsCallable()); | 10802 CHECK(!instance->IsCallable()); |
10732 CHECK(!try_catch.HasCaught()); | 10803 CHECK(!try_catch.HasCaught()); |
10733 } | 10804 } |
10734 | 10805 |
10735 { Local<FunctionTemplate> function_template = | 10806 { Local<FunctionTemplate> function_template = |
10736 FunctionTemplate::New(call_as_function); | 10807 FunctionTemplate::New(isolate, call_as_function); |
10737 Local<Function> function = function_template->GetFunction(); | 10808 Local<Function> function = function_template->GetFunction(); |
10738 Local<Object> instance = function; | 10809 Local<Object> instance = function; |
10739 v8::TryCatch try_catch; | 10810 v8::TryCatch try_catch; |
10740 | 10811 |
10741 CHECK(instance->IsCallable()); | 10812 CHECK(instance->IsCallable()); |
10742 CHECK(!try_catch.HasCaught()); | 10813 CHECK(!try_catch.HasCaught()); |
10743 } | 10814 } |
10744 | 10815 |
10745 { Local<FunctionTemplate> function_template = FunctionTemplate::New(); | 10816 { Local<FunctionTemplate> function_template = FunctionTemplate::New(isolate); |
10746 Local<Function> function = function_template->GetFunction(); | 10817 Local<Function> function = function_template->GetFunction(); |
10747 Local<Object> instance = function; | 10818 Local<Object> instance = function; |
10748 v8::TryCatch try_catch; | 10819 v8::TryCatch try_catch; |
10749 | 10820 |
10750 CHECK(instance->IsCallable()); | 10821 CHECK(instance->IsCallable()); |
10751 CHECK(!try_catch.HasCaught()); | 10822 CHECK(!try_catch.HasCaught()); |
10752 } | 10823 } |
10753 } | 10824 } |
10754 | 10825 |
10755 | 10826 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10797 | 10868 |
10798 static void InterceptorHasOwnPropertyGetter( | 10869 static void InterceptorHasOwnPropertyGetter( |
10799 Local<String> name, | 10870 Local<String> name, |
10800 const v8::PropertyCallbackInfo<v8::Value>& info) { | 10871 const v8::PropertyCallbackInfo<v8::Value>& info) { |
10801 ApiTestFuzzer::Fuzz(); | 10872 ApiTestFuzzer::Fuzz(); |
10802 } | 10873 } |
10803 | 10874 |
10804 | 10875 |
10805 THREADED_TEST(InterceptorHasOwnProperty) { | 10876 THREADED_TEST(InterceptorHasOwnProperty) { |
10806 LocalContext context; | 10877 LocalContext context; |
10807 v8::HandleScope scope(context->GetIsolate()); | 10878 v8::Isolate* isolate = context->GetIsolate(); |
10808 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 10879 v8::HandleScope scope(isolate); |
| 10880 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
10809 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); | 10881 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); |
10810 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetter); | 10882 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetter); |
10811 Local<Function> function = fun_templ->GetFunction(); | 10883 Local<Function> function = fun_templ->GetFunction(); |
10812 context->Global()->Set(v8_str("constructor"), function); | 10884 context->Global()->Set(v8_str("constructor"), function); |
10813 v8::Handle<Value> value = CompileRun( | 10885 v8::Handle<Value> value = CompileRun( |
10814 "var o = new constructor();" | 10886 "var o = new constructor();" |
10815 "o.hasOwnProperty('ostehaps');"); | 10887 "o.hasOwnProperty('ostehaps');"); |
10816 CHECK_EQ(false, value->BooleanValue()); | 10888 CHECK_EQ(false, value->BooleanValue()); |
10817 value = CompileRun( | 10889 value = CompileRun( |
10818 "o.ostehaps = 42;" | 10890 "o.ostehaps = 42;" |
10819 "o.hasOwnProperty('ostehaps');"); | 10891 "o.hasOwnProperty('ostehaps');"); |
10820 CHECK_EQ(true, value->BooleanValue()); | 10892 CHECK_EQ(true, value->BooleanValue()); |
10821 value = CompileRun( | 10893 value = CompileRun( |
10822 "var p = new constructor();" | 10894 "var p = new constructor();" |
10823 "p.hasOwnProperty('ostehaps');"); | 10895 "p.hasOwnProperty('ostehaps');"); |
10824 CHECK_EQ(false, value->BooleanValue()); | 10896 CHECK_EQ(false, value->BooleanValue()); |
10825 } | 10897 } |
10826 | 10898 |
10827 | 10899 |
10828 static void InterceptorHasOwnPropertyGetterGC( | 10900 static void InterceptorHasOwnPropertyGetterGC( |
10829 Local<String> name, | 10901 Local<String> name, |
10830 const v8::PropertyCallbackInfo<v8::Value>& info) { | 10902 const v8::PropertyCallbackInfo<v8::Value>& info) { |
10831 ApiTestFuzzer::Fuzz(); | 10903 ApiTestFuzzer::Fuzz(); |
10832 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); | 10904 CcTest::heap()->CollectAllGarbage(i::Heap::kNoGCFlags); |
10833 } | 10905 } |
10834 | 10906 |
10835 | 10907 |
10836 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { | 10908 THREADED_TEST(InterceptorHasOwnPropertyCausingGC) { |
10837 LocalContext context; | 10909 LocalContext context; |
10838 v8::HandleScope scope(context->GetIsolate()); | 10910 v8::Isolate* isolate = context->GetIsolate(); |
10839 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 10911 v8::HandleScope scope(isolate); |
| 10912 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(isolate); |
10840 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); | 10913 Local<v8::ObjectTemplate> instance_templ = fun_templ->InstanceTemplate(); |
10841 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetterGC); | 10914 instance_templ->SetNamedPropertyHandler(InterceptorHasOwnPropertyGetterGC); |
10842 Local<Function> function = fun_templ->GetFunction(); | 10915 Local<Function> function = fun_templ->GetFunction(); |
10843 context->Global()->Set(v8_str("constructor"), function); | 10916 context->Global()->Set(v8_str("constructor"), function); |
10844 // Let's first make some stuff so we can be sure to get a good GC. | 10917 // Let's first make some stuff so we can be sure to get a good GC. |
10845 CompileRun( | 10918 CompileRun( |
10846 "function makestr(size) {" | 10919 "function makestr(size) {" |
10847 " switch (size) {" | 10920 " switch (size) {" |
10848 " case 1: return 'f';" | 10921 " case 1: return 'f';" |
10849 " case 2: return 'fo';" | 10922 " case 2: return 'fo';" |
(...skipping 809 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11659 if (count++ % 3 == 0) { | 11732 if (count++ % 3 == 0) { |
11660 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 11733 CcTest::heap()->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
11661 // This should move the stub | 11734 // This should move the stub |
11662 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed | 11735 GenerateSomeGarbage(); // This should ensure the old stub memory is flushed |
11663 } | 11736 } |
11664 } | 11737 } |
11665 | 11738 |
11666 | 11739 |
11667 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { | 11740 THREADED_TEST(CallICFastApi_DirectCall_GCMoveStub) { |
11668 LocalContext context; | 11741 LocalContext context; |
11669 v8::HandleScope scope(context->GetIsolate()); | 11742 v8::Isolate* isolate = context->GetIsolate(); |
| 11743 v8::HandleScope scope(isolate); |
11670 v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); | 11744 v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); |
11671 nativeobject_templ->Set(context->GetIsolate(), "callback", | 11745 nativeobject_templ->Set(isolate, "callback", |
11672 v8::FunctionTemplate::New(DirectApiCallback)); | 11746 v8::FunctionTemplate::New(isolate, |
| 11747 DirectApiCallback)); |
11673 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); | 11748 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); |
11674 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); | 11749 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); |
11675 // call the api function multiple times to ensure direct call stub creation. | 11750 // call the api function multiple times to ensure direct call stub creation. |
11676 CompileRun( | 11751 CompileRun( |
11677 "function f() {" | 11752 "function f() {" |
11678 " for (var i = 1; i <= 30; i++) {" | 11753 " for (var i = 1; i <= 30; i++) {" |
11679 " nativeobject.callback();" | 11754 " nativeobject.callback();" |
11680 " }" | 11755 " }" |
11681 "}" | 11756 "}" |
11682 "f();"); | 11757 "f();"); |
11683 } | 11758 } |
11684 | 11759 |
11685 | 11760 |
11686 void ThrowingDirectApiCallback( | 11761 void ThrowingDirectApiCallback( |
11687 const v8::FunctionCallbackInfo<v8::Value>& args) { | 11762 const v8::FunctionCallbackInfo<v8::Value>& args) { |
11688 args.GetIsolate()->ThrowException(v8_str("g")); | 11763 args.GetIsolate()->ThrowException(v8_str("g")); |
11689 } | 11764 } |
11690 | 11765 |
11691 | 11766 |
11692 THREADED_TEST(CallICFastApi_DirectCall_Throw) { | 11767 THREADED_TEST(CallICFastApi_DirectCall_Throw) { |
11693 LocalContext context; | 11768 LocalContext context; |
11694 v8::HandleScope scope(context->GetIsolate()); | 11769 v8::Isolate* isolate = context->GetIsolate(); |
11695 v8::Handle<v8::ObjectTemplate> nativeobject_templ = v8::ObjectTemplate::New(); | 11770 v8::HandleScope scope(isolate); |
11696 nativeobject_templ->Set(context->GetIsolate(), "callback", | 11771 v8::Handle<v8::ObjectTemplate> nativeobject_templ = |
11697 v8::FunctionTemplate::New(ThrowingDirectApiCallback)); | 11772 v8::ObjectTemplate::New(); |
| 11773 nativeobject_templ->Set(isolate, "callback", |
| 11774 v8::FunctionTemplate::New(isolate, |
| 11775 ThrowingDirectApiCallback)); |
11698 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); | 11776 v8::Local<v8::Object> nativeobject_obj = nativeobject_templ->NewInstance(); |
11699 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); | 11777 context->Global()->Set(v8_str("nativeobject"), nativeobject_obj); |
11700 // call the api function multiple times to ensure direct call stub creation. | 11778 // call the api function multiple times to ensure direct call stub creation. |
11701 v8::Handle<Value> result = CompileRun( | 11779 v8::Handle<Value> result = CompileRun( |
11702 "var result = '';" | 11780 "var result = '';" |
11703 "function f() {" | 11781 "function f() {" |
11704 " for (var i = 1; i <= 5; i++) {" | 11782 " for (var i = 1; i <= 5; i++) {" |
11705 " try { nativeobject.callback(); } catch (e) { result += e; }" | 11783 " try { nativeobject.callback(); } catch (e) { result += e; }" |
11706 " }" | 11784 " }" |
11707 "}" | 11785 "}" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11768 "for (var i = 0; i < 5; i++) {" | 11846 "for (var i = 0; i < 5; i++) {" |
11769 " try { o1.p1; } catch (e) { result += e; }" | 11847 " try { o1.p1; } catch (e) { result += e; }" |
11770 "}" | 11848 "}" |
11771 "result;"); | 11849 "result;"); |
11772 CHECK_EQ(v8_str("ggggg"), result); | 11850 CHECK_EQ(v8_str("ggggg"), result); |
11773 } | 11851 } |
11774 | 11852 |
11775 | 11853 |
11776 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { | 11854 THREADED_PROFILED_TEST(InterceptorCallICFastApi_TrivialSignature) { |
11777 int interceptor_call_count = 0; | 11855 int interceptor_call_count = 0; |
11778 v8::HandleScope scope(CcTest::isolate()); | 11856 v8::Isolate* isolate = CcTest::isolate(); |
11779 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 11857 v8::HandleScope scope(isolate); |
| 11858 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 11859 v8::FunctionTemplate::New(isolate); |
11780 v8::Handle<v8::FunctionTemplate> method_templ = | 11860 v8::Handle<v8::FunctionTemplate> method_templ = |
11781 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature, | 11861 v8::FunctionTemplate::New(isolate, |
| 11862 FastApiCallback_TrivialSignature, |
11782 v8_str("method_data"), | 11863 v8_str("method_data"), |
11783 v8::Handle<v8::Signature>()); | 11864 v8::Handle<v8::Signature>()); |
11784 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 11865 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11785 proto_templ->Set(v8_str("method"), method_templ); | 11866 proto_templ->Set(v8_str("method"), method_templ); |
11786 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11867 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11787 templ->SetNamedPropertyHandler( | 11868 templ->SetNamedPropertyHandler( |
11788 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11869 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11789 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 11870 v8::External::New(isolate, &interceptor_call_count)); |
11790 LocalContext context; | 11871 LocalContext context; |
11791 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11872 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11792 GenerateSomeGarbage(); | 11873 GenerateSomeGarbage(); |
11793 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11874 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11794 CompileRun( | 11875 CompileRun( |
11795 "var result = 0;" | 11876 "var result = 0;" |
11796 "for (var i = 0; i < 100; i++) {" | 11877 "for (var i = 0; i < 100; i++) {" |
11797 " result = o.method(41);" | 11878 " result = o.method(41);" |
11798 "}"); | 11879 "}"); |
11799 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 11880 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
11800 CHECK_EQ(100, interceptor_call_count); | 11881 CHECK_EQ(100, interceptor_call_count); |
11801 } | 11882 } |
11802 | 11883 |
11803 | 11884 |
11804 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { | 11885 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature) { |
11805 int interceptor_call_count = 0; | 11886 int interceptor_call_count = 0; |
11806 v8::HandleScope scope(CcTest::isolate()); | 11887 v8::Isolate* isolate = CcTest::isolate(); |
11807 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 11888 v8::HandleScope scope(isolate); |
| 11889 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 11890 v8::FunctionTemplate::New(isolate); |
11808 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 11891 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
11809 FastApiCallback_SimpleSignature, v8_str("method_data"), | 11892 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
11810 v8::Signature::New(CcTest::isolate(), fun_templ)); | 11893 v8::Signature::New(isolate, fun_templ)); |
11811 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 11894 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11812 proto_templ->Set(v8_str("method"), method_templ); | 11895 proto_templ->Set(v8_str("method"), method_templ); |
11813 fun_templ->SetHiddenPrototype(true); | 11896 fun_templ->SetHiddenPrototype(true); |
11814 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11897 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11815 templ->SetNamedPropertyHandler( | 11898 templ->SetNamedPropertyHandler( |
11816 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11899 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11817 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 11900 v8::External::New(isolate, &interceptor_call_count)); |
11818 LocalContext context; | 11901 LocalContext context; |
11819 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11902 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11820 GenerateSomeGarbage(); | 11903 GenerateSomeGarbage(); |
11821 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11904 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11822 CompileRun( | 11905 CompileRun( |
11823 "o.foo = 17;" | 11906 "o.foo = 17;" |
11824 "var receiver = {};" | 11907 "var receiver = {};" |
11825 "receiver.__proto__ = o;" | 11908 "receiver.__proto__ = o;" |
11826 "var result = 0;" | 11909 "var result = 0;" |
11827 "for (var i = 0; i < 100; i++) {" | 11910 "for (var i = 0; i < 100; i++) {" |
11828 " result = receiver.method(41);" | 11911 " result = receiver.method(41);" |
11829 "}"); | 11912 "}"); |
11830 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 11913 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
11831 CHECK_EQ(100, interceptor_call_count); | 11914 CHECK_EQ(100, interceptor_call_count); |
11832 } | 11915 } |
11833 | 11916 |
11834 | 11917 |
11835 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { | 11918 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss1) { |
11836 int interceptor_call_count = 0; | 11919 int interceptor_call_count = 0; |
11837 v8::HandleScope scope(CcTest::isolate()); | 11920 v8::Isolate* isolate = CcTest::isolate(); |
11838 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 11921 v8::HandleScope scope(isolate); |
| 11922 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 11923 v8::FunctionTemplate::New(isolate); |
11839 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 11924 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
11840 FastApiCallback_SimpleSignature, v8_str("method_data"), | 11925 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
11841 v8::Signature::New(CcTest::isolate(), fun_templ)); | 11926 v8::Signature::New(isolate, fun_templ)); |
11842 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 11927 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11843 proto_templ->Set(v8_str("method"), method_templ); | 11928 proto_templ->Set(v8_str("method"), method_templ); |
11844 fun_templ->SetHiddenPrototype(true); | 11929 fun_templ->SetHiddenPrototype(true); |
11845 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11930 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11846 templ->SetNamedPropertyHandler( | 11931 templ->SetNamedPropertyHandler( |
11847 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11932 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11848 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 11933 v8::External::New(isolate, &interceptor_call_count)); |
11849 LocalContext context; | 11934 LocalContext context; |
11850 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11935 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11851 GenerateSomeGarbage(); | 11936 GenerateSomeGarbage(); |
11852 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11937 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11853 CompileRun( | 11938 CompileRun( |
11854 "o.foo = 17;" | 11939 "o.foo = 17;" |
11855 "var receiver = {};" | 11940 "var receiver = {};" |
11856 "receiver.__proto__ = o;" | 11941 "receiver.__proto__ = o;" |
11857 "var result = 0;" | 11942 "var result = 0;" |
11858 "var saved_result = 0;" | 11943 "var saved_result = 0;" |
11859 "for (var i = 0; i < 100; i++) {" | 11944 "for (var i = 0; i < 100; i++) {" |
11860 " result = receiver.method(41);" | 11945 " result = receiver.method(41);" |
11861 " if (i == 50) {" | 11946 " if (i == 50) {" |
11862 " saved_result = result;" | 11947 " saved_result = result;" |
11863 " receiver = {method: function(x) { return x - 1 }};" | 11948 " receiver = {method: function(x) { return x - 1 }};" |
11864 " }" | 11949 " }" |
11865 "}"); | 11950 "}"); |
11866 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 11951 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); |
11867 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 11952 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
11868 CHECK_GE(interceptor_call_count, 50); | 11953 CHECK_GE(interceptor_call_count, 50); |
11869 } | 11954 } |
11870 | 11955 |
11871 | 11956 |
11872 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { | 11957 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss2) { |
11873 int interceptor_call_count = 0; | 11958 int interceptor_call_count = 0; |
11874 v8::HandleScope scope(CcTest::isolate()); | 11959 v8::Isolate* isolate = CcTest::isolate(); |
11875 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 11960 v8::HandleScope scope(isolate); |
| 11961 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 11962 v8::FunctionTemplate::New(isolate); |
11876 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 11963 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
11877 FastApiCallback_SimpleSignature, v8_str("method_data"), | 11964 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
11878 v8::Signature::New(CcTest::isolate(), fun_templ)); | 11965 v8::Signature::New(isolate, fun_templ)); |
11879 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 11966 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11880 proto_templ->Set(v8_str("method"), method_templ); | 11967 proto_templ->Set(v8_str("method"), method_templ); |
11881 fun_templ->SetHiddenPrototype(true); | 11968 fun_templ->SetHiddenPrototype(true); |
11882 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 11969 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11883 templ->SetNamedPropertyHandler( | 11970 templ->SetNamedPropertyHandler( |
11884 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 11971 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11885 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 11972 v8::External::New(isolate, &interceptor_call_count)); |
11886 LocalContext context; | 11973 LocalContext context; |
11887 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 11974 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11888 GenerateSomeGarbage(); | 11975 GenerateSomeGarbage(); |
11889 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 11976 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11890 CompileRun( | 11977 CompileRun( |
11891 "o.foo = 17;" | 11978 "o.foo = 17;" |
11892 "var receiver = {};" | 11979 "var receiver = {};" |
11893 "receiver.__proto__ = o;" | 11980 "receiver.__proto__ = o;" |
11894 "var result = 0;" | 11981 "var result = 0;" |
11895 "var saved_result = 0;" | 11982 "var saved_result = 0;" |
11896 "for (var i = 0; i < 100; i++) {" | 11983 "for (var i = 0; i < 100; i++) {" |
11897 " result = receiver.method(41);" | 11984 " result = receiver.method(41);" |
11898 " if (i == 50) {" | 11985 " if (i == 50) {" |
11899 " saved_result = result;" | 11986 " saved_result = result;" |
11900 " o.method = function(x) { return x - 1 };" | 11987 " o.method = function(x) { return x - 1 };" |
11901 " }" | 11988 " }" |
11902 "}"); | 11989 "}"); |
11903 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 11990 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); |
11904 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 11991 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
11905 CHECK_GE(interceptor_call_count, 50); | 11992 CHECK_GE(interceptor_call_count, 50); |
11906 } | 11993 } |
11907 | 11994 |
11908 | 11995 |
11909 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { | 11996 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_Miss3) { |
11910 int interceptor_call_count = 0; | 11997 int interceptor_call_count = 0; |
11911 v8::HandleScope scope(CcTest::isolate()); | 11998 v8::Isolate* isolate = CcTest::isolate(); |
11912 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 11999 v8::HandleScope scope(isolate); |
| 12000 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12001 v8::FunctionTemplate::New(isolate); |
11913 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12002 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
11914 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12003 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
11915 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12004 v8::Signature::New(isolate, fun_templ)); |
11916 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12005 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11917 proto_templ->Set(v8_str("method"), method_templ); | 12006 proto_templ->Set(v8_str("method"), method_templ); |
11918 fun_templ->SetHiddenPrototype(true); | 12007 fun_templ->SetHiddenPrototype(true); |
11919 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12008 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11920 templ->SetNamedPropertyHandler( | 12009 templ->SetNamedPropertyHandler( |
11921 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12010 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11922 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 12011 v8::External::New(isolate, &interceptor_call_count)); |
11923 LocalContext context; | 12012 LocalContext context; |
11924 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12013 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11925 GenerateSomeGarbage(); | 12014 GenerateSomeGarbage(); |
11926 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12015 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11927 v8::TryCatch try_catch; | 12016 v8::TryCatch try_catch; |
11928 CompileRun( | 12017 CompileRun( |
11929 "o.foo = 17;" | 12018 "o.foo = 17;" |
11930 "var receiver = {};" | 12019 "var receiver = {};" |
11931 "receiver.__proto__ = o;" | 12020 "receiver.__proto__ = o;" |
11932 "var result = 0;" | 12021 "var result = 0;" |
11933 "var saved_result = 0;" | 12022 "var saved_result = 0;" |
11934 "for (var i = 0; i < 100; i++) {" | 12023 "for (var i = 0; i < 100; i++) {" |
11935 " result = receiver.method(41);" | 12024 " result = receiver.method(41);" |
11936 " if (i == 50) {" | 12025 " if (i == 50) {" |
11937 " saved_result = result;" | 12026 " saved_result = result;" |
11938 " receiver = 333;" | 12027 " receiver = 333;" |
11939 " }" | 12028 " }" |
11940 "}"); | 12029 "}"); |
11941 CHECK(try_catch.HasCaught()); | 12030 CHECK(try_catch.HasCaught()); |
11942 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), | 12031 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), |
11943 try_catch.Exception()->ToString()); | 12032 try_catch.Exception()->ToString()); |
11944 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12033 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
11945 CHECK_GE(interceptor_call_count, 50); | 12034 CHECK_GE(interceptor_call_count, 50); |
11946 } | 12035 } |
11947 | 12036 |
11948 | 12037 |
11949 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { | 12038 THREADED_PROFILED_TEST(InterceptorCallICFastApi_SimpleSignature_TypeError) { |
11950 int interceptor_call_count = 0; | 12039 int interceptor_call_count = 0; |
11951 v8::HandleScope scope(CcTest::isolate()); | 12040 v8::Isolate* isolate = CcTest::isolate(); |
11952 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12041 v8::HandleScope scope(isolate); |
| 12042 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12043 v8::FunctionTemplate::New(isolate); |
11953 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12044 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
11954 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12045 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
11955 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12046 v8::Signature::New(isolate, fun_templ)); |
11956 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12047 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11957 proto_templ->Set(v8_str("method"), method_templ); | 12048 proto_templ->Set(v8_str("method"), method_templ); |
11958 fun_templ->SetHiddenPrototype(true); | 12049 fun_templ->SetHiddenPrototype(true); |
11959 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); | 12050 v8::Handle<v8::ObjectTemplate> templ = fun_templ->InstanceTemplate(); |
11960 templ->SetNamedPropertyHandler( | 12051 templ->SetNamedPropertyHandler( |
11961 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, | 12052 InterceptorCallICFastApi, NULL, NULL, NULL, NULL, |
11962 v8::External::New(CcTest::isolate(), &interceptor_call_count)); | 12053 v8::External::New(isolate, &interceptor_call_count)); |
11963 LocalContext context; | 12054 LocalContext context; |
11964 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12055 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
11965 GenerateSomeGarbage(); | 12056 GenerateSomeGarbage(); |
11966 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12057 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
11967 v8::TryCatch try_catch; | 12058 v8::TryCatch try_catch; |
11968 CompileRun( | 12059 CompileRun( |
11969 "o.foo = 17;" | 12060 "o.foo = 17;" |
11970 "var receiver = {};" | 12061 "var receiver = {};" |
11971 "receiver.__proto__ = o;" | 12062 "receiver.__proto__ = o;" |
11972 "var result = 0;" | 12063 "var result = 0;" |
11973 "var saved_result = 0;" | 12064 "var saved_result = 0;" |
11974 "for (var i = 0; i < 100; i++) {" | 12065 "for (var i = 0; i < 100; i++) {" |
11975 " result = receiver.method(41);" | 12066 " result = receiver.method(41);" |
11976 " if (i == 50) {" | 12067 " if (i == 50) {" |
11977 " saved_result = result;" | 12068 " saved_result = result;" |
11978 " receiver = {method: receiver.method};" | 12069 " receiver = {method: receiver.method};" |
11979 " }" | 12070 " }" |
11980 "}"); | 12071 "}"); |
11981 CHECK(try_catch.HasCaught()); | 12072 CHECK(try_catch.HasCaught()); |
11982 CHECK_EQ(v8_str("TypeError: Illegal invocation"), | 12073 CHECK_EQ(v8_str("TypeError: Illegal invocation"), |
11983 try_catch.Exception()->ToString()); | 12074 try_catch.Exception()->ToString()); |
11984 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12075 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
11985 CHECK_GE(interceptor_call_count, 50); | 12076 CHECK_GE(interceptor_call_count, 50); |
11986 } | 12077 } |
11987 | 12078 |
11988 | 12079 |
11989 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { | 12080 THREADED_PROFILED_TEST(CallICFastApi_TrivialSignature) { |
11990 v8::HandleScope scope(CcTest::isolate()); | 12081 v8::Isolate* isolate = CcTest::isolate(); |
11991 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12082 v8::HandleScope scope(isolate); |
| 12083 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12084 v8::FunctionTemplate::New(isolate); |
11992 v8::Handle<v8::FunctionTemplate> method_templ = | 12085 v8::Handle<v8::FunctionTemplate> method_templ = |
11993 v8::FunctionTemplate::New(FastApiCallback_TrivialSignature, | 12086 v8::FunctionTemplate::New(isolate, |
| 12087 FastApiCallback_TrivialSignature, |
11994 v8_str("method_data"), | 12088 v8_str("method_data"), |
11995 v8::Handle<v8::Signature>()); | 12089 v8::Handle<v8::Signature>()); |
11996 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12090 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
11997 proto_templ->Set(v8_str("method"), method_templ); | 12091 proto_templ->Set(v8_str("method"), method_templ); |
11998 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12092 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
11999 USE(templ); | 12093 USE(templ); |
12000 LocalContext context; | 12094 LocalContext context; |
12001 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12095 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
12002 GenerateSomeGarbage(); | 12096 GenerateSomeGarbage(); |
12003 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12097 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
12004 CompileRun( | 12098 CompileRun( |
12005 "var result = 0;" | 12099 "var result = 0;" |
12006 "for (var i = 0; i < 100; i++) {" | 12100 "for (var i = 0; i < 100; i++) {" |
12007 " result = o.method(41);" | 12101 " result = o.method(41);" |
12008 "}"); | 12102 "}"); |
12009 | 12103 |
12010 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 12104 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
12011 } | 12105 } |
12012 | 12106 |
12013 | 12107 |
12014 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { | 12108 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature) { |
12015 v8::HandleScope scope(CcTest::isolate()); | 12109 v8::Isolate* isolate = CcTest::isolate(); |
12016 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12110 v8::HandleScope scope(isolate); |
| 12111 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12112 v8::FunctionTemplate::New(isolate); |
12017 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12113 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
12018 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12114 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
12019 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12115 v8::Signature::New(isolate, fun_templ)); |
12020 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12116 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
12021 proto_templ->Set(v8_str("method"), method_templ); | 12117 proto_templ->Set(v8_str("method"), method_templ); |
12022 fun_templ->SetHiddenPrototype(true); | 12118 fun_templ->SetHiddenPrototype(true); |
12023 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12119 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
12024 CHECK(!templ.IsEmpty()); | 12120 CHECK(!templ.IsEmpty()); |
12025 LocalContext context; | 12121 LocalContext context; |
12026 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12122 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
12027 GenerateSomeGarbage(); | 12123 GenerateSomeGarbage(); |
12028 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12124 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
12029 CompileRun( | 12125 CompileRun( |
12030 "o.foo = 17;" | 12126 "o.foo = 17;" |
12031 "var receiver = {};" | 12127 "var receiver = {};" |
12032 "receiver.__proto__ = o;" | 12128 "receiver.__proto__ = o;" |
12033 "var result = 0;" | 12129 "var result = 0;" |
12034 "for (var i = 0; i < 100; i++) {" | 12130 "for (var i = 0; i < 100; i++) {" |
12035 " result = receiver.method(41);" | 12131 " result = receiver.method(41);" |
12036 "}"); | 12132 "}"); |
12037 | 12133 |
12038 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); | 12134 CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); |
12039 } | 12135 } |
12040 | 12136 |
12041 | 12137 |
12042 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { | 12138 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss1) { |
12043 v8::HandleScope scope(CcTest::isolate()); | 12139 v8::Isolate* isolate = CcTest::isolate(); |
12044 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12140 v8::HandleScope scope(isolate); |
| 12141 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12142 v8::FunctionTemplate::New(isolate); |
12045 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12143 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
12046 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12144 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
12047 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12145 v8::Signature::New(isolate, fun_templ)); |
12048 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12146 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
12049 proto_templ->Set(v8_str("method"), method_templ); | 12147 proto_templ->Set(v8_str("method"), method_templ); |
12050 fun_templ->SetHiddenPrototype(true); | 12148 fun_templ->SetHiddenPrototype(true); |
12051 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12149 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
12052 CHECK(!templ.IsEmpty()); | 12150 CHECK(!templ.IsEmpty()); |
12053 LocalContext context; | 12151 LocalContext context; |
12054 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12152 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
12055 GenerateSomeGarbage(); | 12153 GenerateSomeGarbage(); |
12056 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12154 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
12057 CompileRun( | 12155 CompileRun( |
12058 "o.foo = 17;" | 12156 "o.foo = 17;" |
12059 "var receiver = {};" | 12157 "var receiver = {};" |
12060 "receiver.__proto__ = o;" | 12158 "receiver.__proto__ = o;" |
12061 "var result = 0;" | 12159 "var result = 0;" |
12062 "var saved_result = 0;" | 12160 "var saved_result = 0;" |
12063 "for (var i = 0; i < 100; i++) {" | 12161 "for (var i = 0; i < 100; i++) {" |
12064 " result = receiver.method(41);" | 12162 " result = receiver.method(41);" |
12065 " if (i == 50) {" | 12163 " if (i == 50) {" |
12066 " saved_result = result;" | 12164 " saved_result = result;" |
12067 " receiver = {method: function(x) { return x - 1 }};" | 12165 " receiver = {method: function(x) { return x - 1 }};" |
12068 " }" | 12166 " }" |
12069 "}"); | 12167 "}"); |
12070 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); | 12168 CHECK_EQ(40, context->Global()->Get(v8_str("result"))->Int32Value()); |
12071 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12169 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
12072 } | 12170 } |
12073 | 12171 |
12074 | 12172 |
12075 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { | 12173 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_Miss2) { |
12076 v8::HandleScope scope(CcTest::isolate()); | 12174 v8::Isolate* isolate = CcTest::isolate(); |
12077 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12175 v8::HandleScope scope(isolate); |
| 12176 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12177 v8::FunctionTemplate::New(isolate); |
12078 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12178 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
12079 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12179 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
12080 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12180 v8::Signature::New(isolate, fun_templ)); |
12081 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12181 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
12082 proto_templ->Set(v8_str("method"), method_templ); | 12182 proto_templ->Set(v8_str("method"), method_templ); |
12083 fun_templ->SetHiddenPrototype(true); | 12183 fun_templ->SetHiddenPrototype(true); |
12084 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12184 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
12085 CHECK(!templ.IsEmpty()); | 12185 CHECK(!templ.IsEmpty()); |
12086 LocalContext context; | 12186 LocalContext context; |
12087 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12187 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
12088 GenerateSomeGarbage(); | 12188 GenerateSomeGarbage(); |
12089 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12189 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
12090 v8::TryCatch try_catch; | 12190 v8::TryCatch try_catch; |
(...skipping 11 matching lines...) Expand all Loading... |
12102 " }" | 12202 " }" |
12103 "}"); | 12203 "}"); |
12104 CHECK(try_catch.HasCaught()); | 12204 CHECK(try_catch.HasCaught()); |
12105 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), | 12205 CHECK_EQ(v8_str("TypeError: Object 333 has no method 'method'"), |
12106 try_catch.Exception()->ToString()); | 12206 try_catch.Exception()->ToString()); |
12107 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); | 12207 CHECK_EQ(42, context->Global()->Get(v8_str("saved_result"))->Int32Value()); |
12108 } | 12208 } |
12109 | 12209 |
12110 | 12210 |
12111 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { | 12211 THREADED_PROFILED_TEST(CallICFastApi_SimpleSignature_TypeError) { |
12112 v8::HandleScope scope(CcTest::isolate()); | 12212 v8::Isolate* isolate = CcTest::isolate(); |
12113 v8::Handle<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 12213 v8::HandleScope scope(isolate); |
| 12214 v8::Handle<v8::FunctionTemplate> fun_templ = |
| 12215 v8::FunctionTemplate::New(isolate); |
12114 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( | 12216 v8::Handle<v8::FunctionTemplate> method_templ = v8::FunctionTemplate::New( |
12115 FastApiCallback_SimpleSignature, v8_str("method_data"), | 12217 isolate, FastApiCallback_SimpleSignature, v8_str("method_data"), |
12116 v8::Signature::New(CcTest::isolate(), fun_templ)); | 12218 v8::Signature::New(isolate, fun_templ)); |
12117 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); | 12219 v8::Handle<v8::ObjectTemplate> proto_templ = fun_templ->PrototypeTemplate(); |
12118 proto_templ->Set(v8_str("method"), method_templ); | 12220 proto_templ->Set(v8_str("method"), method_templ); |
12119 fun_templ->SetHiddenPrototype(true); | 12221 fun_templ->SetHiddenPrototype(true); |
12120 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); | 12222 v8::Handle<v8::ObjectTemplate> templ(fun_templ->InstanceTemplate()); |
12121 CHECK(!templ.IsEmpty()); | 12223 CHECK(!templ.IsEmpty()); |
12122 LocalContext context; | 12224 LocalContext context; |
12123 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); | 12225 v8::Handle<v8::Function> fun = fun_templ->GetFunction(); |
12124 GenerateSomeGarbage(); | 12226 GenerateSomeGarbage(); |
12125 context->Global()->Set(v8_str("o"), fun->NewInstance()); | 12227 context->Global()->Set(v8_str("o"), fun->NewInstance()); |
12126 v8::TryCatch try_catch; | 12228 v8::TryCatch try_catch; |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12451 templ->Set(CcTest::isolate(), "42", v8_num(42)); | 12553 templ->Set(CcTest::isolate(), "42", v8_num(42)); |
12452 v8::Handle<v8::Object> obj = templ->NewInstance(); | 12554 v8::Handle<v8::Object> obj = templ->NewInstance(); |
12453 context->Global()->Set(v8_str("obj"), obj); | 12555 context->Global()->Set(v8_str("obj"), obj); |
12454 v8::Handle<Value> value = CompileRun("obj[42]"); | 12556 v8::Handle<Value> value = CompileRun("obj[42]"); |
12455 CHECK(value->IsInt32()); | 12557 CHECK(value->IsInt32()); |
12456 CHECK_EQ(42, value->Int32Value()); | 12558 CHECK_EQ(42, value->Int32Value()); |
12457 } | 12559 } |
12458 | 12560 |
12459 | 12561 |
12460 THREADED_TEST(NamedPropertyHandlerGetterAttributes) { | 12562 THREADED_TEST(NamedPropertyHandlerGetterAttributes) { |
12461 v8::HandleScope scope(CcTest::isolate()); | 12563 v8::Isolate* isolate = CcTest::isolate(); |
12462 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 12564 v8::HandleScope scope(isolate); |
| 12565 v8::Handle<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
12463 templ->InstanceTemplate()->SetNamedPropertyHandler(InterceptorLoadXICGetter); | 12566 templ->InstanceTemplate()->SetNamedPropertyHandler(InterceptorLoadXICGetter); |
12464 LocalContext env; | 12567 LocalContext env; |
12465 env->Global()->Set(v8_str("obj"), | 12568 env->Global()->Set(v8_str("obj"), |
12466 templ->GetFunction()->NewInstance()); | 12569 templ->GetFunction()->NewInstance()); |
12467 ExpectTrue("obj.x === 42"); | 12570 ExpectTrue("obj.x === 42"); |
12468 ExpectTrue("!obj.propertyIsEnumerable('x')"); | 12571 ExpectTrue("!obj.propertyIsEnumerable('x')"); |
12469 } | 12572 } |
12470 | 12573 |
12471 | 12574 |
12472 static void ThrowingGetter(Local<String> name, | 12575 static void ThrowingGetter(Local<String> name, |
12473 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12576 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12474 ApiTestFuzzer::Fuzz(); | 12577 ApiTestFuzzer::Fuzz(); |
12475 info.GetIsolate()->ThrowException(Handle<Value>()); | 12578 info.GetIsolate()->ThrowException(Handle<Value>()); |
12476 info.GetReturnValue().SetUndefined(); | 12579 info.GetReturnValue().SetUndefined(); |
12477 } | 12580 } |
12478 | 12581 |
12479 | 12582 |
12480 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { | 12583 THREADED_TEST(VariousGetPropertiesAndThrowingCallbacks) { |
12481 LocalContext context; | 12584 LocalContext context; |
12482 HandleScope scope(context->GetIsolate()); | 12585 HandleScope scope(context->GetIsolate()); |
12483 | 12586 |
12484 Local<FunctionTemplate> templ = FunctionTemplate::New(); | 12587 Local<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
12485 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); | 12588 Local<ObjectTemplate> instance_templ = templ->InstanceTemplate(); |
12486 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter); | 12589 instance_templ->SetAccessor(v8_str("f"), ThrowingGetter); |
12487 | 12590 |
12488 Local<Object> instance = templ->GetFunction()->NewInstance(); | 12591 Local<Object> instance = templ->GetFunction()->NewInstance(); |
12489 | 12592 |
12490 Local<Object> another = Object::New(); | 12593 Local<Object> another = Object::New(); |
12491 another->SetPrototype(instance); | 12594 another->SetPrototype(instance); |
12492 | 12595 |
12493 Local<Object> with_js_getter = CompileRun( | 12596 Local<Object> with_js_getter = CompileRun( |
12494 "o = {};\n" | 12597 "o = {};\n" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12564 static void WebKitLike(Handle<Message> message, Handle<Value> data) { | 12667 static void WebKitLike(Handle<Message> message, Handle<Value> data) { |
12565 Handle<String> errorMessageString = message->Get(); | 12668 Handle<String> errorMessageString = message->Get(); |
12566 CHECK(!errorMessageString.IsEmpty()); | 12669 CHECK(!errorMessageString.IsEmpty()); |
12567 message->GetStackTrace(); | 12670 message->GetStackTrace(); |
12568 message->GetScriptResourceName(); | 12671 message->GetScriptResourceName(); |
12569 } | 12672 } |
12570 | 12673 |
12571 | 12674 |
12572 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) { | 12675 THREADED_TEST(ExceptionsDoNotPropagatePastTryCatch) { |
12573 LocalContext context; | 12676 LocalContext context; |
12574 HandleScope scope(context->GetIsolate()); | 12677 v8::Isolate* isolate = context->GetIsolate(); |
| 12678 HandleScope scope(isolate); |
12575 | 12679 |
12576 Local<Function> func = | 12680 Local<Function> func = |
12577 FunctionTemplate::New(ThrowingCallbackWithTryCatch)->GetFunction(); | 12681 FunctionTemplate::New(isolate, |
| 12682 ThrowingCallbackWithTryCatch)->GetFunction(); |
12578 context->Global()->Set(v8_str("func"), func); | 12683 context->Global()->Set(v8_str("func"), func); |
12579 | 12684 |
12580 MessageCallback callbacks[] = | 12685 MessageCallback callbacks[] = |
12581 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch }; | 12686 { NULL, WebKitLike, ThrowViaApi, ThrowFromJS, WithTryCatch }; |
12582 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) { | 12687 for (unsigned i = 0; i < sizeof(callbacks)/sizeof(callbacks[0]); i++) { |
12583 MessageCallback callback = callbacks[i]; | 12688 MessageCallback callback = callbacks[i]; |
12584 if (callback != NULL) { | 12689 if (callback != NULL) { |
12585 V8::AddMessageListener(callback); | 12690 V8::AddMessageListener(callback); |
12586 } | 12691 } |
12587 // Some small number to control number of times message handler should | 12692 // Some small number to control number of times message handler should |
(...skipping 20 matching lines...) Expand all Loading... |
12608 static void ChildGetter(Local<String> name, | 12713 static void ChildGetter(Local<String> name, |
12609 const v8::PropertyCallbackInfo<v8::Value>& info) { | 12714 const v8::PropertyCallbackInfo<v8::Value>& info) { |
12610 ApiTestFuzzer::Fuzz(); | 12715 ApiTestFuzzer::Fuzz(); |
12611 info.GetReturnValue().Set(v8_num(42)); | 12716 info.GetReturnValue().Set(v8_num(42)); |
12612 } | 12717 } |
12613 | 12718 |
12614 | 12719 |
12615 THREADED_TEST(Overriding) { | 12720 THREADED_TEST(Overriding) { |
12616 i::FLAG_es5_readonly = true; | 12721 i::FLAG_es5_readonly = true; |
12617 LocalContext context; | 12722 LocalContext context; |
12618 v8::HandleScope scope(context->GetIsolate()); | 12723 v8::Isolate* isolate = context->GetIsolate(); |
| 12724 v8::HandleScope scope(isolate); |
12619 | 12725 |
12620 // Parent template. | 12726 // Parent template. |
12621 Local<v8::FunctionTemplate> parent_templ = v8::FunctionTemplate::New(); | 12727 Local<v8::FunctionTemplate> parent_templ = v8::FunctionTemplate::New(isolate); |
12622 Local<ObjectTemplate> parent_instance_templ = | 12728 Local<ObjectTemplate> parent_instance_templ = |
12623 parent_templ->InstanceTemplate(); | 12729 parent_templ->InstanceTemplate(); |
12624 parent_instance_templ->SetAccessor(v8_str("f"), ParentGetter); | 12730 parent_instance_templ->SetAccessor(v8_str("f"), ParentGetter); |
12625 | 12731 |
12626 // Template that inherits from the parent template. | 12732 // Template that inherits from the parent template. |
12627 Local<v8::FunctionTemplate> child_templ = v8::FunctionTemplate::New(); | 12733 Local<v8::FunctionTemplate> child_templ = v8::FunctionTemplate::New(isolate); |
12628 Local<ObjectTemplate> child_instance_templ = | 12734 Local<ObjectTemplate> child_instance_templ = |
12629 child_templ->InstanceTemplate(); | 12735 child_templ->InstanceTemplate(); |
12630 child_templ->Inherit(parent_templ); | 12736 child_templ->Inherit(parent_templ); |
12631 // Override 'f'. The child version of 'f' should get called for child | 12737 // Override 'f'. The child version of 'f' should get called for child |
12632 // instances. | 12738 // instances. |
12633 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter); | 12739 child_instance_templ->SetAccessor(v8_str("f"), ChildGetter); |
12634 // Add 'g' twice. The 'g' added last should get called for instances. | 12740 // Add 'g' twice. The 'g' added last should get called for instances. |
12635 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter); | 12741 child_instance_templ->SetAccessor(v8_str("g"), ParentGetter); |
12636 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter); | 12742 child_instance_templ->SetAccessor(v8_str("g"), ChildGetter); |
12637 | 12743 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12671 | 12777 |
12672 | 12778 |
12673 static void IsConstructHandler( | 12779 static void IsConstructHandler( |
12674 const v8::FunctionCallbackInfo<v8::Value>& args) { | 12780 const v8::FunctionCallbackInfo<v8::Value>& args) { |
12675 ApiTestFuzzer::Fuzz(); | 12781 ApiTestFuzzer::Fuzz(); |
12676 args.GetReturnValue().Set(args.IsConstructCall()); | 12782 args.GetReturnValue().Set(args.IsConstructCall()); |
12677 } | 12783 } |
12678 | 12784 |
12679 | 12785 |
12680 THREADED_TEST(IsConstructCall) { | 12786 THREADED_TEST(IsConstructCall) { |
12681 v8::HandleScope scope(CcTest::isolate()); | 12787 v8::Isolate* isolate = CcTest::isolate(); |
| 12788 v8::HandleScope scope(isolate); |
12682 | 12789 |
12683 // Function template with call handler. | 12790 // Function template with call handler. |
12684 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 12791 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
12685 templ->SetCallHandler(IsConstructHandler); | 12792 templ->SetCallHandler(IsConstructHandler); |
12686 | 12793 |
12687 LocalContext context; | 12794 LocalContext context; |
12688 | 12795 |
12689 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 12796 context->Global()->Set(v8_str("f"), templ->GetFunction()); |
12690 Local<Value> value = v8_compile("f()")->Run(); | 12797 Local<Value> value = v8_compile("f()")->Run(); |
12691 CHECK(!value->BooleanValue()); | 12798 CHECK(!value->BooleanValue()); |
12692 value = v8_compile("new f()")->Run(); | 12799 value = v8_compile("new f()")->Run(); |
12693 CHECK(value->BooleanValue()); | 12800 CHECK(value->BooleanValue()); |
12694 } | 12801 } |
12695 | 12802 |
12696 | 12803 |
12697 THREADED_TEST(ObjectProtoToString) { | 12804 THREADED_TEST(ObjectProtoToString) { |
12698 v8::HandleScope scope(CcTest::isolate()); | 12805 v8::Isolate* isolate = CcTest::isolate(); |
12699 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(); | 12806 v8::HandleScope scope(isolate); |
| 12807 Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolate); |
12700 templ->SetClassName(v8_str("MyClass")); | 12808 templ->SetClassName(v8_str("MyClass")); |
12701 | 12809 |
12702 LocalContext context; | 12810 LocalContext context; |
12703 | 12811 |
12704 Local<String> customized_tostring = v8_str("customized toString"); | 12812 Local<String> customized_tostring = v8_str("customized toString"); |
12705 | 12813 |
12706 // Replace Object.prototype.toString | 12814 // Replace Object.prototype.toString |
12707 v8_compile("Object.prototype.toString = function() {" | 12815 v8_compile("Object.prototype.toString = function() {" |
12708 " return 'customized toString';" | 12816 " return 'customized toString';" |
12709 "}")->Run(); | 12817 "}")->Run(); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12950 v8::Handle<Value> value = CompileRun(code); | 13058 v8::Handle<Value> value = CompileRun(code); |
12951 CHECK(value.IsEmpty()); | 13059 CHECK(value.IsEmpty()); |
12952 args.GetReturnValue().Set(v8_str("foo")); | 13060 args.GetReturnValue().Set(v8_str("foo")); |
12953 } | 13061 } |
12954 } | 13062 } |
12955 | 13063 |
12956 | 13064 |
12957 // These are locking tests that don't need to be run again | 13065 // These are locking tests that don't need to be run again |
12958 // as part of the locking aggregation tests. | 13066 // as part of the locking aggregation tests. |
12959 TEST(NestedLockers) { | 13067 TEST(NestedLockers) { |
12960 v8::Locker locker(CcTest::isolate()); | 13068 v8::Isolate* isolate = CcTest::isolate(); |
12961 CHECK(v8::Locker::IsLocked(CcTest::isolate())); | 13069 v8::Locker locker(isolate); |
| 13070 CHECK(v8::Locker::IsLocked(isolate)); |
12962 LocalContext env; | 13071 LocalContext env; |
12963 v8::HandleScope scope(env->GetIsolate()); | 13072 v8::HandleScope scope(env->GetIsolate()); |
12964 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(ThrowInJS); | 13073 Local<v8::FunctionTemplate> fun_templ = |
| 13074 v8::FunctionTemplate::New(isolate, ThrowInJS); |
12965 Local<Function> fun = fun_templ->GetFunction(); | 13075 Local<Function> fun = fun_templ->GetFunction(); |
12966 env->Global()->Set(v8_str("throw_in_js"), fun); | 13076 env->Global()->Set(v8_str("throw_in_js"), fun); |
12967 Local<Script> script = v8_compile("(function () {" | 13077 Local<Script> script = v8_compile("(function () {" |
12968 " try {" | 13078 " try {" |
12969 " throw_in_js();" | 13079 " throw_in_js();" |
12970 " return 42;" | 13080 " return 42;" |
12971 " } catch (e) {" | 13081 " } catch (e) {" |
12972 " return e * 13;" | 13082 " return e * 13;" |
12973 " }" | 13083 " }" |
12974 "})();"); | 13084 "})();"); |
12975 CHECK_EQ(91, script->Run()->Int32Value()); | 13085 CHECK_EQ(91, script->Run()->Int32Value()); |
12976 } | 13086 } |
12977 | 13087 |
12978 | 13088 |
12979 // These are locking tests that don't need to be run again | 13089 // These are locking tests that don't need to be run again |
12980 // as part of the locking aggregation tests. | 13090 // as part of the locking aggregation tests. |
12981 TEST(NestedLockersNoTryCatch) { | 13091 TEST(NestedLockersNoTryCatch) { |
12982 v8::Locker locker(CcTest::isolate()); | 13092 v8::Locker locker(CcTest::isolate()); |
12983 LocalContext env; | 13093 LocalContext env; |
12984 v8::HandleScope scope(env->GetIsolate()); | 13094 v8::HandleScope scope(env->GetIsolate()); |
12985 Local<v8::FunctionTemplate> fun_templ = | 13095 Local<v8::FunctionTemplate> fun_templ = |
12986 v8::FunctionTemplate::New(ThrowInJSNoCatch); | 13096 v8::FunctionTemplate::New(env->GetIsolate(), ThrowInJSNoCatch); |
12987 Local<Function> fun = fun_templ->GetFunction(); | 13097 Local<Function> fun = fun_templ->GetFunction(); |
12988 env->Global()->Set(v8_str("throw_in_js"), fun); | 13098 env->Global()->Set(v8_str("throw_in_js"), fun); |
12989 Local<Script> script = v8_compile("(function () {" | 13099 Local<Script> script = v8_compile("(function () {" |
12990 " try {" | 13100 " try {" |
12991 " throw_in_js();" | 13101 " throw_in_js();" |
12992 " return 42;" | 13102 " return 42;" |
12993 " } catch (e) {" | 13103 " } catch (e) {" |
12994 " return e * 13;" | 13104 " return e * 13;" |
12995 " }" | 13105 " }" |
12996 "})();"); | 13106 "})();"); |
(...skipping 15 matching lines...) Expand all Loading... |
13012 v8::Unlocker unlocker(CcTest::isolate()); | 13122 v8::Unlocker unlocker(CcTest::isolate()); |
13013 } | 13123 } |
13014 | 13124 |
13015 | 13125 |
13016 THREADED_TEST(LockUnlockLock) { | 13126 THREADED_TEST(LockUnlockLock) { |
13017 { | 13127 { |
13018 v8::Locker locker(CcTest::isolate()); | 13128 v8::Locker locker(CcTest::isolate()); |
13019 v8::HandleScope scope(CcTest::isolate()); | 13129 v8::HandleScope scope(CcTest::isolate()); |
13020 LocalContext env; | 13130 LocalContext env; |
13021 Local<v8::FunctionTemplate> fun_templ = | 13131 Local<v8::FunctionTemplate> fun_templ = |
13022 v8::FunctionTemplate::New(UnlockForAMoment); | 13132 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); |
13023 Local<Function> fun = fun_templ->GetFunction(); | 13133 Local<Function> fun = fun_templ->GetFunction(); |
13024 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); | 13134 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); |
13025 Local<Script> script = v8_compile("(function () {" | 13135 Local<Script> script = v8_compile("(function () {" |
13026 " unlock_for_a_moment();" | 13136 " unlock_for_a_moment();" |
13027 " return 42;" | 13137 " return 42;" |
13028 "})();"); | 13138 "})();"); |
13029 CHECK_EQ(42, script->Run()->Int32Value()); | 13139 CHECK_EQ(42, script->Run()->Int32Value()); |
13030 } | 13140 } |
13031 { | 13141 { |
13032 v8::Locker locker(CcTest::isolate()); | 13142 v8::Locker locker(CcTest::isolate()); |
13033 v8::HandleScope scope(CcTest::isolate()); | 13143 v8::HandleScope scope(CcTest::isolate()); |
13034 LocalContext env; | 13144 LocalContext env; |
13035 Local<v8::FunctionTemplate> fun_templ = | 13145 Local<v8::FunctionTemplate> fun_templ = |
13036 v8::FunctionTemplate::New(UnlockForAMoment); | 13146 v8::FunctionTemplate::New(CcTest::isolate(), UnlockForAMoment); |
13037 Local<Function> fun = fun_templ->GetFunction(); | 13147 Local<Function> fun = fun_templ->GetFunction(); |
13038 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); | 13148 env->Global()->Set(v8_str("unlock_for_a_moment"), fun); |
13039 Local<Script> script = v8_compile("(function () {" | 13149 Local<Script> script = v8_compile("(function () {" |
13040 " unlock_for_a_moment();" | 13150 " unlock_for_a_moment();" |
13041 " return 42;" | 13151 " return 42;" |
13042 "})();"); | 13152 "})();"); |
13043 CHECK_EQ(42, script->Run()->Int32Value()); | 13153 CHECK_EQ(42, script->Run()->Int32Value()); |
13044 } | 13154 } |
13045 } | 13155 } |
13046 | 13156 |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13533 return invocations; | 13643 return invocations; |
13534 } | 13644 } |
13535 | 13645 |
13536 | 13646 |
13537 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { | 13647 void SetFunctionEntryHookTest::RunLoopInNewEnv(v8::Isolate* isolate) { |
13538 v8::HandleScope outer(isolate); | 13648 v8::HandleScope outer(isolate); |
13539 v8::Local<Context> env = Context::New(isolate); | 13649 v8::Local<Context> env = Context::New(isolate); |
13540 env->Enter(); | 13650 env->Enter(); |
13541 | 13651 |
13542 Local<ObjectTemplate> t = ObjectTemplate::New(); | 13652 Local<ObjectTemplate> t = ObjectTemplate::New(); |
13543 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(RuntimeCallback)); | 13653 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(isolate, RuntimeCallback)); |
13544 env->Global()->Set(v8_str("obj"), t->NewInstance()); | 13654 env->Global()->Set(v8_str("obj"), t->NewInstance()); |
13545 | 13655 |
13546 const char* script = | 13656 const char* script = |
13547 "function bar() {\n" | 13657 "function bar() {\n" |
13548 " var sum = 0;\n" | 13658 " var sum = 0;\n" |
13549 " for (i = 0; i < 100; ++i)\n" | 13659 " for (i = 0; i < 100; ++i)\n" |
13550 " sum = foo(i);\n" | 13660 " sum = foo(i);\n" |
13551 " return sum;\n" | 13661 " return sum;\n" |
13552 "}\n" | 13662 "}\n" |
13553 "function foo(i) { return i * i; }\n" | 13663 "function foo(i) { return i * i; }\n" |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14021 | 14131 |
14022 static void FunctionNameCallback( | 14132 static void FunctionNameCallback( |
14023 const v8::FunctionCallbackInfo<v8::Value>& args) { | 14133 const v8::FunctionCallbackInfo<v8::Value>& args) { |
14024 ApiTestFuzzer::Fuzz(); | 14134 ApiTestFuzzer::Fuzz(); |
14025 args.GetReturnValue().Set(v8_num(42)); | 14135 args.GetReturnValue().Set(v8_num(42)); |
14026 } | 14136 } |
14027 | 14137 |
14028 | 14138 |
14029 THREADED_TEST(CallbackFunctionName) { | 14139 THREADED_TEST(CallbackFunctionName) { |
14030 LocalContext context; | 14140 LocalContext context; |
14031 v8::HandleScope scope(context->GetIsolate()); | 14141 v8::Isolate* isolate = context->GetIsolate(); |
| 14142 v8::HandleScope scope(isolate); |
14032 Local<ObjectTemplate> t = ObjectTemplate::New(); | 14143 Local<ObjectTemplate> t = ObjectTemplate::New(); |
14033 t->Set(v8_str("asdf"), v8::FunctionTemplate::New(FunctionNameCallback)); | 14144 t->Set(v8_str("asdf"), |
| 14145 v8::FunctionTemplate::New(isolate, FunctionNameCallback)); |
14034 context->Global()->Set(v8_str("obj"), t->NewInstance()); | 14146 context->Global()->Set(v8_str("obj"), t->NewInstance()); |
14035 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name"); | 14147 v8::Handle<v8::Value> value = CompileRun("obj.asdf.name"); |
14036 CHECK(value->IsString()); | 14148 CHECK(value->IsString()); |
14037 v8::String::Utf8Value name(value); | 14149 v8::String::Utf8Value name(value); |
14038 CHECK_EQ("asdf", *name); | 14150 CHECK_EQ("asdf", *name); |
14039 } | 14151 } |
14040 | 14152 |
14041 | 14153 |
14042 THREADED_TEST(DateAccess) { | 14154 THREADED_TEST(DateAccess) { |
14043 LocalContext context; | 14155 LocalContext context; |
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15201 | 15313 |
15202 // Allow cross-domain access. | 15314 // Allow cross-domain access. |
15203 Local<String> token = v8_str("<security token>"); | 15315 Local<String> token = v8_str("<security token>"); |
15204 calling_context0->SetSecurityToken(token); | 15316 calling_context0->SetSecurityToken(token); |
15205 calling_context1->SetSecurityToken(token); | 15317 calling_context1->SetSecurityToken(token); |
15206 calling_context2->SetSecurityToken(token); | 15318 calling_context2->SetSecurityToken(token); |
15207 | 15319 |
15208 // Create an object with a C++ callback in context0. | 15320 // Create an object with a C++ callback in context0. |
15209 calling_context0->Enter(); | 15321 calling_context0->Enter(); |
15210 Local<v8::FunctionTemplate> callback_templ = | 15322 Local<v8::FunctionTemplate> callback_templ = |
15211 v8::FunctionTemplate::New(GetCallingContextCallback); | 15323 v8::FunctionTemplate::New(isolate, GetCallingContextCallback); |
15212 calling_context0->Global()->Set(v8_str("callback"), | 15324 calling_context0->Global()->Set(v8_str("callback"), |
15213 callback_templ->GetFunction()); | 15325 callback_templ->GetFunction()); |
15214 calling_context0->Exit(); | 15326 calling_context0->Exit(); |
15215 | 15327 |
15216 // Expose context0 in context1 and set up a function that calls the | 15328 // Expose context0 in context1 and set up a function that calls the |
15217 // callback function. | 15329 // callback function. |
15218 calling_context1->Enter(); | 15330 calling_context1->Enter(); |
15219 calling_context1->Global()->Set(v8_str("context0"), | 15331 calling_context1->Global()->Set(v8_str("context0"), |
15220 calling_context0->Global()); | 15332 calling_context0->Global()); |
15221 CompileRun("function f() { context0.callback() }"); | 15333 CompileRun("function f() { context0.callback() }"); |
(...skipping 26 matching lines...) Expand all Loading... |
15248 } | 15360 } |
15249 | 15361 |
15250 | 15362 |
15251 // Regression test for issue 398. | 15363 // Regression test for issue 398. |
15252 // If a function is added to an object, creating a constant function | 15364 // If a function is added to an object, creating a constant function |
15253 // field, and the result is cloned, replacing the constant function on the | 15365 // field, and the result is cloned, replacing the constant function on the |
15254 // original should not affect the clone. | 15366 // original should not affect the clone. |
15255 // See http://code.google.com/p/v8/issues/detail?id=398 | 15367 // See http://code.google.com/p/v8/issues/detail?id=398 |
15256 THREADED_TEST(ReplaceConstantFunction) { | 15368 THREADED_TEST(ReplaceConstantFunction) { |
15257 LocalContext context; | 15369 LocalContext context; |
15258 v8::HandleScope scope(context->GetIsolate()); | 15370 v8::Isolate* isolate = context->GetIsolate(); |
| 15371 v8::HandleScope scope(isolate); |
15259 v8::Handle<v8::Object> obj = v8::Object::New(); | 15372 v8::Handle<v8::Object> obj = v8::Object::New(); |
15260 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); | 15373 v8::Handle<v8::FunctionTemplate> func_templ = |
| 15374 v8::FunctionTemplate::New(isolate); |
15261 v8::Handle<v8::String> foo_string = | 15375 v8::Handle<v8::String> foo_string = |
15262 v8::String::NewFromUtf8(context->GetIsolate(), "foo"); | 15376 v8::String::NewFromUtf8(isolate, "foo"); |
15263 obj->Set(foo_string, func_templ->GetFunction()); | 15377 obj->Set(foo_string, func_templ->GetFunction()); |
15264 v8::Handle<v8::Object> obj_clone = obj->Clone(); | 15378 v8::Handle<v8::Object> obj_clone = obj->Clone(); |
15265 obj_clone->Set(foo_string, | 15379 obj_clone->Set(foo_string, |
15266 v8::String::NewFromUtf8(context->GetIsolate(), "Hello")); | 15380 v8::String::NewFromUtf8(isolate, "Hello")); |
15267 CHECK(!obj->Get(foo_string)->IsUndefined()); | 15381 CHECK(!obj->Get(foo_string)->IsUndefined()); |
15268 } | 15382 } |
15269 | 15383 |
15270 | 15384 |
15271 static void CheckElementValue(i::Isolate* isolate, | 15385 static void CheckElementValue(i::Isolate* isolate, |
15272 int expected, | 15386 int expected, |
15273 i::Handle<i::Object> obj, | 15387 i::Handle<i::Object> obj, |
15274 int offset) { | 15388 int offset) { |
15275 i::Object* element = obj->GetElement(isolate, offset)->ToObjectChecked(); | 15389 i::Object* element = obj->GetElement(isolate, offset)->ToObjectChecked(); |
15276 CHECK_EQ(expected, i::Smi::cast(element)->value()); | 15390 CHECK_EQ(expected, i::Smi::cast(element)->value()); |
(...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16658 | 16772 |
16659 CHECK(stackTrace->AsArray()->IsArray()); | 16773 CHECK(stackTrace->AsArray()->IsArray()); |
16660 } | 16774 } |
16661 } | 16775 } |
16662 | 16776 |
16663 | 16777 |
16664 // Tests the C++ StackTrace API. | 16778 // Tests the C++ StackTrace API. |
16665 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. | 16779 // TODO(3074796): Reenable this as a THREADED_TEST once it passes. |
16666 // THREADED_TEST(CaptureStackTrace) { | 16780 // THREADED_TEST(CaptureStackTrace) { |
16667 TEST(CaptureStackTrace) { | 16781 TEST(CaptureStackTrace) { |
16668 v8::HandleScope scope(CcTest::isolate()); | 16782 v8::Isolate* isolate = CcTest::isolate(); |
| 16783 v8::HandleScope scope(isolate); |
16669 v8::Handle<v8::String> origin = | 16784 v8::Handle<v8::String> origin = |
16670 v8::String::NewFromUtf8(CcTest::isolate(), "capture-stack-trace-test"); | 16785 v8::String::NewFromUtf8(isolate, "capture-stack-trace-test"); |
16671 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 16786 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
16672 templ->Set(v8_str("AnalyzeStackInNativeCode"), | 16787 templ->Set(v8_str("AnalyzeStackInNativeCode"), |
16673 v8::FunctionTemplate::New(AnalyzeStackInNativeCode)); | 16788 v8::FunctionTemplate::New(isolate, AnalyzeStackInNativeCode)); |
16674 LocalContext context(0, templ); | 16789 LocalContext context(0, templ); |
16675 | 16790 |
16676 // Test getting OVERVIEW information. Should ignore information that is not | 16791 // Test getting OVERVIEW information. Should ignore information that is not |
16677 // script name, function name, line number, and column offset. | 16792 // script name, function name, line number, and column offset. |
16678 const char *overview_source = | 16793 const char *overview_source = |
16679 "function bar() {\n" | 16794 "function bar() {\n" |
16680 " var y; AnalyzeStackInNativeCode(1);\n" | 16795 " var y; AnalyzeStackInNativeCode(1);\n" |
16681 "}\n" | 16796 "}\n" |
16682 "function foo() {\n" | 16797 "function foo() {\n" |
16683 "\n" | 16798 "\n" |
16684 " bar();\n" | 16799 " bar();\n" |
16685 "}\n" | 16800 "}\n" |
16686 "var x;eval('new foo();');"; | 16801 "var x;eval('new foo();');"; |
16687 v8::Handle<v8::String> overview_src = | 16802 v8::Handle<v8::String> overview_src = |
16688 v8::String::NewFromUtf8(CcTest::isolate(), overview_source); | 16803 v8::String::NewFromUtf8(isolate, overview_source); |
16689 v8::Handle<Value> overview_result( | 16804 v8::Handle<Value> overview_result( |
16690 v8::Script::New(overview_src, origin)->Run()); | 16805 v8::Script::New(overview_src, origin)->Run()); |
16691 CHECK(!overview_result.IsEmpty()); | 16806 CHECK(!overview_result.IsEmpty()); |
16692 CHECK(overview_result->IsObject()); | 16807 CHECK(overview_result->IsObject()); |
16693 | 16808 |
16694 // Test getting DETAILED information. | 16809 // Test getting DETAILED information. |
16695 const char *detailed_source = | 16810 const char *detailed_source = |
16696 "function bat() {AnalyzeStackInNativeCode(2);\n" | 16811 "function bat() {AnalyzeStackInNativeCode(2);\n" |
16697 "}\n" | 16812 "}\n" |
16698 "\n" | 16813 "\n" |
16699 "function baz() {\n" | 16814 "function baz() {\n" |
16700 " bat();\n" | 16815 " bat();\n" |
16701 "}\n" | 16816 "}\n" |
16702 "eval('new baz();');"; | 16817 "eval('new baz();');"; |
16703 v8::Handle<v8::String> detailed_src = | 16818 v8::Handle<v8::String> detailed_src = |
16704 v8::String::NewFromUtf8(CcTest::isolate(), detailed_source); | 16819 v8::String::NewFromUtf8(isolate, detailed_source); |
16705 // Make the script using a non-zero line and column offset. | 16820 // Make the script using a non-zero line and column offset. |
16706 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3); | 16821 v8::Handle<v8::Integer> line_offset = v8::Integer::New(3); |
16707 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5); | 16822 v8::Handle<v8::Integer> column_offset = v8::Integer::New(5); |
16708 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); | 16823 v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset); |
16709 v8::Handle<v8::Script> detailed_script( | 16824 v8::Handle<v8::Script> detailed_script( |
16710 v8::Script::New(detailed_src, &detailed_origin)); | 16825 v8::Script::New(detailed_src, &detailed_origin)); |
16711 v8::Handle<Value> detailed_result(detailed_script->Run()); | 16826 v8::Handle<Value> detailed_result(detailed_script->Run()); |
16712 CHECK(!detailed_result.IsEmpty()); | 16827 CHECK(!detailed_result.IsEmpty()); |
16713 CHECK(detailed_result->IsObject()); | 16828 CHECK(detailed_result->IsObject()); |
16714 } | 16829 } |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16910 for (int i = 0; i < 3; i++) { | 17025 for (int i = 0; i < 3; i++) { |
16911 v8::Handle<v8::String> name = | 17026 v8::Handle<v8::String> name = |
16912 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); | 17027 stackTrace->GetFrame(i)->GetScriptNameOrSourceURL(); |
16913 CHECK(!name.IsEmpty()); | 17028 CHECK(!name.IsEmpty()); |
16914 CHECK_EQ(url, name); | 17029 CHECK_EQ(url, name); |
16915 } | 17030 } |
16916 } | 17031 } |
16917 | 17032 |
16918 | 17033 |
16919 TEST(SourceURLInStackTrace) { | 17034 TEST(SourceURLInStackTrace) { |
16920 v8::HandleScope scope(CcTest::isolate()); | 17035 v8::Isolate* isolate = CcTest::isolate(); |
| 17036 v8::HandleScope scope(isolate); |
16921 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 17037 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
16922 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), | 17038 templ->Set(v8_str("AnalyzeStackOfEvalWithSourceURL"), |
16923 v8::FunctionTemplate::New(AnalyzeStackOfEvalWithSourceURL)); | 17039 v8::FunctionTemplate::New(isolate, |
| 17040 AnalyzeStackOfEvalWithSourceURL)); |
16924 LocalContext context(0, templ); | 17041 LocalContext context(0, templ); |
16925 | 17042 |
16926 const char *source = | 17043 const char *source = |
16927 "function outer() {\n" | 17044 "function outer() {\n" |
16928 "function bar() {\n" | 17045 "function bar() {\n" |
16929 " AnalyzeStackOfEvalWithSourceURL();\n" | 17046 " AnalyzeStackOfEvalWithSourceURL();\n" |
16930 "}\n" | 17047 "}\n" |
16931 "function foo() {\n" | 17048 "function foo() {\n" |
16932 "\n" | 17049 "\n" |
16933 " bar();\n" | 17050 " bar();\n" |
(...skipping 18 matching lines...) Expand all Loading... |
16952 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( | 17069 v8::Handle<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace( |
16953 args.GetIsolate(), 10, v8::StackTrace::kScriptId); | 17070 args.GetIsolate(), 10, v8::StackTrace::kScriptId); |
16954 CHECK_EQ(2, stackTrace->GetFrameCount()); | 17071 CHECK_EQ(2, stackTrace->GetFrameCount()); |
16955 for (int i = 0; i < 2; i++) { | 17072 for (int i = 0; i < 2; i++) { |
16956 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); | 17073 scriptIdInStack[i] = stackTrace->GetFrame(i)->GetScriptId(); |
16957 } | 17074 } |
16958 } | 17075 } |
16959 | 17076 |
16960 | 17077 |
16961 TEST(ScriptIdInStackTrace) { | 17078 TEST(ScriptIdInStackTrace) { |
16962 v8::HandleScope scope(CcTest::isolate()); | 17079 v8::Isolate* isolate = CcTest::isolate(); |
| 17080 v8::HandleScope scope(isolate); |
16963 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 17081 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
16964 templ->Set(v8_str("AnalyzeScriptIdInStack"), | 17082 templ->Set(v8_str("AnalyzeScriptIdInStack"), |
16965 v8::FunctionTemplate::New(AnalyzeScriptIdInStack)); | 17083 v8::FunctionTemplate::New(isolate, AnalyzeScriptIdInStack)); |
16966 LocalContext context(0, templ); | 17084 LocalContext context(0, templ); |
16967 | 17085 |
16968 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( | 17086 v8::Handle<v8::String> scriptSource = v8::String::NewFromUtf8( |
16969 CcTest::isolate(), | 17087 isolate, |
16970 "function foo() {\n" | 17088 "function foo() {\n" |
16971 " AnalyzeScriptIdInStack();" | 17089 " AnalyzeScriptIdInStack();" |
16972 "}\n" | 17090 "}\n" |
16973 "foo();\n"); | 17091 "foo();\n"); |
16974 v8::ScriptOrigin origin = | 17092 v8::ScriptOrigin origin = |
16975 v8::ScriptOrigin(v8::String::NewFromUtf8(CcTest::isolate(), "test")); | 17093 v8::ScriptOrigin(v8::String::NewFromUtf8(isolate, "test")); |
16976 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); | 17094 v8::Local<v8::Script> script(v8::Script::Compile(scriptSource, &origin)); |
16977 script->Run(); | 17095 script->Run(); |
16978 for (int i = 0; i < 2; i++) { | 17096 for (int i = 0; i < 2; i++) { |
16979 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); | 17097 CHECK(scriptIdInStack[i] != v8::Message::kNoScriptIdInfo); |
16980 CHECK_EQ(scriptIdInStack[i], script->GetId()); | 17098 CHECK_EQ(scriptIdInStack[i], script->GetId()); |
16981 } | 17099 } |
16982 } | 17100 } |
16983 | 17101 |
16984 | 17102 |
16985 void AnalyzeStackOfInlineScriptWithSourceURL( | 17103 void AnalyzeStackOfInlineScriptWithSourceURL( |
(...skipping 10 matching lines...) Expand all Loading... |
16996 CHECK_EQ(url, name); | 17114 CHECK_EQ(url, name); |
16997 } | 17115 } |
16998 } | 17116 } |
16999 | 17117 |
17000 | 17118 |
17001 TEST(InlineScriptWithSourceURLInStackTrace) { | 17119 TEST(InlineScriptWithSourceURLInStackTrace) { |
17002 v8::HandleScope scope(CcTest::isolate()); | 17120 v8::HandleScope scope(CcTest::isolate()); |
17003 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 17121 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
17004 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"), | 17122 templ->Set(v8_str("AnalyzeStackOfInlineScriptWithSourceURL"), |
17005 v8::FunctionTemplate::New( | 17123 v8::FunctionTemplate::New( |
17006 AnalyzeStackOfInlineScriptWithSourceURL)); | 17124 CcTest::isolate(), AnalyzeStackOfInlineScriptWithSourceURL)); |
17007 LocalContext context(0, templ); | 17125 LocalContext context(0, templ); |
17008 | 17126 |
17009 const char *source = | 17127 const char *source = |
17010 "function outer() {\n" | 17128 "function outer() {\n" |
17011 "function bar() {\n" | 17129 "function bar() {\n" |
17012 " AnalyzeStackOfInlineScriptWithSourceURL();\n" | 17130 " AnalyzeStackOfInlineScriptWithSourceURL();\n" |
17013 "}\n" | 17131 "}\n" |
17014 "function foo() {\n" | 17132 "function foo() {\n" |
17015 "\n" | 17133 "\n" |
17016 " bar();\n" | 17134 " bar();\n" |
(...skipping 24 matching lines...) Expand all Loading... |
17041 CHECK_EQ(url, name); | 17159 CHECK_EQ(url, name); |
17042 } | 17160 } |
17043 } | 17161 } |
17044 | 17162 |
17045 | 17163 |
17046 TEST(DynamicWithSourceURLInStackTrace) { | 17164 TEST(DynamicWithSourceURLInStackTrace) { |
17047 v8::HandleScope scope(CcTest::isolate()); | 17165 v8::HandleScope scope(CcTest::isolate()); |
17048 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 17166 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
17049 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"), | 17167 templ->Set(v8_str("AnalyzeStackOfDynamicScriptWithSourceURL"), |
17050 v8::FunctionTemplate::New( | 17168 v8::FunctionTemplate::New( |
17051 AnalyzeStackOfDynamicScriptWithSourceURL)); | 17169 CcTest::isolate(), AnalyzeStackOfDynamicScriptWithSourceURL)); |
17052 LocalContext context(0, templ); | 17170 LocalContext context(0, templ); |
17053 | 17171 |
17054 const char *source = | 17172 const char *source = |
17055 "function outer() {\n" | 17173 "function outer() {\n" |
17056 "function bar() {\n" | 17174 "function bar() {\n" |
17057 " AnalyzeStackOfDynamicScriptWithSourceURL();\n" | 17175 " AnalyzeStackOfDynamicScriptWithSourceURL();\n" |
17058 "}\n" | 17176 "}\n" |
17059 "function foo() {\n" | 17177 "function foo() {\n" |
17060 "\n" | 17178 "\n" |
17061 " bar();\n" | 17179 " bar();\n" |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17215 | 17333 |
17216 // Set stack limit. | 17334 // Set stack limit. |
17217 v8::ResourceConstraints constraints; | 17335 v8::ResourceConstraints constraints; |
17218 constraints.set_stack_limit(set_limit); | 17336 constraints.set_stack_limit(set_limit); |
17219 CHECK(v8::SetResourceConstraints(CcTest::isolate(), &constraints)); | 17337 CHECK(v8::SetResourceConstraints(CcTest::isolate(), &constraints)); |
17220 | 17338 |
17221 // Execute a script. | 17339 // Execute a script. |
17222 LocalContext env; | 17340 LocalContext env; |
17223 v8::HandleScope scope(env->GetIsolate()); | 17341 v8::HandleScope scope(env->GetIsolate()); |
17224 Local<v8::FunctionTemplate> fun_templ = | 17342 Local<v8::FunctionTemplate> fun_templ = |
17225 v8::FunctionTemplate::New(GetStackLimitCallback); | 17343 v8::FunctionTemplate::New(env->GetIsolate(), GetStackLimitCallback); |
17226 Local<Function> fun = fun_templ->GetFunction(); | 17344 Local<Function> fun = fun_templ->GetFunction(); |
17227 env->Global()->Set(v8_str("get_stack_limit"), fun); | 17345 env->Global()->Set(v8_str("get_stack_limit"), fun); |
17228 CompileRun("get_stack_limit();"); | 17346 CompileRun("get_stack_limit();"); |
17229 | 17347 |
17230 CHECK(stack_limit == set_limit); | 17348 CHECK(stack_limit == set_limit); |
17231 } | 17349 } |
17232 | 17350 |
17233 | 17351 |
17234 TEST(SetResourceConstraintsInThread) { | 17352 TEST(SetResourceConstraintsInThread) { |
17235 uint32_t* set_limit; | 17353 uint32_t* set_limit; |
17236 { | 17354 { |
17237 v8::Locker locker(CcTest::isolate()); | 17355 v8::Locker locker(CcTest::isolate()); |
17238 set_limit = ComputeStackLimit(stack_breathing_room); | 17356 set_limit = ComputeStackLimit(stack_breathing_room); |
17239 | 17357 |
17240 // Set stack limit. | 17358 // Set stack limit. |
17241 v8::ResourceConstraints constraints; | 17359 v8::ResourceConstraints constraints; |
17242 constraints.set_stack_limit(set_limit); | 17360 constraints.set_stack_limit(set_limit); |
17243 CHECK(v8::SetResourceConstraints(CcTest::isolate(), &constraints)); | 17361 CHECK(v8::SetResourceConstraints(CcTest::isolate(), &constraints)); |
17244 | 17362 |
17245 // Execute a script. | 17363 // Execute a script. |
17246 v8::HandleScope scope(CcTest::isolate()); | 17364 v8::HandleScope scope(CcTest::isolate()); |
17247 LocalContext env; | 17365 LocalContext env; |
17248 Local<v8::FunctionTemplate> fun_templ = | 17366 Local<v8::FunctionTemplate> fun_templ = |
17249 v8::FunctionTemplate::New(GetStackLimitCallback); | 17367 v8::FunctionTemplate::New(CcTest::isolate(), GetStackLimitCallback); |
17250 Local<Function> fun = fun_templ->GetFunction(); | 17368 Local<Function> fun = fun_templ->GetFunction(); |
17251 env->Global()->Set(v8_str("get_stack_limit"), fun); | 17369 env->Global()->Set(v8_str("get_stack_limit"), fun); |
17252 CompileRun("get_stack_limit();"); | 17370 CompileRun("get_stack_limit();"); |
17253 | 17371 |
17254 CHECK(stack_limit == set_limit); | 17372 CHECK(stack_limit == set_limit); |
17255 } | 17373 } |
17256 { | 17374 { |
17257 v8::Locker locker(CcTest::isolate()); | 17375 v8::Locker locker(CcTest::isolate()); |
17258 CHECK(stack_limit == set_limit); | 17376 CHECK(stack_limit == set_limit); |
17259 } | 17377 } |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17540 v8::Handle<v8::String> str(args[0]->ToString()); | 17658 v8::Handle<v8::String> str(args[0]->ToString()); |
17541 USE(str); | 17659 USE(str); |
17542 if (tc.HasCaught()) | 17660 if (tc.HasCaught()) |
17543 tc.ReThrow(); | 17661 tc.ReThrow(); |
17544 } | 17662 } |
17545 | 17663 |
17546 | 17664 |
17547 // Test that an exception can be propagated down through a spaghetti | 17665 // Test that an exception can be propagated down through a spaghetti |
17548 // stack using ReThrow. | 17666 // stack using ReThrow. |
17549 THREADED_TEST(SpaghettiStackReThrow) { | 17667 THREADED_TEST(SpaghettiStackReThrow) { |
17550 v8::HandleScope scope(CcTest::isolate()); | 17668 v8::Isolate* isolate = CcTest::isolate(); |
| 17669 v8::HandleScope scope(isolate); |
17551 LocalContext context; | 17670 LocalContext context; |
17552 context->Global()->Set( | 17671 context->Global()->Set( |
17553 v8::String::NewFromUtf8(CcTest::isolate(), "s"), | 17672 v8::String::NewFromUtf8(isolate, "s"), |
17554 v8::FunctionTemplate::New(SpaghettiIncident)->GetFunction()); | 17673 v8::FunctionTemplate::New(isolate, SpaghettiIncident)->GetFunction()); |
17555 v8::TryCatch try_catch; | 17674 v8::TryCatch try_catch; |
17556 CompileRun( | 17675 CompileRun( |
17557 "var i = 0;" | 17676 "var i = 0;" |
17558 "var o = {" | 17677 "var o = {" |
17559 " toString: function () {" | 17678 " toString: function () {" |
17560 " if (i == 10) {" | 17679 " if (i == 10) {" |
17561 " throw 'Hey!';" | 17680 " throw 'Hey!';" |
17562 " } else {" | 17681 " } else {" |
17563 " i++;" | 17682 " i++;" |
17564 " return s(o);" | 17683 " return s(o);" |
(...skipping 1660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19225 Set(v8_str("context_id"), v8::Integer::New(id)); | 19344 Set(v8_str("context_id"), v8::Integer::New(id)); |
19226 } | 19345 } |
19227 | 19346 |
19228 | 19347 |
19229 static void CheckContextId(v8::Handle<Object> object, int expected) { | 19348 static void CheckContextId(v8::Handle<Object> object, int expected) { |
19230 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); | 19349 CHECK_EQ(expected, object->Get(v8_str("context_id"))->Int32Value()); |
19231 } | 19350 } |
19232 | 19351 |
19233 | 19352 |
19234 THREADED_TEST(CreationContext) { | 19353 THREADED_TEST(CreationContext) { |
19235 HandleScope handle_scope(CcTest::isolate()); | 19354 v8::Isolate* isolate = CcTest::isolate(); |
19236 Handle<Context> context1 = Context::New(CcTest::isolate()); | 19355 HandleScope handle_scope(isolate); |
| 19356 Handle<Context> context1 = Context::New(isolate); |
19237 InstallContextId(context1, 1); | 19357 InstallContextId(context1, 1); |
19238 Handle<Context> context2 = Context::New(CcTest::isolate()); | 19358 Handle<Context> context2 = Context::New(isolate); |
19239 InstallContextId(context2, 2); | 19359 InstallContextId(context2, 2); |
19240 Handle<Context> context3 = Context::New(CcTest::isolate()); | 19360 Handle<Context> context3 = Context::New(isolate); |
19241 InstallContextId(context3, 3); | 19361 InstallContextId(context3, 3); |
19242 | 19362 |
19243 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(); | 19363 Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(isolate); |
19244 | 19364 |
19245 Local<Object> object1; | 19365 Local<Object> object1; |
19246 Local<Function> func1; | 19366 Local<Function> func1; |
19247 { | 19367 { |
19248 Context::Scope scope(context1); | 19368 Context::Scope scope(context1); |
19249 object1 = Object::New(); | 19369 object1 = Object::New(); |
19250 func1 = tmpl->GetFunction(); | 19370 func1 = tmpl->GetFunction(); |
19251 } | 19371 } |
19252 | 19372 |
19253 Local<Object> object2; | 19373 Local<Object> object2; |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19553 CHECK(expected_message->Equals(actual_message)); | 19673 CHECK(expected_message->Equals(actual_message)); |
19554 } | 19674 } |
19555 | 19675 |
19556 | 19676 |
19557 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { | 19677 static void NonObjectThis(const v8::FunctionCallbackInfo<v8::Value>& args) { |
19558 } | 19678 } |
19559 | 19679 |
19560 | 19680 |
19561 THREADED_TEST(CallAPIFunctionOnNonObject) { | 19681 THREADED_TEST(CallAPIFunctionOnNonObject) { |
19562 LocalContext context; | 19682 LocalContext context; |
19563 v8::HandleScope scope(context->GetIsolate()); | 19683 v8::Isolate* isolate = context->GetIsolate(); |
19564 Handle<FunctionTemplate> templ = v8::FunctionTemplate::New(NonObjectThis); | 19684 v8::HandleScope scope(isolate); |
| 19685 Handle<FunctionTemplate> templ = |
| 19686 v8::FunctionTemplate::New(isolate, NonObjectThis); |
19565 Handle<Function> function = templ->GetFunction(); | 19687 Handle<Function> function = templ->GetFunction(); |
19566 context->Global()->Set(v8_str("f"), function); | 19688 context->Global()->Set(v8_str("f"), function); |
19567 TryCatch try_catch; | 19689 TryCatch try_catch; |
19568 CompileRun("f.call(2)"); | 19690 CompileRun("f.call(2)"); |
19569 } | 19691 } |
19570 | 19692 |
19571 | 19693 |
19572 // Regression test for issue 1470. | 19694 // Regression test for issue 1470. |
19573 THREADED_TEST(ReadOnlyIndexedProperties) { | 19695 THREADED_TEST(ReadOnlyIndexedProperties) { |
19574 v8::HandleScope scope(CcTest::isolate()); | 19696 v8::HandleScope scope(CcTest::isolate()); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19640 HandleScope scope(isolate); | 19762 HandleScope scope(isolate); |
19641 | 19763 |
19642 // Template for object with security check. | 19764 // Template for object with security check. |
19643 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); | 19765 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); |
19644 // We don't do indexing, so any callback can be used for that. | 19766 // We don't do indexing, so any callback can be used for that. |
19645 no_proto_template->SetAccessCheckCallbacks( | 19767 no_proto_template->SetAccessCheckCallbacks( |
19646 BlockProtoNamedSecurityTestCallback, | 19768 BlockProtoNamedSecurityTestCallback, |
19647 IndexedSecurityTestCallback); | 19769 IndexedSecurityTestCallback); |
19648 | 19770 |
19649 // Templates for objects with hidden prototypes and possibly security check. | 19771 // Templates for objects with hidden prototypes and possibly security check. |
19650 Local<FunctionTemplate> hidden_proto_template = v8::FunctionTemplate::New(); | 19772 Local<FunctionTemplate> hidden_proto_template = |
| 19773 v8::FunctionTemplate::New(isolate); |
19651 hidden_proto_template->SetHiddenPrototype(true); | 19774 hidden_proto_template->SetHiddenPrototype(true); |
19652 | 19775 |
19653 Local<FunctionTemplate> protected_hidden_proto_template = | 19776 Local<FunctionTemplate> protected_hidden_proto_template = |
19654 v8::FunctionTemplate::New(); | 19777 v8::FunctionTemplate::New(isolate); |
19655 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( | 19778 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( |
19656 BlockProtoNamedSecurityTestCallback, | 19779 BlockProtoNamedSecurityTestCallback, |
19657 IndexedSecurityTestCallback); | 19780 IndexedSecurityTestCallback); |
19658 protected_hidden_proto_template->SetHiddenPrototype(true); | 19781 protected_hidden_proto_template->SetHiddenPrototype(true); |
19659 | 19782 |
19660 // Context for "foreign" objects used in test. | 19783 // Context for "foreign" objects used in test. |
19661 Local<Context> context = v8::Context::New(isolate); | 19784 Local<Context> context = v8::Context::New(isolate); |
19662 context->Enter(); | 19785 context->Enter(); |
19663 | 19786 |
19664 // Plain object, no security check. | 19787 // Plain object, no security check. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19720 CHECK(result5->Equals( | 19843 CHECK(result5->Equals( |
19721 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); | 19844 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); |
19722 | 19845 |
19723 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); | 19846 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); |
19724 CHECK(result6->Equals(Undefined(isolate))); | 19847 CHECK(result6->Equals(Undefined(isolate))); |
19725 } | 19848 } |
19726 | 19849 |
19727 | 19850 |
19728 THREADED_TEST(Regress125988) { | 19851 THREADED_TEST(Regress125988) { |
19729 v8::HandleScope scope(CcTest::isolate()); | 19852 v8::HandleScope scope(CcTest::isolate()); |
19730 Handle<FunctionTemplate> intercept = FunctionTemplate::New(); | 19853 Handle<FunctionTemplate> intercept = FunctionTemplate::New(CcTest::isolate()); |
19731 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); | 19854 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); |
19732 LocalContext env; | 19855 LocalContext env; |
19733 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); | 19856 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); |
19734 CompileRun("var a = new Object();" | 19857 CompileRun("var a = new Object();" |
19735 "var b = new Intercept();" | 19858 "var b = new Intercept();" |
19736 "var c = new Object();" | 19859 "var c = new Object();" |
19737 "c.__proto__ = b;" | 19860 "c.__proto__ = b;" |
19738 "b.__proto__ = a;" | 19861 "b.__proto__ = a;" |
19739 "a.x = 23;" | 19862 "a.x = 23;" |
19740 "for (var i = 0; i < 3; i++) c.x;"); | 19863 "for (var i = 0; i < 3; i++) c.x;"); |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19882 i::OS::Print("Recursion ends.\n"); | 20005 i::OS::Print("Recursion ends.\n"); |
19883 CHECK_EQ(0, callback_fired); | 20006 CHECK_EQ(0, callback_fired); |
19884 } | 20007 } |
19885 } | 20008 } |
19886 | 20009 |
19887 | 20010 |
19888 TEST(CallCompletedCallback) { | 20011 TEST(CallCompletedCallback) { |
19889 LocalContext env; | 20012 LocalContext env; |
19890 v8::HandleScope scope(env->GetIsolate()); | 20013 v8::HandleScope scope(env->GetIsolate()); |
19891 v8::Handle<v8::FunctionTemplate> recursive_runtime = | 20014 v8::Handle<v8::FunctionTemplate> recursive_runtime = |
19892 v8::FunctionTemplate::New(RecursiveCall); | 20015 v8::FunctionTemplate::New(env->GetIsolate(), RecursiveCall); |
19893 env->Global()->Set(v8_str("recursion"), | 20016 env->Global()->Set(v8_str("recursion"), |
19894 recursive_runtime->GetFunction()); | 20017 recursive_runtime->GetFunction()); |
19895 // Adding the same callback a second time has no effect. | 20018 // Adding the same callback a second time has no effect. |
19896 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); | 20019 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); |
19897 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); | 20020 v8::V8::AddCallCompletedCallback(CallCompletedCallback1); |
19898 v8::V8::AddCallCompletedCallback(CallCompletedCallback2); | 20021 v8::V8::AddCallCompletedCallback(CallCompletedCallback2); |
19899 i::OS::Print("--- Script (1) ---\n"); | 20022 i::OS::Print("--- Script (1) ---\n"); |
19900 Local<Script> script = v8::Script::Compile( | 20023 Local<Script> script = v8::Script::Compile( |
19901 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)")); | 20024 v8::String::NewFromUtf8(env->GetIsolate(), "recursion(0)")); |
19902 script->Run(); | 20025 script->Run(); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20179 "%DeoptimizeFunction(test_set);" | 20302 "%DeoptimizeFunction(test_set);" |
20180 "%ClearFunctionTypeFeedback(test_set);"); | 20303 "%ClearFunctionTypeFeedback(test_set);"); |
20181 } | 20304 } |
20182 | 20305 |
20183 | 20306 |
20184 THREADED_TEST(InstanceCheckOnInstanceAccessor) { | 20307 THREADED_TEST(InstanceCheckOnInstanceAccessor) { |
20185 v8::internal::FLAG_allow_natives_syntax = true; | 20308 v8::internal::FLAG_allow_natives_syntax = true; |
20186 LocalContext context; | 20309 LocalContext context; |
20187 v8::HandleScope scope(context->GetIsolate()); | 20310 v8::HandleScope scope(context->GetIsolate()); |
20188 | 20311 |
20189 Local<FunctionTemplate> templ = FunctionTemplate::New(); | 20312 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
20190 Local<ObjectTemplate> inst = templ->InstanceTemplate(); | 20313 Local<ObjectTemplate> inst = templ->InstanceTemplate(); |
20191 inst->SetAccessor(v8_str("foo"), | 20314 inst->SetAccessor(v8_str("foo"), |
20192 InstanceCheckedGetter, InstanceCheckedSetter, | 20315 InstanceCheckedGetter, InstanceCheckedSetter, |
20193 Handle<Value>(), | 20316 Handle<Value>(), |
20194 v8::DEFAULT, | 20317 v8::DEFAULT, |
20195 v8::None, | 20318 v8::None, |
20196 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20319 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
20197 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20320 context->Global()->Set(v8_str("f"), templ->GetFunction()); |
20198 | 20321 |
20199 printf("Testing positive ...\n"); | 20322 printf("Testing positive ...\n"); |
20200 CompileRun("var obj = new f();"); | 20323 CompileRun("var obj = new f();"); |
20201 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20324 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
20202 CheckInstanceCheckedAccessors(true); | 20325 CheckInstanceCheckedAccessors(true); |
20203 | 20326 |
20204 printf("Testing negative ...\n"); | 20327 printf("Testing negative ...\n"); |
20205 CompileRun("var obj = {};" | 20328 CompileRun("var obj = {};" |
20206 "obj.__proto__ = new f();"); | 20329 "obj.__proto__ = new f();"); |
20207 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20330 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
20208 CheckInstanceCheckedAccessors(false); | 20331 CheckInstanceCheckedAccessors(false); |
20209 } | 20332 } |
20210 | 20333 |
20211 | 20334 |
20212 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) { | 20335 THREADED_TEST(InstanceCheckOnInstanceAccessorWithInterceptor) { |
20213 v8::internal::FLAG_allow_natives_syntax = true; | 20336 v8::internal::FLAG_allow_natives_syntax = true; |
20214 LocalContext context; | 20337 LocalContext context; |
20215 v8::HandleScope scope(context->GetIsolate()); | 20338 v8::HandleScope scope(context->GetIsolate()); |
20216 | 20339 |
20217 Local<FunctionTemplate> templ = FunctionTemplate::New(); | 20340 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
20218 Local<ObjectTemplate> inst = templ->InstanceTemplate(); | 20341 Local<ObjectTemplate> inst = templ->InstanceTemplate(); |
20219 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); | 20342 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); |
20220 inst->SetAccessor(v8_str("foo"), | 20343 inst->SetAccessor(v8_str("foo"), |
20221 InstanceCheckedGetter, InstanceCheckedSetter, | 20344 InstanceCheckedGetter, InstanceCheckedSetter, |
20222 Handle<Value>(), | 20345 Handle<Value>(), |
20223 v8::DEFAULT, | 20346 v8::DEFAULT, |
20224 v8::None, | 20347 v8::None, |
20225 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20348 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
20226 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20349 context->Global()->Set(v8_str("f"), templ->GetFunction()); |
20227 | 20350 |
20228 printf("Testing positive ...\n"); | 20351 printf("Testing positive ...\n"); |
20229 CompileRun("var obj = new f();"); | 20352 CompileRun("var obj = new f();"); |
20230 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20353 CHECK(templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
20231 CheckInstanceCheckedAccessors(true); | 20354 CheckInstanceCheckedAccessors(true); |
20232 | 20355 |
20233 printf("Testing negative ...\n"); | 20356 printf("Testing negative ...\n"); |
20234 CompileRun("var obj = {};" | 20357 CompileRun("var obj = {};" |
20235 "obj.__proto__ = new f();"); | 20358 "obj.__proto__ = new f();"); |
20236 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); | 20359 CHECK(!templ->HasInstance(context->Global()->Get(v8_str("obj")))); |
20237 CheckInstanceCheckedAccessors(false); | 20360 CheckInstanceCheckedAccessors(false); |
20238 } | 20361 } |
20239 | 20362 |
20240 | 20363 |
20241 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { | 20364 THREADED_TEST(InstanceCheckOnPrototypeAccessor) { |
20242 v8::internal::FLAG_allow_natives_syntax = true; | 20365 v8::internal::FLAG_allow_natives_syntax = true; |
20243 LocalContext context; | 20366 LocalContext context; |
20244 v8::HandleScope scope(context->GetIsolate()); | 20367 v8::HandleScope scope(context->GetIsolate()); |
20245 | 20368 |
20246 Local<FunctionTemplate> templ = FunctionTemplate::New(); | 20369 Local<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
20247 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); | 20370 Local<ObjectTemplate> proto = templ->PrototypeTemplate(); |
20248 proto->SetAccessor(v8_str("foo"), | 20371 proto->SetAccessor(v8_str("foo"), |
20249 InstanceCheckedGetter, InstanceCheckedSetter, | 20372 InstanceCheckedGetter, InstanceCheckedSetter, |
20250 Handle<Value>(), | 20373 Handle<Value>(), |
20251 v8::DEFAULT, | 20374 v8::DEFAULT, |
20252 v8::None, | 20375 v8::None, |
20253 v8::AccessorSignature::New(context->GetIsolate(), templ)); | 20376 v8::AccessorSignature::New(context->GetIsolate(), templ)); |
20254 context->Global()->Set(v8_str("f"), templ->GetFunction()); | 20377 context->Global()->Set(v8_str("f"), templ->GetFunction()); |
20255 | 20378 |
20256 printf("Testing positive ...\n"); | 20379 printf("Testing positive ...\n"); |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20469 TryCatch try_catch; | 20592 TryCatch try_catch; |
20470 try_catch.SetVerbose(true); | 20593 try_catch.SetVerbose(true); |
20471 CompileRun("try { throw new Error(); } finally { gc(); }"); | 20594 CompileRun("try { throw new Error(); } finally { gc(); }"); |
20472 CHECK(try_catch.HasCaught()); | 20595 CHECK(try_catch.HasCaught()); |
20473 } | 20596 } |
20474 | 20597 |
20475 | 20598 |
20476 THREADED_TEST(Regress149912) { | 20599 THREADED_TEST(Regress149912) { |
20477 LocalContext context; | 20600 LocalContext context; |
20478 v8::HandleScope scope(context->GetIsolate()); | 20601 v8::HandleScope scope(context->GetIsolate()); |
20479 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 20602 Handle<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
20480 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); | 20603 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); |
20481 context->Global()->Set(v8_str("Bug"), templ->GetFunction()); | 20604 context->Global()->Set(v8_str("Bug"), templ->GetFunction()); |
20482 CompileRun("Number.prototype.__proto__ = new Bug; var x = 0; x.foo();"); | 20605 CompileRun("Number.prototype.__proto__ = new Bug; var x = 0; x.foo();"); |
20483 } | 20606 } |
20484 | 20607 |
20485 | 20608 |
20486 THREADED_TEST(Regress157124) { | 20609 THREADED_TEST(Regress157124) { |
20487 LocalContext context; | 20610 LocalContext context; |
20488 v8::HandleScope scope(context->GetIsolate()); | 20611 v8::HandleScope scope(context->GetIsolate()); |
20489 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 20612 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
(...skipping 24 matching lines...) Expand all Loading... |
20514 Local<String> key = String::NewFromUtf8(context->GetIsolate(), "key"); | 20637 Local<String> key = String::NewFromUtf8(context->GetIsolate(), "key"); |
20515 obj->SetHiddenValue(key, v8::Undefined(isolate)); | 20638 obj->SetHiddenValue(key, v8::Undefined(isolate)); |
20516 Local<Value> value = obj->GetHiddenValue(key); | 20639 Local<Value> value = obj->GetHiddenValue(key); |
20517 CHECK(!value.IsEmpty()); | 20640 CHECK(!value.IsEmpty()); |
20518 CHECK(value->IsUndefined()); | 20641 CHECK(value->IsUndefined()); |
20519 } | 20642 } |
20520 | 20643 |
20521 | 20644 |
20522 THREADED_TEST(Regress260106) { | 20645 THREADED_TEST(Regress260106) { |
20523 LocalContext context; | 20646 LocalContext context; |
20524 v8::HandleScope scope(context->GetIsolate()); | 20647 v8::Isolate* isolate = context->GetIsolate(); |
20525 Local<FunctionTemplate> templ = FunctionTemplate::New(DummyCallHandler); | 20648 v8::HandleScope scope(isolate); |
| 20649 Local<FunctionTemplate> templ = FunctionTemplate::New(isolate, |
| 20650 DummyCallHandler); |
20526 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); | 20651 CompileRun("for (var i = 0; i < 128; i++) Object.prototype[i] = 0;"); |
20527 Local<Function> function = templ->GetFunction(); | 20652 Local<Function> function = templ->GetFunction(); |
20528 CHECK(!function.IsEmpty()); | 20653 CHECK(!function.IsEmpty()); |
20529 CHECK(function->IsFunction()); | 20654 CHECK(function->IsFunction()); |
20530 } | 20655 } |
20531 | 20656 |
20532 | 20657 |
20533 THREADED_TEST(JSONParseObject) { | 20658 THREADED_TEST(JSONParseObject) { |
20534 LocalContext context; | 20659 LocalContext context; |
20535 HandleScope scope(context->GetIsolate()); | 20660 HandleScope scope(context->GetIsolate()); |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20647 // Create a context and set an x property on it's global object. | 20772 // Create a context and set an x property on it's global object. |
20648 LocalContext context0(NULL, global_template); | 20773 LocalContext context0(NULL, global_template); |
20649 v8::Handle<v8::Object> global0 = context0->Global(); | 20774 v8::Handle<v8::Object> global0 = context0->Global(); |
20650 global0->Set(v8_str("x"), v8_num(42)); | 20775 global0->Set(v8_str("x"), v8_num(42)); |
20651 ExpectString("JSON.stringify(this)", "{\"x\":42}"); | 20776 ExpectString("JSON.stringify(this)", "{\"x\":42}"); |
20652 | 20777 |
20653 for (int i = 0; i < 2; i++) { | 20778 for (int i = 0; i < 2; i++) { |
20654 if (i == 1) { | 20779 if (i == 1) { |
20655 // Install a toJSON function on the second run. | 20780 // Install a toJSON function on the second run. |
20656 v8::Handle<v8::FunctionTemplate> toJSON = | 20781 v8::Handle<v8::FunctionTemplate> toJSON = |
20657 v8::FunctionTemplate::New(UnreachableCallback); | 20782 v8::FunctionTemplate::New(CcTest::isolate(), UnreachableCallback); |
20658 | 20783 |
20659 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); | 20784 global0->Set(v8_str("toJSON"), toJSON->GetFunction()); |
20660 } | 20785 } |
20661 // Create a context with a different security token so that the | 20786 // Create a context with a different security token so that the |
20662 // failed access check callback will be called on each access. | 20787 // failed access check callback will be called on each access. |
20663 LocalContext context1(NULL, global_template); | 20788 LocalContext context1(NULL, global_template); |
20664 context1->Global()->Set(v8_str("other"), global0); | 20789 context1->Global()->Set(v8_str("other"), global0); |
20665 | 20790 |
20666 ExpectString("JSON.stringify(other)", "{}"); | 20791 ExpectString("JSON.stringify(other)", "{}"); |
20667 ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })", | 20792 ExpectString("JSON.stringify({ 'a' : other, 'b' : ['c'] })", |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20746 LocalContext context0(NULL, global_template); | 20871 LocalContext context0(NULL, global_template); |
20747 context0->Global()->Set(v8_str("x"), v8_num(42)); | 20872 context0->Global()->Set(v8_str("x"), v8_num(42)); |
20748 v8::Handle<v8::Object> global0 = context0->Global(); | 20873 v8::Handle<v8::Object> global0 = context0->Global(); |
20749 | 20874 |
20750 // Create a context with a different security token so that the | 20875 // Create a context with a different security token so that the |
20751 // failed access check callback will be called on each access. | 20876 // failed access check callback will be called on each access. |
20752 LocalContext context1(NULL, global_template); | 20877 LocalContext context1(NULL, global_template); |
20753 context1->Global()->Set(v8_str("other"), global0); | 20878 context1->Global()->Set(v8_str("other"), global0); |
20754 | 20879 |
20755 v8::Handle<v8::FunctionTemplate> catcher_fun = | 20880 v8::Handle<v8::FunctionTemplate> catcher_fun = |
20756 v8::FunctionTemplate::New(CatcherCallback); | 20881 v8::FunctionTemplate::New(CcTest::isolate(), CatcherCallback); |
20757 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction()); | 20882 context1->Global()->Set(v8_str("catcher"), catcher_fun->GetFunction()); |
20758 | 20883 |
20759 v8::Handle<v8::FunctionTemplate> has_own_property_fun = | 20884 v8::Handle<v8::FunctionTemplate> has_own_property_fun = |
20760 v8::FunctionTemplate::New(HasOwnPropertyCallback); | 20885 v8::FunctionTemplate::New(CcTest::isolate(), HasOwnPropertyCallback); |
20761 context1->Global()->Set(v8_str("has_own_property"), | 20886 context1->Global()->Set(v8_str("has_own_property"), |
20762 has_own_property_fun->GetFunction()); | 20887 has_own_property_fun->GetFunction()); |
20763 | 20888 |
20764 { v8::TryCatch try_catch; | 20889 { v8::TryCatch try_catch; |
20765 access_check_fail_thrown = false; | 20890 access_check_fail_thrown = false; |
20766 CompileRun("other.x;"); | 20891 CompileRun("other.x;"); |
20767 CHECK(access_check_fail_thrown); | 20892 CHECK(access_check_fail_thrown); |
20768 CHECK(try_catch.HasCaught()); | 20893 CHECK(try_catch.HasCaught()); |
20769 } | 20894 } |
20770 | 20895 |
(...skipping 18 matching lines...) Expand all Loading... |
20789 // Reset the failed access check callback so it does not influence | 20914 // Reset the failed access check callback so it does not influence |
20790 // the other tests. | 20915 // the other tests. |
20791 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); | 20916 v8::V8::SetFailedAccessCheckCallbackFunction(NULL); |
20792 } | 20917 } |
20793 | 20918 |
20794 | 20919 |
20795 THREADED_TEST(Regress256330) { | 20920 THREADED_TEST(Regress256330) { |
20796 i::FLAG_allow_natives_syntax = true; | 20921 i::FLAG_allow_natives_syntax = true; |
20797 LocalContext context; | 20922 LocalContext context; |
20798 v8::HandleScope scope(context->GetIsolate()); | 20923 v8::HandleScope scope(context->GetIsolate()); |
20799 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 20924 Handle<FunctionTemplate> templ = FunctionTemplate::New(context->GetIsolate()); |
20800 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); | 20925 AddInterceptor(templ, EmptyInterceptorGetter, EmptyInterceptorSetter); |
20801 context->Global()->Set(v8_str("Bug"), templ->GetFunction()); | 20926 context->Global()->Set(v8_str("Bug"), templ->GetFunction()); |
20802 CompileRun("\"use strict\"; var o = new Bug;" | 20927 CompileRun("\"use strict\"; var o = new Bug;" |
20803 "function f(o) { o.x = 10; };" | 20928 "function f(o) { o.x = 10; };" |
20804 "f(o); f(o); f(o);" | 20929 "f(o); f(o); f(o);" |
20805 "%OptimizeFunctionOnNextCall(f);" | 20930 "%OptimizeFunctionOnNextCall(f);" |
20806 "f(o);"); | 20931 "f(o);"); |
20807 ExpectBoolean("%GetOptimizationStatus(f) != 2", true); | 20932 ExpectBoolean("%GetOptimizationStatus(f) != 2", true); |
20808 } | 20933 } |
20809 | 20934 |
20810 | 20935 |
20811 THREADED_TEST(CrankshaftInterceptorSetter) { | 20936 THREADED_TEST(CrankshaftInterceptorSetter) { |
20812 i::FLAG_allow_natives_syntax = true; | 20937 i::FLAG_allow_natives_syntax = true; |
20813 v8::HandleScope scope(CcTest::isolate()); | 20938 v8::HandleScope scope(CcTest::isolate()); |
20814 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 20939 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
20815 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 20940 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
20816 LocalContext env; | 20941 LocalContext env; |
20817 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 20942 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
20818 CompileRun("var obj = new Obj;" | 20943 CompileRun("var obj = new Obj;" |
20819 // Initialize fields to avoid transitions later. | 20944 // Initialize fields to avoid transitions later. |
20820 "obj.age = 0;" | 20945 "obj.age = 0;" |
20821 "obj.accessor_age = 42;" | 20946 "obj.accessor_age = 42;" |
20822 "function setter(i) { this.accessor_age = i; };" | 20947 "function setter(i) { this.accessor_age = i; };" |
20823 "function getter() { return this.accessor_age; };" | 20948 "function getter() { return this.accessor_age; };" |
20824 "function setAge(i) { obj.age = i; };" | 20949 "function setAge(i) { obj.age = i; };" |
20825 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" | 20950 "Object.defineProperty(obj, 'age', { get:getter, set:setter });" |
20826 "setAge(1);" | 20951 "setAge(1);" |
20827 "setAge(2);" | 20952 "setAge(2);" |
20828 "setAge(3);" | 20953 "setAge(3);" |
20829 "%OptimizeFunctionOnNextCall(setAge);" | 20954 "%OptimizeFunctionOnNextCall(setAge);" |
20830 "setAge(4);"); | 20955 "setAge(4);"); |
20831 // All stores went through the interceptor. | 20956 // All stores went through the interceptor. |
20832 ExpectInt32("obj.interceptor_age", 4); | 20957 ExpectInt32("obj.interceptor_age", 4); |
20833 ExpectInt32("obj.accessor_age", 42); | 20958 ExpectInt32("obj.accessor_age", 42); |
20834 } | 20959 } |
20835 | 20960 |
20836 | 20961 |
20837 THREADED_TEST(CrankshaftInterceptorGetter) { | 20962 THREADED_TEST(CrankshaftInterceptorGetter) { |
20838 i::FLAG_allow_natives_syntax = true; | 20963 i::FLAG_allow_natives_syntax = true; |
20839 v8::HandleScope scope(CcTest::isolate()); | 20964 v8::HandleScope scope(CcTest::isolate()); |
20840 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 20965 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
20841 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 20966 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
20842 LocalContext env; | 20967 LocalContext env; |
20843 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 20968 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
20844 CompileRun("var obj = new Obj;" | 20969 CompileRun("var obj = new Obj;" |
20845 // Initialize fields to avoid transitions later. | 20970 // Initialize fields to avoid transitions later. |
20846 "obj.age = 1;" | 20971 "obj.age = 1;" |
20847 "obj.accessor_age = 42;" | 20972 "obj.accessor_age = 42;" |
20848 "function getter() { return this.accessor_age; };" | 20973 "function getter() { return this.accessor_age; };" |
20849 "function getAge() { return obj.interceptor_age; };" | 20974 "function getAge() { return obj.interceptor_age; };" |
20850 "Object.defineProperty(obj, 'interceptor_age', { get:getter });" | 20975 "Object.defineProperty(obj, 'interceptor_age', { get:getter });" |
20851 "getAge();" | 20976 "getAge();" |
20852 "getAge();" | 20977 "getAge();" |
20853 "getAge();" | 20978 "getAge();" |
20854 "%OptimizeFunctionOnNextCall(getAge);"); | 20979 "%OptimizeFunctionOnNextCall(getAge);"); |
20855 // Access through interceptor. | 20980 // Access through interceptor. |
20856 ExpectInt32("getAge()", 1); | 20981 ExpectInt32("getAge()", 1); |
20857 } | 20982 } |
20858 | 20983 |
20859 | 20984 |
20860 THREADED_TEST(CrankshaftInterceptorFieldRead) { | 20985 THREADED_TEST(CrankshaftInterceptorFieldRead) { |
20861 i::FLAG_allow_natives_syntax = true; | 20986 i::FLAG_allow_natives_syntax = true; |
20862 v8::HandleScope scope(CcTest::isolate()); | 20987 v8::HandleScope scope(CcTest::isolate()); |
20863 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 20988 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
20864 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 20989 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
20865 LocalContext env; | 20990 LocalContext env; |
20866 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 20991 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
20867 CompileRun("var obj = new Obj;" | 20992 CompileRun("var obj = new Obj;" |
20868 "obj.__proto__.interceptor_age = 42;" | 20993 "obj.__proto__.interceptor_age = 42;" |
20869 "obj.age = 100;" | 20994 "obj.age = 100;" |
20870 "function getAge() { return obj.interceptor_age; };"); | 20995 "function getAge() { return obj.interceptor_age; };"); |
20871 ExpectInt32("getAge();", 100); | 20996 ExpectInt32("getAge();", 100); |
20872 ExpectInt32("getAge();", 100); | 20997 ExpectInt32("getAge();", 100); |
20873 ExpectInt32("getAge();", 100); | 20998 ExpectInt32("getAge();", 100); |
20874 CompileRun("%OptimizeFunctionOnNextCall(getAge);"); | 20999 CompileRun("%OptimizeFunctionOnNextCall(getAge);"); |
20875 // Access through interceptor. | 21000 // Access through interceptor. |
20876 ExpectInt32("getAge();", 100); | 21001 ExpectInt32("getAge();", 100); |
20877 } | 21002 } |
20878 | 21003 |
20879 | 21004 |
20880 THREADED_TEST(CrankshaftInterceptorFieldWrite) { | 21005 THREADED_TEST(CrankshaftInterceptorFieldWrite) { |
20881 i::FLAG_allow_natives_syntax = true; | 21006 i::FLAG_allow_natives_syntax = true; |
20882 v8::HandleScope scope(CcTest::isolate()); | 21007 v8::HandleScope scope(CcTest::isolate()); |
20883 Handle<FunctionTemplate> templ = FunctionTemplate::New(); | 21008 Handle<FunctionTemplate> templ = FunctionTemplate::New(CcTest::isolate()); |
20884 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); | 21009 AddInterceptor(templ, InterceptorGetter, InterceptorSetter); |
20885 LocalContext env; | 21010 LocalContext env; |
20886 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); | 21011 env->Global()->Set(v8_str("Obj"), templ->GetFunction()); |
20887 CompileRun("var obj = new Obj;" | 21012 CompileRun("var obj = new Obj;" |
20888 "obj.age = 100000;" | 21013 "obj.age = 100000;" |
20889 "function setAge(i) { obj.age = i };" | 21014 "function setAge(i) { obj.age = i };" |
20890 "setAge(100);" | 21015 "setAge(100);" |
20891 "setAge(101);" | 21016 "setAge(101);" |
20892 "setAge(102);" | 21017 "setAge(102);" |
20893 "%OptimizeFunctionOnNextCall(setAge);" | 21018 "%OptimizeFunctionOnNextCall(setAge);" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20950 } | 21075 } |
20951 for (int i = 0; i < runs; i++) { | 21076 for (int i = 0; i < runs; i++) { |
20952 Local<String> expected; | 21077 Local<String> expected; |
20953 if (i != 0) { | 21078 if (i != 0) { |
20954 CHECK_EQ(v8_str("escape value"), values[i]); | 21079 CHECK_EQ(v8_str("escape value"), values[i]); |
20955 } else { | 21080 } else { |
20956 CHECK(values[i].IsEmpty()); | 21081 CHECK(values[i].IsEmpty()); |
20957 } | 21082 } |
20958 } | 21083 } |
20959 } | 21084 } |
OLD | NEW |