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

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 22590002: Fix bug with optimized try-catch on ARM/MIPS. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: added cleanup of CatchEntry Created 7 years, 4 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
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define VM_INTERMEDIATE_LANGUAGE_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 M(LoadField) \ 570 M(LoadField) \
571 M(StoreVMField) \ 571 M(StoreVMField) \
572 M(LoadUntagged) \ 572 M(LoadUntagged) \
573 M(LoadClassId) \ 573 M(LoadClassId) \
574 M(InstantiateType) \ 574 M(InstantiateType) \
575 M(InstantiateTypeArguments) \ 575 M(InstantiateTypeArguments) \
576 M(ExtractConstructorTypeArguments) \ 576 M(ExtractConstructorTypeArguments) \
577 M(ExtractConstructorInstantiator) \ 577 M(ExtractConstructorInstantiator) \
578 M(AllocateContext) \ 578 M(AllocateContext) \
579 M(CloneContext) \ 579 M(CloneContext) \
580 M(CatchEntry) \
581 M(BinarySmiOp) \ 580 M(BinarySmiOp) \
582 M(UnarySmiOp) \ 581 M(UnarySmiOp) \
583 M(CheckStackOverflow) \ 582 M(CheckStackOverflow) \
584 M(SmiToDouble) \ 583 M(SmiToDouble) \
585 M(DoubleToInteger) \ 584 M(DoubleToInteger) \
586 M(DoubleToSmi) \ 585 M(DoubleToSmi) \
587 M(DoubleToDouble) \ 586 M(DoubleToDouble) \
588 M(CheckClass) \ 587 M(CheckClass) \
589 M(CheckSmi) \ 588 M(CheckSmi) \
590 M(Constant) \ 589 M(Constant) \
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 1481
1483 DISALLOW_COPY_AND_ASSIGN(TargetEntryInstr); 1482 DISALLOW_COPY_AND_ASSIGN(TargetEntryInstr);
1484 }; 1483 };
1485 1484
1486 1485
1487 class CatchBlockEntryInstr : public BlockEntryInstr { 1486 class CatchBlockEntryInstr : public BlockEntryInstr {
1488 public: 1487 public:
1489 CatchBlockEntryInstr(intptr_t block_id, 1488 CatchBlockEntryInstr(intptr_t block_id,
1490 intptr_t try_index, 1489 intptr_t try_index,
1491 const Array& handler_types, 1490 const Array& handler_types,
1492 intptr_t catch_try_index) 1491 intptr_t catch_try_index,
1492 const LocalVariable& exception_var,
1493 const LocalVariable& stacktrace_var)
1493 : BlockEntryInstr(block_id, try_index), 1494 : BlockEntryInstr(block_id, try_index),
1494 predecessor_(NULL), 1495 predecessor_(NULL),
1495 catch_handler_types_(Array::ZoneHandle(handler_types.raw())), 1496 catch_handler_types_(Array::ZoneHandle(handler_types.raw())),
1496 catch_try_index_(catch_try_index) { } 1497 catch_try_index_(catch_try_index),
1498 exception_var_(exception_var),
1499 stacktrace_var_(stacktrace_var) { }
1497 1500
1498 DECLARE_INSTRUCTION(CatchBlockEntry) 1501 DECLARE_INSTRUCTION(CatchBlockEntry)
1499 1502
1500 virtual intptr_t PredecessorCount() const { 1503 virtual intptr_t PredecessorCount() const {
1501 return (predecessor_ == NULL) ? 0 : 1; 1504 return (predecessor_ == NULL) ? 0 : 1;
1502 } 1505 }
1503 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const { 1506 virtual BlockEntryInstr* PredecessorAt(intptr_t index) const {
1504 ASSERT((index == 0) && (predecessor_ != NULL)); 1507 ASSERT((index == 0) && (predecessor_ != NULL));
1505 return predecessor_; 1508 return predecessor_;
1506 } 1509 }
1507 1510
1511 const LocalVariable& exception_var() const { return exception_var_; }
1512 const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
1513
1508 // Returns try index for the try block to which this catch handler 1514 // Returns try index for the try block to which this catch handler
1509 // corresponds. 1515 // corresponds.
1510 intptr_t catch_try_index() const { 1516 intptr_t catch_try_index() const {
1511 return catch_try_index_; 1517 return catch_try_index_;
1512 } 1518 }
1513 GrowableArray<Definition*>* initial_definitions() { 1519 GrowableArray<Definition*>* initial_definitions() {
1514 return &initial_definitions_; 1520 return &initial_definitions_;
1515 } 1521 }
1516 1522
1517 virtual void PrintTo(BufferFormatter* f) const; 1523 virtual void PrintTo(BufferFormatter* f) const;
1518 1524
1519 private: 1525 private:
1520 friend class BlockEntryInstr; // Access to predecessor_ when inlining. 1526 friend class BlockEntryInstr; // Access to predecessor_ when inlining.
1521 1527
1522 virtual void ClearPredecessors() { predecessor_ = NULL; } 1528 virtual void ClearPredecessors() { predecessor_ = NULL; }
1523 virtual void AddPredecessor(BlockEntryInstr* predecessor) { 1529 virtual void AddPredecessor(BlockEntryInstr* predecessor) {
1524 ASSERT(predecessor_ == NULL); 1530 ASSERT(predecessor_ == NULL);
1525 predecessor_ = predecessor; 1531 predecessor_ = predecessor;
1526 } 1532 }
1527 1533
1528 BlockEntryInstr* predecessor_; 1534 BlockEntryInstr* predecessor_;
1529 const Array& catch_handler_types_; 1535 const Array& catch_handler_types_;
1530 const intptr_t catch_try_index_; 1536 const intptr_t catch_try_index_;
1531 GrowableArray<Definition*> initial_definitions_; 1537 GrowableArray<Definition*> initial_definitions_;
1538 const LocalVariable& exception_var_;
1539 const LocalVariable& stacktrace_var_;
1532 1540
1533 DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr); 1541 DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr);
1534 }; 1542 };
1535 1543
1536 1544
1537 // Abstract super-class of all instructions that define a value (Bind, Phi). 1545 // Abstract super-class of all instructions that define a value (Bind, Phi).
1538 class Definition : public Instruction { 1546 class Definition : public Instruction {
1539 public: 1547 public:
1540 enum UseKind { kEffect, kValue }; 1548 enum UseKind { kEffect, kValue };
1541 1549
(...skipping 2746 matching lines...) Expand 10 before | Expand all | Expand 10 after
4288 4296
4289 virtual bool MayThrow() const { return false; } 4297 virtual bool MayThrow() const { return false; }
4290 4298
4291 private: 4299 private:
4292 const intptr_t token_pos_; 4300 const intptr_t token_pos_;
4293 4301
4294 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr); 4302 DISALLOW_COPY_AND_ASSIGN(CloneContextInstr);
4295 }; 4303 };
4296 4304
4297 4305
4298 class CatchEntryInstr : public TemplateInstruction<0> {
4299 public:
4300 CatchEntryInstr(const LocalVariable& exception_var,
4301 const LocalVariable& stacktrace_var)
4302 : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {}
4303
4304 const LocalVariable& exception_var() const { return exception_var_; }
4305 const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
4306
4307 DECLARE_INSTRUCTION(CatchEntry)
4308
4309 virtual intptr_t ArgumentCount() const { return 0; }
4310
4311 virtual void PrintOperandsTo(BufferFormatter* f) const;
4312
4313 virtual bool CanDeoptimize() const { return false; }
4314
4315 virtual EffectSet Effects() const { return EffectSet::All(); }
4316
4317 virtual bool MayThrow() const { return false; }
4318
4319 private:
4320 const LocalVariable& exception_var_;
4321 const LocalVariable& stacktrace_var_;
4322
4323 DISALLOW_COPY_AND_ASSIGN(CatchEntryInstr);
4324 };
4325
4326
4327 class CheckEitherNonSmiInstr : public TemplateInstruction<2> { 4306 class CheckEitherNonSmiInstr : public TemplateInstruction<2> {
4328 public: 4307 public:
4329 CheckEitherNonSmiInstr(Value* left, 4308 CheckEitherNonSmiInstr(Value* left,
4330 Value* right, 4309 Value* right,
4331 intptr_t deopt_id) { 4310 intptr_t deopt_id) {
4332 SetInputAt(0, left); 4311 SetInputAt(0, left);
4333 SetInputAt(1, right); 4312 SetInputAt(1, right);
4334 // Override generated deopt-id. 4313 // Override generated deopt-id.
4335 deopt_id_ = deopt_id; 4314 deopt_id_ = deopt_id;
4336 } 4315 }
(...skipping 2305 matching lines...) Expand 10 before | Expand all | Expand 10 after
6642 ForwardInstructionIterator* current_iterator_; 6621 ForwardInstructionIterator* current_iterator_;
6643 6622
6644 private: 6623 private:
6645 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 6624 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
6646 }; 6625 };
6647 6626
6648 6627
6649 } // namespace dart 6628 } // namespace dart
6650 6629
6651 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 6630 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698