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

Side by Side Diff: src/objects.cc

Issue 2460233003: [modules] Assign cell indices at validation time. (Closed)
Patch Set: Rebase 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 19894 matching lines...) Expand 10 before | Expand all | Expand 10 after
19905 &loc); 19905 &loc);
19906 } 19906 }
19907 return MaybeHandle<Cell>(); 19907 return MaybeHandle<Cell>();
19908 } 19908 }
19909 name_set->insert(name); 19909 name_set->insert(name);
19910 } 19910 }
19911 19911
19912 if (object->IsModuleInfoEntry()) { 19912 if (object->IsModuleInfoEntry()) {
19913 // Not yet resolved indirect export. 19913 // Not yet resolved indirect export.
19914 Handle<ModuleInfoEntry> entry = Handle<ModuleInfoEntry>::cast(object); 19914 Handle<ModuleInfoEntry> entry = Handle<ModuleInfoEntry>::cast(object);
19915 int module_request = Smi::cast(entry->module_request())->value();
19916 Handle<String> import_name(String::cast(entry->import_name()), isolate); 19915 Handle<String> import_name(String::cast(entry->import_name()), isolate);
19917 Handle<Script> script( 19916 Handle<Script> script(
19918 Script::cast(JSFunction::cast(module->code())->shared()->script()), 19917 Script::cast(JSFunction::cast(module->code())->shared()->script()),
19919 isolate); 19918 isolate);
19920 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos()); 19919 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos());
19921 19920
19922 Handle<Cell> cell; 19921 Handle<Cell> cell;
19923 if (!ResolveImport(module, import_name, module_request, new_loc, true, 19922 if (!ResolveImport(module, import_name, entry->module_request(), new_loc,
19924 resolve_set) 19923 true, resolve_set)
19925 .ToHandle(&cell)) { 19924 .ToHandle(&cell)) {
19926 DCHECK(isolate->has_pending_exception()); 19925 DCHECK(isolate->has_pending_exception());
19927 return MaybeHandle<Cell>(); 19926 return MaybeHandle<Cell>();
19928 } 19927 }
19929 19928
19930 // The export table may have changed but the entry in question should be 19929 // The export table may have changed but the entry in question should be
19931 // unchanged. 19930 // unchanged.
19932 Handle<ObjectHashTable> exports(module->exports(), isolate); 19931 Handle<ObjectHashTable> exports(module->exports(), isolate);
19933 DCHECK(exports->Lookup(name)->IsModuleInfoEntry()); 19932 DCHECK(exports->Lookup(name)->IsModuleInfoEntry());
19934 19933
(...skipping 16 matching lines...) Expand all
19951 // exports provide the name, make sure they all map it to the same cell. 19950 // exports provide the name, make sure they all map it to the same cell.
19952 Handle<Cell> unique_cell; 19951 Handle<Cell> unique_cell;
19953 Handle<FixedArray> special_exports(module->info()->special_exports(), 19952 Handle<FixedArray> special_exports(module->info()->special_exports(),
19954 isolate); 19953 isolate);
19955 for (int i = 0, n = special_exports->length(); i < n; ++i) { 19954 for (int i = 0, n = special_exports->length(); i < n; ++i) {
19956 i::Handle<i::ModuleInfoEntry> entry( 19955 i::Handle<i::ModuleInfoEntry> entry(
19957 i::ModuleInfoEntry::cast(special_exports->get(i)), isolate); 19956 i::ModuleInfoEntry::cast(special_exports->get(i)), isolate);
19958 if (!entry->export_name()->IsUndefined(isolate)) { 19957 if (!entry->export_name()->IsUndefined(isolate)) {
19959 continue; // Indirect export. 19958 continue; // Indirect export.
19960 } 19959 }
19961 int module_request = Smi::cast(entry->module_request())->value();
19962 19960
19963 Handle<Script> script( 19961 Handle<Script> script(
19964 Script::cast(JSFunction::cast(module->code())->shared()->script()), 19962 Script::cast(JSFunction::cast(module->code())->shared()->script()),
19965 isolate); 19963 isolate);
19966 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos()); 19964 MessageLocation new_loc(script, entry->beg_pos(), entry->end_pos());
19967 19965
19968 Handle<Cell> cell; 19966 Handle<Cell> cell;
19969 if (ResolveImport(module, name, module_request, new_loc, false, 19967 if (ResolveImport(module, name, entry->module_request(), new_loc, false,
19970 resolve_set) 19968 resolve_set)
19971 .ToHandle(&cell)) { 19969 .ToHandle(&cell)) {
19972 if (unique_cell.is_null()) unique_cell = cell; 19970 if (unique_cell.is_null()) unique_cell = cell;
19973 if (*unique_cell != *cell) { 19971 if (*unique_cell != *cell) {
19974 return isolate->Throw<Cell>( 19972 return isolate->Throw<Cell>(
19975 isolate->factory()->NewSyntaxError( 19973 isolate->factory()->NewSyntaxError(
19976 MessageTemplate::kAmbiguousExport, name), 19974 MessageTemplate::kAmbiguousExport, name),
19977 &loc); 19975 &loc);
19978 } 19976 }
19979 } else if (isolate->has_pending_exception()) { 19977 } else if (isolate->has_pending_exception()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
20012 shared, 20010 shared,
20013 handle(Utils::OpenHandle(*context)->native_context(), isolate)); 20011 handle(Utils::OpenHandle(*context)->native_context(), isolate));
20014 module->set_code(*function); 20012 module->set_code(*function);
20015 DCHECK(module->instantiated()); 20013 DCHECK(module->instantiated());
20016 20014
20017 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), 20015 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(),
20018 isolate); 20016 isolate);
20019 20017
20020 // Set up local exports. 20018 // Set up local exports.
20021 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate); 20019 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate);
20022 for (int i = 0, n = regular_exports->length(); i < n; i += 2) { 20020 for (int i = 0, n = regular_exports->length(); i < n; i += 3) {
20021 // TODO(neis): Make this more robust.
20023 Handle<FixedArray> export_names( 20022 Handle<FixedArray> export_names(
20024 FixedArray::cast(regular_exports->get(i + 1)), isolate); 20023 FixedArray::cast(regular_exports->get(i + 2)), isolate);
20025 CreateExport(module, export_names); 20024 CreateExport(module, export_names);
20026 } 20025 }
20027 20026
20028 // Partially set up indirect exports. 20027 // Partially set up indirect exports.
20029 // For each indirect export, we create the appropriate slot in the export 20028 // For each indirect export, we create the appropriate slot in the export
20030 // table and store its ModuleInfoEntry there. When we later find the correct 20029 // table and store its ModuleInfoEntry there. When we later find the correct
20031 // Cell in the module that actually provides the value, we replace the 20030 // Cell in the module that actually provides the value, we replace the
20032 // ModuleInfoEntry by that Cell (see ResolveExport). 20031 // ModuleInfoEntry by that Cell (see ResolveExport).
20033 Handle<FixedArray> special_exports(module_info->special_exports(), isolate); 20032 Handle<FixedArray> special_exports(module_info->special_exports(), isolate);
20034 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20033 for (int i = 0, n = special_exports->length(); i < n; ++i) {
(...skipping 27 matching lines...) Expand all
20062 } 20061 }
20063 20062
20064 Zone zone(isolate->allocator(), ZONE_NAME); 20063 Zone zone(isolate->allocator(), ZONE_NAME);
20065 20064
20066 // Resolve imports. 20065 // Resolve imports.
20067 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate); 20066 Handle<FixedArray> regular_imports(module_info->regular_imports(), isolate);
20068 for (int i = 0, n = regular_imports->length(); i < n; ++i) { 20067 for (int i = 0, n = regular_imports->length(); i < n; ++i) {
20069 Handle<ModuleInfoEntry> entry( 20068 Handle<ModuleInfoEntry> entry(
20070 ModuleInfoEntry::cast(regular_imports->get(i)), isolate); 20069 ModuleInfoEntry::cast(regular_imports->get(i)), isolate);
20071 Handle<String> name(String::cast(entry->import_name()), isolate); 20070 Handle<String> name(String::cast(entry->import_name()), isolate);
20072 int module_request = Smi::cast(entry->module_request())->value();
20073 Handle<Script> script( 20071 Handle<Script> script(
20074 Script::cast(JSFunction::cast(module->code())->shared()->script()), 20072 Script::cast(JSFunction::cast(module->code())->shared()->script()),
20075 isolate); 20073 isolate);
20076 MessageLocation loc(script, entry->beg_pos(), entry->end_pos()); 20074 MessageLocation loc(script, entry->beg_pos(), entry->end_pos());
20077 ResolveSet resolve_set(&zone); 20075 ResolveSet resolve_set(&zone);
20078 if (ResolveImport(module, name, module_request, loc, true, &resolve_set) 20076 if (ResolveImport(module, name, entry->module_request(), loc, true,
20077 &resolve_set)
20079 .is_null()) { 20078 .is_null()) {
20080 return false; 20079 return false;
20081 } 20080 }
20082 } 20081 }
20083 20082
20084 // Resolve indirect exports. 20083 // Resolve indirect exports.
20085 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20084 for (int i = 0, n = special_exports->length(); i < n; ++i) {
20086 Handle<ModuleInfoEntry> entry( 20085 Handle<ModuleInfoEntry> entry(
20087 ModuleInfoEntry::cast(special_exports->get(i)), isolate); 20086 ModuleInfoEntry::cast(special_exports->get(i)), isolate);
20088 Handle<Object> name(entry->export_name(), isolate); 20087 Handle<Object> name(entry->export_name(), isolate);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
20152 20151
20153 Handle<FixedArray> special_exports(module->info()->special_exports(), 20152 Handle<FixedArray> special_exports(module->info()->special_exports(),
20154 isolate); 20153 isolate);
20155 for (int i = 0, n = special_exports->length(); i < n; ++i) { 20154 for (int i = 0, n = special_exports->length(); i < n; ++i) {
20156 Handle<ModuleInfoEntry> entry( 20155 Handle<ModuleInfoEntry> entry(
20157 ModuleInfoEntry::cast(special_exports->get(i)), isolate); 20156 ModuleInfoEntry::cast(special_exports->get(i)), isolate);
20158 if (!entry->export_name()->IsUndefined(isolate)) { 20157 if (!entry->export_name()->IsUndefined(isolate)) {
20159 continue; // Indirect export. 20158 continue; // Indirect export.
20160 } 20159 }
20161 20160
20162 int module_request = Smi::cast(entry->module_request())->value();
20163 Handle<Module> requested_module( 20161 Handle<Module> requested_module(
20164 Module::cast(module->requested_modules()->get(module_request)), 20162 Module::cast(module->requested_modules()->get(entry->module_request())),
20165 isolate); 20163 isolate);
20166 20164
20167 // Recurse. 20165 // Recurse.
20168 FetchStarExports(requested_module, zone, visited); 20166 FetchStarExports(requested_module, zone, visited);
20169 20167
20170 // Collect all of [requested_module]'s exports that must be added to 20168 // Collect all of [requested_module]'s exports that must be added to
20171 // [module]'s exports (i.e. to [exports]). We record these in 20169 // [module]'s exports (i.e. to [exports]). We record these in
20172 // [more_exports]. Ambiguities (conflicting exports) are marked by mapping 20170 // [more_exports]. Ambiguities (conflicting exports) are marked by mapping
20173 // the name to undefined instead of a Cell. 20171 // the name to undefined instead of a Cell.
20174 Handle<ObjectHashTable> requested_exports(requested_module->exports(), 20172 Handle<ObjectHashTable> requested_exports(requested_module->exports(),
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
20262 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) 20260 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr))
20263 .Check(); 20261 .Check();
20264 } 20262 }
20265 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); 20263 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked();
20266 20264
20267 return ns; 20265 return ns;
20268 } 20266 }
20269 20267
20270 } // namespace internal 20268 } // namespace internal
20271 } // namespace v8 20269 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698