Как правильно установить размер таблицы веб-сборки? - PullRequest
0 голосов
/ 09 марта 2019

Я пытался проанализировать строку json в C с помощью библиотеки microjson, а затем скомпилировать ее в wasm с помощью emscripten.Я использовал microjson пример 2, указанный в этой ссылке и добавил только заголовок emscripten.h Я получал ошибки:

LinkError: импортированная память с несовместимым размером

LinkError: импортированная таблица с несовместимым размером

Я преодолеваю эти ошибки, играя с полями начальных и максимальных размеров памяти в моем объекте импорта.Я установил в качестве начального значения памяти 256, максимальное значение 256, начальное значение таблицы 10 и максимальное значение 10. Изменение любого числа (т. Е. Изменение максимального значения таблицы на 11) приводит к появлению второй ошибки, приведенной выше.

В формате wat имеется 24функций, а не 10. Какова магия в этих числах.Вот мой код JavaScript:

`<script>
    var memory = new WebAssembly.Memory({ initial: 256, maximum: 256});
    let exports = null;
    const importObject = {
        env: {
            table: new WebAssembly.Table({ initial: 10, maximum:10, element: 'anyfunc' }),
            __table_base: 0,
            memory: memory,
            __memory_base: 0,
            DYNAMICTOP_PTR: 0,
            tempDoublePtr: 0,
            abortStackOverflow: () => { throw new Error('overflow'); },
            abort: function () { },
            _abort: function(){},
            _getenv: function(){},
            enlargeMemory: function () { },
            getTotalMemory: function () { },
            abortOnCannotGrowMemory: function () { },
            nullFunc_ii: function () { },
            nullFunc_iii: function () { },
            nullFunc_iiii: function () { },
            ___lock: function () { },
            ___setErrNo: function () { },
            ___syscall140: function () { },
            ___syscall146: function () { },
            ___syscall54: function () { },
            ___syscall6: function () { },
            ___unlock: function () { },
            _emscripten_memcpy_big: function () { },
            _emscripten_get_heap_size: function(){},
            _emscripten_resize_heap: function(){},
            STACKTOP: 0,
            STACK_MAX: memory.buffer.byteLength
        },
        global: {
            NaN: NaN,
            Infinity: Infinity
        }
    };
    var res;
    async function init() {
        const wa = await createWebAssembly('json_parser.wasm', importObject);
        let exports = wa.instance.exports;
        res = exports._parse_json();
        console.log(res);
    }
    init();

    async function createWebAssembly(path, importObject) {
        const result = await window.fetch(path);
        const bytes = await result.arrayBuffer();
        return WebAssembly.instantiate(bytes, importObject);
    }
</script>`

Это мой код C

`#include <emscripten.h>   
 #include "mjson.h"

 #define MAXCHANNELS 72

 static bool usedflags[MAXCHANNELS];
 static int PRN[MAXCHANNELS];
 static int elevation[MAXCHANNELS];
 static int azimuth[MAXCHANNELS]; 
 static int visible;

const struct json_attr_t sat_attrs[] = {
{"PRN",     t_integer, .addr.integer = PRN},
{"el",      t_integer, .addr.integer = elevation},
{"az",      t_integer, .addr.integer = azimuth},
{"used",    t_boolean, .addr.boolean = usedflags},
{NULL},
};

const struct json_attr_t json_attrs_sky[] = {
{"class",      t_check,   .dflt.check = "SKY"},
{"satellites", t_array,   .addr.array.element_type = t_object,
                          .addr.array.arr.objects.subtype=sat_attrs,
                          .addr.array.maxlen = MAXCHANNELS,
                          .addr.array.count = &visible},
{NULL},
};

EMSCRIPTEN_KEEPALIVE int parse_json()
{
int i, status = 0;
char js_str[] = "{\"class\":\"SKY\",\"satellites\":"
          "[{\"PRN\":10,\"el\":45,\"az\":196,\"used\":true},"
           "{\"PRN\":29,\"el\":67,\"az\":310,\"used\":true}]}";
status = json_read_object(js_str, json_attrs_sky, NULL);
return PRN[1];
}`

Как мне скомпилировать код C

emcc -s WASM = 1 json_parser.c mjson.c -o json_parser.js

Этой библиотеки было недостаточно для моих целей, и я переключился на библиотеку nloahmann / json C ++.Все прошло нормально, но опять выдает вторую ошибку.Мое предположение заключается в следующем: что представляет собой этот номер для начального и как я могу его правильно установить?
Мой firefox версии 65.0.1 64-разрядный и версия emscripten 1.38.28

...