SkepticalFox 1,445 #315040 Posted February 24, 2016 Баги отрисовки не далеко ушли) 1 Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315041 Posted February 24, 2016 Баги отрисовки не далеко ушли) Это чего? Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315042 Posted February 24, 2016 (edited) Это чего?Оно еще и скроллится) Черный прямоугольник Страникса) Edited February 24, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #315046 Posted February 24, 2016 super(_GlobalCtx, self).__init__() так и не понял, зачем это нужно, когда наследования нет.Если идет наследование от object, то вызов super() необходим для адекватного выполнения кода при множественном наследовании. Тоже одно время потратил приличное время в поиске бага, оказалось просто надо было проставить везде на перегрузках (там где происходит переопределение метода класса-родителя) super(). Хотя прямой логики вроде и нет. Но без него работает некорректно (вызывается только метод одного из родителей при множественном наследовании). Для юзверских модов не особо актуально, ибо классы (а уж тем более наследование, и уж тем более множественное) используют единицы и в единичных случаях, а вот картошка любит такое дело и довольно часто таким промышляет :) Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315050 Posted February 24, 2016 необходим для адекватного выполнения кода при множественном наследовании.В Python 3k такое поведение исправили? Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315051 Posted February 24, 2016 Запустил декопил клиента по новой на исправленной версии.... Короче я пофиксил только один баг. Нуно еще 88 багов пофиксеть ))))) к концу месяца закончу )))) Хотя нет 38 надо пофиксеть, 88 это со старым если )))) Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315053 Posted February 24, 2016 (edited) я пофиксил только один баг.Что-то совсем странно ожидать от новых версий регресса( Edited February 24, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315058 Posted February 24, 2016 (edited) А это точно был баг? В чем он заключался? Что-то совсем странно ожидать от новых версий регресса( Я не знаю как правильно это называть. Это была неучтёнка. То есть декомпилятор не учитывал, что в описании класса может закрасться этот странный CALL Edited February 24, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315059 Posted February 24, 2016 (edited) @StranikS_Scan, меня больше радует тот факт, что Decompile++ выдает совершенно другой loader.py))) Edited February 24, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315060 Posted February 24, 2016 (edited) @StranikS_Scan, меня больше радует тот факт, что Decompile++ выдает совершенно другой loader.py))) Он проглатывает, что не смог, то выкидывает и т.д. ))) ---------------------- Сейчас сижу курю проблему вот с эти кодом: | 114 JUMP_IF_FALSE_OR_POP [6F 7C 00] 124 | 117 LOAD_FAST [7C 03 00] 3 (mrtEnabled) | 120 RETURN_VALUE [53 -- --] | >> 121 LOAD_GLOBAL [74 01 00] 1 (True) | >> 124 RETURN_VALUE [53 -- --] Ункомпил косячится на предпоследнем ретурне 114 JUMP_IF_FALSE_OR_POP '124' 117 LOAD_FAST 'mrtEnabled' 120 RETURN_END_IF '' 121_0 COME_FROM '114' 121 LOAD_GLOBAL 'True' 124_0 COME_FROM '90' 124_1 COME_FROM '96' 124 RETURN_VALUE '' -1 RETURN_LAST '' Syntax error at or near `RETURN_END_IF' token at offset 120 Edited February 24, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315061 Posted February 24, 2016 (edited) Он проглатывает, что не смог, то выкидывает и т.д. )))) Edited July 18, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315062 Posted February 24, 2016 И там косяк с распаковкой имен приватных методов. Это само-собой ))))) Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315063 Posted February 24, 2016 (edited) Это само-собой )))))А зачем тогда ты его добавил, если он страдает детскими болячками? Он даже не может в декораторы. Edited February 24, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315065 Posted February 24, 2016 (edited) А зачем тогды ты его добавил, если он страдает детскими болячками? Эти болячки во 2-м ункомпиле оказывается тоже есть. Просто я вывод ошибок криво сделал и ни какой реакции не было, а py-файлы-то битые на выходе из него были )))) И там косяк с распаковкой имен приватных методов. А вот это спорный вопрос. Так как в оригинальном py метод был записан без префикса. А потому наверно логично, что декомпилированный вариант тоже его не содержит. Вот смотри сам | 113 90 LOAD_CONST [64 09 00] 9 (<code object __isSupported at 02B91F50, file "scripts/client/post_processing/__init__.py", line 113>) | 93 MAKE_FUNCTION [84 00 00] 0 | 96 STORE_NAME [5A 0C 00] 12 (_Effect__isSupported) Edited February 24, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315067 Posted February 24, 2016 (edited) ... Edited February 28, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315478 Posted February 28, 2016 (edited) Кто-нибудь может вообще объяснить как такой код мог получится? | >> 65 STORE_FAST [7D 03 00] 3 (mrtEnabled) | 119 68 LOAD_FAST [7C 00 00] 0 (self) | 71 LOAD_ATTR [6A 05 00] 5 (_Effect__curQuality) | 74 LOAD_FAST [7C 00 00] 0 (self) | 77 LOAD_ATTR [6A 06 00] 6 (_Effect__effectType) | 80 BINARY_SUBSCR [19 -- --] | 81 LOAD_FAST [7C 00 00] 0 (self) | 84 LOAD_ATTR [6A 07 00] 7 (_Effect__qualityRange) | 87 COMPARE_OP [6B 06 00] 6 (in) | 90 JUMP_IF_FALSE_OR_POP [6F 7C 00] 124 | 93 LOAD_FAST [7C 02 00] 2 (isEnabled) | 96 JUMP_IF_FALSE_OR_POP [6F 7C 00] 124 | 120 99 LOAD_FAST [7C 00 00] 0 (self) | 102 LOAD_ATTR [6A 08 00] 8 (_Effect__isAdvanced) | 105 POP_JUMP_IF_FALSE [72 79 00] 121 | 108 LOAD_FAST [7C 00 00] 0 (self) | 111 LOAD_ATTR [6A 08 00] 8 (_Effect__isAdvanced) | 114 JUMP_IF_FALSE_OR_POP [6F 7C 00] 124 | 117 LOAD_FAST [7C 03 00] 3 (mrtEnabled) | 120 RETURN_VALUE [53 -- --] | >> 121 LOAD_GLOBAL [74 01 00] 1 (True) | >> 124 RETURN_VALUE [53 -- --] Мозг убивает отсутствие явной инструкции задания в TOS значения возвращаемого через RETURN_VALUE (ниже это ?). Попытался построить логику исходного кода по данной цепочке вышло что-то типа такого: ... Не правильно, ...OR_POP же сохраняет TOS если идет переход. Ща соображу по новой )))))) Нашел как появляется базовая конструкция: discode[hexcode]: | 2 0 LOAD_GLOBAL [74 00 00] 0 (a) | 3 JUMP_IF_FALSE_OR_POP [6F 0F 00] 15 | 6 LOAD_GLOBAL [74 01 00] 1 (b) | 9 JUMP_IF_FALSE_OR_POP [6F 0F 00] 15 | 12 LOAD_GLOBAL [74 02 00] 2 (c) | >> 15 RETURN_VALUE [53 -- --] consts: (0) None вот код: def aaa(): return a and b and c Вот такой скрипт: def aaa(): mrtEnabled = False return self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \ isEnabled and \ (self._Effect__isAdvanced or _Effect__isAdvanced) and \ mrtEnabled дает вот такой код: discode[hexcode]: | 2 0 LOAD_GLOBAL [74 00 00] 0 (False) | 3 STORE_FAST [7D 00 00] 0 (mrtEnabled) | 3 6 LOAD_GLOBAL [74 01 00] 1 (self) | 9 LOAD_ATTR [6A 02 00] 2 (_Effect__curQuality) | 12 LOAD_GLOBAL [74 01 00] 1 (self) | 15 LOAD_ATTR [6A 03 00] 3 (_Effect__effectType) | 18 BINARY_SUBSCR [19 -- --] | 19 LOAD_GLOBAL [74 01 00] 1 (self) | 22 LOAD_ATTR [6A 04 00] 4 (_Effect__qualityRange) | 25 COMPARE_OP [6B 06 00] 6 (in) | 28 JUMP_IF_FALSE_OR_POP [6F 37 00] 55 | 4 31 LOAD_GLOBAL [74 05 00] 5 (isEnabled) | 34 JUMP_IF_FALSE_OR_POP [6F 37 00] 55 | 5 37 LOAD_GLOBAL [74 01 00] 1 (self) | 40 LOAD_ATTR [6A 06 00] 6 (_Effect__isAdvanced) | 43 POP_JUMP_IF_TRUE [73 34 00] 52 | 46 LOAD_GLOBAL [74 06 00] 6 (_Effect__isAdvanced) | 49 JUMP_IF_FALSE_OR_POP [6F 37 00] 55 | 6 >> 52 LOAD_FAST [7C 00 00] 0 (mrtEnabled) | >> 55 RETURN_VALUE [53 -- --] consts: (0) None Почти подобрался к искомому коду. осталось понять как вывернуться на POP_JUMP_IF_FALSE в 43 Я сделал это Вот какой код скрипт там был: ... mrtEnabled = ... return self._Effect__isAdvanced and mrtEnabled \ if (self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \ isEnabled and self._Effect__isAdvanced) else \ True именно он на выходе и дает код вида: | 3 STORE_FAST [7D 00 00] 0 (mrtEnabled) | 4 6 LOAD_GLOBAL [74 01 00] 1 (self) | 9 LOAD_ATTR [6A 02 00] 2 (_Effect__curQuality) | 12 LOAD_GLOBAL [74 01 00] 1 (self) | 15 LOAD_ATTR [6A 03 00] 3 (_Effect__effectType) | 18 BINARY_SUBSCR [19 -- --] | 19 LOAD_GLOBAL [74 01 00] 1 (self) | 22 LOAD_ATTR [6A 04 00] 4 (_Effect__qualityRange) | 25 COMPARE_OP [6B 06 00] 6 (in) | 28 POP_JUMP_IF_FALSE [72 3B 00] 59 | 5 31 LOAD_GLOBAL [74 05 00] 5 (isEnabled) | 34 POP_JUMP_IF_FALSE [72 3B 00] 59 | 6 37 LOAD_GLOBAL [74 01 00] 1 (self) | 40 LOAD_ATTR [6A 06 00] 6 (_Effect__isAdvanced) | 43 POP_JUMP_IF_FALSE [72 3B 00] 59 | 46 LOAD_GLOBAL [74 01 00] 1 (self) | 49 LOAD_ATTR [6A 06 00] 6 (_Effect__isAdvanced) | 52 JUMP_IF_FALSE_OR_POP [6F 3E 00] 62 | 55 LOAD_FAST [7C 00 00] 0 (mrtEnabled) | 58 RETURN_VALUE [53 -- --] | 7 >> 59 LOAD_GLOBAL [74 07 00] 7 (True) | >> 62 RETURN_VALUE [53 -- --] Так-с, осталась прописать логику этой структуры в AST-конвертере ункомпила. ---------------- Хотя, нет, опять не тот код получился. Недосмотрел я. Поиски продолжаются :(((( Все. Вот теперь задача реально решена. Все перепроверил на два раза ))) Вот какой скрипт в оригинале: ... mrtEnabled = ... return self._Effect__curQuality[self._Effect__effectType] in self._Effect__qualityRange and \ isEnabled and \ (self._Effect__isAdvanced and mrtEnabled if self._Effect__isAdvanced else True) discode[hexcode]: | 2 0 LOAD_GLOBAL [74 00 00] 0 (False) | 3 STORE_FAST [7D 00 00] 0 (mrtEnabled) | 3 6 LOAD_GLOBAL [74 01 00] 1 (self) | 9 LOAD_ATTR [6A 02 00] 2 (_Effect__curQuality) | 12 LOAD_GLOBAL [74 01 00] 1 (self) | 15 LOAD_ATTR [6A 03 00] 3 (_Effect__effectType) | 18 BINARY_SUBSCR [19 -- --] | 19 LOAD_GLOBAL [74 01 00] 1 (self) | 22 LOAD_ATTR [6A 04 00] 4 (_Effect__qualityRange) | 25 COMPARE_OP [6B 06 00] 6 (in) | 28 JUMP_IF_FALSE_OR_POP [6F 3E 00] 62 | 4 31 LOAD_GLOBAL [74 05 00] 5 (isEnabled) | 34 JUMP_IF_FALSE_OR_POP [6F 3E 00] 62 | 5 37 LOAD_GLOBAL [74 01 00] 1 (self) | 40 LOAD_ATTR [6A 06 00] 6 (_Effect__isAdvanced) | 43 POP_JUMP_IF_FALSE [72 3B 00] 59 | 46 LOAD_GLOBAL [74 01 00] 1 (self) | 49 LOAD_ATTR [6A 06 00] 6 (_Effect__isAdvanced) | 52 JUMP_IF_FALSE_OR_POP [6F 3E 00] 62 | 55 LOAD_FAST [7C 00 00] 0 (mrtEnabled) | 58 RETURN_VALUE [53 -- --] | >> 59 LOAD_GLOBAL [74 07 00] 7 (True) | >> 62 RETURN_VALUE [53 -- --] consts: (0) None Edited February 28, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
GPCracker 2,088 #315518 Posted February 28, 2016 @StranikS_Scan, перебором что-ли искал? Такое ощущение что этот код писали какие-то немного криворукие программисты, ибо (self._Effect__isAdvanced and mrtEnabled if self._Effect__isAdvanced else True)нормально переписывается в (mrtEnabled if self._Effect__isAdvanced else True)далее not self._Effect__isAdvanced or mrtEnabledИ где только картошка таких берет... Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315521 Posted February 28, 2016 (edited) ... Edited February 28, 2016 by ShadowHunterRUS Quote Share this post Link to post Short link Share on other sites
StranikS_Scan 4,210 #315522 Posted February 28, 2016 (edited) StranikS_Scan, перебором что-ли искал? Изучал базовые конструкции пока не научился видеть их в коде. Как сам видишь выше, данный код использует всего из две базовые конструкций это return X and Y and Z and... и конструкцию A if N else B. Их распознать не сложно, когда их знаешь. Первая это: TOS <-- JUMP_IF_FALSE_OR_POP TOS <-- JUMP_IF_FALSE_OR_POP TOS <-- ... RETURN_VALUE Вторая это: TOS <-- POP_JUMP_IF_FALSE TOS <-- ... RETURN или JUMP_FORWARD ----- TOS <-- | ... | TOS <-------------------------------------------- ... Однако это все легкая часть решения задачки. Сейчас пытаюсь понять как устроен AST-конвертер в ункопиле, надо там правку делать. я там выше привел пример if a or a: возможно баги копипасты Это вообще левый код. Декомпил++ даже не смог правильно разобрать эту часть кода И где только картошка таких берет... Часто сложные условия пишут следуя за логикой рассуждения. И в дальнейшем не упрощают код, чтобы видеть именно эту логику. Edited February 28, 2016 by StranikS_Scan Quote Share this post Link to post Short link Share on other sites
SkepticalFox 1,445 #315539 Posted February 28, 2016 Однако это все легкая часть решения задачки. Сейчас пытаюсь понять как устроен AST-конвертер в ункопиле, надо там правку делать. В их Issues кинул эти баги? Quote Share this post Link to post Short link Share on other sites