| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 15f128da4c7a30299e6bf385655bb281579029ea..731714138b66b82a62b8ab55032edc3596f526dd 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -441,6 +441,12 @@ MaybeObject* StubCache::ComputeKeyedLoadFunctionPrototype(
|
|
|
|
|
| MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) {
|
| + // Using NORMAL as the PropertyType for array element loads is a misuse. The
|
| + // generated stub always accesses fast elements, not slow-mode fields, but
|
| + // some property type is required for the stub lookup. Note that overloading
|
| + // the NORMAL PropertyType is only safe as long as no stubs are generated for
|
| + // other keyed field loads. This is guaranteed to be the case since all field
|
| + // keyed loads that are not array elements go through a generic builtin stub.
|
| Code::Flags flags =
|
| Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL);
|
| String* name = Heap::KeyedLoadSpecialized_symbol();
|
| @@ -461,6 +467,33 @@ MaybeObject* StubCache::ComputeKeyedLoadSpecialized(JSObject* receiver) {
|
| }
|
|
|
|
|
| +MaybeObject* StubCache::ComputeKeyedLoadPixelArray(JSObject* receiver) {
|
| + // Using NORMAL as the PropertyType for array element loads is a misuse. The
|
| + // generated stub always accesses fast elements, not slow-mode fields, but
|
| + // some property type is required for the stub lookup. Note that overloading
|
| + // the NORMAL PropertyType is only safe as long as no stubs are generated for
|
| + // other keyed field loads. This is guaranteed to be the case since all field
|
| + // keyed loads that are not array elements go through a generic builtin stub.
|
| + Code::Flags flags =
|
| + Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, NORMAL);
|
| + String* name = Heap::KeyedLoadPixelArray_symbol();
|
| + Object* code = receiver->map()->FindInCodeCache(name, flags);
|
| + if (code->IsUndefined()) {
|
| + KeyedLoadStubCompiler compiler;
|
| + { MaybeObject* maybe_code = compiler.CompileLoadPixelArray(receiver);
|
| + if (!maybe_code->ToObject(&code)) return maybe_code;
|
| + }
|
| + PROFILE(CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, Code::cast(code), 0));
|
| + Object* result;
|
| + { MaybeObject* maybe_result =
|
| + receiver->UpdateMapCodeCache(name, Code::cast(code));
|
| + if (!maybe_result->ToObject(&result)) return maybe_result;
|
| + }
|
| + }
|
| + return code;
|
| +}
|
| +
|
| +
|
| MaybeObject* StubCache::ComputeStoreField(String* name,
|
| JSObject* receiver,
|
| int field_index,
|
|
|