Revision: 12668
Author:   [email protected]
Date:     Fri Oct  5 05:47:34 2012
Log: Make sure that names of temporaries do not clash with real variables.

[email protected]
BUG=v8:2322

Review URL: https://codereview.chromium.org/11035054
http://code.google.com/p/v8/source/detail?r=12668

Modified:
 /branches/bleeding_edge/include/v8.h
 /branches/bleeding_edge/src/heap.h
 /branches/bleeding_edge/src/parser.cc
 /branches/bleeding_edge/src/scopes.h
 /branches/bleeding_edge/test/mjsunit/harmony/debug-blockscopes.js
 /branches/bleeding_edge/test/mjsunit/regress/regress-2322.js

=======================================
--- /branches/bleeding_edge/include/v8.h        Mon Oct  1 05:11:06 2012
+++ /branches/bleeding_edge/include/v8.h        Fri Oct  5 05:47:34 2012
@@ -4066,7 +4066,7 @@
   static const int kNullValueRootIndex = 7;
   static const int kTrueValueRootIndex = 8;
   static const int kFalseValueRootIndex = 9;
-  static const int kEmptySymbolRootIndex = 116;
+  static const int kEmptySymbolRootIndex = 117;

   static const int kJSObjectType = 0xaa;
   static const int kFirstNonstringType = 0x80;
=======================================
--- /branches/bleeding_edge/src/heap.h  Mon Oct  1 05:11:06 2012
+++ /branches/bleeding_edge/src/heap.h  Fri Oct  5 05:47:34 2012
@@ -176,6 +176,7 @@
   V(constructor_symbol, "constructor")                                   \
   V(code_symbol, ".code")                                                \
   V(result_symbol, ".result")                                            \
+  V(dot_for_symbol, ".for.")                                             \
   V(catch_var_symbol, ".catch-var")                                      \
   V(empty_symbol, "")                                                    \
   V(eval_symbol, "eval")                                                 \
=======================================
--- /branches/bleeding_edge/src/parser.cc       Fri Oct  5 02:14:08 2012
+++ /branches/bleeding_edge/src/parser.cc       Fri Oct  5 05:47:34 2012
@@ -2842,7 +2842,12 @@

// TODO(keuchel): Move the temporary variable to the block scope, after
         // implementing stack allocated block scoped variables.
- Variable* temp = top_scope_->DeclarationScope()->NewTemporary(name);
+        Factory* heap_factory = isolate()->factory();
+        Handle<String> dot =
+            heap_factory->NewStringFromAscii(CStrVector(".for."));
+        Handle<String> tempstr = heap_factory->NewConsString(dot, name);
+        Handle<String> tempname = heap_factory->LookupSymbol(tempstr);
+ Variable* temp = top_scope_->DeclarationScope()->NewTemporary(tempname);
         VariableProxy* temp_proxy = factory()->NewVariableProxy(temp);
         ForInStatement* loop = factory()->NewForInStatement(labels);
         Target target(&this->target_stack_, loop);
=======================================
--- /branches/bleeding_edge/src/scopes.h        Mon Aug 27 02:40:26 2012
+++ /branches/bleeding_edge/src/scopes.h        Fri Oct  5 05:47:34 2012
@@ -189,7 +189,7 @@
   // Creates a new temporary variable in this scope.  The name is only used
   // for printing and cannot be used to find the variable.  In particular,
   // the only way to get hold of the temporary is by keeping the Variable*
-  // around.
+  // around.  The name should not clash with a legitimate variable names.
   Variable* NewTemporary(Handle<String> name);

   // Adds the specific declaration node to the list of declarations in
=======================================
--- /branches/bleeding_edge/test/mjsunit/harmony/debug-blockscopes.js Thu Nov 24 07:17:04 2011 +++ /branches/bleeding_edge/test/mjsunit/harmony/debug-blockscopes.js Fri Oct 5 05:47:34 2012
@@ -376,7 +376,7 @@
                    debug.ScopeType.Global], exec_state);
   CheckScopeContent({x:'y'}, 0, exec_state);
   // The function scope contains a temporary iteration variable.
-  CheckScopeContent({x:'y'}, 1, exec_state);
+  CheckScopeContent({'.for.x':'y'}, 1, exec_state);
 };
 for_loop_1();
 EndTest();
@@ -401,7 +401,7 @@
   CheckScopeContent({x:3}, 0, exec_state);
   CheckScopeContent({x:'y'}, 1, exec_state);
   // The function scope contains a temporary iteration variable.
-  CheckScopeContent({x:'y'}, 2, exec_state);
+  CheckScopeContent({'.for.x':'y'}, 2, exec_state);
 };
 for_loop_2();
 EndTest();
=======================================
--- /branches/bleeding_edge/test/mjsunit/regress/regress-2322.js Fri Oct 5 02:07:53 2012 +++ /branches/bleeding_edge/test/mjsunit/regress/regress-2322.js Fri Oct 5 05:47:34 2012
@@ -27,5 +27,10 @@

 // Flags: --harmony-scoping

+"use strict";
+
 assertThrows("'use strict'; for (let x in x);", ReferenceError);

+let s;
+for (let pppp in {}) {};
+assertThrows(function() { pppp = true }, ReferenceError);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to