execute method
FutureOr<ASTValue>
execute(
- String entryFunctionName,
- List? positionalParameters,
- Map? namedParameters, {
- ApolloExternalFunctionMapper? externalFunctionMapper,
- VMObject? classInstanceObject,
- Map<
String, ASTValue> ? classInstanceFields, - VMTypeResolver? typeResolver,
Implementation
FutureOr<ASTValue> execute(
String entryFunctionName,
List? positionalParameters,
Map? namedParameters, {
ApolloExternalFunctionMapper? externalFunctionMapper,
VMObject? classInstanceObject,
Map<String, ASTValue>? classInstanceFields,
VMTypeResolver? typeResolver,
}) async {
var rootContext =
await _initializeEntryPointBlock(externalFunctionMapper, typeResolver);
ApolloExternalFunctionMapper? prevExternalFunctionMapper;
if (externalFunctionMapper != null) {
prevExternalFunctionMapper = rootContext.externalFunctionMapper;
rootContext.externalFunctionMapper = externalFunctionMapper;
}
var prevContext = VMContext.setCurrent(rootContext);
try {
var fSignature =
ASTFunctionSignature.from(positionalParameters, namedParameters);
var f = getFunction(entryFunctionName, fSignature, rootContext,
caseInsensitive: true);
if (f == null) {
throw ApolloVMRuntimeError(
"Can't find entry function: $entryFunctionName");
}
var context = rootContext;
if (!f.modifiers.isStatic) {
if (this is ASTClass) {
var clazz = this as ASTClass;
var classContext = clazz._createContext(typeResolver, rootContext);
var obj =
(await clazz.createInstance(classContext, ASTRunStatus.dummy))!;
if (classInstanceObject != null) {
await clazz.setInstanceByVMObject(
classContext, ASTRunStatus.dummy, obj, classInstanceObject);
}
if (classInstanceFields != null) {
await clazz.setInstanceByMap(
classContext, ASTRunStatus.dummy, obj, classInstanceFields);
}
classContext.setClassInstance(obj);
context = classContext;
} else {
throw ApolloVMRuntimeError(
"Can't call non-static function without a class context: $this");
}
}
return await f.call(context,
positionalParameters: positionalParameters,
namedParameters: namedParameters);
} finally {
VMContext.setCurrent(prevContext);
if (identical(
rootContext.externalFunctionMapper, externalFunctionMapper)) {
rootContext.externalFunctionMapper = prevExternalFunctionMapper;
}
}
}