| 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 789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 800 v8::HandleScope scope(env->GetIsolate()); | 800 v8::HandleScope scope(env->GetIsolate()); |
| 801 v8::Handle<v8::Object> global = env->Global(); | 801 v8::Handle<v8::Object> global = env->Global(); |
| 802 global->Set(v8_str("pi"), v8_num(3.1415926)); | 802 global->Set(v8_str("pi"), v8_num(3.1415926)); |
| 803 Local<Value> pi = global->Get(v8_str("pi")); | 803 Local<Value> pi = global->Get(v8_str("pi")); |
| 804 CHECK_EQ(3.1415926, pi->NumberValue()); | 804 CHECK_EQ(3.1415926, pi->NumberValue()); |
| 805 } | 805 } |
| 806 | 806 |
| 807 | 807 |
| 808 static v8::Handle<Value> handle_call(const v8::Arguments& args) { | 808 static v8::Handle<Value> handle_call(const v8::Arguments& args) { |
| 809 ApiTestFuzzer::Fuzz(); | 809 ApiTestFuzzer::Fuzz(); |
| 810 args.GetReturnValue().Set(v8_str("bad value")); |
| 810 return v8_num(102); | 811 return v8_num(102); |
| 811 } | 812 } |
| 812 | 813 |
| 814 static v8::Handle<Value> handle_call_indirect(const v8::Arguments& args) { |
| 815 ApiTestFuzzer::Fuzz(); |
| 816 args.GetReturnValue().Set(v8_str("bad value")); |
| 817 args.GetReturnValue().Set(v8_num(102)); |
| 818 return v8::Handle<Value>(); |
| 819 } |
| 820 |
| 821 static void handle_callback(const v8::FunctionCallbackInfo<Value>& info) { |
| 822 ApiTestFuzzer::Fuzz(); |
| 823 info.GetReturnValue().Set(v8_str("bad value")); |
| 824 info.GetReturnValue().Set(v8_num(102)); |
| 825 } |
| 826 |
| 813 | 827 |
| 814 static v8::Handle<Value> construct_call(const v8::Arguments& args) { | 828 static v8::Handle<Value> construct_call(const v8::Arguments& args) { |
| 815 ApiTestFuzzer::Fuzz(); | 829 ApiTestFuzzer::Fuzz(); |
| 816 args.This()->Set(v8_str("x"), v8_num(1)); | 830 args.This()->Set(v8_str("x"), v8_num(1)); |
| 817 args.This()->Set(v8_str("y"), v8_num(2)); | 831 args.This()->Set(v8_str("y"), v8_num(2)); |
| 832 args.GetReturnValue().Set(v8_str("bad value")); |
| 818 return args.This(); | 833 return args.This(); |
| 819 } | 834 } |
| 820 | 835 |
| 821 static v8::Handle<Value> Return239(Local<String> name, const AccessorInfo&) { | 836 static v8::Handle<Value> construct_call_indirect(const v8::Arguments& args) { |
| 822 ApiTestFuzzer::Fuzz(); | 837 ApiTestFuzzer::Fuzz(); |
| 838 args.This()->Set(v8_str("x"), v8_num(1)); |
| 839 args.This()->Set(v8_str("y"), v8_num(2)); |
| 840 args.GetReturnValue().Set(v8_str("bad value")); |
| 841 args.GetReturnValue().Set(args.This()); |
| 842 return v8::Handle<Value>(); |
| 843 } |
| 844 |
| 845 static void construct_callback( |
| 846 const v8::FunctionCallbackInfo<Value>& info) { |
| 847 ApiTestFuzzer::Fuzz(); |
| 848 info.This()->Set(v8_str("x"), v8_num(1)); |
| 849 info.This()->Set(v8_str("y"), v8_num(2)); |
| 850 info.GetReturnValue().Set(v8_str("bad value")); |
| 851 info.GetReturnValue().Set(info.This()); |
| 852 } |
| 853 |
| 854 |
| 855 static v8::Handle<Value> Return239( |
| 856 Local<String> name, const AccessorInfo& info) { |
| 857 ApiTestFuzzer::Fuzz(); |
| 858 info.GetReturnValue().Set(v8_str("bad value")); |
| 823 return v8_num(239); | 859 return v8_num(239); |
| 824 } | 860 } |
| 825 | 861 |
| 862 static v8::Handle<Value> Return239Indirect( |
| 863 Local<String> name, const AccessorInfo& info) { |
| 864 ApiTestFuzzer::Fuzz(); |
| 865 Handle<Value> value = v8_num(239); |
| 866 info.GetReturnValue().Set(v8_str("bad value")); |
| 867 info.GetReturnValue().Set(value); |
| 868 return v8::Handle<Value>(); |
| 869 } |
| 826 | 870 |
| 827 THREADED_TEST(FunctionTemplate) { | 871 static void Return239Callback( |
| 828 LocalContext env; | 872 Local<String> name, const v8::PropertyCallbackInfo<Value>& info) { |
| 829 v8::HandleScope scope(env->GetIsolate()); | 873 ApiTestFuzzer::Fuzz(); |
| 874 info.GetReturnValue().Set(v8_str("bad value")); |
| 875 info.GetReturnValue().Set(v8_num(239)); |
| 876 } |
| 877 |
| 878 |
| 879 template<typename Handler> |
| 880 static void TestFunctionTemplateInitializer(LocalContext* env, |
| 881 Handler handler) { |
| 882 // Test constructor calls. |
| 830 { | 883 { |
| 831 Local<v8::FunctionTemplate> fun_templ = | 884 Local<v8::FunctionTemplate> fun_templ = |
| 832 v8::FunctionTemplate::New(handle_call); | 885 v8::FunctionTemplate::New(handler); |
| 833 Local<Function> fun = fun_templ->GetFunction(); | 886 Local<Function> fun = fun_templ->GetFunction(); |
| 834 env->Global()->Set(v8_str("obj"), fun); | 887 (*env)->Global()->Set(v8_str("obj"), fun); |
| 835 Local<Script> script = v8_compile("obj()"); | 888 Local<Script> script = v8_compile("obj()"); |
| 836 CHECK_EQ(102, script->Run()->Int32Value()); | 889 CHECK_EQ(102, script->Run()->Int32Value()); |
| 837 } | 890 } |
| 838 // Use SetCallHandler to initialize a function template, should work like the | 891 // Use SetCallHandler to initialize a function template, should work like the |
| 839 // previous one. | 892 // previous one. |
| 840 { | 893 { |
| 841 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); | 894 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New(); |
| 842 fun_templ->SetCallHandler(handle_call); | 895 fun_templ->SetCallHandler(handler); |
| 843 Local<Function> fun = fun_templ->GetFunction(); | 896 Local<Function> fun = fun_templ->GetFunction(); |
| 844 env->Global()->Set(v8_str("obj"), fun); | 897 (*env)->Global()->Set(v8_str("obj"), fun); |
| 845 Local<Script> script = v8_compile("obj()"); | 898 Local<Script> script = v8_compile("obj()"); |
| 846 CHECK_EQ(102, script->Run()->Int32Value()); | 899 CHECK_EQ(102, script->Run()->Int32Value()); |
| 847 } | 900 } |
| 848 // Test constructor calls. | |
| 849 { | |
| 850 Local<v8::FunctionTemplate> fun_templ = | |
| 851 v8::FunctionTemplate::New(construct_call); | |
| 852 fun_templ->SetClassName(v8_str("funky")); | |
| 853 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), Return239); | |
| 854 Local<Function> fun = fun_templ->GetFunction(); | |
| 855 env->Global()->Set(v8_str("obj"), fun); | |
| 856 Local<Script> script = v8_compile("var s = new obj(); s.x"); | |
| 857 CHECK_EQ(1, script->Run()->Int32Value()); | |
| 858 | |
| 859 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); | |
| 860 CHECK_EQ(v8_str("[object funky]"), result); | |
| 861 | |
| 862 result = v8_compile("(new obj()).m")->Run(); | |
| 863 CHECK_EQ(239, result->Int32Value()); | |
| 864 } | |
| 865 } | 901 } |
| 866 | 902 |
| 867 | 903 |
| 904 template<typename Constructor, typename Accessor> |
| 905 static void TestFunctionTemplateAccessor(LocalContext* env, |
| 906 Constructor constructor, |
| 907 Accessor accessor) { |
| 908 Local<v8::FunctionTemplate> fun_templ = |
| 909 v8::FunctionTemplate::New(construct_call); |
| 910 fun_templ->SetClassName(v8_str("funky")); |
| 911 fun_templ->InstanceTemplate()->SetAccessor(v8_str("m"), accessor); |
| 912 Local<Function> fun = fun_templ->GetFunction(); |
| 913 (*env)->Global()->Set(v8_str("obj"), fun); |
| 914 Local<Script> script = v8_compile("var s = new obj(); s.x"); |
| 915 CHECK_EQ(1, script->Run()->Int32Value()); |
| 916 Local<Value> result = v8_compile("(new obj()).toString()")->Run(); |
| 917 CHECK_EQ(v8_str("[object funky]"), result); |
| 918 result = v8_compile("(new obj()).m")->Run(); |
| 919 CHECK_EQ(239, result->Int32Value()); |
| 920 } |
| 921 |
| 922 |
| 923 THREADED_TEST(FunctionTemplate) { |
| 924 LocalContext env; |
| 925 v8::HandleScope scope(env->GetIsolate()); |
| 926 |
| 927 TestFunctionTemplateInitializer(&env, handle_call); |
| 928 TestFunctionTemplateInitializer(&env, handle_call_indirect); |
| 929 TestFunctionTemplateInitializer(&env, handle_callback); |
| 930 |
| 931 TestFunctionTemplateAccessor(&env, construct_call, Return239); |
| 932 TestFunctionTemplateAccessor(&env, |
| 933 construct_call_indirect, |
| 934 Return239Indirect); |
| 935 TestFunctionTemplateAccessor(&env, construct_callback, Return239Callback); |
| 936 } |
| 937 |
| 938 |
| 868 THREADED_TEST(FunctionTemplateSetLength) { | 939 THREADED_TEST(FunctionTemplateSetLength) { |
| 869 LocalContext env; | 940 LocalContext env; |
| 870 v8::HandleScope scope(env->GetIsolate()); | 941 v8::HandleScope scope(env->GetIsolate()); |
| 871 { | 942 { |
| 872 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New( | 943 Local<v8::FunctionTemplate> fun_templ = v8::FunctionTemplate::New( |
| 873 handle_call, Handle<v8::Value>(), Handle<v8::Signature>(), 23); | 944 handle_call, Handle<v8::Value>(), Handle<v8::Signature>(), 23); |
| 874 Local<Function> fun = fun_templ->GetFunction(); | 945 Local<Function> fun = fun_templ->GetFunction(); |
| 875 env->Global()->Set(v8_str("obj"), fun); | 946 env->Global()->Set(v8_str("obj"), fun); |
| 876 Local<Script> script = v8_compile("obj.length"); | 947 Local<Script> script = v8_compile("obj.length"); |
| 877 CHECK_EQ(23, script->Run()->Int32Value()); | 948 CHECK_EQ(23, script->Run()->Int32Value()); |
| (...skipping 3764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4642 CHECK_EQ(v8_num(4), Handle<Value>(*xValue)); | 4713 CHECK_EQ(v8_num(4), Handle<Value>(*xValue)); |
| 4643 xValue.Dispose(context->GetIsolate()); | 4714 xValue.Dispose(context->GetIsolate()); |
| 4644 xValue = v8::Persistent<Value>(); | 4715 xValue = v8::Persistent<Value>(); |
| 4645 } | 4716 } |
| 4646 } | 4717 } |
| 4647 | 4718 |
| 4648 | 4719 |
| 4649 THREADED_TEST(NoAccessors) { | 4720 THREADED_TEST(NoAccessors) { |
| 4650 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 4721 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 4651 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4722 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
| 4652 templ->SetAccessor(v8_str("x"), NULL, NULL, v8_str("donut")); | 4723 templ->SetAccessor(v8_str("x"), |
| 4724 static_cast<v8::AccessorGetter>(NULL), |
| 4725 NULL, |
| 4726 v8_str("donut")); |
| 4653 LocalContext context; | 4727 LocalContext context; |
| 4654 context->Global()->Set(v8_str("obj"), templ->NewInstance()); | 4728 context->Global()->Set(v8_str("obj"), templ->NewInstance()); |
| 4655 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); | 4729 Local<Script> script = Script::Compile(v8_str("obj.x = 4; obj.x")); |
| 4656 for (int i = 0; i < 10; i++) { | 4730 for (int i = 0; i < 10; i++) { |
| 4657 script->Run(); | 4731 script->Run(); |
| 4658 } | 4732 } |
| 4659 } | 4733 } |
| 4660 | 4734 |
| 4661 | 4735 |
| 4662 static v8::Handle<Value> XPropertyGetter(Local<String> property, | 4736 static v8::Handle<Value> XPropertyGetter(Local<String> property, |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5301 LocalContext env1; | 5375 LocalContext env1; |
| 5302 Local<Script> script1 = Script::Compile(source); | 5376 Local<Script> script1 = Script::Compile(source); |
| 5303 CHECK_EQ(8901.0, script1->Run()->NumberValue()); | 5377 CHECK_EQ(8901.0, script1->Run()->NumberValue()); |
| 5304 } | 5378 } |
| 5305 | 5379 |
| 5306 | 5380 |
| 5307 THREADED_TEST(UndetectableObject) { | 5381 THREADED_TEST(UndetectableObject) { |
| 5308 LocalContext env; | 5382 LocalContext env; |
| 5309 v8::HandleScope scope(env->GetIsolate()); | 5383 v8::HandleScope scope(env->GetIsolate()); |
| 5310 | 5384 |
| 5311 Local<v8::FunctionTemplate> desc = | 5385 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); |
| 5312 v8::FunctionTemplate::New(0, v8::Handle<Value>()); | |
| 5313 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 5386 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
| 5314 | 5387 |
| 5315 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 5388 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
| 5316 env->Global()->Set(v8_str("undetectable"), obj); | 5389 env->Global()->Set(v8_str("undetectable"), obj); |
| 5317 | 5390 |
| 5318 ExpectString("undetectable.toString()", "[object Object]"); | 5391 ExpectString("undetectable.toString()", "[object Object]"); |
| 5319 ExpectString("typeof undetectable", "undefined"); | 5392 ExpectString("typeof undetectable", "undefined"); |
| 5320 ExpectString("typeof(undetectable)", "undefined"); | 5393 ExpectString("typeof(undetectable)", "undefined"); |
| 5321 ExpectBoolean("typeof undetectable == 'undefined'", true); | 5394 ExpectBoolean("typeof undetectable == 'undefined'", true); |
| 5322 ExpectBoolean("typeof undetectable == 'object'", false); | 5395 ExpectBoolean("typeof undetectable == 'object'", false); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5345 ExpectBoolean("undetectable===undefined", false); | 5418 ExpectBoolean("undetectable===undefined", false); |
| 5346 ExpectBoolean("undefined===undetectable", false); | 5419 ExpectBoolean("undefined===undetectable", false); |
| 5347 ExpectBoolean("undetectable===undetectable", true); | 5420 ExpectBoolean("undetectable===undetectable", true); |
| 5348 } | 5421 } |
| 5349 | 5422 |
| 5350 | 5423 |
| 5351 THREADED_TEST(VoidLiteral) { | 5424 THREADED_TEST(VoidLiteral) { |
| 5352 LocalContext env; | 5425 LocalContext env; |
| 5353 v8::HandleScope scope(env->GetIsolate()); | 5426 v8::HandleScope scope(env->GetIsolate()); |
| 5354 | 5427 |
| 5355 Local<v8::FunctionTemplate> desc = | 5428 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); |
| 5356 v8::FunctionTemplate::New(0, v8::Handle<Value>()); | |
| 5357 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 5429 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
| 5358 | 5430 |
| 5359 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 5431 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
| 5360 env->Global()->Set(v8_str("undetectable"), obj); | 5432 env->Global()->Set(v8_str("undetectable"), obj); |
| 5361 | 5433 |
| 5362 ExpectBoolean("undefined == void 0", true); | 5434 ExpectBoolean("undefined == void 0", true); |
| 5363 ExpectBoolean("undetectable == void 0", true); | 5435 ExpectBoolean("undetectable == void 0", true); |
| 5364 ExpectBoolean("null == void 0", true); | 5436 ExpectBoolean("null == void 0", true); |
| 5365 ExpectBoolean("undefined === void 0", true); | 5437 ExpectBoolean("undefined === void 0", true); |
| 5366 ExpectBoolean("undetectable === void 0", false); | 5438 ExpectBoolean("undetectable === void 0", false); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5389 " }" | 5461 " }" |
| 5390 "})()", | 5462 "})()", |
| 5391 "ReferenceError: x is not defined"); | 5463 "ReferenceError: x is not defined"); |
| 5392 } | 5464 } |
| 5393 | 5465 |
| 5394 | 5466 |
| 5395 THREADED_TEST(ExtensibleOnUndetectable) { | 5467 THREADED_TEST(ExtensibleOnUndetectable) { |
| 5396 LocalContext env; | 5468 LocalContext env; |
| 5397 v8::HandleScope scope(env->GetIsolate()); | 5469 v8::HandleScope scope(env->GetIsolate()); |
| 5398 | 5470 |
| 5399 Local<v8::FunctionTemplate> desc = | 5471 Local<v8::FunctionTemplate> desc = v8::FunctionTemplate::New(); |
| 5400 v8::FunctionTemplate::New(0, v8::Handle<Value>()); | |
| 5401 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable | 5472 desc->InstanceTemplate()->MarkAsUndetectable(); // undetectable |
| 5402 | 5473 |
| 5403 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); | 5474 Local<v8::Object> obj = desc->GetFunction()->NewInstance(); |
| 5404 env->Global()->Set(v8_str("undetectable"), obj); | 5475 env->Global()->Set(v8_str("undetectable"), obj); |
| 5405 | 5476 |
| 5406 Local<String> source = v8_str("undetectable.x = 42;" | 5477 Local<String> source = v8_str("undetectable.x = 42;" |
| 5407 "undetectable.x"); | 5478 "undetectable.x"); |
| 5408 | 5479 |
| 5409 Local<Script> script = Script::Compile(source); | 5480 Local<Script> script = Script::Compile(source); |
| 5410 | 5481 |
| (...skipping 5079 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10490 "function f() {" | 10561 "function f() {" |
| 10491 " for (var i = 1; i <= 5; i++) {" | 10562 " for (var i = 1; i <= 5; i++) {" |
| 10492 " try { nativeobject.callback(); } catch (e) { result += e; }" | 10563 " try { nativeobject.callback(); } catch (e) { result += e; }" |
| 10493 " }" | 10564 " }" |
| 10494 "}" | 10565 "}" |
| 10495 "f(); result;"); | 10566 "f(); result;"); |
| 10496 CHECK_EQ(v8_str("ggggg"), result); | 10567 CHECK_EQ(v8_str("ggggg"), result); |
| 10497 } | 10568 } |
| 10498 | 10569 |
| 10499 | 10570 |
| 10500 v8::Handle<v8::Value> DirectGetterCallback(Local<String> name, | 10571 static Handle<Value> DoDirectGetter() { |
| 10501 const v8::AccessorInfo& info) { | |
| 10502 if (++p_getter_count % 3 == 0) { | 10572 if (++p_getter_count % 3 == 0) { |
| 10503 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); | 10573 HEAP->CollectAllGarbage(i::Heap::kAbortIncrementalMarkingMask); |
| 10504 GenerateSomeGarbage(); | 10574 GenerateSomeGarbage(); |
| 10505 } | 10575 } |
| 10576 return v8_str("Direct Getter Result"); |
| 10577 } |
| 10578 |
| 10579 static void CheckReturnValue(v8::ReturnValue<v8::Value> rv) { |
| 10580 i::Object** o = *reinterpret_cast<i::Object***>(&rv); |
| 10581 CHECK((*o)->IsTheHole() || (*o)->IsUndefined()); |
| 10582 } |
| 10583 |
| 10584 static v8::Handle<v8::Value> DirectGetter(Local<String> name, |
| 10585 const v8::AccessorInfo& info) { |
| 10586 CheckReturnValue(info.GetReturnValue()); |
| 10587 info.GetReturnValue().Set(v8_str("Garbage")); |
| 10588 return DoDirectGetter(); |
| 10589 } |
| 10590 |
| 10591 static v8::Handle<v8::Value> DirectGetterIndirect( |
| 10592 Local<String> name, |
| 10593 const v8::AccessorInfo& info) { |
| 10594 CheckReturnValue(info.GetReturnValue()); |
| 10595 info.GetReturnValue().Set(DoDirectGetter()); |
| 10506 return v8::Handle<v8::Value>(); | 10596 return v8::Handle<v8::Value>(); |
| 10507 } | 10597 } |
| 10508 | 10598 |
| 10599 static void DirectGetterCallback( |
| 10600 Local<String> name, |
| 10601 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 10602 CheckReturnValue(info.GetReturnValue()); |
| 10603 info.GetReturnValue().Set(DoDirectGetter()); |
| 10604 } |
| 10509 | 10605 |
| 10510 THREADED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { | 10606 |
| 10607 template<typename Accessor> |
| 10608 static void LoadICFastApi_DirectCall_GCMoveStub(Accessor accessor) { |
| 10511 LocalContext context; | 10609 LocalContext context; |
| 10512 v8::HandleScope scope(context->GetIsolate()); | 10610 v8::HandleScope scope(context->GetIsolate()); |
| 10513 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(); | 10611 v8::Handle<v8::ObjectTemplate> obj = v8::ObjectTemplate::New(); |
| 10514 obj->SetAccessor(v8_str("p1"), DirectGetterCallback); | 10612 obj->SetAccessor(v8_str("p1"), accessor); |
| 10515 context->Global()->Set(v8_str("o1"), obj->NewInstance()); | 10613 context->Global()->Set(v8_str("o1"), obj->NewInstance()); |
| 10516 p_getter_count = 0; | 10614 p_getter_count = 0; |
| 10517 CompileRun( | 10615 v8::Handle<v8::Value> result = CompileRun( |
| 10518 "function f() {" | 10616 "function f() {" |
| 10519 " for (var i = 0; i < 30; i++) o1.p1;" | 10617 " for (var i = 0; i < 30; i++) o1.p1;" |
| 10618 " return o1.p1" |
| 10520 "}" | 10619 "}" |
| 10521 "f();"); | 10620 "f();"); |
| 10522 CHECK_EQ(30, p_getter_count); | 10621 CHECK_EQ(v8_str("Direct Getter Result"), result); |
| 10622 CHECK_EQ(31, p_getter_count); |
| 10623 } |
| 10624 |
| 10625 THREADED_TEST(LoadICFastApi_DirectCall_GCMoveStub) { |
| 10626 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterIndirect); |
| 10627 LoadICFastApi_DirectCall_GCMoveStub(DirectGetterCallback); |
| 10628 LoadICFastApi_DirectCall_GCMoveStub(DirectGetter); |
| 10523 } | 10629 } |
| 10524 | 10630 |
| 10525 | 10631 |
| 10526 v8::Handle<v8::Value> ThrowingDirectGetterCallback( | 10632 v8::Handle<v8::Value> ThrowingDirectGetterCallback( |
| 10527 Local<String> name, const v8::AccessorInfo& info) { | 10633 Local<String> name, const v8::AccessorInfo& info) { |
| 10528 return v8::ThrowException(v8_str("g")); | 10634 return v8::ThrowException(v8_str("g")); |
| 10529 } | 10635 } |
| 10530 | 10636 |
| 10531 | 10637 |
| 10532 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { | 10638 THREADED_TEST(LoadICFastApi_DirectCall_Throw) { |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11191 "};" | 11297 "};" |
| 11192 "f();"); | 11298 "f();"); |
| 11193 CHECK_EQ(true, value->BooleanValue()); | 11299 CHECK_EQ(true, value->BooleanValue()); |
| 11194 } | 11300 } |
| 11195 | 11301 |
| 11196 | 11302 |
| 11197 // Test that we ignore null interceptors. | 11303 // Test that we ignore null interceptors. |
| 11198 THREADED_TEST(NullNamedInterceptor) { | 11304 THREADED_TEST(NullNamedInterceptor) { |
| 11199 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 11305 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 11200 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); | 11306 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
| 11201 templ->SetNamedPropertyHandler(0); | 11307 templ->SetNamedPropertyHandler(static_cast<v8::NamedPropertyGetter>(0)); |
| 11202 LocalContext context; | 11308 LocalContext context; |
| 11203 templ->Set("x", v8_num(42)); | 11309 templ->Set("x", v8_num(42)); |
| 11204 v8::Handle<v8::Object> obj = templ->NewInstance(); | 11310 v8::Handle<v8::Object> obj = templ->NewInstance(); |
| 11205 context->Global()->Set(v8_str("obj"), obj); | 11311 context->Global()->Set(v8_str("obj"), obj); |
| 11206 v8::Handle<Value> value = CompileRun("obj.x"); | 11312 v8::Handle<Value> value = CompileRun("obj.x"); |
| 11207 CHECK(value->IsInt32()); | 11313 CHECK(value->IsInt32()); |
| 11208 CHECK_EQ(42, value->Int32Value()); | 11314 CHECK_EQ(42, value->Int32Value()); |
| 11209 } | 11315 } |
| 11210 | 11316 |
| 11211 | 11317 |
| 11212 // Test that we ignore null interceptors. | 11318 // Test that we ignore null interceptors. |
| 11213 THREADED_TEST(NullIndexedInterceptor) { | 11319 THREADED_TEST(NullIndexedInterceptor) { |
| 11214 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 11320 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
| 11215 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); | 11321 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplate::New(); |
| 11216 templ->SetIndexedPropertyHandler(0); | 11322 templ->SetIndexedPropertyHandler(static_cast<v8::IndexedPropertyGetter>(0)); |
| 11217 LocalContext context; | 11323 LocalContext context; |
| 11218 templ->Set("42", v8_num(42)); | 11324 templ->Set("42", v8_num(42)); |
| 11219 v8::Handle<v8::Object> obj = templ->NewInstance(); | 11325 v8::Handle<v8::Object> obj = templ->NewInstance(); |
| 11220 context->Global()->Set(v8_str("obj"), obj); | 11326 context->Global()->Set(v8_str("obj"), obj); |
| 11221 v8::Handle<Value> value = CompileRun("obj[42]"); | 11327 v8::Handle<Value> value = CompileRun("obj[42]"); |
| 11222 CHECK(value->IsInt32()); | 11328 CHECK(value->IsInt32()); |
| 11223 CHECK_EQ(42, value->Int32Value()); | 11329 CHECK_EQ(42, value->Int32Value()); |
| 11224 } | 11330 } |
| 11225 | 11331 |
| 11226 | 11332 |
| (...skipping 7755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18982 i::Semaphore* sem_; | 19088 i::Semaphore* sem_; |
| 18983 volatile int sem_value_; | 19089 volatile int sem_value_; |
| 18984 }; | 19090 }; |
| 18985 | 19091 |
| 18986 | 19092 |
| 18987 THREADED_TEST(SemaphoreInterruption) { | 19093 THREADED_TEST(SemaphoreInterruption) { |
| 18988 ThreadInterruptTest().RunTest(); | 19094 ThreadInterruptTest().RunTest(); |
| 18989 } | 19095 } |
| 18990 | 19096 |
| 18991 #endif // WIN32 | 19097 #endif // WIN32 |
| OLD | NEW |