Обновление программы в CompUnit :: PrecompilationStore? - PullRequest
0 голосов
/ 12 декабря 2018

Я работаю с документами, скомпилированными Rakudo Perl, и документы могут обновляться.
Я храню документы в CompUnit :: PrecompilationStore :: File

Как изменить более старую версию дляnewer one?

Следующая программа выдает тот же вывод, как если бы более новая версия не сохранялась в 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-воскресший "определяется.На выходе нет изменений.

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Как уже упоминалось ранее 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

0 голосов
/ 12 декабря 2018

Я думаю, что ответ может быть в ответе на другой, аналогичный ваш вопрос здесь В общем, CompUnits предназначены для неизменяемыми .Если объект меняется, цель тоже должна измениться.Как говорит @ugexe,

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

Так что вы можетена самом деле нужно искать поведение, похожее на предварительную компиляцию, но вы можете не захотеть использовать для этого настоящие CompUnits.

...