evaluateModule function

Future<bool> evaluateModule(
  1. double contextId,
  2. Uint8List codeBytes, {
  3. String? url,
  4. String? cacheKey,
  5. bool loadedFromCache = false,
  6. int line = 0,
  7. ScriptElement? scriptElement,
})

Implementation

Future<bool> evaluateModule(double contextId, Uint8List codeBytes,
    {String? url, String? cacheKey, bool loadedFromCache = false, int line = 0, ScriptElement? scriptElement}) async {
  if (WebFController.getControllerOfJSContextId(contextId) == null) {
    return false;
  }
  // Assign `vm://$id` for no url (anonymous scripts).
  if (url == null) {
    url = 'vm://module/$_anonymousScriptEvaluationId';
    _anonymousScriptEvaluationId++;
  }

  {
    Pointer<Utf8> urlPtr = url.toNativeUtf8();
    Pointer<Uint8> codePtr = uint8ListToPointer(codeBytes);
    Completer<bool> completer = Completer();

    _EvaluateScriptsContext context = _EvaluateScriptsContext(completer, codeBytes, codePtr, urlPtr, cacheKey);
    Pointer<NativeFunction<NativeEvaluateJavaScriptCallback>> resultCallback =
        Pointer.fromFunction(handleEvaluateScriptsResult);
    Pointer<NativeBindingObject> scriptElementPtr = scriptElement?.pointer! ?? nullptr;

    try {
      assert(_allocatedPages.containsKey(contextId));
      if (QuickJSByteCodeCache.isCodeNeedCache(codeBytes)) {
        // Export the bytecode from scripts
        Pointer<Pointer<Uint8>> bytecodes = malloc.allocate(sizeOf<Pointer<Uint8>>());
        Pointer<Uint64> bytecodeLen = malloc.allocate(sizeOf<Uint64>());

        context.bytecodes = bytecodes;
        context.bytecodeLen = bytecodeLen;

        _evaluateModule(_allocatedPages[contextId]!, codePtr, codeBytes.length, bytecodes, bytecodeLen, urlPtr, line,
            scriptElementPtr, context, resultCallback);
      } else {
        _evaluateModule(_allocatedPages[contextId]!, codePtr, codeBytes.length, nullptr, nullptr, urlPtr, line,
            scriptElementPtr, context, resultCallback);
      }
      return completer.future;
    } catch (e, stack) {
      bridgeLogger.severe('Error in event listener', e, stack);
    }

    return completer.future;
  }
}