Implement runtime part of dynamic-import

* Implement one of parsing error of module
* Fix one of stack usage error on FunctionObjectInlines

Signed-off-by: Seonghyun Kim <sh8281.kim@samsung.com>
This commit is contained in:
Seonghyun Kim 2020-07-27 17:13:41 +09:00 committed by Boram Bae
commit ba4763e888
12 changed files with 181 additions and 347 deletions

View file

@ -530,6 +530,37 @@ public:
}
loadedModules.push_back(std::make_tuple(path, relatedContext, PersistentRefHolder<ScriptRef>(loadedModule)));
}
virtual void hostImportModuleDynamically(ContextRef* relatedContext, ScriptRef* referrer, StringRef* src, PromiseObjectRef* promise) override
{
LoadModuleResult loadedModuleResult = onLoadModule(relatedContext, referrer, src);
Evaluator::EvaluatorResult executionResult = Evaluator::execute(relatedContext, [](ExecutionStateRef* state, LoadModuleResult loadedModuleResult, PromiseObjectRef* promise) -> ValueRef* {
if (loadedModuleResult.script) {
if (loadedModuleResult.script.value()->isExecuted()) {
if (loadedModuleResult.script.value()->wasThereErrorOnModuleEvaluation()) {
state->throwException(loadedModuleResult.script.value()->moduleEvaluationError());
}
} else {
loadedModuleResult.script.value()->execute(state);
}
} else {
state->throwException(ErrorObjectRef::create(state, loadedModuleResult.errorCode, loadedModuleResult.errorMessage));
}
return loadedModuleResult.script.value()->moduleNamespace(state);
},
loadedModuleResult, promise);
Evaluator::execute(relatedContext, [](ExecutionStateRef* state, bool isSuccessful, ValueRef* value, PromiseObjectRef* promise) -> ValueRef* {
if (isSuccessful) {
promise->fulfill(state, value);
} else {
promise->reject(state, value);
}
return ValueRef::createUndefined();
},
executionResult.isSuccessful(), executionResult.isSuccessful() ? executionResult.result : executionResult.error.value(), promise);
}
};
static bool evalScript(ContextRef* context, StringRef* str, StringRef* fileName, bool shouldPrintScriptResult, bool isModule)