| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } | 405 } |
| 406 | 406 |
| 407 | 407 |
| 408 Scope* Parser::NewScope(Scope* parent, Scope::Type type, bool inside_with) { | 408 Scope* Parser::NewScope(Scope* parent, Scope::Type type, bool inside_with) { |
| 409 Scope* result = new(zone()) Scope(parent, type); | 409 Scope* result = new(zone()) Scope(parent, type); |
| 410 result->Initialize(inside_with); | 410 result->Initialize(inside_with); |
| 411 return result; | 411 return result; |
| 412 } | 412 } |
| 413 | 413 |
| 414 | 414 |
| 415 Scope* Parser::DeclarationScope() { | |
| 416 Scope* scope = top_scope_; | |
| 417 while (scope->is_catch_scope()) { | |
| 418 scope = scope->outer_scope(); | |
| 419 } | |
| 420 return scope; | |
| 421 } | |
| 422 | |
| 423 // ---------------------------------------------------------------------------- | 415 // ---------------------------------------------------------------------------- |
| 424 // Target is a support class to facilitate manipulation of the | 416 // Target is a support class to facilitate manipulation of the |
| 425 // Parser's target_stack_ (the stack of potential 'break' and | 417 // Parser's target_stack_ (the stack of potential 'break' and |
| 426 // 'continue' statement targets). Upon construction, a new target is | 418 // 'continue' statement targets). Upon construction, a new target is |
| 427 // added; it is removed upon destruction. | 419 // added; it is removed upon destruction. |
| 428 | 420 |
| 429 class Target BASE_EMBEDDED { | 421 class Target BASE_EMBEDDED { |
| 430 public: | 422 public: |
| 431 Target(Target** variable, AstNode* node) | 423 Target(Target** variable, AstNode* node) |
| 432 : variable_(variable), node_(node), previous_(*variable) { | 424 : variable_(variable), node_(node), previous_(*variable) { |
| (...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1303 // is always the function scope. | 1295 // is always the function scope. |
| 1304 | 1296 |
| 1305 // If a function scope exists, then we can statically declare this | 1297 // If a function scope exists, then we can statically declare this |
| 1306 // variable and also set its mode. In any case, a Declaration node | 1298 // variable and also set its mode. In any case, a Declaration node |
| 1307 // will be added to the scope so that the declaration can be added | 1299 // will be added to the scope so that the declaration can be added |
| 1308 // to the corresponding activation frame at runtime if necessary. | 1300 // to the corresponding activation frame at runtime if necessary. |
| 1309 // For instance declarations inside an eval scope need to be added | 1301 // For instance declarations inside an eval scope need to be added |
| 1310 // to the calling function context. | 1302 // to the calling function context. |
| 1311 // Similarly, strict mode eval scope does not leak variable declarations to | 1303 // Similarly, strict mode eval scope does not leak variable declarations to |
| 1312 // the caller's scope so we declare all locals, too. | 1304 // the caller's scope so we declare all locals, too. |
| 1313 Scope* declaration_scope = DeclarationScope(); | 1305 Scope* declaration_scope = top_scope_->DeclarationScope(); |
| 1314 if (declaration_scope->is_function_scope() || | 1306 if (declaration_scope->is_function_scope() || |
| 1315 declaration_scope->is_strict_mode_eval_scope()) { | 1307 declaration_scope->is_strict_mode_eval_scope()) { |
| 1316 // Declare the variable in the function scope. | 1308 // Declare the variable in the function scope. |
| 1317 var = declaration_scope->LocalLookup(name); | 1309 var = declaration_scope->LocalLookup(name); |
| 1318 if (var == NULL) { | 1310 if (var == NULL) { |
| 1319 // Declare the name. | 1311 // Declare the name. |
| 1320 var = declaration_scope->DeclareLocal(name, mode); | 1312 var = declaration_scope->DeclareLocal(name, mode); |
| 1321 } else { | 1313 } else { |
| 1322 // The name was declared before; check for conflicting | 1314 // The name was declared before; check for conflicting |
| 1323 // re-declarations. If the previous declaration was a const or the | 1315 // re-declarations. If the previous declaration was a const or the |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1414 Expect(Token::COMMA, CHECK_OK); | 1406 Expect(Token::COMMA, CHECK_OK); |
| 1415 } | 1407 } |
| 1416 } | 1408 } |
| 1417 Expect(Token::RPAREN, CHECK_OK); | 1409 Expect(Token::RPAREN, CHECK_OK); |
| 1418 Expect(Token::SEMICOLON, CHECK_OK); | 1410 Expect(Token::SEMICOLON, CHECK_OK); |
| 1419 | 1411 |
| 1420 // Make sure that the function containing the native declaration | 1412 // Make sure that the function containing the native declaration |
| 1421 // isn't lazily compiled. The extension structures are only | 1413 // isn't lazily compiled. The extension structures are only |
| 1422 // accessible while parsing the first time not when reparsing | 1414 // accessible while parsing the first time not when reparsing |
| 1423 // because of lazy compilation. | 1415 // because of lazy compilation. |
| 1424 DeclarationScope()->ForceEagerCompilation(); | 1416 top_scope_->DeclarationScope()->ForceEagerCompilation(); |
| 1425 | 1417 |
| 1426 // Compute the function template for the native function. | 1418 // Compute the function template for the native function. |
| 1427 v8::Handle<v8::FunctionTemplate> fun_template = | 1419 v8::Handle<v8::FunctionTemplate> fun_template = |
| 1428 extension_->GetNativeFunction(v8::Utils::ToLocal(name)); | 1420 extension_->GetNativeFunction(v8::Utils::ToLocal(name)); |
| 1429 ASSERT(!fun_template.IsEmpty()); | 1421 ASSERT(!fun_template.IsEmpty()); |
| 1430 | 1422 |
| 1431 // Instantiate the function and create a shared function info from it. | 1423 // Instantiate the function and create a shared function info from it. |
| 1432 Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction()); | 1424 Handle<JSFunction> fun = Utils::OpenHandle(*fun_template->GetFunction()); |
| 1433 const int literals = fun->NumberOfLiterals(); | 1425 const int literals = fun->NumberOfLiterals(); |
| 1434 Handle<Code> code = Handle<Code>(fun->shared()->code()); | 1426 Handle<Code> code = Handle<Code>(fun->shared()->code()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1518 // to initialize it properly. This mechanism is used for the parsing | 1510 // to initialize it properly. This mechanism is used for the parsing |
| 1519 // of 'for-in' loops. | 1511 // of 'for-in' loops. |
| 1520 Block* Parser::ParseVariableDeclarations(bool accept_IN, | 1512 Block* Parser::ParseVariableDeclarations(bool accept_IN, |
| 1521 Handle<String>* out, | 1513 Handle<String>* out, |
| 1522 bool* ok) { | 1514 bool* ok) { |
| 1523 // VariableDeclarations :: | 1515 // VariableDeclarations :: |
| 1524 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[','] | 1516 // ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[','] |
| 1525 | 1517 |
| 1526 Variable::Mode mode = Variable::VAR; | 1518 Variable::Mode mode = Variable::VAR; |
| 1527 bool is_const = false; | 1519 bool is_const = false; |
| 1528 Scope* declaration_scope = DeclarationScope(); | 1520 Scope* declaration_scope = top_scope_->DeclarationScope(); |
| 1529 if (peek() == Token::VAR) { | 1521 if (peek() == Token::VAR) { |
| 1530 Consume(Token::VAR); | 1522 Consume(Token::VAR); |
| 1531 } else if (peek() == Token::CONST) { | 1523 } else if (peek() == Token::CONST) { |
| 1532 Consume(Token::CONST); | 1524 Consume(Token::CONST); |
| 1533 if (declaration_scope->is_strict_mode()) { | 1525 if (declaration_scope->is_strict_mode()) { |
| 1534 ReportMessage("strict_const", Vector<const char*>::empty()); | 1526 ReportMessage("strict_const", Vector<const char*>::empty()); |
| 1535 *ok = false; | 1527 *ok = false; |
| 1536 return NULL; | 1528 return NULL; |
| 1537 } | 1529 } |
| 1538 mode = Variable::CONST; | 1530 mode = Variable::CONST; |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1908 // Consume the return token. It is necessary to do the before | 1900 // Consume the return token. It is necessary to do the before |
| 1909 // reporting any errors on it, because of the way errors are | 1901 // reporting any errors on it, because of the way errors are |
| 1910 // reported (underlining). | 1902 // reported (underlining). |
| 1911 Expect(Token::RETURN, CHECK_OK); | 1903 Expect(Token::RETURN, CHECK_OK); |
| 1912 | 1904 |
| 1913 // An ECMAScript program is considered syntactically incorrect if it | 1905 // An ECMAScript program is considered syntactically incorrect if it |
| 1914 // contains a return statement that is not within the body of a | 1906 // contains a return statement that is not within the body of a |
| 1915 // function. See ECMA-262, section 12.9, page 67. | 1907 // function. See ECMA-262, section 12.9, page 67. |
| 1916 // | 1908 // |
| 1917 // To be consistent with KJS we report the syntax error at runtime. | 1909 // To be consistent with KJS we report the syntax error at runtime. |
| 1918 Scope* declaration_scope = DeclarationScope(); | 1910 Scope* declaration_scope = top_scope_->DeclarationScope(); |
| 1919 if (declaration_scope->is_global_scope() || | 1911 if (declaration_scope->is_global_scope() || |
| 1920 declaration_scope->is_eval_scope()) { | 1912 declaration_scope->is_eval_scope()) { |
| 1921 Handle<String> type = isolate()->factory()->illegal_return_symbol(); | 1913 Handle<String> type = isolate()->factory()->illegal_return_symbol(); |
| 1922 Expression* throw_error = NewThrowSyntaxError(type, Handle<Object>::null()); | 1914 Expression* throw_error = NewThrowSyntaxError(type, Handle<Object>::null()); |
| 1923 return new(zone()) ExpressionStatement(throw_error); | 1915 return new(zone()) ExpressionStatement(throw_error); |
| 1924 } | 1916 } |
| 1925 | 1917 |
| 1926 Token::Value tok = peek(); | 1918 Token::Value tok = peek(); |
| 1927 if (scanner().HasAnyLineTerminatorBeforeNext() || | 1919 if (scanner().HasAnyLineTerminatorBeforeNext() || |
| 1928 tok == Token::SEMICOLON || | 1920 tok == Token::SEMICOLON || |
| 1929 tok == Token::RBRACE || | 1921 tok == Token::RBRACE || |
| 1930 tok == Token::EOS) { | 1922 tok == Token::EOS) { |
| 1931 ExpectSemicolon(CHECK_OK); | 1923 ExpectSemicolon(CHECK_OK); |
| 1932 return new(zone()) ReturnStatement(GetLiteralUndefined()); | 1924 return new(zone()) ReturnStatement(GetLiteralUndefined()); |
| 1933 } | 1925 } |
| 1934 | 1926 |
| 1935 Expression* expr = ParseExpression(true, CHECK_OK); | 1927 Expression* expr = ParseExpression(true, CHECK_OK); |
| 1936 ExpectSemicolon(CHECK_OK); | 1928 ExpectSemicolon(CHECK_OK); |
| 1937 return new(zone()) ReturnStatement(expr); | 1929 return new(zone()) ReturnStatement(expr); |
| 1938 } | 1930 } |
| 1939 | 1931 |
| 1940 | 1932 |
| 1941 Block* Parser::WithHelper(Expression* obj, ZoneStringList* labels, bool* ok) { | 1933 Block* Parser::WithHelper(Expression* obj, ZoneStringList* labels, bool* ok) { |
| 1942 // Parse the statement and collect escaping labels. | 1934 // Parse the statement and collect escaping labels. |
| 1943 TargetCollector collector; | 1935 TargetCollector collector; |
| 1944 Statement* stat; | 1936 Statement* stat; |
| 1945 { Target target(&this->target_stack_, &collector); | 1937 { Target target(&this->target_stack_, &collector); |
| 1946 with_nesting_level_++; | 1938 with_nesting_level_++; |
| 1947 DeclarationScope()->RecordWithStatement(); | 1939 top_scope_->DeclarationScope()->RecordWithStatement(); |
| 1948 stat = ParseStatement(labels, CHECK_OK); | 1940 stat = ParseStatement(labels, CHECK_OK); |
| 1949 with_nesting_level_--; | 1941 with_nesting_level_--; |
| 1950 } | 1942 } |
| 1951 // Create resulting block with two statements. | 1943 // Create resulting block with two statements. |
| 1952 // 1: Evaluate the with expression. | 1944 // 1: Evaluate the with expression. |
| 1953 // 2: The try-finally block evaluating the body. | 1945 // 2: The try-finally block evaluating the body. |
| 1954 Block* result = new(zone()) Block(NULL, 2, false); | 1946 Block* result = new(zone()) Block(NULL, 2, false); |
| 1955 | 1947 |
| 1956 if (result != NULL) { | 1948 if (result != NULL) { |
| 1957 result->AddStatement(new(zone()) EnterWithContextStatement(obj)); | 1949 result->AddStatement(new(zone()) EnterWithContextStatement(obj)); |
| (...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3795 // CallRuntime :: | 3787 // CallRuntime :: |
| 3796 // '%' Identifier Arguments | 3788 // '%' Identifier Arguments |
| 3797 | 3789 |
| 3798 Expect(Token::MOD, CHECK_OK); | 3790 Expect(Token::MOD, CHECK_OK); |
| 3799 Handle<String> name = ParseIdentifier(CHECK_OK); | 3791 Handle<String> name = ParseIdentifier(CHECK_OK); |
| 3800 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); | 3792 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
| 3801 | 3793 |
| 3802 if (extension_ != NULL) { | 3794 if (extension_ != NULL) { |
| 3803 // The extension structures are only accessible while parsing the | 3795 // The extension structures are only accessible while parsing the |
| 3804 // very first time not when reparsing because of lazy compilation. | 3796 // very first time not when reparsing because of lazy compilation. |
| 3805 DeclarationScope()->ForceEagerCompilation(); | 3797 top_scope_->DeclarationScope()->ForceEagerCompilation(); |
| 3806 } | 3798 } |
| 3807 | 3799 |
| 3808 const Runtime::Function* function = Runtime::FunctionForSymbol(name); | 3800 const Runtime::Function* function = Runtime::FunctionForSymbol(name); |
| 3809 | 3801 |
| 3810 // Check for built-in IS_VAR macro. | 3802 // Check for built-in IS_VAR macro. |
| 3811 if (function != NULL && | 3803 if (function != NULL && |
| 3812 function->intrinsic_type == Runtime::RUNTIME && | 3804 function->intrinsic_type == Runtime::RUNTIME && |
| 3813 function->function_id == Runtime::kIS_VAR) { | 3805 function->function_id == Runtime::kIS_VAR) { |
| 3814 // %IS_VAR(x) evaluates to x if x is a variable, | 3806 // %IS_VAR(x) evaluates to x if x is a variable, |
| 3815 // leads to a parse error otherwise. Could be implemented as an | 3807 // leads to a parse error otherwise. Could be implemented as an |
| (...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5075 info->is_global(), | 5067 info->is_global(), |
| 5076 info->StrictMode()); | 5068 info->StrictMode()); |
| 5077 } | 5069 } |
| 5078 } | 5070 } |
| 5079 | 5071 |
| 5080 info->SetFunction(result); | 5072 info->SetFunction(result); |
| 5081 return (result != NULL); | 5073 return (result != NULL); |
| 5082 } | 5074 } |
| 5083 | 5075 |
| 5084 } } // namespace v8::internal | 5076 } } // namespace v8::internal |
| OLD | NEW |