invoke method
dynamic
invoke(})
Invoke a top level function defined in a certain namespace. It's possible to use this method to invoke a HTClass or HTNamedStruct name as a contruct call, you will get a HTInstance or HTStruct as return value.
Implementation
dynamic invoke(
String func, {
bool ignoreUndefined = false,
String? namespace,
String? module,
bool isConstructor = false,
List<dynamic> positionalArgs = const [],
Map<String, dynamic> namedArgs = const {},
// List<HTType> typeArgs = const [],
}) {
try {
stackTraceList.clear();
final savedModuleName = _currentBytecodeModule.id;
HTNamespace nsp;
if (module != null) {
nsp = globalNamespace;
if (_currentBytecodeModule.id != module) {
_currentBytecodeModule = cachedModules[module]!;
}
assert(_currentBytecodeModule.namespaces.isNotEmpty);
nsp = _currentBytecodeModule.namespaces.values.last;
} else {
nsp = currentNamespace;
}
dynamic callee;
if (namespace != null) {
HTObject fromNsp = nsp.memberGet(namespace, isRecursive: true);
callee = fromNsp.memberGet(func, ignoreUndefined: ignoreUndefined);
} else {
callee = nsp.memberGet(func,
isRecursive: true, ignoreUndefined: ignoreUndefined);
}
if (callee == null) {
if (ignoreUndefined == false) {
throw HTError.callNullObject(func);
} else if (ignoreUndefined == true) {
if (config.debugMode) {
print('${kConsoleColorYellow}hetu: $func is not defined.');
}
}
} else {
final result = _call(
callee,
positionalArgs: positionalArgs,
namedArgs: namedArgs,
// typeArgs: typeArgs,
);
if (_currentBytecodeModule.id != savedModuleName) {
_currentBytecodeModule = cachedModules[savedModuleName]!;
}
return result;
}
} catch (error, stackTrace) {
if (config.processError) {
processError(error, stackTrace);
} else {
rethrow;
}
}
}