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:
parent
a48ad24a7c
commit
062a032f50
@ -416,11 +416,11 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
__ ldr(reg, FieldMemOperand(scratch1, Map::kPrototypeOffset));
|
||||
} else {
|
||||
Register map_reg = scratch1;
|
||||
__ ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
|
||||
if (depth != 1 || check == CHECK_ALL_MAPS) {
|
||||
// CheckMap implicitly loads the map of |reg| into |map_reg|.
|
||||
__ CheckMap(reg, map_reg, current_map, miss, DONT_DO_SMI_CHECK);
|
||||
} else {
|
||||
__ ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
|
||||
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
|
||||
@ -451,7 +451,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
|
||||
if (depth != 0 || check == CHECK_ALL_MAPS) {
|
||||
// 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.
|
||||
|
@ -461,7 +461,9 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
__ Ldr(map_reg, FieldMemOperand(reg, HeapObject::kMapOffset));
|
||||
|
||||
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
|
||||
@ -494,7 +496,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
// Check the holder map.
|
||||
if (depth != 0 || check == CHECK_ALL_MAPS) {
|
||||
// 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.
|
||||
|
@ -415,8 +415,12 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
reg = holder_reg; // From now on the object will be in holder_reg.
|
||||
__ mov(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
|
||||
} else {
|
||||
Register map_reg = scratch1;
|
||||
__ mov(map_reg, FieldOperand(reg, HeapObject::kMapOffset));
|
||||
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
|
||||
@ -426,15 +430,15 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
// global proxy (as opposed to using slow ICs). See corresponding code
|
||||
// in LookupForRead().
|
||||
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()) {
|
||||
GenerateCheckPropertyCell(masm(), Handle<JSGlobalObject>::cast(current),
|
||||
name, scratch2, miss);
|
||||
}
|
||||
|
||||
__ mov(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
|
||||
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.
|
||||
@ -447,7 +451,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
|
||||
if (depth != 0 || check == CHECK_ALL_MAPS) {
|
||||
// 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.
|
||||
|
@ -413,11 +413,13 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
reg = holder_reg; // From now on the object will be in holder_reg.
|
||||
__ movp(reg, FieldOperand(scratch1, Map::kPrototypeOffset));
|
||||
} else {
|
||||
// Save the map in scratch1 for later.
|
||||
__ movp(scratch1, FieldOperand(reg, HeapObject::kMapOffset));
|
||||
Register map_reg = scratch1;
|
||||
__ movp(map_reg, FieldOperand(reg, HeapObject::kMapOffset));
|
||||
|
||||
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
|
||||
@ -434,7 +436,7 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
}
|
||||
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.
|
||||
@ -446,8 +448,10 @@ Register PropertyHandlerCompiler::CheckPrototypes(
|
||||
LOG(isolate(), IntEvent("check-maps-depth", depth + 1));
|
||||
|
||||
if (depth != 0 || check == CHECK_ALL_MAPS) {
|
||||
// Check the holder map.
|
||||
__ CheckMap(reg, current_map, miss, DONT_DO_SMI_CHECK);
|
||||
__ movp(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.
|
||||
|
Loading…
Reference in New Issue
Block a user