Debug function name

Страницы: 1
RSS
Debug function name
 
В версии 8.8 наблюдаю странную вещь.

в одних местах скрипта debug.getinfo(1) выдает таблицу , в которой есть поле name,

а других местах в получаемой таблице этого поля нет. Остальные поля вроде на месте.

вызов идёт из луа, си функций в последовательности вызова нет.

что может быть тому причиной?
 
Анонимная функция
 
Цитата
Старатель написал:
Анонимная функция
Нет. Анонимные функции помечаются явным образом, это видно.
 
Предположу, что в одних местах функция вызвана "посередине", а в других происходит tail call, в этом случае уровень 1 заглядывает на функцию выше и, соответственно, локальных имен вызывающей функции не видит.
 
Цитата
Anton написал:
Предположу, что в одних местах функция вызвана "посередине", а в других происходит tail call, в этом случае уровень 1 заглядывает на функцию выше и, соответственно, локальных имен вызывающей функции не видит.
ничего не понял. Посередине - это как? Между левой и правой штаниной?))
 
Цитата
s_mike@rambler.ru написал:
это как?
Это не tail call, обычный вызов функции.
 
Однако, все украдено до нас.
 
Цитата
Anton написал:
Цитата
   s_mike@rambler.ru написал:
это как?
Это не tail call, обычный вызов
Антон, tail call обязательно фигурирует в списке вложенности. Вы это можете легко проверить.

речь идёт не о стеке вызовов, тут все правильно. Речь идёт о том, что в getinfo по функции иногда не фигурирует ее название. Хотя вся остальная информация верна, трассировка вызовов правильная.

в предыдущих версиях терминала я этого ни разу не замечал, хотя пользуюсь этим механизмом для отладки много лет. В 8.7 тоже было все нормально , а вот в 8.8 - нате вам.

может, причуды галактической пыли, может, у меня резкость пропала, а может и нога попала в колесо у разработчиков.
 
Цитата
s_mike@rambler.ru написал:
в getinfo по функции иногда не фигурирует ее название
По ссылке выше как раз ответ, если функция вызвана через pcall, дебаггер ее имя не найдет. От себя добавлю, что в квике все колбеки вызываются через pcall, инфа сотка.
 
Цитата
Anton написал:
Цитата
   s_mike@rambler.ru написал:
в getinfo по функции иногда не фигурирует ее название
По ссылке выше как раз ответ, если функция вызвана через pcall, дебаггер ее имя не найдет. От себя добавлю, что в квике все колбеки вызываются через pcall, инфа сотка.
то есть я не смогу получить ни одно название функции, вызванной в колбеке или предопределенной функции индикатора?

это утверждение опровергается практикой. Инфа сотка стопудово )
 
Цитата
s_mike@rambler.ru написал:
то есть я не смогу получить ни одно название функции, вызванной в колбеке или предопределенной функции индикатора?
Не так, имя самого колбека только.
 
Поверим теорию практикой
Код
local run = true

function main()
   local t = debug.getinfo(1)
   message('main name is ' .. (t.name or 'nil'))
   while run do
      sleep(100)
   end
end

function OnStop()
   local t = debug.getinfo(1)
   message('OnStop name is ' .. (t.name or 'nil'))
   local function inner()
      local t = debug.getinfo(1)
      message('OnStop::inner name is ' .. (t.name or 'nil'))
   end
   inner()
   run = false
end
 
И что получается, чтобы не повторять уже вами сделанное?

и если не трудно, вызовите из onstop внешнюю локальную и внешнюю глобальную функции. Покажут ли они свое имя?
 
Получается имена мейна и онстопа - нил, имя вложенной функции находит правильно. Как теория и предполагала. С внешними и с SearchItems до кучи, чтобы два раза не вставать, результаты в комментариях

Код
local run = true

function comparator(lhs, rhs)
   local t = debug.getinfo(1)
   message('comparator name is ' .. (t.name or 'nil'))
   return true
end

local function local_comparator(lhs, rhs)
   local t = debug.getinfo(1)
   message('local_comparator name is ' .. (t.name or 'nil'))
   return true
end

function main()
   while run do
      sleep(100)
   end
end

function OnStop()
   local function very_local_comparator(lhs, rhs)
      local t = debug.getinfo(1)
      message('very_local_comparator name is ' .. (t.name or 'nil'))
      return true
   end
   comparator(1, 2) -- MSG: comparator
   local_comparator(1, 2) -- MSG: local_comparator
   very_local_comparator(1, 2) -- MSG: very_local_comparator
   SearchItems('all_trades', 0, 1, comparator) -- MSG: nil
   SearchItems('all_trades', 0, 1, local_comparator) -- MSG: nil
   SearchItems('all_trades', 0, 1, very_local_comparator) -- MSG: nil
   run = false
end
 
Чем дальше в лес, тем злее партизаны )

разобрались , Антон, спасибо за участие.
Страницы: 1
Читают тему (гостей: 1)
Наверх