| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index d7c0eb059ed249831f4ec7462fca1348e21b6097..75305ec6112ffb17df2c6e8d45a10896b83c90d7 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -3449,28 +3449,45 @@ class HLoadContextSlot: public HUnaryOperation {
|
| public:
|
| enum Mode {
|
| // Perform a normal load of the context slot without checking its value.
|
| - kLoad,
|
| + kNoCheck,
|
| // Load and check the value of the context slot. Deoptimize if it's the
|
| // hole value. This is used for checking for loading of uninitialized
|
| // harmony bindings where we deoptimize into full-codegen generated code
|
| // which will subsequently throw a reference error.
|
| - kLoadCheck
|
| + kCheckDeoptimize,
|
| + // Load and check the value of the context slot. Return undefined if it's
|
| + // the hole value. This is used for non-harmony const assignments
|
| + kCheckReturnUndefined
|
| };
|
|
|
| HLoadContextSlot(HValue* context, Variable* var)
|
| : HUnaryOperation(context), slot_index_(var->index()) {
|
| ASSERT(var->IsContextSlot());
|
| - mode_ = (var->mode() == LET || var->mode() == CONST_HARMONY)
|
| - ? kLoadCheck : kLoad;
|
| + switch (var->mode()) {
|
| + case LET:
|
| + case CONST_HARMONY:
|
| + mode_ = kCheckDeoptimize;
|
| + break;
|
| + case CONST:
|
| + mode_ = kCheckReturnUndefined;
|
| + break;
|
| + default:
|
| + mode_ = kNoCheck;
|
| + }
|
| set_representation(Representation::Tagged());
|
| SetFlag(kUseGVN);
|
| SetFlag(kDependsOnContextSlots);
|
| }
|
|
|
| int slot_index() const { return slot_index_; }
|
| + Mode mode() const { return mode_; }
|
| +
|
| + bool DeoptimizesOnHole() {
|
| + return mode_ == kCheckDeoptimize;
|
| + }
|
|
|
| bool RequiresHoleCheck() {
|
| - return mode_ == kLoadCheck;
|
| + return mode_ != kNoCheck;
|
| }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) {
|
| @@ -3498,12 +3515,14 @@ class HStoreContextSlot: public HTemplateInstruction<2> {
|
| enum Mode {
|
| // Perform a normal store to the context slot without checking its previous
|
| // value.
|
| - kAssign,
|
| + kNoCheck,
|
| // Check the previous value of the context slot and deoptimize if it's the
|
| // hole value. This is used for checking for assignments to uninitialized
|
| // harmony bindings where we deoptimize into full-codegen generated code
|
| // which will subsequently throw a reference error.
|
| - kAssignCheck
|
| + kCheckDeoptimize,
|
| + // Check the previous value and ignore assignment if it isn't a hole value
|
| + kCheckIgnoreAssignment
|
| };
|
|
|
| HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value)
|
| @@ -3522,8 +3541,12 @@ class HStoreContextSlot: public HTemplateInstruction<2> {
|
| return StoringValueNeedsWriteBarrier(value());
|
| }
|
|
|
| + bool DeoptimizesOnHole() {
|
| + return mode_ == kCheckDeoptimize;
|
| + }
|
| +
|
| bool RequiresHoleCheck() {
|
| - return mode_ == kAssignCheck;
|
| + return mode_ != kNoCheck;
|
| }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) {
|
|
|