CheckPrototypes uses weak cells to embed maps.

BUG=v8:3629
LOG=N

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

Cr-Commit-Position: refs/heads/master@{#25634}
This commit is contained in:
ulan 2014-12-03 04:34:26 -08:00 committed by Commit bot
parent a48ad24a7c
commit 062a032f50
4 changed files with 38 additions and 19 deletions

View File

@ -416,11 +416,11 @@ Register PropertyHandlerCompiler::CheckPrototypes(
__ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset)); __ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
} else { } else {
Register map_reg = scratch1; Register map_reg = scratch1;
__ ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
if (depth != 1 || check == CHECK_ALL_MAPS) { if (depth != 1 || check == CHECK_ALL_MAPS) {
// CheckMap implicitly loads the map of |reg| into |map_reg|. Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK); __ CmpWeakValue(map_reg, cell, scratch2);
} else { __ b(ne, miss);
__ ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
} }
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
@ -451,7 +451,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
if (depth != 0 || check == CHECK_ALL_MAPS) { if (depth != 0 || check == CHECK_ALL_MAPS) {
// Check the holder map. // Check the holder map.
__ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK); __ ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(scratch1, cell, scratch2);
__ b(ne, miss);
} }
// Perform security check for access to the global object. // Perform security check for access to the global object.

View File

@ -461,7 +461,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
__ Ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset)); __ Ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
if (depth != 1 || check == CHECK_ALL_MAPS) { if (depth != 1 || check == CHECK_ALL_MAPS) {
__ CheckMap(map_reg, current_map, miss, DONT_DO_SMI_CHECK); Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(map_reg, cell, scratch2);
__ B(ne, miss);
} }
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
@ -494,7 +496,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// Check the holder map. // Check the holder map.
if (depth != 0 || check == CHECK_ALL_MAPS) { if (depth != 0 || check == CHECK_ALL_MAPS) {
// Check the holder map. // Check the holder map.
__ CheckMap(reg, scratch1, current_map, miss, DONT_DO_SMI_CHECK); __ Ldr(scratch1, FieldMemOperand(reg, HeapObject::kMapOffset));
Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(scratch1, cell, scratch2);
__ B(ne, miss);
} }
// Perform security check for access to the global object. // Perform security check for access to the global object.

View File

@ -415,8 +415,12 @@ Register PropertyHandlerCompiler::CheckPrototypes(
reg = holder_reg; // From now on the object will be in holder_reg. reg = holder_reg; // From now on the object will be in holder_reg.
__ mov(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); __ mov(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
} else { } else {
Register map_reg = scratch1;
__ mov(map_reg, FieldOperand(reg, HeapObject::kMapOffset));
if (depth != 1 || check == CHECK_ALL_MAPS) { if (depth != 1 || check == CHECK_ALL_MAPS) {
__ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK); Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(map_reg, cell, scratch2);
__ j(not_equal, miss);
} }
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
@ -426,15 +430,15 @@ Register PropertyHandlerCompiler::CheckPrototypes(
// global proxy (as opposed to using slow ICs). See corresponding code // global proxy (as opposed to using slow ICs). See corresponding code
// in LookupForRead(). // in LookupForRead().
if (current_map->IsJSGlobalProxyMap()) { if (current_map->IsJSGlobalProxyMap()) {
__ CheckAccessGlobalProxy(reg, scratch1, scratch2, miss); __ CheckAccessGlobalProxy(reg, map_reg, scratch2, miss);
// Restore map_reg.
__ mov(map_reg, FieldOperand(reg, HeapObject::kMapOffset));
} else if (current_map->IsJSGlobalObjectMap()) { } else if (current_map->IsJSGlobalObjectMap()) {
GenerateCheckPropertyCell(masm(), Handle<JSGlobalObject>::cast(current), GenerateCheckPropertyCell(masm(), Handle<JSGlobalObject>::cast(current),
name, scratch2, miss); name, scratch2, miss);
} }
__ mov(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
reg = holder_reg; // From now on the object will be in holder_reg. reg = holder_reg; // From now on the object will be in holder_reg.
__ mov(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); __ mov(reg, FieldOperand(map_reg, Map::kPrototypeOffset));
} }
// Go to the next object in the prototype chain. // Go to the next object in the prototype chain.
@ -447,7 +451,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
if (depth != 0 || check == CHECK_ALL_MAPS) { if (depth != 0 || check == CHECK_ALL_MAPS) {
// Check the holder map. // Check the holder map.
__ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK); __ mov(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(scratch1, cell, scratch2);
__ j(not_equal, miss);
} }
// Perform security check for access to the global object. // Perform security check for access to the global object.

View File

@ -413,11 +413,13 @@ Register PropertyHandlerCompiler::CheckPrototypes(
reg = holder_reg; // From now on the object will be in holder_reg. reg = holder_reg; // From now on the object will be in holder_reg.
__ movp(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); __ movp(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
} else { } else {
// Save the map in scratch1 for later. Register map_reg = scratch1;
__ movp(scratch1, FieldOperand(reg, HeapObject::kMapOffset)); __ movp(map_reg, FieldOperand(reg, HeapObject::kMapOffset));
if (depth != 1 || check == CHECK_ALL_MAPS) { if (depth != 1 || check == CHECK_ALL_MAPS) {
__ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK); Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(map_reg, cell, scratch2);
__ j(not_equal, miss);
} }
// Check access rights to the global object. This has to happen after // Check access rights to the global object. This has to happen after
@ -434,7 +436,7 @@ Register PropertyHandlerCompiler::CheckPrototypes(
} }
reg = holder_reg; // From now on the object will be in holder_reg. reg = holder_reg; // From now on the object will be in holder_reg.
__ movp(reg, FieldOperand(scratch1, Map::kPrototypeOffset)); __ movp(reg, FieldOperand(map_reg, Map::kPrototypeOffset));
} }
// Go to the next object in the prototype chain. // Go to the next object in the prototype chain.
@ -446,8 +448,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
LOG(isolate(), IntEvent("check-maps-depth", depth + 1)); LOG(isolate(), IntEvent("check-maps-depth", depth + 1));
if (depth != 0 || check == CHECK_ALL_MAPS) { if (depth != 0 || check == CHECK_ALL_MAPS) {
// Check the holder map. __ movp(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
__ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK); Handle<WeakCell> cell = Map::WeakCellForMap(current_map);
__ CmpWeakValue(scratch1, cell, scratch2);
__ j(not_equal, miss);
} }
// Perform security check for access to the global object. // Perform security check for access to the global object.