У меня есть процедура C, переданная в Javascript через Emscripten emterpreter , который вызывает emscripten_sleep_with_yield()
. В то время как это дает, я хотел бы запустить некоторый не -представленный C-код в асинхронных обратных вызовах. Когда я пытаюсь это сделать, появляется сообщение об ошибке:
"Эта ошибка произошла во время асинхронного сохранения или загрузки стека в emterpreter. Был ли в стеке незаполненный код во время сохранения (что не разрешено)?"
В абстрактном смысле, я не уверен, почему возникнет какая-либо проблема с вызовами неэкспертного кода во время загрузки или сохранения стека - это на самом деле не на запрашиваемом стеке быть сохраненным.
Мотивация этого неопубликованного кода заключается в обновлении некоторых структур, видимых для полученной процедуры. Я обнаружил, что технически возможно для простого JavaScript в обратных вызовах, чтобы добиться влияния, выполнив setValue()
в куче emscripten. Но делать манипуляции с C через JavaScript неудобно, особенно потому, что многие подпрограммы, такие как AllocateUTF8()
call _malloc()
под капотом ... и те имеют ту же проблему.
Вот простой пример, который показывает проблему. Есть ли способ обойти это ... например. где-то хранить переменные состояния загрузки / сохранения, пока выполняется неопубликованный вызов, а затем вернуть их обратно ??
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Plain call during Emterpreter Stack Load</title>
<script src="test.o.js"></script>
<script>
Module.onRuntimeInitialized = function() {
setTimeout(function () {
console.log("calling not_emterpreted()");
_not_emterpreted();
}, 0);
_emterpreted_yielder();
console.log("yielding...");
}
</script>
</head>
<body></body>
</html>
test.c
#include <stdio.h>
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE void emterpreted_yielder() {
while (1) {
printf("emterpreted_yielder() sleeping...\n");
emscripten_sleep_with_yield(1000);
}
}
EMSCRIPTEN_KEEPALIVE void not_emterpreted() {
printf("Entering not_emterpreted()\n");
}
Сборка с:
emcc test.c -o test.o.js -s EMTERPRETIFY = 1 -s EMTERPRETIFY_ASYNC = 1 -s EMTERPRETIFY_BLACKLIST = "['_ not_emterpreted']"
Комментирование вызова not_emterpreted()
в html приведет к выполнению цикла ожидания, как и следовало ожидать. И, как я уже сказал, в этот момент вы можете вместо этого оказывать влияние C как необработанные инструкции JavaScript на кучу emterpreter. Но ... разве это не то, что не-эмтерпретированный emscripten C ?? : - /