| Index: runtime/vm/assembler_x64.h
|
| ===================================================================
|
| --- runtime/vm/assembler_x64.h (revision 42717)
|
| +++ runtime/vm/assembler_x64.h (working copy)
|
| @@ -517,6 +517,7 @@
|
|
|
| void testl(Register reg1, Register reg2);
|
| void testl(Register reg, const Immediate& imm);
|
| + void testb(const Address& address, const Immediate& imm);
|
|
|
| void testq(Register reg1, Register reg2);
|
| void testq(Register reg, const Immediate& imm);
|
| @@ -756,6 +757,14 @@
|
| void PushObject(const Object& object, Register pp);
|
| void CompareObject(Register reg, const Object& object, Register pp);
|
|
|
| + // When storing into a heap object field, knowledge of the previous content
|
| + // is expressed through these constants.
|
| + enum FieldContent {
|
| + kEmptyOrSmiOrNull, // Empty = garbage/zapped in release/debug mode.
|
| + kHeapObjectOrSmi,
|
| + kOnlySmi,
|
| + };
|
| +
|
| // Destroys value.
|
| void StoreIntoObject(Register object, // Object we are storing into.
|
| const Address& dest, // Where we are storing into.
|
| @@ -764,11 +773,24 @@
|
|
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| - Register value);
|
| + Register value,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void InitializeFieldNoBarrier(Register object,
|
| + const Address& dest,
|
| + Register value) {
|
| + return StoreIntoObjectNoBarrier(object, dest, value, kEmptyOrSmiOrNull);
|
| + }
|
| void StoreIntoObjectNoBarrier(Register object,
|
| const Address& dest,
|
| const Object& value,
|
| - Register pp);
|
| + Register pp,
|
| + FieldContent old_content = kHeapObjectOrSmi);
|
| + void InitializeFieldNoBarrier(Register object,
|
| + const Address& dest,
|
| + const Object& value,
|
| + Register pp) {
|
| + return StoreIntoObjectNoBarrier(object, dest, value, pp, kEmptyOrSmiOrNull);
|
| + }
|
|
|
| // Stores a Smi value into a heap object field that always contains a Smi.
|
| void StoreIntoSmiField(const Address& dest, Register value);
|
| @@ -1110,11 +1132,17 @@
|
| void StoreIntoObjectFilterNoSmi(Register object,
|
| Register value,
|
| Label* no_update);
|
| -
|
| - // Analogous to VerifiedMemory::Verify(address, kWordSize).
|
| - void VerifyHeapWord(const Address& address);
|
| - // Analogous to VerifiedMemory::Write.
|
| - void VerifiedWrite(const Address& dest, Register value);
|
| +#if defined(DEBUG)
|
| + void VerifyUninitialized(const Address& address);
|
| + void VerifyObjectOrSmi(const Address& address);
|
| + void VerifySmi(const Address& address, const char* stop_msg = "Expected Smi");
|
| +#endif // DEBUG
|
| + // Like VerifiedMemory::Verify(address, kWordSize) and ::Write, but also,
|
| + // in DEBUG mode, verifies that 'address' has content of type 'old_content'.
|
| + void VerifyHeapWord(const Address& address, FieldContent old_content);
|
| + void VerifiedWrite(const Address& dest,
|
| + Register value,
|
| + FieldContent old_content);
|
| // Unaware of write barrier (use StoreInto* methods for storing to objects).
|
| void MoveImmediate(const Address& dst, const Immediate& imm, Register pp);
|
|
|
|
|