Index: src/parsing/parser.cc |
diff --git a/src/parsing/parser.cc b/src/parsing/parser.cc |
index dfda89e4db29152526f07f18a59d37375f59173a..0224396772422fec80da9334fc4f108945c25ddd 100644 |
--- a/src/parsing/parser.cc |
+++ b/src/parsing/parser.cc |
@@ -439,6 +439,14 @@ bool ParserTraits::ShortcutNumericLiteralBinaryExpression( |
*x = factory->NewNumberLiteral(value, pos, has_dot); |
return true; |
} |
+ case Token::EXP: { |
+ double value = std::pow(x_val, y_val); |
+ int int_value = static_cast<int>(value); |
+ *x = factory->NewNumberLiteral( |
+ int_value == value && value != -0.0 ? int_value : value, pos, |
+ has_dot); |
+ return true; |
+ } |
default: |
break; |
} |
@@ -785,6 +793,8 @@ Parser::Parser(ParseInfo* info) |
set_allow_harmony_function_sent(FLAG_harmony_function_sent); |
set_allow_harmony_restrictive_declarations( |
FLAG_harmony_restrictive_declarations); |
+ set_allow_harmony_exponentiation_operator( |
+ FLAG_harmony_exponentiation_operator); |
for (int feature = 0; feature < v8::Isolate::kUseCounterFeatureCount; |
++feature) { |
use_counts_[feature] = 0; |
@@ -4680,6 +4690,7 @@ PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( |
SET_ALLOW(harmony_do_expressions); |
SET_ALLOW(harmony_function_name); |
SET_ALLOW(harmony_function_sent); |
+ SET_ALLOW(harmony_exponentiation_operator); |
#undef SET_ALLOW |
} |
PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( |
@@ -5370,6 +5381,16 @@ void ParserTraits::RewriteDestructuringAssignments() { |
parser_->RewriteDestructuringAssignments(); |
} |
+Expression* ParserTraits::RewriteExponentiation(Expression* left, |
+ Expression* right, int pos) { |
+ return parser_->RewriteExponentiation(left, right, pos); |
+} |
+ |
+Expression* ParserTraits::RewriteAssignExponentiation(Expression* left, |
+ Expression* right, |
+ int pos) { |
+ return parser_->RewriteAssignExponentiation(left, right, pos); |
+} |
void ParserTraits::RewriteNonPattern(Type::ExpressionClassifier* classifier, |
bool* ok) { |
@@ -5459,6 +5480,60 @@ void Parser::RewriteDestructuringAssignments() { |
} |
} |
+Expression* Parser::RewriteExponentiation(Expression* left, Expression* right, |
+ int pos) { |
+ ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
+ args->Add(left, zone()); |
+ args->Add(right, zone()); |
+ return factory()->NewCallRuntime(Context::MATH_POW_METHOD_INDEX, args, pos); |
+} |
+ |
+Expression* Parser::RewriteAssignExponentiation(Expression* left, |
+ Expression* right, int pos) { |
+ ZoneList<Expression*>* args = new (zone()) ZoneList<Expression*>(2, zone()); |
+ if (left->IsVariableProxy()) { |
+ VariableProxy* lhs = left->AsVariableProxy(); |
+ |
+ Expression* result; |
+ DCHECK_NOT_NULL(lhs->raw_name()); |
+ result = |
+ this->ExpressionFromIdentifier(lhs->raw_name(), lhs->position(), |
+ lhs->end_position(), scope_, factory()); |
+ args->Add(left, zone()); |
+ args->Add(right, zone()); |
+ Expression* call = |
+ factory()->NewCallRuntime(Context::MATH_POW_METHOD_INDEX, args, pos); |
+ return factory()->NewAssignment(Token::ASSIGN, result, call, pos); |
+ } else if (left->IsProperty()) { |
+ Property* prop = left->AsProperty(); |
+ auto temp_obj = scope_->NewTemporary(ast_value_factory()->empty_string()); |
+ auto temp_key = scope_->NewTemporary(ast_value_factory()->empty_string()); |
+ Expression* assign_obj = factory()->NewAssignment( |
+ Token::ASSIGN, factory()->NewVariableProxy(temp_obj), prop->obj(), |
+ RelocInfo::kNoPosition); |
+ Expression* assign_key = factory()->NewAssignment( |
+ Token::ASSIGN, factory()->NewVariableProxy(temp_key), prop->key(), |
+ RelocInfo::kNoPosition); |
+ args->Add(factory()->NewProperty(factory()->NewVariableProxy(temp_obj), |
+ factory()->NewVariableProxy(temp_key), |
+ left->position()), |
+ zone()); |
+ args->Add(right, zone()); |
+ Expression* call = |
+ factory()->NewCallRuntime(Context::MATH_POW_METHOD_INDEX, args, pos); |
+ Expression* target = factory()->NewProperty( |
+ factory()->NewVariableProxy(temp_obj), |
+ factory()->NewVariableProxy(temp_key), RelocInfo::kNoPosition); |
+ Expression* assign = |
+ factory()->NewAssignment(Token::ASSIGN, target, call, pos); |
+ return factory()->NewBinaryOperation( |
+ Token::COMMA, assign_obj, |
+ factory()->NewBinaryOperation(Token::COMMA, assign_key, assign, pos), |
+ pos); |
+ } |
+ UNREACHABLE(); |
+ return nullptr; |
+} |
Expression* Parser::RewriteSpreads(ArrayLiteral* lit) { |
// Array literals containing spreads are rewritten using do expressions, e.g. |