[Moscow.pm] get own source code
PEF Secure
pef-secure на yandex.ru
Вс Мар 29 13:22:03 PDT 2015
On Sunday, March 29, 2015 20:05:37 Maxim Vuets wrote:
> 2015-03-28 17:07 GMT+01:00 PEF Secure <pef-secure на yandex.ru>:
>
> > Хочется получить собственный исполняемый код, который виден
> > интерпретатору.
Нужен буквальный код, на который ссылается
> > интерпретатор, когда говорит "такая то ошибка в такой то строке". Дело не
> > решается чтением исходного кода соответствующего файла с диска, поскольку
> > речь идёт о "фильтрованном" коде.
>
> Это невозможно в чистом виде. Интерпретатор не выполняет текст
> программы. Он прежде компилирует её в специальное внутренне
> представление. Если вы компилируете код на лету, или модифицируете
> программу во время исполнения, то и "буквального кода" у вас нет.
Я знаю. Но в скомпилированном коде есть ссылки на номера строк, откуда он
взялся.
> Можно попробовать декомпилировать внутренне представление братно в
> текст программы. Но он будет достаточно приблеженным и не обязательно
> удобно-читаемым. Вот вам привет для вдохновления:
>
> $ perl -MB::Deparse -E 'my $f = eval "sub {shift() + shift()}"; #
> компилируем строку во время исполнения \
> say $f->(2, 3); # проверяем \
> my $d = B::Deparse->new; say $d->coderef2text($f); # декомпилируем'
> 5
> {
> use feature 'current_sub', 'evalbytes', 'fc', 'say',
> 'state', 'switch', 'unicode_strings', 'unicode_eval';
> (shift()) + (shift());
> }
Да, про B::Deparse я уже думал. Возможно его можно применить, если всё-таки
получить доступн к внутреннему представлению конкретной строки. Надо будет
посмотреть снова.
> Вы какую задачу решить пытаетесь-то?
Восстановить текст после Filter::Simple.
--
PEF Developer
Подробная информация о списке рассылки Moscow-pm