Author: [email protected]
Date: Wed Feb 18 07:34:37 2009
New Revision: 1302
Removed:
branches/bleeding_edge/test/mjsunit/global-load-from-eval-in-with.js
branches/bleeding_edge/test/mjsunit/local-load-from-eval.js
branches/bleeding_edge/test/mjsunit/property-load-across-eval.js
Modified:
branches/bleeding_edge/src/codegen-arm.h
branches/bleeding_edge/src/codegen-ia32.h
branches/bleeding_edge/src/contexts.cc
branches/bleeding_edge/src/scopes.cc
branches/bleeding_edge/src/scopes.h
branches/bleeding_edge/src/variables.cc
branches/bleeding_edge/src/variables.h
Log:
Revert eval changes since there is a crash that I don't have the time
to fix now.
TBR=kasperl
Review URL: http://codereview.chromium.org/20458
Modified: branches/bleeding_edge/src/codegen-arm.h
==============================================================================
--- branches/bleeding_edge/src/codegen-arm.h (original)
+++ branches/bleeding_edge/src/codegen-arm.h Wed Feb 18 07:34:37 2009
@@ -256,11 +256,6 @@
MemOperand SlotOperand(Slot* slot, Register tmp);
- MemOperand ContextSlotOperandCheckExtensions(Slot* slot,
- Register tmp,
- Register tmp2,
- Label* slow);
-
// Expressions
MemOperand GlobalObject() const {
return ContextOperand(cp, Context::GLOBAL_INDEX);
@@ -277,11 +272,6 @@
// Read a value from a slot and leave it on top of the expression stack.
void LoadFromSlot(Slot* slot, TypeofState typeof_state);
- void LoadFromGlobalSlotCheckExtensions(Slot* slot,
- TypeofState typeof_state,
- Register tmp,
- Register tmp2,
- Label* slow);
// Special code for typeof expressions: Unfortunately, we must
// be careful when loading the expression in 'typeof'
Modified: branches/bleeding_edge/src/codegen-ia32.h
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.h (original)
+++ branches/bleeding_edge/src/codegen-ia32.h Wed Feb 18 07:34:37 2009
@@ -267,9 +267,6 @@
Operand SlotOperand(Slot* slot, Register tmp);
- Operand ContextSlotOperandCheckExtensions(Slot* slot,
- Register tmp,
- Label* slow);
// Expressions
Operand GlobalObject() const {
@@ -287,10 +284,6 @@
// Read a value from a slot and leave it on top of the expression stack.
void LoadFromSlot(Slot* slot, TypeofState typeof_state);
- void LoadFromGlobalSlotCheckExtensions(Slot* slot,
- TypeofState typeof_state,
- Register tmp,
- Label* slow);
// Special code for typeof expressions: Unfortunately, we must
// be careful when loading the expression in 'typeof'
Modified: branches/bleeding_edge/src/contexts.cc
==============================================================================
--- branches/bleeding_edge/src/contexts.cc (original)
+++ branches/bleeding_edge/src/contexts.cc Wed Feb 18 07:34:37 2009
@@ -134,12 +134,10 @@
// declared variables that were introduced through declaration
nodes)
// must not appear here.
switch (mode) {
- case Variable::INTERNAL: // fall through
- case Variable::VAR: *attributes = NONE; break;
- case Variable::CONST: *attributes = READ_ONLY; break;
- case Variable::DYNAMIC: UNREACHABLE(); break;
- case Variable::DYNAMIC_GLOBAL: UNREACHABLE(); break;
- case Variable::DYNAMIC_LOCAL: UNREACHABLE(); break;
+ case Variable::INTERNAL : // fall through
+ case Variable::VAR : *attributes = NONE; break;
+ case Variable::CONST : *attributes = READ_ONLY; break;
+ case Variable::DYNAMIC : UNREACHABLE(); break;
case Variable::TEMPORARY: UNREACHABLE(); break;
}
return context;
Modified: branches/bleeding_edge/src/scopes.cc
==============================================================================
--- branches/bleeding_edge/src/scopes.cc (original)
+++ branches/bleeding_edge/src/scopes.cc Wed Feb 18 07:34:37 2009
@@ -139,7 +139,6 @@
scope_calls_eval_(false),
outer_scope_calls_eval_(false),
inner_scope_calls_eval_(false),
- outer_scope_is_eval_scope_(false),
force_eager_compilation_(false),
num_stack_slots_(0),
num_heap_slots_(0) {
@@ -313,8 +312,7 @@
// and assume they may invoke eval themselves. Eventually we could
capture
// this information in the ScopeInfo and then use it here (by traversing
// the call chain stack, at compile time).
- bool eval_scope = is_eval_scope();
- PropagateScopeInfo(eval_scope, eval_scope);
+ PropagateScopeInfo(is_eval_scope());
// 2) Resolve variables.
Scope* global_scope = NULL;
@@ -444,9 +442,6 @@
if (scope_calls_eval_) Indent(n1, "// scope calls 'eval'\n");
if (outer_scope_calls_eval_) Indent(n1, "// outer scope calls 'eval'\n");
if (inner_scope_calls_eval_) Indent(n1, "// inner scope calls 'eval'\n");
- if (outer_scope_is_eval_scope_) {
- Indent(n1, "// outer scope is 'eval' scope\n");
- }
if (num_stack_slots_ > 0) { Indent(n1, "// ");
PrintF("%d stack slots\n", num_stack_slots_); }
if (num_heap_slots_ > 0) { Indent(n1, "// ");
@@ -487,18 +482,20 @@
#endif // DEBUG
-Variable* Scope::NonLocal(Handle<String> name, Variable::Mode mode) {
- // Space optimization: reuse existing non-local with the same name
- // and mode.
+Variable* Scope::NonLocal(Handle<String> name) {
+ // Space optimization: reuse existing non-local with the same name.
for (int i = 0; i < nonlocals_.length(); i++) {
Variable* var = nonlocals_[i];
- if (var->name().is_identical_to(name) && var->mode() == mode) {
+ if (var->name().is_identical_to(name)) {
+ ASSERT(var->mode() == Variable::DYNAMIC);
return var;
}
}
- // Otherwise create a new non-local and add it to the list.
- Variable* var = new Variable(NULL, name, mode, true, false);
+ // Otherwise create a new new-local and add it to the list.
+ Variable* var = new Variable(
+ NULL /* we don't know the scope */,
+ name, Variable::DYNAMIC, true, false);
nonlocals_.Add(var);
// Allocate it by giving it a dynamic lookup.
@@ -514,9 +511,7 @@
// because the variable is just a guess (and may be shadowed by another
// variable that is introduced dynamically via an 'eval' call or a 'with'
// statement).
-Variable* Scope::LookupRecursive(Handle<String> name,
- bool inner_lookup,
- Variable** invalidated_local) {
+Variable* Scope::LookupRecursive(Handle<String> name, bool inner_lookup) {
// If we find a variable, but the current scope calls 'eval', the found
// variable may not be the correct one (the 'eval' may introduce a
// property with the same name). In that case, remember that the variable
@@ -547,7 +542,7 @@
var = function_;
} else if (outer_scope_ != NULL) {
- var = outer_scope_->LookupRecursive(name, true, invalidated_local);
+ var = outer_scope_->LookupRecursive(name, true /* inner lookup */);
// We may have found a variable in an outer scope. However, if
// the current scope is inside a 'with', the actual variable may
// be a property introduced via the 'with' statement. Then, the
@@ -568,10 +563,8 @@
var->is_accessed_from_inner_scope_ = true;
// If the variable we have found is just a guess, invalidate the result.
- if (guess) {
- *invalidated_local = var;
+ if (guess)
var = NULL;
- }
return var;
}
@@ -585,8 +578,7 @@
if (proxy->var() != NULL) return;
// Otherwise, try to resolve the variable.
- Variable* invalidated_local = NULL;
- Variable* var = LookupRecursive(proxy->name(), false,
&invalidated_local);
+ Variable* var = LookupRecursive(proxy->name(), false);
if (proxy->inside_with()) {
// If we are inside a local 'with' statement, all bets are off
@@ -595,7 +587,7 @@
// Note that we must do a lookup anyway, because if we find one,
// we must mark that variable as potentially accessed from this
// inner scope (the property may not be in the 'with' object).
- var = NonLocal(proxy->name(), Variable::DYNAMIC);
+ var = NonLocal(proxy->name());
} else {
// We are not inside a local 'with' statement.
@@ -609,22 +601,11 @@
// or we don't know about the outer scope (because we are
// in an eval scope).
if (!is_global_scope() &&
- (scope_inside_with_ || outer_scope_is_eval_scope_)) {
- // If we are inside a with statement or the code is executed
- // using eval, we give up and look up the variable at runtime.
- var = NonLocal(proxy->name(), Variable::DYNAMIC);
-
- } else if (!is_global_scope() &&
- (scope_calls_eval_ || outer_scope_calls_eval_)) {
- // If the code is not executed using eval and there are no
- // with scopes, either we have a local or a global variable
- // that might be shadowed by an eval-introduced variable.
- if (invalidated_local != NULL) {
- var = NonLocal(proxy->name(), Variable::DYNAMIC_LOCAL);
- var->set_local_if_not_shadowed(invalidated_local);
- } else {
- var = NonLocal(proxy->name(), Variable::DYNAMIC_GLOBAL);
- }
+ (is_eval_scope() || outer_scope_calls_eval_ ||
+ scope_calls_eval_ || scope_inside_with_)) {
+ // We must look up the variable at runtime, and we don't
+ // know anything else.
+ var = NonLocal(proxy->name());
} else {
// We must have a global variable.
@@ -662,21 +643,15 @@
}
-bool Scope::PropagateScopeInfo(bool outer_scope_calls_eval,
- bool outer_scope_is_eval_scope) {
+bool Scope::PropagateScopeInfo(bool outer_scope_calls_eval) {
if (outer_scope_calls_eval) {
outer_scope_calls_eval_ = true;
}
- if (outer_scope_is_eval_scope) {
- outer_scope_is_eval_scope_ = true;
- }
-
- bool calls_eval = scope_calls_eval_ || outer_scope_calls_eval_;
- bool is_eval = is_eval_scope() || outer_scope_is_eval_scope_;
+ bool b = scope_calls_eval_ || outer_scope_calls_eval_;
for (int i = 0; i < inner_scopes_.length(); i++) {
Scope* inner_scope = inner_scopes_[i];
- if (inner_scope->PropagateScopeInfo(calls_eval, is_eval)) {
+ if (inner_scope->PropagateScopeInfo(b)) {
inner_scope_calls_eval_ = true;
}
if (inner_scope->force_eager_compilation_) {
Modified: branches/bleeding_edge/src/scopes.h
==============================================================================
--- branches/bleeding_edge/src/scopes.h (original)
+++ branches/bleeding_edge/src/scopes.h Wed Feb 18 07:34:37 2009
@@ -166,13 +166,10 @@
bool is_function_scope() const { return type_ == FUNCTION_SCOPE; }
bool is_global_scope() const { return type_ == GLOBAL_SCOPE; }
- // Information about which scopes calls eval.
- bool calls_eval() const { return scope_calls_eval_; }
- bool outer_scope_calls_eval() const { return outer_scope_calls_eval_; }
-
// The scope immediately surrounding this scope, or NULL.
Scope* outer_scope() const { return outer_scope_; }
+
//
---------------------------------------------------------------------------
// Accessors.
@@ -293,7 +290,6 @@
// Computed via PropagateScopeInfo.
bool outer_scope_calls_eval_;
bool inner_scope_calls_eval_;
- bool outer_scope_is_eval_scope_;
bool force_eager_compilation_;
// Computed via AllocateVariables; function scopes only.
@@ -302,18 +298,15 @@
// Create a non-local variable with a given name.
// These variables are looked up dynamically at runtime.
- Variable* NonLocal(Handle<String> name, Variable::Mode mode);
+ Variable* NonLocal(Handle<String> name);
// Variable resolution.
- Variable* LookupRecursive(Handle<String> name,
- bool inner_lookup,
- Variable** invalidated_local);
+ Variable* LookupRecursive(Handle<String> name, bool inner_lookup);
void ResolveVariable(Scope* global_scope, VariableProxy* proxy);
void ResolveVariablesRecursively(Scope* global_scope);
// Scope analysis.
- bool PropagateScopeInfo(bool outer_scope_calls_eval,
- bool outer_scope_is_eval_scope);
+ bool PropagateScopeInfo(bool outer_scope_calls_eval);
bool HasTrivialContext() const;
// Predicates.
Modified: branches/bleeding_edge/src/variables.cc
==============================================================================
--- branches/bleeding_edge/src/variables.cc (original)
+++ branches/bleeding_edge/src/variables.cc Wed Feb 18 07:34:37 2009
@@ -110,8 +110,6 @@
case VAR: return "VAR";
case CONST: return "CONST";
case DYNAMIC: return "DYNAMIC";
- case DYNAMIC_GLOBAL: return "DYNAMIC_GLOBAL";
- case DYNAMIC_LOCAL: return "DYNAMIC_LOCAL";
case INTERNAL: return "INTERNAL";
case TEMPORARY: return "TEMPORARY";
}
@@ -145,7 +143,6 @@
mode_(mode),
is_valid_LHS_(is_valid_LHS),
is_this_(is_this),
- local_if_not_shadowed_(NULL),
is_accessed_from_inner_scope_(false),
rewrite_(NULL) {
// names must be canonicalized for fast equality checks
@@ -158,5 +155,6 @@
// activation frame.
return mode_ != TEMPORARY && scope_ != NULL && scope_->is_global_scope();
}
+
} } // namespace v8::internal
Modified: branches/bleeding_edge/src/variables.h
==============================================================================
--- branches/bleeding_edge/src/variables.h (original)
+++ branches/bleeding_edge/src/variables.h Wed Feb 18 07:34:37 2009
@@ -113,27 +113,13 @@
enum Mode {
// User declared variables:
VAR, // declared via 'var', and 'function' declarations
-
CONST, // declared via 'const' declarations
// Variables introduced by the compiler:
- DYNAMIC, // always require dynamic lookup (we don't know
- // the declaration)
-
- DYNAMIC_GLOBAL, // requires dynamic lookup, but we know that the
- // variable is global unless it has been shadowed
- // by an eval-introduced variable
-
- DYNAMIC_LOCAL, // requires dynamic lookup, but we know that the
- // variable is local and where it is unless it
- // has been shadowed by an eval-introduced
- // variable
-
- INTERNAL, // like VAR, but not user-visible (may or may not
- // be in a context)
-
- TEMPORARY // temporary variables (not user-visible), never
- // in a context
+ DYNAMIC, // always require dynamic lookup (we don't know the
declaration)
+ INTERNAL, // like VAR, but not user-visible (may or may not be in a
+ // context)
+ TEMPORARY // temporary variables (not user-visible), never in a
context
};
// Printing support
@@ -164,24 +150,9 @@
return !is_this() && name().is_identical_to(n);
}
- bool is_dynamic() const {
- return (mode_ == DYNAMIC ||
- mode_ == DYNAMIC_GLOBAL ||
- mode_ == DYNAMIC_LOCAL);
- }
-
bool is_global() const;
bool is_this() const { return is_this_; }
- Variable* local_if_not_shadowed() const {
- ASSERT(mode_ == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL);
- return local_if_not_shadowed_;
- }
-
- void set_local_if_not_shadowed(Variable* local) {
- local_if_not_shadowed_ = local;
- }
-
Expression* rewrite() const { return rewrite_; }
Slot* slot() const;
@@ -196,8 +167,6 @@
Mode mode_;
bool is_valid_LHS_;
bool is_this_;
-
- Variable* local_if_not_shadowed_;
// Usage info.
bool is_accessed_from_inner_scope_; // set by variable resolver
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---