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));
|
__ 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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
Loading…
Reference in New Issue
Block a user