Revision: 12161 Author: [email protected] Date: Fri Jul 20 05:04:13 2012 Log: Merged r12088 into 3.8 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/10816002 http://code.google.com/p/v8/source/detail?r=12161 Modified: /branches/3.8/src/ic.cc /branches/3.8/src/version.cc /branches/3.8/test/cctest/test-api.cc ======================================= --- /branches/3.8/src/ic.cc Mon Jan 23 06:42:48 2012 +++ /branches/3.8/src/ic.cc Fri Jul 20 05:04:13 2012 @@ -938,6 +938,7 @@ Handle<AccessorInfo> callback = Handle<AccessorInfo>::cast(callback_object); if (v8::ToCData<Address>(callback->getter()) == 0) return; + if (!receiver->HasFastProperties()) return; code = isolate()->stub_cache()->ComputeLoadCallback( name, receiver, holder, callback); break; @@ -1174,6 +1175,7 @@ Handle<AccessorInfo> callback = Handle<AccessorInfo>::cast(callback_object); if (v8::ToCData<Address>(callback->getter()) == 0) return; + if (!receiver->HasFastProperties()) return; code = isolate()->stub_cache()->ComputeKeyedLoadCallback( name, receiver, holder, callback); break; @@ -1388,6 +1390,7 @@ Handle<AccessorInfo> callback = Handle<AccessorInfo>::cast(callback_object); if (v8::ToCData<Address>(callback->setter()) == 0) return; + if (!receiver->HasFastProperties()) return; code = isolate()->stub_cache()->ComputeStoreCallback( name, receiver, callback, strict_mode); break; ======================================= --- /branches/3.8/src/version.cc Mon Jun 11 09:27:12 2012 +++ /branches/3.8/src/version.cc Fri Jul 20 05:04:13 2012 @@ -35,7 +35,7 @@ #define MAJOR_VERSION 3 #define MINOR_VERSION 8 #define BUILD_NUMBER 9 -#define PATCH_LEVEL 24 +#define PATCH_LEVEL 25 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) #define IS_CANDIDATE_VERSION 0 ======================================= --- /branches/3.8/test/cctest/test-api.cc Wed Jan 25 23:37:54 2012 +++ /branches/3.8/test/cctest/test-api.cc Fri Jul 20 05:04:13 2012 @@ -15948,3 +15948,46 @@ v8::V8::AddCallCompletedCallback(CallCompletedCallbackException); CompileRun("throw 'first exception';"); } + + +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
