OLD | NEW |
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/full-codegen/full-codegen.h" | 5 #include "src/full-codegen/full-codegen.h" |
6 | 6 |
7 #include "src/ast/ast-numbering.h" | 7 #include "src/ast/ast-numbering.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 InitializeAstVisitor(stack_limit); | 216 InitializeAstVisitor(stack_limit); |
217 masm_->set_emit_debug_code(FLAG_debug_code); | 217 masm_->set_emit_debug_code(FLAG_debug_code); |
218 masm_->set_predictable_code_size(true); | 218 masm_->set_predictable_code_size(true); |
219 } | 219 } |
220 | 220 |
221 void FullCodeGenerator::PrepareForBailout(Expression* node, | 221 void FullCodeGenerator::PrepareForBailout(Expression* node, |
222 BailoutState state) { | 222 BailoutState state) { |
223 PrepareForBailoutForId(node->id(), state); | 223 PrepareForBailoutForId(node->id(), state); |
224 } | 224 } |
225 | 225 |
226 void FullCodeGenerator::CallLoadIC(TypeFeedbackId id) { | 226 void FullCodeGenerator::CallLoadIC(FeedbackVectorSlot slot, Handle<Object> name, |
| 227 TypeFeedbackId id) { |
| 228 DCHECK(name->IsName()); |
| 229 __ Move(LoadDescriptor::NameRegister(), name); |
| 230 |
| 231 EmitLoadSlot(LoadDescriptor::SlotRegister(), slot); |
| 232 |
227 Handle<Code> ic = CodeFactory::LoadIC(isolate()).code(); | 233 Handle<Code> ic = CodeFactory::LoadIC(isolate()).code(); |
228 CallIC(ic, id); | 234 CallIC(ic, id); |
229 if (FLAG_tf_load_ic_stub) RestoreContext(); | 235 if (FLAG_tf_load_ic_stub) RestoreContext(); |
230 } | 236 } |
231 | 237 |
232 void FullCodeGenerator::CallLoadGlobalIC(TypeofMode typeof_mode, | |
233 TypeFeedbackId id) { | |
234 Handle<Code> ic = CodeFactory::LoadGlobalIC(isolate(), typeof_mode).code(); | |
235 CallIC(ic, id); | |
236 } | |
237 | |
238 void FullCodeGenerator::CallStoreIC(FeedbackVectorSlot slot, | 238 void FullCodeGenerator::CallStoreIC(FeedbackVectorSlot slot, |
239 Handle<Object> name, TypeFeedbackId id) { | 239 Handle<Object> name, TypeFeedbackId id) { |
240 DCHECK(name->IsName()); | 240 DCHECK(name->IsName()); |
241 __ Move(StoreDescriptor::NameRegister(), name); | 241 __ Move(StoreDescriptor::NameRegister(), name); |
242 | 242 |
243 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || | 243 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || |
244 StoreDescriptor::kStackArgumentsCount == 2); | 244 StoreDescriptor::kStackArgumentsCount == 2); |
245 if (StoreDescriptor::kPassLastArgsOnStack) { | 245 if (StoreDescriptor::kPassLastArgsOnStack) { |
246 __ Push(StoreDescriptor::ValueRegister()); | 246 __ Push(StoreDescriptor::ValueRegister()); |
247 EmitPushSlot(slot); | 247 EmitPushSlot(slot); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 | 487 |
488 globals_ = saved_globals; | 488 globals_ = saved_globals; |
489 } | 489 } |
490 | 490 |
491 | 491 |
492 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { | 492 void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
493 Comment cmnt(masm_, "[ VariableProxy"); | 493 Comment cmnt(masm_, "[ VariableProxy"); |
494 EmitVariableLoad(expr); | 494 EmitVariableLoad(expr); |
495 } | 495 } |
496 | 496 |
| 497 void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy, |
| 498 TypeofMode typeof_mode) { |
| 499 #ifdef DEBUG |
| 500 Variable* var = proxy->var(); |
| 501 DCHECK(var->IsUnallocated() || |
| 502 (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL)); |
| 503 #endif |
| 504 EmitLoadSlot(LoadGlobalDescriptor::SlotRegister(), |
| 505 proxy->VariableFeedbackSlot()); |
| 506 Handle<Code> ic = CodeFactory::LoadGlobalIC(isolate(), typeof_mode).code(); |
| 507 CallIC(ic); |
| 508 } |
| 509 |
497 void FullCodeGenerator::VisitSloppyBlockFunctionStatement( | 510 void FullCodeGenerator::VisitSloppyBlockFunctionStatement( |
498 SloppyBlockFunctionStatement* declaration) { | 511 SloppyBlockFunctionStatement* declaration) { |
499 Visit(declaration->statement()); | 512 Visit(declaration->statement()); |
500 } | 513 } |
501 | 514 |
502 | 515 |
503 int FullCodeGenerator::DeclareGlobalsFlags() { | 516 int FullCodeGenerator::DeclareGlobalsFlags() { |
504 return info_->GetDeclareGlobalsFlags(); | 517 return info_->GetDeclareGlobalsFlags(); |
505 } | 518 } |
506 | 519 |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1086 } | 1099 } |
1087 context()->Plug(result_register()); | 1100 context()->Plug(result_register()); |
1088 } | 1101 } |
1089 | 1102 |
1090 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { | 1103 void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) { |
1091 SetExpressionPosition(prop); | 1104 SetExpressionPosition(prop); |
1092 Literal* key = prop->key()->AsLiteral(); | 1105 Literal* key = prop->key()->AsLiteral(); |
1093 DCHECK(!key->value()->IsSmi()); | 1106 DCHECK(!key->value()->IsSmi()); |
1094 DCHECK(!prop->IsSuperAccess()); | 1107 DCHECK(!prop->IsSuperAccess()); |
1095 | 1108 |
1096 __ Move(LoadDescriptor::NameRegister(), key->value()); | 1109 CallLoadIC(prop->PropertyFeedbackSlot(), key->value()); |
1097 __ Move(LoadDescriptor::SlotRegister(), | |
1098 SmiFromSlot(prop->PropertyFeedbackSlot())); | |
1099 CallLoadIC(); | |
1100 } | 1110 } |
1101 | 1111 |
1102 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { | 1112 void FullCodeGenerator::EmitNamedSuperPropertyLoad(Property* prop) { |
1103 // Stack: receiver, home_object | 1113 // Stack: receiver, home_object |
1104 SetExpressionPosition(prop); | 1114 SetExpressionPosition(prop); |
1105 Literal* key = prop->key()->AsLiteral(); | 1115 Literal* key = prop->key()->AsLiteral(); |
1106 DCHECK(!key->value()->IsSmi()); | 1116 DCHECK(!key->value()->IsSmi()); |
1107 DCHECK(prop->IsSuperAccess()); | 1117 DCHECK(prop->IsSuperAccess()); |
1108 | 1118 |
1109 PushOperand(key->value()); | 1119 PushOperand(key->value()); |
1110 CallRuntimeWithOperands(Runtime::kLoadFromSuper); | 1120 CallRuntimeWithOperands(Runtime::kLoadFromSuper); |
1111 } | 1121 } |
1112 | 1122 |
1113 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 1123 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
1114 SetExpressionPosition(prop); | 1124 SetExpressionPosition(prop); |
| 1125 |
| 1126 EmitLoadSlot(LoadDescriptor::SlotRegister(), prop->PropertyFeedbackSlot()); |
| 1127 |
1115 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); | 1128 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); |
1116 __ Move(LoadDescriptor::SlotRegister(), | |
1117 SmiFromSlot(prop->PropertyFeedbackSlot())); | |
1118 CallIC(ic); | 1129 CallIC(ic); |
1119 RestoreContext(); | 1130 RestoreContext(); |
1120 } | 1131 } |
1121 | 1132 |
1122 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { | 1133 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { |
1123 // Stack: receiver, home_object, key. | 1134 // Stack: receiver, home_object, key. |
1124 SetExpressionPosition(prop); | 1135 SetExpressionPosition(prop); |
1125 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper); | 1136 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper); |
1126 } | 1137 } |
1127 | 1138 |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1551 | 1562 |
1552 PushOperand(Smi::FromInt(lit->start_position())); | 1563 PushOperand(Smi::FromInt(lit->start_position())); |
1553 PushOperand(Smi::FromInt(lit->end_position())); | 1564 PushOperand(Smi::FromInt(lit->end_position())); |
1554 | 1565 |
1555 CallRuntimeWithOperands(Runtime::kDefineClass); | 1566 CallRuntimeWithOperands(Runtime::kDefineClass); |
1556 PrepareForBailoutForId(lit->CreateLiteralId(), BailoutState::TOS_REGISTER); | 1567 PrepareForBailoutForId(lit->CreateLiteralId(), BailoutState::TOS_REGISTER); |
1557 PushOperand(result_register()); | 1568 PushOperand(result_register()); |
1558 | 1569 |
1559 // Load the "prototype" from the constructor. | 1570 // Load the "prototype" from the constructor. |
1560 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); | 1571 __ Move(LoadDescriptor::ReceiverRegister(), result_register()); |
1561 __ LoadRoot(LoadDescriptor::NameRegister(), Heap::kprototype_stringRootIndex); | 1572 CallLoadIC(lit->PrototypeSlot(), isolate()->factory()->prototype_string()); |
1562 __ Move(LoadDescriptor::SlotRegister(), SmiFromSlot(lit->PrototypeSlot())); | |
1563 CallLoadIC(); | |
1564 PrepareForBailoutForId(lit->PrototypeId(), BailoutState::TOS_REGISTER); | 1573 PrepareForBailoutForId(lit->PrototypeId(), BailoutState::TOS_REGISTER); |
1565 PushOperand(result_register()); | 1574 PushOperand(result_register()); |
1566 | 1575 |
1567 EmitClassDefineProperties(lit); | 1576 EmitClassDefineProperties(lit); |
1568 DropOperands(1); | 1577 DropOperands(1); |
1569 | 1578 |
1570 // Set the constructor to have fast properties. | 1579 // Set the constructor to have fast properties. |
1571 CallRuntimeWithOperands(Runtime::kToFastProperties); | 1580 CallRuntimeWithOperands(Runtime::kToFastProperties); |
1572 | 1581 |
1573 if (lit->class_variable_proxy() != nullptr) { | 1582 if (lit->class_variable_proxy() != nullptr) { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2041 return info_->has_simple_parameters(); | 2050 return info_->has_simple_parameters(); |
2042 } | 2051 } |
2043 | 2052 |
2044 FunctionLiteral* FullCodeGenerator::literal() const { return info_->literal(); } | 2053 FunctionLiteral* FullCodeGenerator::literal() const { return info_->literal(); } |
2045 | 2054 |
2046 #undef __ | 2055 #undef __ |
2047 | 2056 |
2048 | 2057 |
2049 } // namespace internal | 2058 } // namespace internal |
2050 } // namespace v8 | 2059 } // namespace v8 |
OLD | NEW |