Обновление программы в CompUnit::PrecompilationStore?
Я работаю с документами, составленными Rakudo Perl, и эти документы могут быть обновлены.
Я храню документы в CompUnit:: PrecompilationStore:: File
Как поменять старую версию на более новую?
Следующая программа выдает тот же вывод, как если бы новая версия не сохранялась в CompUnit. Что я делаю неправильно?
use v6.c;
use nqp;
'cache'.IO.unlink if 'cache'.IO ~~ e;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');
'test.pod6'.IO.spurt(q:to/--END--/);
=begin pod
=TITLE More and more
Some text
=end pod
--END--
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load( $key )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected.contents[1].contents[0];
'test.pod6'.IO.spurt(q:to/--END--/);
=begin pod
=TITLE More and more
Some more text added
=end pod
--END--
# $precomp-store.unlock;
# fails with:
# Attempt to unlock mutex by thread not holding it
# in block <unit> at comp-test.p6 line 30
$precomp.precompile('test.pod6'.IO, $key, :force);
my $new-handle = $precomp.load($key)[0];
my $new-resurrected = nqp::atkey($new-handle.unit,'$=pod')[0];
say $new-resurrected.contents[1].contents[0];
Выход всегда:
Some text
Some text
Обновление: у моего исходного вопроса было "$ handle", а не "$ new-handle", где определено "$ new-resurrected". Нет изменений в выводе.
2 ответа
Я думаю, что ответ может быть в ответе на другой, подобный ваш вопрос здесь. В общем, CompUnits предназначены для неизменяемости. Если объект меняется, цель тоже должна измениться. Как говорит @ugexe,
$key
предназначен для представления неизменного имени, так что оно всегда будет указывать на одно и то же содержимое.
Таким образом, вы, возможно, на самом деле искали поведение, похожее на предкомпьютер, но вам может не понадобиться использовать фактические CompUnits для этого.
Как уже упоминалось ранее load
кеш методов, а не вызов метода precomp
, Вы ожидаете параметр :force
к методу precompile
повлиять на последующий вызов метода load
- это неправильно. Мы можем легко доказать, что :force
работает, как и ожидалось, для предварительной компиляции, пропуская первый вызов load
и посмотреть, если последний звонок load
показывает обновленные результаты:
use v6.c;
use nqp;
'cache'.IO.unlink if 'cache'.IO ~~ e;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');
'test.pod6'.IO.spurt(q:to/--END--/);
=begin pod
=TITLE More and more
Some text
=end pod
--END--
$precomp.precompile('test.pod6'.IO, $key, :force);
'test.pod6'.IO.spurt(q:to/--END--/);
=begin pod
=TITLE More and more
Some more text added
=end pod
--END--
# $precomp-store.unlock;
# fails with:
# Attempt to unlock mutex by thread not holding it
# in block <unit> at comp-test.p6 line 30
$precomp.precompile('test.pod6'.IO, $key, :force);
my $new-handle = $precomp.load($key)[0];
my $new-resurrected = nqp::atkey($new-handle.unit,'$=pod')[0];
say $new-resurrected.contents[1].contents[0];
который дает: Some more text added