Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: src/objects.cc

Issue 2407183002: [modules] Don't unnecessarily keep function alive after evaluation. (Closed)
Patch Set: Remove shared(). Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 19917 matching lines...) Expand 10 before | Expand all | Expand 10 after
19928 if (must_resolve) { 19928 if (must_resolve) {
19929 THROW_NEW_ERROR(isolate, 19929 THROW_NEW_ERROR(isolate,
19930 NewSyntaxError(MessageTemplate::kUnresolvableExport, name), 19930 NewSyntaxError(MessageTemplate::kUnresolvableExport, name),
19931 Cell); 19931 Cell);
19932 } 19932 }
19933 return MaybeHandle<Cell>(); 19933 return MaybeHandle<Cell>();
19934 } 19934 }
19935 19935
19936 bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context, 19936 bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context,
19937 v8::Module::ResolveCallback callback) { 19937 v8::Module::ResolveCallback callback) {
19938 // Already instantiated. 19938 if (module->instantiated()) return true;
19939 if (module->code()->IsJSFunction()) return true;
19940 19939
19941 Isolate* isolate = module->GetIsolate(); 19940 Isolate* isolate = module->GetIsolate();
19942 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(module->code()), 19941 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(module->code()),
19943 isolate); 19942 isolate);
19944 Handle<JSFunction> function = 19943 Handle<JSFunction> function =
19945 isolate->factory()->NewFunctionFromSharedFunctionInfo( 19944 isolate->factory()->NewFunctionFromSharedFunctionInfo(
19946 shared, 19945 shared,
19947 handle(Utils::OpenHandle(*context)->native_context(), isolate)); 19946 handle(Utils::OpenHandle(*context)->native_context(), isolate));
19948 module->set_code(*function); 19947 module->set_code(*function);
19948 DCHECK(module->instantiated());
19949 19949
19950 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), 19950 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(),
19951 isolate); 19951 isolate);
19952 19952
19953 // Set up local exports. 19953 // Set up local exports.
19954 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate); 19954 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate);
19955 for (int i = 0, n = regular_exports->length(); i < n; i += 2) { 19955 for (int i = 0, n = regular_exports->length(); i < n; i += 2) {
19956 Handle<FixedArray> export_names( 19956 Handle<FixedArray> export_names(
19957 FixedArray::cast(regular_exports->get(i + 1)), isolate); 19957 FixedArray::cast(regular_exports->get(i + 1)), isolate);
19958 CreateExport(module, export_names); 19958 CreateExport(module, export_names);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
20020 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set) 20020 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set)
20021 .is_null()) { 20021 .is_null()) {
20022 return false; 20022 return false;
20023 } 20023 }
20024 } 20024 }
20025 20025
20026 return true; 20026 return true;
20027 } 20027 }
20028 20028
20029 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) { 20029 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) {
20030 DCHECK(module->code()->IsJSFunction()); // Instantiated. 20030 DCHECK(module->instantiated());
20031
20032 Isolate* isolate = module->GetIsolate();
20033 20031
20034 // Each module can only be evaluated once. 20032 // Each module can only be evaluated once.
20033 Isolate* isolate = module->GetIsolate();
20035 if (module->evaluated()) return isolate->factory()->undefined_value(); 20034 if (module->evaluated()) return isolate->factory()->undefined_value();
20036 module->set_evaluated(true); 20035 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate);
20036 module->set_evaluated();
20037 20037
20038 // Initialization. 20038 // Initialization.
20039 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate);
20040 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type()); 20039 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type());
20041 Handle<Object> receiver = isolate->factory()->undefined_value(); 20040 Handle<Object> receiver = isolate->factory()->undefined_value();
20042 Handle<Object> argv[] = {module}; 20041 Handle<Object> argv[] = {module};
20043 Handle<Object> generator; 20042 Handle<Object> generator;
20044 ASSIGN_RETURN_ON_EXCEPTION( 20043 ASSIGN_RETURN_ON_EXCEPTION(
20045 isolate, generator, 20044 isolate, generator,
20046 Execution::Call(isolate, function, receiver, arraysize(argv), argv), 20045 Execution::Call(isolate, function, receiver, arraysize(argv), argv),
20047 Object); 20046 Object);
20048 20047
20049 // Recursion. 20048 // Recursion.
20050 Handle<FixedArray> requested_modules(module->requested_modules(), isolate); 20049 Handle<FixedArray> requested_modules(module->requested_modules(), isolate);
20051 for (int i = 0, length = requested_modules->length(); i < length; ++i) { 20050 for (int i = 0, length = requested_modules->length(); i < length; ++i) {
20052 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate); 20051 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate);
20053 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object); 20052 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object);
20054 } 20053 }
20055 20054
20056 // Evaluation of module body. 20055 // Evaluation of module body.
20057 Handle<JSFunction> resume( 20056 Handle<JSFunction> resume(
20058 isolate->native_context()->generator_next_internal(), isolate); 20057 isolate->native_context()->generator_next_internal(), isolate);
20059 return Execution::Call(isolate, resume, generator, 0, nullptr); 20058 return Execution::Call(isolate, resume, generator, 0, nullptr);
20060 } 20059 }
20061 20060
20062 namespace { 20061 namespace {
20063 20062
20064 void FetchStarExports(Handle<Module> module, Zone* zone, 20063 void FetchStarExports(Handle<Module> module, Zone* zone,
20065 UnorderedModuleSet* visited) { 20064 UnorderedModuleSet* visited) {
20066 DCHECK(module->code()->IsJSFunction()); // Instantiated. 20065 DCHECK(module->instantiated());
20067 20066
20068 bool cycle = !visited->insert(module).second; 20067 bool cycle = !visited->insert(module).second;
20069 if (cycle) return; 20068 if (cycle) return;
20070 20069
20071 Isolate* isolate = module->GetIsolate(); 20070 Isolate* isolate = module->GetIsolate();
20072 Handle<ObjectHashTable> exports(module->exports(), isolate); 20071 Handle<ObjectHashTable> exports(module->exports(), isolate);
20073 UnorderedStringMap more_exports(zone); 20072 UnorderedStringMap more_exports(zone);
20074 20073
20075 // TODO(neis): Only allocate more_exports if there are star exports. 20074 // TODO(neis): Only allocate more_exports if there are star exports.
20076 // Maybe split special_exports into indirect_exports and star_exports. 20075 // Maybe split special_exports into indirect_exports and star_exports.
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
20187 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20186 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20188 .Check(); 20187 .Check();
20189 } 20188 }
20190 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20189 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20191 20190
20192 return ns; 20191 return ns;
20193 } 20192 }
20194 20193
20195 } // namespace internal 20194 } // namespace internal
20196 } // namespace v8 20195 } // namespace v8
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698