Войти
ПрограммированиеФорумОбщее

LUA трассировка скрипта

#0
10:56, 9 сен. 2010

Добрый день.
Вот мой бред:

//инициализация луы
LuaHead = lua_open();
luaL_openlibs(LuaHead);
lua_sethook (LuaHead, HookF, LUA_MASKCALL|LUA_MASKRET|LUA_MASKLINE, 0);
PushFunction(Mess, "Mess");  
PushFunction(wait, "wait");  

//Описываем Хук
void HookF(lua_State *L, lua_Debug *ar)
{
  switch(ar->event)
  {
    case LUA_HOOKCALL:break;
    case LUA_HOOKTAILRET:break;
    case LUA_HOOKLINE:
      {
        HookLine(L, ar);
        break;
      }
    case LUA_HOOKCOUNT:break;
    case LUA_HOOKRET:break;
  }
};
//Обработчик новой линии
void HookLine(lua_State *L, lua_Debug *ar)
{
  (тут идет условие, попадание в току останова)
    StopScript();
};

//этим я хочу остановить выполнение скрипта.
void StopScript(void)
{
        lua_getglobal(LuaHead ,"wait");
  lua_call(LuaHead ,0,1);
  lua_setglobal(LuaHead ,"a");
};
//Этим я потом хочу продолжить выполнение скрипта
void RunScript(void)
{
  Result = lua_resume(LuaHead ,0);
  if ((Result!=LUA_YIELD)&&(Result!=0))
  {
    //ощибка скрипта
    MessageBox(NULL,"","Ошибка скрипта",MB_OK);
  }
};
  
static int wait(lua_State *L) 
{  
    return lua_yield(L,0);  
}  
//ну и 
//вызов скрипта
int i = luaL_dostring(LuaHead , Text.c_str());
где скрипт равен:
function f()
    Mess("Hello");
end;
function a()
  f();
end;
function l()
  a();
end;

l();

luaL_dostring возвращает ошибку "attempt to yeld across metamethod/C - call boundary".

Что я делаю не так? почему у меня не работает?


#1
13:12, 9 сен. 2010

Твой код можно узнавать по точка запятая в конце определения каждой функции )))

#2
13:25, 9 сен. 2010

1. хм... у тебя же основная нить и ты пытаешься ее остановить. попробуй просто вывести сообщение при хуке
2. попробуй в StopScript сделать просто lua_yield(L,0);, хотя не факт что это поможет) по крайней мере будет ясно, в чем дело - со стороны lua или в потоках

#3
13:46, 9 сен. 2010

1. туда заходит, и попадает ar->currentline у меня показывает на текущую линию на которой я хочу остановиться.
2. сделал ошибка "[string "function f()..."]:4 attempt to yeld across metamethod/C - call boundary"


п.с.  точка останова находится на строке "f();"

п.п.с.  ставил на строку "a();" та же история

#4
14:17, 9 сен. 2010

тогда попробуй сделать нить (lua_newthread), и уже ее останавливай, запускай (и скрипт запусти в ней)

ПрограммированиеФорумОбщее

Тема в архиве.