Index: src/compiler.h |
diff --git a/src/compiler.h b/src/compiler.h |
index d8eb3a68f408537ca200717c8bb5f5e83b5268cc..db7bc2eb94852fe4962cab4ada6ea318bbc22ce5 100644 |
--- a/src/compiler.h |
+++ b/src/compiler.h |
@@ -42,109 +42,81 @@ class ScriptDataImpl; |
// is constructed based on the resources available at compile-time. |
class CompilationInfo BASE_EMBEDDED { |
public: |
- virtual ~CompilationInfo() {} |
- |
- // Dispatched behavior. |
- virtual Handle<SharedFunctionInfo> shared_info() const = 0; |
- |
- virtual Handle<Script> script() const { |
- return Handle<Script>(Script::cast(shared_info()->script())); |
- } |
- |
- virtual Handle<JSFunction> closure() const { |
- return Handle<JSFunction>::null(); |
+ explicit CompilationInfo(Handle<Script> script); |
+ explicit CompilationInfo(Handle<SharedFunctionInfo> shared_info); |
+ explicit CompilationInfo(Handle<JSFunction> closure); |
+ |
+ bool is_lazy() const { return (flags_ & IsLazy::mask()) != 0; } |
+ bool is_eval() const { return (flags_ & IsEval::mask()) != 0; } |
+ bool is_global() const { return (flags_ & IsGlobal::mask()) != 0; } |
+ bool is_json() const { return (flags_ & IsJson::mask()) != 0; } |
+ bool is_in_loop() const { return (flags_ & IsInLoop::mask()) != 0; } |
+ FunctionLiteral* function() const { return function_; } |
+ Scope* scope() const { return function_->scope(); } |
+ Handle<JSFunction> closure() const { return closure_; } |
+ Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
+ Handle<Script> script() const { return script_; } |
+ v8::Extension* extension() const { return extension_; } |
+ ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; } |
+ |
+ void MarkAsEval() { |
+ ASSERT(!is_lazy()); |
+ flags_ |= IsEval::encode(true); |
} |
- |
- virtual bool is_eval() const { return false; } |
- |
- virtual int loop_nesting() const { return 0; } |
- |
- virtual bool has_global_object() const { return false; } |
- virtual GlobalObject* global_object() const { return NULL; } |
- |
- // There should always be a function literal, but it may be set after |
- // construction (for lazy compilation). |
- FunctionLiteral* function() { return function_; } |
- void set_function(FunctionLiteral* literal) { function_ = literal; } |
- |
- // Derived accessors. |
- Scope* scope() { return function()->scope(); } |
- |
- protected: |
- CompilationInfo() : function_(NULL) {} |
- |
- private: |
- FunctionLiteral* function_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
-}; |
- |
- |
-class EagerCompilationInfo: public CompilationInfo { |
- public: |
- EagerCompilationInfo(Handle<Script> script, bool is_eval) |
- : script_(script), is_eval_(is_eval) { |
- ASSERT(!script.is_null()); |
+ void MarkAsGlobal() { |
+ ASSERT(!is_lazy()); |
+ flags_ |= IsGlobal::encode(true); |
} |
- |
- // Overridden functions from the base class. |
- virtual Handle<SharedFunctionInfo> shared_info() const { |
- return Handle<SharedFunctionInfo>::null(); |
+ void MarkAsJson() { |
+ ASSERT(!is_lazy()); |
+ flags_ |= IsJson::encode(true); |
} |
- |
- virtual Handle<Script> script() const { return script_; } |
- |
- virtual bool is_eval() const { return is_eval_; } |
- |
- private: |
- Handle<Script> script_; |
- bool is_eval_; |
-}; |
- |
- |
-class LazySharedCompilationInfo: public CompilationInfo { |
- public: |
- explicit LazySharedCompilationInfo(Handle<SharedFunctionInfo> shared_info) |
- : shared_info_(shared_info) { |
- ASSERT(!shared_info.is_null()); |
+ void MarkAsInLoop() { |
+ ASSERT(is_lazy()); |
+ flags_ |= IsInLoop::encode(true); |
} |
- |
- // Overridden functions from the base class. |
- virtual Handle<SharedFunctionInfo> shared_info() const { |
- return shared_info_; |
+ void SetFunction(FunctionLiteral* literal) { |
+ ASSERT(function_ == NULL); |
+ function_ = literal; |
} |
- |
- private: |
- Handle<SharedFunctionInfo> shared_info_; |
-}; |
- |
- |
-class LazyFunctionCompilationInfo: public CompilationInfo { |
- public: |
- LazyFunctionCompilationInfo(Handle<JSFunction> closure, |
- int loop_nesting) |
- : closure_(closure), loop_nesting_(loop_nesting) { |
- ASSERT(!closure.is_null()); |
+ void SetExtension(v8::Extension* extension) { |
+ ASSERT(!is_lazy()); |
+ extension_ = extension; |
} |
- |
- // Overridden functions from the base class. |
- virtual Handle<SharedFunctionInfo> shared_info() const { |
- return Handle<SharedFunctionInfo>(closure_->shared()); |
+ void SetPreParseData(ScriptDataImpl* pre_parse_data) { |
+ ASSERT(!is_lazy()); |
+ pre_parse_data_ = pre_parse_data; |
} |
- virtual int loop_nesting() const { return loop_nesting_; } |
+ private: |
+ // Flags using template class BitField<type, start, length>. All are |
+ // false by default. |
+ // |
+ // Compilation is either eager or lazy. |
+ class IsLazy: public BitField<bool, 0, 1> {}; |
+ // Flags that can be set for eager compilation. |
+ class IsEval: public BitField<bool, 1, 1> {}; |
+ class IsGlobal: public BitField<bool, 2, 1> {}; |
+ class IsJson: public BitField<bool, 3, 1> {}; |
+ // Flags that can be set for lazy compilation. |
+ class IsInLoop: public BitField<bool, 4, 1> {}; |
+ |
+ unsigned flags_; |
+ |
+ // Fields filled in by the compilation pipeline. |
+ FunctionLiteral* function_; |
+ Scope* scope_; |
- virtual bool has_global_object() const { |
- return closure_->context()->global() != NULL; |
- } |
+ // Possible initial inputs to the compilation process. |
+ Handle<JSFunction> closure_; |
+ Handle<SharedFunctionInfo> shared_info_; |
+ Handle<Script> script_; |
- virtual GlobalObject* global_object() const { |
- return closure_->context()->global(); |
- } |
+ // Fields possibly needed for eager compilation, NULL by default. |
+ v8::Extension* extension_; |
+ ScriptDataImpl* pre_parse_data_; |
- private: |
- Handle<JSFunction> closure_; |
- int loop_nesting_; |
+ DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
}; |
@@ -161,7 +133,7 @@ class LazyFunctionCompilationInfo: public CompilationInfo { |
class Compiler : public AllStatic { |
public: |
- enum ValidationState { VALIDATE_JSON, DONT_VALIDATE_JSON }; |
+ enum ValidationState { DONT_VALIDATE_JSON, VALIDATE_JSON }; |
// All routines return a JSFunction. |
// If an error occurs an exception is raised and |