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

Side by Side Diff: src/hydrogen.cc

Issue 184173003: Get array_function from NativeContext (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/type-info.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 8198 matching lines...) Expand 10 before | Expand all | Expand 10 after
8209 // Checks whether allocation using the given constructor can be inlined. 8209 // Checks whether allocation using the given constructor can be inlined.
8210 static bool IsAllocationInlineable(Handle<JSFunction> constructor) { 8210 static bool IsAllocationInlineable(Handle<JSFunction> constructor) {
8211 return constructor->has_initial_map() && 8211 return constructor->has_initial_map() &&
8212 constructor->initial_map()->instance_type() == JS_OBJECT_TYPE && 8212 constructor->initial_map()->instance_type() == JS_OBJECT_TYPE &&
8213 constructor->initial_map()->instance_size() < HAllocate::kMaxInlineSize && 8213 constructor->initial_map()->instance_size() < HAllocate::kMaxInlineSize &&
8214 constructor->initial_map()->InitialPropertiesLength() == 0; 8214 constructor->initial_map()->InitialPropertiesLength() == 0;
8215 } 8215 }
8216 8216
8217 8217
8218 bool HOptimizedGraphBuilder::IsCallNewArrayInlineable(CallNew* expr) { 8218 bool HOptimizedGraphBuilder::IsCallNewArrayInlineable(CallNew* expr) {
8219 bool inline_ok = false; 8219 Handle<AllocationSite> site = expr->allocation_site();
8220 if (site.is_null()) return false;
8221
8220 Handle<JSFunction> caller = current_info()->closure(); 8222 Handle<JSFunction> caller = current_info()->closure();
8221 Handle<JSFunction> target(isolate()->global_context()->array_function(), 8223 Handle<JSFunction> target(isolate()->native_context()->array_function(),
8222 isolate()); 8224 isolate());
8223 int argument_count = expr->arguments()->length(); 8225 int argument_count = expr->arguments()->length();
8224 // We should have the function plus array arguments on the environment stack. 8226 // We should have the function plus array arguments on the environment stack.
8225 ASSERT(environment()->length() >= (argument_count + 1)); 8227 ASSERT(environment()->length() >= (argument_count + 1));
8226 Handle<AllocationSite> site = expr->allocation_site();
8227 ASSERT(!site.is_null());
8228 8228
8229 bool inline_ok = false;
8229 if (site->CanInlineCall()) { 8230 if (site->CanInlineCall()) {
8230 // We also want to avoid inlining in certain 1 argument scenarios. 8231 // We also want to avoid inlining in certain 1 argument scenarios.
8231 if (argument_count == 1) { 8232 if (argument_count == 1) {
8232 HValue* argument = Top(); 8233 HValue* argument = Top();
8233 if (argument->IsConstant()) { 8234 if (argument->IsConstant()) {
8234 // Do not inline if the constant length argument is not a smi or 8235 // Do not inline if the constant length argument is not a smi or
8235 // outside the valid range for a fast array. 8236 // outside the valid range for a fast array.
8236 HConstant* constant_argument = HConstant::cast(argument); 8237 HConstant* constant_argument = HConstant::cast(argument);
8237 if (constant_argument->HasSmiValue()) { 8238 if (constant_argument->HasSmiValue()) {
8238 int value = constant_argument->Integer32Value(); 8239 int value = constant_argument->Integer32Value();
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
8358 receiver->DeleteAndReplaceWith(NULL); 8359 receiver->DeleteAndReplaceWith(NULL);
8359 check->DeleteAndReplaceWith(NULL); 8360 check->DeleteAndReplaceWith(NULL);
8360 environment()->SetExpressionStackAt(receiver_index, function); 8361 environment()->SetExpressionStackAt(receiver_index, function);
8361 HInstruction* call = 8362 HInstruction* call =
8362 PreProcessCall(New<HCallNew>(function, argument_count)); 8363 PreProcessCall(New<HCallNew>(function, argument_count));
8363 return ast_context()->ReturnInstruction(call, expr->id()); 8364 return ast_context()->ReturnInstruction(call, expr->id());
8364 } else { 8365 } else {
8365 // The constructor function is both an operand to the instruction and an 8366 // The constructor function is both an operand to the instruction and an
8366 // argument to the construct call. 8367 // argument to the construct call.
8367 Handle<JSFunction> array_function( 8368 Handle<JSFunction> array_function(
8368 isolate()->global_context()->array_function(), isolate()); 8369 isolate()->native_context()->array_function(), isolate());
8369 bool use_call_new_array = expr->target().is_identical_to(array_function); 8370 bool use_call_new_array = expr->target().is_identical_to(array_function);
8370 if (use_call_new_array && IsCallNewArrayInlineable(expr)) { 8371 if (use_call_new_array && IsCallNewArrayInlineable(expr)) {
8371 // Verify we are still calling the array function for our native context. 8372 // Verify we are still calling the array function for our native context.
8372 Add<HCheckValue>(function, array_function); 8373 Add<HCheckValue>(function, array_function);
8373 BuildInlinedCallNewArray(expr); 8374 BuildInlinedCallNewArray(expr);
8374 return; 8375 return;
8375 } 8376 }
8376 8377
8377 HBinaryCall* call; 8378 HBinaryCall* call;
8378 if (use_call_new_array) { 8379 if (use_call_new_array) {
(...skipping 2910 matching lines...) Expand 10 before | Expand all | Expand 10 after
11289 if (ShouldProduceTraceOutput()) { 11290 if (ShouldProduceTraceOutput()) {
11290 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11291 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11291 } 11292 }
11292 11293
11293 #ifdef DEBUG 11294 #ifdef DEBUG
11294 graph_->Verify(false); // No full verify. 11295 graph_->Verify(false); // No full verify.
11295 #endif 11296 #endif
11296 } 11297 }
11297 11298
11298 } } // namespace v8::internal 11299 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/type-info.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698