| OLD | NEW |
| 1 // Copyright 2007-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2008 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 6944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6955 CHECK_EQ(2, force_delete_interceptor_count); | 6955 CHECK_EQ(2, force_delete_interceptor_count); |
| 6956 CHECK_EQ(42, global->Get(some_property)->Int32Value()); | 6956 CHECK_EQ(42, global->Get(some_property)->Int32Value()); |
| 6957 // Forcing the property to be deleted should delete the value | 6957 // Forcing the property to be deleted should delete the value |
| 6958 // without calling the interceptor. | 6958 // without calling the interceptor. |
| 6959 CHECK(global->ForceDelete(some_property)); | 6959 CHECK(global->ForceDelete(some_property)); |
| 6960 CHECK(global->Get(some_property)->IsUndefined()); | 6960 CHECK(global->Get(some_property)->IsUndefined()); |
| 6961 CHECK_EQ(2, force_delete_interceptor_count); | 6961 CHECK_EQ(2, force_delete_interceptor_count); |
| 6962 } | 6962 } |
| 6963 | 6963 |
| 6964 | 6964 |
| 6965 // Make sure that forcing a delete invalidates any IC stubs, so we |
| 6966 // don't read the hole value. |
| 6967 THREADED_TEST(ForceDeleteIC) { |
| 6968 v8::HandleScope scope; |
| 6969 LocalContext context; |
| 6970 // Create a DontDelete variable on the global object. |
| 6971 CompileRun("this.__proto__ = { foo: 'horse' };" |
| 6972 "var foo = 'fish';" |
| 6973 "function f() { return foo.length; }"); |
| 6974 // Initialize the IC for foo in f. |
| 6975 CompileRun("for (var i = 0; i < 4; i++) f();"); |
| 6976 // Make sure the value of foo is correct before the deletion. |
| 6977 CHECK_EQ(4, CompileRun("f()")->Int32Value()); |
| 6978 // Force the deletion of foo. |
| 6979 CHECK(context->Global()->ForceDelete(v8_str("foo"))); |
| 6980 // Make sure the value for foo is read from the prototype, and that |
| 6981 // we don't get in trouble with reading the deleted cell value |
| 6982 // sentinel. |
| 6983 CHECK_EQ(5, CompileRun("f()")->Int32Value()); |
| 6984 } |
| 6985 |
| 6986 |
| 6965 v8::Persistent<Context> calling_context0; | 6987 v8::Persistent<Context> calling_context0; |
| 6966 v8::Persistent<Context> calling_context1; | 6988 v8::Persistent<Context> calling_context1; |
| 6967 v8::Persistent<Context> calling_context2; | 6989 v8::Persistent<Context> calling_context2; |
| 6968 | 6990 |
| 6969 | 6991 |
| 6970 // Check that the call to the callback is initiated in | 6992 // Check that the call to the callback is initiated in |
| 6971 // calling_context2, the directly calling context is calling_context1 | 6993 // calling_context2, the directly calling context is calling_context1 |
| 6972 // and the callback itself is in calling_context0. | 6994 // and the callback itself is in calling_context0. |
| 6973 static v8::Handle<Value> GetCallingContextCallback(const v8::Arguments& args) { | 6995 static v8::Handle<Value> GetCallingContextCallback(const v8::Arguments& args) { |
| 6974 ApiTestFuzzer::Fuzz(); | 6996 ApiTestFuzzer::Fuzz(); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7052 v8::HandleScope scope; | 7074 v8::HandleScope scope; |
| 7053 LocalContext context; | 7075 LocalContext context; |
| 7054 v8::Handle<v8::Object> obj = v8::Object::New(); | 7076 v8::Handle<v8::Object> obj = v8::Object::New(); |
| 7055 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); | 7077 v8::Handle<v8::FunctionTemplate> func_templ = v8::FunctionTemplate::New(); |
| 7056 v8::Handle<v8::String> foo_string = v8::String::New("foo"); | 7078 v8::Handle<v8::String> foo_string = v8::String::New("foo"); |
| 7057 obj->Set(foo_string, func_templ->GetFunction()); | 7079 obj->Set(foo_string, func_templ->GetFunction()); |
| 7058 v8::Handle<v8::Object> obj_clone = obj->Clone(); | 7080 v8::Handle<v8::Object> obj_clone = obj->Clone(); |
| 7059 obj_clone->Set(foo_string, v8::String::New("Hello")); | 7081 obj_clone->Set(foo_string, v8::String::New("Hello")); |
| 7060 CHECK(!obj->Get(foo_string)->IsUndefined()); | 7082 CHECK(!obj->Get(foo_string)->IsUndefined()); |
| 7061 } | 7083 } |
| OLD | NEW |