| Index: src/arm/stub-cache-arm.cc
|
| ===================================================================
|
| --- src/arm/stub-cache-arm.cc (revision 12276)
|
| +++ src/arm/stub-cache-arm.cc (working copy)
|
| @@ -1230,6 +1230,42 @@
|
| }
|
|
|
|
|
| +void StubCompiler::GenerateDictionaryLoadCallback(Register receiver,
|
| + Register name_reg,
|
| + Register scratch1,
|
| + Register scratch2,
|
| + Register scratch3,
|
| + Handle<AccessorInfo> callback,
|
| + Handle<String> name,
|
| + Label* miss) {
|
| + Register dictionary = scratch1;
|
| + Register index = scratch2;
|
| + __ ldr(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset));
|
| +
|
| + // Probe the dictionary.
|
| + Label probe_done;
|
| + StringDictionaryLookupStub::GeneratePositiveLookup(masm(),
|
| + miss,
|
| + &probe_done,
|
| + dictionary,
|
| + name_reg,
|
| + index, // Set if we hit.
|
| + scratch3);
|
| + __ bind(&probe_done);
|
| +
|
| + // If probing finds an entry in the dictionary, check that the value is the
|
| + // callback.
|
| + const int kElementsStartOffset =
|
| + StringDictionary::kHeaderSize +
|
| + StringDictionary::kElementsStartIndex * kPointerSize;
|
| + const int kValueOffset = kElementsStartOffset + kPointerSize;
|
| + __ add(scratch1, dictionary, Operand(kValueOffset - kHeapObjectTag));
|
| + __ ldr(scratch3, MemOperand(scratch1, index, LSL, kPointerSizeLog2));
|
| + __ cmp(scratch3, Operand(callback));
|
| + __ b(ne, miss);
|
| +}
|
| +
|
| +
|
| void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
| Register receiver,
|
| @@ -1247,6 +1283,11 @@
|
| Register reg = CheckPrototypes(object, receiver, holder, scratch1,
|
| scratch2, scratch3, name, miss);
|
|
|
| + if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
|
| + GenerateDictionaryLoadCallback(
|
| + receiver, name_reg, scratch1, scratch2, scratch3, callback, name, miss);
|
| + }
|
| +
|
| // Build AccessorInfo::args_ list on the stack and push property name below
|
| // the exit frame to make GC aware of them and store pointers to them.
|
| __ push(receiver);
|
|
|