View Issue Details

IDProjectCategoryView StatusLast Update
0003511Wishes.PluginsLuaMacro / Macro Browserpublic2020-05-23 14:14
ReporterJohnDoe Assigned Toshmuel  
PrioritynormalSeverityminorReproducibilityN/A
Status assignedResolutionopen 
Platformx86OSWindowsOS VersionXP SP3
Product Version3.0 
Summary0003511: attempt to yield across C-call boundary: указывать источник
DescriptionВ настоящий момент ошибка отображается так:

C:\Apps\Far3\Plugins\LuaMacro\luamacro.lua:83: attempt to yield across C-call boundary

Т.е. указывает на место определения функции.
Вместо этого хотелось бы видеть место вызова в пользовательском скрипте.

TagsNo tags attached.

Activities

shmuel

2020-05-20 19:17

developer   bugnote:0016846

Желательно привести пример для воспроизведения.

JohnDoe

2020-05-21 07:30

updater   bugnote:0016848


Event { description="https://bugs.farmanager.com/view.php?id=3511";
  group="ExitFAR";
  action=function()
    mf.print("12345");
  end;
}

shmuel

2020-05-21 13:31

developer   bugnote:0016849

LuaMacro b749.

JohnDoe

2020-05-23 09:53

updater   bugnote:0016850

Last edited: 2020-05-23 10:59

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

Т.е. в идеале сообщение должно сразу указывать на ошибочное место в пользовательском коде.
Реализовано может быть примерно так:

if msg=="attempt to yield across C-call boundary" then
  local level = 1
  local func
  while true do
    local info = debug.getinfo(level)
    if not info then level = nil; break end
    if info.what == "Lua" and not info.src:match('^@'..module_path) then
      msg = ("'%s' function is forbidden in this context, see docs for more info"):format(func)
      break
    end
    func = info.name 
    level = level+1
  end
end
traceback =  debug.traceback(msg,level)

Но если подобного не планируется, тогда можно закрывать

shmuel

2020-05-23 10:22

developer   bugnote:0016851

1. Насчёт неопытных пользователей: если сами пишут макросы - разберутся, если используют чужие, то подобная ошибка маловероятна. В крайнем случае спросят в форуме.

2. В вашем примере после "==" сразу следует "then", поэтому проверить его не смог.

3. В utils.lua на строке 682 есть debug.traceback(msg,2)
Если заменить 2 на 3, то строка пользовательского скрипта поднимется на уровень выше в сообщении. Но тогда из сообщения исчезнет строка о том, что ошибка произошла в функции print. На мой взгляд, это важно, поскольку строка пользовательского скрипта может быть очень длинная, и в этом случае причина ошибки будет неочевидной.

JohnDoe

2020-05-23 10:59

updater   bugnote:0016852

> 2. В вашем примере после "==" сразу следует "then", поэтому проверить его не смог.

Пример только для иллюстрации принципа.
Как минимум там ещё и module_path не определён.

> Но тогда из сообщения исчезнет строка о том, что ошибка произошла в функции print.

Согласен что это важно.
Изменил пример так чтобы имя функции попадало в сообщение.
Могу довести до рабочего состояния и отладить если это актуально.

shmuel

2020-05-23 11:05

developer   bugnote:0016853

@JohnDoe, вижу, что код исправлен, пробовать уже не буду, так как идея понятна.
Мне бы не хотелось добавлять такие куски кода для дополнительной обработки ошибок.
Согласитесь, что как оно есть сейчас, пусть не идеально, но вся необходимая информация в сообщении присутствует.

JohnDoe

2020-05-23 11:30

updater   bugnote:0016854

Спорить не буду, проблемы особой нет, особенно для опытного пользователя.
Тем более есть 2387 и 2416.

> 3. В utils.lua на строке 682 есть debug.traceback(msg,2)

А в luamacro.lua:224 (FixReturn) стек выводится с первого уровня.
Полагаю, что всё-таки должно быть консистентно.

shmuel

2020-05-23 11:52

developer   bugnote:0016855

А в luamacro.lua:224 (FixReturn) стек выводится с первого уровня.
Полагаю, что всё-таки должно быть консистентно.

JohnDoe
Там всё получается нормально без лишних телодвижений, а в случае, который мы рассматриваем, не получается.
Для достижения консистентности нужно усложнение кода. Для меня это минус, перевешивающий консистентность в данном вопросе.

JohnDoe

2020-05-23 12:14

updater   bugnote:0016856

> Для достижения консистентности нужно усложнение кода.

Если ни в каком из 2х случаев не обрезать трейсбэк, то будет консистентно.

shmuel

2020-05-23 12:21

developer   bugnote:0016857

Если ни в каком из 2х случаев не обрезать трейсбэк, то будет консистентно.

JohnDoe
Затрудняюсь понять к чему вы стремитесь.
Консистентность внутренняя, в коде, мало кого интересует.
Если не обрезать трейсбэк, строка пользовательского кода опустится в сообщении ещё больше, а вы ведь хотели её поднимать...

ОК, дискуссию на этом пока прекращаю.
Если вы согласны на закрытие тикета - закрою, иначе пусть висит.

JohnDoe

2020-05-23 14:13

updater   bugnote:0016858

Last edited: 2020-05-23 14:14

Затрудняюсь понять к чему вы стремитесь.
Консистентность внутренняя, в коде, мало кого интересует.
Внутренняя меня тоже не слишком интересует.
Под неконсистентостью я имею ввиду, что сообщения об ошибках имеют разный вид, в зависимости от места возникновения (в ExitFAR отличается от прочих мест)

Если не обрезать трейсбэк, строка пользовательского кода опустится в сообщении ещё больше,
Если обрезать - то одинаково.

Пример.

Event {
  group="ExitFAR";
  action=function()
    mf.print("12345")
  end;
}

Event {
  group="ViewerEvent";
  condition=function(_,e)
    return e == far.Flags.VE_READ
  end;
  action=function()
    mf.print("12345")
  end;
}
В обоих случаях логично видеть однотипные сообщения.

Issue History

Date Modified Username Field Change
2017-10-01 00:37 JohnDoe New Issue
2020-05-20 19:17 shmuel Note Added: 0016846
2020-05-21 07:30 JohnDoe Note Added: 0016848
2020-05-21 13:31 shmuel Assigned To => shmuel
2020-05-21 13:31 shmuel Status new => feedback
2020-05-21 13:31 shmuel Note Added: 0016849
2020-05-23 09:53 JohnDoe Note Added: 0016850
2020-05-23 09:53 JohnDoe Status feedback => assigned
2020-05-23 09:54 JohnDoe Note Edited: 0016850
2020-05-23 10:12 JohnDoe Note Edited: 0016850
2020-05-23 10:13 JohnDoe Note Edited: 0016850
2020-05-23 10:22 shmuel Note Added: 0016851
2020-05-23 10:56 JohnDoe Note Edited: 0016850
2020-05-23 10:59 JohnDoe Note Added: 0016852
2020-05-23 10:59 JohnDoe Note Edited: 0016850
2020-05-23 11:05 shmuel Note Added: 0016853
2020-05-23 11:30 JohnDoe Note Added: 0016854
2020-05-23 11:52 shmuel Note Added: 0016855
2020-05-23 12:14 JohnDoe Note Added: 0016856
2020-05-23 12:21 shmuel Note Added: 0016857
2020-05-23 14:13 JohnDoe Note Added: 0016858
2020-05-23 14:14 JohnDoe Note Edited: 0016858