| Index: src/compiler/instruction.h | 
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h | 
| index 6ad2548b8e7a8e351b6fd1c5c1498731b090f084..d04d0367f5e62c6c788434e216b5ed4b45b4c68e 100644 | 
| --- a/src/compiler/instruction.h | 
| +++ b/src/compiler/instruction.h | 
| @@ -60,6 +60,10 @@ class InstructionOperand { | 
| ConvertTo(kind, index); | 
| } | 
|  | 
| +  static InstructionOperand* New(Zone* zone, Kind kind, int index) { | 
| +    return New(zone, InstructionOperand(kind, index)); | 
| +  } | 
| + | 
| Kind kind() const { return KindField::decode(value_); } | 
| int index() const { return static_cast<int>(value_) >> KindField::kSize; } | 
| #define INSTRUCTION_OPERAND_PREDICATE(name, type) \ | 
| @@ -80,14 +84,13 @@ class InstructionOperand { | 
| if (kind != UNALLOCATED) virtual_register_ = kInvalidVirtualRegister; | 
| } | 
|  | 
| -  // TODO(dcarney): get rid of these | 
| -  void* operator new(size_t, void* location) { return location; } | 
| -  void* operator new(size_t size, Zone* zone) { | 
| -    return zone->New(static_cast<int>(size)); | 
| + protected: | 
| +  template <typename SubKindOperand> | 
| +  static SubKindOperand* New(Zone* zone, const SubKindOperand& op) { | 
| +    void* buffer = zone->New(sizeof(op)); | 
| +    return new (buffer) SubKindOperand(op); | 
| } | 
| -  void operator delete(void* pointer, Zone* zone) { UNREACHABLE(); } | 
|  | 
| - protected: | 
| InstructionOperand(Kind kind, int index, int virtual_register) | 
| : virtual_register_(virtual_register) { | 
| ConvertTo(kind, index); | 
| @@ -166,8 +169,10 @@ class UnallocatedOperand : public InstructionOperand { | 
| value_ |= LifetimeField::encode(lifetime); | 
| } | 
|  | 
| +  UnallocatedOperand* Copy(Zone* zone) { return New(zone, *this); } | 
| + | 
| UnallocatedOperand* CopyUnconstrained(Zone* zone) { | 
| -    return new (zone) UnallocatedOperand(ANY, virtual_register()); | 
| +    return New(zone, UnallocatedOperand(ANY, virtual_register())); | 
| } | 
|  | 
| static const UnallocatedOperand* cast(const InstructionOperand* op) { | 
| @@ -349,7 +354,7 @@ std::ostream& operator<<(std::ostream& os, const PrintableMoveOperands& mo); | 
| : InstructionOperand(kOperandKind, index) {}                    \ | 
| \ | 
| static SubKind##Operand* New(int index, Zone* zone) {               \ | 
| -      return new (zone) SubKind##Operand(index);                        \ | 
| +      return InstructionOperand::New(zone, SubKind##Operand(index));    \ | 
| }                                                                   \ | 
| \ | 
| static SubKind##Operand* cast(InstructionOperand* op) {             \ | 
| @@ -436,7 +441,7 @@ class PointerMap FINAL : public ZoneObject { | 
| std::ostream& operator<<(std::ostream& os, const PointerMap& pm); | 
|  | 
| // TODO(titzer): s/PointerMap/ReferenceMap/ | 
| -class Instruction : public ZoneObject { | 
| +class Instruction { | 
| public: | 
| size_t OutputCount() const { return OutputCountField::decode(bit_field_); } | 
| const InstructionOperand* OutputAt(size_t i) const { | 
| @@ -535,12 +540,6 @@ class Instruction : public ZoneObject { | 
| pointer_map_ = map; | 
| } | 
|  | 
| -  // Placement new operator so that we can smash instructions into | 
| -  // zone-allocated memory. | 
| -  void* operator new(size_t, void* location) { return location; } | 
| - | 
| -  void operator delete(void* pointer, void* location) { UNREACHABLE(); } | 
| - | 
| void OverwriteWithNop() { | 
| opcode_ = ArchOpcodeField::encode(kArchNop); | 
| bit_field_ = 0; | 
| @@ -559,7 +558,6 @@ class Instruction : public ZoneObject { | 
| InstructionOperand* inputs, size_t temp_count, | 
| InstructionOperand* temps); | 
|  | 
| - protected: | 
| typedef BitField<size_t, 0, 8> OutputCountField; | 
| typedef BitField<size_t, 8, 16> InputCountField; | 
| typedef BitField<size_t, 24, 6> TempCountField; | 
| @@ -570,6 +568,9 @@ class Instruction : public ZoneObject { | 
| uint32_t bit_field_; | 
| PointerMap* pointer_map_; | 
| InstructionOperand operands_[1]; | 
| + | 
| + private: | 
| +  DISALLOW_COPY_AND_ASSIGN(Instruction); | 
| }; | 
|  | 
|  | 
|  |