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

Side by Side Diff: src/parser.cc

Issue 1306993003: Call JS functions via native context instead of js builtins object. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: separated context slot lookup Created 5 years, 3 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/parser.h" 5 #include "src/parser.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/ast-literal-reindexer.h" 9 #include "src/ast-literal-reindexer.h"
10 #include "src/bailout-reason.h" 10 #include "src/bailout-reason.h"
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 new (zone()) ZoneList<Expression*>(2, zone()); 364 new (zone()) ZoneList<Expression*>(2, zone());
365 VariableProxy* new_target_proxy = scope_->NewUnresolved( 365 VariableProxy* new_target_proxy = scope_->NewUnresolved(
366 factory(), ast_value_factory()->new_target_string(), Variable::NORMAL, 366 factory(), ast_value_factory()->new_target_string(), Variable::NORMAL,
367 pos); 367 pos);
368 args->Add(new_target_proxy, zone()); 368 args->Add(new_target_proxy, zone());
369 VariableProxy* this_function_proxy = scope_->NewUnresolved( 369 VariableProxy* this_function_proxy = scope_->NewUnresolved(
370 factory(), ast_value_factory()->this_function_string(), 370 factory(), ast_value_factory()->this_function_string(),
371 Variable::NORMAL, pos); 371 Variable::NORMAL, pos);
372 args->Add(this_function_proxy, zone()); 372 args->Add(this_function_proxy, zone());
373 CallRuntime* call = factory()->NewCallRuntime( 373 CallRuntime* call = factory()->NewCallRuntime(
374 ast_value_factory()->empty_string(), 374 Runtime::kInlineDefaultConstructorCallSuper, args, pos);
375 Runtime::FunctionForId(Runtime::kInlineDefaultConstructorCallSuper),
376 args, pos);
377 body->Add(factory()->NewReturnStatement(call, pos), zone()); 375 body->Add(factory()->NewReturnStatement(call, pos), zone());
378 } 376 }
379 377
380 materialized_literal_count = function_state.materialized_literal_count(); 378 materialized_literal_count = function_state.materialized_literal_count();
381 expected_property_count = function_state.expected_property_count(); 379 expected_property_count = function_state.expected_property_count();
382 } 380 }
383 381
384 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( 382 FunctionLiteral* function_literal = factory()->NewFunctionLiteral(
385 name, ast_value_factory(), function_scope, body, 383 name, ast_value_factory(), function_scope, body,
386 materialized_literal_count, expected_property_count, parameter_count, 384 materialized_literal_count, expected_property_count, parameter_count,
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 } 662 }
665 663
666 664
667 Expression* ParserTraits::NewThrowError(Runtime::FunctionId id, 665 Expression* ParserTraits::NewThrowError(Runtime::FunctionId id,
668 MessageTemplate::Template message, 666 MessageTemplate::Template message,
669 const AstRawString* arg, int pos) { 667 const AstRawString* arg, int pos) {
670 Zone* zone = parser_->zone(); 668 Zone* zone = parser_->zone();
671 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone); 669 ZoneList<Expression*>* args = new (zone) ZoneList<Expression*>(2, zone);
672 args->Add(parser_->factory()->NewSmiLiteral(message, pos), zone); 670 args->Add(parser_->factory()->NewSmiLiteral(message, pos), zone);
673 args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone); 671 args->Add(parser_->factory()->NewStringLiteral(arg, pos), zone);
674 CallRuntime* call_constructor = parser_->factory()->NewCallRuntime( 672 CallRuntime* call_constructor =
675 parser_->ast_value_factory()->empty_string(), Runtime::FunctionForId(id), 673 parser_->factory()->NewCallRuntime(id, args, pos);
676 args, pos);
677 return parser_->factory()->NewThrow(call_constructor, pos); 674 return parser_->factory()->NewThrow(call_constructor, pos);
678 } 675 }
679 676
680 677
681 void ParserTraits::ReportMessageAt(Scanner::Location source_location, 678 void ParserTraits::ReportMessageAt(Scanner::Location source_location,
682 MessageTemplate::Template message, 679 MessageTemplate::Template message,
683 const char* arg, ParseErrorType error_type) { 680 const char* arg, ParseErrorType error_type) {
684 if (parser_->stack_overflow()) { 681 if (parser_->stack_overflow()) {
685 // Suppress the error message (syntax error or such) in the presence of a 682 // Suppress the error message (syntax error or such) in the presence of a
686 // stack overflow. The isolate allows only one pending exception at at time 683 // stack overflow. The isolate allows only one pending exception at at time
(...skipping 2161 matching lines...) Expand 10 before | Expand all | Expand 10 after
2848 2845
2849 Expression* throw_expression = 2846 Expression* throw_expression =
2850 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn, 2847 NewThrowTypeError(MessageTemplate::kDerivedConstructorReturn,
2851 ast_value_factory()->empty_string(), pos); 2848 ast_value_factory()->empty_string(), pos);
2852 2849
2853 // %_IsSpecObject(temp) 2850 // %_IsSpecObject(temp)
2854 ZoneList<Expression*>* is_spec_object_args = 2851 ZoneList<Expression*>* is_spec_object_args =
2855 new (zone()) ZoneList<Expression*>(1, zone()); 2852 new (zone()) ZoneList<Expression*>(1, zone());
2856 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone()); 2853 is_spec_object_args->Add(factory()->NewVariableProxy(temp), zone());
2857 Expression* is_spec_object_call = factory()->NewCallRuntime( 2854 Expression* is_spec_object_call = factory()->NewCallRuntime(
2858 ast_value_factory()->is_spec_object_string(), 2855 Runtime::kInlineIsSpecObject, is_spec_object_args, pos);
2859 Runtime::FunctionForId(Runtime::kInlineIsSpecObject),
2860 is_spec_object_args, pos);
2861 2856
2862 // %_IsSpecObject(temp) ? temp : throw_expression 2857 // %_IsSpecObject(temp) ? temp : throw_expression
2863 Expression* is_object_conditional = factory()->NewConditional( 2858 Expression* is_object_conditional = factory()->NewConditional(
2864 is_spec_object_call, factory()->NewVariableProxy(temp), 2859 is_spec_object_call, factory()->NewVariableProxy(temp),
2865 throw_expression, pos); 2860 throw_expression, pos);
2866 2861
2867 // temp === undefined 2862 // temp === undefined
2868 Expression* is_undefined = factory()->NewCompareOperation( 2863 Expression* is_undefined = factory()->NewCompareOperation(
2869 Token::EQ_STRICT, assign, 2864 Token::EQ_STRICT, assign,
2870 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), pos); 2865 factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), pos);
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
3160 factory()->NewCall(next_property, next_arguments, pos); 3155 factory()->NewCall(next_property, next_arguments, pos);
3161 Expression* result_proxy = factory()->NewVariableProxy(result); 3156 Expression* result_proxy = factory()->NewVariableProxy(result);
3162 Expression* left = 3157 Expression* left =
3163 factory()->NewAssignment(Token::ASSIGN, result_proxy, next_call, pos); 3158 factory()->NewAssignment(Token::ASSIGN, result_proxy, next_call, pos);
3164 3159
3165 // %_IsSpecObject(...) 3160 // %_IsSpecObject(...)
3166 ZoneList<Expression*>* is_spec_object_args = 3161 ZoneList<Expression*>* is_spec_object_args =
3167 new (zone()) ZoneList<Expression*>(1, zone()); 3162 new (zone()) ZoneList<Expression*>(1, zone());
3168 is_spec_object_args->Add(left, zone()); 3163 is_spec_object_args->Add(left, zone());
3169 Expression* is_spec_object_call = factory()->NewCallRuntime( 3164 Expression* is_spec_object_call = factory()->NewCallRuntime(
3170 ast_value_factory()->is_spec_object_string(), 3165 Runtime::kInlineIsSpecObject, is_spec_object_args, pos);
3171 Runtime::FunctionForId(Runtime::kInlineIsSpecObject), is_spec_object_args,
3172 pos);
3173 3166
3174 // %ThrowIteratorResultNotAnObject(result) 3167 // %ThrowIteratorResultNotAnObject(result)
3175 Expression* result_proxy_again = factory()->NewVariableProxy(result); 3168 Expression* result_proxy_again = factory()->NewVariableProxy(result);
3176 ZoneList<Expression*>* throw_arguments = 3169 ZoneList<Expression*>* throw_arguments =
3177 new (zone()) ZoneList<Expression*>(1, zone()); 3170 new (zone()) ZoneList<Expression*>(1, zone());
3178 throw_arguments->Add(result_proxy_again, zone()); 3171 throw_arguments->Add(result_proxy_again, zone());
3179 Expression* throw_call = factory()->NewCallRuntime( 3172 Expression* throw_call = factory()->NewCallRuntime(
3180 ast_value_factory()->throw_iterator_result_not_an_object_string(), 3173 Runtime::kThrowIteratorResultNotAnObject, throw_arguments, pos);
3181 Runtime::FunctionForId(Runtime::kThrowIteratorResultNotAnObject),
3182 throw_arguments, pos);
3183 3174
3184 return factory()->NewBinaryOperation( 3175 return factory()->NewBinaryOperation(
3185 Token::AND, 3176 Token::AND,
3186 factory()->NewUnaryOperation(Token::NOT, is_spec_object_call, pos), 3177 factory()->NewUnaryOperation(Token::NOT, is_spec_object_call, pos),
3187 throw_call, pos); 3178 throw_call, pos);
3188 } 3179 }
3189 3180
3190 3181
3191 void Parser::InitializeForEachStatement(ForEachStatement* stmt, 3182 void Parser::InitializeForEachStatement(ForEachStatement* stmt,
3192 Expression* each, 3183 Expression* each,
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after
4278 *expected_property_count, scope_->language_mode(), 4269 *expected_property_count, scope_->language_mode(),
4279 scope_->uses_super_property(), scope_->calls_eval()); 4270 scope_->uses_super_property(), scope_->calls_eval());
4280 } 4271 }
4281 } 4272 }
4282 4273
4283 4274
4284 void Parser::AddAssertIsConstruct(ZoneList<Statement*>* body, int pos) { 4275 void Parser::AddAssertIsConstruct(ZoneList<Statement*>* body, int pos) {
4285 ZoneList<Expression*>* arguments = 4276 ZoneList<Expression*>* arguments =
4286 new (zone()) ZoneList<Expression*>(0, zone()); 4277 new (zone()) ZoneList<Expression*>(0, zone());
4287 CallRuntime* construct_check = factory()->NewCallRuntime( 4278 CallRuntime* construct_check = factory()->NewCallRuntime(
4288 ast_value_factory()->is_construct_call_string(), 4279 Runtime::kInlineIsConstructCall, arguments, pos);
4289 Runtime::FunctionForId(Runtime::kInlineIsConstructCall), arguments, pos);
4290 CallRuntime* non_callable_error = factory()->NewCallRuntime( 4280 CallRuntime* non_callable_error = factory()->NewCallRuntime(
4291 ast_value_factory()->empty_string(), 4281 Runtime::kThrowConstructorNonCallableError, arguments, pos);
4292 Runtime::FunctionForId(Runtime::kThrowConstructorNonCallableError),
4293 arguments, pos);
4294 IfStatement* if_statement = factory()->NewIfStatement( 4282 IfStatement* if_statement = factory()->NewIfStatement(
4295 factory()->NewUnaryOperation(Token::NOT, construct_check, pos), 4283 factory()->NewUnaryOperation(Token::NOT, construct_check, pos),
4296 factory()->NewReturnStatement(non_callable_error, pos), 4284 factory()->NewReturnStatement(non_callable_error, pos),
4297 factory()->NewEmptyStatement(pos), pos); 4285 factory()->NewEmptyStatement(pos), pos);
4298 body->Add(if_statement, zone()); 4286 body->Add(if_statement, zone());
4299 } 4287 }
4300 4288
4301 4289
4302 Statement* Parser::BuildAssertIsCoercible(Variable* var) { 4290 Statement* Parser::BuildAssertIsCoercible(Variable* var) {
4303 // if (var === null || var === undefined) 4291 // if (var === null || var === undefined)
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
4435 } 4423 }
4436 4424
4437 { 4425 {
4438 BlockState block_state(&scope_, inner_scope); 4426 BlockState block_state(&scope_, inner_scope);
4439 4427
4440 // For generators, allocate and yield an iterator on function entry. 4428 // For generators, allocate and yield an iterator on function entry.
4441 if (IsGeneratorFunction(kind)) { 4429 if (IsGeneratorFunction(kind)) {
4442 ZoneList<Expression*>* arguments = 4430 ZoneList<Expression*>* arguments =
4443 new(zone()) ZoneList<Expression*>(0, zone()); 4431 new(zone()) ZoneList<Expression*>(0, zone());
4444 CallRuntime* allocation = factory()->NewCallRuntime( 4432 CallRuntime* allocation = factory()->NewCallRuntime(
4445 ast_value_factory()->empty_string(), 4433 Runtime::kCreateJSGeneratorObject, arguments, pos);
4446 Runtime::FunctionForId(Runtime::kCreateJSGeneratorObject), arguments,
4447 pos);
4448 VariableProxy* init_proxy = factory()->NewVariableProxy( 4434 VariableProxy* init_proxy = factory()->NewVariableProxy(
4449 function_state_->generator_object_variable()); 4435 function_state_->generator_object_variable());
4450 Assignment* assignment = factory()->NewAssignment( 4436 Assignment* assignment = factory()->NewAssignment(
4451 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition); 4437 Token::INIT_VAR, init_proxy, allocation, RelocInfo::kNoPosition);
4452 VariableProxy* get_proxy = factory()->NewVariableProxy( 4438 VariableProxy* get_proxy = factory()->NewVariableProxy(
4453 function_state_->generator_object_variable()); 4439 function_state_->generator_object_variable());
4454 Yield* yield = factory()->NewYield( 4440 Yield* yield = factory()->NewYield(
4455 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition); 4441 get_proxy, assignment, Yield::kInitial, RelocInfo::kNoPosition);
4456 body->Add(factory()->NewExpressionStatement( 4442 body->Add(factory()->NewExpressionStatement(
4457 yield, RelocInfo::kNoPosition), zone()); 4443 yield, RelocInfo::kNoPosition), zone());
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
4695 DCHECK(!spread_pos.IsValid()); 4681 DCHECK(!spread_pos.IsValid());
4696 4682
4697 if (extension_ != NULL) { 4683 if (extension_ != NULL) {
4698 // The extension structures are only accessible while parsing the 4684 // The extension structures are only accessible while parsing the
4699 // very first time not when reparsing because of lazy compilation. 4685 // very first time not when reparsing because of lazy compilation.
4700 scope_->DeclarationScope()->ForceEagerCompilation(); 4686 scope_->DeclarationScope()->ForceEagerCompilation();
4701 } 4687 }
4702 4688
4703 const Runtime::Function* function = Runtime::FunctionForName(name->string()); 4689 const Runtime::Function* function = Runtime::FunctionForName(name->string());
4704 4690
4705 // Check for built-in IS_VAR macro. 4691 if (function != NULL) {
4706 if (function != NULL && 4692 // Check for built-in IS_VAR macro.
4707 function->intrinsic_type == Runtime::RUNTIME && 4693 if (function->function_id == Runtime::kIS_VAR) {
4708 function->function_id == Runtime::kIS_VAR) { 4694 DCHECK_EQ(Runtime::RUNTIME, function->intrinsic_type);
4709 // %IS_VAR(x) evaluates to x if x is a variable, 4695 // %IS_VAR(x) evaluates to x if x is a variable,
4710 // leads to a parse error otherwise. Could be implemented as an 4696 // leads to a parse error otherwise. Could be implemented as an
4711 // inline function %_IS_VAR(x) to eliminate this special case. 4697 // inline function %_IS_VAR(x) to eliminate this special case.
4712 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) { 4698 if (args->length() == 1 && args->at(0)->AsVariableProxy() != NULL) {
4713 return args->at(0); 4699 return args->at(0);
4714 } else { 4700 } else {
4715 ReportMessage(MessageTemplate::kNotIsvar); 4701 ReportMessage(MessageTemplate::kNotIsvar);
4702 *ok = false;
4703 return NULL;
4704 }
4705 }
4706
4707 // Check that the expected number of arguments are being passed.
4708 if (function->nargs != -1 && function->nargs != args->length()) {
4709 ReportMessage(MessageTemplate::kIllegalAccess);
4716 *ok = false; 4710 *ok = false;
4717 return NULL; 4711 return NULL;
4718 } 4712 }
4713
4714 return factory()->NewCallRuntime(function, args, pos);
4719 } 4715 }
4720 4716
4721 // Check that the expected number of arguments are being passed. 4717 int context_index = Context::IntrinsicIndexForName(name->string());
4722 if (function != NULL &&
4723 function->nargs != -1 &&
4724 function->nargs != args->length()) {
4725 ReportMessage(MessageTemplate::kIllegalAccess);
4726 *ok = false;
4727 return NULL;
4728 }
4729 4718
4730 // Check that the function is defined if it's an inline runtime call. 4719 // Check that the function is defined.
4731 if (function == NULL && name->FirstCharacter() == '_') { 4720 if (context_index == Context::kNotFound) {
4732 ParserTraits::ReportMessage(MessageTemplate::kNotDefined, name); 4721 ParserTraits::ReportMessage(MessageTemplate::kNotDefined, name);
4733 *ok = false; 4722 *ok = false;
4734 return NULL; 4723 return NULL;
4735 } 4724 }
4736 4725
4737 // We have a valid intrinsics call or a call to a builtin. 4726 return factory()->NewCallRuntime(context_index, args, pos);
4738 return factory()->NewCallRuntime(name, function, args, pos);
4739 } 4727 }
4740 4728
4741 4729
4742 Literal* Parser::GetLiteralUndefined(int position) { 4730 Literal* Parser::GetLiteralUndefined(int position) {
4743 return factory()->NewUndefinedLiteral(position); 4731 return factory()->NewUndefinedLiteral(position);
4744 } 4732 }
4745 4733
4746 4734
4747 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) { 4735 void Parser::CheckConflictingVarDeclarations(Scope* scope, bool* ok) {
4748 Declaration* decl = scope->CheckConflictingVarDeclarations(); 4736 Declaration* decl = scope->CheckConflictingVarDeclarations();
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
5871 int i = 0; 5859 int i = 0;
5872 while (i < expressions->length()) { 5860 while (i < expressions->length()) {
5873 Expression* sub = expressions->at(i++); 5861 Expression* sub = expressions->at(i++);
5874 Expression* cooked_str = cooked_strings->at(i); 5862 Expression* cooked_str = cooked_strings->at(i);
5875 5863
5876 // Let middle be ToString(sub). 5864 // Let middle be ToString(sub).
5877 ZoneList<Expression*>* args = 5865 ZoneList<Expression*>* args =
5878 new (zone()) ZoneList<Expression*>(1, zone()); 5866 new (zone()) ZoneList<Expression*>(1, zone());
5879 args->Add(sub, zone()); 5867 args->Add(sub, zone());
5880 Expression* middle = factory()->NewCallRuntime( 5868 Expression* middle = factory()->NewCallRuntime(
5881 ast_value_factory()->to_string_string(), NULL, args, 5869 Context::TO_STRING_FUN_INDEX, args, sub->position());
5882 sub->position());
5883 5870
5884 expr = factory()->NewBinaryOperation( 5871 expr = factory()->NewBinaryOperation(
5885 Token::ADD, factory()->NewBinaryOperation( 5872 Token::ADD, factory()->NewBinaryOperation(
5886 Token::ADD, expr, middle, expr->position()), 5873 Token::ADD, expr, middle, expr->position()),
5887 cooked_str, sub->position()); 5874 cooked_str, sub->position());
5888 } 5875 }
5889 return expr; 5876 return expr;
5890 } else { 5877 } else {
5891 uint32_t hash = ComputeTemplateLiteralHash(lit); 5878 uint32_t hash = ComputeTemplateLiteralHash(lit);
5892 5879
(...skipping 11 matching lines...) Expand all
5904 const_cast<ZoneList<Expression*>*>(raw_strings), raw_idx, 5891 const_cast<ZoneList<Expression*>*>(raw_strings), raw_idx,
5905 is_strong(language_mode()), pos), 5892 is_strong(language_mode()), pos),
5906 zone()); 5893 zone());
5907 5894
5908 // Ensure hash is suitable as a Smi value 5895 // Ensure hash is suitable as a Smi value
5909 Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash))); 5896 Smi* hash_obj = Smi::cast(Internals::IntToSmi(static_cast<int>(hash)));
5910 args->Add(factory()->NewSmiLiteral(hash_obj->value(), pos), zone()); 5897 args->Add(factory()->NewSmiLiteral(hash_obj->value(), pos), zone());
5911 5898
5912 this->CheckPossibleEvalCall(tag, scope_); 5899 this->CheckPossibleEvalCall(tag, scope_);
5913 Expression* call_site = factory()->NewCallRuntime( 5900 Expression* call_site = factory()->NewCallRuntime(
5914 ast_value_factory()->get_template_callsite_string(), NULL, args, start); 5901 Context::GET_TEMPLATE_CALL_SITE_INDEX, args, start);
5915 5902
5916 // Call TagFn 5903 // Call TagFn
5917 ZoneList<Expression*>* call_args = 5904 ZoneList<Expression*>* call_args =
5918 new (zone()) ZoneList<Expression*>(expressions->length() + 1, zone()); 5905 new (zone()) ZoneList<Expression*>(expressions->length() + 1, zone());
5919 call_args->Add(call_site, zone()); 5906 call_args->Add(call_site, zone());
5920 call_args->AddAll(*expressions, zone()); 5907 call_args->AddAll(*expressions, zone());
5921 return factory()->NewCall(tag, call_args, pos); 5908 return factory()->NewCall(tag, call_args, pos);
5922 } 5909 }
5923 } 5910 }
5924 5911
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5960 if (list->length() == 1) { 5947 if (list->length() == 1) {
5961 // Spread-call with single spread argument produces an InternalArray 5948 // Spread-call with single spread argument produces an InternalArray
5962 // containing the values from the array. 5949 // containing the values from the array.
5963 // 5950 //
5964 // Function is called or constructed with the produced array of arguments 5951 // Function is called or constructed with the produced array of arguments
5965 // 5952 //
5966 // EG: Apply(Func, Spread(spread0)) 5953 // EG: Apply(Func, Spread(spread0))
5967 ZoneList<Expression*>* spread_list = 5954 ZoneList<Expression*>* spread_list =
5968 new (zone()) ZoneList<Expression*>(0, zone()); 5955 new (zone()) ZoneList<Expression*>(0, zone());
5969 spread_list->Add(list->at(0)->AsSpread()->expression(), zone()); 5956 spread_list->Add(list->at(0)->AsSpread()->expression(), zone());
5970 args->Add( 5957 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX,
5971 factory()->NewCallRuntime(ast_value_factory()->spread_iterable_string(), 5958 spread_list, RelocInfo::kNoPosition),
5972 NULL, spread_list, RelocInfo::kNoPosition), 5959 zone());
5973 zone());
5974 return args; 5960 return args;
5975 } else { 5961 } else {
5976 // Spread-call with multiple arguments produces array literals for each 5962 // Spread-call with multiple arguments produces array literals for each
5977 // sequences of unspread arguments, and converts each spread iterable to 5963 // sequences of unspread arguments, and converts each spread iterable to
5978 // an Internal array. Finally, all of these produced arrays are flattened 5964 // an Internal array. Finally, all of these produced arrays are flattened
5979 // into a single InternalArray, containing the arguments for the call. 5965 // into a single InternalArray, containing the arguments for the call.
5980 // 5966 //
5981 // EG: Apply(Func, Flatten([unspread0, unspread1], Spread(spread0), 5967 // EG: Apply(Func, Flatten([unspread0, unspread1], Spread(spread0),
5982 // Spread(spread1), [unspread2, unspread3])) 5968 // Spread(spread1), [unspread2, unspread3]))
5983 int i = 0; 5969 int i = 0;
(...skipping 13 matching lines...) Expand all
5997 RelocInfo::kNoPosition), 5983 RelocInfo::kNoPosition),
5998 zone()); 5984 zone());
5999 5985
6000 if (i == n) break; 5986 if (i == n) break;
6001 } 5987 }
6002 5988
6003 // Push eagerly spread argument 5989 // Push eagerly spread argument
6004 ZoneList<v8::internal::Expression*>* spread_list = 5990 ZoneList<v8::internal::Expression*>* spread_list =
6005 new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); 5991 new (zone()) ZoneList<v8::internal::Expression*>(1, zone());
6006 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone()); 5992 spread_list->Add(list->at(i++)->AsSpread()->expression(), zone());
6007 args->Add(factory()->NewCallRuntime( 5993 args->Add(factory()->NewCallRuntime(Context::SPREAD_ITERABLE_INDEX,
6008 ast_value_factory()->spread_iterable_string(), NULL, 5994 spread_list, RelocInfo::kNoPosition),
6009 spread_list, RelocInfo::kNoPosition),
6010 zone()); 5995 zone());
6011 } 5996 }
6012 5997
6013 list = new (zone()) ZoneList<v8::internal::Expression*>(1, zone()); 5998 list = new (zone()) ZoneList<v8::internal::Expression*>(1, zone());
6014 list->Add(factory()->NewCallRuntime( 5999 list->Add(factory()->NewCallRuntime(Context::SPREAD_ARGUMENTS_INDEX, args,
6015 ast_value_factory()->spread_arguments_string(), NULL, args, 6000 RelocInfo::kNoPosition),
6016 RelocInfo::kNoPosition),
6017 zone()); 6001 zone());
6018 return list; 6002 return list;
6019 } 6003 }
6020 UNREACHABLE(); 6004 UNREACHABLE();
6021 } 6005 }
6022 6006
6023 6007
6024 Expression* Parser::SpreadCall(Expression* function, 6008 Expression* Parser::SpreadCall(Expression* function,
6025 ZoneList<v8::internal::Expression*>* args, 6009 ZoneList<v8::internal::Expression*>* args,
6026 int pos) { 6010 int pos) {
6027 if (function->IsSuperCallReference()) { 6011 if (function->IsSuperCallReference()) {
6028 // Super calls 6012 // Super calls
6029 // %ReflectConstruct(%GetPrototype(<this-function>), args, new.target)) 6013 // %ReflectConstruct(%GetPrototype(<this-function>), args, new.target))
6030 ZoneList<Expression*>* tmp = new (zone()) ZoneList<Expression*>(1, zone()); 6014 ZoneList<Expression*>* tmp = new (zone()) ZoneList<Expression*>(1, zone());
6031 tmp->Add(function->AsSuperCallReference()->this_function_var(), zone()); 6015 tmp->Add(function->AsSuperCallReference()->this_function_var(), zone());
6032 Expression* get_prototype = factory()->NewCallRuntime( 6016 Expression* get_prototype =
6033 ast_value_factory()->empty_string(), 6017 factory()->NewCallRuntime(Runtime::kGetPrototype, tmp, pos);
6034 Runtime::FunctionForId(Runtime::kGetPrototype), tmp, pos);
6035 args->InsertAt(0, get_prototype, zone()); 6018 args->InsertAt(0, get_prototype, zone());
6036 args->Add(function->AsSuperCallReference()->new_target_var(), zone()); 6019 args->Add(function->AsSuperCallReference()->new_target_var(), zone());
6037 return factory()->NewCallRuntime( 6020 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args,
6038 ast_value_factory()->reflect_construct_string(), NULL, args, pos); 6021 pos);
6039 } else { 6022 } else {
6040 if (function->IsProperty()) { 6023 if (function->IsProperty()) {
6041 // Method calls 6024 // Method calls
6042 if (function->AsProperty()->IsSuperAccess()) { 6025 if (function->AsProperty()->IsSuperAccess()) {
6043 Expression* home = 6026 Expression* home =
6044 ThisExpression(scope_, factory(), RelocInfo::kNoPosition); 6027 ThisExpression(scope_, factory(), RelocInfo::kNoPosition);
6045 args->InsertAt(0, function, zone()); 6028 args->InsertAt(0, function, zone());
6046 args->InsertAt(1, home, zone()); 6029 args->InsertAt(1, home, zone());
6047 } else { 6030 } else {
6048 Variable* temp = 6031 Variable* temp =
6049 scope_->NewTemporary(ast_value_factory()->empty_string()); 6032 scope_->NewTemporary(ast_value_factory()->empty_string());
6050 VariableProxy* obj = factory()->NewVariableProxy(temp); 6033 VariableProxy* obj = factory()->NewVariableProxy(temp);
6051 Assignment* assign_obj = factory()->NewAssignment( 6034 Assignment* assign_obj = factory()->NewAssignment(
6052 Token::ASSIGN, obj, function->AsProperty()->obj(), 6035 Token::ASSIGN, obj, function->AsProperty()->obj(),
6053 RelocInfo::kNoPosition); 6036 RelocInfo::kNoPosition);
6054 function = factory()->NewProperty( 6037 function = factory()->NewProperty(
6055 assign_obj, function->AsProperty()->key(), RelocInfo::kNoPosition); 6038 assign_obj, function->AsProperty()->key(), RelocInfo::kNoPosition);
6056 args->InsertAt(0, function, zone()); 6039 args->InsertAt(0, function, zone());
6057 obj = factory()->NewVariableProxy(temp); 6040 obj = factory()->NewVariableProxy(temp);
6058 args->InsertAt(1, obj, zone()); 6041 args->InsertAt(1, obj, zone());
6059 } 6042 }
6060 } else { 6043 } else {
6061 // Non-method calls 6044 // Non-method calls
6062 args->InsertAt(0, function, zone()); 6045 args->InsertAt(0, function, zone());
6063 args->InsertAt(1, factory()->NewUndefinedLiteral(RelocInfo::kNoPosition), 6046 args->InsertAt(1, factory()->NewUndefinedLiteral(RelocInfo::kNoPosition),
6064 zone()); 6047 zone());
6065 } 6048 }
6066 return factory()->NewCallRuntime( 6049 return factory()->NewCallRuntime(Context::REFLECT_APPLY_INDEX, args, pos);
6067 ast_value_factory()->reflect_apply_string(), NULL, args, pos);
6068 } 6050 }
6069 } 6051 }
6070 6052
6071 6053
6072 Expression* Parser::SpreadCallNew(Expression* function, 6054 Expression* Parser::SpreadCallNew(Expression* function,
6073 ZoneList<v8::internal::Expression*>* args, 6055 ZoneList<v8::internal::Expression*>* args,
6074 int pos) { 6056 int pos) {
6075 args->InsertAt(0, function, zone()); 6057 args->InsertAt(0, function, zone());
6076 6058
6077 return factory()->NewCallRuntime( 6059 return factory()->NewCallRuntime(Context::REFLECT_CONSTRUCT_INDEX, args, pos);
6078 ast_value_factory()->reflect_construct_string(), NULL, args, pos);
6079 } 6060 }
6080 } // namespace internal 6061 } // namespace internal
6081 } // namespace v8 6062 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698