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 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 | 336 |
337 Zone* HBasicBlock::zone() { return graph_->zone(); } | 337 Zone* HBasicBlock::zone() { return graph_->zone(); } |
338 | 338 |
339 | 339 |
340 class HEnvironment: public ZoneObject { | 340 class HEnvironment: public ZoneObject { |
341 public: | 341 public: |
342 HEnvironment(HEnvironment* outer, | 342 HEnvironment(HEnvironment* outer, |
343 Scope* scope, | 343 Scope* scope, |
344 Handle<JSFunction> closure); | 344 Handle<JSFunction> closure); |
345 | 345 |
| 346 bool is_arguments_adaptor() const { |
| 347 return arguments_adaptor_; |
| 348 } |
| 349 |
| 350 HEnvironment* LeaveInlined(bool drop_extra) { |
| 351 HEnvironment* outer = outer_->is_arguments_adaptor() ? |
| 352 outer_->outer_ : outer_; |
| 353 if (drop_extra) outer->Drop(1); |
| 354 return outer; |
| 355 } |
| 356 |
346 // Simple accessors. | 357 // Simple accessors. |
347 Handle<JSFunction> closure() const { return closure_; } | 358 Handle<JSFunction> closure() const { return closure_; } |
348 const ZoneList<HValue*>* values() const { return &values_; } | 359 const ZoneList<HValue*>* values() const { return &values_; } |
349 const ZoneList<int>* assigned_variables() const { | 360 const ZoneList<int>* assigned_variables() const { |
350 return &assigned_variables_; | 361 return &assigned_variables_; |
351 } | 362 } |
352 int parameter_count() const { return parameter_count_; } | 363 int parameter_count() const { return parameter_count_; } |
353 int specials_count() const { return specials_count_; } | 364 int specials_count() const { return specials_count_; } |
354 int local_count() const { return local_count_; } | 365 int local_count() const { return local_count_; } |
355 HEnvironment* outer() const { return outer_; } | 366 HEnvironment* outer() const { return outer_; } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 void SetExpressionStackAt(int index_from_top, HValue* value); | 431 void SetExpressionStackAt(int index_from_top, HValue* value); |
421 | 432 |
422 HEnvironment* Copy() const; | 433 HEnvironment* Copy() const; |
423 HEnvironment* CopyWithoutHistory() const; | 434 HEnvironment* CopyWithoutHistory() const; |
424 HEnvironment* CopyAsLoopHeader(HBasicBlock* block) const; | 435 HEnvironment* CopyAsLoopHeader(HBasicBlock* block) const; |
425 | 436 |
426 // Create an "inlined version" of this environment, where the original | 437 // Create an "inlined version" of this environment, where the original |
427 // environment is the outer environment but the top expression stack | 438 // environment is the outer environment but the top expression stack |
428 // elements are moved to an inner environment as parameters. | 439 // elements are moved to an inner environment as parameters. |
429 HEnvironment* CopyForInlining(Handle<JSFunction> target, | 440 HEnvironment* CopyForInlining(Handle<JSFunction> target, |
| 441 int arguments, |
430 FunctionLiteral* function, | 442 FunctionLiteral* function, |
431 HConstant* undefined, | 443 HConstant* undefined, |
432 CallKind call_kind) const; | 444 CallKind call_kind) const; |
433 | 445 |
434 void AddIncomingEdge(HBasicBlock* block, HEnvironment* other); | 446 void AddIncomingEdge(HBasicBlock* block, HEnvironment* other); |
435 | 447 |
436 void ClearHistory() { | 448 void ClearHistory() { |
437 pop_count_ = 0; | 449 pop_count_ = 0; |
438 push_count_ = 0; | 450 push_count_ = 0; |
439 assigned_variables_.Rewind(0); | 451 assigned_variables_.Rewind(0); |
440 } | 452 } |
441 | 453 |
442 void SetValueAt(int index, HValue* value) { | 454 void SetValueAt(int index, HValue* value) { |
443 ASSERT(index < length()); | 455 ASSERT(index < length()); |
444 values_[index] = value; | 456 values_[index] = value; |
445 } | 457 } |
446 | 458 |
447 void PrintTo(StringStream* stream); | 459 void PrintTo(StringStream* stream); |
448 void PrintToStd(); | 460 void PrintToStd(); |
449 | 461 |
450 private: | 462 private: |
451 explicit HEnvironment(const HEnvironment* other); | 463 explicit HEnvironment(const HEnvironment* other); |
452 | 464 |
| 465 // Create an argument adaptor environment. |
| 466 HEnvironment(HEnvironment* outer, Handle<JSFunction> closure, int arguments); |
| 467 |
| 468 |
453 // True if index is included in the expression stack part of the environment. | 469 // True if index is included in the expression stack part of the environment. |
454 bool HasExpressionAt(int index) const; | 470 bool HasExpressionAt(int index) const; |
455 | 471 |
456 void Initialize(int parameter_count, int local_count, int stack_height); | 472 void Initialize(int parameter_count, int local_count, int stack_height); |
457 void Initialize(const HEnvironment* other); | 473 void Initialize(const HEnvironment* other); |
458 | 474 |
459 // Map a variable to an environment index. Parameter indices are shifted | 475 // Map a variable to an environment index. Parameter indices are shifted |
460 // by 1 (receiver is parameter index -1 but environment index 0). | 476 // by 1 (receiver is parameter index -1 but environment index 0). |
461 // Stack-allocated local indices are shifted by the number of parameters. | 477 // Stack-allocated local indices are shifted by the number of parameters. |
462 int IndexFor(Variable* variable) const { | 478 int IndexFor(Variable* variable) const { |
463 ASSERT(variable->IsStackAllocated()); | 479 ASSERT(variable->IsStackAllocated()); |
464 int shift = variable->IsParameter() | 480 int shift = variable->IsParameter() |
465 ? 1 | 481 ? 1 |
466 : parameter_count_ + specials_count_; | 482 : parameter_count_ + specials_count_; |
467 return variable->index() + shift; | 483 return variable->index() + shift; |
468 } | 484 } |
469 | 485 |
470 Handle<JSFunction> closure_; | 486 Handle<JSFunction> closure_; |
471 // Value array [parameters] [specials] [locals] [temporaries]. | 487 // Value array [parameters] [specials] [locals] [temporaries]. |
472 ZoneList<HValue*> values_; | 488 ZoneList<HValue*> values_; |
473 ZoneList<int> assigned_variables_; | 489 ZoneList<int> assigned_variables_; |
474 int parameter_count_; | 490 int parameter_count_; |
475 int specials_count_; | 491 int specials_count_; |
476 int local_count_; | 492 int local_count_; |
477 HEnvironment* outer_; | 493 HEnvironment* outer_; |
478 int pop_count_; | 494 int pop_count_; |
479 int push_count_; | 495 int push_count_; |
480 int ast_id_; | 496 int ast_id_; |
| 497 bool arguments_adaptor_; |
481 }; | 498 }; |
482 | 499 |
483 | 500 |
484 class HGraphBuilder; | 501 class HGraphBuilder; |
485 | 502 |
486 enum ArgumentsAllowedFlag { | 503 enum ArgumentsAllowedFlag { |
487 ARGUMENTS_NOT_ALLOWED, | 504 ARGUMENTS_NOT_ALLOWED, |
488 ARGUMENTS_ALLOWED | 505 ARGUMENTS_ALLOWED |
489 }; | 506 }; |
490 | 507 |
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1251 const char* filename_; | 1268 const char* filename_; |
1252 HeapStringAllocator string_allocator_; | 1269 HeapStringAllocator string_allocator_; |
1253 StringStream trace_; | 1270 StringStream trace_; |
1254 int indent_; | 1271 int indent_; |
1255 }; | 1272 }; |
1256 | 1273 |
1257 | 1274 |
1258 } } // namespace v8::internal | 1275 } } // namespace v8::internal |
1259 | 1276 |
1260 #endif // V8_HYDROGEN_H_ | 1277 #endif // V8_HYDROGEN_H_ |
OLD | NEW |