| Index: src/compiler.cc
|
| diff --git a/src/compiler.cc b/src/compiler.cc
|
| index 4f0ddd997694faef7b3cf689a1c577f3daa88bed..29df079d35fc9ad64cdc54dcfcda88b4f9762ade 100644
|
| --- a/src/compiler.cc
|
| +++ b/src/compiler.cc
|
| @@ -74,6 +74,28 @@ PARSE_INFO_GETTER(Handle<SharedFunctionInfo>, shared_info)
|
| #undef PARSE_INFO_GETTER_WITH_DEFAULT
|
|
|
|
|
| +// Exactly like a CompilationInfo, except being allocated via {new} and it also
|
| +// creates and enters a Zone on construction and deallocates it on destruction.
|
| +class CompilationInfoWithZone : public CompilationInfo {
|
| + public:
|
| + explicit CompilationInfoWithZone(Handle<JSFunction> function)
|
| + : CompilationInfo(new ParseInfo(&zone_, function)) {}
|
| +
|
| + // Virtual destructor because a CompilationInfoWithZone has to exit the
|
| + // zone scope and get rid of dependent maps even when the destructor is
|
| + // called when cast as a CompilationInfo.
|
| + virtual ~CompilationInfoWithZone() {
|
| + DisableFutureOptimization();
|
| + RollbackDependencies();
|
| + delete parse_info_;
|
| + parse_info_ = nullptr;
|
| + }
|
| +
|
| + private:
|
| + Zone zone_;
|
| +};
|
| +
|
| +
|
| bool CompilationInfo::has_shared_info() const {
|
| return parse_info_ && !parse_info_->shared_info().is_null();
|
| }
|
| @@ -1007,7 +1029,9 @@ MaybeHandle<Code> Compiler::GetDebugCode(Handle<JSFunction> function) {
|
|
|
| void Compiler::CompileForLiveEdit(Handle<Script> script) {
|
| // TODO(635): support extensions.
|
| - CompilationInfoWithZone info(script);
|
| + Zone zone;
|
| + ParseInfo parse_info(&zone, script);
|
| + CompilationInfo info(&parse_info);
|
| PostponeInterruptsScope postpone(info.isolate());
|
| VMState<COMPILER> state(info.isolate());
|
|
|
| @@ -1145,13 +1169,14 @@ MaybeHandle<JSFunction> Compiler::GetFunctionFromEval(
|
|
|
| if (!maybe_shared_info.ToHandle(&shared_info)) {
|
| Handle<Script> script = isolate->factory()->NewScript(source);
|
| - CompilationInfoWithZone info(script);
|
| - ParseInfo* parse_info = info.parse_info();
|
| - parse_info->set_eval();
|
| - if (context->IsNativeContext()) parse_info->set_global();
|
| - parse_info->set_language_mode(language_mode);
|
| - parse_info->set_parse_restriction(restriction);
|
| - parse_info->set_context(context);
|
| + Zone zone;
|
| + ParseInfo parse_info(&zone, script);
|
| + CompilationInfo info(&parse_info);
|
| + parse_info.set_eval();
|
| + if (context->IsNativeContext()) parse_info.set_global();
|
| + parse_info.set_language_mode(language_mode);
|
| + parse_info.set_parse_restriction(restriction);
|
| + parse_info.set_context(context);
|
|
|
| Debug::RecordEvalCaller(script);
|
|
|
| @@ -1268,25 +1293,26 @@ Handle<SharedFunctionInfo> Compiler::CompileScript(
|
| }
|
|
|
| // Compile the function and add it to the cache.
|
| - CompilationInfoWithZone info(script);
|
| - ParseInfo* parse_info = info.parse_info();
|
| + Zone zone;
|
| + ParseInfo parse_info(&zone, script);
|
| + CompilationInfo info(&parse_info);
|
| if (FLAG_harmony_modules && is_module) {
|
| - parse_info->set_module();
|
| + parse_info.set_module();
|
| } else {
|
| - parse_info->set_global();
|
| + parse_info.set_global();
|
| }
|
| if (compile_options != ScriptCompiler::kNoCompileOptions) {
|
| - parse_info->set_cached_data(cached_data);
|
| + parse_info.set_cached_data(cached_data);
|
| }
|
| - parse_info->set_compile_options(compile_options);
|
| - parse_info->set_extension(extension);
|
| - parse_info->set_context(context);
|
| + parse_info.set_compile_options(compile_options);
|
| + parse_info.set_extension(extension);
|
| + parse_info.set_context(context);
|
| if (FLAG_serialize_toplevel &&
|
| compile_options == ScriptCompiler::kProduceCodeCache) {
|
| info.PrepareForSerializing();
|
| }
|
|
|
| - parse_info->set_language_mode(
|
| + parse_info.set_language_mode(
|
| static_cast<LanguageMode>(info.language_mode() | language_mode));
|
| result = CompileToplevel(&info);
|
| if (extension == NULL && !result.is_null() && !result->dont_cache()) {
|
| @@ -1334,11 +1360,12 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo(
|
| FunctionLiteral* literal, Handle<Script> script,
|
| CompilationInfo* outer_info) {
|
| // Precondition: code has been parsed and scopes have been analyzed.
|
| - CompilationInfoWithZone info(script);
|
| - ParseInfo* parse_info = info.parse_info();
|
| - parse_info->set_literal(literal);
|
| - parse_info->set_scope(literal->scope());
|
| - parse_info->set_language_mode(literal->scope()->language_mode());
|
| + Zone zone;
|
| + ParseInfo parse_info(&zone, script);
|
| + CompilationInfo info(&parse_info);
|
| + parse_info.set_literal(literal);
|
| + parse_info.set_scope(literal->scope());
|
| + parse_info.set_language_mode(literal->scope()->language_mode());
|
| if (outer_info->will_serialize()) info.PrepareForSerializing();
|
|
|
| Isolate* isolate = info.isolate();
|
| @@ -1548,21 +1575,6 @@ bool CompilationPhase::ShouldProduceTraceOutput() const {
|
| }
|
|
|
|
|
| -CompilationInfoWithZone::CompilationInfoWithZone(Handle<Script> script)
|
| - : CompilationInfo(new ParseInfo(&zone_, script)) {}
|
| -
|
| -
|
| -CompilationInfoWithZone::CompilationInfoWithZone(Handle<JSFunction> function)
|
| - : CompilationInfo(new ParseInfo(&zone_, function)) {}
|
| -
|
| -
|
| -CompilationInfoWithZone::~CompilationInfoWithZone() {
|
| - DisableFutureOptimization();
|
| - RollbackDependencies();
|
| - delete parse_info_;
|
| - parse_info_ = nullptr;
|
| -}
|
| -
|
| #if DEBUG
|
| void CompilationInfo::PrintAstForTesting() {
|
| PrintF("--- Source from AST ---\n%s\n",
|
|
|