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 4223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4234 expr->GetReceiverTypes()->first(), | 4234 expr->GetReceiverTypes()->first(), |
4235 true); | 4235 true); |
4236 HInstruction* result = | 4236 HInstruction* result = |
4237 new HApplyArguments(function, receiver, length, elements); | 4237 new HApplyArguments(function, receiver, length, elements); |
4238 result->set_position(expr->position()); | 4238 result->set_position(expr->position()); |
4239 ast_context()->ReturnInstruction(result, expr->id()); | 4239 ast_context()->ReturnInstruction(result, expr->id()); |
4240 return true; | 4240 return true; |
4241 } | 4241 } |
4242 | 4242 |
4243 | 4243 |
4244 static bool HasCustomCallGenerator(Handle<JSFunction> function) { | |
4245 SharedFunctionInfo* info = function->shared(); | |
4246 return info->HasBuiltinFunctionId() && | |
4247 CallStubCompiler::HasCustomCallGenerator(info->builtin_function_id()); | |
4248 } | |
4249 | |
4250 | |
4251 void HGraphBuilder::VisitCall(Call* expr) { | 4244 void HGraphBuilder::VisitCall(Call* expr) { |
4252 Expression* callee = expr->expression(); | 4245 Expression* callee = expr->expression(); |
4253 int argument_count = expr->arguments()->length() + 1; // Plus receiver. | 4246 int argument_count = expr->arguments()->length() + 1; // Plus receiver. |
4254 HInstruction* call = NULL; | 4247 HInstruction* call = NULL; |
4255 | 4248 |
4256 Property* prop = callee->AsProperty(); | 4249 Property* prop = callee->AsProperty(); |
4257 if (prop != NULL) { | 4250 if (prop != NULL) { |
4258 if (!prop->key()->IsPropertyName()) { | 4251 if (!prop->key()->IsPropertyName()) { |
4259 // Keyed function call. | 4252 // Keyed function call. |
4260 VISIT_FOR_VALUE(prop->obj()); | 4253 VISIT_FOR_VALUE(prop->obj()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4298 if (expr->IsMonomorphic()) { | 4291 if (expr->IsMonomorphic()) { |
4299 Handle<Map> receiver_map = | 4292 Handle<Map> receiver_map = |
4300 (types == NULL) ? Handle<Map>::null() : types->first(); | 4293 (types == NULL) ? Handle<Map>::null() : types->first(); |
4301 if (TryInlineBuiltinFunction(expr, | 4294 if (TryInlineBuiltinFunction(expr, |
4302 receiver, | 4295 receiver, |
4303 receiver_map, | 4296 receiver_map, |
4304 expr->check_type())) { | 4297 expr->check_type())) { |
4305 return; | 4298 return; |
4306 } | 4299 } |
4307 | 4300 |
4308 if (HasCustomCallGenerator(expr->target()) || | 4301 if (CallStubCompiler::HasCustomCallGenerator(*expr->target()) || |
4309 CallOptimization(*expr->target()).is_simple_api_call() || | |
4310 expr->check_type() != RECEIVER_MAP_CHECK) { | 4302 expr->check_type() != RECEIVER_MAP_CHECK) { |
4311 // When the target has a custom call IC generator, use the IC, | 4303 // When the target has a custom call IC generator, use the IC, |
4312 // because it is likely to generate better code. Similarly, we | 4304 // because it is likely to generate better code. Also use the IC |
4313 // generate better call stubs for some API functions. | 4305 // when a primitive receiver check is required. |
4314 // Also use the IC when a primitive receiver check is required. | |
4315 HContext* context = new HContext; | 4306 HContext* context = new HContext; |
4316 AddInstruction(context); | 4307 AddInstruction(context); |
4317 call = PreProcessCall(new HCallNamed(context, name, argument_count)); | 4308 call = PreProcessCall(new HCallNamed(context, name, argument_count)); |
4318 } else { | 4309 } else { |
4319 AddCheckConstantFunction(expr, receiver, receiver_map, true); | 4310 AddCheckConstantFunction(expr, receiver, receiver_map, true); |
4320 | 4311 |
4321 if (TryInline(expr)) { | 4312 if (TryInline(expr)) { |
4322 return; | 4313 return; |
4323 } else { | 4314 } else { |
4324 // Check for bailout, as the TryInline call in the if condition above | 4315 // Check for bailout, as the TryInline call in the if condition above |
(...skipping 1631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5956 } | 5947 } |
5957 } | 5948 } |
5958 | 5949 |
5959 #ifdef DEBUG | 5950 #ifdef DEBUG |
5960 if (graph_ != NULL) graph_->Verify(); | 5951 if (graph_ != NULL) graph_->Verify(); |
5961 if (allocator_ != NULL) allocator_->Verify(); | 5952 if (allocator_ != NULL) allocator_->Verify(); |
5962 #endif | 5953 #endif |
5963 } | 5954 } |
5964 | 5955 |
5965 } } // namespace v8::internal | 5956 } } // namespace v8::internal |
OLD | NEW |