Задать вопрос
@aselockd

Почему возникает данная ошибка?

[Nightmare aka Aselock, Jade.|2|STEAM_0:1:42403155] Lua Error:

[glua-stock] addons/glua-stock/moon/modules/functions/networkmaterial.moon:35: attempt to yield across C-call boundary
1. yield - [C]:-1
2. run - addons/glua-stock/moon/modules/functions/networkmaterial.moon:35
3. run - addons/glua-stock/moon/autorun/shared.moon:155
4. include - addons/glua-stock/moon/autorun/shared.moon:155
5. run - addons/glua-stock/moon/modules/z-manifest.moon:18
6. include - addons/glua-stock/moon/autorun/shared.moon:155
7. unknown - addons/glua-stock/moon/autorun/shared.moon:180
8. RunString - [C]:-1
9. unknown - RunString(Ex):8195


У меня получается такой порядок действий, загружается серверное ядро которое инициализирует клиентский загрузчик ядра в котором есть вызов функции coroutine.yield который необходим в качестве стопора для загрузчика сторонней библиотеки по http протоколу. Вопрос, если я на клиенте, а вот клиентский код загрузчика ядра

module('moonscript_client_core', package.seeall)
client_core_payload = util.JSONToTable(util.Base64Decode([[#{json_table}]]))


local function gmod_run_thread_function (thread, onerror) 
    local function func() 
        status, message = pcall(thread)
        if status then
            timer.Simple(0.1, func)
            return
        else
            if message ~= nil and message ~= "cannot resume dead coroutine" then
                if not onerror then
                    error(message)
                else
                    return onerror(message)
                end
            end
        end
    end
    timer.Simple(0, func)
end


for i, path_t in pairs(client_core_payload.autorun_linear) do
    _G.__running_c_path = path_t.path
    --RunString(path_t.data, path_t.path)

    gmod_run_thread_function(coroutine.wrap(function()
        print("Run in thread", path_t.path)
        RunString(path_t.data, path_t.path)
    end), error)

end
_G.__running_c_path = nil
--_G.__running_c_path, client_core_payload = nil, nil


вызываю RunString в сопрограмме, а т.е. в процедуре сопрограммы то тогда данный код должен быть валидным и не должен вызывать ошибки, но ошибка возникает, почему?

do
    flag = nil 
    resources.http_run_code "https://raw.githubusercontent.com/vega0/gmod-imageutils/master/lua/includes/modules/imgparse.lua", (code) ->
        flag = true
        code\gsub "AddCSLuaFile%(%)", '' if SERVER

        code

        --

    while not flag
        coroutine.yield!
  • Вопрос задан
  • 24 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
HabrSpar
@HabrSpar
C++/Lua разработчик, наставник в Яндекс.Практикум
Корутины не работают сквозь C функции. Попробуйте CompileString вместо runstring
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы