bug_ref_fn
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| bug_ref_fn [2025/12/14 03:28] – snegovick | bug_ref_fn [2025/12/15 11:29] (текущий) – [Workaround] snegovick | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | Эта страница посвящена поиску бага связанного с вызовом функции init в произвольном модуле из модуля, | + | Эта страница посвящена поиску бага связанного с вызовом функции init в произвольном модуле из другого |
| - | '' | + | [[https:// |
| + | |||
| + | ====== Описание ====== | ||
| + | |||
| + | В коде приведённом ниже есть есть функции empty и init. В init производится попытка вызова функции init из модуля echo (как это происходит в шелле). В случае если раскоментирован блок | ||
| + | < | ||
| + | #fp:= empty; | ||
| + | </ | ||
| + | |||
| + | или любой из if (0) включен, | ||
| + | < | ||
| + | link typecheck Echo-> | ||
| + | echo: link typecheck Echo-> | ||
| + | </ | ||
| + | |||
| + | Очевидно, | ||
| + | |||
| + | < | ||
| + | implement Sh93; | ||
| include " | include " | ||
| Строка 23: | Строка 41: | ||
| init(ctxt: ref Draw-> | init(ctxt: ref Draw-> | ||
| { | { | ||
| - | sys = load Sys Sys-> | + | |
| + | |||
| + | #fp:= empty; | ||
| if (0) | if (0) | ||
| Строка 32: | Строка 52: | ||
| } | } | ||
| - | file := " | + | |
| args : list of string; | args : list of string; | ||
| args = " | args = " | ||
| args = " | args = " | ||
| - | + | | |
| - | c := load Sh93 file; | + | c := load Sh93 file; |
| - | if(c == nil) { | + | if(c == nil) { |
| - | err := sys-> | + | err := sys-> |
| - | if(err != " | + | if(err != " |
| - | c = load Sh93 "/ | + | c = load Sh93 "/ |
| - | if(c == nil) { | + | if(c == nil) { |
| - | err = sys-> | + | err = sys-> |
| } | } | ||
| - | } | ||
| - | if(c == nil) { | ||
| - | sys-> | ||
| - | return; | ||
| } | } | ||
| - | } | + | if(c == nil) { |
| + | sys-> | ||
| + | return; | ||
| + | } | ||
| + | | ||
| | | ||
| - | c-> | + | |
| if (0) | if (0) | ||
| Строка 62: | Строка 82: | ||
| } | } | ||
| } | } | ||
| - | '' | + | </ |
| + | |||
| + | ====== Workaround ====== | ||
| + | |||
| + | Добавление проблемной функции в объявление модуля помогает решить проблему: | ||
| + | |||
| + | < | ||
| + | Sh93: module | ||
| + | { | ||
| + | init: fn(ctxt: ref Draw-> | ||
| + | empty: fn(); | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | Lets check libinterp/ | ||
| + | [ for(l = m->ext; l->name; l++)](https:// | ||
| + | iterates over init and empty. | ||
| + | |||
| + | When you add empty to module definition explicitly, then this loop only makes single iteration with init. | ||
| + | |||
| + | Limbo does not have anonymous functions (lambdas) as far as I know, so this issue just leads to inconvenience of declaration of functions you normally would prefer not to declare. | ||
bug_ref_fn.1765682916.txt.gz · Последнее изменение: — snegovick
