Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(218)

Unified Diff: src/parser.cc

Issue 426233002: Land the Fan (disabled) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback, rebase and "git cl format" Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects-visiting-inl.h ('k') | src/property.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index 170b1f5a3523f1bc0eab16a81fef3fbc98f46f3c..d2925c0b02e9058f48f5024d7028c5832ccebd4d 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -1442,6 +1442,19 @@ Statement* Parser::ParseExportDeclaration(bool* ok) {
return NULL;
}
+ // Every export of a module may be assigned.
+ for (int i = 0; i < names.length(); ++i) {
+ Variable* var = scope_->Lookup(names[i]);
+ if (var == NULL) {
+ // TODO(sigurds) This is an export that has no definition yet,
+ // not clear what to do in this case.
+ continue;
+ }
+ if (!IsImmutableVariableMode(var->mode())) {
+ var->set_maybe_assigned();
+ }
+ }
+
// Extract declared names into export declarations and interface.
Interface* interface = scope_->interface();
for (int i = 0; i < names.length(); ++i) {
@@ -1655,8 +1668,9 @@ void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
: declaration_scope->LookupLocal(name);
if (var == NULL) {
// Declare the name.
- var = declaration_scope->DeclareLocal(
- name, mode, declaration->initialization(), proxy->interface());
+ var = declaration_scope->DeclareLocal(name, mode,
+ declaration->initialization(),
+ kNotAssigned, proxy->interface());
} else if (IsLexicalVariableMode(mode) || IsLexicalVariableMode(var->mode())
|| ((mode == CONST_LEGACY || var->mode() == CONST_LEGACY) &&
!declaration_scope->is_global_scope())) {
@@ -1711,18 +1725,19 @@ void Parser::Declare(Declaration* declaration, bool resolve, bool* ok) {
// For global const variables we bind the proxy to a variable.
ASSERT(resolve); // should be set by all callers
Variable::Kind kind = Variable::NORMAL;
- var = new(zone()) Variable(
- declaration_scope, name, mode, true, kind,
- kNeedsInitialization, proxy->interface());
+ var = new (zone())
+ Variable(declaration_scope, name, mode, true, kind,
+ kNeedsInitialization, kNotAssigned, proxy->interface());
} else if (declaration_scope->is_eval_scope() &&
declaration_scope->strict_mode() == SLOPPY) {
// For variable declarations in a sloppy eval scope the proxy is bound
// to a lookup variable to force a dynamic declaration using the
// DeclareLookupSlot runtime function.
Variable::Kind kind = Variable::NORMAL;
- var = new(zone()) Variable(
- declaration_scope, name, mode, true, kind,
- declaration->initialization(), proxy->interface());
+ // TODO(sigurds) figure out if kNotAssigned is OK here
+ var = new (zone()) Variable(declaration_scope, name, mode, true, kind,
+ declaration->initialization(), kNotAssigned,
+ proxy->interface());
var->AllocateTo(Variable::LOOKUP, -1);
resolve = true;
}
@@ -2625,9 +2640,7 @@ TryStatement* Parser::ParseTryStatement(bool* ok) {
Target target(&this->target_stack_, &catch_collector);
VariableMode mode =
allow_harmony_scoping() && strict_mode() == STRICT ? LET : VAR;
- catch_variable =
- catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
-
+ catch_variable = catch_scope->DeclareLocal(name, mode, kCreatedInitialized);
BlockState block_state(&scope_, catch_scope);
catch_block = ParseBlock(NULL, CHECK_OK);
@@ -3454,7 +3467,12 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
dupe_error_loc = scanner()->location();
}
- scope_->DeclareParameter(param_name, VAR);
+ Variable* var = scope_->DeclareParameter(param_name, VAR);
+ // TODO(sigurds) Mark every parameter as maybe assigned. This is a
+ // conservative approximation necessary to account for parameters
+ // that are assigned via the arguments array.
+ var->set_maybe_assigned();
+
num_parameters++;
if (num_parameters > Code::kMaxArguments) {
ReportMessage("too_many_parameters");
@@ -3485,9 +3503,10 @@ FunctionLiteral* Parser::ParseFunctionLiteral(
allow_harmony_scoping() && strict_mode() == STRICT
? CONST : CONST_LEGACY;
ASSERT(function_name != NULL);
- fvar = new(zone()) Variable(scope_,
- function_name, fvar_mode, true /* is valid LHS */,
- Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
+ fvar = new (zone())
+ Variable(scope_, function_name, fvar_mode, true /* is valid LHS */,
+ Variable::NORMAL, kCreatedInitialized, kNotAssigned,
+ Interface::NewConst());
VariableProxy* proxy = factory()->NewVariableProxy(fvar);
VariableDeclaration* fvar_declaration = factory()->NewVariableDeclaration(
proxy, fvar_mode, scope_, RelocInfo::kNoPosition);
« no previous file with comments | « src/objects-visiting-inl.h ('k') | src/property.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698