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

Side by Side Diff: src/objects.cc

Issue 2460233003: [modules] Assign cell indices at validation time. (Closed)
Patch Set: Created 4 years, 1 month 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 19889 matching lines...) Expand 10 before | Expand all | Expand 10 after
19900 &loc); 19900 &loc);
19901 } 19901 }
19902 return MaybeHandle<Cell>(); 19902 return MaybeHandle<Cell>();
19903 } 19903 }
19904 name_set->insert(name); 19904 name_set->insert(name);
19905 } 19905 }
19906 19906
19907 if (object->IsModuleInfoEntry()) { 19907 if (object->IsModuleInfoEntry()) {
19908 // Not yet resolved indirect export. 19908 // Not yet resolved indirect export.
19909 Handle<ModuleInfoEntry> entry = Handle<ModuleInfoEntry>::cast(object); 19909 Handle<ModuleInfoEntry> entry = Handle<ModuleInfoEntry>::cast(object);
19910 int module_request = Smi::cast(entry->module_request())->value();
19911 Handle<String> import_name(String::cast(entry->import_name()), isolate); 19910 Handle<String> import_name(String::cast(entry->import_name()), isolate);
19912 Handle<Script> script( 19911 Handle<Script> script(
19913 Script::cast(JSFunction::cast(module->code())->shared()->script()), 19912 Script::cast(JSFunction::cast(module->code())->shared()->script()),
19914 isolate); 19913 isolate);
19915 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos()); 19914 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos());
19916 19915
19917 Handle<Cell> cell; 19916 Handle<Cell> cell;
19918 if (!ResolveImport(module, import_name, module_request, new_loc, true, 19917 if (!ResolveImport(module, import_name, entry->module_request(), new_loc,
19919 resolve_set) 19918 true, resolve_set)
19920 .ToHandle(&cell)) { 19919 .ToHandle(&cell)) {
19921 DCHECK(isolate->has_pending_exception()); 19920 DCHECK(isolate->has_pending_exception());
19922 return MaybeHandle<Cell>(); 19921 return MaybeHandle<Cell>();
19923 } 19922 }
19924 19923
19925 // The export table may have changed but the entry in question should be 19924 // The export table may have changed but the entry in question should be
19926 // unchanged. 19925 // unchanged.
19927 Handle<ObjectHashTable> exports(module->exports(), isolate); 19926 Handle<ObjectHashTable> exports(module->exports(), isolate);
19928 DCHECK(exports->Lookup(name)->IsModuleInfoEntry()); 19927 DCHECK(exports->Lookup(name)->IsModuleInfoEntry());
19929 19928
(...skipping 16 matching lines...) Expand all
19946 // exports provide the name, make sure they all map it to the same cell. 19945 // exports provide the name, make sure they all map it to the same cell.
19947 Handle<Cell> unique_cell; 19946 Handle<Cell> unique_cell;
19948 Handle<FixedArray> special_exports(module->info()->special_exports(), 19947 Handle<FixedArray> special_exports(module->info()->special_exports(),
19949 isolate); 19948 isolate);
19950 for (int i = 0, n = special_exports->length(); i < n; ++i) { 19949 for (int i = 0, n = special_exports->length(); i < n; ++i) {
19951 i::Handle<i::ModuleInfoEntry> entry( 19950 i::Handle<i::ModuleInfoEntry> entry(
19952 i::ModuleInfoEntry::cast(special_exports->get(i)), isolate); 19951 i::ModuleInfoEntry::cast(special_exports->get(i)), isolate);
19953 if (!entry->export_name()->IsUndefined(isolate)) { 19952 if (!entry->export_name()->IsUndefined(isolate)) {
19954 continue; // Indirect export. 19953 continue; // Indirect export.
19955 } 19954 }
19956 int module_request = Smi::cast(entry->module_request())->value();
19957 19955
19958 Handle<Script> script( 19956 Handle<Script> script(
19959 Script::cast(JSFunction::cast(module->code())->shared()->script()), 19957 Script::cast(JSFunction::cast(module->code())->shared()->script()),
19960 isolate); 19958 isolate);
19961 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos()); 19959 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos());
19962 19960
19963 Handle<Cell> cell; 19961 Handle<Cell> cell;
19964 if (ResolveImport(module, name, module_request, new_loc, false, 19962 if (ResolveImport(module, name, entry->module_request(), new_loc, false,
19965 resolve_set) 19963 resolve_set)
19966 .ToHandle(&cell)) { 19964 .ToHandle(&cell)) {
19967 if (unique_cell.is_null()) unique_cell = cell; 19965 if (unique_cell.is_null()) unique_cell = cell;
19968 if (*unique_cell != *cell) { 19966 if (*unique_cell != *cell) {
19969 return isolate->Throw<Cell>( 19967 return isolate->Throw<Cell>(
19970 isolate->factory()->NewSyntaxError( 19968 isolate->factory()->NewSyntaxError(
19971 MessageTemplate::kAmbiguousExport, name), 19969 MessageTemplate::kAmbiguousExport, name),
19972 &loc); 19970 &loc);
19973 } 19971 }
19974 } else if (isolate->has_pending_exception()) { 19972 } else if (isolate->has_pending_exception()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
20007 shared, 20005 shared,
20008 handle(Utils::OpenHandle(*context)->native_context(), isolate)); 20006 handle(Utils::OpenHandle(*context)->native_context(), isolate));
20009 module->set_code(*function); 20007 module->set_code(*function);
20010 DCHECK(module->instantiated()); 20008 DCHECK(module->instantiated());
20011 20009
20012 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), 20010 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(),
20013 isolate); 20011 isolate);
20014 20012
20015 // Set up local exports. 20013 // Set up local exports.
20016 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate); 20014 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate);
20017 for (int i = 0, n = regular_exports->length(); i < n; i += 2) { 20015 for (int i = 0, n = regular_exports->length(); i < n; i += 3) {
20016 // TODO(neis): Make this more robust.
adamk 2016/10/31 18:25:04 Related to robustness, seems like this loop should
neis 2016/11/03 10:43:48 Sure, that's part of it.
20018 Handle<FixedArray> export_names( 20017 Handle<FixedArray> export_names(
20019 FixedArray::cast(regular_exports->get(i + 1)), isolate); 20018 FixedArray::cast(regular_exports->get(i + 2)), isolate);
20020 CreateExport(module, export_names); 20019 CreateExport(module, export_names);
20021 } 20020 }
20022 20021
20023 // Partially set up indirect exports. 20022 // Partially set up indirect exports.
20024 // For each indirect export, we create the appropriate slot in the export 20023 // For each indirect export, we create the appropriate slot in the export
20025 // table and store its ModuleInfoEntry there. When we later find the correct 20024 // table and store its ModuleInfoEntry there. When we later find the correct
20026 // Cell in the module that actually provides the value, we replace the 20025 // Cell in the module that actually provides the value, we replace the
20027 // ModuleInfoEntry by that Cell (see ResolveExport). 20026 // ModuleInfoEntry by that Cell (see ResolveExport).
20028 Handle<FixedArray> special_exports(module_info->special_exports(), isolate); 20027 Handle<FixedArray> special_exports(module_info->special_exports(), isolate);
20029 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20028 for (int i = 0, n = special_exports->length(); i < n; ++i) {
(...skipping 27 matching lines...) Expand all
20057 } 20056 }
20058 20057
20059 Zone zone(isolate->allocator(), ZONE_NAME); 20058 Zone zone(isolate->allocator(), ZONE_NAME);
20060 20059
20061 // Resolve imports. 20060 // Resolve imports.
20062 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate); 20061 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate);
20063 for (int i = 0, n = regular_imports->length(); i < n; ++i) { 20062 for (int i = 0, n = regular_imports->length(); i < n; ++i) {
20064 Handle<ModuleInfoEntry> entry( 20063 Handle<ModuleInfoEntry> entry(
20065 ModuleInfoEntry::cast(regular_imports->get(i)), isolate); 20064 ModuleInfoEntry::cast(regular_imports->get(i)), isolate);
20066 Handle<String> name(String::cast(entry->import_name()), isolate); 20065 Handle<String> name(String::cast(entry->import_name()), isolate);
20067 int module_request = Smi::cast(entry->module_request())->value();
20068 Handle<Script> script( 20066 Handle<Script> script(
20069 Script::cast(JSFunction::cast(module->code())->shared()->script()), 20067 Script::cast(JSFunction::cast(module->code())->shared()->script()),
20070 isolate); 20068 isolate);
20071 MessageLocation loc(script, entry->beg_pos(), entry->end_pos()); 20069 MessageLocation loc(script, entry->beg_pos(), entry->end_pos());
20072 ResolveSet resolve_set(&zone); 20070 ResolveSet resolve_set(&zone);
20073 if (ResolveImport(module, name, module_request, loc, true, &resolve_set) 20071 if (ResolveImport(module, name, entry->module_request(), loc, true,
20072 &resolve_set)
20074 .is_null()) { 20073 .is_null()) {
20075 return false; 20074 return false;
20076 } 20075 }
20077 } 20076 }
20078 20077
20079 // Resolve indirect exports. 20078 // Resolve indirect exports.
20080 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20079 for (int i = 0, n = special_exports->length(); i < n; ++i) {
20081 Handle<ModuleInfoEntry> entry( 20080 Handle<ModuleInfoEntry> entry(
20082 ModuleInfoEntry::cast(special_exports->get(i)), isolate); 20081 ModuleInfoEntry::cast(special_exports->get(i)), isolate);
20083 Handle<Object> name(entry->export_name(), isolate); 20082 Handle<Object> name(entry->export_name(), isolate);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
20147 20146
20148 Handle<FixedArray> special_exports(module->info()->special_exports(), 20147 Handle<FixedArray> special_exports(module->info()->special_exports(),
20149 isolate); 20148 isolate);
20150 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20149 for (int i = 0, n = special_exports->length(); i < n; ++i) {
20151 Handle<ModuleInfoEntry> entry( 20150 Handle<ModuleInfoEntry> entry(
20152 ModuleInfoEntry::cast(special_exports->get(i)), isolate); 20151 ModuleInfoEntry::cast(special_exports->get(i)), isolate);
20153 if (!entry->export_name()->IsUndefined(isolate)) { 20152 if (!entry->export_name()->IsUndefined(isolate)) {
20154 continue; // Indirect export. 20153 continue; // Indirect export.
20155 } 20154 }
20156 20155
20157 int module_request = Smi::cast(entry->module_request())->value();
20158 Handle<Module> requested_module( 20156 Handle<Module> requested_module(
20159 Module::cast(module->requested_modules()->get(module_request)), 20157 Module::cast(module->requested_modules()->get(entry->module_request())),
20160 isolate); 20158 isolate);
20161 20159
20162 // Recurse. 20160 // Recurse.
20163 FetchStarExports(requested_module, zone, visited); 20161 FetchStarExports(requested_module, zone, visited);
20164 20162
20165 // Collect all of [requested_module]'s exports that must be added to 20163 // Collect all of [requested_module]'s exports that must be added to
20166 // [module]'s exports (i.e. to [exports]). We record these in 20164 // [module]'s exports (i.e. to [exports]). We record these in
20167 // [more_exports]. Ambiguities (conflicting exports) are marked by mapping 20165 // [more_exports]. Ambiguities (conflicting exports) are marked by mapping
20168 // the name to undefined instead of a Cell. 20166 // the name to undefined instead of a Cell.
20169 Handle<ObjectHashTable> requested_exports(requested_module->exports(), 20167 Handle<ObjectHashTable> requested_exports(requested_module->exports(),
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
20257 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20255 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20258 .Check(); 20256 .Check();
20259 } 20257 }
20260 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20258 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20261 20259
20262 return ns; 20260 return ns;
20263 } 20261 }
20264 20262
20265 } // namespace internal 20263 } // namespace internal
20266 } // namespace v8 20264 } // namespace v8
OLDNEW
« src/objects.h ('K') | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698