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

Side by Side Diff: src/parser.cc

Issue 885643004: new classes: assert that constructors are not callable and rewrite 'return;' (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 function_scope->SetLanguageMode( 291 function_scope->SetLanguageMode(
292 static_cast<LanguageMode>(scope->language_mode() | STRICT)); 292 static_cast<LanguageMode>(scope->language_mode() | STRICT));
293 // Set start and end position to the same value 293 // Set start and end position to the same value
294 function_scope->set_start_position(pos); 294 function_scope->set_start_position(pos);
295 function_scope->set_end_position(pos); 295 function_scope->set_end_position(pos);
296 ZoneList<Statement*>* body = NULL; 296 ZoneList<Statement*>* body = NULL;
297 297
298 { 298 {
299 AstNodeFactory function_factory(ast_value_factory()); 299 AstNodeFactory function_factory(ast_value_factory());
300 FunctionState function_state(&function_state_, &scope_, function_scope, 300 FunctionState function_state(&function_state_, &scope_, function_scope,
301 &function_factory); 301 kDefaultConstructor, &function_factory);
302 302
303 body = new (zone()) ZoneList<Statement*>(1, zone()); 303 body = new (zone()) ZoneList<Statement*>(1, zone());
304 if (call_super) { 304 if (call_super) {
305 ZoneList<Expression*>* args = 305 ZoneList<Expression*>* args =
306 new (zone()) ZoneList<Expression*>(0, zone()); 306 new (zone()) ZoneList<Expression*>(0, zone());
307 CallRuntime* call = factory()->NewCallRuntime( 307 CallRuntime* call = factory()->NewCallRuntime(
308 ast_value_factory()->empty_string(), 308 ast_value_factory()->empty_string(),
309 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args, 309 Runtime::FunctionForId(Runtime::kDefaultConstructorSuperCall), args,
310 pos); 310 pos);
311 body->Add(factory()->NewExpressionStatement(call, pos), zone()); 311 body->Add(factory()->NewExpressionStatement(call, pos), zone());
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY; 938 Mode mode = (FLAG_lazy && allow_lazy()) ? PARSE_LAZILY : PARSE_EAGERLY;
939 if (allow_natives() || extension_ != NULL || 939 if (allow_natives() || extension_ != NULL ||
940 (*scope)->is_eval_scope()) { 940 (*scope)->is_eval_scope()) {
941 mode = PARSE_EAGERLY; 941 mode = PARSE_EAGERLY;
942 } 942 }
943 ParsingModeScope parsing_mode(this, mode); 943 ParsingModeScope parsing_mode(this, mode);
944 944
945 // Enters 'scope'. 945 // Enters 'scope'.
946 AstNodeFactory function_factory(ast_value_factory()); 946 AstNodeFactory function_factory(ast_value_factory());
947 FunctionState function_state(&function_state_, &scope_, *scope, 947 FunctionState function_state(&function_state_, &scope_, *scope,
948 &function_factory); 948 kNormalFunction, &function_factory);
949 949
950 scope_->SetLanguageMode(info->language_mode()); 950 scope_->SetLanguageMode(info->language_mode());
951 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone()); 951 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16, zone());
952 bool ok = true; 952 bool ok = true;
953 int beg_pos = scanner()->location().beg_pos; 953 int beg_pos = scanner()->location().beg_pos;
954 if (info->is_module()) { 954 if (info->is_module()) {
955 DCHECK(allow_harmony_modules()); 955 DCHECK(allow_harmony_modules());
956 Module* module = ParseModule(&ok); 956 Module* module = ParseModule(&ok);
957 if (ok) { 957 if (ok) {
958 // TODO(adamk): Do something with returned Module 958 // TODO(adamk): Do something with returned Module
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 // Parse the function literal. 1058 // Parse the function literal.
1059 Scope* scope = NewScope(scope_, SCRIPT_SCOPE); 1059 Scope* scope = NewScope(scope_, SCRIPT_SCOPE);
1060 info()->SetScriptScope(scope); 1060 info()->SetScriptScope(scope);
1061 if (!info()->closure().is_null()) { 1061 if (!info()->closure().is_null()) {
1062 scope = Scope::DeserializeScopeChain(isolate(), zone(), 1062 scope = Scope::DeserializeScopeChain(isolate(), zone(),
1063 info()->closure()->context(), scope); 1063 info()->closure()->context(), scope);
1064 } 1064 }
1065 original_scope_ = scope; 1065 original_scope_ = scope;
1066 AstNodeFactory function_factory(ast_value_factory()); 1066 AstNodeFactory function_factory(ast_value_factory());
1067 FunctionState function_state(&function_state_, &scope_, scope, 1067 FunctionState function_state(&function_state_, &scope_, scope,
1068 &function_factory); 1068 shared_info->kind(), &function_factory);
1069 DCHECK(is_sloppy(scope->language_mode()) || 1069 DCHECK(is_sloppy(scope->language_mode()) ||
1070 is_strict(info()->language_mode())); 1070 is_strict(info()->language_mode()));
1071 DCHECK(info()->language_mode() == shared_info->language_mode()); 1071 DCHECK(info()->language_mode() == shared_info->language_mode());
1072 scope->SetLanguageMode(shared_info->language_mode()); 1072 scope->SetLanguageMode(shared_info->language_mode());
1073 FunctionLiteral::FunctionType function_type = shared_info->is_expression() 1073 FunctionLiteral::FunctionType function_type = shared_info->is_expression()
1074 ? (shared_info->is_anonymous() 1074 ? (shared_info->is_anonymous()
1075 ? FunctionLiteral::ANONYMOUS_EXPRESSION 1075 ? FunctionLiteral::ANONYMOUS_EXPRESSION
1076 : FunctionLiteral::NAMED_EXPRESSION) 1076 : FunctionLiteral::NAMED_EXPRESSION)
1077 : FunctionLiteral::DECLARATION; 1077 : FunctionLiteral::DECLARATION;
1078 bool ok = true; 1078 bool ok = true;
(...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after
2628 Expect(Token::RETURN, CHECK_OK); 2628 Expect(Token::RETURN, CHECK_OK);
2629 Scanner::Location loc = scanner()->location(); 2629 Scanner::Location loc = scanner()->location();
2630 2630
2631 Token::Value tok = peek(); 2631 Token::Value tok = peek();
2632 Statement* result; 2632 Statement* result;
2633 Expression* return_value; 2633 Expression* return_value;
2634 if (scanner()->HasAnyLineTerminatorBeforeNext() || 2634 if (scanner()->HasAnyLineTerminatorBeforeNext() ||
2635 tok == Token::SEMICOLON || 2635 tok == Token::SEMICOLON ||
2636 tok == Token::RBRACE || 2636 tok == Token::RBRACE ||
2637 tok == Token::EOS) { 2637 tok == Token::EOS) {
2638 return_value = GetLiteralUndefined(position()); 2638 if (FLAG_experimental_classes &&
2639 IsSubclassConstructor(function_state_->kind())) {
2640 return_value = ThisExpression(scope_, factory(), loc.beg_pos);
2641 } else {
2642 return_value = GetLiteralUndefined(position());
2643 }
2639 } else { 2644 } else {
2640 return_value = ParseExpression(true, CHECK_OK); 2645 return_value = ParseExpression(true, CHECK_OK);
2641 } 2646 }
2642 ExpectSemicolon(CHECK_OK); 2647 ExpectSemicolon(CHECK_OK);
2648
2643 if (is_generator()) { 2649 if (is_generator()) {
2644 Expression* generator = factory()->NewVariableProxy( 2650 Expression* generator = factory()->NewVariableProxy(
2645 function_state_->generator_object_variable()); 2651 function_state_->generator_object_variable());
2646 Expression* yield = factory()->NewYield( 2652 Expression* yield = factory()->NewYield(
2647 generator, return_value, Yield::kFinal, loc.beg_pos); 2653 generator, return_value, Yield::kFinal, loc.beg_pos);
2648 result = factory()->NewExpressionStatement(yield, loc.beg_pos); 2654 result = factory()->NewExpressionStatement(yield, loc.beg_pos);
2649 } else { 2655 } else {
2650 result = factory()->NewReturnStatement(return_value, loc.beg_pos); 2656 result = factory()->NewReturnStatement(return_value, loc.beg_pos);
2651 } 2657 }
2652 2658
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after
3649 int expected_property_count = -1; 3655 int expected_property_count = -1;
3650 int handler_count = 0; 3656 int handler_count = 0;
3651 FunctionLiteral::ParameterFlag duplicate_parameters = 3657 FunctionLiteral::ParameterFlag duplicate_parameters =
3652 FunctionLiteral::kNoDuplicateParameters; 3658 FunctionLiteral::kNoDuplicateParameters;
3653 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ 3659 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_
3654 ? FunctionLiteral::kIsParenthesized 3660 ? FunctionLiteral::kIsParenthesized
3655 : FunctionLiteral::kNotParenthesized; 3661 : FunctionLiteral::kNotParenthesized;
3656 // Parse function body. 3662 // Parse function body.
3657 { 3663 {
3658 AstNodeFactory function_factory(ast_value_factory()); 3664 AstNodeFactory function_factory(ast_value_factory());
3659 FunctionState function_state(&function_state_, &scope_, scope, 3665 FunctionState function_state(&function_state_, &scope_, scope, kind,
3660 &function_factory); 3666 &function_factory);
3661 scope_->SetScopeName(function_name); 3667 scope_->SetScopeName(function_name);
3662 3668
3663 if (is_generator) { 3669 if (is_generator) {
3664 // For generators, allocating variables in contexts is currently a win 3670 // For generators, allocating variables in contexts is currently a win
3665 // because it minimizes the work needed to suspend and resume an 3671 // because it minimizes the work needed to suspend and resume an
3666 // activation. 3672 // activation.
3667 scope_->ForceContextAllocation(); 3673 scope_->ForceContextAllocation();
3668 3674
3669 // Calling a generator returns a generator object. That object is stored 3675 // Calling a generator returns a generator object. That object is stored
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
3803 bool is_lazily_parsed = (mode() == PARSE_LAZILY && 3809 bool is_lazily_parsed = (mode() == PARSE_LAZILY &&
3804 scope_->AllowsLazyCompilation() && 3810 scope_->AllowsLazyCompilation() &&
3805 !parenthesized_function_); 3811 !parenthesized_function_);
3806 parenthesized_function_ = false; // The bit was set for this function only. 3812 parenthesized_function_ = false; // The bit was set for this function only.
3807 3813
3808 if (is_lazily_parsed) { 3814 if (is_lazily_parsed) {
3809 SkipLazyFunctionBody(function_name, &materialized_literal_count, 3815 SkipLazyFunctionBody(function_name, &materialized_literal_count,
3810 &expected_property_count, CHECK_OK); 3816 &expected_property_count, CHECK_OK);
3811 } else { 3817 } else {
3812 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op, 3818 body = ParseEagerFunctionBody(function_name, pos, fvar, fvar_init_op,
3813 is_generator, CHECK_OK); 3819 kind, CHECK_OK);
3814 materialized_literal_count = function_state.materialized_literal_count(); 3820 materialized_literal_count = function_state.materialized_literal_count();
3815 expected_property_count = function_state.expected_property_count(); 3821 expected_property_count = function_state.expected_property_count();
3816 handler_count = function_state.handler_count(); 3822 handler_count = function_state.handler_count();
3817 } 3823 }
3818 3824
3819 // Validate strict mode. 3825 // Validate strict mode.
3820 // Concise methods use StrictFormalParameters. 3826 // Concise methods use StrictFormalParameters.
3821 // Functions for which IsSimpleParameterList() returns false use 3827 // Functions for which IsSimpleParameterList() returns false use
3822 // StrictFormalParameters. 3828 // StrictFormalParameters.
3823 if (is_strict(language_mode()) || IsConciseMethod(kind) || is_rest) { 3829 if (is_strict(language_mode()) || IsConciseMethod(kind) || is_rest) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
3913 // Position right after terminal '}'. 3919 // Position right after terminal '}'.
3914 int body_end = scanner()->location().end_pos; 3920 int body_end = scanner()->location().end_pos;
3915 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count, 3921 log_->LogFunction(function_block_pos, body_end, *materialized_literal_count,
3916 *expected_property_count, scope_->language_mode()); 3922 *expected_property_count, scope_->language_mode());
3917 } 3923 }
3918 } 3924 }
3919 3925
3920 3926
3921 ZoneList<Statement*>* Parser::ParseEagerFunctionBody( 3927 ZoneList<Statement*>* Parser::ParseEagerFunctionBody(
3922 const AstRawString* function_name, int pos, Variable* fvar, 3928 const AstRawString* function_name, int pos, Variable* fvar,
3923 Token::Value fvar_init_op, bool is_generator, bool* ok) { 3929 Token::Value fvar_init_op, FunctionKind kind, bool* ok) {
3924 // Everything inside an eagerly parsed function will be parsed eagerly 3930 // Everything inside an eagerly parsed function will be parsed eagerly
3925 // (see comment above). 3931 // (see comment above).
3926 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); 3932 ParsingModeScope parsing_mode(this, PARSE_EAGERLY);
3927 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone()); 3933 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(8, zone());
3928 if (fvar != NULL) { 3934 if (fvar != NULL) {
3929 VariableProxy* fproxy = scope_->NewUnresolved( 3935 VariableProxy* fproxy = scope_->NewUnresolved(
3930 factory(), function_name, Interface::NewConst()); 3936 factory(), function_name, Interface::NewConst());
3931 fproxy->BindTo(fvar); 3937 fproxy->BindTo(fvar);
3932 body->Add(factory()->NewExpressionStatement( 3938 body->Add(factory()->NewExpressionStatement(
3933 factory()->NewAssignment(fvar_init_op, 3939 factory()->NewAssignment(fvar_init_op,
3934 fproxy, 3940 fproxy,
3935 factory()->NewThisFunction(pos), 3941 factory()->NewThisFunction(pos),
3936 RelocInfo::kNoPosition), 3942 RelocInfo::kNoPosition),
3937 RelocInfo::kNoPosition), zone()); 3943 RelocInfo::kNoPosition), zone());
3938 } 3944 }
3939 3945
3946
3947 // For concise constructors, check that they are constructed,
3948 // not called.
3949 if (FLAG_experimental_classes && i::IsConstructor(kind)) {
3950 ZoneList<Expression*>* arguments =
3951 new (zone()) ZoneList<Expression*>(0, zone());
3952 CallRuntime* construct_check = factory()->NewCallRuntime(
3953 ast_value_factory()->is_construct_call_string(),
3954 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments,
3955 pos);
3956 CallRuntime* non_callable_error = factory()->NewCallRuntime(
3957 ast_value_factory()->empty_string(),
3958 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError),
3959 arguments, pos);
3960 IfStatement* if_statement = factory()->NewIfStatement(
3961 factory()->NewUnaryOperation(Token::NOT, construct_check, pos),
3962 factory()->NewReturnStatement(non_callable_error, pos),
3963 factory()->NewEmptyStatement(pos), pos);
3964 body->Add(if_statement, zone());
3965 }
3966
3940 // For generators, allocate and yield an iterator on function entry. 3967 // For generators, allocate and yield an iterator on function entry.
3941 if (is_generator) { 3968 if (IsGeneratorFunction(kind)) {
3942 ZoneList<Expression*>* arguments = 3969 ZoneList<Expression*>* arguments =
3943 new(zone()) ZoneList<Expression*>(0, zone()); 3970 new(zone()) ZoneList<Expression*>(0, zone());
3944 CallRuntime* allocation = factory()->NewCallRuntime( 3971 CallRuntime* allocation = factory()->NewCallRuntime(
3945 ast_value_factory()->empty_string(), 3972 ast_value_factory()->empty_string(),
3946 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments, 3973 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments,
3947 pos); 3974 pos);
3948 VariableProxy* init_proxy = factory()->NewVariableProxy( 3975 VariableProxy* init_proxy = factory()->NewVariableProxy(
3949 function_state_->generator_object_variable()); 3976 function_state_->generator_object_variable());
3950 Assignment* assignment = factory()->NewAssignment( 3977 Assignment* assignment = factory()->NewAssignment(
3951 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition); 3978 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition);
3952 VariableProxy* get_proxy = factory()->NewVariableProxy( 3979 VariableProxy* get_proxy = factory()->NewVariableProxy(
3953 function_state_->generator_object_variable()); 3980 function_state_->generator_object_variable());
3954 Yield* yield = factory()->NewYield( 3981 Yield* yield = factory()->NewYield(
3955 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); 3982 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition);
3956 body->Add(factory()->NewExpressionStatement( 3983 body->Add(factory()->NewExpressionStatement(
3957 yield, RelocInfo::kNoPosition), zone()); 3984 yield, RelocInfo::kNoPosition), zone());
3958 } 3985 }
3959 3986
3960 ParseStatementList(body, Token::RBRACE, false, NULL, CHECK_OK); 3987 ParseStatementList(body, Token::RBRACE, false, NULL, CHECK_OK);
3961 3988
3962 if (is_generator) { 3989 if (IsGeneratorFunction(kind)) {
3963 VariableProxy* get_proxy = factory()->NewVariableProxy( 3990 VariableProxy* get_proxy = factory()->NewVariableProxy(
3964 function_state_->generator_object_variable()); 3991 function_state_->generator_object_variable());
3965 Expression* undefined = 3992 Expression* undefined =
3966 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition); 3993 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition);
3967 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal, 3994 Yield* yield = factory()->NewYield(get_proxy, undefined, Yield::kFinal,
3968 RelocInfo::kNoPosition); 3995 RelocInfo::kNoPosition);
3969 body->Add(factory()->NewExpressionStatement( 3996 body->Add(factory()->NewExpressionStatement(
3970 yield, RelocInfo::kNoPosition), zone()); 3997 yield, RelocInfo::kNoPosition), zone());
3971 } 3998 }
3972 3999
4000 if (FLAG_experimental_classes && IsSubclassConstructor(kind)) {
4001 body->Add(
4002 factory()->NewReturnStatement(
4003 this->ThisExpression(scope_, factory(), RelocInfo::kNoPosition),
4004 RelocInfo::kNoPosition),
4005 zone());
4006 }
4007
3973 Expect(Token::RBRACE, CHECK_OK); 4008 Expect(Token::RBRACE, CHECK_OK);
3974 scope_->set_end_position(scanner()->location().end_pos); 4009 scope_->set_end_position(scanner()->location().end_pos);
3975 4010
3976 return body; 4011 return body;
3977 } 4012 }
3978 4013
3979 4014
3980 PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser( 4015 PreParser::PreParseResult Parser::ParseLazyFunctionBodyWithPreParser(
3981 SingletonLogger* logger) { 4016 SingletonLogger* logger) {
3982 // This function may be called on a background thread too; record only the 4017 // This function may be called on a background thread too; record only the
(...skipping 19 matching lines...) Expand all
4002 allow_harmony_object_literals()); 4037 allow_harmony_object_literals());
4003 reusable_preparser_->set_allow_harmony_templates(allow_harmony_templates()); 4038 reusable_preparser_->set_allow_harmony_templates(allow_harmony_templates());
4004 reusable_preparser_->set_allow_harmony_sloppy(allow_harmony_sloppy()); 4039 reusable_preparser_->set_allow_harmony_sloppy(allow_harmony_sloppy());
4005 reusable_preparser_->set_allow_harmony_unicode(allow_harmony_unicode()); 4040 reusable_preparser_->set_allow_harmony_unicode(allow_harmony_unicode());
4006 reusable_preparser_->set_allow_harmony_computed_property_names( 4041 reusable_preparser_->set_allow_harmony_computed_property_names(
4007 allow_harmony_computed_property_names()); 4042 allow_harmony_computed_property_names());
4008 reusable_preparser_->set_allow_harmony_rest_params( 4043 reusable_preparser_->set_allow_harmony_rest_params(
4009 allow_harmony_rest_params()); 4044 allow_harmony_rest_params());
4010 } 4045 }
4011 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( 4046 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction(
4012 language_mode(), is_generator(), logger); 4047 language_mode(), function_state_->kind(), logger);
4013 if (pre_parse_timer_ != NULL) { 4048 if (pre_parse_timer_ != NULL) {
4014 pre_parse_timer_->Stop(); 4049 pre_parse_timer_->Stop();
4015 } 4050 }
4016 return result; 4051 return result;
4017 } 4052 }
4018 4053
4019 4054
4020 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name, 4055 ClassLiteral* Parser::ParseClassLiteral(const AstRawString* name,
4021 Scanner::Location class_name_location, 4056 Scanner::Location class_name_location,
4022 bool name_is_strict_reserved, int pos, 4057 bool name_is_strict_reserved, int pos,
(...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after
5412 } else { 5447 } else {
5413 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data()); 5448 const uc16* data = reinterpret_cast<const uc16*>(raw_string->raw_data());
5414 running_hash = StringHasher::ComputeRunningHash(running_hash, data, 5449 running_hash = StringHasher::ComputeRunningHash(running_hash, data,
5415 raw_string->length()); 5450 raw_string->length());
5416 } 5451 }
5417 } 5452 }
5418 5453
5419 return running_hash; 5454 return running_hash;
5420 } 5455 }
5421 } } // namespace v8::internal 5456 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/preparser.h » ('j') | test/mjsunit/mjsunit.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698