Werkzeug: 0.15.x . рдкрд░ рднрдЧреЛрдбрд╝рд╛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдЕрдкреНрд░реИрд▓ 2019  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/werkzeug

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рдЫреЛрдЯреА рд╕реА рд▓рд┐рдкрд┐ рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЕрднреА рддрдХ рдЗрд╕рдореЗрдВ рдЦреЛрджрд╛ рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдзреВрдореНрд░рдкрд╛рди рдмрдВрджреВрдХ рдирдИ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдХрд▓рди рд╕рд╛рдордЧреНрд░реА рд╣реИ

from werkzeug.routing import Map, Rule


def main():
    while True:
        Map([Rule('/a/<string:b>')])


if __name__ == '__main__':
    exit(main())

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдЪрдХреНрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

diff --git a/src/werkzeug/routing.py b/src/werkzeug/routing.py
index c7cff94d..8176ddfe 100644
--- a/src/werkzeug/routing.py
+++ b/src/werkzeug/routing.py
@@ -1254,13 +1254,13 @@ class BaseConverter(object):
     weight = 100

     def __init__(self, map):
-        self.map = map
+        self.charset = map.charset

     def to_python(self, value):
         return value

     def to_url(self, value):
-        return _fast_url_quote(text_type(value).encode(self.map.charset))
+        return _fast_url_quote(text_type(value).encode(self.charset))


 class UnicodeConverter(BaseConverter):

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЪрдХреНрд░ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ LOAD_CONST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЬреАрд╕реА рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрджрд░реНрднрд┐рдд рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд▓рд╛рдЗрд╡ рд╣реИрдВ, рдЬрдм рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ)

рд╕рднреА 11 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@ edk0

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ GC'd рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛ред рдЖрдо рддреМрд░ рдкрд░ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрдирд╛рдП рдФрд░ рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рдордп-рд╕рдордп рдкрд░ рдмрджрд▓рддреА рд░рд╣рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╡реИрдирд┐рдЯреА рд░реВрдЯ рдЬреЛрдбрд╝рддреЗ рдпрд╛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ

рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рд╡реИрдирд┐рдЯреА рд░реВрдЯ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдмрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯ рдореИрдкрд┐рдВрдЧ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ flask рдРрдк рджреНрд╡рд╛рд░рд╛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреА рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рд╣рдореНрдо, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдирд┐рд░рд╛рд╢ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдорд▓реНрдЯреАрдкреНрд░реЛрд╕реЗрд╕ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕реЗ 404 рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рджреВрдВрдЧрд╛, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рдХрд┐ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реЛрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рдордп-рд╕рдордп рдкрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреБрдирдГ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ - рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рд╕реАрдзреЗ рдлреНрд▓рд╛рд╕реНрдХ рдРрдк рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╢рд╛рдпрдж рд░рд┐рд╕рд╛рд╡ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рд╣рдВрд╕рдирд╛: - рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрд╛ рдЙрдирдореЗрдВ рд╕реЗ рд╣реИрд╢рд┐рдВрдЧ рд╣реИ ( Map рд▓рдЧрддрд╛ рд╣реИ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛)

рдзреНрдпрд╛рди рджреЗрдВ, рдпрд╣ рд░рд┐рд╕рд╛рд╡ <string:b> рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдбрд┐рд╕реНрд╕реЗрдкреНрд▓рд░ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ:

>>> x = Rule('/a/<string:b>')
>>> from werkzeug.routing import Map
>>> y = Map([x])
>>> x._build
<function <builder:'/a/<string:b>'> at 0x7f16d62d1730>
>>> import dis
>>> dis.dis(x._build)
  1           0 LOAD_CONST               0 ('')
              2 LOAD_CONST               1 ('/a/')
              4 LOAD_CONST               2 (<bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f16d2c9a0f0>>)
              6 LOAD_FAST                0 (b)
              8 CALL_FUNCTION            1
             10 BUILD_STRING             2
             12 BUILD_TUPLE              2
             14 RETURN_VALUE
>>> dis.dis(x._build_unknown)
  1           0 LOAD_CONST               0 ('')
              2 LOAD_CONST               1 ('/a/')
              4 LOAD_CONST               2 (<bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f16d2c9a0f0>>)
              6 LOAD_FAST                0 (b)
              8 CALL_FUNCTION            1
             10 LOAD_FAST                1 (.keyword_arguments)
             12 JUMP_IF_TRUE_OR_POP     20
             14 LOAD_CONST               0 ('')
             16 DUP_TOP
             18 JUMP_FORWARD            10 (to 30)
        >>   20 LOAD_CONST               3 (functools.partial(<function url_encode at 0x7f16d2d5d510>, charset='utf-8', sort=False, key=None))
             22 ROT_TWO
             24 CALL_FUNCTION            1
             26 LOAD_CONST               4 ('?')
             28 ROT_TWO
        >>   30 BUILD_STRING             4
             32 BUILD_TUPLE              2
             34 RETURN_VALUE

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рдПрдбрдЬрд╕реНрдЯ рдХрд░рдирд╛:

import collections
import gc
import pprint
from werkzeug.routing import Map, Rule


def main():
    for _ in range(10000):
        Map([Rule('/a/<string:b>')])
    for _ in range(5):
        gc.collect()
    counts = collections.Counter(type(o) for o in gc.get_objects())
    pprint.pprint(counts.most_common(15))


if __name__ == '__main__':
    exit(main())

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реАрдХ рд╣реЛ рд░рд╣рд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо, рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдКрдкрд░ рдХреЗ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рднреА рдЕрдзрд┐рдХ) Map , Rule , рд╕рд╛рде рд╣реА рдПрдХ functools.partial рдФрд░ рдПрдХ UnicodeConverter рдкреНрд░рддрд┐ рдХреЙрд▓:

$ ./venv/bin/python t.py
[(<class 'dict'>, 62085),
 (<class 'list'>, 50514),
 (<class 'function'>, 24085),
 (<class 'tuple'>, 21811),
 (<class 'method'>, 20032),
 (<class 'set'>, 10518),
 (<class 'functools.partial'>, 10002),
 (<class 'werkzeug.routing.UnicodeConverter'>, 10000),
 (<class 'werkzeug.routing.Map'>, 10000),
 (<class 'werkzeug.routing.Rule'>, 10000),
 (<class 'weakref'>, 1306),
 (<class 'wrapper_descriptor'>, 1131),
 (<class 'method_descriptor'>, 879),
 (<class 'builtin_function_or_method'>, 839),
 (<class 'getset_descriptor'>, 740)]

рдЬреАрд╕реА рдореЗрдВ рдЗрд╕реЗ рдЬреАрд╡рд┐рдд рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬреЛрдВ рдХреЗ рдХреБрдЫ рдЧреНрд░рд╛рдл рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:

def graph(obj, ids, *, seen=None, indent='', limit=10):
    if seen is None:
        seen = set()

    for referrer in gc.get_referrers(obj):
        # the main frame which has a hard reference to ths object
        if (
                type(referrer).__name__ == 'frame' and
                referrer.f_globals['__name__'] == '__main__'
        ):
            continue
        # objects only present due to traversal of gc referrers
        elif id(referrer) not in ids:
            continue
        elif id(referrer) in seen:
            print(f'{indent}(already seen) {id(referrer)}')
            continue

        seen.add(id(referrer))

        if indent == '':
            print('=' * 79)
        print(f'{indent}type: {type(referrer).__name__} ({id(referrer)})')
        fmted = repr(referrer)  #pprint.pformat(referrer)
        print(indent + fmted.replace('\n', f'\n{indent}'))

        if limit:
            graph(
                referrer, ids,
                seen=seen, indent='==' + indent, limit=limit - 1,
            )

...

    ids = {id(o) for o in gc.get_objects()}
    obj = next(iter(o for o in gc.get_objects() if isinstance(o, Map)))
    graph(obj, ids)
===============================================================================
type: dict (140272699432680)
{'map': Map([<Rule '/a/<b>' -> None>]), 'regex': '[^/]{1,}'}
==type: UnicodeConverter (140272699175656)
==<werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>
====type: method (140272750734216)
====<bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>>
======type: tuple (140272726348928)
======('', '/a/', <bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>>)
====type: method (140272749846664)
====<bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>>
======type: tuple (140272726372424)
======('', '/a/', <bound method BaseConverter.to_url of <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>>, functools.partial(<function url_encode at 0x7f93c877eae8>, charset='utf-8', sort=False, key=None), '?')
====type: dict (140272723298056)
===={'b': <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>}
======type: dict (140272749460432)
======{'rule': '/a/<string:b>', 'is_leaf': True, 'map': Map([<Rule '/a/<b>' -> None>]), 'strict_slashes': True, 'subdomain': '', 'host': None, 'defaults': None, 'build_only': False, 'alias': False, 'methods': None, 'endpoint': None, 'redirect_to': None, 'arguments': {'b'}, '_trace': [(False, '|'), (False, '/a/'), (True, 'b')], '_converters': {'b': <werkzeug.routing.UnicodeConverter object at 0x7f93c867f2e8>}, '_regex': re.compile('^\\|\\/a\\/(?P<b>[^/]{1,})$'), '_argument_weights': [100], '_static_weights': [(0, -1)], '_build': <function <builder:'/a/<string:b>'> at 0x7f93c9d880d0>, '_build_unknown': <function <builder:'/a/<string:b>'> at 0x7f93c9d88158>}
========type: Rule (140272749480984)
========<Rule '/a/<b>' -> None>
==========type: list (140272699123848)
==========[<Rule '/a/<b>' -> None>]
============type: dict (140272726280736)
============{'_rules': [<Rule '/a/<b>' -> None>], '_rules_by_endpoint': {None: [<Rule '/a/<b>' -> None>]}, '_remap': False, '_remap_lock': <unlocked _thread.lock object at 0x7f93cb6d9da0>, 'default_subdomain': '', 'charset': 'utf-8', 'encoding_errors': 'replace', 'strict_slashes': True, 'redirect_defaults': True, 'host_matching': False, 'converters': {'default': <class 'werkzeug.routing.UnicodeConverter'>, 'string': <class 'werkzeug.routing.UnicodeConverter'>, 'any': <class 'werkzeug.routing.AnyConverter'>, 'path': <class 'werkzeug.routing.PathConverter'>, 'int': <class 'werkzeug.routing.IntegerConverter'>, 'float': <class 'werkzeug.routing.FloatConverter'>, 'uuid': <class 'werkzeug.routing.UUIDConverter'>}, 'sort_parameters': False, 'sort_key': None}
==============type: Map (140272749480872)
==============Map([<Rule '/a/<b>' -> None>])
================(already seen) 140272699432680
================(already seen) 140272749460432
==========type: list (140272700110792)
==========[<Rule '/a/<b>' -> None>]
============type: dict (140272726280808)
============{None: [<Rule '/a/<b>' -> None>]}
==============(already seen) 140272726280736
(already seen) 140272749460432

рдпрд╣ рдЪрдХреНрд░ рдХреЛ рддреЛрдбрд╝рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:

diff --git a/src/werkzeug/routing.py b/src/werkzeug/routing.py
index c7cff94d..8176ddfe 100644
--- a/src/werkzeug/routing.py
+++ b/src/werkzeug/routing.py
@@ -1254,13 +1254,13 @@ class BaseConverter(object):
     weight = 100

     def __init__(self, map):
-        self.map = map
+        self.charset = map.charset

     def to_python(self, value):
         return value

     def to_url(self, value):
-        return _fast_url_quote(text_type(value).encode(self.map.charset))
+        return _fast_url_quote(text_type(value).encode(self.charset))


 class UnicodeConverter(BaseConverter):

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЪрдХреНрд░ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ LOAD_CONST рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЬреАрд╕реА рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрджрд░реНрднрд┐рдд рдХреЛрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд▓рд╛рдЗрд╡ рд╣реИрдВ, рдЬрдм рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ)

#1524 . рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Nessphoro picture Nessphoro  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

paihu picture paihu  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

davidism picture davidism  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

abathur picture abathur  ┬╖  13рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SimonSapin picture SimonSapin  ┬╖  12рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ