Chromium Code Reviews| Index: src/compiler.h |
| diff --git a/src/compiler.h b/src/compiler.h |
| index 6ee2246b298d5ed60227348cbba461fee52897a0..f01889d0a13856dfa7a35d445ded0f7158c855a3 100644 |
| --- a/src/compiler.h |
| +++ b/src/compiler.h |
| @@ -41,6 +41,37 @@ namespace internal { |
| // is constructed based on the resources available at compile-time. |
| class CompilationInfo BASE_EMBEDDED { |
| public: |
| + // Compilation mode. Either the compiler is used as the primary |
| + // compiler and needs to setup everything or the compiler is used as |
| + // the secondary compiler for split compilation and has to handle |
| + // bailouts. |
| + enum Mode { |
| + PRIMARY, |
| + SECONDARY |
| + }; |
| + |
| + // A description of the compilation state at a bailout to the secondary |
| + // code generator. |
| + // |
| + // The state is currently simple: there are no parameters or local |
| + // variables to worry about ('this' can be found in the stack frame). |
| + // There are at most two live values. |
| + // |
| + // There is a label that should be bound to the beginning of the bailout |
| + // stub code. |
| + class Bailout : public ZoneObject { |
| + public: |
| + Bailout(Register left, Register right) : left_(left), right_(right) {} |
|
fschneider
2010/02/19 14:47:14
label_ needs to be initialized here.
|
| + |
| + Label* label() { return &label_; } |
| + |
| + private: |
| + Register left_; |
| + Register right_; |
| + Label label_; |
| + }; |
| + |
| + |
| // Lazy compilation of a JSFunction. |
| CompilationInfo(Handle<JSFunction> closure, |
| int loop_nesting, |
| @@ -117,9 +148,13 @@ class CompilationInfo BASE_EMBEDDED { |
| int loop_nesting() { return loop_nesting_; } |
| bool has_receiver() { return !receiver_.is_null(); } |
| Handle<Object> receiver() { return receiver_; } |
| + List<Bailout*>* bailouts() { return &bailouts_; } |
| - // Accessors for mutable fields, possibly set by analysis passes with |
| + // Accessors for mutable fields (possibly set by analysis passes) with |
| // default values given by Initialize. |
| + Mode mode() { return mode_; } |
| + void set_mode(Mode mode) { mode_ = mode; } |
| + |
| bool has_this_properties() { return has_this_properties_; } |
| void set_has_this_properties(bool flag) { has_this_properties_ = flag; } |
| @@ -137,8 +172,19 @@ class CompilationInfo BASE_EMBEDDED { |
| // Derived accessors. |
| Scope* scope() { return function()->scope(); } |
| + // Add a bailout with two live values. |
| + Label* AddBailout(Register left, Register right) { |
| + Bailout* bailout = new Bailout(left, right); |
| + bailouts_.Add(bailout); |
| + return bailout->label(); |
| + } |
| + |
| + // Add a bailout with no live values. |
| + Label* AddBailout() { return AddBailout(no_reg, no_reg); } |
| + |
| private: |
| void Initialize() { |
| + mode_ = PRIMARY; |
| has_this_properties_ = false; |
| has_globals_ = false; |
| } |
| @@ -148,6 +194,7 @@ class CompilationInfo BASE_EMBEDDED { |
| Handle<Script> script_; |
| FunctionLiteral* function_; |
| + Mode mode_; |
| bool is_eval_; |
| int loop_nesting_; |
| @@ -157,6 +204,10 @@ class CompilationInfo BASE_EMBEDDED { |
| bool has_this_properties_; |
| bool has_globals_; |
| + // An ordered list of bailout points encountered during fast-path |
| + // compilation. |
| + List<Bailout*> bailouts_; |
| + |
| DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
| }; |