| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #if V8_TARGET_ARCH_MIPS64 | 7 #if V8_TARGET_ARCH_MIPS64 |
| 8 | 8 |
| 9 // Note on Mips implementation: | 9 // Note on Mips implementation: |
| 10 // | 10 // |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 #ifdef DEBUG | 127 #ifdef DEBUG |
| 128 if (strlen(FLAG_stop_at) > 0 && | 128 if (strlen(FLAG_stop_at) > 0 && |
| 129 info->function()->name()->IsUtf8EqualTo(CStrVector(FLAG_stop_at))) { | 129 info->function()->name()->IsUtf8EqualTo(CStrVector(FLAG_stop_at))) { |
| 130 __ stop("stop-at"); | 130 __ stop("stop-at"); |
| 131 } | 131 } |
| 132 #endif | 132 #endif |
| 133 | 133 |
| 134 // Sloppy mode functions and builtins need to replace the receiver with the | 134 // Sloppy mode functions and builtins need to replace the receiver with the |
| 135 // global proxy when called as functions (without an explicit receiver | 135 // global proxy when called as functions (without an explicit receiver |
| 136 // object). | 136 // object). |
| 137 if (info->strict_mode() == SLOPPY && !info->is_native()) { | 137 if (is_sloppy(info->language_mode()) && !info->is_native()) { |
| 138 Label ok; | 138 Label ok; |
| 139 int receiver_offset = info->scope()->num_parameters() * kPointerSize; | 139 int receiver_offset = info->scope()->num_parameters() * kPointerSize; |
| 140 __ ld(at, MemOperand(sp, receiver_offset)); | 140 __ ld(at, MemOperand(sp, receiver_offset)); |
| 141 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); | 141 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); |
| 142 __ Branch(&ok, ne, a2, Operand(at)); | 142 __ Branch(&ok, ne, a2, Operand(at)); |
| 143 | 143 |
| 144 __ ld(a2, GlobalObjectOperand()); | 144 __ ld(a2, GlobalObjectOperand()); |
| 145 __ ld(a2, FieldMemOperand(a2, GlobalObject::kGlobalProxyOffset)); | 145 __ ld(a2, FieldMemOperand(a2, GlobalObject::kGlobalProxyOffset)); |
| 146 | 146 |
| 147 __ sd(a2, MemOperand(sp, receiver_offset)); | 147 __ sd(a2, MemOperand(sp, receiver_offset)); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 __ Daddu(a2, fp, | 261 __ Daddu(a2, fp, |
| 262 Operand(StandardFrameConstants::kCallerSPOffset + offset)); | 262 Operand(StandardFrameConstants::kCallerSPOffset + offset)); |
| 263 __ li(a1, Operand(Smi::FromInt(num_parameters))); | 263 __ li(a1, Operand(Smi::FromInt(num_parameters))); |
| 264 __ Push(a3, a2, a1); | 264 __ Push(a3, a2, a1); |
| 265 | 265 |
| 266 // Arguments to ArgumentsAccessStub: | 266 // Arguments to ArgumentsAccessStub: |
| 267 // function, receiver address, parameter count. | 267 // function, receiver address, parameter count. |
| 268 // The stub will rewrite receiever and parameter count if the previous | 268 // The stub will rewrite receiever and parameter count if the previous |
| 269 // stack frame was an arguments adapter frame. | 269 // stack frame was an arguments adapter frame. |
| 270 ArgumentsAccessStub::Type type; | 270 ArgumentsAccessStub::Type type; |
| 271 if (strict_mode() == STRICT) { | 271 if (is_strict(language_mode())) { |
| 272 type = ArgumentsAccessStub::NEW_STRICT; | 272 type = ArgumentsAccessStub::NEW_STRICT; |
| 273 } else if (function()->has_duplicate_parameters()) { | 273 } else if (function()->has_duplicate_parameters()) { |
| 274 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; | 274 type = ArgumentsAccessStub::NEW_SLOPPY_SLOW; |
| 275 } else { | 275 } else { |
| 276 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; | 276 type = ArgumentsAccessStub::NEW_SLOPPY_FAST; |
| 277 } | 277 } |
| 278 ArgumentsAccessStub stub(isolate(), type); | 278 ArgumentsAccessStub stub(isolate(), type); |
| 279 __ CallStub(&stub); | 279 __ CallStub(&stub); |
| 280 | 280 |
| 281 SetVar(arguments, v0, a1, a2); | 281 SetVar(arguments, v0, a1, a2); |
| (...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1275 // space for nested functions that don't need literals cloning. If | 1275 // space for nested functions that don't need literals cloning. If |
| 1276 // we're running with the --always-opt or the --prepare-always-opt | 1276 // we're running with the --always-opt or the --prepare-always-opt |
| 1277 // flag, we need to use the runtime function so that the new function | 1277 // flag, we need to use the runtime function so that the new function |
| 1278 // we are creating here gets a chance to have its code optimized and | 1278 // we are creating here gets a chance to have its code optimized and |
| 1279 // doesn't just get a copy of the existing unoptimized code. | 1279 // doesn't just get a copy of the existing unoptimized code. |
| 1280 if (!FLAG_always_opt && | 1280 if (!FLAG_always_opt && |
| 1281 !FLAG_prepare_always_opt && | 1281 !FLAG_prepare_always_opt && |
| 1282 !pretenure && | 1282 !pretenure && |
| 1283 scope()->is_function_scope() && | 1283 scope()->is_function_scope() && |
| 1284 info->num_literals() == 0) { | 1284 info->num_literals() == 0) { |
| 1285 FastNewClosureStub stub(isolate(), info->strict_mode(), info->kind()); | 1285 FastNewClosureStub stub(isolate(), info->language_mode(), info->kind()); |
| 1286 __ li(a2, Operand(info)); | 1286 __ li(a2, Operand(info)); |
| 1287 __ CallStub(&stub); | 1287 __ CallStub(&stub); |
| 1288 } else { | 1288 } else { |
| 1289 __ li(a0, Operand(info)); | 1289 __ li(a0, Operand(info)); |
| 1290 __ LoadRoot(a1, pretenure ? Heap::kTrueValueRootIndex | 1290 __ LoadRoot(a1, pretenure ? Heap::kTrueValueRootIndex |
| 1291 : Heap::kFalseValueRootIndex); | 1291 : Heap::kFalseValueRootIndex); |
| 1292 __ Push(cp, a0, a1); | 1292 __ Push(cp, a0, a1); |
| 1293 __ CallRuntime(Runtime::kNewClosure, 3); | 1293 __ CallRuntime(Runtime::kNewClosure, 3); |
| 1294 } | 1294 } |
| 1295 context()->Plug(v0); | 1295 context()->Plug(v0); |
| (...skipping 1335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2631 break; | 2631 break; |
| 2632 } | 2632 } |
| 2633 case KEYED_PROPERTY: { | 2633 case KEYED_PROPERTY: { |
| 2634 __ push(result_register()); // Preserve value. | 2634 __ push(result_register()); // Preserve value. |
| 2635 VisitForStackValue(prop->obj()); | 2635 VisitForStackValue(prop->obj()); |
| 2636 VisitForAccumulatorValue(prop->key()); | 2636 VisitForAccumulatorValue(prop->key()); |
| 2637 __ Move(StoreDescriptor::NameRegister(), result_register()); | 2637 __ Move(StoreDescriptor::NameRegister(), result_register()); |
| 2638 __ Pop(StoreDescriptor::ValueRegister(), | 2638 __ Pop(StoreDescriptor::ValueRegister(), |
| 2639 StoreDescriptor::ReceiverRegister()); | 2639 StoreDescriptor::ReceiverRegister()); |
| 2640 Handle<Code> ic = | 2640 Handle<Code> ic = |
| 2641 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2641 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2642 CallIC(ic); | 2642 CallIC(ic); |
| 2643 break; | 2643 break; |
| 2644 } | 2644 } |
| 2645 } | 2645 } |
| 2646 context()->Plug(v0); | 2646 context()->Plug(v0); |
| 2647 } | 2647 } |
| 2648 | 2648 |
| 2649 | 2649 |
| 2650 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( | 2650 void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( |
| 2651 Variable* var, MemOperand location) { | 2651 Variable* var, MemOperand location) { |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2697 __ li(a3, Operand(var->name())); | 2697 __ li(a3, Operand(var->name())); |
| 2698 __ push(a3); | 2698 __ push(a3); |
| 2699 __ CallRuntime(Runtime::kThrowReferenceError, 1); | 2699 __ CallRuntime(Runtime::kThrowReferenceError, 1); |
| 2700 // Perform the assignment. | 2700 // Perform the assignment. |
| 2701 __ bind(&assign); | 2701 __ bind(&assign); |
| 2702 EmitStoreToStackLocalOrContextSlot(var, location); | 2702 EmitStoreToStackLocalOrContextSlot(var, location); |
| 2703 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { | 2703 } else if (!var->is_const_mode() || op == Token::INIT_CONST) { |
| 2704 if (var->IsLookupSlot()) { | 2704 if (var->IsLookupSlot()) { |
| 2705 // Assignment to var. | 2705 // Assignment to var. |
| 2706 __ li(a4, Operand(var->name())); | 2706 __ li(a4, Operand(var->name())); |
| 2707 __ li(a3, Operand(Smi::FromInt(strict_mode()))); | 2707 __ li(a3, Operand(Smi::FromInt(language_mode()))); |
| 2708 // jssp[0] : mode. | 2708 // jssp[0] : language mode. |
| 2709 // jssp[8] : name. | 2709 // jssp[8] : name. |
| 2710 // jssp[16] : context. | 2710 // jssp[16] : context. |
| 2711 // jssp[24] : value. | 2711 // jssp[24] : value. |
| 2712 __ Push(v0, cp, a4, a3); | 2712 __ Push(v0, cp, a4, a3); |
| 2713 __ CallRuntime(Runtime::kStoreLookupSlot, 4); | 2713 __ CallRuntime(Runtime::kStoreLookupSlot, 4); |
| 2714 } else { | 2714 } else { |
| 2715 // Assignment to var or initializing assignment to let/const in harmony | 2715 // Assignment to var or initializing assignment to let/const in harmony |
| 2716 // mode. | 2716 // mode. |
| 2717 DCHECK((var->IsStackAllocated() || var->IsContextSlot())); | 2717 DCHECK((var->IsStackAllocated() || var->IsContextSlot())); |
| 2718 MemOperand location = VarOperand(var, a1); | 2718 MemOperand location = VarOperand(var, a1); |
| 2719 if (generate_debug_code_ && op == Token::INIT_LET) { | 2719 if (generate_debug_code_ && op == Token::INIT_LET) { |
| 2720 // Check for an uninitialized let binding. | 2720 // Check for an uninitialized let binding. |
| 2721 __ ld(a2, location); | 2721 __ ld(a2, location); |
| 2722 __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); | 2722 __ LoadRoot(a4, Heap::kTheHoleValueRootIndex); |
| 2723 __ Check(eq, kLetBindingReInitialization, a2, Operand(a4)); | 2723 __ Check(eq, kLetBindingReInitialization, a2, Operand(a4)); |
| 2724 } | 2724 } |
| 2725 EmitStoreToStackLocalOrContextSlot(var, location); | 2725 EmitStoreToStackLocalOrContextSlot(var, location); |
| 2726 } | 2726 } |
| 2727 } else if (IsSignallingAssignmentToConst(var, op, strict_mode())) { | 2727 } else if (IsSignallingAssignmentToConst(var, op, language_mode())) { |
| 2728 __ CallRuntime(Runtime::kThrowConstAssignError, 0); | 2728 __ CallRuntime(Runtime::kThrowConstAssignError, 0); |
| 2729 } | 2729 } |
| 2730 } | 2730 } |
| 2731 | 2731 |
| 2732 | 2732 |
| 2733 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { | 2733 void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) { |
| 2734 // Assignment to a property, using a named store IC. | 2734 // Assignment to a property, using a named store IC. |
| 2735 Property* prop = expr->target()->AsProperty(); | 2735 Property* prop = expr->target()->AsProperty(); |
| 2736 DCHECK(prop != NULL); | 2736 DCHECK(prop != NULL); |
| 2737 DCHECK(prop->key()->IsLiteral()); | 2737 DCHECK(prop->key()->IsLiteral()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2752 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { | 2752 void FullCodeGenerator::EmitNamedSuperPropertyStore(Property* prop) { |
| 2753 // Assignment to named property of super. | 2753 // Assignment to named property of super. |
| 2754 // v0 : value | 2754 // v0 : value |
| 2755 // stack : receiver ('this'), home_object | 2755 // stack : receiver ('this'), home_object |
| 2756 DCHECK(prop != NULL); | 2756 DCHECK(prop != NULL); |
| 2757 Literal* key = prop->key()->AsLiteral(); | 2757 Literal* key = prop->key()->AsLiteral(); |
| 2758 DCHECK(key != NULL); | 2758 DCHECK(key != NULL); |
| 2759 | 2759 |
| 2760 __ Push(key->value()); | 2760 __ Push(key->value()); |
| 2761 __ Push(v0); | 2761 __ Push(v0); |
| 2762 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreToSuper_Strict | 2762 __ CallRuntime((is_strict(language_mode()) ? Runtime::kStoreToSuper_Strict |
| 2763 : Runtime::kStoreToSuper_Sloppy), | 2763 : Runtime::kStoreToSuper_Sloppy), |
| 2764 4); | 2764 4); |
| 2765 } | 2765 } |
| 2766 | 2766 |
| 2767 | 2767 |
| 2768 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { | 2768 void FullCodeGenerator::EmitKeyedSuperPropertyStore(Property* prop) { |
| 2769 // Assignment to named property of super. | 2769 // Assignment to named property of super. |
| 2770 // v0 : value | 2770 // v0 : value |
| 2771 // stack : receiver ('this'), home_object, key | 2771 // stack : receiver ('this'), home_object, key |
| 2772 DCHECK(prop != NULL); | 2772 DCHECK(prop != NULL); |
| 2773 | 2773 |
| 2774 __ Push(v0); | 2774 __ Push(v0); |
| 2775 __ CallRuntime((strict_mode() == STRICT ? Runtime::kStoreKeyedToSuper_Strict | 2775 __ CallRuntime( |
| 2776 : Runtime::kStoreKeyedToSuper_Sloppy), | 2776 (is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict |
| 2777 4); | 2777 : Runtime::kStoreKeyedToSuper_Sloppy), |
| 2778 4); |
| 2778 } | 2779 } |
| 2779 | 2780 |
| 2780 | 2781 |
| 2781 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { | 2782 void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) { |
| 2782 // Assignment to a property, using a keyed store IC. | 2783 // Assignment to a property, using a keyed store IC. |
| 2783 | 2784 |
| 2784 // Record source code position before IC call. | 2785 // Record source code position before IC call. |
| 2785 SetSourcePosition(expr->position()); | 2786 SetSourcePosition(expr->position()); |
| 2786 // Call keyed store IC. | 2787 // Call keyed store IC. |
| 2787 // The arguments are: | 2788 // The arguments are: |
| 2788 // - a0 is the value, | 2789 // - a0 is the value, |
| 2789 // - a1 is the key, | 2790 // - a1 is the key, |
| 2790 // - a2 is the receiver. | 2791 // - a2 is the receiver. |
| 2791 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 2792 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 2792 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); | 2793 __ Pop(StoreDescriptor::ReceiverRegister(), StoreDescriptor::NameRegister()); |
| 2793 DCHECK(StoreDescriptor::ValueRegister().is(a0)); | 2794 DCHECK(StoreDescriptor::ValueRegister().is(a0)); |
| 2794 | 2795 |
| 2795 Handle<Code> ic = CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 2796 Handle<Code> ic = |
| 2797 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 2796 CallIC(ic, expr->AssignmentFeedbackId()); | 2798 CallIC(ic, expr->AssignmentFeedbackId()); |
| 2797 | 2799 |
| 2798 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 2800 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 2799 context()->Plug(v0); | 2801 context()->Plug(v0); |
| 2800 } | 2802 } |
| 2801 | 2803 |
| 2802 | 2804 |
| 2803 void FullCodeGenerator::VisitProperty(Property* expr) { | 2805 void FullCodeGenerator::VisitProperty(Property* expr) { |
| 2804 Comment cmnt(masm_, "[ Property"); | 2806 Comment cmnt(masm_, "[ Property"); |
| 2805 Expression* key = expr->key(); | 2807 Expression* key = expr->key(); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3002 __ LoadRoot(a7, Heap::kUndefinedValueRootIndex); | 3004 __ LoadRoot(a7, Heap::kUndefinedValueRootIndex); |
| 3003 } | 3005 } |
| 3004 | 3006 |
| 3005 // a6: the receiver of the enclosing function. | 3007 // a6: the receiver of the enclosing function. |
| 3006 __ ld(a6, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); | 3008 __ ld(a6, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); |
| 3007 | 3009 |
| 3008 // a5: the receiver of the enclosing function. | 3010 // a5: the receiver of the enclosing function. |
| 3009 int receiver_offset = 2 + info_->scope()->num_parameters(); | 3011 int receiver_offset = 2 + info_->scope()->num_parameters(); |
| 3010 __ ld(a5, MemOperand(fp, receiver_offset * kPointerSize)); | 3012 __ ld(a5, MemOperand(fp, receiver_offset * kPointerSize)); |
| 3011 | 3013 |
| 3012 // a4: the strict mode. | 3014 // a4: the language mode. |
| 3013 __ li(a4, Operand(Smi::FromInt(strict_mode()))); | 3015 __ li(a4, Operand(Smi::FromInt(language_mode()))); |
| 3014 | 3016 |
| 3015 // a1: the start position of the scope the calls resides in. | 3017 // a1: the start position of the scope the calls resides in. |
| 3016 __ li(a1, Operand(Smi::FromInt(scope()->start_position()))); | 3018 __ li(a1, Operand(Smi::FromInt(scope()->start_position()))); |
| 3017 | 3019 |
| 3018 // Do the runtime call. | 3020 // Do the runtime call. |
| 3019 __ Push(a7); | 3021 __ Push(a7); |
| 3020 __ Push(a6, a5, a4, a1); | 3022 __ Push(a6, a5, a4, a1); |
| 3021 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 6); | 3023 __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 6); |
| 3022 } | 3024 } |
| 3023 | 3025 |
| (...skipping 1544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4568 void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { | 4570 void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |
| 4569 switch (expr->op()) { | 4571 switch (expr->op()) { |
| 4570 case Token::DELETE: { | 4572 case Token::DELETE: { |
| 4571 Comment cmnt(masm_, "[ UnaryOperation (DELETE)"); | 4573 Comment cmnt(masm_, "[ UnaryOperation (DELETE)"); |
| 4572 Property* property = expr->expression()->AsProperty(); | 4574 Property* property = expr->expression()->AsProperty(); |
| 4573 VariableProxy* proxy = expr->expression()->AsVariableProxy(); | 4575 VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| 4574 | 4576 |
| 4575 if (property != NULL) { | 4577 if (property != NULL) { |
| 4576 VisitForStackValue(property->obj()); | 4578 VisitForStackValue(property->obj()); |
| 4577 VisitForStackValue(property->key()); | 4579 VisitForStackValue(property->key()); |
| 4578 __ li(a1, Operand(Smi::FromInt(strict_mode()))); | 4580 __ li(a1, Operand(Smi::FromInt(language_mode()))); |
| 4579 __ push(a1); | 4581 __ push(a1); |
| 4580 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); | 4582 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
| 4581 context()->Plug(v0); | 4583 context()->Plug(v0); |
| 4582 } else if (proxy != NULL) { | 4584 } else if (proxy != NULL) { |
| 4583 Variable* var = proxy->var(); | 4585 Variable* var = proxy->var(); |
| 4584 // Delete of an unqualified identifier is disallowed in strict mode | 4586 // Delete of an unqualified identifier is disallowed in strict mode |
| 4585 // but "delete this" is allowed. | 4587 // but "delete this" is allowed. |
| 4586 DCHECK(strict_mode() == SLOPPY || var->is_this()); | 4588 DCHECK(is_sloppy(language_mode()) || var->is_this()); |
| 4587 if (var->IsUnallocated()) { | 4589 if (var->IsUnallocated()) { |
| 4588 __ ld(a2, GlobalObjectOperand()); | 4590 __ ld(a2, GlobalObjectOperand()); |
| 4589 __ li(a1, Operand(var->name())); | 4591 __ li(a1, Operand(var->name())); |
| 4590 __ li(a0, Operand(Smi::FromInt(SLOPPY))); | 4592 __ li(a0, Operand(Smi::FromInt(SLOPPY))); |
| 4591 __ Push(a2, a1, a0); | 4593 __ Push(a2, a1, a0); |
| 4592 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); | 4594 __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION); |
| 4593 context()->Plug(v0); | 4595 context()->Plug(v0); |
| 4594 } else if (var->IsStackAllocated() || var->IsContextSlot()) { | 4596 } else if (var->IsStackAllocated() || var->IsContextSlot()) { |
| 4595 // Result of deleting non-global, non-dynamic variables is false. | 4597 // Result of deleting non-global, non-dynamic variables is false. |
| 4596 // The subexpression does not have side effects. | 4598 // The subexpression does not have side effects. |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4899 } else { | 4901 } else { |
| 4900 context()->Plug(v0); | 4902 context()->Plug(v0); |
| 4901 } | 4903 } |
| 4902 break; | 4904 break; |
| 4903 } | 4905 } |
| 4904 case KEYED_PROPERTY: { | 4906 case KEYED_PROPERTY: { |
| 4905 __ mov(StoreDescriptor::ValueRegister(), result_register()); | 4907 __ mov(StoreDescriptor::ValueRegister(), result_register()); |
| 4906 __ Pop(StoreDescriptor::ReceiverRegister(), | 4908 __ Pop(StoreDescriptor::ReceiverRegister(), |
| 4907 StoreDescriptor::NameRegister()); | 4909 StoreDescriptor::NameRegister()); |
| 4908 Handle<Code> ic = | 4910 Handle<Code> ic = |
| 4909 CodeFactory::KeyedStoreIC(isolate(), strict_mode()).code(); | 4911 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 4910 CallIC(ic, expr->CountStoreFeedbackId()); | 4912 CallIC(ic, expr->CountStoreFeedbackId()); |
| 4911 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); | 4913 PrepareForBailoutForId(expr->AssignmentId(), TOS_REG); |
| 4912 if (expr->is_postfix()) { | 4914 if (expr->is_postfix()) { |
| 4913 if (!context()->IsEffect()) { | 4915 if (!context()->IsEffect()) { |
| 4914 context()->PlugTOS(); | 4916 context()->PlugTOS(); |
| 4915 } | 4917 } |
| 4916 } else { | 4918 } else { |
| 4917 context()->Plug(v0); | 4919 context()->Plug(v0); |
| 4918 } | 4920 } |
| 4919 break; | 4921 break; |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5361 Assembler::target_address_at(pc_immediate_load_address)) == | 5363 Assembler::target_address_at(pc_immediate_load_address)) == |
| 5362 reinterpret_cast<uint64_t>( | 5364 reinterpret_cast<uint64_t>( |
| 5363 isolate->builtins()->OsrAfterStackCheck()->entry())); | 5365 isolate->builtins()->OsrAfterStackCheck()->entry())); |
| 5364 return OSR_AFTER_STACK_CHECK; | 5366 return OSR_AFTER_STACK_CHECK; |
| 5365 } | 5367 } |
| 5366 | 5368 |
| 5367 | 5369 |
| 5368 } } // namespace v8::internal | 5370 } } // namespace v8::internal |
| 5369 | 5371 |
| 5370 #endif // V8_TARGET_ARCH_MIPS64 | 5372 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |