| 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/compiler/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
| 6 | 6 |
| 7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
| 8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
| 9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
| 10 #include "src/compiler/js-type-feedback.h" | 10 #include "src/compiler/js-type-feedback.h" |
| (...skipping 1978 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1989 Node* value = environment()->Pop(); | 1989 Node* value = environment()->Pop(); |
| 1990 Node* index = jsgraph()->Constant(array_index); | 1990 Node* index = jsgraph()->Constant(array_index); |
| 1991 Node* store = | 1991 Node* store = |
| 1992 BuildKeyedStore(literal, index, value, TypeFeedbackId::None()); | 1992 BuildKeyedStore(literal, index, value, TypeFeedbackId::None()); |
| 1993 states.AddToNode(store, expr->GetIdForElement(array_index), | 1993 states.AddToNode(store, expr->GetIdForElement(array_index), |
| 1994 OutputFrameStateCombine::Ignore()); | 1994 OutputFrameStateCombine::Ignore()); |
| 1995 } | 1995 } |
| 1996 } | 1996 } |
| 1997 | 1997 |
| 1998 // In case the array literal contains spread expressions it has two parts. The | 1998 // In case the array literal contains spread expressions it has two parts. The |
| 1999 // first part is the "static" array which has a literal index is handled | 1999 // first part is the "static" array which has a literal index is handled |
| 2000 // above. The second part is the part after the first spread expression | 2000 // above. The second part is the part after the first spread expression |
| 2001 // (inclusive) and these elements gets appended to the array. Note that the | 2001 // (inclusive) and these elements gets appended to the array. Note that the |
| 2002 // number elements an iterable produces is unknown ahead of time. | 2002 // number elements an iterable produces is unknown ahead of time. |
| 2003 bool has_spread = array_index < expr->values()->length(); | 2003 environment()->Pop(); // Array literal index. |
| 2004 if (has_spread) { | |
| 2005 environment()->Pop(); // Array literal index. | |
| 2006 } | |
| 2007 | |
| 2008 for (; array_index < expr->values()->length(); array_index++) { | 2004 for (; array_index < expr->values()->length(); array_index++) { |
| 2009 Expression* subexpr = expr->values()->at(array_index); | 2005 Expression* subexpr = expr->values()->at(array_index); |
| 2010 Node* array = environment()->Pop(); | 2006 Node* array = environment()->Pop(); |
| 2011 Node* result; | 2007 Node* result; |
| 2012 | 2008 |
| 2013 if (subexpr->IsSpread()) { | 2009 if (subexpr->IsSpread()) { |
| 2014 VisitForValue(subexpr->AsSpread()->expression()); | 2010 VisitForValue(subexpr->AsSpread()->expression()); |
| 2015 Node* iterable = environment()->Pop(); | 2011 Node* iterable = environment()->Pop(); |
| 2016 Node* builtins = BuildLoadBuiltinsObject(); | 2012 Node* builtins = BuildLoadBuiltinsObject(); |
| 2017 Node* function = BuildLoadObjectField( | 2013 Node* function = BuildLoadObjectField( |
| 2018 builtins, JSBuiltinsObject::OffsetOfFunctionWithId( | 2014 builtins, JSBuiltinsObject::OffsetOfFunctionWithId( |
| 2019 Builtins::CONCAT_ITERABLE_TO_ARRAY)); | 2015 Builtins::CONCAT_ITERABLE_TO_ARRAY)); |
| 2020 result = NewNode(javascript()->CallFunction(3, NO_CALL_FUNCTION_FLAGS, | 2016 result = NewNode(javascript()->CallFunction(3, NO_CALL_FUNCTION_FLAGS, |
| 2021 language_mode()), | 2017 language_mode()), |
| 2022 function, array, iterable); | 2018 function, array, iterable); |
| 2023 } else { | 2019 } else { |
| 2024 VisitForValue(subexpr); | 2020 VisitForValue(subexpr); |
| 2025 Node* value = environment()->Pop(); | 2021 Node* value = environment()->Pop(); |
| 2026 const Operator* op = | 2022 const Operator* op = |
| 2027 javascript()->CallRuntime(Runtime::kAppendElement, 2); | 2023 javascript()->CallRuntime(Runtime::kAppendElement, 2); |
| 2028 result = NewNode(op, array, value); | 2024 result = NewNode(op, array, value); |
| 2029 } | 2025 } |
| 2030 | 2026 |
| 2031 PrepareFrameState(result, expr->GetIdForElement(array_index)); | 2027 PrepareFrameState(result, expr->GetIdForElement(array_index)); |
| 2032 environment()->Push(result); | 2028 environment()->Push(result); |
| 2033 } | 2029 } |
| 2034 | 2030 |
| 2035 if (!has_spread) { | |
| 2036 environment()->Pop(); // Array literal index. | |
| 2037 } | |
| 2038 ast_context()->ProduceValue(environment()->Pop()); | 2031 ast_context()->ProduceValue(environment()->Pop()); |
| 2039 } | 2032 } |
| 2040 | 2033 |
| 2041 | 2034 |
| 2042 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, | 2035 void AstGraphBuilder::VisitForInAssignment(Expression* expr, Node* value, |
| 2043 BailoutId bailout_id) { | 2036 BailoutId bailout_id) { |
| 2044 DCHECK(expr->IsValidReferenceExpression()); | 2037 DCHECK(expr->IsValidReferenceExpression()); |
| 2045 | 2038 |
| 2046 // Left-hand side can only be a property, a global or a variable slot. | 2039 // Left-hand side can only be a property, a global or a variable slot. |
| 2047 Property* property = expr->AsProperty(); | 2040 Property* property = expr->AsProperty(); |
| (...skipping 1735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3783 // Phi does not exist yet, introduce one. | 3776 // Phi does not exist yet, introduce one. |
| 3784 value = NewPhi(inputs, value, control); | 3777 value = NewPhi(inputs, value, control); |
| 3785 value->ReplaceInput(inputs - 1, other); | 3778 value->ReplaceInput(inputs - 1, other); |
| 3786 } | 3779 } |
| 3787 return value; | 3780 return value; |
| 3788 } | 3781 } |
| 3789 | 3782 |
| 3790 } // namespace compiler | 3783 } // namespace compiler |
| 3791 } // namespace internal | 3784 } // namespace internal |
| 3792 } // namespace v8 | 3785 } // namespace v8 |
| OLD | NEW |