Restore performance of accesses to JSGlobalProxy after r22802

R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/446523002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22857 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 5a2de1fc
...@@ -740,8 +740,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -740,8 +740,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -768,6 +768,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -768,6 +768,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
...@@ -691,8 +691,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -691,8 +691,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -724,6 +724,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -724,6 +724,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
UseScratchRegisterScope temps(masm()); UseScratchRegisterScope temps(masm());
__ CheckAccessGlobalProxy(reg, scratch2, temps.AcquireX(), miss); __ CheckAccessGlobalProxy(reg, scratch2, temps.AcquireX(), miss);
......
...@@ -708,8 +708,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -708,8 +708,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -738,6 +738,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -738,6 +738,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch1, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch1, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
...@@ -211,6 +211,12 @@ static void LookupForRead(LookupIterator* it) { ...@@ -211,6 +211,12 @@ static void LookupForRead(LookupIterator* it) {
break; break;
} }
case LookupIterator::ACCESS_CHECK: case LookupIterator::ACCESS_CHECK:
// PropertyHandlerCompiler::CheckPrototypes() knows how to emit
// access checks for global proxies.
if (it->GetHolder<JSObject>()->IsJSGlobalProxy() &&
it->HasAccess(v8::ACCESS_GET)) {
break;
}
return; return;
case LookupIterator::PROPERTY: case LookupIterator::PROPERTY:
if (it->HasProperty()) return; // Yay! if (it->HasProperty()) return; // Yay!
......
...@@ -739,8 +739,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -739,8 +739,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -767,6 +767,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -767,6 +767,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
...@@ -743,8 +743,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -743,8 +743,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -777,6 +777,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -777,6 +777,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
...@@ -651,8 +651,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -651,8 +651,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -685,6 +685,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -685,6 +685,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
...@@ -707,8 +707,8 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -707,8 +707,8 @@ Register PropertyHandlerCompiler::CheckPrototypes(
prototype = handle(JSObject::cast(current_map->prototype())); prototype = handle(JSObject::cast(current_map->prototype()));
if (current_map->is_dictionary_map() && if (current_map->is_dictionary_map() &&
!current_map->IsJSGlobalObjectMap() && !current_map->IsJSGlobalObjectMap()) {
!current_map->IsJSGlobalProxyMap()) { DCHECK(!current_map->IsJSGlobalProxyMap()); // Proxy maps are fast.
if (!name->IsUniqueName()) { if (!name->IsUniqueName()) {
DCHECK(name->IsString()); DCHECK(name->IsString());
name = factory()->InternalizeString(Handle<String>::cast(name)); name = factory()->InternalizeString(Handle<String>::cast(name));
...@@ -737,6 +737,9 @@ Register PropertyHandlerCompiler::CheckPrototypes( ...@@ -737,6 +737,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
// the map check so that we know that the object is actually a global // the map check so that we know that the object is actually a global
// object. // object.
// This allows us to install generated handlers for accesses to the
// global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch1, scratch2, miss); __ CheckAccessGlobalProxy(reg, scratch1, scratch2, miss);
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment