| // Copyright 2014 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_AST_AST_NUMBERING_H_ |
| #define V8_AST_AST_NUMBERING_H_ |
| |
| #include <stdint.h> |
| |
| namespace v8 { |
| namespace internal { |
| |
| // Forward declarations. |
| class FunctionLiteral; |
| class Isolate; |
| class Zone; |
| template <typename T> |
| class ThreadedList; |
| template <typename T> |
| class ThreadedListZoneEntry; |
| template <typename T> |
| class ZoneVector; |
| |
| namespace AstNumbering { |
| // Assign bailout IDs, and generator suspend IDs to an AST node tree; perform |
| // catch prediction for TryStatements. If |eager_literals| is non-null, adds any |
| // eager inner literal functions into it. |
| bool Renumber( |
| uintptr_t stack_limit, Zone* zone, FunctionLiteral* function, |
| ThreadedList<ThreadedListZoneEntry<FunctionLiteral*>>* eager_literals); |
| } |
| |
| // Some details on suspend IDs |
| // ------------------------- |
| // |
| // In order to assist Ignition in generating bytecode for a generator function, |
| // we assign a unique number (the suspend ID) to each Suspend node in its AST. |
| // We also annotate loops with the number of suspends they contain |
| // (loop.suspend_count) and the smallest ID of those (loop.first_suspend_id), |
| // and we annotate the function itself with the number of suspends it contains |
| // (function.suspend_count). |
| // |
| // The way in which we choose the IDs is simply by enumerating the Suspend |
| // nodes. |
| // Ignition relies on the following properties: |
| // - For each loop l and each suspend y of l: |
| // l.first_suspend_id <= |
| // s.suspend_id < l.first_suspend_id + l.suspend_count |
| // - For the generator function f itself and each suspend s of f: |
| // 0 <= s.suspend_id < f.suspend_count |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_AST_AST_NUMBERING_H_ |