| 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 |