diff options
Diffstat (limited to 'deps/v8/src/compiler.h')
-rw-r--r-- | deps/v8/src/compiler.h | 94 |
1 files changed, 54 insertions, 40 deletions
diff --git a/deps/v8/src/compiler.h b/deps/v8/src/compiler.h index 3bf4db5780..3802016883 100644 --- a/deps/v8/src/compiler.h +++ b/deps/v8/src/compiler.h @@ -45,6 +45,12 @@ enum ParseRestriction { ONLY_SINGLE_FUNCTION_LITERAL // Only a single FunctionLiteral expression. }; +enum CachedDataMode { + NO_CACHED_DATA, + CONSUME_CACHED_DATA, + PRODUCE_CACHED_DATA +}; + struct OffsetRange { OffsetRange(int from, int to) : from(from), to(to) {} int from; @@ -66,11 +72,7 @@ class CompilationInfo { bool is_lazy() const { return IsLazy::decode(flags_); } bool is_eval() const { return IsEval::decode(flags_); } bool is_global() const { return IsGlobal::decode(flags_); } - bool is_classic_mode() const { return language_mode() == CLASSIC_MODE; } - bool is_extended_mode() const { return language_mode() == EXTENDED_MODE; } - LanguageMode language_mode() const { - return LanguageModeField::decode(flags_); - } + StrictMode strict_mode() const { return StrictModeField::decode(flags_); } bool is_in_loop() const { return IsInLoop::decode(flags_); } FunctionLiteral* function() const { return function_; } Scope* scope() const { return scope_; } @@ -81,7 +83,10 @@ class CompilationInfo { Handle<Script> script() const { return script_; } HydrogenCodeStub* code_stub() const {return code_stub_; } v8::Extension* extension() const { return extension_; } - ScriptDataImpl* pre_parse_data() const { return pre_parse_data_; } + ScriptDataImpl** cached_data() const { return cached_data_; } + CachedDataMode cached_data_mode() const { + return cached_data_mode_; + } Handle<Context> context() const { return context_; } BailoutId osr_ast_id() const { return osr_ast_id_; } Handle<Code> unoptimized_code() const { return unoptimized_code_; } @@ -109,11 +114,9 @@ class CompilationInfo { bool this_has_uses() { return this_has_uses_; } - void SetLanguageMode(LanguageMode language_mode) { - ASSERT(this->language_mode() == CLASSIC_MODE || - this->language_mode() == language_mode || - language_mode == EXTENDED_MODE); - flags_ = LanguageModeField::update(flags_, language_mode); + void SetStrictMode(StrictMode strict_mode) { + ASSERT(this->strict_mode() == SLOPPY || this->strict_mode() == strict_mode); + flags_ = StrictModeField::update(flags_, strict_mode); } void MarkAsInLoop() { ASSERT(is_lazy()); @@ -175,10 +178,8 @@ class CompilationInfo { ASSERT(function_ == NULL); function_ = literal; } - void SetScope(Scope* scope) { - ASSERT(scope_ == NULL); - scope_ = scope; - } + // When the scope is applied, we may have deferred work to do on the function. + void PrepareForCompilation(Scope* scope); void SetGlobalScope(Scope* global_scope) { ASSERT(global_scope_ == NULL); global_scope_ = global_scope; @@ -188,9 +189,15 @@ class CompilationInfo { ASSERT(!is_lazy()); extension_ = extension; } - void SetPreParseData(ScriptDataImpl* pre_parse_data) { - ASSERT(!is_lazy()); - pre_parse_data_ = pre_parse_data; + void SetCachedData(ScriptDataImpl** cached_data, + CachedDataMode cached_data_mode) { + cached_data_mode_ = cached_data_mode; + if (cached_data_mode == NO_CACHED_DATA) { + cached_data_ = NULL; + } else { + ASSERT(!is_lazy()); + cached_data_ = cached_data; + } } void SetContext(Handle<Context> context) { context_ = context; @@ -229,6 +236,7 @@ class CompilationInfo { SetMode(OPTIMIZE); osr_ast_id_ = osr_ast_id; unoptimized_code_ = unoptimized; + optimization_id_ = isolate()->NextOptimizationId(); } void DisableOptimization(); @@ -317,6 +325,8 @@ class CompilationInfo { return osr_ast_id_ == osr_ast_id && function.is_identical_to(closure_); } + int optimization_id() const { return optimization_id_; } + protected: CompilationInfo(Handle<Script> script, Zone* zone); @@ -359,26 +369,26 @@ class CompilationInfo { // Flags that can be set for lazy compilation. class IsInLoop: public BitField<bool, 3, 1> {}; // Strict mode - used in eager compilation. - class LanguageModeField: public BitField<LanguageMode, 4, 2> {}; + class StrictModeField: public BitField<StrictMode, 4, 1> {}; // Is this a function from our natives. - class IsNative: public BitField<bool, 6, 1> {}; + class IsNative: public BitField<bool, 5, 1> {}; // Is this code being compiled with support for deoptimization.. - class SupportsDeoptimization: public BitField<bool, 7, 1> {}; + class SupportsDeoptimization: public BitField<bool, 6, 1> {}; // If compiling for debugging produce just full code matching the // initial mode setting. - class IsCompilingForDebugging: public BitField<bool, 8, 1> {}; + class IsCompilingForDebugging: public BitField<bool, 7, 1> {}; // If the compiled code contains calls that require building a frame - class IsCalling: public BitField<bool, 9, 1> {}; + class IsCalling: public BitField<bool, 8, 1> {}; // If the compiled code contains calls that require building a frame - class IsDeferredCalling: public BitField<bool, 10, 1> {}; + class IsDeferredCalling: public BitField<bool, 9, 1> {}; // If the compiled code contains calls that require building a frame - class IsNonDeferredCalling: public BitField<bool, 11, 1> {}; + class IsNonDeferredCalling: public BitField<bool, 10, 1> {}; // If the compiled code saves double caller registers that it clobbers. - class SavesCallerDoubles: public BitField<bool, 12, 1> {}; + class SavesCallerDoubles: public BitField<bool, 11, 1> {}; // If the set of valid statements is restricted. - class ParseRestricitonField: public BitField<ParseRestriction, 13, 1> {}; + class ParseRestricitonField: public BitField<ParseRestriction, 12, 1> {}; // If the function requires a frame (for unspecified reasons) - class RequiresFrame: public BitField<bool, 14, 1> {}; + class RequiresFrame: public BitField<bool, 13, 1> {}; unsigned flags_; @@ -402,7 +412,8 @@ class CompilationInfo { // Fields possibly needed for eager compilation, NULL by default. v8::Extension* extension_; - ScriptDataImpl* pre_parse_data_; + ScriptDataImpl** cached_data_; + CachedDataMode cached_data_mode_; // The context of the caller for eval code, and the global context for a // global script. Will be a null handle otherwise. @@ -452,6 +463,8 @@ class CompilationInfo { Handle<Foreign> object_wrapper_; + int optimization_id_; + DISALLOW_COPY_AND_ASSIGN(CompilationInfo); }; @@ -615,21 +628,22 @@ class Compiler : public AllStatic { // Compile a String source within a context for eval. static Handle<JSFunction> GetFunctionFromEval(Handle<String> source, Handle<Context> context, - LanguageMode language_mode, + StrictMode strict_mode, ParseRestriction restriction, int scope_position); // Compile a String source within a context. - static Handle<SharedFunctionInfo> CompileScript(Handle<String> source, - Handle<Object> script_name, - int line_offset, - int column_offset, - bool is_shared_cross_origin, - Handle<Context> context, - v8::Extension* extension, - ScriptDataImpl* pre_data, - Handle<Object> script_data, - NativesFlag is_natives_code); + static Handle<SharedFunctionInfo> CompileScript( + Handle<String> source, + Handle<Object> script_name, + int line_offset, + int column_offset, + bool is_shared_cross_origin, + Handle<Context> context, + v8::Extension* extension, + ScriptDataImpl** cached_data, + CachedDataMode cached_data_mode, + NativesFlag is_natives_code); // Create a shared function info object (the code may be lazily compiled). static Handle<SharedFunctionInfo> BuildFunctionInfo(FunctionLiteral* node, |