12.34? В какой момент и на основе чего оно приводит всё к числам с плавающей точкой?
Ну то есть, там по идее будет опкод BINARY_ADD
ну так один флоат. значит надо все в флоат
На каком этапе? (: К моменту разбора байт-кода, первый агрумент уже приведён к float'у?
ну ебать ты решил углубиться
Мне интересно нутро, да.
братек я с тобой, я теперь тоже заинтересовался
Я вот немношк непонял: >>> 12302 + 23406.0 OpCode LOAD_GLOBAL 0 | 1 LOAD_GLOBAL 0 | 1: 'codecs' => <module 'codecs' from '/home/dbukanov/code/my/cpython/Lib/codecs.pyc'> (global) OpCode LOAD_ATTR 1 | 4 OpCode LOAD_FAST 0 | 7 OpCode LOAD_FAST 1 | 10 OpCode LOAD_GLOBAL 2 | 13 OpCode CALL_FUNCTION 3 | 16 CALL_FUNCTION 3 | 16:, True, 'strict', <read-only buffer ptr 0x560202f5b3e0, size 16 at 0x7f212b99c7b0>, <built-in function utf_8_decode>) -> (u'12302 + 23406.0\n', 16) [16] OpCode RETURN_VALUE | 19 OpCode LOAD_CONST 3 | 1 LOAD_CONST 3 | 1: 35708.0 OpCode PRINT_EXPR | 4 35708.0
В какой программе дизассемблировал?
Добавил отладочный вывод в CPython
Как это делается?
Берёшь сорцы CPython, правишь, собираешь, запускаешь.
Понятно. Я думал можно опцию добавить при вызове python в интерактивном режиме.
Про это я знаю, пользуюсь постоянно.
Так-то у него есть некоторый дебаг, но мне мало было
Люблю заглянуть под капот, чтобы посмотреть, как всё работает :). Ещё постоянно дебажу CPython с помощью gdb.
Возникает вопрос - "как складывается 12 + 5.7?", включаешь gdb и смотришь. 😎
Для вывода опкодов достаточно поправить TARGET-макросы, которые используются в свитче в PyEval_EvalFrameEx
А почему не dis модуль?
Потому что он только мнемоники выводит, но не показывает, что за ними скрывается + он не рекурсивен же. Т.е. CALL_FUNCTION будет просто CALL_FUNCTION
Интересно, надо попробовать. Здесь надо менять? Это где-то описано или ты сам придумал? P. S. Я пользуюсь таким скриптиком для дизассемблирования модуля.
Похоже на то, я на 2.7 эксперементировал
А что там надо добавить, можешь скопировать?
Что-то в духе printf("OpCode %s\n", #op);\ после op: \
Обсуждают сегодня