summaryrefslogtreecommitdiffstats
path: root/js/src/builtin
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/builtin')
-rw-r--r--js/src/builtin/Module.js7
-rw-r--r--js/src/builtin/ModuleObject.cpp41
-rw-r--r--js/src/builtin/ModuleObject.h4
-rw-r--r--js/src/builtin/SelfHostingDefines.h10
-rw-r--r--js/src/builtin/TestingFunctions.cpp2
5 files changed, 29 insertions, 35 deletions
diff --git a/js/src/builtin/Module.js b/js/src/builtin/Module.js
index 86b44880d..c9f20c18c 100644
--- a/js/src/builtin/Module.js
+++ b/js/src/builtin/Module.js
@@ -234,8 +234,11 @@ function GetModuleEnvironment(module)
{
assert(IsModule(module), "Non-module passed to GetModuleEnvironment");
+ assert(module.status >= MODULE_STATUS_INSTANTIATING,
+ "Attempt to access module environement before instantation");
+
let env = UnsafeGetReservedSlot(module, MODULE_OBJECT_ENVIRONMENT_SLOT);
- assert(env === undefined || IsModuleEnvironment(env),
+ assert(IsModuleEnvironment(env),
"Module environment slot contains unexpected value");
return env;
@@ -421,7 +424,7 @@ function ModuleDeclarationEnvironmentSetup(module)
}
// Steps 5-6
- CreateModuleEnvironment(module);
+ // Note that we have already created the environment by this point.
let env = GetModuleEnvironment(module);
// Step 8
diff --git a/js/src/builtin/ModuleObject.cpp b/js/src/builtin/ModuleObject.cpp
index a9a257178..14d27845c 100644
--- a/js/src/builtin/ModuleObject.cpp
+++ b/js/src/builtin/ModuleObject.cpp
@@ -657,17 +657,24 @@ ModuleObject::finalize(js::FreeOp* fop, JSObject* obj)
fop->delete_(funDecls);
}
+ModuleEnvironmentObject&
+ModuleObject::initialEnvironment() const
+{
+ Value value = getReservedSlot(EnvironmentSlot);
+ return value.toObject().as<ModuleEnvironmentObject>();
+}
+
ModuleEnvironmentObject*
ModuleObject::environment() const
{
-//- MOZ_ASSERT(status() != MODULE_STATUS_ERRORED);
-//+ MOZ_ASSERT(!hadEvaluationError());
+ MOZ_ASSERT(!hadEvaluationError());
- Value value = getReservedSlot(EnvironmentSlot);
- if (value.isUndefined())
+ // According to the spec the environment record is created during
+ // instantiation, but we create it earlier than that.
+ if (status() < MODULE_STATUS_INSTANTIATED)
return nullptr;
- return &value.toObject().as<ModuleEnvironmentObject>();
+ return &initialEnvironment();
}
bool
@@ -732,7 +739,7 @@ ModuleObject::init(HandleScript script)
void
ModuleObject::setInitialEnvironment(HandleModuleEnvironmentObject initialEnvironment)
{
- initReservedSlot(InitialEnvironmentSlot, ObjectValue(*initialEnvironment));
+ initReservedSlot(EnvironmentSlot, ObjectValue(*initialEnvironment));
}
void
@@ -867,12 +874,6 @@ ModuleObject::setHostDefinedField(const JS::Value& value)
setReservedSlot(HostDefinedSlot, value);
}
-ModuleEnvironmentObject&
-ModuleObject::initialEnvironment() const
-{
- return getReservedSlot(InitialEnvironmentSlot).toObject().as<ModuleEnvironmentObject>();
-}
-
Scope*
ModuleObject::enclosingScope() const
{
@@ -898,16 +899,6 @@ ModuleObject::trace(JSTracer* trc, JSObject* obj)
funDecls->trace(trc);
}
-void
-ModuleObject::createEnvironment()
-{
- // The environment has already been created, we just neet to set it in the
- // right slot.
- MOZ_ASSERT(!getReservedSlot(InitialEnvironmentSlot).isUndefined());
- MOZ_ASSERT(getReservedSlot(EnvironmentSlot).isUndefined());
- setReservedSlot(EnvironmentSlot, getReservedSlot(InitialEnvironmentSlot));
-}
-
bool
ModuleObject::noteFunctionDeclaration(ExclusiveContext* cx, HandleAtom name, HandleFunction fun)
{
@@ -923,7 +914,10 @@ ModuleObject::noteFunctionDeclaration(ExclusiveContext* cx, HandleAtom name, Han
/* static */ bool
ModuleObject::instantiateFunctionDeclarations(JSContext* cx, HandleModuleObject self)
{
+#ifdef DEBUG
+ MOZ_ASSERT(self->status() == MODULE_STATUS_INSTANTIATING);
MOZ_ASSERT(IsFrozen(cx, self));
+#endif
FunctionDeclarationVector* funDecls = self->functionDeclarations();
if (!funDecls) {
@@ -954,7 +948,10 @@ ModuleObject::instantiateFunctionDeclarations(JSContext* cx, HandleModuleObject
/* static */ bool
ModuleObject::execute(JSContext* cx, HandleModuleObject self, MutableHandleValue rval)
{
+#ifdef DEBUG
+ MOZ_ASSERT(self->status() == MODULE_STATUS_EVALUATING);
MOZ_ASSERT(IsFrozen(cx, self));
+#endif
RootedScript script(cx, self->script());
RootedModuleEnvironmentObject scope(cx, self->environment());
diff --git a/js/src/builtin/ModuleObject.h b/js/src/builtin/ModuleObject.h
index 5a809c865..bd3e7044e 100644
--- a/js/src/builtin/ModuleObject.h
+++ b/js/src/builtin/ModuleObject.h
@@ -214,7 +214,6 @@ class ModuleObject : public NativeObject
enum
{
ScriptSlot = 0,
- InitialEnvironmentSlot,
EnvironmentSlot,
NamespaceSlot,
StatusSlot,
@@ -286,9 +285,6 @@ class ModuleObject : public NativeObject
void setHostDefinedField(const JS::Value& value);
- // For intrinsic_CreateModuleEnvironment.
- void createEnvironment();
-
// For BytecodeEmitter.
bool noteFunctionDeclaration(ExclusiveContext* cx, HandleAtom name, HandleFunction fun);
diff --git a/js/src/builtin/SelfHostingDefines.h b/js/src/builtin/SelfHostingDefines.h
index 6afa641b1..a3ba36804 100644
--- a/js/src/builtin/SelfHostingDefines.h
+++ b/js/src/builtin/SelfHostingDefines.h
@@ -97,11 +97,11 @@
#define REGEXP_STRING_ITERATOR_FLAGS_SLOT 2
#define REGEXP_STRING_ITERATOR_DONE_SLOT 3
-#define MODULE_OBJECT_ENVIRONMENT_SLOT 2
-#define MODULE_OBJECT_STATUS_SLOT 4
-#define MODULE_OBJECT_EVALUATION_ERROR_SLOT 5 // 4
-#define MODULE_OBJECT_DFS_INDEX_SLOT 16
-#define MODULE_OBJECT_DFS_ANCESTOR_INDEX_SLOT 17
+#define MODULE_OBJECT_ENVIRONMENT_SLOT 1
+#define MODULE_OBJECT_STATUS_SLOT 3
+#define MODULE_OBJECT_EVALUATION_ERROR_SLOT 4
+#define MODULE_OBJECT_DFS_INDEX_SLOT 15
+#define MODULE_OBJECT_DFS_ANCESTOR_INDEX_SLOT 16
#define MODULE_STATUS_UNINSTANTIATED 0
#define MODULE_STATUS_INSTANTIATING 1
diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp
index e93ebeec3..f589b8076 100644
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -3566,8 +3566,6 @@ GetModuleEnvironment(JSContext* cx, HandleValue moduleValue)
// before they have been instantiated.
RootedModuleEnvironmentObject env(cx, &module->initialEnvironment());
MOZ_ASSERT(env);
- MOZ_ASSERT_IF(module->environment(), module->environment() == env);
-
return env;
}