| 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(FeedbackVectorSlot slot, Handle<Object> name, | 226 void FullCodeGenerator::CallIC(Handle<Code> code, TypeFeedbackId ast_id) { |
| 227 TypeFeedbackId id) { | 227 ic_total_count_++; |
| 228 __ Call(code, RelocInfo::CODE_TARGET, ast_id); |
| 229 } |
| 230 |
| 231 void FullCodeGenerator::CallLoadIC(FeedbackVectorSlot slot, |
| 232 Handle<Object> name) { |
| 228 DCHECK(name->IsName()); | 233 DCHECK(name->IsName()); |
| 229 __ Move(LoadDescriptor::NameRegister(), name); | 234 __ Move(LoadDescriptor::NameRegister(), name); |
| 230 | 235 |
| 231 EmitLoadSlot(LoadDescriptor::SlotRegister(), slot); | 236 EmitLoadSlot(LoadDescriptor::SlotRegister(), slot); |
| 232 | 237 |
| 233 Handle<Code> ic = CodeFactory::LoadIC(isolate()).code(); | 238 Handle<Code> code = CodeFactory::LoadIC(isolate()).code(); |
| 234 CallIC(ic, id); | 239 __ Call(code, RelocInfo::CODE_TARGET); |
| 235 if (FLAG_tf_load_ic_stub) RestoreContext(); | 240 if (FLAG_tf_load_ic_stub) RestoreContext(); |
| 236 } | 241 } |
| 237 | 242 |
| 238 void FullCodeGenerator::CallStoreIC(FeedbackVectorSlot slot, | 243 void FullCodeGenerator::CallStoreIC(FeedbackVectorSlot slot, |
| 239 Handle<Object> name, TypeFeedbackId id) { | 244 Handle<Object> name) { |
| 240 DCHECK(name->IsName()); | 245 DCHECK(name->IsName()); |
| 241 __ Move(StoreDescriptor::NameRegister(), name); | 246 __ Move(StoreDescriptor::NameRegister(), name); |
| 242 | 247 |
| 243 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || | 248 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || |
| 244 StoreDescriptor::kStackArgumentsCount == 2); | 249 StoreDescriptor::kStackArgumentsCount == 2); |
| 245 if (StoreDescriptor::kPassLastArgsOnStack) { | 250 if (StoreDescriptor::kPassLastArgsOnStack) { |
| 246 __ Push(StoreDescriptor::ValueRegister()); | 251 __ Push(StoreDescriptor::ValueRegister()); |
| 247 EmitPushSlot(slot); | 252 EmitPushSlot(slot); |
| 248 } else { | 253 } else { |
| 249 EmitLoadSlot(StoreDescriptor::SlotRegister(), slot); | 254 EmitLoadSlot(StoreDescriptor::SlotRegister(), slot); |
| 250 } | 255 } |
| 251 | 256 |
| 252 Handle<Code> ic = CodeFactory::StoreIC(isolate(), language_mode()).code(); | 257 Handle<Code> code = CodeFactory::StoreIC(isolate(), language_mode()).code(); |
| 253 CallIC(ic, id); | 258 __ Call(code, RelocInfo::CODE_TARGET); |
| 254 RestoreContext(); | 259 RestoreContext(); |
| 255 } | 260 } |
| 256 | 261 |
| 257 void FullCodeGenerator::CallKeyedStoreIC(FeedbackVectorSlot slot) { | 262 void FullCodeGenerator::CallKeyedStoreIC(FeedbackVectorSlot slot) { |
| 258 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || | 263 STATIC_ASSERT(!StoreDescriptor::kPassLastArgsOnStack || |
| 259 StoreDescriptor::kStackArgumentsCount == 2); | 264 StoreDescriptor::kStackArgumentsCount == 2); |
| 260 if (StoreDescriptor::kPassLastArgsOnStack) { | 265 if (StoreDescriptor::kPassLastArgsOnStack) { |
| 261 __ Push(StoreDescriptor::ValueRegister()); | 266 __ Push(StoreDescriptor::ValueRegister()); |
| 262 EmitPushSlot(slot); | 267 EmitPushSlot(slot); |
| 263 } else { | 268 } else { |
| 264 EmitLoadSlot(StoreDescriptor::SlotRegister(), slot); | 269 EmitLoadSlot(StoreDescriptor::SlotRegister(), slot); |
| 265 } | 270 } |
| 266 | 271 |
| 267 Handle<Code> ic = | 272 Handle<Code> code = |
| 268 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); | 273 CodeFactory::KeyedStoreIC(isolate(), language_mode()).code(); |
| 269 CallIC(ic); | 274 __ Call(code, RelocInfo::CODE_TARGET); |
| 270 RestoreContext(); | 275 RestoreContext(); |
| 271 } | 276 } |
| 272 | 277 |
| 273 void FullCodeGenerator::RecordJSReturnSite(Call* call) { | 278 void FullCodeGenerator::RecordJSReturnSite(Call* call) { |
| 274 // We record the offset of the function return so we can rebuild the frame | 279 // We record the offset of the function return so we can rebuild the frame |
| 275 // if the function was inlined, i.e., this is the return address in the | 280 // if the function was inlined, i.e., this is the return address in the |
| 276 // inlined function's frame. | 281 // inlined function's frame. |
| 277 // | 282 // |
| 278 // The bailout state is ignored. We defensively set it to TOS_REGISTER, which | 283 // The bailout state is ignored. We defensively set it to TOS_REGISTER, which |
| 279 // is the real state of the unoptimized code at the return site. | 284 // is the real state of the unoptimized code at the return site. |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 | 501 |
| 497 void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy, | 502 void FullCodeGenerator::EmitGlobalVariableLoad(VariableProxy* proxy, |
| 498 TypeofMode typeof_mode) { | 503 TypeofMode typeof_mode) { |
| 499 #ifdef DEBUG | 504 #ifdef DEBUG |
| 500 Variable* var = proxy->var(); | 505 Variable* var = proxy->var(); |
| 501 DCHECK(var->IsUnallocated() || | 506 DCHECK(var->IsUnallocated() || |
| 502 (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL)); | 507 (var->IsLookupSlot() && var->mode() == DYNAMIC_GLOBAL)); |
| 503 #endif | 508 #endif |
| 504 EmitLoadSlot(LoadGlobalDescriptor::SlotRegister(), | 509 EmitLoadSlot(LoadGlobalDescriptor::SlotRegister(), |
| 505 proxy->VariableFeedbackSlot()); | 510 proxy->VariableFeedbackSlot()); |
| 506 Handle<Code> ic = CodeFactory::LoadGlobalIC(isolate(), typeof_mode).code(); | 511 Handle<Code> code = CodeFactory::LoadGlobalIC(isolate(), typeof_mode).code(); |
| 507 CallIC(ic); | 512 __ Call(code, RelocInfo::CODE_TARGET); |
| 508 } | 513 } |
| 509 | 514 |
| 510 void FullCodeGenerator::VisitSloppyBlockFunctionStatement( | 515 void FullCodeGenerator::VisitSloppyBlockFunctionStatement( |
| 511 SloppyBlockFunctionStatement* declaration) { | 516 SloppyBlockFunctionStatement* declaration) { |
| 512 Visit(declaration->statement()); | 517 Visit(declaration->statement()); |
| 513 } | 518 } |
| 514 | 519 |
| 515 | 520 |
| 516 int FullCodeGenerator::DeclareGlobalsFlags() { | 521 int FullCodeGenerator::DeclareGlobalsFlags() { |
| 517 return info_->GetDeclareGlobalsFlags(); | 522 return info_->GetDeclareGlobalsFlags(); |
| (...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1115 | 1120 |
| 1116 PushOperand(key->value()); | 1121 PushOperand(key->value()); |
| 1117 CallRuntimeWithOperands(Runtime::kLoadFromSuper); | 1122 CallRuntimeWithOperands(Runtime::kLoadFromSuper); |
| 1118 } | 1123 } |
| 1119 | 1124 |
| 1120 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { | 1125 void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) { |
| 1121 SetExpressionPosition(prop); | 1126 SetExpressionPosition(prop); |
| 1122 | 1127 |
| 1123 EmitLoadSlot(LoadDescriptor::SlotRegister(), prop->PropertyFeedbackSlot()); | 1128 EmitLoadSlot(LoadDescriptor::SlotRegister(), prop->PropertyFeedbackSlot()); |
| 1124 | 1129 |
| 1125 Handle<Code> ic = CodeFactory::KeyedLoadIC(isolate()).code(); | 1130 Handle<Code> code = CodeFactory::KeyedLoadIC(isolate()).code(); |
| 1126 CallIC(ic); | 1131 __ Call(code, RelocInfo::CODE_TARGET); |
| 1127 RestoreContext(); | 1132 RestoreContext(); |
| 1128 } | 1133 } |
| 1129 | 1134 |
| 1130 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { | 1135 void FullCodeGenerator::EmitKeyedSuperPropertyLoad(Property* prop) { |
| 1131 // Stack: receiver, home_object, key. | 1136 // Stack: receiver, home_object, key. |
| 1132 SetExpressionPosition(prop); | 1137 SetExpressionPosition(prop); |
| 1133 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper); | 1138 CallRuntimeWithOperands(Runtime::kLoadKeyedFromSuper); |
| 1134 } | 1139 } |
| 1135 | 1140 |
| 1136 void FullCodeGenerator::EmitPropertyKey(LiteralProperty* property, | 1141 void FullCodeGenerator::EmitPropertyKey(LiteralProperty* property, |
| (...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1988 return info_->has_simple_parameters(); | 1993 return info_->has_simple_parameters(); |
| 1989 } | 1994 } |
| 1990 | 1995 |
| 1991 FunctionLiteral* FullCodeGenerator::literal() const { return info_->literal(); } | 1996 FunctionLiteral* FullCodeGenerator::literal() const { return info_->literal(); } |
| 1992 | 1997 |
| 1993 #undef __ | 1998 #undef __ |
| 1994 | 1999 |
| 1995 | 2000 |
| 1996 } // namespace internal | 2001 } // namespace internal |
| 1997 } // namespace v8 | 2002 } // namespace v8 |
| OLD | NEW |