| Index: runtime/vm/parser.cc
|
| diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
|
| index 9f5cb49808b0f3689b217992a7ccbe722f5a7fb1..bfd9a170e4bcc1af79c38a21a8d4ab0a9a7b6a73 100644
|
| --- a/runtime/vm/parser.cc
|
| +++ b/runtime/vm/parser.cc
|
| @@ -59,8 +59,6 @@ DEFINE_FLAG(bool, await_is_keyword, false,
|
| DECLARE_FLAG(bool, lazy_dispatchers);
|
| DECLARE_FLAG(bool, load_deferred_eagerly);
|
| DECLARE_FLAG(bool, profile_vm);
|
| -DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
|
| -DECLARE_FLAG(bool, warn_on_javascript_compatibility);
|
|
|
| // Quick access to the current thread, isolate and zone.
|
| #define T (thread())
|
| @@ -538,14 +536,6 @@ RawInteger* Parser::CurrentIntegerLiteral() const {
|
| literal_token_ ^= tokens_iterator_.CurrentToken();
|
| ASSERT(literal_token_.kind() == Token::kINTEGER);
|
| RawInteger* ri = Integer::RawCast(literal_token_.value());
|
| - if (FLAG_throw_on_javascript_int_overflow) {
|
| - const Integer& i = Integer::Handle(Z, ri);
|
| - if (i.CheckJavascriptIntegerOverflow()) {
|
| - ReportError(TokenPos(),
|
| - "Integer literal does not fit in a Javascript integer: %s.",
|
| - i.ToCString());
|
| - }
|
| - }
|
| return ri;
|
| }
|
|
|
| @@ -11116,36 +11106,32 @@ AstNode* Parser::ParseStaticCall(const Class& cls,
|
| (cls.library() == Library::CoreLibrary()) &&
|
| (func.name() == Symbols::Identical().raw())) {
|
| // This is the predefined toplevel function identical(a,b).
|
| - // Create a comparison node instead of a static call to the function, unless
|
| - // javascript warnings are desired and identical is not invoked from a patch
|
| - // source.
|
| - if (!FLAG_warn_on_javascript_compatibility || is_patch_source()) {
|
| - ASSERT(num_arguments == 2);
|
| -
|
| - // If both arguments are constant expressions of type string,
|
| - // evaluate and canonicalize them.
|
| - // This guarantees that identical("ab", "a"+"b") is true.
|
| - // An alternative way to guarantee this would be to introduce
|
| - // an AST node that canonicalizes a value.
|
| - AstNode* arg0 = arguments->NodeAt(0);
|
| - const Instance* val0 = arg0->EvalConstExpr();
|
| - if ((val0 != NULL) && (val0->IsString())) {
|
| - AstNode* arg1 = arguments->NodeAt(1);
|
| - const Instance* val1 = arg1->EvalConstExpr();
|
| - if ((val1 != NULL) && (val1->IsString())) {
|
| - arguments->SetNodeAt(0,
|
| - new(Z) LiteralNode(arg0->token_pos(),
|
| - EvaluateConstExpr(arg0->token_pos(), arg0)));
|
| - arguments->SetNodeAt(1,
|
| - new(Z) LiteralNode(arg1->token_pos(),
|
| - EvaluateConstExpr(arg1->token_pos(), arg1)));
|
| - }
|
| - }
|
| - return new(Z) ComparisonNode(ident_pos,
|
| - Token::kEQ_STRICT,
|
| - arguments->NodeAt(0),
|
| - arguments->NodeAt(1));
|
| - }
|
| + // Create a comparison node instead of a static call to the function.
|
| + ASSERT(num_arguments == 2);
|
| +
|
| + // If both arguments are constant expressions of type string,
|
| + // evaluate and canonicalize them.
|
| + // This guarantees that identical("ab", "a"+"b") is true.
|
| + // An alternative way to guarantee this would be to introduce
|
| + // an AST node that canonicalizes a value.
|
| + AstNode* arg0 = arguments->NodeAt(0);
|
| + const Instance* val0 = arg0->EvalConstExpr();
|
| + if ((val0 != NULL) && (val0->IsString())) {
|
| + AstNode* arg1 = arguments->NodeAt(1);
|
| + const Instance* val1 = arg1->EvalConstExpr();
|
| + if ((val1 != NULL) && (val1->IsString())) {
|
| + arguments->SetNodeAt(0,
|
| + new(Z) LiteralNode(arg0->token_pos(),
|
| + EvaluateConstExpr(arg0->token_pos(), arg0)));
|
| + arguments->SetNodeAt(1,
|
| + new(Z) LiteralNode(arg1->token_pos(),
|
| + EvaluateConstExpr(arg1->token_pos(), arg1)));
|
| + }
|
| + }
|
| + return new(Z) ComparisonNode(ident_pos,
|
| + Token::kEQ_STRICT,
|
| + arguments->NodeAt(0),
|
| + arguments->NodeAt(1));
|
| }
|
| return new(Z) StaticCallNode(ident_pos, func, arguments);
|
| }
|
|
|