| Index: src/stub-cache.cc
|
| diff --git a/src/stub-cache.cc b/src/stub-cache.cc
|
| index 7b23d0c96abf9ee6a14b4d6c61a38ce33b167626..bb8a76609d1cf716f57e4cfb7eb3cfc1803f3b44 100644
|
| --- a/src/stub-cache.cc
|
| +++ b/src/stub-cache.cc
|
| @@ -243,12 +243,12 @@ Handle<Code> StubCache::ComputeLoadNonexistent(Handle<Name> name,
|
| Handle<Name> cache_name = factory()->empty_string();
|
| Handle<JSObject> current;
|
| Handle<Object> next = receiver;
|
| - Handle<GlobalObject> global;
|
| + Handle<JSGlobalObject> global;
|
| do {
|
| current = Handle<JSObject>::cast(next);
|
| next = Handle<Object>(current->GetPrototype(), isolate_);
|
| - if (current->IsGlobalObject()) {
|
| - global = Handle<GlobalObject>::cast(current);
|
| + if (current->IsJSGlobalObject()) {
|
| + global = Handle<JSGlobalObject>::cast(current);
|
| cache_name = name;
|
| } else if (!current->HasFastProperties()) {
|
| cache_name = name;
|
| @@ -1639,6 +1639,40 @@ Register BaseLoadStoreStubCompiler::HandlerFrontend(Handle<JSObject> object,
|
| }
|
|
|
|
|
| +void BaseLoadStubCompiler::NonexistentHandlerFrontend(
|
| + Handle<JSObject> object,
|
| + Handle<JSObject> last,
|
| + Handle<Name> name,
|
| + Label* success,
|
| + Handle<JSGlobalObject> global) {
|
| + Label miss;
|
| +
|
| + Register holder =
|
| + HandlerFrontendHeader(object, receiver(), last, name, &miss);
|
| +
|
| + if (!last->HasFastProperties() &&
|
| + !last->IsJSGlobalObject() &&
|
| + !last->IsJSGlobalProxy()) {
|
| + if (!name->IsUniqueName()) {
|
| + ASSERT(name->IsString());
|
| + name = factory()->InternalizeString(Handle<String>::cast(name));
|
| + }
|
| + ASSERT(last->property_dictionary()->FindEntry(*name) ==
|
| + NameDictionary::kNotFound);
|
| + GenerateDictionaryNegativeLookup(masm(), &miss, holder, name,
|
| + scratch2(), scratch3());
|
| + }
|
| +
|
| + // If the last object in the prototype chain is a global object,
|
| + // check that the global property cell is empty.
|
| + if (!global.is_null()) {
|
| + GenerateCheckPropertyCell(masm(), global, name, scratch2(), &miss);
|
| + }
|
| +
|
| + HandlerFrontendFooter(name, success, &miss);
|
| +}
|
| +
|
| +
|
| Handle<Code> BaseLoadStubCompiler::CompileLoadField(
|
| Handle<JSObject> object,
|
| Handle<JSObject> holder,
|
|
|