| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 72340658acf10243d26d24035f6e892c4884da65..85f025594f9cfb6e7e533ab872a2ed23c51a1ed2 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -39,7 +39,7 @@ namespace internal {
|
|
|
| // When invoking builtins, we need to record the safepoint in the middle of
|
| // the invoke instruction sequence generated by the macro assembler.
|
| -class SafepointGenerator : public CallWrapper {
|
| +class SafepointGenerator V8_FINAL : public CallWrapper {
|
| public:
|
| SafepointGenerator(LCodeGen* codegen,
|
| LPointerMap* pointers,
|
| @@ -47,13 +47,13 @@ class SafepointGenerator : public CallWrapper {
|
| : codegen_(codegen),
|
| pointers_(pointers),
|
| deopt_mode_(mode) { }
|
| - virtual ~SafepointGenerator() { }
|
| + virtual ~SafepointGenerator() {}
|
|
|
| - virtual void BeforeCall(int call_size) const {
|
| + virtual void BeforeCall(int call_size) const V8_OVERRIDE {
|
| codegen_->EnsureSpaceForLazyDeopt(Deoptimizer::patch_size() - call_size);
|
| }
|
|
|
| - virtual void AfterCall() const {
|
| + virtual void AfterCall() const V8_OVERRIDE {
|
| codegen_->RecordSafepoint(pointers_, deopt_mode_);
|
| }
|
|
|
| @@ -1216,6 +1216,7 @@ void LCodeGen::DoDivI(LDivI* instr) {
|
| __ cmpl(dividend, Immediate(0));
|
| __ j(less, &negative, Label::kNear);
|
| __ sarl(dividend, Immediate(power));
|
| + if (divisor < 0) __ negl(dividend);
|
| __ jmp(&done, Label::kNear);
|
|
|
| __ bind(&negative);
|
| @@ -1900,6 +1901,13 @@ void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
|
| }
|
|
|
|
|
| +template<class InstrType>
|
| +void LCodeGen::EmitFalseBranch(InstrType instr, Condition cc) {
|
| + int false_block = instr->FalseDestination(chunk_);
|
| + __ j(cc, chunk_->GetAssemblyLabel(false_block));
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoDebugBreak(LDebugBreak* instr) {
|
| __ int3();
|
| }
|
| @@ -2173,6 +2181,28 @@ void LCodeGen::DoCmpObjectEqAndBranch(LCmpObjectEqAndBranch* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoCmpHoleAndBranch(LCmpHoleAndBranch* instr) {
|
| + if (instr->hydrogen()->representation().IsTagged()) {
|
| + Register input_reg = ToRegister(instr->object());
|
| + __ Cmp(input_reg, factory()->the_hole_value());
|
| + EmitBranch(instr, equal);
|
| + return;
|
| + }
|
| +
|
| + XMMRegister input_reg = ToDoubleRegister(instr->object());
|
| + __ ucomisd(input_reg, input_reg);
|
| + EmitFalseBranch(instr, parity_odd);
|
| +
|
| + __ subq(rsp, Immediate(kDoubleSize));
|
| + __ movsd(MemOperand(rsp, 0), input_reg);
|
| + __ addq(rsp, Immediate(kDoubleSize));
|
| +
|
| + int offset = sizeof(kHoleNanUpper32);
|
| + __ cmpl(MemOperand(rsp, -offset), Immediate(kHoleNanUpper32));
|
| + EmitBranch(instr, equal);
|
| +}
|
| +
|
| +
|
| Condition LCodeGen::EmitIsObject(Register input,
|
| Label* is_not_object,
|
| Label* is_object) {
|
| @@ -2437,15 +2467,15 @@ void LCodeGen::DoInstanceOf(LInstanceOf* instr) {
|
|
|
|
|
| void LCodeGen::DoInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr) {
|
| - class DeferredInstanceOfKnownGlobal: public LDeferredCode {
|
| + class DeferredInstanceOfKnownGlobal V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredInstanceOfKnownGlobal(LCodeGen* codegen,
|
| LInstanceOfKnownGlobal* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() {
|
| + virtual void Generate() V8_OVERRIDE {
|
| codegen()->DoDeferredInstanceOfKnownGlobal(instr_, &map_check_);
|
| }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| Label* map_check() { return &map_check_; }
|
| private:
|
| LInstanceOfKnownGlobal* instr_;
|
| @@ -2764,111 +2794,6 @@ void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::EmitLoadFieldOrConstantFunction(Register result,
|
| - Register object,
|
| - Handle<Map> type,
|
| - Handle<String> name,
|
| - LEnvironment* env) {
|
| - LookupResult lookup(isolate());
|
| - type->LookupDescriptor(NULL, *name, &lookup);
|
| - ASSERT(lookup.IsFound() || lookup.IsCacheable());
|
| - if (lookup.IsField()) {
|
| - int index = lookup.GetLocalFieldIndexFromMap(*type);
|
| - int offset = index * kPointerSize;
|
| - if (index < 0) {
|
| - // Negative property indices are in-object properties, indexed
|
| - // from the end of the fixed part of the object.
|
| - __ movq(result, FieldOperand(object, offset + type->instance_size()));
|
| - } else {
|
| - // Non-negative property indices are in the properties array.
|
| - __ movq(result, FieldOperand(object, JSObject::kPropertiesOffset));
|
| - __ movq(result, FieldOperand(result, offset + FixedArray::kHeaderSize));
|
| - }
|
| - } else if (lookup.IsConstant()) {
|
| - Handle<Object> constant(lookup.GetConstantFromMap(*type), isolate());
|
| - __ LoadObject(result, constant);
|
| - } else {
|
| - // Negative lookup.
|
| - // Check prototypes.
|
| - Handle<HeapObject> current(HeapObject::cast((*type)->prototype()));
|
| - Heap* heap = type->GetHeap();
|
| - while (*current != heap->null_value()) {
|
| - __ LoadHeapObject(result, current);
|
| - __ Cmp(FieldOperand(result, HeapObject::kMapOffset),
|
| - Handle<Map>(current->map()));
|
| - DeoptimizeIf(not_equal, env);
|
| - current =
|
| - Handle<HeapObject>(HeapObject::cast(current->map()->prototype()));
|
| - }
|
| - __ LoadRoot(result, Heap::kUndefinedValueRootIndex);
|
| - }
|
| -}
|
| -
|
| -
|
| -// Check for cases where EmitLoadFieldOrConstantFunction needs to walk the
|
| -// prototype chain, which causes unbounded code generation.
|
| -static bool CompactEmit(SmallMapList* list,
|
| - Handle<String> name,
|
| - int i,
|
| - Isolate* isolate) {
|
| - Handle<Map> map = list->at(i);
|
| - LookupResult lookup(isolate);
|
| - map->LookupDescriptor(NULL, *name, &lookup);
|
| - return lookup.IsField() || lookup.IsConstant();
|
| -}
|
| -
|
| -
|
| -void LCodeGen::DoLoadNamedFieldPolymorphic(LLoadNamedFieldPolymorphic* instr) {
|
| - Register object = ToRegister(instr->object());
|
| - Register result = ToRegister(instr->result());
|
| -
|
| - int map_count = instr->hydrogen()->types()->length();
|
| - bool need_generic = instr->hydrogen()->need_generic();
|
| -
|
| - if (map_count == 0 && !need_generic) {
|
| - DeoptimizeIf(no_condition, instr->environment());
|
| - return;
|
| - }
|
| - Handle<String> name = instr->hydrogen()->name();
|
| - Label done;
|
| - bool all_are_compact = true;
|
| - for (int i = 0; i < map_count; ++i) {
|
| - if (!CompactEmit(instr->hydrogen()->types(), name, i, isolate())) {
|
| - all_are_compact = false;
|
| - break;
|
| - }
|
| - }
|
| - for (int i = 0; i < map_count; ++i) {
|
| - bool last = (i == map_count - 1);
|
| - Handle<Map> map = instr->hydrogen()->types()->at(i);
|
| - Label check_passed;
|
| - __ CompareMap(object, map, &check_passed);
|
| - if (last && !need_generic) {
|
| - DeoptimizeIf(not_equal, instr->environment());
|
| - __ bind(&check_passed);
|
| - EmitLoadFieldOrConstantFunction(
|
| - result, object, map, name, instr->environment());
|
| - } else {
|
| - Label next;
|
| - bool compact = all_are_compact ? true :
|
| - CompactEmit(instr->hydrogen()->types(), name, i, isolate());
|
| - __ j(not_equal, &next, compact ? Label::kNear : Label::kFar);
|
| - __ bind(&check_passed);
|
| - EmitLoadFieldOrConstantFunction(
|
| - result, object, map, name, instr->environment());
|
| - __ jmp(&done, all_are_compact ? Label::kNear : Label::kFar);
|
| - __ bind(&next);
|
| - }
|
| - }
|
| - if (need_generic) {
|
| - __ Move(rcx, name);
|
| - Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
|
| - CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| - }
|
| - __ bind(&done);
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) {
|
| ASSERT(ToRegister(instr->object()).is(rax));
|
| ASSERT(ToRegister(instr->result()).is(rax));
|
| @@ -3476,14 +3401,14 @@ void LCodeGen::EmitSmiMathAbs(LMathAbs* instr) {
|
|
|
| void LCodeGen::DoMathAbs(LMathAbs* instr) {
|
| // Class for deferred case.
|
| - class DeferredMathAbsTaggedHeapNumber: public LDeferredCode {
|
| + class DeferredMathAbsTaggedHeapNumber V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredMathAbsTaggedHeapNumber(LCodeGen* codegen, LMathAbs* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() {
|
| + virtual void Generate() V8_OVERRIDE {
|
| codegen()->DoDeferredMathAbsTaggedHeapNumber(instr_);
|
| }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LMathAbs* instr_;
|
| };
|
| @@ -3708,12 +3633,12 @@ void LCodeGen::DoPower(LPower* instr) {
|
|
|
|
|
| void LCodeGen::DoRandom(LRandom* instr) {
|
| - class DeferredDoRandom: public LDeferredCode {
|
| + class DeferredDoRandom V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredDoRandom(LCodeGen* codegen, LRandom* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredRandom(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE { codegen()->DoDeferredRandom(instr_); }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LRandom* instr_;
|
| };
|
| @@ -4398,12 +4323,14 @@ void LCodeGen::DoStringAdd(LStringAdd* instr) {
|
|
|
|
|
| void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
|
| - class DeferredStringCharCodeAt: public LDeferredCode {
|
| + class DeferredStringCharCodeAt V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredStringCharCodeAt(LCodeGen* codegen, LStringCharCodeAt* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredStringCharCodeAt(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredStringCharCodeAt(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LStringCharCodeAt* instr_;
|
| };
|
| @@ -4450,12 +4377,14 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) {
|
|
|
|
|
| void LCodeGen::DoStringCharFromCode(LStringCharFromCode* instr) {
|
| - class DeferredStringCharFromCode: public LDeferredCode {
|
| + class DeferredStringCharFromCode V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredStringCharFromCode(LCodeGen* codegen, LStringCharFromCode* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredStringCharFromCode(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredStringCharFromCode(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LStringCharFromCode* instr_;
|
| };
|
| @@ -4544,14 +4473,14 @@ void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
|
|
|
|
|
| void LCodeGen::DoNumberTagU(LNumberTagU* instr) {
|
| - class DeferredNumberTagU: public LDeferredCode {
|
| + class DeferredNumberTagU V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredNumberTagU(LCodeGen* codegen, LNumberTagU* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() {
|
| + virtual void Generate() V8_OVERRIDE {
|
| codegen()->DoDeferredNumberTagU(instr_);
|
| }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LNumberTagU* instr_;
|
| };
|
| @@ -4607,12 +4536,14 @@ void LCodeGen::DoDeferredNumberTagU(LNumberTagU* instr) {
|
|
|
|
|
| void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| - class DeferredNumberTagD: public LDeferredCode {
|
| + class DeferredNumberTagD V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredNumberTagD(LCodeGen* codegen, LNumberTagD* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredNumberTagD(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredNumberTagD(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LNumberTagD* instr_;
|
| };
|
| @@ -4621,36 +4552,6 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| Register reg = ToRegister(instr->result());
|
| Register tmp = ToRegister(instr->temp());
|
|
|
| - bool convert_hole = false;
|
| - HValue* change_input = instr->hydrogen()->value();
|
| - if (change_input->IsLoadKeyed()) {
|
| - HLoadKeyed* load = HLoadKeyed::cast(change_input);
|
| - convert_hole = load->UsesMustHandleHole();
|
| - }
|
| -
|
| - Label no_special_nan_handling;
|
| - Label done;
|
| - if (convert_hole) {
|
| - XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| - __ ucomisd(input_reg, input_reg);
|
| - __ j(parity_odd, &no_special_nan_handling);
|
| - __ subq(rsp, Immediate(kDoubleSize));
|
| - __ movsd(MemOperand(rsp, 0), input_reg);
|
| - __ cmpl(MemOperand(rsp, sizeof(kHoleNanLower32)),
|
| - Immediate(kHoleNanUpper32));
|
| - Label canonicalize;
|
| - __ j(not_equal, &canonicalize);
|
| - __ addq(rsp, Immediate(kDoubleSize));
|
| - __ Move(reg, factory()->the_hole_value());
|
| - __ jmp(&done);
|
| - __ bind(&canonicalize);
|
| - __ addq(rsp, Immediate(kDoubleSize));
|
| - __ Set(kScratchRegister, BitCast<uint64_t>(
|
| - FixedDoubleArray::canonical_not_the_hole_nan_as_double()));
|
| - __ movq(input_reg, kScratchRegister);
|
| - }
|
| -
|
| - __ bind(&no_special_nan_handling);
|
| DeferredNumberTagD* deferred = new(zone()) DeferredNumberTagD(this, instr);
|
| if (FLAG_inline_new) {
|
| __ AllocateHeapNumber(reg, tmp, deferred->entry());
|
| @@ -4659,8 +4560,6 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| }
|
| __ bind(deferred->exit());
|
| __ movsd(FieldOperand(reg, HeapNumber::kValueOffset), input_reg);
|
| -
|
| - __ bind(&done);
|
| }
|
|
|
|
|
| @@ -4704,22 +4603,20 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
|
|
|
| void LCodeGen::EmitNumberUntagD(Register input_reg,
|
| XMMRegister result_reg,
|
| - bool allow_undefined_as_nan,
|
| + bool can_convert_undefined_to_nan,
|
| bool deoptimize_on_minus_zero,
|
| LEnvironment* env,
|
| NumberUntagDMode mode) {
|
| Label load_smi, done;
|
|
|
| - STATIC_ASSERT(NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE >
|
| - NUMBER_CANDIDATE_IS_ANY_TAGGED);
|
| - if (mode >= NUMBER_CANDIDATE_IS_ANY_TAGGED) {
|
| + if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED) {
|
| // Smi check.
|
| __ JumpIfSmi(input_reg, &load_smi, Label::kNear);
|
|
|
| // Heap number map check.
|
| __ CompareRoot(FieldOperand(input_reg, HeapObject::kMapOffset),
|
| Heap::kHeapNumberMapRootIndex);
|
| - if (!allow_undefined_as_nan) {
|
| + if (!can_convert_undefined_to_nan) {
|
| DeoptimizeIf(not_equal, env);
|
| } else {
|
| Label heap_number, convert;
|
| @@ -4727,10 +4624,6 @@ void LCodeGen::EmitNumberUntagD(Register input_reg,
|
|
|
| // Convert undefined (and hole) to NaN. Compute NaN as 0/0.
|
| __ CompareRoot(input_reg, Heap::kUndefinedValueRootIndex);
|
| - if (mode == NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE) {
|
| - __ j(equal, &convert, Label::kNear);
|
| - __ CompareRoot(input_reg, Heap::kTheHoleValueRootIndex);
|
| - }
|
| DeoptimizeIf(not_equal, env);
|
|
|
| __ bind(&convert);
|
| @@ -4812,12 +4705,14 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
|
|
|
|
|
| void LCodeGen::DoTaggedToI(LTaggedToI* instr) {
|
| - class DeferredTaggedToI: public LDeferredCode {
|
| + class DeferredTaggedToI V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredTaggedToI(LCodeGen* codegen, LTaggedToI* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredTaggedToI(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredTaggedToI(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LTaggedToI* instr_;
|
| };
|
| @@ -4843,19 +4738,12 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
|
| Register input_reg = ToRegister(input);
|
| XMMRegister result_reg = ToDoubleRegister(result);
|
|
|
| - NumberUntagDMode mode = NUMBER_CANDIDATE_IS_ANY_TAGGED;
|
| HValue* value = instr->hydrogen()->value();
|
| - if (value->type().IsSmi()) {
|
| - mode = NUMBER_CANDIDATE_IS_SMI;
|
| - } else if (value->IsLoadKeyed()) {
|
| - HLoadKeyed* load = HLoadKeyed::cast(value);
|
| - if (load->UsesMustHandleHole()) {
|
| - mode = NUMBER_CANDIDATE_IS_ANY_TAGGED_CONVERT_HOLE;
|
| - }
|
| - }
|
| + NumberUntagDMode mode = value->representation().IsSmi()
|
| + ? NUMBER_CANDIDATE_IS_SMI : NUMBER_CANDIDATE_IS_ANY_TAGGED;
|
|
|
| EmitNumberUntagD(input_reg, result_reg,
|
| - instr->hydrogen()->allow_undefined_as_nan(),
|
| + instr->hydrogen()->can_convert_undefined_to_nan(),
|
| instr->hydrogen()->deoptimize_on_minus_zero(),
|
| instr->environment(),
|
| mode);
|
| @@ -5021,17 +4909,17 @@ void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) {
|
|
|
|
|
| void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
|
| - class DeferredCheckMaps: public LDeferredCode {
|
| + class DeferredCheckMaps V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredCheckMaps(LCodeGen* codegen, LCheckMaps* instr, Register object)
|
| : LDeferredCode(codegen), instr_(instr), object_(object) {
|
| SetExit(check_maps());
|
| }
|
| - virtual void Generate() {
|
| + virtual void Generate() V8_OVERRIDE {
|
| codegen()->DoDeferredInstanceMigration(instr_, object_);
|
| }
|
| Label* check_maps() { return &check_maps_; }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LCheckMaps* instr_;
|
| Label check_maps_;
|
| @@ -5121,12 +5009,14 @@ void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
|
|
|
|
| void LCodeGen::DoAllocate(LAllocate* instr) {
|
| - class DeferredAllocate: public LDeferredCode {
|
| + class DeferredAllocate V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredAllocate(LCodeGen* codegen, LAllocate* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredAllocate(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredAllocate(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LAllocate* instr_;
|
| };
|
| @@ -5459,6 +5349,8 @@ void LCodeGen::DoDeoptimize(LDeoptimize* instr) {
|
| if (info()->IsStub() && type == Deoptimizer::EAGER) {
|
| type = Deoptimizer::LAZY;
|
| }
|
| +
|
| + Comment(";;; deoptimize: %s", instr->hydrogen()->reason());
|
| DeoptimizeIf(no_condition, instr->environment(), type);
|
| }
|
|
|
| @@ -5480,12 +5372,14 @@ void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) {
|
|
|
|
|
| void LCodeGen::DoStackCheck(LStackCheck* instr) {
|
| - class DeferredStackCheck: public LDeferredCode {
|
| + class DeferredStackCheck V8_FINAL : public LDeferredCode {
|
| public:
|
| DeferredStackCheck(LCodeGen* codegen, LStackCheck* instr)
|
| : LDeferredCode(codegen), instr_(instr) { }
|
| - virtual void Generate() { codegen()->DoDeferredStackCheck(instr_); }
|
| - virtual LInstruction* instr() { return instr_; }
|
| + virtual void Generate() V8_OVERRIDE {
|
| + codegen()->DoDeferredStackCheck(instr_);
|
| + }
|
| + virtual LInstruction* instr() V8_OVERRIDE { return instr_; }
|
| private:
|
| LStackCheck* instr_;
|
| };
|
|
|