From d75b34db33833f966f082b348746be91d47d067c Mon Sep 17 00:00:00 2001 From: "olivf@chromium.org" Date: Wed, 17 Jul 2013 14:10:38 +0000 Subject: [PATCH] There is no undefined Literal. BUG= R=rossberg@chromium.org Review URL: https://codereview.chromium.org/18429005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15724 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/ast.cc | 22 +++++++++++++++------- src/ast.h | 6 +++--- src/full-codegen.cc | 2 +- src/hydrogen.cc | 2 +- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/ast.cc b/src/ast.cc index 964f5bc..f34c7bb 100644 --- a/src/ast.cc +++ b/src/ast.cc @@ -71,8 +71,14 @@ bool Expression::IsNullLiteral() { } -bool Expression::IsUndefinedLiteral() { - return AsLiteral() != NULL && AsLiteral()->value()->IsUndefined(); +bool Expression::IsUndefinedLiteral(Isolate* isolate) { + VariableProxy* var_proxy = AsVariableProxy(); + if (var_proxy == NULL) return false; + Variable* var = var_proxy->var(); + // The global identifier "undefined" is immutable. Everything + // else could be reassigned. + return var != NULL && var->location() == Variable::UNALLOCATED && + var_proxy->name()->Equals(isolate->heap()->undefined_string()); } @@ -385,12 +391,13 @@ static bool IsVoidOfLiteral(Expression* expr) { static bool MatchLiteralCompareUndefined(Expression* left, Token::Value op, Expression* right, - Expression** expr) { + Expression** expr, + Isolate* isolate) { if (IsVoidOfLiteral(left) && Token::IsEqualityOp(op)) { *expr = right; return true; } - if (left->IsUndefinedLiteral() && Token::IsEqualityOp(op)) { + if (left->IsUndefinedLiteral(isolate) && Token::IsEqualityOp(op)) { *expr = right; return true; } @@ -398,9 +405,10 @@ static bool MatchLiteralCompareUndefined(Expression* left, } -bool CompareOperation::IsLiteralCompareUndefined(Expression** expr) { - return MatchLiteralCompareUndefined(left_, op_, right_, expr) || - MatchLiteralCompareUndefined(right_, op_, left_, expr); +bool CompareOperation::IsLiteralCompareUndefined( + Expression** expr, Isolate* isolate) { + return MatchLiteralCompareUndefined(left_, op_, right_, expr, isolate) || + MatchLiteralCompareUndefined(right_, op_, left_, expr, isolate); } diff --git a/src/ast.h b/src/ast.h index 78b7843..f14156f 100644 --- a/src/ast.h +++ b/src/ast.h @@ -353,8 +353,8 @@ class Expression: public AstNode { // True iff the expression is the null literal. bool IsNullLiteral(); - // True iff the expression is the undefined literal. - bool IsUndefinedLiteral(); + // True if we can prove that the expression is the undefined literal. + bool IsUndefinedLiteral(Isolate* isolate); // Expression type bounds Bounds bounds() { return bounds_; } @@ -1994,7 +1994,7 @@ class CompareOperation: public Expression { // Match special cases. bool IsLiteralCompareTypeof(Expression** expr, Handle* check); - bool IsLiteralCompareUndefined(Expression** expr); + bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate); bool IsLiteralCompareNull(Expression** expr); protected: diff --git a/src/full-codegen.cc b/src/full-codegen.cc index 82d4f7c..76d3fff 100644 --- a/src/full-codegen.cc +++ b/src/full-codegen.cc @@ -1605,7 +1605,7 @@ bool FullCodeGenerator::TryLiteralCompare(CompareOperation* expr) { return true; } - if (expr->IsLiteralCompareUndefined(&sub_expr)) { + if (expr->IsLiteralCompareUndefined(&sub_expr, isolate())) { EmitLiteralCompareNil(expr, sub_expr, kUndefinedValue); return true; } diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 7d120b7..154027f 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -8164,7 +8164,7 @@ void HOptimizedGraphBuilder::VisitCompareOperation(CompareOperation* expr) { if (expr->IsLiteralCompareTypeof(&sub_expr, &check)) { return HandleLiteralCompareTypeof(expr, sub_expr, check); } - if (expr->IsLiteralCompareUndefined(&sub_expr)) { + if (expr->IsLiteralCompareUndefined(&sub_expr, isolate())) { return HandleLiteralCompareNil(expr, sub_expr, kUndefinedValue); } if (expr->IsLiteralCompareNull(&sub_expr)) { -- 2.7.4