[Moscow.pm] get own source code

Maxim Vuets maxim.vuets на gmail.com
Вс Мар 29 11:05:37 PDT 2015


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());
        }

Вы какую задачу решить пытаетесь-то?


Подробная информация о списке рассылки Moscow-pm