Revision: 12157 Author: [email protected] Date: Fri Jul 20 04:03:23 2012 Log: Merged r12088 into 3.11 branch.
Fix ICs for slow objects with native accessor. [email protected] BUG=chromium:137002 TEST=test/test-api/Regress137002[a,b] Review URL: https://chromiumcodereview.appspot.com/10809032 http://code.google.com/p/v8/source/detail?r=12157 Modified: /branches/3.11/src/ic.cc /branches/3.11/src/version.cc /branches/3.11/test/cctest/test-api.cc ======================================= --- /branches/3.11/src/ic.cc Thu Jun 14 02:26:57 2012 +++ /branches/3.11/src/ic.cc Fri Jul 20 04:03:23 2012 @@ -992,6 +992,7 @@ if (callback->IsAccessorInfo()) { Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback); if (v8::ToCData<Address>(info->getter()) == 0) return; + if (!receiver->HasFastProperties()) return; if (!info->IsCompatibleReceiver(*receiver)) return; code = isolate()->stub_cache()->ComputeLoadCallback( name, receiver, holder, info); @@ -1268,6 +1269,7 @@ Handle<AccessorInfo> callback = Handle<AccessorInfo>::cast(callback_object); if (v8::ToCData<Address>(callback->getter()) == 0) return; + if (!receiver->HasFastProperties()) return; if (!callback->IsCompatibleReceiver(*receiver)) return; code = isolate()->stub_cache()->ComputeKeyedLoadCallback( name, receiver, holder, callback); @@ -1487,6 +1489,7 @@ if (callback->IsAccessorInfo()) { Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback); if (v8::ToCData<Address>(info->setter()) == 0) return; + if (!receiver->HasFastProperties()) return; ASSERT(info->IsCompatibleReceiver(*receiver)); code = isolate()->stub_cache()->ComputeStoreCallback( name, receiver, info, strict_mode); ======================================= --- /branches/3.11/src/version.cc Wed Jul 18 06:42:43 2012 +++ /branches/3.11/src/version.cc Fri Jul 20 04:03:23 2012 @@ -35,7 +35,7 @@ #define MAJOR_VERSION 3 #define MINOR_VERSION 11 #define BUILD_NUMBER 10 -#define PATCH_LEVEL 16 +#define PATCH_LEVEL 17 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) #define IS_CANDIDATE_VERSION 0 ======================================= --- /branches/3.11/test/cctest/test-api.cc Wed Jun 13 04:51:58 2012 +++ /branches/3.11/test/cctest/test-api.cc Fri Jul 20 04:03:23 2012 @@ -16811,3 +16811,46 @@ CHECK_EQ(6, message->GetLineNumber()); } } + + +THREADED_TEST(Regress137002a) { + i::FLAG_allow_natives_syntax = true; + v8::HandleScope scope; + LocalContext context; + Local<ObjectTemplate> templ = ObjectTemplate::New(); + templ->SetAccessor(v8_str("foo"), + GetterWhichReturns42, + SetterWhichSetsYOnThisTo23); + context->Global()->Set(v8_str("obj"), templ->NewInstance()); + + // Turn monomorphic on slow object with native accessor, then turn + // polymorphic, finally optimize to create negative lookup and fail. + CompileRun("function f(x) { return x.foo; }" + "%OptimizeObjectForAddingMultipleProperties(obj, 1);" + "obj.__proto__ = null;" + "f(obj); f(obj); f({});" + "%OptimizeFunctionOnNextCall(f);" + "var result = f(obj);"); + CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value()); +} + + +THREADED_TEST(Regress137002b) { + i::FLAG_allow_natives_syntax = true; + v8::HandleScope scope; + LocalContext context; + Local<ObjectTemplate> templ = ObjectTemplate::New(); + templ->SetAccessor(v8_str("foo"), + GetterWhichReturns42, + SetterWhichSetsYOnThisTo23); + context->Global()->Set(v8_str("obj"), templ->NewInstance()); + + // Turn monomorphic on slow object with native accessor, then just + // delete the property and fail. + CompileRun("function f(x) { return x.foo; }" + "%OptimizeObjectForAddingMultipleProperties(obj, 1);" + "obj.__proto__ = null;" + "f(obj); f(obj); delete obj.foo;" + "var result = f(obj);"); + CHECK(context->Global()->Get(v8_str("result"))->IsUndefined()); +} -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
