| Index: src/full-codegen.h
|
| diff --git a/src/full-codegen.h b/src/full-codegen.h
|
| index 5b9698a7cc918eac8bb5bf66cfc2eeda76e55089..af63aedfbff2e4e6dafc0485b37191d8862a6104 100644
|
| --- a/src/full-codegen.h
|
| +++ b/src/full-codegen.h
|
| @@ -31,11 +31,14 @@
|
| #include "v8.h"
|
|
|
| #include "allocation.h"
|
| +#include "assert-scope.h"
|
| #include "ast.h"
|
| #include "code-stubs.h"
|
| #include "codegen.h"
|
| #include "compiler.h"
|
| #include "data-flow.h"
|
| +#include "globals.h"
|
| +#include "objects.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -136,7 +139,64 @@ class FullCodeGenerator: public AstVisitor {
|
| #error Unsupported target architecture.
|
| #endif
|
|
|
| - static const int kBackEdgeEntrySize = 3 * kIntSize;
|
| + class BackEdgeTableIterator {
|
| + public:
|
| + explicit BackEdgeTableIterator(Code* unoptimized) {
|
| + ASSERT(unoptimized->kind() == Code::FUNCTION);
|
| + instruction_start_ = unoptimized->instruction_start();
|
| + cursor_ = instruction_start_ + unoptimized->back_edge_table_offset();
|
| + ASSERT(cursor_ < instruction_start_ + unoptimized->instruction_size());
|
| + table_length_ = Memory::uint32_at(cursor_);
|
| + cursor_ += kTableLengthSize;
|
| + end_ = cursor_ + table_length_ * kEntrySize;
|
| + }
|
| +
|
| + bool Done() { return cursor_ >= end_; }
|
| +
|
| + void Next() {
|
| + ASSERT(!Done());
|
| + cursor_ += kEntrySize;
|
| + }
|
| +
|
| + BailoutId ast_id() {
|
| + ASSERT(!Done());
|
| + return BailoutId(static_cast<int>(
|
| + Memory::uint32_at(cursor_ + kAstIdOffset)));
|
| + }
|
| +
|
| + uint32_t loop_depth() {
|
| + ASSERT(!Done());
|
| + return Memory::uint32_at(cursor_ + kLoopDepthOffset);
|
| + }
|
| +
|
| + uint32_t pc_offset() {
|
| + ASSERT(!Done());
|
| + return Memory::uint32_at(cursor_ + kPcOffsetOffset);
|
| + }
|
| +
|
| + Address pc() {
|
| + ASSERT(!Done());
|
| + return instruction_start_ + pc_offset();
|
| + }
|
| +
|
| + uint32_t table_length() { return table_length_; }
|
| +
|
| + private:
|
| + static const int kTableLengthSize = kIntSize;
|
| + static const int kAstIdOffset = 0 * kIntSize;
|
| + static const int kPcOffsetOffset = 1 * kIntSize;
|
| + static const int kLoopDepthOffset = 2 * kIntSize;
|
| + static const int kEntrySize = 3 * kIntSize;
|
| +
|
| + Address cursor_;
|
| + Address end_;
|
| + Address instruction_start_;
|
| + uint32_t table_length_;
|
| + DisallowHeapAllocation no_gc_while_iterating_over_raw_addresses_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(BackEdgeTableIterator);
|
| + };
|
| +
|
|
|
| private:
|
| class Breakable;
|
|
|