StranikS_Scan 4,210 #321673 Posted March 29, 2016 (edited) Вожусь с последними недоработками ункомпил6, их осталось две. Сейчас правлю первую. Это файл res_bw\scripts\common\lib\idlelib\pyparse.pyc. В нем есть функция, на которой крашится ункомпил2 и ункпомил6. Причину я нашел. Это конструкция while else. Причем именно код в else Я создал пример правильного кода, он повторяет по структуре код в "больной" функции - это два вложенных цикла, причем внутренний цикл имеет "больной" else-блок. Вот пример правильного по структуре кода!: | 1 0 SETUP_LOOP [78 50 00] 80 (to 83) ВНЕШНИЙ ЦИКЛ | >> 3 | LOAD_NAME [65 00 00] 0 (a) НАЧАЛО ТЕЛА ВНЕШНЕГО ЦИКЛА | 6 | LOAD_CONST [64 00 00] 0 (1) | 9 | COMPARE_OP [6B 00 00] 0 (<) | 12 | POP_JUMP_IF_FALSE [72 52 00] 82 | 2 15 | · LOAD_CONST [64 00 00] 0 (1) | 18 | · STORE_NAME [5A 00 00] 0 (a) | 3 21 | · SETUP_LOOP [78 37 00] 55 (to 79) ВНУТРЕННИЙ ЦИКЛ | >> 24 | · | LOAD_NAME [65 00 00] 0 (a) НАЧАЛО ТЕЛА ЦИКЛА | 27 | · | LOAD_CONST [64 01 00] 1 (2) | 30 | · | COMPARE_OP [6B 00 00] 0 (<) | 33 | · | POP_JUMP_IF_FALSE [72 30 00] 48 | 4 36 | · | · LOAD_CONST [64 01 00] 1 (2) | 39 | · | · STORE_NAME [5A 00 00] 0 (a) | 5 42 | · | · JUMP_ABSOLUTE [71 18 00] 24 ВОЗВРАТ НА НАЧАЛО ВНУТРЕННЕГО ЦИКЛА (это сontinue) | 45 | · | · JUMP_ABSOLUTE [71 18 00] 24 | >> 48 | · | POP_BLOCK [57 -- --] ТЕЛО ЦИКЛА ЗАКОНЧИЛОСЬ | 7 49 | · | LOAD_NAME [65 01 00] 1 (g) НАЧАЛО ELSE-БЛОКА | 52 | · | LOAD_CONST [64 02 00] 2 (8) | 55 | · | COMPARE_OP [6B 00 00] 0 (<) | 58 | · | POP_JUMP_IF_FALSE [72 49 00] 73 | 8 61 | · | · LOAD_CONST [64 03 00] 3 (3) | 64 | · | · STORE_NAME [5A 01 00] 1 (g) | 9 67 | · | · JUMP_ABSOLUTE [71 03 00] 3 ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue) | 70 | · | · JUMP_FORWARD [6E 00 00] 0 (to 73) <--- ОБРАЩАЕМ ВНИМАНИЕ - ФОРВАРД ЕСТЬ!!! | 10 >> 73 | · | LOAD_CONST [64 01 00] 1 (2) | 76 | · | STORE_NAME [5A 02 00] 2 (f) ELSE-БЛОК ЗАКОНЧИЛСЯ | >> 79 | · JUMP_ABSOLUTE [71 03 00] 3 ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue) | >> 82 | POP_BLOCK [57 -- --] КОНЕЦ ТЕЛА ВНЕШНЕГО ЦИКЛА | >> 83 LOAD_CONST [64 04 00] 4 (None) | 86 RETURN_VALUE [53 -- --] А вот кусочек код из оригинальной функции, которая "больная" из файла pyparse.pyc: ........................... ........................... ........................... | 682 | · · | · COMPARE_OP [6B 02 00] 2 (==) ИДЕТ ТЕЛО ВНУТРЕННЕГО ЦИКЛА | 685 | · · | · POP_JUMP_IF_FALSE [72 BD 02] 701 | 291 688 | · · | · · LOAD_FAST [7C 04 00] 4 (lno) | 691 | · · | · · LOAD_CONST [64 01 00] 1 (1) | 694 | · · | · · BINARY_ADD [17 -- --] | 695 | · · | · · STORE_FAST [7D 04 00] 4 (lno) | 698 | · · | · · JUMP_FORWARD [6E 00 00] 0 (to 701) | 292 >> 701 | · · | · LOAD_FAST [7C 07 00] 7 (i) | 704 | · · | · LOAD_CONST [64 01 00] 1 (1) | 707 | · · | · BINARY_ADD [17 -- --] | 708 | · · | · STORE_FAST [7D 07 00] 7 (i) | 293 711 | · · | · JUMP_ABSOLUTE [71 E2 01] 482 ВОЗВРАТ НА НАЧАЛО ВНУТРЕННЕГО ЦИКЛА (это сontinue) | 714 | · · | · JUMP_ABSOLUTE [71 E2 01] 482 | 717 | · · | · JUMP_ABSOLUTE [71 E2 01] 482 | >> 720 | · · | POP_BLOCK [57 -- --] ТЕЛО ЦИКЛА ЗАКОНЧИЛОСЬ | 300 721 | · · | LOAD_FAST [7C 04 00] 4 (lno) НАЧАЛО ELSE-БЛОКА | 724 | · · | LOAD_CONST [64 01 00] 1 (1) | 727 | · · | BINARY_SUBTRACT [18 -- --] | 728 | · · | LOAD_FAST [7C 0B 00] 11 (firstlno) | 731 | · · | COMPARE_OP [6B 02 00] 2 (==) | 734 | · · | POP_JUMP_IF_FALSE [72 EA 02] 746 | 303 737 | · · | · LOAD_GLOBAL [74 0A 00] 10 (C_STRING_FIRST_LINE) | 740 | · · | · STORE_FAST [7D 02 00] 2 (continuation) | 743 | · · | · JUMP_ABSOLUTE [71 CD 00] 205 ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue) | 305 >> 746 | · · | LOAD_GLOBAL [74 0B 00] 11 (C_STRING_NEXT_LINES) ???? ГДЕ ФОРВАРД ??? | 749 | · · | STORE_FAST [7D 02 00] 2 (continuation) ELSE-БЛОК ЗАКОНЧИЛСЯ | 306 >> 752 | · · JUMP_ABSOLUTE [71 CD 00] 205 ВОЗВРАТ НА НАЧАЛО ВНЕШНЕГО ЦИКЛА (это сontinue) .......................... .......................... Обратите внимание, что в "больном" else-блоке почему-то отсутствует инструкция JUMP_FORWARD. Она вообще-то является элементом конструкции сравнения 731-734. Например вот так: if a<9: print 1 | 1 0 LOAD_NAME [65 00 00] 0 (a) | 3 LOAD_CONST [64 00 00] 0 (9) | 6 COMPARE_OP [6B 00 00] 0 (<) | 9 POP_JUMP_IF_FALSE [72 14 00] 20 | 2 12 · LOAD_CONST [64 01 00] 1 (1) | 15 · PRINT_ITEM [47 -- --] | 16 · PRINT_NEWLINE [48 -- --] | 17 · JUMP_FORWARD [6E 00 00] 0 (to 20) ПЕРЕХОД В ОСНОВНУЮ ВЕТКУ КОДА | >> 20 LOAD_CONST [64 02 00] 2 (None) | 23 RETURN_VALUE [53 -- --] И в первом моем примере, компилятор её вставил как положено. Однако в файле pyparse.pyc, что разбирается выше её почему нет?! Из-за этого декомпилятор впадает в ступор и не может осмыслить структуру кода. Вопрос в том, как так получилось и из-за чего. Это баг? Или это оптимизатор в компиляторе так сработал и выпнул её? Или это какая-то хитрая логика и я чего не допер? Короче пишите кто чего думает-знает. Edited March 29, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #321745 Posted March 29, 2016 (edited) есть одна мысль... Вот этот файл: PyParse.py Это крашит ункомпил: while 1:passНо это не крашит: while True:pass Edited March 29, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322008 Posted March 30, 2016 Залил в первый пост декомпилированный клиент 0.9.14. Сейчас мой ункомпил6 все файлы в нем декомпилирует кроме res_bw\scripts\common\lib\plat-mac\carbon\quicktime.pyc. Его пришлось в ункомпиле2 декомпилировать. Почему-то ункомпил6 вываливается с ошибкой. 1 Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #322029 Posted March 31, 2016 (edited) QuickTime.py Почти 3.5к строк кода в одном файле. Похоже подавился. Edited March 31, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322052 Posted March 31, 2016 (edited) Почти 3.5к строк кода в одном файле. Похоже подавился. Да вот беда вываливается именно на сборке кода, с ошибкой переполнения памяти. Причем алгоритм такой же как и в ункомпил2, но 2-ка почему-то нормально декомпилит этот файл, а 6-ка вываливается. Не могу понять в чем прикол. ............... ............... куча buildTree ............... <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 618, in buildTree <<< attr[i] = self.buildTree(sym, why[0], tokens, why[1]) <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 620, in buildTree <<< return self.rule2func[self.new2old[rule]](attr) <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 663, in <lambda> <<< self.buildASTNode(args, lhs) <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 674, in buildASTNode <<< return self.nonterminal(lhs, children) <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parser.py", line 56, in nonterminal <<< rv = GenericASTBuilder.nonterminal(self, nt, args) <<< File "C:\Program Files (x86)\Borland\Delphi6\Projects\PjOrion\dcpack\dcpack\uncompyle6\parsers\spark.py", line 681, in nonterminal <<< rv[:len(args)] = args <<< File "UserList", line 39, in __setslice__ <<< MemoryError: Stack overflow Файл UserList в Питоне: def __setslice__(self, i, j, other): i = max(i, 0); j = max(j, 0) if isinstance(other, UserList): <-------- ошибка тут!!! self.data[i:j] = other.data elif isinstance(other, type(self.data)): self.data[i:j] = other else: self.data[i:j] = list(other) Вот класс GenericASTBuilder в ункомпил6 - тыц. Вот он же в укомпил2 - тыц Ни какой разницы. Может проблема с деревьями. Криво генерируются, хз ((( Edited March 31, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #322144 Posted March 31, 2016 @StranikS_Scan, добавь пожалуйста больше горячих клавиш в Орион. Очень не хватает: Ctrl + D (дублировать строку) Ctrl + Del (удалить слово справа) Ctrl + Backspace (удалить слово слева) Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322150 Posted March 31, 2016 @StranikS_Scan, добавь пожалуйста больше горячих клавиш в Орион. Очень не хватает: Ctrl + D (дублировать строку) Ctrl + Del (удалить слово справа) Ctrl + Backspace (удалить слово слева) Ок. Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #322154 Posted March 31, 2016 Ок.Еще я заметил баг с подсветкой строки с ошибкой Орионом. Подсвечивается 47 строка, хотя ошибка в 49. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322155 Posted March 31, 2016 (edited) Еще я заметил баг с подсветкой строки с ошибкой Орионом. Снимок экрана (238).png Подсвечивается 47 строка, хотя ошибка в 49. Нашел причину. Edited March 31, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
KFC 3 #322210 Posted March 31, 2016 "Replace Spaces to Tabs" не работает с таким кодом def load(): m_list = [i.replace('\\', '/') for i in glob.iglob('%s/mods/*/' % wd)] for m_dir in m_list: if os.path.isdir(m_dir) and os.path.exists('%s/__init__.pyc' % m_dir): pass Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322211 Posted March 31, 2016 (edited) "Replace Spaces to Tabs" не работает с таким кодом Поправлю. Решил проблему с переполнением памяти в ункомпил6. Оказалось что проблема в размере стэка программы, т.е. основного потока. Обычно встречаются две проблемы - не хватка стэка и предел рекурсивных вызовов. Как они себя проявляют хорошо показано вот на этих примерах Случай нулевой, достигается придел рекурсивных вызовов: import sys def rec(x): print x, if x < 1000: rec(x + 1) rec(0) Случай первый, переполнения стека не наблюдается, полет в норме: import sys sys.setrecursionlimit(2000000) def rec(x): print x, if x < 1000: rec(x + 1) rec(0) Случай второй, достигается переполнение стека: import sys sys.setrecursionlimit(2000000) def rec(x): print x, if x < 10000: rec(x + 1) rec(0) Увеличить предел рекурсии можно легко в самом питоне. У меня это уже было сделано ранее в Terminal - Settings - Basic setup - Execute after connection... А вот про стэк я совсем забыл и долго не мог понять почему quicktime.pyc с 3,5к строк не хочет декомпилится. Про увеличение стэка, хорошо написано вот тут. В самом питоне не увеличить. Потому увеличил в Орионе - поднял предел с 1Мб до 16Мб. И проблема исчезла. Edited March 31, 2016 by StranikS_Scan 4 Quote Share this post Link to post Short link Share on other sites
akey 35 #322278 Posted April 1, 2016 С новым файлом debug_utils.pyc в res_mods и работой трасмиттера все разобрались? Кто не разобрался еще, поясняю. Трансмиттер грузиться за счет хука на этот файл, т.е. на debug_utils.pyc. Если такой файл положить в res_mods (а трасмиттер в path.xml грузиться после папки res_mods), то Орион к клиенту не подключится. Поэтому убирайте файл debug_utils.pyc из res_mods в папку res Это ещё не всё... Пункты пользовательского соглашения как Вам? Который запрещает запускать клиент игры через трансмитер, дословно: "4.3.8. Использовать автоматизированные скрипты для сбора информации или для другого рода взаимодействия с Игрой и ее элементами." "4.3.23. Использовать Игру способами, не предусмотренными настоящим Соглашением и выходящими за рамки обычного игрового процесса." Так что, грызём только реплеи :) И то неизвестно можно ли :) И ещё вопрос, в шапке 6 юникомпил уже правленый? Или ждём обновы? Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #322283 Posted April 1, 2016 Когда релиз? Quote Share this post Link to post Short link Share on other sites
akey 35 #322284 Posted April 1, 2016 Когда релиз? Клиент игры теперь /0.9.14.1/ Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #322288 Posted April 1, 2016 в шапке 6 юникомпил уже правленый?где ты его там увидел? Quote Share this post Link to post Short link Share on other sites
akey 35 #322289 Posted April 1, 2016 где ты его там увидел? я имел ввиду инсталятор Quote Share this post Link to post Short link Share on other sites
Ekspoint 2,122 #322303 Posted April 1, 2016 Клиент игры теперь /0.9.14.1/я в курсеЯ про орион имел ввиду Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322372 Posted April 1, 2016 (edited) Это ещё не всё... Пункты пользовательского соглашения как Вам? Который запрещает запускать клиент игры через трансмитер, дословно: "4.3.8. Использовать автоматизированные скрипты для сбора информации или для другого рода взаимодействия с Игрой и ее элементами." "4.3.23. Использовать Игру способами, не предусмотренными настоящим Соглашением и выходящими за рамки обычного игрового процесса." Так что, грызём только реплеи :) И то неизвестно можно ли :) Ой, ЛОЛ )))))) При чем тут трансмиттер? Банят тех кто модпак урагана юзал и моды, в которые он троян засунул. Детектят через debug_utils запросы на читерский сервер. Всех дураков, кто последнюю неделю гонял с читом, тех задетектили и теперь банят ))))) Примерно 10к чепушил в баньку отправят. И ещё вопрос, в шапке 6 юникомпил уже правленый? Или ждём обновы? Еще нет. Ждите. Edited April 1, 2016 by StranikS_Scan 1 Quote Share this post Link to post Short link Share on other sites
BogdanF1 51 #322376 Posted April 1, 2016 Банят тех кто модпак урагана юзал и моды, в которые он троян засунул. А можно самому как-то провести диагностику? Я не ставлю модпаки, но отдельный мод мог и поставить. Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #322385 Posted April 1, 2016 (edited) А можно самому как-то провести диагностику? Я не ставлю модпаки, но отдельный мод мог и поставить. Да, хз. Залил в первый пост ссылку на новые исходники 0.9.14.1 клиента 0.9.14_143_Decompile_WOT.zip Edited April 1, 2016 by StranikS_Scan 2 Quote Share this post Link to post Short link Share on other sites