web_ffi icon indicating copy to clipboard operation
web_ffi copied to clipboard

EXPORTED_FUNCTIONS option will cause an error

Open xiaoqunSun opened this issue 2 years ago • 0 comments

I build wasm use EXPORTED_FUNCTIONS option to reduce size

-s EXPORT_NAME=${APP_NAME}  -s MODULARIZE=1 -s EXPORTED_FUNCTIONS=[_get_version,_bezier_intersect,_free_pointer,_malloc,_free]

throw error at EmscriptenModule._fromJs

factory EmscriptenModule._fromJs(_EmscriptenModuleJs module) {
    Object? asm = module.asm;
    if (asm != null) {
      Map<int, WasmSymbol> knownAddresses = {};
      _Malloc? malloc;
      _Free? free;
      List<WasmSymbol> exports = [];
      List? entries = _entries(asm);
      if (entries != null) {
        for (dynamic entry in entries) {
          if (entry is List) {
            Object value = entry.last;
            //String type = value.runtimeType.t oString();
            //print(type);
            if (value is int) {
              Global g =
                  new Global(address: value, name: entry.first as String);
              if (knownAddresses.containsKey(value) &&
                  knownAddresses[value] is! Global) {
                throw new StateError(_adu(knownAddresses[value], g));
              }
              knownAddresses[value] = g;
              exports.add(g);
            } else if (value is Function) {
              FunctionDescription description =
                  _fromWasmFunction(entry.first as String, value);
              // It might happen that there are two different c functions that do nothing else than calling the same underlying c function
              // In this case, a compiler might substitute both functions with the underlying c function
              // So we got two functions with different names at the same table index
              // So it is actually ok if there are two things at the same address, as long as they are both functions
              if (knownAddresses.containsKey(description.tableIndex) &&
                  knownAddresses[description.tableIndex]
                      is! FunctionDescription) {
                throw new StateError(
                    _adu(knownAddresses[description.tableIndex], description));
              }
              knownAddresses[description.tableIndex] = description;
              exports.add(description);
              if (description.name == 'malloc') {
                malloc = description.function as _Malloc;
              } else if (description.name == 'free') {
                free = description.function as _Free;
              }
            } else {
              // throw new StateError(
              //     'Unexpected value in entry list! Entry is $entry, value is $value (of type ${value.runtimeType})');
            }
          } else {
            throw new StateError(
                'Unexpected entry in entries(Module[\'asm\'])!');
          }
        }
        if (malloc != null) {
          if (free != null) {
            return new EmscriptenModule._(module, exports, malloc, free);
          } else {
            throw new StateError('Module does not export the free function!');
          }
        } else {
          throw new StateError('Module does not export the malloc function!');
        }
      } else {
        throw new StateError(
            'JavaScript error: Could not access entries of Module[\'asm\']!');
      }
    } else {
      throw new StateError(
          'Could not access Module[\'asm\'], are your sure your module was compiled using emscripten?');
    }

because asm object contains WebAssembly.Memory,WebAssembly.Table which is neither int nor Functio algorithm.zip n

xiaoqunSun avatar Jun 22 '22 08:06 xiaoqunSun