[modules] Basic support of import statements.
BUG=v8:1569 Review-Url: https://codereview.chromium.org/2360063002 Cr-Commit-Position: refs/heads/master@{#39639}
This commit is contained in:
parent
813be42791
commit
ca6886c035
@ -122,6 +122,7 @@ class ModuleDescriptor : public ZoneObject {
|
||||
}
|
||||
|
||||
// All the remaining exports, indexed by local name.
|
||||
// After canonicalization (see Validate), these are exactly the local exports.
|
||||
const ZoneMultimap<const AstRawString*, Entry*>& regular_exports() const {
|
||||
return regular_exports_;
|
||||
}
|
||||
|
@ -2005,7 +2005,18 @@ void BytecodeGenerator::VisitVariableLoad(Variable* variable,
|
||||
.StoreAccumulatorInRegister(export_name)
|
||||
.CallRuntime(Runtime::kLoadModuleExport, export_name, 1);
|
||||
} else {
|
||||
UNIMPLEMENTED();
|
||||
auto it = descriptor->regular_imports().find(variable->raw_name());
|
||||
DCHECK(it != descriptor->regular_imports().end());
|
||||
register_allocator()->PrepareForConsecutiveAllocations(2);
|
||||
Register import_name = register_allocator()->NextConsecutiveRegister();
|
||||
Register module_request =
|
||||
register_allocator()->NextConsecutiveRegister();
|
||||
builder()
|
||||
->LoadLiteral(it->second->import_name->string())
|
||||
.StoreAccumulatorInRegister(import_name)
|
||||
.LoadLiteral(Smi::FromInt(it->second->module_request))
|
||||
.StoreAccumulatorInRegister(module_request)
|
||||
.CallRuntime(Runtime::kLoadModuleImport, import_name, 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -2205,6 +2216,8 @@ void BytecodeGenerator::VisitVariableAssignment(Variable* variable,
|
||||
DCHECK(variable->IsExport());
|
||||
|
||||
ModuleDescriptor* mod = scope()->GetModuleScope()->module();
|
||||
// There may be several export names for this local name, but it doesn't
|
||||
// matter which one we pick, as they all map to the same cell.
|
||||
auto it = mod->regular_exports().find(variable->raw_name());
|
||||
DCHECK(it != mod->regular_exports().end());
|
||||
|
||||
|
@ -19608,5 +19608,16 @@ Handle<Object> Module::LoadExport(Handle<Module> module, Handle<String> name) {
|
||||
return handle(cell->value(), isolate);
|
||||
}
|
||||
|
||||
Handle<Object> Module::LoadImport(Handle<Module> module, Handle<String> name,
|
||||
int module_request) {
|
||||
Isolate* isolate = module->GetIsolate();
|
||||
Handle<Module> requested_module(
|
||||
Module::cast(module->requested_modules()->get(module_request)), isolate);
|
||||
Handle<ObjectHashTable> exports(requested_module->exports(), isolate);
|
||||
Object* object = exports->Lookup(name);
|
||||
if (!object->IsCell()) UNIMPLEMENTED();
|
||||
return handle(Cell::cast(object)->value(), isolate);
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
@ -7946,9 +7946,12 @@ class Module : public Struct {
|
||||
DECL_INT_ACCESSORS(flags)
|
||||
|
||||
static void CreateExport(Handle<Module> module, Handle<FixedArray> names);
|
||||
static Handle<Object> LoadExport(Handle<Module> module, Handle<String> name);
|
||||
static void StoreExport(Handle<Module> module, Handle<String> name,
|
||||
Handle<Object> value);
|
||||
static Handle<Object> LoadExport(Handle<Module> module, Handle<String> name);
|
||||
|
||||
static Handle<Object> LoadImport(Handle<Module> module, Handle<String> name,
|
||||
int module_request);
|
||||
|
||||
static const int kCodeOffset = HeapObject::kHeaderSize;
|
||||
static const int kExportsOffset = kCodeOffset + kPointerSize;
|
||||
|
@ -968,6 +968,15 @@ RUNTIME_FUNCTION(Runtime_LoadModuleExport) {
|
||||
return *Module::LoadExport(module, name);
|
||||
}
|
||||
|
||||
RUNTIME_FUNCTION(Runtime_LoadModuleImport) {
|
||||
HandleScope scope(isolate);
|
||||
DCHECK(args.length() == 2);
|
||||
CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
|
||||
CONVERT_ARG_HANDLE_CHECKED(Smi, module_request, 1);
|
||||
Handle<Module> module(isolate->context()->module());
|
||||
return *Module::LoadImport(module, name, module_request->value());
|
||||
}
|
||||
|
||||
RUNTIME_FUNCTION(Runtime_StoreModuleExport) {
|
||||
HandleScope scope(isolate);
|
||||
DCHECK(args.length() == 2);
|
||||
|
@ -420,6 +420,7 @@ namespace internal {
|
||||
F(IsAccessCheckNeeded, 1, 1) \
|
||||
F(CreateDataProperty, 3, 1) \
|
||||
F(LoadModuleExport, 1, 1) \
|
||||
F(LoadModuleImport, 2, 1) \
|
||||
F(StoreModuleExport, 2, 1)
|
||||
|
||||
#define FOR_EACH_INTRINSIC_OPERATORS(F) \
|
||||
|
Loading…
Reference in New Issue
Block a user