| Index: src/parser.cc
|
| ===================================================================
|
| --- src/parser.cc (revision 7030)
|
| +++ src/parser.cc (working copy)
|
| @@ -2302,6 +2302,11 @@
|
| expression = NewThrowReferenceError(type);
|
| }
|
|
|
| + if (temp_scope_->StrictMode()) {
|
| + // Assignment to eval or arguments is disallowed in strict mode.
|
| + CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK);
|
| + }
|
| +
|
| Token::Value op = Next(); // Get assignment operator.
|
| int pos = scanner().location().beg_pos;
|
| Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
| @@ -2529,6 +2534,12 @@
|
| isolate()->factory()->invalid_lhs_in_prefix_op_symbol();
|
| expression = NewThrowReferenceError(type);
|
| }
|
| +
|
| + if (temp_scope_->StrictMode()) {
|
| + // Prefix expression operand in strict mode may not be eval or arguments.
|
| + CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
|
| + }
|
| +
|
| int position = scanner().location().beg_pos;
|
| IncrementOperation* increment = new IncrementOperation(op, expression);
|
| return new CountOperation(true /* prefix */, increment, position);
|
| @@ -2555,6 +2566,12 @@
|
| isolate()->factory()->invalid_lhs_in_postfix_op_symbol();
|
| expression = NewThrowReferenceError(type);
|
| }
|
| +
|
| + if (temp_scope_->StrictMode()) {
|
| + // Postfix expression operand in strict mode may not be eval or arguments.
|
| + CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
|
| + }
|
| +
|
| Token::Value next = Next();
|
| int position = scanner().location().beg_pos;
|
| IncrementOperation* increment = new IncrementOperation(next, expression);
|
| @@ -3031,7 +3048,7 @@
|
|
|
| // Defined in ast.cc
|
| bool IsEqualString(void* first, void* second);
|
| -bool IsEqualSmi(void* first, void* second);
|
| +bool IsEqualNumber(void* first, void* second);
|
|
|
|
|
| // Validation per 11.1.5 Object Initialiser
|
| @@ -3039,7 +3056,7 @@
|
| public:
|
| ObjectLiteralPropertyChecker(Parser* parser, bool strict) :
|
| props(&IsEqualString),
|
| - elems(&IsEqualSmi),
|
| + elems(&IsEqualNumber),
|
| parser_(parser),
|
| strict_(strict) {
|
| }
|
| @@ -3088,13 +3105,12 @@
|
| uint32_t hash;
|
| HashMap* map;
|
| void* key;
|
| - Smi* smi_key_location;
|
|
|
| if (handle->IsSymbol()) {
|
| Handle<String> name(String::cast(*handle));
|
| if (name->AsArrayIndex(&hash)) {
|
| - smi_key_location = Smi::FromInt(hash);
|
| - key = &smi_key_location;
|
| + Handle<Object> key_handle = FACTORY->NewNumberFromUint(hash);
|
| + key = key_handle.location();
|
| map = &elems;
|
| } else {
|
| key = handle.location();
|
| @@ -3707,6 +3723,24 @@
|
| return GetSymbol(ok);
|
| }
|
|
|
| +
|
| +// Checks LHS expression for assignment and prefix/postfix increment/decrement
|
| +// in strict mode.
|
| +void Parser::CheckStrictModeLValue(Expression* expression,
|
| + const char* error,
|
| + bool* ok) {
|
| + ASSERT(temp_scope_->StrictMode());
|
| + VariableProxy* lhs = expression != NULL
|
| + ? expression->AsVariableProxy()
|
| + : NULL;
|
| +
|
| + if (lhs != NULL && !lhs->is_this() && IsEvalOrArguments(lhs->name())) {
|
| + ReportMessage(error, Vector<const char*>::empty());
|
| + *ok = false;
|
| + }
|
| +}
|
| +
|
| +
|
| // Checks whether octal literal last seen is between beg_pos and end_pos.
|
| // If so, reports an error.
|
| void Parser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
|
|
|