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 4670 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4681 "for (var i = 0; i < 10; i++) get_x(obj);" | 4681 "for (var i = 0; i < 10; i++) get_x(obj);" |
4682 "interceptor_obj.x = 42;" | 4682 "interceptor_obj.x = 42;" |
4683 "interceptor_obj.y = 10;" | 4683 "interceptor_obj.y = 10;" |
4684 "delete interceptor_obj.y;" | 4684 "delete interceptor_obj.y;" |
4685 "get_x(interceptor_obj)"); | 4685 "get_x(interceptor_obj)"); |
4686 CHECK_EQ(result, v8_str("x")); | 4686 CHECK_EQ(result, v8_str("x")); |
4687 } | 4687 } |
4688 | 4688 |
4689 | 4689 |
4690 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) { | 4690 THREADED_TEST(NamedInterceptorDictionaryICMultipleContext) { |
4691 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 4691 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
4692 | 4692 v8::HandleScope scope(isolate); |
4693 v8::Persistent<Context> context1 = Context::New(); | 4693 v8::Local<Context> context1 = Context::New(isolate); |
4694 | 4694 |
4695 context1->Enter(); | 4695 context1->Enter(); |
4696 Local<ObjectTemplate> templ = ObjectTemplate::New(); | 4696 Local<ObjectTemplate> templ = ObjectTemplate::New(); |
4697 templ->SetNamedPropertyHandler(XPropertyGetter); | 4697 templ->SetNamedPropertyHandler(XPropertyGetter); |
4698 // Create an object with a named interceptor. | 4698 // Create an object with a named interceptor. |
4699 v8::Local<v8::Object> object = templ->NewInstance(); | 4699 v8::Local<v8::Object> object = templ->NewInstance(); |
4700 context1->Global()->Set(v8_str("interceptor_obj"), object); | 4700 context1->Global()->Set(v8_str("interceptor_obj"), object); |
4701 | 4701 |
4702 // Force the object into the slow case. | 4702 // Force the object into the slow case. |
4703 CompileRun("interceptor_obj.y = 0;" | 4703 CompileRun("interceptor_obj.y = 0;" |
(...skipping 14 matching lines...) Expand all Loading... |
4718 "get_x(interceptor_obj)"); | 4718 "get_x(interceptor_obj)"); |
4719 // Check that the interceptor was actually invoked. | 4719 // Check that the interceptor was actually invoked. |
4720 CHECK_EQ(result, v8_str("x")); | 4720 CHECK_EQ(result, v8_str("x")); |
4721 } | 4721 } |
4722 | 4722 |
4723 // Return to the original context and force some object to the slow case | 4723 // Return to the original context and force some object to the slow case |
4724 // to cause the NormalizedMapCache to verify. | 4724 // to cause the NormalizedMapCache to verify. |
4725 context1->Enter(); | 4725 context1->Enter(); |
4726 CompileRun("var obj = { x : 0 }; delete obj.x;"); | 4726 CompileRun("var obj = { x : 0 }; delete obj.x;"); |
4727 context1->Exit(); | 4727 context1->Exit(); |
4728 | |
4729 context1.Dispose(context1->GetIsolate()); | |
4730 } | 4728 } |
4731 | 4729 |
4732 | 4730 |
4733 static v8::Handle<Value> SetXOnPrototypeGetter(Local<String> property, | 4731 static v8::Handle<Value> SetXOnPrototypeGetter(Local<String> property, |
4734 const AccessorInfo& info) { | 4732 const AccessorInfo& info) { |
4735 // Set x on the prototype object and do not handle the get request. | 4733 // Set x on the prototype object and do not handle the get request. |
4736 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); | 4734 v8::Handle<v8::Value> proto = info.Holder()->GetPrototype(); |
4737 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); | 4735 proto.As<v8::Object>()->Set(v8_str("x"), v8::Integer::New(23)); |
4738 return v8::Handle<Value>(); | 4736 return v8::Handle<Value>(); |
4739 } | 4737 } |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5494 } | 5492 } |
5495 | 5493 |
5496 | 5494 |
5497 static v8::Handle<Value> HandleLogDelegator(const v8::Arguments& args) { | 5495 static v8::Handle<Value> HandleLogDelegator(const v8::Arguments& args) { |
5498 ApiTestFuzzer::Fuzz(); | 5496 ApiTestFuzzer::Fuzz(); |
5499 return v8::Undefined(); | 5497 return v8::Undefined(); |
5500 } | 5498 } |
5501 | 5499 |
5502 | 5500 |
5503 THREADED_TEST(GlobalObjectTemplate) { | 5501 THREADED_TEST(GlobalObjectTemplate) { |
5504 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 5502 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 5503 v8::HandleScope handle_scope(isolate); |
5505 Local<ObjectTemplate> global_template = ObjectTemplate::New(); | 5504 Local<ObjectTemplate> global_template = ObjectTemplate::New(); |
5506 global_template->Set(v8_str("JSNI_Log"), | 5505 global_template->Set(v8_str("JSNI_Log"), |
5507 v8::FunctionTemplate::New(HandleLogDelegator)); | 5506 v8::FunctionTemplate::New(HandleLogDelegator)); |
5508 v8::Persistent<Context> context = Context::New(0, global_template); | 5507 v8::Local<Context> context = Context::New(isolate, 0, global_template); |
5509 Context::Scope context_scope(v8::Isolate::GetCurrent(), context); | 5508 Context::Scope context_scope(context); |
5510 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); | 5509 Script::Compile(v8_str("JSNI_Log('LOG')"))->Run(); |
5511 context.Dispose(context->GetIsolate()); | |
5512 } | 5510 } |
5513 | 5511 |
5514 | 5512 |
5515 static const char* kSimpleExtensionSource = | 5513 static const char* kSimpleExtensionSource = |
5516 "function Foo() {" | 5514 "function Foo() {" |
5517 " return 4;" | 5515 " return 4;" |
5518 "}"; | 5516 "}"; |
5519 | 5517 |
5520 | 5518 |
5521 THREADED_TEST(SimpleExtensions) { | 5519 THREADED_TEST(SimpleExtensions) { |
(...skipping 2147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7669 } | 7667 } |
7670 | 7668 |
7671 | 7669 |
7672 static void UnreachableSetter(Local<String>, Local<Value>, | 7670 static void UnreachableSetter(Local<String>, Local<Value>, |
7673 const AccessorInfo&) { | 7671 const AccessorInfo&) { |
7674 CHECK(false); // This function should nto be called. | 7672 CHECK(false); // This function should nto be called. |
7675 } | 7673 } |
7676 | 7674 |
7677 | 7675 |
7678 TEST(AccessControl) { | 7676 TEST(AccessControl) { |
7679 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 7677 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 7678 v8::HandleScope handle_scope(isolate); |
7680 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 7679 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
7681 | 7680 |
7682 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, | 7681 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, |
7683 IndexedAccessBlocker); | 7682 IndexedAccessBlocker); |
7684 | 7683 |
7685 // Add an accessor accessible by cross-domain JS code. | 7684 // Add an accessor accessible by cross-domain JS code. |
7686 global_template->SetAccessor( | 7685 global_template->SetAccessor( |
7687 v8_str("accessible_prop"), | 7686 v8_str("accessible_prop"), |
7688 EchoGetter, EchoSetter, | 7687 EchoGetter, EchoSetter, |
7689 v8::Handle<Value>(), | 7688 v8::Handle<Value>(), |
7690 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 7689 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
7691 | 7690 |
7692 // Add an accessor that is not accessible by cross-domain JS code. | 7691 // Add an accessor that is not accessible by cross-domain JS code. |
7693 global_template->SetAccessor(v8_str("blocked_prop"), | 7692 global_template->SetAccessor(v8_str("blocked_prop"), |
7694 UnreachableGetter, UnreachableSetter, | 7693 UnreachableGetter, UnreachableSetter, |
7695 v8::Handle<Value>(), | 7694 v8::Handle<Value>(), |
7696 v8::DEFAULT); | 7695 v8::DEFAULT); |
7697 | 7696 |
7698 // Create an environment | 7697 // Create an environment |
7699 v8::Persistent<Context> context0 = Context::New(NULL, global_template); | 7698 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
7700 context0->Enter(); | 7699 context0->Enter(); |
7701 | 7700 |
7702 v8::Handle<v8::Object> global0 = context0->Global(); | 7701 v8::Handle<v8::Object> global0 = context0->Global(); |
7703 | 7702 |
7704 // Define a property with JS getter and setter. | 7703 // Define a property with JS getter and setter. |
7705 CompileRun( | 7704 CompileRun( |
7706 "function getter() { return 'getter'; };\n" | 7705 "function getter() { return 'getter'; };\n" |
7707 "function setter() { return 'setter'; }\n" | 7706 "function setter() { return 'setter'; }\n" |
7708 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); | 7707 "Object.defineProperty(this, 'js_accessor_p', {get:getter, set:setter})"); |
7709 | 7708 |
7710 Local<Value> getter = global0->Get(v8_str("getter")); | 7709 Local<Value> getter = global0->Get(v8_str("getter")); |
7711 Local<Value> setter = global0->Get(v8_str("setter")); | 7710 Local<Value> setter = global0->Get(v8_str("setter")); |
7712 | 7711 |
7713 // And define normal element. | 7712 // And define normal element. |
7714 global0->Set(239, v8_str("239")); | 7713 global0->Set(239, v8_str("239")); |
7715 | 7714 |
7716 // Define an element with JS getter and setter. | 7715 // Define an element with JS getter and setter. |
7717 CompileRun( | 7716 CompileRun( |
7718 "function el_getter() { return 'el_getter'; };\n" | 7717 "function el_getter() { return 'el_getter'; };\n" |
7719 "function el_setter() { return 'el_setter'; };\n" | 7718 "function el_setter() { return 'el_setter'; };\n" |
7720 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); | 7719 "Object.defineProperty(this, '42', {get: el_getter, set: el_setter});"); |
7721 | 7720 |
7722 Local<Value> el_getter = global0->Get(v8_str("el_getter")); | 7721 Local<Value> el_getter = global0->Get(v8_str("el_getter")); |
7723 Local<Value> el_setter = global0->Get(v8_str("el_setter")); | 7722 Local<Value> el_setter = global0->Get(v8_str("el_setter")); |
7724 | 7723 |
7725 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 7724 v8::HandleScope scope1(isolate); |
7726 | 7725 |
7727 v8::Persistent<Context> context1 = Context::New(); | 7726 v8::Local<Context> context1 = Context::New(isolate); |
7728 context1->Enter(); | 7727 context1->Enter(); |
7729 | 7728 |
7730 v8::Handle<v8::Object> global1 = context1->Global(); | 7729 v8::Handle<v8::Object> global1 = context1->Global(); |
7731 global1->Set(v8_str("other"), global0); | 7730 global1->Set(v8_str("other"), global0); |
7732 | 7731 |
7733 // Access blocked property. | 7732 // Access blocked property. |
7734 CompileRun("other.blocked_prop = 1"); | 7733 CompileRun("other.blocked_prop = 1"); |
7735 | 7734 |
7736 ExpectUndefined("other.blocked_prop"); | 7735 ExpectUndefined("other.blocked_prop"); |
7737 ExpectUndefined( | 7736 ExpectUndefined( |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7907 CompileRun("(function(){var obj = {'__proto__':other};" | 7906 CompileRun("(function(){var obj = {'__proto__':other};" |
7908 "for (var p in obj)" | 7907 "for (var p in obj)" |
7909 " if (p == 'accessible_prop' || p == 'blocked_prop') {" | 7908 " if (p == 'accessible_prop' || p == 'blocked_prop') {" |
7910 " return false;" | 7909 " return false;" |
7911 " }" | 7910 " }" |
7912 "return true;})()"); | 7911 "return true;})()"); |
7913 CHECK(value->IsTrue()); | 7912 CHECK(value->IsTrue()); |
7914 | 7913 |
7915 context1->Exit(); | 7914 context1->Exit(); |
7916 context0->Exit(); | 7915 context0->Exit(); |
7917 context1.Dispose(context1->GetIsolate()); | |
7918 context0.Dispose(context0->GetIsolate()); | |
7919 } | 7916 } |
7920 | 7917 |
7921 | 7918 |
7922 TEST(AccessControlES5) { | 7919 TEST(AccessControlES5) { |
7923 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 7920 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 7921 v8::HandleScope handle_scope(isolate); |
7924 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 7922 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
7925 | 7923 |
7926 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, | 7924 global_template->SetAccessCheckCallbacks(NamedAccessBlocker, |
7927 IndexedAccessBlocker); | 7925 IndexedAccessBlocker); |
7928 | 7926 |
7929 // Add accessible accessor. | 7927 // Add accessible accessor. |
7930 global_template->SetAccessor( | 7928 global_template->SetAccessor( |
7931 v8_str("accessible_prop"), | 7929 v8_str("accessible_prop"), |
7932 EchoGetter, EchoSetter, | 7930 EchoGetter, EchoSetter, |
7933 v8::Handle<Value>(), | 7931 v8::Handle<Value>(), |
7934 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); | 7932 v8::AccessControl(v8::ALL_CAN_READ | v8::ALL_CAN_WRITE)); |
7935 | 7933 |
7936 | 7934 |
7937 // Add an accessor that is not accessible by cross-domain JS code. | 7935 // Add an accessor that is not accessible by cross-domain JS code. |
7938 global_template->SetAccessor(v8_str("blocked_prop"), | 7936 global_template->SetAccessor(v8_str("blocked_prop"), |
7939 UnreachableGetter, UnreachableSetter, | 7937 UnreachableGetter, UnreachableSetter, |
7940 v8::Handle<Value>(), | 7938 v8::Handle<Value>(), |
7941 v8::DEFAULT); | 7939 v8::DEFAULT); |
7942 | 7940 |
7943 // Create an environment | 7941 // Create an environment |
7944 v8::Persistent<Context> context0 = Context::New(NULL, global_template); | 7942 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
7945 context0->Enter(); | 7943 context0->Enter(); |
7946 | 7944 |
7947 v8::Handle<v8::Object> global0 = context0->Global(); | 7945 v8::Handle<v8::Object> global0 = context0->Global(); |
7948 | 7946 |
7949 v8::Persistent<Context> context1 = Context::New(); | 7947 v8::Local<Context> context1 = Context::New(isolate); |
7950 context1->Enter(); | 7948 context1->Enter(); |
7951 v8::Handle<v8::Object> global1 = context1->Global(); | 7949 v8::Handle<v8::Object> global1 = context1->Global(); |
7952 global1->Set(v8_str("other"), global0); | 7950 global1->Set(v8_str("other"), global0); |
7953 | 7951 |
7954 // Regression test for issue 1154. | 7952 // Regression test for issue 1154. |
7955 ExpectTrue("Object.keys(other).indexOf('blocked_prop') == -1"); | 7953 ExpectTrue("Object.keys(other).indexOf('blocked_prop') == -1"); |
7956 | 7954 |
7957 ExpectUndefined("other.blocked_prop"); | 7955 ExpectUndefined("other.blocked_prop"); |
7958 | 7956 |
7959 // Regression test for issue 1027. | 7957 // Regression test for issue 1027. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7999 | 7997 |
8000 static bool GetOwnPropertyNamesIndexedBlocker(Local<v8::Object> global, | 7998 static bool GetOwnPropertyNamesIndexedBlocker(Local<v8::Object> global, |
8001 uint32_t key, | 7999 uint32_t key, |
8002 v8::AccessType type, | 8000 v8::AccessType type, |
8003 Local<Value> data) { | 8001 Local<Value> data) { |
8004 return false; | 8002 return false; |
8005 } | 8003 } |
8006 | 8004 |
8007 | 8005 |
8008 THREADED_TEST(AccessControlGetOwnPropertyNames) { | 8006 THREADED_TEST(AccessControlGetOwnPropertyNames) { |
8009 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 8007 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8008 v8::HandleScope handle_scope(isolate); |
8010 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); | 8009 v8::Handle<v8::ObjectTemplate> obj_template = v8::ObjectTemplate::New(); |
8011 | 8010 |
8012 obj_template->Set(v8_str("x"), v8::Integer::New(42)); | 8011 obj_template->Set(v8_str("x"), v8::Integer::New(42)); |
8013 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker, | 8012 obj_template->SetAccessCheckCallbacks(GetOwnPropertyNamesNamedBlocker, |
8014 GetOwnPropertyNamesIndexedBlocker); | 8013 GetOwnPropertyNamesIndexedBlocker); |
8015 | 8014 |
8016 // Create an environment | 8015 // Create an environment |
8017 v8::Persistent<Context> context0 = Context::New(NULL, obj_template); | 8016 v8::Local<Context> context0 = Context::New(isolate, NULL, obj_template); |
8018 context0->Enter(); | 8017 context0->Enter(); |
8019 | 8018 |
8020 v8::Handle<v8::Object> global0 = context0->Global(); | 8019 v8::Handle<v8::Object> global0 = context0->Global(); |
8021 | 8020 |
8022 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 8021 v8::HandleScope scope1(v8::Isolate::GetCurrent()); |
8023 | 8022 |
8024 v8::Persistent<Context> context1 = Context::New(); | 8023 v8::Local<Context> context1 = Context::New(isolate); |
8025 context1->Enter(); | 8024 context1->Enter(); |
8026 | 8025 |
8027 v8::Handle<v8::Object> global1 = context1->Global(); | 8026 v8::Handle<v8::Object> global1 = context1->Global(); |
8028 global1->Set(v8_str("other"), global0); | 8027 global1->Set(v8_str("other"), global0); |
8029 global1->Set(v8_str("object"), obj_template->NewInstance()); | 8028 global1->Set(v8_str("object"), obj_template->NewInstance()); |
8030 | 8029 |
8031 v8::Handle<Value> value; | 8030 v8::Handle<Value> value; |
8032 | 8031 |
8033 // Attempt to get the property names of the other global object and | 8032 // Attempt to get the property names of the other global object and |
8034 // of an object that requires access checks. Accessing the other | 8033 // of an object that requires access checks. Accessing the other |
8035 // global object should be blocked by access checks on the global | 8034 // global object should be blocked by access checks on the global |
8036 // proxy object. Accessing the object that requires access checks | 8035 // proxy object. Accessing the object that requires access checks |
8037 // is blocked by the access checks on the object itself. | 8036 // is blocked by the access checks on the object itself. |
8038 value = CompileRun("Object.getOwnPropertyNames(other).length == 0"); | 8037 value = CompileRun("Object.getOwnPropertyNames(other).length == 0"); |
8039 CHECK(value->IsTrue()); | 8038 CHECK(value->IsTrue()); |
8040 | 8039 |
8041 value = CompileRun("Object.getOwnPropertyNames(object).length == 0"); | 8040 value = CompileRun("Object.getOwnPropertyNames(object).length == 0"); |
8042 CHECK(value->IsTrue()); | 8041 CHECK(value->IsTrue()); |
8043 | 8042 |
8044 context1->Exit(); | 8043 context1->Exit(); |
8045 context0->Exit(); | 8044 context0->Exit(); |
8046 context1.Dispose(context1->GetIsolate()); | |
8047 context0.Dispose(context0->GetIsolate()); | |
8048 } | 8045 } |
8049 | 8046 |
8050 | 8047 |
8051 static v8::Handle<v8::Array> IndexedPropertyEnumerator(const AccessorInfo&) { | 8048 static v8::Handle<v8::Array> IndexedPropertyEnumerator(const AccessorInfo&) { |
8052 v8::Handle<v8::Array> result = v8::Array::New(2); | 8049 v8::Handle<v8::Array> result = v8::Array::New(2); |
8053 result->Set(0, v8::Integer::New(7)); | 8050 result->Set(0, v8::Integer::New(7)); |
8054 result->Set(1, v8::Object::New()); | 8051 result->Set(1, v8::Object::New()); |
8055 return result; | 8052 return result; |
8056 } | 8053 } |
8057 | 8054 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8093 } | 8090 } |
8094 | 8091 |
8095 | 8092 |
8096 static v8::Handle<Value> ConstTenGetter(Local<String> name, | 8093 static v8::Handle<Value> ConstTenGetter(Local<String> name, |
8097 const AccessorInfo& info) { | 8094 const AccessorInfo& info) { |
8098 return v8_num(10); | 8095 return v8_num(10); |
8099 } | 8096 } |
8100 | 8097 |
8101 | 8098 |
8102 THREADED_TEST(CrossDomainAccessors) { | 8099 THREADED_TEST(CrossDomainAccessors) { |
8103 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 8100 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8101 v8::HandleScope handle_scope(isolate); |
8104 | 8102 |
8105 v8::Handle<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(); | 8103 v8::Handle<v8::FunctionTemplate> func_template = v8::FunctionTemplate::New(); |
8106 | 8104 |
8107 v8::Handle<v8::ObjectTemplate> global_template = | 8105 v8::Handle<v8::ObjectTemplate> global_template = |
8108 func_template->InstanceTemplate(); | 8106 func_template->InstanceTemplate(); |
8109 | 8107 |
8110 v8::Handle<v8::ObjectTemplate> proto_template = | 8108 v8::Handle<v8::ObjectTemplate> proto_template = |
8111 func_template->PrototypeTemplate(); | 8109 func_template->PrototypeTemplate(); |
8112 | 8110 |
8113 // Add an accessor to proto that's accessible by cross-domain JS code. | 8111 // Add an accessor to proto that's accessible by cross-domain JS code. |
8114 proto_template->SetAccessor(v8_str("accessible"), | 8112 proto_template->SetAccessor(v8_str("accessible"), |
8115 ConstTenGetter, 0, | 8113 ConstTenGetter, 0, |
8116 v8::Handle<Value>(), | 8114 v8::Handle<Value>(), |
8117 v8::ALL_CAN_READ); | 8115 v8::ALL_CAN_READ); |
8118 | 8116 |
8119 // Add an accessor that is not accessible by cross-domain JS code. | 8117 // Add an accessor that is not accessible by cross-domain JS code. |
8120 global_template->SetAccessor(v8_str("unreachable"), | 8118 global_template->SetAccessor(v8_str("unreachable"), |
8121 UnreachableGetter, 0, | 8119 UnreachableGetter, 0, |
8122 v8::Handle<Value>(), | 8120 v8::Handle<Value>(), |
8123 v8::DEFAULT); | 8121 v8::DEFAULT); |
8124 | 8122 |
8125 v8::Persistent<Context> context0 = Context::New(NULL, global_template); | 8123 v8::Local<Context> context0 = Context::New(isolate, NULL, global_template); |
8126 context0->Enter(); | 8124 context0->Enter(); |
8127 | 8125 |
8128 Local<v8::Object> global = context0->Global(); | 8126 Local<v8::Object> global = context0->Global(); |
8129 // Add a normal property that shadows 'accessible' | 8127 // Add a normal property that shadows 'accessible' |
8130 global->Set(v8_str("accessible"), v8_num(11)); | 8128 global->Set(v8_str("accessible"), v8_num(11)); |
8131 | 8129 |
8132 // Enter a new context. | 8130 // Enter a new context. |
8133 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 8131 v8::HandleScope scope1(v8::Isolate::GetCurrent()); |
8134 v8::Persistent<Context> context1 = Context::New(); | 8132 v8::Local<Context> context1 = Context::New(isolate); |
8135 context1->Enter(); | 8133 context1->Enter(); |
8136 | 8134 |
8137 v8::Handle<v8::Object> global1 = context1->Global(); | 8135 v8::Handle<v8::Object> global1 = context1->Global(); |
8138 global1->Set(v8_str("other"), global); | 8136 global1->Set(v8_str("other"), global); |
8139 | 8137 |
8140 // Should return 10, instead of 11 | 8138 // Should return 10, instead of 11 |
8141 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); | 8139 v8::Handle<Value> value = v8_compile("other.accessible")->Run(); |
8142 CHECK(value->IsNumber()); | 8140 CHECK(value->IsNumber()); |
8143 CHECK_EQ(10, value->Int32Value()); | 8141 CHECK_EQ(10, value->Int32Value()); |
8144 | 8142 |
8145 value = v8_compile("other.unreachable")->Run(); | 8143 value = v8_compile("other.unreachable")->Run(); |
8146 CHECK(value->IsUndefined()); | 8144 CHECK(value->IsUndefined()); |
8147 | 8145 |
8148 context1->Exit(); | 8146 context1->Exit(); |
8149 context0->Exit(); | 8147 context0->Exit(); |
8150 context1.Dispose(context1->GetIsolate()); | |
8151 context0.Dispose(context0->GetIsolate()); | |
8152 } | 8148 } |
8153 | 8149 |
8154 | 8150 |
8155 static int named_access_count = 0; | 8151 static int named_access_count = 0; |
8156 static int indexed_access_count = 0; | 8152 static int indexed_access_count = 0; |
8157 | 8153 |
8158 static bool NamedAccessCounter(Local<v8::Object> global, | 8154 static bool NamedAccessCounter(Local<v8::Object> global, |
8159 Local<Value> name, | 8155 Local<Value> name, |
8160 v8::AccessType type, | 8156 v8::AccessType type, |
8161 Local<Value> data) { | 8157 Local<Value> data) { |
8162 named_access_count++; | 8158 named_access_count++; |
8163 return true; | 8159 return true; |
8164 } | 8160 } |
8165 | 8161 |
8166 | 8162 |
8167 static bool IndexedAccessCounter(Local<v8::Object> global, | 8163 static bool IndexedAccessCounter(Local<v8::Object> global, |
8168 uint32_t key, | 8164 uint32_t key, |
8169 v8::AccessType type, | 8165 v8::AccessType type, |
8170 Local<Value> data) { | 8166 Local<Value> data) { |
8171 indexed_access_count++; | 8167 indexed_access_count++; |
8172 return true; | 8168 return true; |
8173 } | 8169 } |
8174 | 8170 |
8175 | 8171 |
8176 // This one is too easily disturbed by other tests. | 8172 // This one is too easily disturbed by other tests. |
8177 TEST(AccessControlIC) { | 8173 TEST(AccessControlIC) { |
8178 named_access_count = 0; | 8174 named_access_count = 0; |
8179 indexed_access_count = 0; | 8175 indexed_access_count = 0; |
8180 | 8176 |
8181 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 8177 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8178 v8::HandleScope handle_scope(isolate); |
8182 | 8179 |
8183 // Create an environment. | 8180 // Create an environment. |
8184 v8::Persistent<Context> context0 = Context::New(); | 8181 v8::Local<Context> context0 = Context::New(isolate); |
8185 context0->Enter(); | 8182 context0->Enter(); |
8186 | 8183 |
8187 // Create an object that requires access-check functions to be | 8184 // Create an object that requires access-check functions to be |
8188 // called for cross-domain access. | 8185 // called for cross-domain access. |
8189 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 8186 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
8190 object_template->SetAccessCheckCallbacks(NamedAccessCounter, | 8187 object_template->SetAccessCheckCallbacks(NamedAccessCounter, |
8191 IndexedAccessCounter); | 8188 IndexedAccessCounter); |
8192 Local<v8::Object> object = object_template->NewInstance(); | 8189 Local<v8::Object> object = object_template->NewInstance(); |
8193 | 8190 |
8194 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 8191 v8::HandleScope scope1(isolate); |
8195 | 8192 |
8196 // Create another environment. | 8193 // Create another environment. |
8197 v8::Persistent<Context> context1 = Context::New(); | 8194 v8::Local<Context> context1 = Context::New(isolate); |
8198 context1->Enter(); | 8195 context1->Enter(); |
8199 | 8196 |
8200 // Make easy access to the object from the other environment. | 8197 // Make easy access to the object from the other environment. |
8201 v8::Handle<v8::Object> global1 = context1->Global(); | 8198 v8::Handle<v8::Object> global1 = context1->Global(); |
8202 global1->Set(v8_str("obj"), object); | 8199 global1->Set(v8_str("obj"), object); |
8203 | 8200 |
8204 v8::Handle<Value> value; | 8201 v8::Handle<Value> value; |
8205 | 8202 |
8206 // Check that the named access-control function is called every time. | 8203 // Check that the named access-control function is called every time. |
8207 CompileRun("function testProp(obj) {" | 8204 CompileRun("function testProp(obj) {" |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8275 | 8272 |
8276 // Force the call inline cache into dictionary probing mode. | 8273 // Force the call inline cache into dictionary probing mode. |
8277 CompileRun("o.f = function() {}; testCallNormal(o)"); | 8274 CompileRun("o.f = function() {}; testCallNormal(o)"); |
8278 // Test that the named access check is still called for each | 8275 // Test that the named access check is still called for each |
8279 // invocation of the function. | 8276 // invocation of the function. |
8280 value = CompileRun("testCallNormal(obj)"); | 8277 value = CompileRun("testCallNormal(obj)"); |
8281 CHECK_EQ(106, named_access_count); | 8278 CHECK_EQ(106, named_access_count); |
8282 | 8279 |
8283 context1->Exit(); | 8280 context1->Exit(); |
8284 context0->Exit(); | 8281 context0->Exit(); |
8285 context1.Dispose(context1->GetIsolate()); | |
8286 context0.Dispose(context0->GetIsolate()); | |
8287 } | 8282 } |
8288 | 8283 |
8289 | 8284 |
8290 static bool NamedAccessFlatten(Local<v8::Object> global, | 8285 static bool NamedAccessFlatten(Local<v8::Object> global, |
8291 Local<Value> name, | 8286 Local<Value> name, |
8292 v8::AccessType type, | 8287 v8::AccessType type, |
8293 Local<Value> data) { | 8288 Local<Value> data) { |
8294 char buf[100]; | 8289 char buf[100]; |
8295 int len; | 8290 int len; |
8296 | 8291 |
(...skipping 23 matching lines...) Expand all Loading... |
8320 | 8315 |
8321 // Regression test. In access checks, operations that may cause | 8316 // Regression test. In access checks, operations that may cause |
8322 // garbage collection are not allowed. It used to be the case that | 8317 // garbage collection are not allowed. It used to be the case that |
8323 // using the Write operation on a string could cause a garbage | 8318 // using the Write operation on a string could cause a garbage |
8324 // collection due to flattening of the string. This is no longer the | 8319 // collection due to flattening of the string. This is no longer the |
8325 // case. | 8320 // case. |
8326 THREADED_TEST(AccessControlFlatten) { | 8321 THREADED_TEST(AccessControlFlatten) { |
8327 named_access_count = 0; | 8322 named_access_count = 0; |
8328 indexed_access_count = 0; | 8323 indexed_access_count = 0; |
8329 | 8324 |
8330 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 8325 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8326 v8::HandleScope handle_scope(isolate); |
8331 | 8327 |
8332 // Create an environment. | 8328 // Create an environment. |
8333 v8::Persistent<Context> context0 = Context::New(); | 8329 v8::Local<Context> context0 = Context::New(isolate); |
8334 context0->Enter(); | 8330 context0->Enter(); |
8335 | 8331 |
8336 // Create an object that requires access-check functions to be | 8332 // Create an object that requires access-check functions to be |
8337 // called for cross-domain access. | 8333 // called for cross-domain access. |
8338 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 8334 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
8339 object_template->SetAccessCheckCallbacks(NamedAccessFlatten, | 8335 object_template->SetAccessCheckCallbacks(NamedAccessFlatten, |
8340 IndexedAccessFlatten); | 8336 IndexedAccessFlatten); |
8341 Local<v8::Object> object = object_template->NewInstance(); | 8337 Local<v8::Object> object = object_template->NewInstance(); |
8342 | 8338 |
8343 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 8339 v8::HandleScope scope1(isolate); |
8344 | 8340 |
8345 // Create another environment. | 8341 // Create another environment. |
8346 v8::Persistent<Context> context1 = Context::New(); | 8342 v8::Local<Context> context1 = Context::New(isolate); |
8347 context1->Enter(); | 8343 context1->Enter(); |
8348 | 8344 |
8349 // Make easy access to the object from the other environment. | 8345 // Make easy access to the object from the other environment. |
8350 v8::Handle<v8::Object> global1 = context1->Global(); | 8346 v8::Handle<v8::Object> global1 = context1->Global(); |
8351 global1->Set(v8_str("obj"), object); | 8347 global1->Set(v8_str("obj"), object); |
8352 | 8348 |
8353 v8::Handle<Value> value; | 8349 v8::Handle<Value> value; |
8354 | 8350 |
8355 value = v8_compile("var p = 'as' + 'df';")->Run(); | 8351 value = v8_compile("var p = 'as' + 'df';")->Run(); |
8356 value = v8_compile("obj[p];")->Run(); | 8352 value = v8_compile("obj[p];")->Run(); |
8357 | 8353 |
8358 context1->Exit(); | 8354 context1->Exit(); |
8359 context0->Exit(); | 8355 context0->Exit(); |
8360 context1.Dispose(context1->GetIsolate()); | |
8361 context0.Dispose(context0->GetIsolate()); | |
8362 } | 8356 } |
8363 | 8357 |
8364 | 8358 |
8365 static v8::Handle<Value> AccessControlNamedGetter( | 8359 static v8::Handle<Value> AccessControlNamedGetter( |
8366 Local<String>, const AccessorInfo&) { | 8360 Local<String>, const AccessorInfo&) { |
8367 return v8::Integer::New(42); | 8361 return v8::Integer::New(42); |
8368 } | 8362 } |
8369 | 8363 |
8370 | 8364 |
8371 static v8::Handle<Value> AccessControlNamedSetter( | 8365 static v8::Handle<Value> AccessControlNamedSetter( |
(...skipping 12 matching lines...) Expand all Loading... |
8384 static v8::Handle<Value> AccessControlIndexedSetter( | 8378 static v8::Handle<Value> AccessControlIndexedSetter( |
8385 uint32_t, Local<Value> value, const AccessorInfo&) { | 8379 uint32_t, Local<Value> value, const AccessorInfo&) { |
8386 return value; | 8380 return value; |
8387 } | 8381 } |
8388 | 8382 |
8389 | 8383 |
8390 THREADED_TEST(AccessControlInterceptorIC) { | 8384 THREADED_TEST(AccessControlInterceptorIC) { |
8391 named_access_count = 0; | 8385 named_access_count = 0; |
8392 indexed_access_count = 0; | 8386 indexed_access_count = 0; |
8393 | 8387 |
8394 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 8388 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 8389 v8::HandleScope handle_scope(isolate); |
8395 | 8390 |
8396 // Create an environment. | 8391 // Create an environment. |
8397 v8::Persistent<Context> context0 = Context::New(); | 8392 v8::Local<Context> context0 = Context::New(isolate); |
8398 context0->Enter(); | 8393 context0->Enter(); |
8399 | 8394 |
8400 // Create an object that requires access-check functions to be | 8395 // Create an object that requires access-check functions to be |
8401 // called for cross-domain access. The object also has interceptors | 8396 // called for cross-domain access. The object also has interceptors |
8402 // interceptor. | 8397 // interceptor. |
8403 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | 8398 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); |
8404 object_template->SetAccessCheckCallbacks(NamedAccessCounter, | 8399 object_template->SetAccessCheckCallbacks(NamedAccessCounter, |
8405 IndexedAccessCounter); | 8400 IndexedAccessCounter); |
8406 object_template->SetNamedPropertyHandler(AccessControlNamedGetter, | 8401 object_template->SetNamedPropertyHandler(AccessControlNamedGetter, |
8407 AccessControlNamedSetter); | 8402 AccessControlNamedSetter); |
8408 object_template->SetIndexedPropertyHandler(AccessControlIndexedGetter, | 8403 object_template->SetIndexedPropertyHandler(AccessControlIndexedGetter, |
8409 AccessControlIndexedSetter); | 8404 AccessControlIndexedSetter); |
8410 Local<v8::Object> object = object_template->NewInstance(); | 8405 Local<v8::Object> object = object_template->NewInstance(); |
8411 | 8406 |
8412 v8::HandleScope scope1(v8::Isolate::GetCurrent()); | 8407 v8::HandleScope scope1(isolate); |
8413 | 8408 |
8414 // Create another environment. | 8409 // Create another environment. |
8415 v8::Persistent<Context> context1 = Context::New(); | 8410 v8::Local<Context> context1 = Context::New(isolate); |
8416 context1->Enter(); | 8411 context1->Enter(); |
8417 | 8412 |
8418 // Make easy access to the object from the other environment. | 8413 // Make easy access to the object from the other environment. |
8419 v8::Handle<v8::Object> global1 = context1->Global(); | 8414 v8::Handle<v8::Object> global1 = context1->Global(); |
8420 global1->Set(v8_str("obj"), object); | 8415 global1->Set(v8_str("obj"), object); |
8421 | 8416 |
8422 v8::Handle<Value> value; | 8417 v8::Handle<Value> value; |
8423 | 8418 |
8424 // Check that the named access-control function is called every time | 8419 // Check that the named access-control function is called every time |
8425 // eventhough there is an interceptor on the object. | 8420 // eventhough there is an interceptor on the object. |
(...skipping 16 matching lines...) Expand all Loading... |
8442 // time eventhough there is an interceptor on the object. | 8437 // time eventhough there is an interceptor on the object. |
8443 value = v8_compile("for (var i = 0; i < 10; i++) obj[0] = 1;")->Run(); | 8438 value = v8_compile("for (var i = 0; i < 10; i++) obj[0] = 1;")->Run(); |
8444 value = v8_compile("for (var i = 0; i < 10; i++) obj[0];" | 8439 value = v8_compile("for (var i = 0; i < 10; i++) obj[0];" |
8445 "obj[0]")->Run(); | 8440 "obj[0]")->Run(); |
8446 CHECK(value->IsNumber()); | 8441 CHECK(value->IsNumber()); |
8447 CHECK_EQ(42, value->Int32Value()); | 8442 CHECK_EQ(42, value->Int32Value()); |
8448 CHECK_EQ(21, indexed_access_count); | 8443 CHECK_EQ(21, indexed_access_count); |
8449 | 8444 |
8450 context1->Exit(); | 8445 context1->Exit(); |
8451 context0->Exit(); | 8446 context0->Exit(); |
8452 context1.Dispose(context1->GetIsolate()); | |
8453 context0.Dispose(context0->GetIsolate()); | |
8454 } | 8447 } |
8455 | 8448 |
8456 | 8449 |
8457 THREADED_TEST(Version) { | 8450 THREADED_TEST(Version) { |
8458 v8::V8::GetVersion(); | 8451 v8::V8::GetVersion(); |
8459 } | 8452 } |
8460 | 8453 |
8461 | 8454 |
8462 static v8::Handle<Value> InstanceFunctionCallback(const v8::Arguments& args) { | 8455 static v8::Handle<Value> InstanceFunctionCallback(const v8::Arguments& args) { |
8463 ApiTestFuzzer::Fuzz(); | 8456 ApiTestFuzzer::Fuzz(); |
(...skipping 840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9304 Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')")); | 9297 Script::Compile(v8_str("other.y = 1; eval.call(other, 'y')")); |
9305 result = script->Run(); | 9298 result = script->Run(); |
9306 CHECK(try_catch.HasCaught()); | 9299 CHECK(try_catch.HasCaught()); |
9307 } | 9300 } |
9308 | 9301 |
9309 | 9302 |
9310 // Test that calling eval in a context which has been detached from | 9303 // Test that calling eval in a context which has been detached from |
9311 // its global throws an exception. This behavior is consistent with | 9304 // its global throws an exception. This behavior is consistent with |
9312 // other JavaScript implementations. | 9305 // other JavaScript implementations. |
9313 THREADED_TEST(EvalInDetachedGlobal) { | 9306 THREADED_TEST(EvalInDetachedGlobal) { |
9314 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 9307 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 9308 v8::HandleScope scope(isolate); |
9315 | 9309 |
9316 v8::Persistent<Context> context0 = Context::New(); | 9310 v8::Local<Context> context0 = Context::New(isolate); |
9317 v8::Persistent<Context> context1 = Context::New(); | 9311 v8::Local<Context> context1 = Context::New(isolate); |
9318 | 9312 |
9319 // Set up function in context0 that uses eval from context0. | 9313 // Set up function in context0 that uses eval from context0. |
9320 context0->Enter(); | 9314 context0->Enter(); |
9321 v8::Handle<v8::Value> fun = | 9315 v8::Handle<v8::Value> fun = |
9322 CompileRun("var x = 42;" | 9316 CompileRun("var x = 42;" |
9323 "(function() {" | 9317 "(function() {" |
9324 " var e = eval;" | 9318 " var e = eval;" |
9325 " return function(s) { return e(s); }" | 9319 " return function(s) { return e(s); }" |
9326 "})()"); | 9320 "})()"); |
9327 context0->Exit(); | 9321 context0->Exit(); |
9328 | 9322 |
9329 // Put the function into context1 and call it before and after | 9323 // Put the function into context1 and call it before and after |
9330 // detaching the global. Before detaching, the call succeeds and | 9324 // detaching the global. Before detaching, the call succeeds and |
9331 // after detaching and exception is thrown. | 9325 // after detaching and exception is thrown. |
9332 context1->Enter(); | 9326 context1->Enter(); |
9333 context1->Global()->Set(v8_str("fun"), fun); | 9327 context1->Global()->Set(v8_str("fun"), fun); |
9334 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); | 9328 v8::Handle<v8::Value> x_value = CompileRun("fun('x')"); |
9335 CHECK_EQ(42, x_value->Int32Value()); | 9329 CHECK_EQ(42, x_value->Int32Value()); |
9336 context0->DetachGlobal(); | 9330 context0->DetachGlobal(); |
9337 v8::TryCatch catcher; | 9331 v8::TryCatch catcher; |
9338 x_value = CompileRun("fun('x')"); | 9332 x_value = CompileRun("fun('x')"); |
9339 CHECK(x_value.IsEmpty()); | 9333 CHECK(x_value.IsEmpty()); |
9340 CHECK(catcher.HasCaught()); | 9334 CHECK(catcher.HasCaught()); |
9341 context1->Exit(); | 9335 context1->Exit(); |
9342 | |
9343 context1.Dispose(context1->GetIsolate()); | |
9344 context0.Dispose(context0->GetIsolate()); | |
9345 } | 9336 } |
9346 | 9337 |
9347 | 9338 |
9348 THREADED_TEST(CrossLazyLoad) { | 9339 THREADED_TEST(CrossLazyLoad) { |
9349 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 9340 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
9350 LocalContext other; | 9341 LocalContext other; |
9351 LocalContext current; | 9342 LocalContext current; |
9352 | 9343 |
9353 Local<String> token = v8_str("<security token>"); | 9344 Local<String> token = v8_str("<security token>"); |
9354 other->SetSecurityToken(token); | 9345 other->SetSecurityToken(token); |
(...skipping 2612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11967 CompileRun(source); | 11958 CompileRun(source); |
11968 } | 11959 } |
11969 { v8::HandleScope scope(v8::Isolate::GetCurrent()); | 11960 { v8::HandleScope scope(v8::Isolate::GetCurrent()); |
11970 LocalContext context; | 11961 LocalContext context; |
11971 CompileRun(source); | 11962 CompileRun(source); |
11972 } | 11963 } |
11973 } | 11964 } |
11974 } | 11965 } |
11975 | 11966 |
11976 | 11967 |
11977 static v8::Handle<Value> NestedScope(v8::Persistent<Context> env) { | 11968 static v8::Handle<Value> NestedScope(v8::Local<Context> env) { |
11978 v8::HandleScope inner(env->GetIsolate()); | 11969 v8::HandleScope inner(env->GetIsolate()); |
11979 env->Enter(); | 11970 env->Enter(); |
11980 v8::Handle<Value> three = v8_num(3); | 11971 v8::Handle<Value> three = v8_num(3); |
11981 v8::Handle<Value> value = inner.Close(three); | 11972 v8::Handle<Value> value = inner.Close(three); |
11982 env->Exit(); | 11973 env->Exit(); |
11983 return value; | 11974 return value; |
11984 } | 11975 } |
11985 | 11976 |
11986 | 11977 |
11987 THREADED_TEST(NestedHandleScopeAndContexts) { | 11978 THREADED_TEST(NestedHandleScopeAndContexts) { |
11988 v8::HandleScope outer(v8::Isolate::GetCurrent()); | 11979 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
11989 v8::Persistent<Context> env = Context::New(); | 11980 v8::HandleScope outer(isolate); |
| 11981 v8::Local<Context> env = Context::New(isolate); |
11990 env->Enter(); | 11982 env->Enter(); |
11991 v8::Handle<Value> value = NestedScope(env); | 11983 v8::Handle<Value> value = NestedScope(env); |
11992 v8::Handle<String> str(value->ToString()); | 11984 v8::Handle<String> str(value->ToString()); |
11993 CHECK(!str.IsEmpty()); | 11985 CHECK(!str.IsEmpty()); |
11994 env->Exit(); | 11986 env->Exit(); |
11995 env.Dispose(env->GetIsolate()); | |
11996 } | 11987 } |
11997 | 11988 |
11998 | 11989 |
11999 static i::Handle<i::JSFunction>* foo_ptr = NULL; | 11990 static i::Handle<i::JSFunction>* foo_ptr = NULL; |
12000 static int foo_count = 0; | 11991 static int foo_count = 0; |
12001 static i::Handle<i::JSFunction>* bar_ptr = NULL; | 11992 static i::Handle<i::JSFunction>* bar_ptr = NULL; |
12002 static int bar_count = 0; | 11993 static int bar_count = 0; |
12003 | 11994 |
12004 | 11995 |
12005 static void entry_hook(uintptr_t function, | 11996 static void entry_hook(uintptr_t function, |
(...skipping 11 matching lines...) Expand all Loading... |
12017 // TODO(siggi): Verify return_addr_location. | 12008 // TODO(siggi): Verify return_addr_location. |
12018 // This can be done by capturing JitCodeEvents, but requires an ordered | 12009 // This can be done by capturing JitCodeEvents, but requires an ordered |
12019 // collection. | 12010 // collection. |
12020 } | 12011 } |
12021 | 12012 |
12022 | 12013 |
12023 static void RunLoopInNewEnv() { | 12014 static void RunLoopInNewEnv() { |
12024 bar_ptr = NULL; | 12015 bar_ptr = NULL; |
12025 foo_ptr = NULL; | 12016 foo_ptr = NULL; |
12026 | 12017 |
12027 v8::HandleScope outer(v8::Isolate::GetCurrent()); | 12018 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
12028 v8::Persistent<Context> env = Context::New(); | 12019 v8::HandleScope outer(isolate); |
| 12020 v8::Local<Context> env = Context::New(isolate); |
12029 env->Enter(); | 12021 env->Enter(); |
12030 | 12022 |
12031 const char* script = | 12023 const char* script = |
12032 "function bar() {" | 12024 "function bar() {" |
12033 " var sum = 0;" | 12025 " var sum = 0;" |
12034 " for (i = 0; i < 100; ++i)" | 12026 " for (i = 0; i < 100; ++i)" |
12035 " sum = foo(i);" | 12027 " sum = foo(i);" |
12036 " return sum;" | 12028 " return sum;" |
12037 "}" | 12029 "}" |
12038 "function foo(i) { return i * i; }"; | 12030 "function foo(i) { return i * i; }"; |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12344 | 12336 |
12345 isolate->Exit(); | 12337 isolate->Exit(); |
12346 isolate->Dispose(); | 12338 isolate->Dispose(); |
12347 } | 12339 } |
12348 | 12340 |
12349 | 12341 |
12350 static int64_t cast(intptr_t x) { return static_cast<int64_t>(x); } | 12342 static int64_t cast(intptr_t x) { return static_cast<int64_t>(x); } |
12351 | 12343 |
12352 | 12344 |
12353 THREADED_TEST(ExternalAllocatedMemory) { | 12345 THREADED_TEST(ExternalAllocatedMemory) { |
12354 v8::HandleScope outer(v8::Isolate::GetCurrent()); | 12346 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
12355 v8::Persistent<Context> env(Context::New()); | 12347 v8::HandleScope outer(isolate); |
| 12348 v8::Local<Context> env(Context::New(isolate)); |
12356 CHECK(!env.IsEmpty()); | 12349 CHECK(!env.IsEmpty()); |
12357 const intptr_t kSize = 1024*1024; | 12350 const intptr_t kSize = 1024*1024; |
12358 v8::Isolate* isolate = env->GetIsolate(); | |
12359 int64_t baseline = cast(isolate->AdjustAmountOfExternalAllocatedMemory(0)); | 12351 int64_t baseline = cast(isolate->AdjustAmountOfExternalAllocatedMemory(0)); |
12360 CHECK_EQ(baseline + cast(kSize), | 12352 CHECK_EQ(baseline + cast(kSize), |
12361 cast(isolate->AdjustAmountOfExternalAllocatedMemory(kSize))); | 12353 cast(isolate->AdjustAmountOfExternalAllocatedMemory(kSize))); |
12362 CHECK_EQ(baseline, | 12354 CHECK_EQ(baseline, |
12363 cast(isolate->AdjustAmountOfExternalAllocatedMemory(-kSize))); | 12355 cast(isolate->AdjustAmountOfExternalAllocatedMemory(-kSize))); |
12364 } | 12356 } |
12365 | 12357 |
12366 | 12358 |
12367 THREADED_TEST(DisposeEnteredContext) { | 12359 THREADED_TEST(DisposeEnteredContext) { |
12368 LocalContext outer; | 12360 LocalContext outer; |
12369 v8::HandleScope scope(outer->GetIsolate()); | 12361 v8::Isolate* isolate = outer->GetIsolate(); |
12370 { v8::Persistent<v8::Context> inner = v8::Context::New(); | 12362 v8::Persistent<v8::Context> inner; |
| 12363 { |
| 12364 v8::HandleScope scope(isolate); |
| 12365 inner.Reset(isolate, v8::Context::New(isolate)); |
| 12366 } |
| 12367 v8::HandleScope scope(isolate); |
| 12368 { |
12371 inner->Enter(); | 12369 inner->Enter(); |
12372 inner.Dispose(inner->GetIsolate()); | 12370 inner.Dispose(inner->GetIsolate()); |
12373 inner.Clear(); | 12371 inner.Clear(); |
12374 inner->Exit(); | 12372 inner->Exit(); |
12375 } | 12373 } |
12376 } | 12374 } |
12377 | 12375 |
12378 | 12376 |
12379 // Regression test for issue 54, object templates with internal fields | 12377 // Regression test for issue 54, object templates with internal fields |
12380 // but no accessors or interceptors did not get their internal field | 12378 // but no accessors or interceptors did not get their internal field |
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12680 context->Global()->Set(v8_str("obj_2"), instance_2); | 12678 context->Global()->Set(v8_str("obj_2"), instance_2); |
12681 | 12679 |
12682 Local<Value> value_2 = CompileRun("obj_2.a"); | 12680 Local<Value> value_2 = CompileRun("obj_2.a"); |
12683 CHECK(value_2->IsUndefined()); | 12681 CHECK(value_2->IsUndefined()); |
12684 } | 12682 } |
12685 | 12683 |
12686 | 12684 |
12687 // This tests that access check information remains on the global | 12685 // This tests that access check information remains on the global |
12688 // object template when creating contexts. | 12686 // object template when creating contexts. |
12689 THREADED_TEST(AccessControlRepeatedContextCreation) { | 12687 THREADED_TEST(AccessControlRepeatedContextCreation) { |
12690 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 12688 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 12689 v8::HandleScope handle_scope(isolate); |
12691 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 12690 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
12692 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, | 12691 global_template->SetAccessCheckCallbacks(NamedSetAccessBlocker, |
12693 IndexedSetAccessBlocker); | 12692 IndexedSetAccessBlocker); |
12694 i::Handle<i::ObjectTemplateInfo> internal_template = | 12693 i::Handle<i::ObjectTemplateInfo> internal_template = |
12695 v8::Utils::OpenHandle(*global_template); | 12694 v8::Utils::OpenHandle(*global_template); |
12696 CHECK(!internal_template->constructor()->IsUndefined()); | 12695 CHECK(!internal_template->constructor()->IsUndefined()); |
12697 i::Handle<i::FunctionTemplateInfo> constructor( | 12696 i::Handle<i::FunctionTemplateInfo> constructor( |
12698 i::FunctionTemplateInfo::cast(internal_template->constructor())); | 12697 i::FunctionTemplateInfo::cast(internal_template->constructor())); |
12699 CHECK(!constructor->access_check_info()->IsUndefined()); | 12698 CHECK(!constructor->access_check_info()->IsUndefined()); |
12700 v8::Persistent<Context> context0(Context::New(NULL, global_template)); | 12699 v8::Local<Context> context0(Context::New(isolate, NULL, global_template)); |
12701 CHECK(!context0.IsEmpty()); | 12700 CHECK(!context0.IsEmpty()); |
12702 CHECK(!constructor->access_check_info()->IsUndefined()); | 12701 CHECK(!constructor->access_check_info()->IsUndefined()); |
12703 } | 12702 } |
12704 | 12703 |
12705 | 12704 |
12706 THREADED_TEST(TurnOnAccessCheck) { | 12705 THREADED_TEST(TurnOnAccessCheck) { |
12707 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 12706 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 12707 v8::HandleScope handle_scope(isolate); |
12708 | 12708 |
12709 // Create an environment with access check to the global object disabled by | 12709 // Create an environment with access check to the global object disabled by |
12710 // default. | 12710 // default. |
12711 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 12711 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
12712 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, | 12712 global_template->SetAccessCheckCallbacks(NamedGetAccessBlocker, |
12713 IndexedGetAccessBlocker, | 12713 IndexedGetAccessBlocker, |
12714 v8::Handle<v8::Value>(), | 12714 v8::Handle<v8::Value>(), |
12715 false); | 12715 false); |
12716 v8::Persistent<Context> context = Context::New(NULL, global_template); | 12716 v8::Local<Context> context = Context::New(isolate, NULL, global_template); |
12717 Context::Scope context_scope(v8::Isolate::GetCurrent(), context); | 12717 Context::Scope context_scope(context); |
12718 | 12718 |
12719 // Set up a property and a number of functions. | 12719 // Set up a property and a number of functions. |
12720 context->Global()->Set(v8_str("a"), v8_num(1)); | 12720 context->Global()->Set(v8_str("a"), v8_num(1)); |
12721 CompileRun("function f1() {return a;}" | 12721 CompileRun("function f1() {return a;}" |
12722 "function f2() {return a;}" | 12722 "function f2() {return a;}" |
12723 "function g1() {return h();}" | 12723 "function g1() {return h();}" |
12724 "function g2() {return h();}" | 12724 "function g2() {return h();}" |
12725 "function h() {return 1;}"); | 12725 "function h() {return 1;}"); |
12726 Local<Function> f1 = | 12726 Local<Function> f1 = |
12727 Local<Function>::Cast(context->Global()->Get(v8_str("f1"))); | 12727 Local<Function>::Cast(context->Global()->Get(v8_str("f1"))); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12777 Local<Value> data) { | 12777 Local<Value> data) { |
12778 if (!name->IsString()) return false; | 12778 if (!name->IsString()) return false; |
12779 i::Handle<i::String> name_handle = | 12779 i::Handle<i::String> name_handle = |
12780 v8::Utils::OpenHandle(String::Cast(*name)); | 12780 v8::Utils::OpenHandle(String::Cast(*name)); |
12781 return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA)) | 12781 return !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyA)) |
12782 && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH)); | 12782 && !name_handle->IsUtf8EqualTo(i::CStrVector(kPropertyH)); |
12783 } | 12783 } |
12784 | 12784 |
12785 | 12785 |
12786 THREADED_TEST(TurnOnAccessCheckAndRecompile) { | 12786 THREADED_TEST(TurnOnAccessCheckAndRecompile) { |
12787 v8::HandleScope handle_scope(v8::Isolate::GetCurrent()); | 12787 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 12788 v8::HandleScope handle_scope(isolate); |
12788 | 12789 |
12789 // Create an environment with access check to the global object disabled by | 12790 // Create an environment with access check to the global object disabled by |
12790 // default. When the registered access checker will block access to properties | 12791 // default. When the registered access checker will block access to properties |
12791 // a and h. | 12792 // a and h. |
12792 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); | 12793 v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); |
12793 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH, | 12794 global_template->SetAccessCheckCallbacks(NamedGetAccessBlockAandH, |
12794 IndexedGetAccessBlocker, | 12795 IndexedGetAccessBlocker, |
12795 v8::Handle<v8::Value>(), | 12796 v8::Handle<v8::Value>(), |
12796 false); | 12797 false); |
12797 v8::Persistent<Context> context = Context::New(NULL, global_template); | 12798 v8::Local<Context> context = Context::New(isolate, NULL, global_template); |
12798 Context::Scope context_scope(v8::Isolate::GetCurrent(), context); | 12799 Context::Scope context_scope(context); |
12799 | 12800 |
12800 // Set up a property and a number of functions. | 12801 // Set up a property and a number of functions. |
12801 context->Global()->Set(v8_str("a"), v8_num(1)); | 12802 context->Global()->Set(v8_str("a"), v8_num(1)); |
12802 static const char* source = "function f1() {return a;}" | 12803 static const char* source = "function f1() {return a;}" |
12803 "function f2() {return a;}" | 12804 "function f2() {return a;}" |
12804 "function g1() {return h();}" | 12805 "function g1() {return h();}" |
12805 "function g2() {return h();}" | 12806 "function g2() {return h();}" |
12806 "function h() {return 1;}"; | 12807 "function h() {return 1;}"; |
12807 | 12808 |
12808 CompileRun(source); | 12809 CompileRun(source); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13046 context->Global()->Set(v8_str("tmp"), v8::True()); | 13047 context->Global()->Set(v8_str("tmp"), v8::True()); |
13047 context->Global()->Delete(v8_str("tmp")); | 13048 context->Global()->Delete(v8_str("tmp")); |
13048 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); | 13049 CompileRun("for (var j = 0; j < 10; j++) RegExp('')"); |
13049 } | 13050 } |
13050 } | 13051 } |
13051 | 13052 |
13052 | 13053 |
13053 // Test that cross-context new calls use the context of the callee to | 13054 // Test that cross-context new calls use the context of the callee to |
13054 // create the new JavaScript object. | 13055 // create the new JavaScript object. |
13055 THREADED_TEST(CrossContextNew) { | 13056 THREADED_TEST(CrossContextNew) { |
13056 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 13057 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
13057 v8::Persistent<Context> context0 = Context::New(); | 13058 v8::HandleScope scope(isolate); |
13058 v8::Persistent<Context> context1 = Context::New(); | 13059 v8::Local<Context> context0 = Context::New(isolate); |
| 13060 v8::Local<Context> context1 = Context::New(isolate); |
13059 | 13061 |
13060 // Allow cross-domain access. | 13062 // Allow cross-domain access. |
13061 Local<String> token = v8_str("<security token>"); | 13063 Local<String> token = v8_str("<security token>"); |
13062 context0->SetSecurityToken(token); | 13064 context0->SetSecurityToken(token); |
13063 context1->SetSecurityToken(token); | 13065 context1->SetSecurityToken(token); |
13064 | 13066 |
13065 // Set an 'x' property on the Object prototype and define a | 13067 // Set an 'x' property on the Object prototype and define a |
13066 // constructor function in context0. | 13068 // constructor function in context0. |
13067 context0->Enter(); | 13069 context0->Enter(); |
13068 CompileRun("Object.prototype.x = 42; function C() {};"); | 13070 CompileRun("Object.prototype.x = 42; function C() {};"); |
13069 context0->Exit(); | 13071 context0->Exit(); |
13070 | 13072 |
13071 // Call the constructor function from context0 and check that the | 13073 // Call the constructor function from context0 and check that the |
13072 // result has the 'x' property. | 13074 // result has the 'x' property. |
13073 context1->Enter(); | 13075 context1->Enter(); |
13074 context1->Global()->Set(v8_str("other"), context0->Global()); | 13076 context1->Global()->Set(v8_str("other"), context0->Global()); |
13075 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); | 13077 Local<Value> value = CompileRun("var instance = new other.C(); instance.x"); |
13076 CHECK(value->IsInt32()); | 13078 CHECK(value->IsInt32()); |
13077 CHECK_EQ(42, value->Int32Value()); | 13079 CHECK_EQ(42, value->Int32Value()); |
13078 context1->Exit(); | 13080 context1->Exit(); |
13079 | |
13080 // Dispose the contexts to allow them to be garbage collected. | |
13081 context0.Dispose(context0->GetIsolate()); | |
13082 context1.Dispose(context1->GetIsolate()); | |
13083 } | 13081 } |
13084 | 13082 |
13085 | 13083 |
13086 class RegExpInterruptTest { | 13084 class RegExpInterruptTest { |
13087 public: | 13085 public: |
13088 RegExpInterruptTest() : block_(NULL) {} | 13086 RegExpInterruptTest() : block_(NULL) {} |
13089 ~RegExpInterruptTest() { delete block_; } | 13087 ~RegExpInterruptTest() { delete block_; } |
13090 void RunTest() { | 13088 void RunTest() { |
13091 block_ = i::OS::CreateSemaphore(0); | 13089 block_ = i::OS::CreateSemaphore(0); |
13092 gc_count_ = 0; | 13090 gc_count_ = 0; |
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13853 CHECK(context->Global()->ForceDelete(v8_str("foo"))); | 13851 CHECK(context->Global()->ForceDelete(v8_str("foo"))); |
13854 // Make sure the value for foo is read from the prototype, and that | 13852 // Make sure the value for foo is read from the prototype, and that |
13855 // we don't get in trouble with reading the deleted cell value | 13853 // we don't get in trouble with reading the deleted cell value |
13856 // sentinel. | 13854 // sentinel. |
13857 CHECK_EQ(5, CompileRun("f()")->Int32Value()); | 13855 CHECK_EQ(5, CompileRun("f()")->Int32Value()); |
13858 } | 13856 } |
13859 | 13857 |
13860 | 13858 |
13861 TEST(InlinedFunctionAcrossContexts) { | 13859 TEST(InlinedFunctionAcrossContexts) { |
13862 i::FLAG_allow_natives_syntax = true; | 13860 i::FLAG_allow_natives_syntax = true; |
13863 v8::HandleScope outer_scope(v8::Isolate::GetCurrent()); | 13861 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
13864 v8::Persistent<v8::Context> ctx1 = v8::Context::New(); | 13862 v8::HandleScope outer_scope(isolate); |
13865 v8::Persistent<v8::Context> ctx2 = v8::Context::New(); | 13863 v8::Local<v8::Context> ctx1 = v8::Context::New(isolate); |
| 13864 v8::Local<v8::Context> ctx2 = v8::Context::New(isolate); |
13866 ctx1->Enter(); | 13865 ctx1->Enter(); |
13867 | 13866 |
13868 { | 13867 { |
13869 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); | 13868 v8::HandleScope inner_scope(v8::Isolate::GetCurrent()); |
13870 CompileRun("var G = 42; function foo() { return G; }"); | 13869 CompileRun("var G = 42; function foo() { return G; }"); |
13871 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo")); | 13870 v8::Local<v8::Value> foo = ctx1->Global()->Get(v8_str("foo")); |
13872 ctx2->Enter(); | 13871 ctx2->Enter(); |
13873 ctx2->Global()->Set(v8_str("o"), foo); | 13872 ctx2->Global()->Set(v8_str("o"), foo); |
13874 v8::Local<v8::Value> res = CompileRun( | 13873 v8::Local<v8::Value> res = CompileRun( |
13875 "function f() { return o(); }" | 13874 "function f() { return o(); }" |
13876 "for (var i = 0; i < 10; ++i) f();" | 13875 "for (var i = 0; i < 10; ++i) f();" |
13877 "%OptimizeFunctionOnNextCall(f);" | 13876 "%OptimizeFunctionOnNextCall(f);" |
13878 "f();"); | 13877 "f();"); |
13879 CHECK_EQ(42, res->Int32Value()); | 13878 CHECK_EQ(42, res->Int32Value()); |
13880 ctx2->Exit(); | 13879 ctx2->Exit(); |
13881 v8::Handle<v8::String> G_property = v8::String::New("G"); | 13880 v8::Handle<v8::String> G_property = v8::String::New("G"); |
13882 CHECK(ctx1->Global()->ForceDelete(G_property)); | 13881 CHECK(ctx1->Global()->ForceDelete(G_property)); |
13883 ctx2->Enter(); | 13882 ctx2->Enter(); |
13884 ExpectString( | 13883 ExpectString( |
13885 "(function() {" | 13884 "(function() {" |
13886 " try {" | 13885 " try {" |
13887 " return f();" | 13886 " return f();" |
13888 " } catch(e) {" | 13887 " } catch(e) {" |
13889 " return e.toString();" | 13888 " return e.toString();" |
13890 " }" | 13889 " }" |
13891 " })()", | 13890 " })()", |
13892 "ReferenceError: G is not defined"); | 13891 "ReferenceError: G is not defined"); |
13893 ctx2->Exit(); | 13892 ctx2->Exit(); |
13894 ctx1->Exit(); | 13893 ctx1->Exit(); |
13895 ctx1.Dispose(ctx1->GetIsolate()); | |
13896 } | 13894 } |
13897 ctx2.Dispose(ctx2->GetIsolate()); | |
13898 } | 13895 } |
13899 | 13896 |
13900 | 13897 |
13901 v8::Persistent<Context> calling_context0; | 13898 static v8::Local<Context> calling_context0; |
13902 v8::Persistent<Context> calling_context1; | 13899 static v8::Local<Context> calling_context1; |
13903 v8::Persistent<Context> calling_context2; | 13900 static v8::Local<Context> calling_context2; |
13904 | 13901 |
13905 | 13902 |
13906 // Check that the call to the callback is initiated in | 13903 // Check that the call to the callback is initiated in |
13907 // calling_context2, the directly calling context is calling_context1 | 13904 // calling_context2, the directly calling context is calling_context1 |
13908 // and the callback itself is in calling_context0. | 13905 // and the callback itself is in calling_context0. |
13909 static v8::Handle<Value> GetCallingContextCallback(const v8::Arguments& args) { | 13906 static v8::Handle<Value> GetCallingContextCallback(const v8::Arguments& args) { |
13910 ApiTestFuzzer::Fuzz(); | 13907 ApiTestFuzzer::Fuzz(); |
13911 CHECK(Context::GetCurrent() == calling_context0); | 13908 CHECK(Context::GetCurrent() == calling_context0); |
13912 CHECK(args.GetIsolate()->GetCurrentContext() == calling_context0); | 13909 CHECK(args.GetIsolate()->GetCurrentContext() == calling_context0); |
13913 CHECK(Context::GetCalling() == calling_context1); | 13910 CHECK(Context::GetCalling() == calling_context1); |
13914 CHECK(Context::GetEntered() == calling_context2); | 13911 CHECK(Context::GetEntered() == calling_context2); |
13915 return v8::Integer::New(42); | 13912 return v8::Integer::New(42); |
13916 } | 13913 } |
13917 | 13914 |
13918 | 13915 |
13919 THREADED_TEST(GetCallingContext) { | 13916 THREADED_TEST(GetCallingContext) { |
13920 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 13917 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 13918 v8::HandleScope scope(isolate); |
13921 | 13919 |
13922 calling_context0 = Context::New(); | 13920 Local<Context> calling_context0(Context::New(isolate)); |
13923 calling_context1 = Context::New(); | 13921 Local<Context> calling_context1(Context::New(isolate)); |
13924 calling_context2 = Context::New(); | 13922 Local<Context> calling_context2(Context::New(isolate)); |
| 13923 ::calling_context0 = calling_context0; |
| 13924 ::calling_context1 = calling_context1; |
| 13925 ::calling_context2 = calling_context2; |
13925 | 13926 |
13926 // Allow cross-domain access. | 13927 // Allow cross-domain access. |
13927 Local<String> token = v8_str("<security token>"); | 13928 Local<String> token = v8_str("<security token>"); |
13928 calling_context0->SetSecurityToken(token); | 13929 calling_context0->SetSecurityToken(token); |
13929 calling_context1->SetSecurityToken(token); | 13930 calling_context1->SetSecurityToken(token); |
13930 calling_context2->SetSecurityToken(token); | 13931 calling_context2->SetSecurityToken(token); |
13931 | 13932 |
13932 // Create an object with a C++ callback in context0. | 13933 // Create an object with a C++ callback in context0. |
13933 calling_context0->Enter(); | 13934 calling_context0->Enter(); |
13934 Local<v8::FunctionTemplate> callback_templ = | 13935 Local<v8::FunctionTemplate> callback_templ = |
(...skipping 10 matching lines...) Expand all Loading... |
13945 CompileRun("function f() { context0.callback() }"); | 13946 CompileRun("function f() { context0.callback() }"); |
13946 calling_context1->Exit(); | 13947 calling_context1->Exit(); |
13947 | 13948 |
13948 // Expose context1 in context2 and call the callback function in | 13949 // Expose context1 in context2 and call the callback function in |
13949 // context0 indirectly through f in context1. | 13950 // context0 indirectly through f in context1. |
13950 calling_context2->Enter(); | 13951 calling_context2->Enter(); |
13951 calling_context2->Global()->Set(v8_str("context1"), | 13952 calling_context2->Global()->Set(v8_str("context1"), |
13952 calling_context1->Global()); | 13953 calling_context1->Global()); |
13953 CompileRun("context1.f()"); | 13954 CompileRun("context1.f()"); |
13954 calling_context2->Exit(); | 13955 calling_context2->Exit(); |
13955 | 13956 ::calling_context0.Clear(); |
13956 // Dispose the contexts to allow them to be garbage collected. | 13957 ::calling_context1.Clear(); |
13957 calling_context0.Dispose(calling_context0->GetIsolate()); | 13958 ::calling_context2.Clear(); |
13958 calling_context1.Dispose(calling_context1->GetIsolate()); | |
13959 calling_context2.Dispose(calling_context2->GetIsolate()); | |
13960 calling_context0.Clear(); | |
13961 calling_context1.Clear(); | |
13962 calling_context2.Clear(); | |
13963 } | 13959 } |
13964 | 13960 |
13965 | 13961 |
13966 // Check that a variable declaration with no explicit initialization | 13962 // Check that a variable declaration with no explicit initialization |
13967 // value does shadow an existing property in the prototype chain. | 13963 // value does shadow an existing property in the prototype chain. |
13968 THREADED_TEST(InitGlobalVarInProtoChain) { | 13964 THREADED_TEST(InitGlobalVarInProtoChain) { |
13969 i::FLAG_es52_globals = true; | 13965 i::FLAG_es52_globals = true; |
13970 LocalContext context; | 13966 LocalContext context; |
13971 v8::HandleScope scope(context->GetIsolate()); | 13967 v8::HandleScope scope(context->GetIsolate()); |
13972 // Introduce a variable in the prototype chain. | 13968 // Introduce a variable in the prototype chain. |
(...skipping 1824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15797 CHECK(finished); | 15793 CHECK(finished); |
15798 CHECK_LT(final_size, initial_size + 1); | 15794 CHECK_LT(final_size, initial_size + 1); |
15799 } | 15795 } |
15800 | 15796 |
15801 | 15797 |
15802 TEST(Regress2107) { | 15798 TEST(Regress2107) { |
15803 const intptr_t MB = 1024 * 1024; | 15799 const intptr_t MB = 1024 * 1024; |
15804 const int kShortIdlePauseInMs = 100; | 15800 const int kShortIdlePauseInMs = 100; |
15805 const int kLongIdlePauseInMs = 1000; | 15801 const int kLongIdlePauseInMs = 1000; |
15806 LocalContext env; | 15802 LocalContext env; |
| 15803 v8::Isolate* isolate = env->GetIsolate(); |
15807 v8::HandleScope scope(env->GetIsolate()); | 15804 v8::HandleScope scope(env->GetIsolate()); |
15808 intptr_t initial_size = HEAP->SizeOfObjects(); | 15805 intptr_t initial_size = HEAP->SizeOfObjects(); |
15809 // Send idle notification to start a round of incremental GCs. | 15806 // Send idle notification to start a round of incremental GCs. |
15810 v8::V8::IdleNotification(kShortIdlePauseInMs); | 15807 v8::V8::IdleNotification(kShortIdlePauseInMs); |
15811 // Emulate 7 page reloads. | 15808 // Emulate 7 page reloads. |
15812 for (int i = 0; i < 7; i++) { | 15809 for (int i = 0; i < 7; i++) { |
15813 v8::Persistent<v8::Context> ctx = v8::Context::New(); | 15810 { |
15814 ctx->Enter(); | 15811 v8::HandleScope inner_scope(env->GetIsolate()); |
15815 CreateGarbageInOldSpace(); | 15812 v8::Local<v8::Context> ctx = v8::Context::New(isolate); |
15816 ctx->Exit(); | 15813 ctx->Enter(); |
15817 ctx.Dispose(ctx->GetIsolate()); | 15814 CreateGarbageInOldSpace(); |
| 15815 ctx->Exit(); |
| 15816 } |
15818 v8::V8::ContextDisposedNotification(); | 15817 v8::V8::ContextDisposedNotification(); |
15819 v8::V8::IdleNotification(kLongIdlePauseInMs); | 15818 v8::V8::IdleNotification(kLongIdlePauseInMs); |
15820 } | 15819 } |
15821 // Create garbage and check that idle notification still collects it. | 15820 // Create garbage and check that idle notification still collects it. |
15822 CreateGarbageInOldSpace(); | 15821 CreateGarbageInOldSpace(); |
15823 intptr_t size_with_garbage = HEAP->SizeOfObjects(); | 15822 intptr_t size_with_garbage = HEAP->SizeOfObjects(); |
15824 CHECK_GT(size_with_garbage, initial_size + MB); | 15823 CHECK_GT(size_with_garbage, initial_size + MB); |
15825 bool finished = false; | 15824 bool finished = false; |
15826 for (int i = 0; i < 200 && !finished; i++) { | 15825 for (int i = 0; i < 200 && !finished; i++) { |
15827 finished = v8::V8::IdleNotification(kShortIdlePauseInMs); | 15826 finished = v8::V8::IdleNotification(kShortIdlePauseInMs); |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16136 "};" | 16135 "};" |
16137 "s(o);"); | 16136 "s(o);"); |
16138 CHECK(try_catch.HasCaught()); | 16137 CHECK(try_catch.HasCaught()); |
16139 v8::String::Utf8Value value(try_catch.Exception()); | 16138 v8::String::Utf8Value value(try_catch.Exception()); |
16140 CHECK_EQ(0, strcmp(*value, "Hey!")); | 16139 CHECK_EQ(0, strcmp(*value, "Hey!")); |
16141 } | 16140 } |
16142 | 16141 |
16143 | 16142 |
16144 TEST(Regress528) { | 16143 TEST(Regress528) { |
16145 v8::V8::Initialize(); | 16144 v8::V8::Initialize(); |
16146 | 16145 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
16147 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 16146 v8::HandleScope scope(isolate); |
16148 v8::Persistent<Context> context; | 16147 v8::Local<Context> other_context; |
16149 v8::Persistent<Context> other_context; | |
16150 int gc_count; | 16148 int gc_count; |
16151 | 16149 |
16152 // Create a context used to keep the code from aging in the compilation | 16150 // Create a context used to keep the code from aging in the compilation |
16153 // cache. | 16151 // cache. |
16154 other_context = Context::New(); | 16152 other_context = Context::New(isolate); |
16155 | 16153 |
16156 // Context-dependent context data creates reference from the compilation | 16154 // Context-dependent context data creates reference from the compilation |
16157 // cache to the global object. | 16155 // cache to the global object. |
16158 const char* source_simple = "1"; | 16156 const char* source_simple = "1"; |
16159 context = Context::New(); | |
16160 { | 16157 { |
16161 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 16158 v8::HandleScope scope(isolate); |
| 16159 v8::Local<Context> context = Context::New(isolate); |
16162 | 16160 |
16163 context->Enter(); | 16161 context->Enter(); |
16164 Local<v8::String> obj = v8::String::New(""); | 16162 Local<v8::String> obj = v8::String::New(""); |
16165 context->SetEmbedderData(0, obj); | 16163 context->SetEmbedderData(0, obj); |
16166 CompileRun(source_simple); | 16164 CompileRun(source_simple); |
16167 context->Exit(); | 16165 context->Exit(); |
16168 } | 16166 } |
16169 context.Dispose(context->GetIsolate()); | |
16170 v8::V8::ContextDisposedNotification(); | 16167 v8::V8::ContextDisposedNotification(); |
16171 for (gc_count = 1; gc_count < 10; gc_count++) { | 16168 for (gc_count = 1; gc_count < 10; gc_count++) { |
16172 other_context->Enter(); | 16169 other_context->Enter(); |
16173 CompileRun(source_simple); | 16170 CompileRun(source_simple); |
16174 other_context->Exit(); | 16171 other_context->Exit(); |
16175 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 16172 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
16176 if (GetGlobalObjectsCount() == 1) break; | 16173 if (GetGlobalObjectsCount() == 1) break; |
16177 } | 16174 } |
16178 CHECK_GE(2, gc_count); | 16175 CHECK_GE(2, gc_count); |
16179 CHECK_EQ(1, GetGlobalObjectsCount()); | 16176 CHECK_EQ(1, GetGlobalObjectsCount()); |
16180 | 16177 |
16181 // Eval in a function creates reference from the compilation cache to the | 16178 // Eval in a function creates reference from the compilation cache to the |
16182 // global object. | 16179 // global object. |
16183 const char* source_eval = "function f(){eval('1')}; f()"; | 16180 const char* source_eval = "function f(){eval('1')}; f()"; |
16184 context = Context::New(); | |
16185 { | 16181 { |
16186 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 16182 v8::HandleScope scope(isolate); |
| 16183 v8::Local<Context> context = Context::New(isolate); |
16187 | 16184 |
16188 context->Enter(); | 16185 context->Enter(); |
16189 CompileRun(source_eval); | 16186 CompileRun(source_eval); |
16190 context->Exit(); | 16187 context->Exit(); |
16191 } | 16188 } |
16192 context.Dispose(context->GetIsolate()); | |
16193 v8::V8::ContextDisposedNotification(); | 16189 v8::V8::ContextDisposedNotification(); |
16194 for (gc_count = 1; gc_count < 10; gc_count++) { | 16190 for (gc_count = 1; gc_count < 10; gc_count++) { |
16195 other_context->Enter(); | 16191 other_context->Enter(); |
16196 CompileRun(source_eval); | 16192 CompileRun(source_eval); |
16197 other_context->Exit(); | 16193 other_context->Exit(); |
16198 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 16194 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
16199 if (GetGlobalObjectsCount() == 1) break; | 16195 if (GetGlobalObjectsCount() == 1) break; |
16200 } | 16196 } |
16201 CHECK_GE(2, gc_count); | 16197 CHECK_GE(2, gc_count); |
16202 CHECK_EQ(1, GetGlobalObjectsCount()); | 16198 CHECK_EQ(1, GetGlobalObjectsCount()); |
16203 | 16199 |
16204 // Looking up the line number for an exception creates reference from the | 16200 // Looking up the line number for an exception creates reference from the |
16205 // compilation cache to the global object. | 16201 // compilation cache to the global object. |
16206 const char* source_exception = "function f(){throw 1;} f()"; | 16202 const char* source_exception = "function f(){throw 1;} f()"; |
16207 context = Context::New(); | |
16208 { | 16203 { |
16209 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 16204 v8::HandleScope scope(isolate); |
| 16205 v8::Local<Context> context = Context::New(isolate); |
16210 | 16206 |
16211 context->Enter(); | 16207 context->Enter(); |
16212 v8::TryCatch try_catch; | 16208 v8::TryCatch try_catch; |
16213 CompileRun(source_exception); | 16209 CompileRun(source_exception); |
16214 CHECK(try_catch.HasCaught()); | 16210 CHECK(try_catch.HasCaught()); |
16215 v8::Handle<v8::Message> message = try_catch.Message(); | 16211 v8::Handle<v8::Message> message = try_catch.Message(); |
16216 CHECK(!message.IsEmpty()); | 16212 CHECK(!message.IsEmpty()); |
16217 CHECK_EQ(1, message->GetLineNumber()); | 16213 CHECK_EQ(1, message->GetLineNumber()); |
16218 context->Exit(); | 16214 context->Exit(); |
16219 } | 16215 } |
16220 context.Dispose(context->GetIsolate()); | |
16221 v8::V8::ContextDisposedNotification(); | 16216 v8::V8::ContextDisposedNotification(); |
16222 for (gc_count = 1; gc_count < 10; gc_count++) { | 16217 for (gc_count = 1; gc_count < 10; gc_count++) { |
16223 other_context->Enter(); | 16218 other_context->Enter(); |
16224 CompileRun(source_exception); | 16219 CompileRun(source_exception); |
16225 other_context->Exit(); | 16220 other_context->Exit(); |
16226 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); | 16221 HEAP->CollectAllGarbage(i::Heap::kNoGCFlags); |
16227 if (GetGlobalObjectsCount() == 1) break; | 16222 if (GetGlobalObjectsCount() == 1) break; |
16228 } | 16223 } |
16229 CHECK_GE(2, gc_count); | 16224 CHECK_GE(2, gc_count); |
16230 CHECK_EQ(1, GetGlobalObjectsCount()); | 16225 CHECK_EQ(1, GetGlobalObjectsCount()); |
16231 | 16226 |
16232 other_context.Dispose(other_context->GetIsolate()); | |
16233 v8::V8::ContextDisposedNotification(); | 16227 v8::V8::ContextDisposedNotification(); |
16234 } | 16228 } |
16235 | 16229 |
16236 | 16230 |
16237 THREADED_TEST(ScriptOrigin) { | 16231 THREADED_TEST(ScriptOrigin) { |
16238 LocalContext env; | 16232 LocalContext env; |
16239 v8::HandleScope scope(env->GetIsolate()); | 16233 v8::HandleScope scope(env->GetIsolate()); |
16240 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); | 16234 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New("test")); |
16241 v8::Handle<v8::String> script = v8::String::New( | 16235 v8::Handle<v8::String> script = v8::String::New( |
16242 "function f() {}\n\nfunction g() {}"); | 16236 "function f() {}\n\nfunction g() {}"); |
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16939 // Still entered, should fail. | 16933 // Still entered, should fail. |
16940 isolate->Dispose(); | 16934 isolate->Dispose(); |
16941 CHECK_NE(last_location, NULL); | 16935 CHECK_NE(last_location, NULL); |
16942 CHECK_NE(last_message, NULL); | 16936 CHECK_NE(last_message, NULL); |
16943 } | 16937 } |
16944 | 16938 |
16945 TEST(RunTwoIsolatesOnSingleThread) { | 16939 TEST(RunTwoIsolatesOnSingleThread) { |
16946 // Run isolate 1. | 16940 // Run isolate 1. |
16947 v8::Isolate* isolate1 = v8::Isolate::New(); | 16941 v8::Isolate* isolate1 = v8::Isolate::New(); |
16948 isolate1->Enter(); | 16942 isolate1->Enter(); |
16949 v8::Persistent<v8::Context> context1 = v8::Context::New(); | 16943 v8::Persistent<v8::Context> context1; |
| 16944 { |
| 16945 v8::HandleScope scope(isolate1); |
| 16946 context1.Reset(isolate1, Context::New(isolate1)); |
| 16947 } |
16950 | 16948 |
16951 { | 16949 { |
16952 v8::HandleScope scope(isolate1); | 16950 v8::HandleScope scope(isolate1); |
16953 v8::Context::Scope cscope(isolate1, context1); | 16951 v8::Context::Scope cscope(isolate1, context1); |
16954 // Run something in new isolate. | 16952 // Run something in new isolate. |
16955 CompileRun("var foo = 'isolate 1';"); | 16953 CompileRun("var foo = 'isolate 1';"); |
16956 ExpectString("function f() { return foo; }; f()", "isolate 1"); | 16954 ExpectString("function f() { return foo; }; f()", "isolate 1"); |
16957 } | 16955 } |
16958 | 16956 |
16959 // Run isolate 2. | 16957 // Run isolate 2. |
16960 v8::Isolate* isolate2 = v8::Isolate::New(); | 16958 v8::Isolate* isolate2 = v8::Isolate::New(); |
16961 v8::Persistent<v8::Context> context2; | 16959 v8::Persistent<v8::Context> context2; |
16962 | 16960 |
16963 { | 16961 { |
16964 v8::Isolate::Scope iscope(isolate2); | 16962 v8::Isolate::Scope iscope(isolate2); |
16965 context2 = v8::Context::New(); | |
16966 v8::HandleScope scope(isolate2); | 16963 v8::HandleScope scope(isolate2); |
| 16964 context2.Reset(isolate2, Context::New(isolate2)); |
16967 v8::Context::Scope cscope(isolate2, context2); | 16965 v8::Context::Scope cscope(isolate2, context2); |
16968 | 16966 |
16969 // Run something in new isolate. | 16967 // Run something in new isolate. |
16970 CompileRun("var foo = 'isolate 2';"); | 16968 CompileRun("var foo = 'isolate 2';"); |
16971 ExpectString("function f() { return foo; }; f()", "isolate 2"); | 16969 ExpectString("function f() { return foo; }; f()", "isolate 2"); |
16972 } | 16970 } |
16973 | 16971 |
16974 { | 16972 { |
16975 v8::HandleScope scope(isolate1); | 16973 v8::HandleScope scope(isolate1); |
16976 v8::Context::Scope cscope(isolate1, context1); | 16974 v8::Context::Scope cscope(isolate1, context1); |
16977 // Now again in isolate 1 | 16975 // Now again in isolate 1 |
16978 ExpectString("function f() { return foo; }; f()", "isolate 1"); | 16976 ExpectString("function f() { return foo; }; f()", "isolate 1"); |
16979 } | 16977 } |
16980 | 16978 |
16981 isolate1->Exit(); | 16979 isolate1->Exit(); |
16982 | 16980 |
16983 // Run some stuff in default isolate. | 16981 // Run some stuff in default isolate. |
16984 v8::Persistent<v8::Context> context_default = v8::Context::New(); | 16982 v8::Persistent<v8::Context> context_default; |
| 16983 { |
| 16984 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 16985 v8::Isolate::Scope iscope(isolate); |
| 16986 v8::HandleScope scope(isolate); |
| 16987 context_default.Reset(isolate, Context::New(isolate)); |
| 16988 } |
16985 | 16989 |
16986 { | 16990 { |
16987 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 16991 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
16988 v8::Context::Scope cscope(v8::Isolate::GetCurrent(), context_default); | 16992 v8::Context::Scope cscope(v8::Isolate::GetCurrent(), context_default); |
16989 // Variables in other isolates should be not available, verify there | 16993 // Variables in other isolates should be not available, verify there |
16990 // is an exception. | 16994 // is an exception. |
16991 ExpectTrue("function f() {" | 16995 ExpectTrue("function f() {" |
16992 " try {" | 16996 " try {" |
16993 " foo;" | 16997 " foo;" |
16994 " return false;" | 16998 " return false;" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17100 CHECK_EQ(result2, 144); | 17104 CHECK_EQ(result2, 144); |
17101 CHECK_EQ(result1, thread1.result()); | 17105 CHECK_EQ(result1, thread1.result()); |
17102 CHECK_EQ(result2, thread2.result()); | 17106 CHECK_EQ(result2, thread2.result()); |
17103 | 17107 |
17104 isolate1->Dispose(); | 17108 isolate1->Dispose(); |
17105 isolate2->Dispose(); | 17109 isolate2->Dispose(); |
17106 } | 17110 } |
17107 | 17111 |
17108 TEST(IsolateDifferentContexts) { | 17112 TEST(IsolateDifferentContexts) { |
17109 v8::Isolate* isolate = v8::Isolate::New(); | 17113 v8::Isolate* isolate = v8::Isolate::New(); |
17110 Persistent<v8::Context> context; | 17114 Local<v8::Context> context; |
17111 { | 17115 { |
17112 v8::Isolate::Scope isolate_scope(isolate); | 17116 v8::Isolate::Scope isolate_scope(isolate); |
17113 v8::HandleScope handle_scope(isolate); | 17117 v8::HandleScope handle_scope(isolate); |
17114 context = v8::Context::New(); | 17118 context = v8::Context::New(isolate); |
17115 v8::Context::Scope context_scope(isolate, context); | 17119 v8::Context::Scope context_scope(context); |
17116 Local<Value> v = CompileRun("2"); | 17120 Local<Value> v = CompileRun("2"); |
17117 CHECK(v->IsNumber()); | 17121 CHECK(v->IsNumber()); |
17118 CHECK_EQ(2, static_cast<int>(v->NumberValue())); | 17122 CHECK_EQ(2, static_cast<int>(v->NumberValue())); |
17119 } | 17123 } |
17120 { | 17124 { |
17121 v8::Isolate::Scope isolate_scope(isolate); | 17125 v8::Isolate::Scope isolate_scope(isolate); |
17122 v8::HandleScope handle_scope(isolate); | 17126 v8::HandleScope handle_scope(isolate); |
17123 context = v8::Context::New(); | 17127 context = v8::Context::New(isolate); |
17124 v8::Context::Scope context_scope(isolate, context); | 17128 v8::Context::Scope context_scope(context); |
17125 Local<Value> v = CompileRun("22"); | 17129 Local<Value> v = CompileRun("22"); |
17126 CHECK(v->IsNumber()); | 17130 CHECK(v->IsNumber()); |
17127 CHECK_EQ(22, static_cast<int>(v->NumberValue())); | 17131 CHECK_EQ(22, static_cast<int>(v->NumberValue())); |
17128 } | 17132 } |
17129 isolate->Dispose(); | |
17130 } | 17133 } |
17131 | 17134 |
17132 class InitDefaultIsolateThread : public v8::internal::Thread { | 17135 class InitDefaultIsolateThread : public v8::internal::Thread { |
17133 public: | 17136 public: |
17134 enum TestCase { | 17137 enum TestCase { |
17135 IgnoreOOM, | 17138 IgnoreOOM, |
17136 SetResourceConstraints, | 17139 SetResourceConstraints, |
17137 SetFatalHandler, | 17140 SetFatalHandler, |
17138 SetCounterFunction, | 17141 SetCounterFunction, |
17139 SetCreateHistogramFunction, | 17142 SetCreateHistogramFunction, |
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18008 char buffer[10]; | 18011 char buffer[10]; |
18009 CHECK_EQ(10, name->ToString()->WriteUtf8(buffer)); | 18012 CHECK_EQ(10, name->ToString()->WriteUtf8(buffer)); |
18010 return strncmp(buffer, "__proto__", 9) != 0; | 18013 return strncmp(buffer, "__proto__", 9) != 0; |
18011 } | 18014 } |
18012 | 18015 |
18013 return true; | 18016 return true; |
18014 } | 18017 } |
18015 | 18018 |
18016 | 18019 |
18017 THREADED_TEST(Regress93759) { | 18020 THREADED_TEST(Regress93759) { |
18018 HandleScope scope(v8::Isolate::GetCurrent()); | 18021 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 18022 HandleScope scope(isolate); |
18019 | 18023 |
18020 // Template for object with security check. | 18024 // Template for object with security check. |
18021 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); | 18025 Local<ObjectTemplate> no_proto_template = v8::ObjectTemplate::New(); |
18022 // We don't do indexing, so any callback can be used for that. | 18026 // We don't do indexing, so any callback can be used for that. |
18023 no_proto_template->SetAccessCheckCallbacks( | 18027 no_proto_template->SetAccessCheckCallbacks( |
18024 BlockProtoNamedSecurityTestCallback, | 18028 BlockProtoNamedSecurityTestCallback, |
18025 IndexedSecurityTestCallback); | 18029 IndexedSecurityTestCallback); |
18026 | 18030 |
18027 // Templates for objects with hidden prototypes and possibly security check. | 18031 // Templates for objects with hidden prototypes and possibly security check. |
18028 Local<FunctionTemplate> hidden_proto_template = v8::FunctionTemplate::New(); | 18032 Local<FunctionTemplate> hidden_proto_template = v8::FunctionTemplate::New(); |
18029 hidden_proto_template->SetHiddenPrototype(true); | 18033 hidden_proto_template->SetHiddenPrototype(true); |
18030 | 18034 |
18031 Local<FunctionTemplate> protected_hidden_proto_template = | 18035 Local<FunctionTemplate> protected_hidden_proto_template = |
18032 v8::FunctionTemplate::New(); | 18036 v8::FunctionTemplate::New(); |
18033 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( | 18037 protected_hidden_proto_template->InstanceTemplate()->SetAccessCheckCallbacks( |
18034 BlockProtoNamedSecurityTestCallback, | 18038 BlockProtoNamedSecurityTestCallback, |
18035 IndexedSecurityTestCallback); | 18039 IndexedSecurityTestCallback); |
18036 protected_hidden_proto_template->SetHiddenPrototype(true); | 18040 protected_hidden_proto_template->SetHiddenPrototype(true); |
18037 | 18041 |
18038 // Context for "foreign" objects used in test. | 18042 // Context for "foreign" objects used in test. |
18039 Persistent<Context> context = v8::Context::New(); | 18043 Local<Context> context = v8::Context::New(isolate); |
18040 context->Enter(); | 18044 context->Enter(); |
18041 | 18045 |
18042 // Plain object, no security check. | 18046 // Plain object, no security check. |
18043 Local<Object> simple_object = Object::New(); | 18047 Local<Object> simple_object = Object::New(); |
18044 | 18048 |
18045 // Object with explicit security check. | 18049 // Object with explicit security check. |
18046 Local<Object> protected_object = | 18050 Local<Object> protected_object = |
18047 no_proto_template->NewInstance(); | 18051 no_proto_template->NewInstance(); |
18048 | 18052 |
18049 // JSGlobalProxy object, always have security check. | 18053 // JSGlobalProxy object, always have security check. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18093 | 18097 |
18094 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); | 18098 Local<Value> result4 = CompileRun("Object.getPrototypeOf(proxy)"); |
18095 CHECK(result4->Equals(Undefined())); | 18099 CHECK(result4->Equals(Undefined())); |
18096 | 18100 |
18097 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); | 18101 Local<Value> result5 = CompileRun("Object.getPrototypeOf(hidden)"); |
18098 CHECK(result5->Equals( | 18102 CHECK(result5->Equals( |
18099 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); | 18103 object_with_hidden->GetPrototype()->ToObject()->GetPrototype())); |
18100 | 18104 |
18101 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); | 18105 Local<Value> result6 = CompileRun("Object.getPrototypeOf(phidden)"); |
18102 CHECK(result6->Equals(Undefined())); | 18106 CHECK(result6->Equals(Undefined())); |
18103 | |
18104 context.Dispose(context->GetIsolate()); | |
18105 } | 18107 } |
18106 | 18108 |
18107 | 18109 |
18108 THREADED_TEST(Regress125988) { | 18110 THREADED_TEST(Regress125988) { |
18109 v8::HandleScope scope(v8::Isolate::GetCurrent()); | 18111 v8::HandleScope scope(v8::Isolate::GetCurrent()); |
18110 Handle<FunctionTemplate> intercept = FunctionTemplate::New(); | 18112 Handle<FunctionTemplate> intercept = FunctionTemplate::New(); |
18111 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); | 18113 AddInterceptor(intercept, EmptyInterceptorGetter, EmptyInterceptorSetter); |
18112 LocalContext env; | 18114 LocalContext env; |
18113 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); | 18115 env->Global()->Set(v8_str("Intercept"), intercept->GetFunction()); |
18114 CompileRun("var a = new Object();" | 18116 CompileRun("var a = new Object();" |
(...skipping 18 matching lines...) Expand all Loading... |
18133 Local<Value> expected_receiver, | 18135 Local<Value> expected_receiver, |
18134 const char* code) { | 18136 const char* code) { |
18135 Local<Value> result = CompileRun(code); | 18137 Local<Value> result = CompileRun(code); |
18136 CHECK(result->IsObject()); | 18138 CHECK(result->IsObject()); |
18137 CHECK(expected_receiver->Equals(result->ToObject()->Get(1))); | 18139 CHECK(expected_receiver->Equals(result->ToObject()->Get(1))); |
18138 CHECK(expected_result->Equals(result->ToObject()->Get(0))); | 18140 CHECK(expected_result->Equals(result->ToObject()->Get(0))); |
18139 } | 18141 } |
18140 | 18142 |
18141 | 18143 |
18142 THREADED_TEST(ForeignFunctionReceiver) { | 18144 THREADED_TEST(ForeignFunctionReceiver) { |
18143 HandleScope scope(v8::Isolate::GetCurrent()); | 18145 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 18146 HandleScope scope(isolate); |
18144 | 18147 |
18145 // Create two contexts with different "id" properties ('i' and 'o'). | 18148 // Create two contexts with different "id" properties ('i' and 'o'). |
18146 // Call a function both from its own context and from a the foreign | 18149 // Call a function both from its own context and from a the foreign |
18147 // context, and see what "this" is bound to (returning both "this" | 18150 // context, and see what "this" is bound to (returning both "this" |
18148 // and "this.id" for comparison). | 18151 // and "this.id" for comparison). |
18149 | 18152 |
18150 Persistent<Context> foreign_context = v8::Context::New(); | 18153 Local<Context> foreign_context = v8::Context::New(isolate); |
18151 foreign_context->Enter(); | 18154 foreign_context->Enter(); |
18152 Local<Value> foreign_function = | 18155 Local<Value> foreign_function = |
18153 CompileRun("function func() { return { 0: this.id, " | 18156 CompileRun("function func() { return { 0: this.id, " |
18154 " 1: this, " | 18157 " 1: this, " |
18155 " toString: function() { " | 18158 " toString: function() { " |
18156 " return this[0];" | 18159 " return this[0];" |
18157 " }" | 18160 " }" |
18158 " };" | 18161 " };" |
18159 "}" | 18162 "}" |
18160 "var id = 'i';" | 18163 "var id = 'i';" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18221 // ToString(func()) is func()[0], i.e., the returned this.id. | 18224 // ToString(func()) is func()[0], i.e., the returned this.id. |
18222 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/,func)[1]"))); | 18225 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/,func)[1]"))); |
18223 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[1]"))); | 18226 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[1]"))); |
18224 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[3]"))); | 18227 CHECK(i->Equals(CompileRun("'abcbd'.replace(/b/g,func)[3]"))); |
18225 | 18228 |
18226 // TODO(1547): Make the following also return "i". | 18229 // TODO(1547): Make the following also return "i". |
18227 // Calling with environment record as base. | 18230 // Calling with environment record as base. |
18228 TestReceiver(o, context->Global(), "func()"); | 18231 TestReceiver(o, context->Global(), "func()"); |
18229 // Calling with no base. | 18232 // Calling with no base. |
18230 TestReceiver(o, context->Global(), "(1,func)()"); | 18233 TestReceiver(o, context->Global(), "(1,func)()"); |
18231 | |
18232 foreign_context.Dispose(foreign_context->GetIsolate()); | |
18233 } | 18234 } |
18234 | 18235 |
18235 | 18236 |
18236 uint8_t callback_fired = 0; | 18237 uint8_t callback_fired = 0; |
18237 | 18238 |
18238 | 18239 |
18239 void CallCompletedCallback1() { | 18240 void CallCompletedCallback1() { |
18240 i::OS::Print("Firing callback 1.\n"); | 18241 i::OS::Print("Firing callback 1.\n"); |
18241 callback_fired ^= 1; // Toggle first bit. | 18242 callback_fired ^= 1; // Toggle first bit. |
18242 } | 18243 } |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18948 i::Semaphore* sem_; | 18949 i::Semaphore* sem_; |
18949 volatile int sem_value_; | 18950 volatile int sem_value_; |
18950 }; | 18951 }; |
18951 | 18952 |
18952 | 18953 |
18953 THREADED_TEST(SemaphoreInterruption) { | 18954 THREADED_TEST(SemaphoreInterruption) { |
18954 ThreadInterruptTest().RunTest(); | 18955 ThreadInterruptTest().RunTest(); |
18955 } | 18956 } |
18956 | 18957 |
18957 #endif // WIN32 | 18958 #endif // WIN32 |
OLD | NEW |