diff options
Diffstat (limited to 'deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc')
-rw-r--r-- | deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc b/deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc index d9044cab45..978ae2f1c2 100644 --- a/deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc +++ b/deps/v8/src/crankshaft/ia32/lithium-codegen-ia32.cc @@ -7,6 +7,7 @@ #include "src/crankshaft/ia32/lithium-codegen-ia32.h" #include "src/base/bits.h" +#include "src/builtins/builtins-constructor.h" #include "src/code-factory.h" #include "src/code-stubs.h" #include "src/codegen.h" @@ -176,15 +177,18 @@ void LCodeGen::DoPrologue(LPrologue* instr) { __ CallRuntime(Runtime::kNewScriptContext); deopt_mode = Safepoint::kLazyDeopt; } else { - if (slots <= FastNewFunctionContextStub::kMaximumSlots) { - FastNewFunctionContextStub stub(isolate()); + if (slots <= + ConstructorBuiltinsAssembler::MaximumFunctionContextSlots()) { + Callable callable = CodeFactory::FastNewFunctionContext( + isolate(), info()->scope()->scope_type()); __ mov(FastNewFunctionContextDescriptor::SlotsRegister(), Immediate(slots)); - __ CallStub(&stub); - // Result of FastNewFunctionContextStub is always in new space. + __ Call(callable.code(), RelocInfo::CODE_TARGET); + // Result of the FastNewFunctionContext builtin is always in new space. need_write_barrier = false; } else { - __ push(edi); + __ Push(edi); + __ Push(Smi::FromInt(info()->scope()->scope_type())); __ CallRuntime(Runtime::kNewFunctionContext); } } @@ -2762,9 +2766,9 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { // Normal function. Replace undefined or null with global receiver. __ cmp(receiver, factory()->null_value()); - __ j(equal, &global_object, Label::kNear); + __ j(equal, &global_object, dist); __ cmp(receiver, factory()->undefined_value()); - __ j(equal, &global_object, Label::kNear); + __ j(equal, &global_object, dist); // The receiver should be a JS object. __ test(receiver, Immediate(kSmiTagMask)); @@ -2772,7 +2776,7 @@ void LCodeGen::DoWrapReceiver(LWrapReceiver* instr) { __ CmpObjectType(receiver, FIRST_JS_RECEIVER_TYPE, scratch); DeoptimizeIf(below, instr, DeoptimizeReason::kNotAJavaScriptObject); - __ jmp(&receiver_ok, Label::kNear); + __ jmp(&receiver_ok, dist); __ bind(&global_object); __ mov(receiver, FieldOperand(function, JSFunction::kContextOffset)); __ mov(receiver, ContextOperand(receiver, Context::NATIVE_CONTEXT_INDEX)); @@ -2869,7 +2873,7 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { DCHECK(ToRegister(instr->context()).is(esi)); - __ push(Immediate(instr->hydrogen()->pairs())); + __ push(Immediate(instr->hydrogen()->declarations())); __ push(Immediate(Smi::FromInt(instr->hydrogen()->flags()))); __ push(Immediate(instr->hydrogen()->feedback_vector())); CallRuntime(Runtime::kDeclareGlobals, instr); @@ -3855,13 +3859,18 @@ void LCodeGen::DoDeferredMaybeGrowElements(LMaybeGrowElements* instr) { if (Smi::IsValid(int_key)) { __ mov(ebx, Immediate(Smi::FromInt(int_key))); } else { - // We should never get here at runtime because there is a smi check on - // the key before this point. - __ int3(); + Abort(kArrayIndexConstantValueTooBig); } } else { + Label is_smi; __ Move(ebx, ToRegister(key)); __ SmiTag(ebx); + // Deopt if the key is outside Smi range. The stub expects Smi and would + // bump the elements into dictionary mode (and trigger a deopt) anyways. + __ j(no_overflow, &is_smi); + __ PopSafepointRegisters(); + DeoptimizeIf(no_condition, instr, DeoptimizeReason::kOverflow); + __ bind(&is_smi); } GrowArrayElementsStub stub(isolate(), instr->hydrogen()->kind()); |