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

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 2389133007: [crankshaft] Exclude context parameter from HCallWithDescriptor arguments. (Closed)
Patch Set: Rebasing Created 4 years, 2 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
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.h » ('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 // 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/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 2219 matching lines...) Expand 10 before | Expand all | Expand 10 after
2230 2230
2231 return Pop(); 2231 return Pop();
2232 } 2232 }
2233 2233
2234 HValue* HGraphBuilder::BuildToNumber(HValue* input) { 2234 HValue* HGraphBuilder::BuildToNumber(HValue* input) {
2235 if (input->type().IsTaggedNumber()) { 2235 if (input->type().IsTaggedNumber()) {
2236 return input; 2236 return input;
2237 } 2237 }
2238 Callable callable = CodeFactory::ToNumber(isolate()); 2238 Callable callable = CodeFactory::ToNumber(isolate());
2239 HValue* stub = Add<HConstant>(callable.code()); 2239 HValue* stub = Add<HConstant>(callable.code());
2240 HValue* values[] = {context(), input}; 2240 HValue* values[] = {input};
2241 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( 2241 HCallWithDescriptor* instr = Add<HCallWithDescriptor>(
2242 stub, 0, callable.descriptor(), ArrayVector(values)); 2242 stub, 0, callable.descriptor(), ArrayVector(values));
2243 instr->set_type(HType::TaggedNumber()); 2243 instr->set_type(HType::TaggedNumber());
2244 return instr; 2244 return instr;
2245 } 2245 }
2246 2246
2247 2247
2248 HValue* HGraphBuilder::BuildToObject(HValue* receiver) { 2248 HValue* HGraphBuilder::BuildToObject(HValue* receiver) {
2249 NoObservableSideEffectsScope scope(this); 2249 NoObservableSideEffectsScope scope(this);
2250 2250
(...skipping 3004 matching lines...) Expand 10 before | Expand all | Expand 10 after
5255 New<HCompareObjectEqAndBranch>(enumerable_map, type, if_fast, if_slow)); 5255 New<HCompareObjectEqAndBranch>(enumerable_map, type, if_fast, if_slow));
5256 set_current_block(if_fast); 5256 set_current_block(if_fast);
5257 { 5257 {
5258 // The enum cache for enumerable is still valid, no need to check key. 5258 // The enum cache for enumerable is still valid, no need to check key.
5259 Push(key); 5259 Push(key);
5260 Goto(if_join); 5260 Goto(if_join);
5261 } 5261 }
5262 set_current_block(if_slow); 5262 set_current_block(if_slow);
5263 { 5263 {
5264 Callable callable = CodeFactory::ForInFilter(isolate()); 5264 Callable callable = CodeFactory::ForInFilter(isolate());
5265 HValue* values[] = {context(), key, enumerable}; 5265 HValue* values[] = {key, enumerable};
5266 HConstant* stub_value = Add<HConstant>(callable.code()); 5266 HConstant* stub_value = Add<HConstant>(callable.code());
5267 Push(Add<HCallWithDescriptor>(stub_value, 0, callable.descriptor(), 5267 Push(Add<HCallWithDescriptor>(stub_value, 0, callable.descriptor(),
5268 ArrayVector(values))); 5268 ArrayVector(values)));
5269 Add<HSimulate>(stmt->FilterId()); 5269 Add<HSimulate>(stmt->FilterId());
5270 FinishCurrentBlock(New<HCompareObjectEqAndBranch>( 5270 FinishCurrentBlock(New<HCompareObjectEqAndBranch>(
5271 Top(), graph()->GetConstantUndefined(), if_slow_skip, if_slow_pass)); 5271 Top(), graph()->GetConstantUndefined(), if_slow_skip, if_slow_pass));
5272 } 5272 }
5273 set_current_block(if_slow_pass); 5273 set_current_block(if_slow_pass);
5274 { Goto(if_join); } 5274 { Goto(if_join); }
5275 set_current_block(if_slow_skip); 5275 set_current_block(if_slow_skip);
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5363 expr, current_info()->script(), top_info()); 5363 expr, current_info()->script(), top_info());
5364 // We also have a stack overflow if the recursive compilation did. 5364 // We also have a stack overflow if the recursive compilation did.
5365 if (HasStackOverflow()) return; 5365 if (HasStackOverflow()) return;
5366 // Use the fast case closure allocation code that allocates in new 5366 // Use the fast case closure allocation code that allocates in new
5367 // space for nested functions that don't need pretenuring. 5367 // space for nested functions that don't need pretenuring.
5368 HConstant* shared_info_value = Add<HConstant>(shared_info); 5368 HConstant* shared_info_value = Add<HConstant>(shared_info);
5369 HInstruction* instr; 5369 HInstruction* instr;
5370 if (!expr->pretenure()) { 5370 if (!expr->pretenure()) {
5371 FastNewClosureStub stub(isolate()); 5371 FastNewClosureStub stub(isolate());
5372 FastNewClosureDescriptor descriptor(isolate()); 5372 FastNewClosureDescriptor descriptor(isolate());
5373 HValue* values[] = {context(), shared_info_value}; 5373 HValue* values[] = {shared_info_value};
5374 HConstant* stub_value = Add<HConstant>(stub.GetCode()); 5374 HConstant* stub_value = Add<HConstant>(stub.GetCode());
5375 instr = New<HCallWithDescriptor>(stub_value, 0, descriptor, 5375 instr = New<HCallWithDescriptor>(stub_value, 0, descriptor,
5376 ArrayVector(values)); 5376 ArrayVector(values));
5377 } else { 5377 } else {
5378 Add<HPushArguments>(shared_info_value); 5378 Add<HPushArguments>(shared_info_value);
5379 Runtime::FunctionId function_id = 5379 Runtime::FunctionId function_id =
5380 expr->pretenure() ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure; 5380 expr->pretenure() ? Runtime::kNewClosure_Tenured : Runtime::kNewClosure;
5381 instr = New<HCallRuntime>(Runtime::FunctionForId(function_id), 1); 5381 instr = New<HCallRuntime>(Runtime::FunctionForId(function_id), 1);
5382 } 5382 }
5383 return ast_context()->ReturnInstruction(instr, expr->id()); 5383 return ast_context()->ReturnInstruction(instr, expr->id());
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
5589 } 5589 }
5590 } else { 5590 } else {
5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); 5591 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate());
5592 5592
5593 HValue* vector_value = Add<HConstant>(vector); 5593 HValue* vector_value = Add<HConstant>(vector);
5594 HValue* slot_value = 5594 HValue* slot_value =
5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot())); 5595 Add<HConstant>(vector->GetIndex(expr->VariableFeedbackSlot()));
5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode( 5596 Callable callable = CodeFactory::LoadGlobalICInOptimizedCode(
5597 isolate(), ast_context()->typeof_mode()); 5597 isolate(), ast_context()->typeof_mode());
5598 HValue* stub = Add<HConstant>(callable.code()); 5598 HValue* stub = Add<HConstant>(callable.code());
5599 HValue* values[] = {context(), slot_value, vector_value}; 5599 HValue* values[] = {slot_value, vector_value};
5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>( 5600 HCallWithDescriptor* instr = New<HCallWithDescriptor>(
5601 stub, 0, callable.descriptor(), ArrayVector(values)); 5601 stub, 0, callable.descriptor(), ArrayVector(values));
5602 return ast_context()->ReturnInstruction(instr, expr->id()); 5602 return ast_context()->ReturnInstruction(instr, expr->id());
5603 } 5603 }
5604 } 5604 }
5605 5605
5606 case VariableLocation::PARAMETER: 5606 case VariableLocation::PARAMETER:
5607 case VariableLocation::LOCAL: { 5607 case VariableLocation::LOCAL: {
5608 HValue* value = LookupAndMakeLive(variable); 5608 HValue* value = LookupAndMakeLive(variable);
5609 if (value == graph()->GetConstantHole()) { 5609 if (value == graph()->GetConstantHole()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
5647 HConstant* instr = New<HConstant>(expr->value()); 5647 HConstant* instr = New<HConstant>(expr->value());
5648 return ast_context()->ReturnInstruction(instr, expr->id()); 5648 return ast_context()->ReturnInstruction(instr, expr->id());
5649 } 5649 }
5650 5650
5651 5651
5652 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { 5652 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
5653 DCHECK(!HasStackOverflow()); 5653 DCHECK(!HasStackOverflow());
5654 DCHECK(current_block() != NULL); 5654 DCHECK(current_block() != NULL);
5655 DCHECK(current_block()->HasPredecessor()); 5655 DCHECK(current_block()->HasPredecessor());
5656 Callable callable = CodeFactory::FastCloneRegExp(isolate()); 5656 Callable callable = CodeFactory::FastCloneRegExp(isolate());
5657 HValue* values[] = { 5657 HValue* values[] = {AddThisFunction(), Add<HConstant>(expr->literal_index()),
5658 context(), AddThisFunction(), Add<HConstant>(expr->literal_index()), 5658 Add<HConstant>(expr->pattern()),
5659 Add<HConstant>(expr->pattern()), Add<HConstant>(expr->flags())}; 5659 Add<HConstant>(expr->flags())};
5660 HConstant* stub_value = Add<HConstant>(callable.code()); 5660 HConstant* stub_value = Add<HConstant>(callable.code());
5661 HInstruction* instr = New<HCallWithDescriptor>( 5661 HInstruction* instr = New<HCallWithDescriptor>(
5662 stub_value, 0, callable.descriptor(), ArrayVector(values)); 5662 stub_value, 0, callable.descriptor(), ArrayVector(values));
5663 return ast_context()->ReturnInstruction(instr, expr->id()); 5663 return ast_context()->ReturnInstruction(instr, expr->id());
5664 } 5664 }
5665 5665
5666 5666
5667 static bool CanInlinePropertyAccess(Handle<Map> map) { 5667 static bool CanInlinePropertyAccess(Handle<Map> map) {
5668 if (map->instance_type() == HEAP_NUMBER_TYPE) return true; 5668 if (map->instance_type() == HEAP_NUMBER_TYPE) return true;
5669 if (map->instance_type() < FIRST_NONSTRING_TYPE) return true; 5669 if (map->instance_type() < FIRST_NONSTRING_TYPE) return true;
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after
6787 BuildGetNativeContext(), nullptr, 6787 BuildGetNativeContext(), nullptr,
6788 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX)); 6788 HObjectAccess::ForContextSlot(Context::EXTENSION_INDEX));
6789 Handle<TypeFeedbackVector> vector = 6789 Handle<TypeFeedbackVector> vector =
6790 handle(current_feedback_vector(), isolate()); 6790 handle(current_feedback_vector(), isolate());
6791 HValue* name = Add<HConstant>(var->name()); 6791 HValue* name = Add<HConstant>(var->name());
6792 HValue* vector_value = Add<HConstant>(vector); 6792 HValue* vector_value = Add<HConstant>(vector);
6793 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); 6793 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
6794 Callable callable = CodeFactory::StoreICInOptimizedCode( 6794 Callable callable = CodeFactory::StoreICInOptimizedCode(
6795 isolate(), function_language_mode()); 6795 isolate(), function_language_mode());
6796 HValue* stub = Add<HConstant>(callable.code()); 6796 HValue* stub = Add<HConstant>(callable.code());
6797 HValue* values[] = {context(), global_object, name, 6797 HValue* values[] = {global_object, name, value, slot_value, vector_value};
6798 value, slot_value, vector_value};
6799 HCallWithDescriptor* instr = Add<HCallWithDescriptor>( 6798 HCallWithDescriptor* instr = Add<HCallWithDescriptor>(
6800 stub, 0, callable.descriptor(), ArrayVector(values)); 6799 stub, 0, callable.descriptor(), ArrayVector(values));
6801 USE(instr); 6800 USE(instr);
6802 DCHECK(instr->HasObservableSideEffects()); 6801 DCHECK(instr->HasObservableSideEffects());
6803 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); 6802 Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
6804 } 6803 }
6805 } 6804 }
6806 6805
6807 6806
6808 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { 6807 void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
7096 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess, 7095 DeoptimizeReason::kInsufficientTypeFeedbackForGenericNamedAccess,
7097 Deoptimizer::SOFT); 7096 Deoptimizer::SOFT);
7098 } 7097 }
7099 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); 7098 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate());
7100 7099
7101 HValue* key = Add<HConstant>(name); 7100 HValue* key = Add<HConstant>(name);
7102 HValue* vector_value = Add<HConstant>(vector); 7101 HValue* vector_value = Add<HConstant>(vector);
7103 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); 7102 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
7104 7103
7105 if (access_type == LOAD) { 7104 if (access_type == LOAD) {
7106 HValue* values[] = {context(), object, key, slot_value, vector_value}; 7105 HValue* values[] = {object, key, slot_value, vector_value};
7107 if (!expr->AsProperty()->key()->IsPropertyName()) { 7106 if (!expr->AsProperty()->key()->IsPropertyName()) {
7108 // It's possible that a keyed load of a constant string was converted 7107 // It's possible that a keyed load of a constant string was converted
7109 // to a named load. Here, at the last minute, we need to make sure to 7108 // to a named load. Here, at the last minute, we need to make sure to
7110 // use a generic Keyed Load if we are using the type vector, because 7109 // use a generic Keyed Load if we are using the type vector, because
7111 // it has to share information with full code. 7110 // it has to share information with full code.
7112 HLoadKeyedGeneric* result = 7111 HLoadKeyedGeneric* result =
7113 New<HLoadKeyedGeneric>(object, key, vector, slot); 7112 New<HLoadKeyedGeneric>(object, key, vector, slot);
7114 return result; 7113 return result;
7115 } 7114 }
7116 7115
7117 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate()); 7116 Callable callable = CodeFactory::LoadICInOptimizedCode(isolate());
7118 HValue* stub = Add<HConstant>(callable.code()); 7117 HValue* stub = Add<HConstant>(callable.code());
7119 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7118 HCallWithDescriptor* result = New<HCallWithDescriptor>(
7120 stub, 0, callable.descriptor(), ArrayVector(values)); 7119 stub, 0, callable.descriptor(), ArrayVector(values));
7121 return result; 7120 return result;
7122 7121
7123 } else { 7122 } else {
7124 HValue* values[] = {context(), object, key, 7123 HValue* values[] = {object, key, value, slot_value, vector_value};
7125 value, slot_value, vector_value};
7126
7127 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) { 7124 if (vector->GetKind(slot) == FeedbackVectorSlotKind::KEYED_STORE_IC) {
7128 // It's possible that a keyed store of a constant string was converted 7125 // It's possible that a keyed store of a constant string was converted
7129 // to a named store. Here, at the last minute, we need to make sure to 7126 // to a named store. Here, at the last minute, we need to make sure to
7130 // use a generic Keyed Store if we are using the type vector, because 7127 // use a generic Keyed Store if we are using the type vector, because
7131 // it has to share information with full code. 7128 // it has to share information with full code.
7132 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( 7129 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode(
7133 isolate(), function_language_mode()); 7130 isolate(), function_language_mode());
7134 HValue* stub = Add<HConstant>(callable.code()); 7131 HValue* stub = Add<HConstant>(callable.code());
7135 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7132 HCallWithDescriptor* result = New<HCallWithDescriptor>(
7136 stub, 0, callable.descriptor(), ArrayVector(values)); 7133 stub, 0, callable.descriptor(), ArrayVector(values));
(...skipping 14 matching lines...) Expand all
7151 HValue* object, HValue* key, HValue* value) { 7148 HValue* object, HValue* key, HValue* value) {
7152 Handle<TypeFeedbackVector> vector = 7149 Handle<TypeFeedbackVector> vector =
7153 handle(current_feedback_vector(), isolate()); 7150 handle(current_feedback_vector(), isolate());
7154 if (access_type == LOAD) { 7151 if (access_type == LOAD) {
7155 HLoadKeyedGeneric* result = 7152 HLoadKeyedGeneric* result =
7156 New<HLoadKeyedGeneric>(object, key, vector, slot); 7153 New<HLoadKeyedGeneric>(object, key, vector, slot);
7157 return result; 7154 return result;
7158 } else { 7155 } else {
7159 HValue* vector_value = Add<HConstant>(vector); 7156 HValue* vector_value = Add<HConstant>(vector);
7160 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot)); 7157 HValue* slot_value = Add<HConstant>(vector->GetIndex(slot));
7161 HValue* values[] = {context(), object, key, 7158 HValue* values[] = {object, key, value, slot_value, vector_value};
7162 value, slot_value, vector_value};
7163 7159
7164 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode( 7160 Callable callable = CodeFactory::KeyedStoreICInOptimizedCode(
7165 isolate(), function_language_mode()); 7161 isolate(), function_language_mode());
7166 HValue* stub = Add<HConstant>(callable.code()); 7162 HValue* stub = Add<HConstant>(callable.code());
7167 HCallWithDescriptor* result = New<HCallWithDescriptor>( 7163 HCallWithDescriptor* result = New<HCallWithDescriptor>(
7168 stub, 0, callable.descriptor(), ArrayVector(values)); 7164 stub, 0, callable.descriptor(), ArrayVector(values));
7169 return result; 7165 return result;
7170 } 7166 }
7171 } 7167 }
7172 7168
(...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after
7851 HInstruction* HOptimizedGraphBuilder::NewCallFunction( 7847 HInstruction* HOptimizedGraphBuilder::NewCallFunction(
7852 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, 7848 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode,
7853 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode) { 7849 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode) {
7854 if (syntactic_tail_call_mode == TailCallMode::kAllow) { 7850 if (syntactic_tail_call_mode == TailCallMode::kAllow) {
7855 BuildEnsureCallable(function); 7851 BuildEnsureCallable(function);
7856 } else { 7852 } else {
7857 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); 7853 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode);
7858 } 7854 }
7859 HValue* arity = Add<HConstant>(argument_count - 1); 7855 HValue* arity = Add<HConstant>(argument_count - 1);
7860 7856
7861 HValue* op_vals[] = {context(), function, arity}; 7857 HValue* op_vals[] = {function, arity};
7862 7858
7863 Callable callable = 7859 Callable callable =
7864 CodeFactory::Call(isolate(), convert_mode, tail_call_mode); 7860 CodeFactory::Call(isolate(), convert_mode, tail_call_mode);
7865 HConstant* stub = Add<HConstant>(callable.code()); 7861 HConstant* stub = Add<HConstant>(callable.code());
7866 7862
7867 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), 7863 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(),
7868 ArrayVector(op_vals), 7864 ArrayVector(op_vals),
7869 syntactic_tail_call_mode); 7865 syntactic_tail_call_mode);
7870 } 7866 }
7871 7867
7872 HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC( 7868 HInstruction* HOptimizedGraphBuilder::NewCallFunctionViaIC(
7873 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode, 7869 HValue* function, int argument_count, TailCallMode syntactic_tail_call_mode,
7874 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode, 7870 ConvertReceiverMode convert_mode, TailCallMode tail_call_mode,
7875 FeedbackVectorSlot slot) { 7871 FeedbackVectorSlot slot) {
7876 if (syntactic_tail_call_mode == TailCallMode::kAllow) { 7872 if (syntactic_tail_call_mode == TailCallMode::kAllow) {
7877 BuildEnsureCallable(function); 7873 BuildEnsureCallable(function);
7878 } else { 7874 } else {
7879 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode); 7875 DCHECK_EQ(TailCallMode::kDisallow, tail_call_mode);
7880 } 7876 }
7881 int arity = argument_count - 1; 7877 int arity = argument_count - 1;
7882 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate()); 7878 Handle<TypeFeedbackVector> vector(current_feedback_vector(), isolate());
7883 HValue* arity_val = Add<HConstant>(arity); 7879 HValue* arity_val = Add<HConstant>(arity);
7884 HValue* index_val = Add<HConstant>(vector->GetIndex(slot)); 7880 HValue* index_val = Add<HConstant>(vector->GetIndex(slot));
7885 HValue* vector_val = Add<HConstant>(vector); 7881 HValue* vector_val = Add<HConstant>(vector);
7886 7882
7887 HValue* op_vals[] = {context(), function, arity_val, index_val, vector_val}; 7883 HValue* op_vals[] = {function, arity_val, index_val, vector_val};
7888
7889 Callable callable = CodeFactory::CallICInOptimizedCode( 7884 Callable callable = CodeFactory::CallICInOptimizedCode(
7890 isolate(), convert_mode, tail_call_mode); 7885 isolate(), convert_mode, tail_call_mode);
7891 HConstant* stub = Add<HConstant>(callable.code()); 7886 HConstant* stub = Add<HConstant>(callable.code());
7892 7887
7893 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(), 7888 return New<HCallWithDescriptor>(stub, argument_count, callable.descriptor(),
7894 ArrayVector(op_vals), 7889 ArrayVector(op_vals),
7895 syntactic_tail_call_mode); 7890 syntactic_tail_call_mode);
7896 } 7891 }
7897 7892
7898 HInstruction* HOptimizedGraphBuilder::NewCallConstantFunction( 7893 HInstruction* HOptimizedGraphBuilder::NewCallConstantFunction(
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after
9227 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info(); 9222 Handle<CallHandlerInfo> api_call_info = optimization.api_call_info();
9228 Handle<Object> call_data_obj(api_call_info->data(), isolate()); 9223 Handle<Object> call_data_obj(api_call_info->data(), isolate());
9229 bool call_data_undefined = call_data_obj->IsUndefined(isolate()); 9224 bool call_data_undefined = call_data_obj->IsUndefined(isolate());
9230 HValue* call_data = Add<HConstant>(call_data_obj); 9225 HValue* call_data = Add<HConstant>(call_data_obj);
9231 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback())); 9226 ApiFunction fun(v8::ToCData<Address>(api_call_info->callback()));
9232 ExternalReference ref = ExternalReference(&fun, 9227 ExternalReference ref = ExternalReference(&fun,
9233 ExternalReference::DIRECT_API_CALL, 9228 ExternalReference::DIRECT_API_CALL,
9234 isolate()); 9229 isolate());
9235 HValue* api_function_address = Add<HConstant>(ExternalReference(ref)); 9230 HValue* api_function_address = Add<HConstant>(ExternalReference(ref));
9236 9231
9237 HValue* op_vals[] = {context(), Add<HConstant>(function), call_data, holder, 9232 HValue* op_vals[] = {Add<HConstant>(function), call_data, holder,
9238 api_function_address}; 9233 api_function_address};
9239 9234
9240 HInstruction* call = nullptr; 9235 HInstruction* call = nullptr;
9241 CHECK(argc <= CallApiCallbackStub::kArgMax); 9236 CHECK(argc <= CallApiCallbackStub::kArgMax);
9242 if (!is_function) { 9237 if (!is_function) {
9243 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined, 9238 CallApiCallbackStub stub(isolate(), is_store, call_data_undefined,
9244 !optimization.is_constant_call()); 9239 !optimization.is_constant_call());
9245 Handle<Code> code = stub.GetCode(); 9240 Handle<Code> code = stub.GetCode();
9246 HConstant* code_value = Add<HConstant>(code); 9241 HConstant* code_value = Add<HConstant>(code);
9247 call = New<HCallWithDescriptor>( 9242 call = New<HCallWithDescriptor>(
(...skipping 718 matching lines...) Expand 10 before | Expand all | Expand 10 after
9966 instr = prev_instr; 9961 instr = prev_instr;
9967 } while (instr != check); 9962 } while (instr != check);
9968 environment()->SetExpressionStackAt(receiver_index, function); 9963 environment()->SetExpressionStackAt(receiver_index, function);
9969 } else { 9964 } else {
9970 // The constructor function is both an operand to the instruction and an 9965 // The constructor function is both an operand to the instruction and an
9971 // argument to the construct call. 9966 // argument to the construct call.
9972 if (TryHandleArrayCall(expr, function)) return; 9967 if (TryHandleArrayCall(expr, function)) return;
9973 } 9968 }
9974 9969
9975 HValue* arity = Add<HConstant>(argument_count - 1); 9970 HValue* arity = Add<HConstant>(argument_count - 1);
9976 HValue* op_vals[] = {context(), function, function, arity}; 9971 HValue* op_vals[] = {function, function, arity};
9977 Callable callable = CodeFactory::Construct(isolate()); 9972 Callable callable = CodeFactory::Construct(isolate());
9978 HConstant* stub = Add<HConstant>(callable.code()); 9973 HConstant* stub = Add<HConstant>(callable.code());
9979 PushArgumentsFromEnvironment(argument_count); 9974 PushArgumentsFromEnvironment(argument_count);
9980 HInstruction* construct = New<HCallWithDescriptor>( 9975 HInstruction* construct = New<HCallWithDescriptor>(
9981 stub, argument_count, callable.descriptor(), ArrayVector(op_vals)); 9976 stub, argument_count, callable.descriptor(), ArrayVector(op_vals));
9982 return ast_context()->ReturnInstruction(construct, expr->id()); 9977 return ast_context()->ReturnInstruction(construct, expr->id());
9983 } 9978 }
9984 9979
9985 9980
9986 void HOptimizedGraphBuilder::BuildInitializeInobjectProperties( 9981 void HOptimizedGraphBuilder::BuildInitializeInobjectProperties(
(...skipping 1045 matching lines...) Expand 10 before | Expand all | Expand 10 after
11032 Representation result_rep = RepresentationFor(result_type); 11027 Representation result_rep = RepresentationFor(result_type);
11033 11028
11034 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) || 11029 bool is_non_primitive = (left_rep.IsTagged() && !left_rep.IsSmi()) ||
11035 (right_rep.IsTagged() && !right_rep.IsSmi()); 11030 (right_rep.IsTagged() && !right_rep.IsSmi());
11036 11031
11037 HInstruction* instr = NULL; 11032 HInstruction* instr = NULL;
11038 // Only the stub is allowed to call into the runtime, since otherwise we would 11033 // Only the stub is allowed to call into the runtime, since otherwise we would
11039 // inline several instructions (including the two pushes) for every tagged 11034 // inline several instructions (including the two pushes) for every tagged
11040 // operation in optimized code, which is more expensive, than a stub call. 11035 // operation in optimized code, which is more expensive, than a stub call.
11041 if (graph()->info()->IsStub() && is_non_primitive) { 11036 if (graph()->info()->IsStub() && is_non_primitive) {
11042 HValue* values[] = {context(), left, right}; 11037 HValue* values[] = {left, right};
11043 #define GET_STUB(Name) \ 11038 #define GET_STUB(Name) \
11044 do { \ 11039 do { \
11045 Callable callable = CodeFactory::Name(isolate()); \ 11040 Callable callable = CodeFactory::Name(isolate()); \
11046 HValue* stub = Add<HConstant>(callable.code()); \ 11041 HValue* stub = Add<HConstant>(callable.code()); \
11047 instr = AddUncasted<HCallWithDescriptor>(stub, 0, callable.descriptor(), \ 11042 instr = AddUncasted<HCallWithDescriptor>(stub, 0, callable.descriptor(), \
11048 ArrayVector(values)); \ 11043 ArrayVector(values)); \
11049 } while (false) 11044 } while (false)
11050 11045
11051 switch (op) { 11046 switch (op) {
11052 default: 11047 default:
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after
11432 HInstruction* prototype = 11427 HInstruction* prototype =
11433 Add<HConstant>(handle(initial_map->prototype(), isolate())); 11428 Add<HConstant>(handle(initial_map->prototype(), isolate()));
11434 HHasInPrototypeChainAndBranch* result = 11429 HHasInPrototypeChainAndBranch* result =
11435 New<HHasInPrototypeChainAndBranch>(left, prototype); 11430 New<HHasInPrototypeChainAndBranch>(left, prototype);
11436 return ast_context()->ReturnControl(result, expr->id()); 11431 return ast_context()->ReturnControl(result, expr->id());
11437 } 11432 }
11438 } 11433 }
11439 11434
11440 Callable callable = CodeFactory::InstanceOf(isolate()); 11435 Callable callable = CodeFactory::InstanceOf(isolate());
11441 HValue* stub = Add<HConstant>(callable.code()); 11436 HValue* stub = Add<HConstant>(callable.code());
11442 HValue* values[] = {context(), left, right}; 11437 HValue* values[] = {left, right};
11443 HCallWithDescriptor* result = New<HCallWithDescriptor>( 11438 HCallWithDescriptor* result = New<HCallWithDescriptor>(
11444 stub, 0, callable.descriptor(), ArrayVector(values)); 11439 stub, 0, callable.descriptor(), ArrayVector(values));
11445 result->set_type(HType::Boolean()); 11440 result->set_type(HType::Boolean());
11446 return ast_context()->ReturnInstruction(result, expr->id()); 11441 return ast_context()->ReturnInstruction(result, expr->id());
11447 11442
11448 } else if (op == Token::IN) { 11443 } else if (op == Token::IN) {
11449 Callable callable = CodeFactory::HasProperty(isolate()); 11444 Callable callable = CodeFactory::HasProperty(isolate());
11450 HValue* stub = Add<HConstant>(callable.code()); 11445 HValue* stub = Add<HConstant>(callable.code());
11451 HValue* values[] = {context(), left, right}; 11446 HValue* values[] = {left, right};
11452 HInstruction* result = 11447 HInstruction* result =
11453 New<HCallWithDescriptor>(stub, 0, callable.descriptor(), 11448 New<HCallWithDescriptor>(stub, 0, callable.descriptor(),
11454 Vector<HValue*>(values, arraysize(values))); 11449 Vector<HValue*>(values, arraysize(values)));
11455 return ast_context()->ReturnInstruction(result, expr->id()); 11450 return ast_context()->ReturnInstruction(result, expr->id());
11456 } 11451 }
11457 11452
11458 PushBeforeSimulateBehavior push_behavior = 11453 PushBeforeSimulateBehavior push_behavior =
11459 ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE 11454 ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE
11460 : PUSH_BEFORE_SIMULATE; 11455 : PUSH_BEFORE_SIMULATE;
11461 HControlInstruction* compare = BuildCompareInstruction( 11456 HControlInstruction* compare = BuildCompareInstruction(
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
12182 12177
12183 void HOptimizedGraphBuilder::GenerateToInteger(CallRuntime* call) { 12178 void HOptimizedGraphBuilder::GenerateToInteger(CallRuntime* call) {
12184 DCHECK_EQ(1, call->arguments()->length()); 12179 DCHECK_EQ(1, call->arguments()->length());
12185 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12180 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12186 HValue* input = Pop(); 12181 HValue* input = Pop();
12187 if (input->type().IsSmi()) { 12182 if (input->type().IsSmi()) {
12188 return ast_context()->ReturnValue(input); 12183 return ast_context()->ReturnValue(input);
12189 } else { 12184 } else {
12190 Callable callable = CodeFactory::ToInteger(isolate()); 12185 Callable callable = CodeFactory::ToInteger(isolate());
12191 HValue* stub = Add<HConstant>(callable.code()); 12186 HValue* stub = Add<HConstant>(callable.code());
12192 HValue* values[] = {context(), input}; 12187 HValue* values[] = {input};
12193 HInstruction* result = New<HCallWithDescriptor>( 12188 HInstruction* result = New<HCallWithDescriptor>(
12194 stub, 0, callable.descriptor(), ArrayVector(values)); 12189 stub, 0, callable.descriptor(), ArrayVector(values));
12195 return ast_context()->ReturnInstruction(result, call->id()); 12190 return ast_context()->ReturnInstruction(result, call->id());
12196 } 12191 }
12197 } 12192 }
12198 12193
12199 12194
12200 void HOptimizedGraphBuilder::GenerateToObject(CallRuntime* call) { 12195 void HOptimizedGraphBuilder::GenerateToObject(CallRuntime* call) {
12201 DCHECK_EQ(1, call->arguments()->length()); 12196 DCHECK_EQ(1, call->arguments()->length());
12202 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12197 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12203 HValue* value = Pop(); 12198 HValue* value = Pop();
12204 HValue* result = BuildToObject(value); 12199 HValue* result = BuildToObject(value);
12205 return ast_context()->ReturnValue(result); 12200 return ast_context()->ReturnValue(result);
12206 } 12201 }
12207 12202
12208 12203
12209 void HOptimizedGraphBuilder::GenerateToString(CallRuntime* call) { 12204 void HOptimizedGraphBuilder::GenerateToString(CallRuntime* call) {
12210 DCHECK_EQ(1, call->arguments()->length()); 12205 DCHECK_EQ(1, call->arguments()->length());
12211 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12206 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12212 HValue* input = Pop(); 12207 HValue* input = Pop();
12213 if (input->type().IsString()) { 12208 if (input->type().IsString()) {
12214 return ast_context()->ReturnValue(input); 12209 return ast_context()->ReturnValue(input);
12215 } else { 12210 } else {
12216 Callable callable = CodeFactory::ToString(isolate()); 12211 Callable callable = CodeFactory::ToString(isolate());
12217 HValue* stub = Add<HConstant>(callable.code()); 12212 HValue* stub = Add<HConstant>(callable.code());
12218 HValue* values[] = {context(), input}; 12213 HValue* values[] = {input};
12219 HInstruction* result = New<HCallWithDescriptor>( 12214 HInstruction* result = New<HCallWithDescriptor>(
12220 stub, 0, callable.descriptor(), ArrayVector(values)); 12215 stub, 0, callable.descriptor(), ArrayVector(values));
12221 return ast_context()->ReturnInstruction(result, call->id()); 12216 return ast_context()->ReturnInstruction(result, call->id());
12222 } 12217 }
12223 } 12218 }
12224 12219
12225 12220
12226 void HOptimizedGraphBuilder::GenerateToLength(CallRuntime* call) { 12221 void HOptimizedGraphBuilder::GenerateToLength(CallRuntime* call) {
12227 DCHECK_EQ(1, call->arguments()->length()); 12222 DCHECK_EQ(1, call->arguments()->length());
12228 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12223 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12229 Callable callable = CodeFactory::ToLength(isolate()); 12224 Callable callable = CodeFactory::ToLength(isolate());
12230 HValue* input = Pop(); 12225 HValue* input = Pop();
12231 HValue* stub = Add<HConstant>(callable.code()); 12226 HValue* stub = Add<HConstant>(callable.code());
12232 HValue* values[] = {context(), input}; 12227 HValue* values[] = {input};
12233 HInstruction* result = New<HCallWithDescriptor>( 12228 HInstruction* result = New<HCallWithDescriptor>(
12234 stub, 0, callable.descriptor(), ArrayVector(values)); 12229 stub, 0, callable.descriptor(), ArrayVector(values));
12235 return ast_context()->ReturnInstruction(result, call->id()); 12230 return ast_context()->ReturnInstruction(result, call->id());
12236 } 12231 }
12237 12232
12238 12233
12239 void HOptimizedGraphBuilder::GenerateToNumber(CallRuntime* call) { 12234 void HOptimizedGraphBuilder::GenerateToNumber(CallRuntime* call) {
12240 DCHECK_EQ(1, call->arguments()->length()); 12235 DCHECK_EQ(1, call->arguments()->length());
12241 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12236 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12242 Callable callable = CodeFactory::ToNumber(isolate()); 12237 Callable callable = CodeFactory::ToNumber(isolate());
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
12314 12309
12315 // Fast support for SubString. 12310 // Fast support for SubString.
12316 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) { 12311 void HOptimizedGraphBuilder::GenerateSubString(CallRuntime* call) {
12317 DCHECK_EQ(3, call->arguments()->length()); 12312 DCHECK_EQ(3, call->arguments()->length());
12318 CHECK_ALIVE(VisitExpressions(call->arguments())); 12313 CHECK_ALIVE(VisitExpressions(call->arguments()));
12319 Callable callable = CodeFactory::SubString(isolate()); 12314 Callable callable = CodeFactory::SubString(isolate());
12320 HValue* stub = Add<HConstant>(callable.code()); 12315 HValue* stub = Add<HConstant>(callable.code());
12321 HValue* to = Pop(); 12316 HValue* to = Pop();
12322 HValue* from = Pop(); 12317 HValue* from = Pop();
12323 HValue* string = Pop(); 12318 HValue* string = Pop();
12324 HValue* values[] = {context(), string, from, to}; 12319 HValue* values[] = {string, from, to};
12325 HInstruction* result = New<HCallWithDescriptor>( 12320 HInstruction* result = New<HCallWithDescriptor>(
12326 stub, 0, callable.descriptor(), ArrayVector(values)); 12321 stub, 0, callable.descriptor(), ArrayVector(values));
12327 result->set_type(HType::String()); 12322 result->set_type(HType::String());
12328 return ast_context()->ReturnInstruction(result, call->id()); 12323 return ast_context()->ReturnInstruction(result, call->id());
12329 } 12324 }
12330 12325
12331 // Support for direct creation of new objects. 12326 // Support for direct creation of new objects.
12332 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) { 12327 void HOptimizedGraphBuilder::GenerateNewObject(CallRuntime* call) {
12333 DCHECK_EQ(2, call->arguments()->length()); 12328 DCHECK_EQ(2, call->arguments()->length());
12334 CHECK_ALIVE(VisitExpressions(call->arguments())); 12329 CHECK_ALIVE(VisitExpressions(call->arguments()));
12335 FastNewObjectStub stub(isolate()); 12330 FastNewObjectStub stub(isolate());
12336 FastNewObjectDescriptor descriptor(isolate()); 12331 FastNewObjectDescriptor descriptor(isolate());
12337 HValue* values[] = {context(), Pop(), Pop()}; 12332 HValue* values[] = {Pop(), Pop()};
12338 HConstant* stub_value = Add<HConstant>(stub.GetCode()); 12333 HConstant* stub_value = Add<HConstant>(stub.GetCode());
12339 HInstruction* result = 12334 HInstruction* result =
12340 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values)); 12335 New<HCallWithDescriptor>(stub_value, 0, descriptor, ArrayVector(values));
12341 return ast_context()->ReturnInstruction(result, call->id()); 12336 return ast_context()->ReturnInstruction(result, call->id());
12342 } 12337 }
12343 12338
12344 // Support for direct calls from JavaScript to native RegExp code. 12339 // Support for direct calls from JavaScript to native RegExp code.
12345 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) { 12340 void HOptimizedGraphBuilder::GenerateRegExpExec(CallRuntime* call) {
12346 DCHECK_EQ(4, call->arguments()->length()); 12341 DCHECK_EQ(4, call->arguments()->length());
12347 CHECK_ALIVE(VisitExpressions(call->arguments())); 12342 CHECK_ALIVE(VisitExpressions(call->arguments()));
12348 Callable callable = CodeFactory::RegExpExec(isolate()); 12343 Callable callable = CodeFactory::RegExpExec(isolate());
12349 HValue* last_match_info = Pop(); 12344 HValue* last_match_info = Pop();
12350 HValue* index = Pop(); 12345 HValue* index = Pop();
12351 HValue* subject = Pop(); 12346 HValue* subject = Pop();
12352 HValue* regexp_object = Pop(); 12347 HValue* regexp_object = Pop();
12353 HValue* stub = Add<HConstant>(callable.code()); 12348 HValue* stub = Add<HConstant>(callable.code());
12354 HValue* values[] = {context(), regexp_object, subject, index, 12349 HValue* values[] = {regexp_object, subject, index, last_match_info};
12355 last_match_info};
12356 HInstruction* result = New<HCallWithDescriptor>( 12350 HInstruction* result = New<HCallWithDescriptor>(
12357 stub, 0, callable.descriptor(), ArrayVector(values)); 12351 stub, 0, callable.descriptor(), ArrayVector(values));
12358 return ast_context()->ReturnInstruction(result, call->id()); 12352 return ast_context()->ReturnInstruction(result, call->id());
12359 } 12353 }
12360 12354
12361 12355
12362 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) { 12356 void HOptimizedGraphBuilder::GenerateRegExpFlags(CallRuntime* call) {
12363 DCHECK_EQ(1, call->arguments()->length()); 12357 DCHECK_EQ(1, call->arguments()->length());
12364 CHECK_ALIVE(VisitExpressions(call->arguments())); 12358 CHECK_ALIVE(VisitExpressions(call->arguments()));
12365 HValue* regexp = Pop(); 12359 HValue* regexp = Pop();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
12404 12398
12405 12399
12406 // Fast support for calls. 12400 // Fast support for calls.
12407 void HOptimizedGraphBuilder::GenerateCall(CallRuntime* call) { 12401 void HOptimizedGraphBuilder::GenerateCall(CallRuntime* call) {
12408 DCHECK_LE(2, call->arguments()->length()); 12402 DCHECK_LE(2, call->arguments()->length());
12409 CHECK_ALIVE(VisitExpressions(call->arguments())); 12403 CHECK_ALIVE(VisitExpressions(call->arguments()));
12410 CallTrampolineDescriptor descriptor(isolate()); 12404 CallTrampolineDescriptor descriptor(isolate());
12411 PushArgumentsFromEnvironment(call->arguments()->length() - 1); 12405 PushArgumentsFromEnvironment(call->arguments()->length() - 1);
12412 HValue* trampoline = Add<HConstant>(isolate()->builtins()->Call()); 12406 HValue* trampoline = Add<HConstant>(isolate()->builtins()->Call());
12413 HValue* target = Pop(); 12407 HValue* target = Pop();
12414 HValue* values[] = {context(), target, 12408 HValue* values[] = {target, Add<HConstant>(call->arguments()->length() - 2)};
12415 Add<HConstant>(call->arguments()->length() - 2)};
12416 HInstruction* result = 12409 HInstruction* result =
12417 New<HCallWithDescriptor>(trampoline, call->arguments()->length() - 1, 12410 New<HCallWithDescriptor>(trampoline, call->arguments()->length() - 1,
12418 descriptor, ArrayVector(values)); 12411 descriptor, ArrayVector(values));
12419 return ast_context()->ReturnInstruction(result, call->id()); 12412 return ast_context()->ReturnInstruction(result, call->id());
12420 } 12413 }
12421 12414
12422 12415
12423 void HOptimizedGraphBuilder::GenerateFixedArrayGet(CallRuntime* call) { 12416 void HOptimizedGraphBuilder::GenerateFixedArrayGet(CallRuntime* call) {
12424 DCHECK(call->arguments()->length() == 2); 12417 DCHECK(call->arguments()->length() == 2);
12425 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12418 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
(...skipping 858 matching lines...) Expand 10 before | Expand all | Expand 10 after
13284 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13277 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13285 } 13278 }
13286 13279
13287 #ifdef DEBUG 13280 #ifdef DEBUG
13288 graph_->Verify(false); // No full verify. 13281 graph_->Verify(false); // No full verify.
13289 #endif 13282 #endif
13290 } 13283 }
13291 13284
13292 } // namespace internal 13285 } // namespace internal
13293 } // namespace v8 13286 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698