| OLD | NEW | 
|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/code-factory.h" | 5 #include "src/code-factory.h" | 
| 6 #include "src/compilation-dependencies.h" | 6 #include "src/compilation-dependencies.h" | 
| 7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" | 
| 8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" | 
| 9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" | 
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 38     BinaryOperationHints hints = BinaryOperationHintsOf(node_->op()); | 38     BinaryOperationHints hints = BinaryOperationHintsOf(node_->op()); | 
| 39     BinaryOperationHints::Hint combined = hints.combined(); | 39     BinaryOperationHints::Hint combined = hints.combined(); | 
| 40     if (combined == BinaryOperationHints::kSignedSmall || | 40     if (combined == BinaryOperationHints::kSignedSmall || | 
| 41         combined == BinaryOperationHints::kSigned32 || | 41         combined == BinaryOperationHints::kSigned32 || | 
| 42         combined == BinaryOperationHints::kNumberOrUndefined) { | 42         combined == BinaryOperationHints::kNumberOrUndefined) { | 
| 43       return combined; | 43       return combined; | 
| 44     } | 44     } | 
| 45     return BinaryOperationHints::kAny; | 45     return BinaryOperationHints::kAny; | 
| 46   } | 46   } | 
| 47 | 47 | 
| 48   void ConvertInputsToNumberOrUndefined(Node* frame_state) { | 48   void ConvertInputsToNumber(Node* frame_state) { | 
| 49     // To convert the inputs to numbers, we have to provide frame states | 49     // To convert the inputs to numbers, we have to provide frame states | 
| 50     // for lazy bailouts in the ToNumber conversions. | 50     // for lazy bailouts in the ToNumber conversions. | 
| 51     // We use a little hack here: we take the frame state before the binary | 51     // We use a little hack here: we take the frame state before the binary | 
| 52     // operation and use it to construct the frame states for the conversion | 52     // operation and use it to construct the frame states for the conversion | 
| 53     // so that after the deoptimization, the binary operation IC gets | 53     // so that after the deoptimization, the binary operation IC gets | 
| 54     // already converted values from full code. This way we are sure that we | 54     // already converted values from full code. This way we are sure that we | 
| 55     // will not re-do any of the side effects. | 55     // will not re-do any of the side effects. | 
| 56 | 56 | 
| 57     Node* left_input = nullptr; | 57     Node* left_input = nullptr; | 
| 58     Node* right_input = nullptr; | 58     Node* right_input = nullptr; | 
| 59     bool left_is_primitive = left_type()->Is(Type::PlainPrimitive()); | 59     bool left_is_primitive = left_type()->Is(Type::PlainPrimitive()); | 
| 60     bool right_is_primitive = right_type()->Is(Type::PlainPrimitive()); | 60     bool right_is_primitive = right_type()->Is(Type::PlainPrimitive()); | 
| 61     bool handles_exception = NodeProperties::IsExceptionalCall(node_); | 61     bool handles_exception = NodeProperties::IsExceptionalCall(node_); | 
| 62 | 62 | 
| 63     if (!left_is_primitive && !right_is_primitive && handles_exception) { | 63     if (!left_is_primitive && !right_is_primitive && handles_exception) { | 
| 64       ConvertBothInputsToNumber(&left_input, &right_input, frame_state); | 64       ConvertBothInputsToNumber(&left_input, &right_input, frame_state); | 
| 65     } else { | 65     } else { | 
| 66       left_input = left_is_primitive | 66       left_input = left_is_primitive | 
| 67                        ? ConvertPlainPrimitiveToNumberOrUndefined(left()) | 67                        ? ConvertPlainPrimitiveToNumber(left()) | 
| 68                        : ConvertSingleInputToNumber( | 68                        : ConvertSingleInputToNumber( | 
| 69                              left(), CreateFrameStateForLeftInput(frame_state)); | 69                              left(), CreateFrameStateForLeftInput(frame_state)); | 
| 70       right_input = right_is_primitive | 70       right_input = right_is_primitive | 
| 71                         ? ConvertPlainPrimitiveToNumberOrUndefined(right()) | 71                         ? ConvertPlainPrimitiveToNumber(right()) | 
| 72                         : ConvertSingleInputToNumber( | 72                         : ConvertSingleInputToNumber( | 
| 73                               right(), CreateFrameStateForRightInput( | 73                               right(), CreateFrameStateForRightInput( | 
| 74                                            frame_state, left_input)); | 74                                            frame_state, left_input)); | 
| 75     } | 75     } | 
| 76 | 76 | 
| 77     node_->ReplaceInput(0, left_input); | 77     node_->ReplaceInput(0, left_input); | 
| 78     node_->ReplaceInput(1, right_input); | 78     node_->ReplaceInput(1, right_input); | 
| 79   } | 79   } | 
| 80 | 80 | 
| 81   void ConvertInputsToUI32(Signedness left_signedness, | 81   void ConvertInputsToUI32(Signedness left_signedness, | 
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 274         graph()->NewNode(stack->op(), stack->InputCount(), &new_values.front()); | 274         graph()->NewNode(stack->op(), stack->InputCount(), &new_values.front()); | 
| 275 | 275 | 
| 276     return graph()->NewNode( | 276     return graph()->NewNode( | 
| 277         op, frame_state->InputAt(kFrameStateParametersInput), | 277         op, frame_state->InputAt(kFrameStateParametersInput), | 
| 278         frame_state->InputAt(kFrameStateLocalsInput), new_stack, | 278         frame_state->InputAt(kFrameStateLocalsInput), new_stack, | 
| 279         frame_state->InputAt(kFrameStateContextInput), | 279         frame_state->InputAt(kFrameStateContextInput), | 
| 280         frame_state->InputAt(kFrameStateFunctionInput), | 280         frame_state->InputAt(kFrameStateFunctionInput), | 
| 281         frame_state->InputAt(kFrameStateOuterStateInput)); | 281         frame_state->InputAt(kFrameStateOuterStateInput)); | 
| 282   } | 282   } | 
| 283 | 283 | 
| 284   Node* ConvertPlainPrimitiveToNumberOrUndefined(Node* node) { | 284   Node* ConvertPlainPrimitiveToNumber(Node* node) { | 
| 285     DCHECK(NodeProperties::GetType(node)->Is(Type::PlainPrimitive())); | 285     DCHECK(NodeProperties::GetType(node)->Is(Type::PlainPrimitive())); | 
| 286     // Avoid inserting too many eager ToNumber() operations. | 286     // Avoid inserting too many eager ToNumber() operations. | 
| 287     Reduction const reduction = lowering_->ReduceJSToNumberInput(node); | 287     Reduction const reduction = lowering_->ReduceJSToNumberInput(node); | 
| 288     if (reduction.Changed()) return reduction.replacement(); | 288     if (reduction.Changed()) return reduction.replacement(); | 
| 289     if (NodeProperties::GetType(node)->Is(Type::NumberOrUndefined())) { | 289     if (NodeProperties::GetType(node)->Is(Type::Number())) { | 
| 290       return node; | 290       return node; | 
| 291     } | 291     } | 
| 292     return graph()->NewNode(simplified()->PlainPrimitiveToNumber(), node); | 292     return graph()->NewNode(simplified()->PlainPrimitiveToNumber(), node); | 
| 293   } | 293   } | 
| 294 | 294 | 
| 295   Node* ConvertSingleInputToNumber(Node* node, Node* frame_state) { | 295   Node* ConvertSingleInputToNumber(Node* node, Node* frame_state) { | 
| 296     DCHECK(!NodeProperties::GetType(node)->Is(Type::PlainPrimitive())); | 296     DCHECK(!NodeProperties::GetType(node)->Is(Type::PlainPrimitive())); | 
| 297     Node* const n = graph()->NewNode(javascript()->ToNumber(), node, context(), | 297     Node* const n = graph()->NewNode(javascript()->ToNumber(), node, context(), | 
| 298                                      frame_state, effect(), control()); | 298                                      frame_state, effect(), control()); | 
| 299     Node* const if_success = graph()->NewNode(common()->IfSuccess(), n); | 299     Node* const if_success = graph()->NewNode(common()->IfSuccess(), n); | 
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 402   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 402   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 403 | 403 | 
| 404   JSBinopReduction r(this, node); | 404   JSBinopReduction r(this, node); | 
| 405 | 405 | 
| 406   BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 406   BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 
| 407   if (feedback != BinaryOperationHints::kAny) { | 407   if (feedback != BinaryOperationHints::kAny) { | 
| 408     // Lower to the optimistic number binop. | 408     // Lower to the optimistic number binop. | 
| 409     return r.ChangeToSpeculativeOperator( | 409     return r.ChangeToSpeculativeOperator( | 
| 410         simplified()->SpeculativeNumberAdd(feedback)); | 410         simplified()->SpeculativeNumberAdd(feedback)); | 
| 411   } | 411   } | 
| 412   if (r.BothInputsAre(Type::NumberOrUndefined())) { | 412   if (r.BothInputsAre(Type::Number())) { | 
| 413     // JSAdd(x:number, y:number) => NumberAdd(x, y) | 413     // JSAdd(x:number, y:number) => NumberAdd(x, y) | 
| 414     Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 414     Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 415     r.ConvertInputsToNumberOrUndefined(frame_state); | 415     r.ConvertInputsToNumber(frame_state); | 
| 416     return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); | 416     return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); | 
| 417   } | 417   } | 
| 418   if (r.NeitherInputCanBe(Type::StringOrReceiver())) { | 418   if (r.NeitherInputCanBe(Type::StringOrReceiver())) { | 
| 419     // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) | 419     // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) | 
| 420     Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 420     Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 421     r.ConvertInputsToNumberOrUndefined(frame_state); | 421     r.ConvertInputsToNumber(frame_state); | 
| 422     return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); | 422     return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); | 
| 423   } | 423   } | 
| 424   if (r.OneInputIs(Type::String())) { | 424   if (r.OneInputIs(Type::String())) { | 
| 425     StringAddFlags flags = STRING_ADD_CHECK_NONE; | 425     StringAddFlags flags = STRING_ADD_CHECK_NONE; | 
| 426     if (!r.LeftInputIs(Type::String())) { | 426     if (!r.LeftInputIs(Type::String())) { | 
| 427       flags = STRING_ADD_CONVERT_LEFT; | 427       flags = STRING_ADD_CONVERT_LEFT; | 
| 428     } else if (!r.RightInputIs(Type::String())) { | 428     } else if (!r.RightInputIs(Type::String())) { | 
| 429       flags = STRING_ADD_CONVERT_RIGHT; | 429       flags = STRING_ADD_CONVERT_RIGHT; | 
| 430     } | 430     } | 
| 431     // JSAdd(x:string, y) => CallStub[StringAdd](x, y) | 431     // JSAdd(x:string, y) => CallStub[StringAdd](x, y) | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 461 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) { | 461 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) { | 
| 462   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 462   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 463   JSBinopReduction r(this, node); | 463   JSBinopReduction r(this, node); | 
| 464   BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 464   BinaryOperationHints::Hint feedback = r.GetUsableNumberFeedback(); | 
| 465   if (feedback != BinaryOperationHints::kAny) { | 465   if (feedback != BinaryOperationHints::kAny) { | 
| 466     // Lower to the optimistic number binop. | 466     // Lower to the optimistic number binop. | 
| 467     return r.ChangeToSpeculativeOperator( | 467     return r.ChangeToSpeculativeOperator( | 
| 468         simplified()->SpeculativeNumberSubtract(feedback)); | 468         simplified()->SpeculativeNumberSubtract(feedback)); | 
| 469   } | 469   } | 
| 470   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 470   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 471   r.ConvertInputsToNumberOrUndefined(frame_state); | 471   r.ConvertInputsToNumber(frame_state); | 
| 472   return r.ChangeToPureOperator(simplified()->NumberSubtract(), Type::Number()); | 472   return r.ChangeToPureOperator(simplified()->NumberSubtract(), Type::Number()); | 
| 473 } | 473 } | 
| 474 | 474 | 
| 475 Reduction JSTypedLowering::ReduceJSMultiply(Node* node) { | 475 Reduction JSTypedLowering::ReduceJSMultiply(Node* node) { | 
| 476   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 476   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 477   JSBinopReduction r(this, node); | 477   JSBinopReduction r(this, node); | 
| 478   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 478   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 479   r.ConvertInputsToNumberOrUndefined(frame_state); | 479   r.ConvertInputsToNumber(frame_state); | 
| 480   return r.ChangeToPureOperator(simplified()->NumberMultiply(), Type::Number()); | 480   return r.ChangeToPureOperator(simplified()->NumberMultiply(), Type::Number()); | 
| 481 } | 481 } | 
| 482 | 482 | 
| 483 Reduction JSTypedLowering::ReduceJSDivide(Node* node) { | 483 Reduction JSTypedLowering::ReduceJSDivide(Node* node) { | 
| 484   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 484   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 485   JSBinopReduction r(this, node); | 485   JSBinopReduction r(this, node); | 
| 486   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 486   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 487   r.ConvertInputsToNumberOrUndefined(frame_state); | 487   r.ConvertInputsToNumber(frame_state); | 
| 488   return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number()); | 488   return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number()); | 
| 489 } | 489 } | 
| 490 | 490 | 
| 491 | 491 | 
| 492 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) { | 492 Reduction JSTypedLowering::ReduceInt32Binop(Node* node, const Operator* intOp) { | 
| 493   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 493   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 494 | 494 | 
| 495   JSBinopReduction r(this, node); | 495   JSBinopReduction r(this, node); | 
| 496   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 496   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 497   r.ConvertInputsToNumberOrUndefined(frame_state); | 497   r.ConvertInputsToNumber(frame_state); | 
| 498   r.ConvertInputsToUI32(kSigned, kSigned); | 498   r.ConvertInputsToUI32(kSigned, kSigned); | 
| 499   return r.ChangeToPureOperator(intOp, Type::Integral32()); | 499   return r.ChangeToPureOperator(intOp, Type::Integral32()); | 
| 500 } | 500 } | 
| 501 | 501 | 
| 502 | 502 | 
| 503 Reduction JSTypedLowering::ReduceUI32Shift(Node* node, | 503 Reduction JSTypedLowering::ReduceUI32Shift(Node* node, | 
| 504                                            Signedness left_signedness, | 504                                            Signedness left_signedness, | 
| 505                                            const Operator* shift_op) { | 505                                            const Operator* shift_op) { | 
| 506   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 506   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 507 | 507 | 
| 508   JSBinopReduction r(this, node); | 508   JSBinopReduction r(this, node); | 
| 509   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 509   Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 510   r.ConvertInputsToNumberOrUndefined(frame_state); | 510   r.ConvertInputsToNumber(frame_state); | 
| 511   r.ConvertInputsToUI32(left_signedness, kUnsigned); | 511   r.ConvertInputsToUI32(left_signedness, kUnsigned); | 
| 512   return r.ChangeToPureOperator(shift_op); | 512   return r.ChangeToPureOperator(shift_op); | 
| 513 } | 513 } | 
| 514 | 514 | 
| 515 | 515 | 
| 516 Reduction JSTypedLowering::ReduceJSComparison(Node* node) { | 516 Reduction JSTypedLowering::ReduceJSComparison(Node* node) { | 
| 517   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 517   if (flags() & kDisableBinaryOpReduction) return NoChange(); | 
| 518 | 518 | 
| 519   JSBinopReduction r(this, node); | 519   JSBinopReduction r(this, node); | 
| 520   if (r.BothInputsAre(Type::String())) { | 520   if (r.BothInputsAre(Type::String())) { | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 546     const Operator* less_than_or_equal; | 546     const Operator* less_than_or_equal; | 
| 547     if (r.BothInputsAre(Type::Unsigned32())) { | 547     if (r.BothInputsAre(Type::Unsigned32())) { | 
| 548       less_than = machine()->Uint32LessThan(); | 548       less_than = machine()->Uint32LessThan(); | 
| 549       less_than_or_equal = machine()->Uint32LessThanOrEqual(); | 549       less_than_or_equal = machine()->Uint32LessThanOrEqual(); | 
| 550     } else if (r.BothInputsAre(Type::Signed32())) { | 550     } else if (r.BothInputsAre(Type::Signed32())) { | 
| 551       less_than = machine()->Int32LessThan(); | 551       less_than = machine()->Int32LessThan(); | 
| 552       less_than_or_equal = machine()->Int32LessThanOrEqual(); | 552       less_than_or_equal = machine()->Int32LessThanOrEqual(); | 
| 553     } else { | 553     } else { | 
| 554       // TODO(turbofan): mixed signed/unsigned int32 comparisons. | 554       // TODO(turbofan): mixed signed/unsigned int32 comparisons. | 
| 555       Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 555       Node* frame_state = NodeProperties::GetFrameStateInput(node, 1); | 
| 556       r.ConvertInputsToNumberOrUndefined(frame_state); | 556       r.ConvertInputsToNumber(frame_state); | 
| 557       less_than = simplified()->NumberLessThan(); | 557       less_than = simplified()->NumberLessThan(); | 
| 558       less_than_or_equal = simplified()->NumberLessThanOrEqual(); | 558       less_than_or_equal = simplified()->NumberLessThanOrEqual(); | 
| 559     } | 559     } | 
| 560     const Operator* comparison; | 560     const Operator* comparison; | 
| 561     switch (node->opcode()) { | 561     switch (node->opcode()) { | 
| 562       case IrOpcode::kJSLessThan: | 562       case IrOpcode::kJSLessThan: | 
| 563         comparison = less_than; | 563         comparison = less_than; | 
| 564         break; | 564         break; | 
| 565       case IrOpcode::kJSGreaterThan: | 565       case IrOpcode::kJSGreaterThan: | 
| 566         comparison = less_than; | 566         comparison = less_than; | 
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 715     return r.ChangeToPureOperator( | 715     return r.ChangeToPureOperator( | 
| 716         simplified()->ReferenceEqual(Type::Receiver()), invert); | 716         simplified()->ReferenceEqual(Type::Receiver()), invert); | 
| 717   } | 717   } | 
| 718   if (r.BothInputsAre(Type::Unique())) { | 718   if (r.BothInputsAre(Type::Unique())) { | 
| 719     return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Unique()), | 719     return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Unique()), | 
| 720                                   invert); | 720                                   invert); | 
| 721   } | 721   } | 
| 722   if (r.BothInputsAre(Type::String())) { | 722   if (r.BothInputsAre(Type::String())) { | 
| 723     return r.ChangeToPureOperator(simplified()->StringEqual(), invert); | 723     return r.ChangeToPureOperator(simplified()->StringEqual(), invert); | 
| 724   } | 724   } | 
| 725   if (r.BothInputsAre(Type::NumberOrUndefined())) { | 725   if (r.BothInputsAre(Type::Number())) { | 
| 726     return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); | 726     return r.ChangeToPureOperator(simplified()->NumberEqual(), invert); | 
| 727   } | 727   } | 
| 728   // TODO(turbofan): js-typed-lowering of StrictEqual(mixed types) | 728   // TODO(turbofan): js-typed-lowering of StrictEqual(mixed types) | 
| 729   return NoChange(); | 729   return NoChange(); | 
| 730 } | 730 } | 
| 731 | 731 | 
| 732 | 732 | 
| 733 Reduction JSTypedLowering::ReduceJSToBoolean(Node* node) { | 733 Reduction JSTypedLowering::ReduceJSToBoolean(Node* node) { | 
| 734   Node* const input = node->InputAt(0); | 734   Node* const input = node->InputAt(0); | 
| 735   Type* const input_type = NodeProperties::GetType(input); | 735   Type* const input_type = NodeProperties::GetType(input); | 
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1066           key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) { | 1066           key_type->Is(shifted_int32_ranges_[k]) && byte_length <= kMaxInt) { | 
| 1067         // JSLoadProperty(typed-array, int32) | 1067         // JSLoadProperty(typed-array, int32) | 
| 1068         Handle<FixedTypedArrayBase> elements = | 1068         Handle<FixedTypedArrayBase> elements = | 
| 1069             Handle<FixedTypedArrayBase>::cast(handle(array->elements())); | 1069             Handle<FixedTypedArrayBase>::cast(handle(array->elements())); | 
| 1070         Node* buffer = jsgraph()->PointerConstant(elements->external_pointer()); | 1070         Node* buffer = jsgraph()->PointerConstant(elements->external_pointer()); | 
| 1071         Node* length = jsgraph()->Constant(byte_length); | 1071         Node* length = jsgraph()->Constant(byte_length); | 
| 1072         Node* context = NodeProperties::GetContextInput(node); | 1072         Node* context = NodeProperties::GetContextInput(node); | 
| 1073         Node* effect = NodeProperties::GetEffectInput(node); | 1073         Node* effect = NodeProperties::GetEffectInput(node); | 
| 1074         Node* control = NodeProperties::GetControlInput(node); | 1074         Node* control = NodeProperties::GetControlInput(node); | 
| 1075         // Convert to a number first. | 1075         // Convert to a number first. | 
| 1076         if (!value_type->Is(Type::NumberOrUndefined())) { | 1076         if (!value_type->Is(Type::Number())) { | 
| 1077           Reduction number_reduction = ReduceJSToNumberInput(value); | 1077           Reduction number_reduction = ReduceJSToNumberInput(value); | 
| 1078           if (number_reduction.Changed()) { | 1078           if (number_reduction.Changed()) { | 
| 1079             value = number_reduction.replacement(); | 1079             value = number_reduction.replacement(); | 
| 1080           } else { | 1080           } else { | 
| 1081             Node* frame_state_for_to_number = | 1081             Node* frame_state_for_to_number = | 
| 1082                 NodeProperties::FindFrameStateBefore(node); | 1082                 NodeProperties::FindFrameStateBefore(node); | 
| 1083             value = effect = | 1083             value = effect = | 
| 1084                 graph()->NewNode(javascript()->ToNumber(), value, context, | 1084                 graph()->NewNode(javascript()->ToNumber(), value, context, | 
| 1085                                  frame_state_for_to_number, effect, control); | 1085                                  frame_state_for_to_number, effect, control); | 
| 1086           } | 1086           } | 
| (...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1947 } | 1947 } | 
| 1948 | 1948 | 
| 1949 | 1949 | 
| 1950 CompilationDependencies* JSTypedLowering::dependencies() const { | 1950 CompilationDependencies* JSTypedLowering::dependencies() const { | 
| 1951   return dependencies_; | 1951   return dependencies_; | 
| 1952 } | 1952 } | 
| 1953 | 1953 | 
| 1954 }  // namespace compiler | 1954 }  // namespace compiler | 
| 1955 }  // namespace internal | 1955 }  // namespace internal | 
| 1956 }  // namespace v8 | 1956 }  // namespace v8 | 
| OLD | NEW | 
|---|