From a75773cf9f7a9fde2a7b2c77b9846b4f0dd5b711 Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Mon, 17 Feb 2014 09:08:30 +0100 Subject: [PATCH 01/10] Fix import of compiled module with python3. This at least fix #331 --- jedi/_compatibility.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/jedi/_compatibility.py b/jedi/_compatibility.py index 9cce90a5..fa42abb1 100644 --- a/jedi/_compatibility.py +++ b/jedi/_compatibility.py @@ -33,10 +33,16 @@ def find_module_py33(string, path=None): module_path = loader.get_filename(string) module_file = open(module_path) except AttributeError: - # is builtin module - module_path = string - module_file = None - is_package = False + # ExtensionLoader has not attribute get_filename, instead it has a + # path attribute that we can use to retrieve the module path + try: + module_path = loader.path + module_file = open(loader.path, 'rb') + except AttributeError: + module_path = string + module_file = None + finally: + is_package = False return module_file, module_path, is_package From d80caa7108241b3deae102c1077cb90cd7c43708 Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 17:36:01 +0100 Subject: [PATCH 02/10] Add test pyc Should succeed for python2 and faild for python3 --- test/test_pyc.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 test/test_pyc.py diff --git a/test/test_pyc.py b/test/test_pyc.py new file mode 100644 index 00000000..74c39642 --- /dev/null +++ b/test/test_pyc.py @@ -0,0 +1,38 @@ +""" +Test completions from *.pyc files: + + - generated a dummy python module + - compile the dummy module to generate a *.pyc + - delete the pure python dummy module + - try jedi on the generated *.pyc +""" +import os +import compileall +import jedi + +SRC = """class Foo: + pass + +class Bar: + pass +""" + + +def generate_pyc(): + with open("dummy.py", 'w') as f: + f.write(SRC) + compileall.compile_file("dummy.py") + os.remove("dummy.py") + + +def test_pyc(): + """ + The list of completion must be greater than 2. + """ + generate_pyc() + s = jedi.Script("import dummy; dummy.") + assert len(s.completions()) >= 2 + + +if __name__ == "__main__": + test_pyc() From ea43efc9d820833090670305a73543b43cf4286b Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 18:58:22 +0100 Subject: [PATCH 03/10] Fix pyc test for python3 To import pyc modules, we must move them out of the __pycache__ directory and rename them to remove ".cpython-%s%d". This should still faild with python3 (UnicodeDecodeError) --- test/test_pyc.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/test_pyc.py b/test/test_pyc.py index 74c39642..22840502 100644 --- a/test/test_pyc.py +++ b/test/test_pyc.py @@ -1,15 +1,19 @@ """ Test completions from *.pyc files: - - generated a dummy python module + - generate a dummy python module - compile the dummy module to generate a *.pyc - delete the pure python dummy module - try jedi on the generated *.pyc """ -import os import compileall +import os +import shutil +import sys + import jedi + SRC = """class Foo: pass @@ -24,6 +28,15 @@ def generate_pyc(): compileall.compile_file("dummy.py") os.remove("dummy.py") + if sys.version_info[0] == 3: + # Python3 specific: + # To import pyc modules, we must move them out of the __pycache__ + # directory and rename them to remove ".cpython-%s%d" + # see: http://stackoverflow.com/questions/11648440/python-does-not-detect-pyc-files + for f in os.listdir("__pycache__"): + dst = f.replace('.cpython-%s%s' % sys.version_info[:2], "") + shutil.copy(os.path.join("__pycache__", f), dst) + def test_pyc(): """ From 18a31dcbf1fcad2e6e375d1417beee45a5c27aeb Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 19:00:35 +0100 Subject: [PATCH 04/10] Fix read mode for pyc files Now all test should pass on travis. --- jedi/_compatibility.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jedi/_compatibility.py b/jedi/_compatibility.py index fa42abb1..423c6374 100644 --- a/jedi/_compatibility.py +++ b/jedi/_compatibility.py @@ -31,7 +31,8 @@ def find_module_py33(string, path=None): module_file = None else: module_path = loader.get_filename(string) - module_file = open(module_path) + mode = 'rb' if module_path.endswith(".pyc") else 'r' + module_file = open(module_path, mode) except AttributeError: # ExtensionLoader has not attribute get_filename, instead it has a # path attribute that we can use to retrieve the module path From 5a706265bc214c50306ff65c88c57b703a6adc29 Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 19:18:17 +0100 Subject: [PATCH 05/10] Move dummy pyc to dummy package --- test/test_pyc.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/test/test_pyc.py b/test/test_pyc.py index 22840502..610b9e06 100644 --- a/test/test_pyc.py +++ b/test/test_pyc.py @@ -23,19 +23,23 @@ class Bar: def generate_pyc(): - with open("dummy.py", 'w') as f: + os.mkdir("dummy_package") + with open("dummy_package/__init__.py", 'w'): + pass + with open("dummy_package/dummy.py", 'w') as f: f.write(SRC) - compileall.compile_file("dummy.py") - os.remove("dummy.py") + compileall.compile_file("dummy_package/dummy.py") + os.remove("dummy_package/dummy.py") if sys.version_info[0] == 3: # Python3 specific: # To import pyc modules, we must move them out of the __pycache__ # directory and rename them to remove ".cpython-%s%d" # see: http://stackoverflow.com/questions/11648440/python-does-not-detect-pyc-files - for f in os.listdir("__pycache__"): + for f in os.listdir("dummy_package/__pycache__"): dst = f.replace('.cpython-%s%s' % sys.version_info[:2], "") - shutil.copy(os.path.join("__pycache__", f), dst) + dst = os.path.join("dummy_package", dst) + shutil.copy(os.path.join("dummy_package/__pycache__", f), dst) def test_pyc(): @@ -43,8 +47,9 @@ def test_pyc(): The list of completion must be greater than 2. """ generate_pyc() - s = jedi.Script("import dummy; dummy.") + s = jedi.Script("from dummy_package import dummy; dummy.") assert len(s.completions()) >= 2 + shutil.rmtree("dummy_package") if __name__ == "__main__": From 7aed62cb9957fd5d3505cc176b6d64a4b8468c0a Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 20:12:30 +0100 Subject: [PATCH 06/10] Add compiled modules sources + readme --- extensions/README.rst | 10 ++++++++++ extensions/compiled.pyx | 6 ++++++ extensions/setup.py | 6 ++++++ 3 files changed, 22 insertions(+) create mode 100644 extensions/README.rst create mode 100644 extensions/compiled.pyx create mode 100644 extensions/setup.py diff --git a/extensions/README.rst b/extensions/README.rst new file mode 100644 index 00000000..069dfa5b --- /dev/null +++ b/extensions/README.rst @@ -0,0 +1,10 @@ +This directory contains extensions modules pre-compiled to be tested +on Travis-CI (Ubuntu 12.04 64bit). + +To build the extensions modules, run:: + + python setup.py build_ext -i + + +Then move the compiled modules to their testing package ( ./**compiledXX**, where XX is the +python version used to run setup.py). \ No newline at end of file diff --git a/extensions/compiled.pyx b/extensions/compiled.pyx new file mode 100644 index 00000000..1e7c6907 --- /dev/null +++ b/extensions/compiled.pyx @@ -0,0 +1,6 @@ +cdef class Foo: + pass + + +cdef class Bar: + pass diff --git a/extensions/setup.py b/extensions/setup.py new file mode 100644 index 00000000..a13237d2 --- /dev/null +++ b/extensions/setup.py @@ -0,0 +1,6 @@ +from distutils.core import setup +from Cython.Build import cythonize + +setup( + ext_modules=cythonize("compiled.pyx") +) From 7977d57169e95e877887cf4dda92e7c9f6ba529c Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 20:31:06 +0100 Subject: [PATCH 07/10] Add test_compiled Should pass on travis since there is no precompiled modules yet --- pytest.ini | 2 +- test/test_compiled.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/test_compiled.py diff --git a/pytest.ini b/pytest.ini index fa132557..0d73061d 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,7 +2,7 @@ addopts = --doctest-modules # Ignore broken files in blackbox test directories -norecursedirs = .* docs completion refactor absolute_import namespace_package scripts +norecursedirs = .* docs completion refactor absolute_import namespace_package scripts extensions # Activate `clean_jedi_cache` fixture for all tests. This should be # fine as long as we are using `clean_jedi_cache` as a session scoped diff --git a/test/test_compiled.py b/test/test_compiled.py new file mode 100644 index 00000000..5e6de533 --- /dev/null +++ b/test/test_compiled.py @@ -0,0 +1,18 @@ +""" +Test compiled module +""" +import os +import platform +import sys +import jedi + +from .helpers import cwd_at + + +@cwd_at('extensions') +def test_compiled(): + if platform.architecture()[0] == '64bit': + package_name = "compiled%s%s" % sys.version_info[:2] + if os.path.exists(package_name): + s = jedi.Script("from %s import compiled; compiled." % package_name) + assert len(s.completions()) >= 2 From f808dbbd28e750a7be440394865e708c78938c6c Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Tue, 18 Feb 2014 22:14:43 +0100 Subject: [PATCH 08/10] Change sys.path for the test to succeed. Tested locally with a python3 extension module (in /extensions/compiled33). Also tested that reverting a75773cf9f7a9fde2a7b2c77b9846b4f0dd5b711 make the test fail. --- test/test_compiled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_compiled.py b/test/test_compiled.py index 5e6de533..be752211 100644 --- a/test/test_compiled.py +++ b/test/test_compiled.py @@ -13,6 +13,7 @@ from .helpers import cwd_at def test_compiled(): if platform.architecture()[0] == '64bit': package_name = "compiled%s%s" % sys.version_info[:2] + sys.path.insert(0, os.getcwd()) if os.path.exists(package_name): s = jedi.Script("from %s import compiled; compiled." % package_name) assert len(s.completions()) >= 2 From 2c97d01bd07e3aaf890a4598758c83129bb8f16f Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Wed, 19 Feb 2014 08:10:43 +0100 Subject: [PATCH 09/10] Move extensions dir into test --- extensions/README.rst | 10 ---------- test/extensions/README.rst | 10 ++++++++++ {extensions => test/extensions}/compiled.pyx | 0 {extensions => test/extensions}/setup.py | 0 test/test_compiled.py | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 extensions/README.rst create mode 100644 test/extensions/README.rst rename {extensions => test/extensions}/compiled.pyx (100%) rename {extensions => test/extensions}/setup.py (100%) diff --git a/extensions/README.rst b/extensions/README.rst deleted file mode 100644 index 069dfa5b..00000000 --- a/extensions/README.rst +++ /dev/null @@ -1,10 +0,0 @@ -This directory contains extensions modules pre-compiled to be tested -on Travis-CI (Ubuntu 12.04 64bit). - -To build the extensions modules, run:: - - python setup.py build_ext -i - - -Then move the compiled modules to their testing package ( ./**compiledXX**, where XX is the -python version used to run setup.py). \ No newline at end of file diff --git a/test/extensions/README.rst b/test/extensions/README.rst new file mode 100644 index 00000000..5f0b69ff --- /dev/null +++ b/test/extensions/README.rst @@ -0,0 +1,10 @@ +This directory contains pre-compiled extensions modules used to test completions +for compiled modules on Travis-CI (Ubuntu 12.04 64bit). + +To build the extensions modules, run:: + + python setup.py build_ext -i + + +Then move the compiled modules to their testing package ( ./**compiledXX**, where XX is the +python version used to run setup.py). \ No newline at end of file diff --git a/extensions/compiled.pyx b/test/extensions/compiled.pyx similarity index 100% rename from extensions/compiled.pyx rename to test/extensions/compiled.pyx diff --git a/extensions/setup.py b/test/extensions/setup.py similarity index 100% rename from extensions/setup.py rename to test/extensions/setup.py diff --git a/test/test_compiled.py b/test/test_compiled.py index be752211..c783a3e2 100644 --- a/test/test_compiled.py +++ b/test/test_compiled.py @@ -9,7 +9,7 @@ import jedi from .helpers import cwd_at -@cwd_at('extensions') +@cwd_at('test/extensions') def test_compiled(): if platform.architecture()[0] == '64bit': package_name = "compiled%s%s" % sys.version_info[:2] From 9d7ecae27c2fc3151141bf786408f6c5f43640b6 Mon Sep 17 00:00:00 2001 From: ColinDuquesnoy Date: Wed, 19 Feb 2014 08:13:30 +0100 Subject: [PATCH 10/10] Add precompiled extension modules --- test/extensions/compiled27/__init__.py | 0 test/extensions/compiled27/compiled.so | Bin 0 -> 36501 bytes test/extensions/compiled32/__init__.py | 0 test/extensions/compiled32/compiled.so | Bin 0 -> 38086 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/extensions/compiled27/__init__.py create mode 100755 test/extensions/compiled27/compiled.so create mode 100644 test/extensions/compiled32/__init__.py create mode 100755 test/extensions/compiled32/compiled.so diff --git a/test/extensions/compiled27/__init__.py b/test/extensions/compiled27/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/extensions/compiled27/compiled.so b/test/extensions/compiled27/compiled.so new file mode 100755 index 0000000000000000000000000000000000000000..becbfb5675c864cf746ccac10744656c711f10ba GIT binary patch literal 36501 zcmeHw3w%`7wf8x5GMNL(Ndf^3@)`(ed=L@{7(g`PInf}IhvEZ=NoGPulT4hMKu{DE zP+~+;TdVb|v{!qrR;3SHuBZiV74-J2wXMb4d&Ng>QnliX+S)eX|GytICzIs%b^HDL z{eJf-XYaN4+H0-7_S$RjIp^%1&5LRmdrZ^Nmt~w`5ZaR`F;%LdWWCBDsWK`JAMVA5 zU(kBfMg4LM$4Hb;4bz`ly{yRT@KX3k`pT7Ib<*Ud3`_2#Y_Pu%Q zCKL~PS;i3KXl~!)Dz+93FxLHOSR#skT{WDxwmLGWK6MDF21@IV`W{L8%l1Bik2sTqXNQ-k2&9Rz>o zApB1O-j9Eo*Xlv|92x|FJs1q6|H*^ce=O)HWeNq{JP4oLAa|H?oN;8bU(`yCe?Y^H z9Ak?TevumBqXa(JC{po6RKo3Cq0a}s4=6qwzj_cn*$y9Ie1#SLmMMPCLZ-psx|UdL zFp&(!lfj@7jJ8ITMz9fy5eznTgqRIAN3Vz&!L!x}mq*q`6Uj(?L31dPh$M`G1H2h^y6l2Twra8?B{H7#v1w7)tW zmS~_c+U5eGJ)@Va4 z99gwsMMZF7L}XVku7ug!Hg*JCq&=dEU`r_48g!YIW=2PZ!W+Sp#!?LyS@5q(Mp{s! z6z!v;3%58HZwb+$3!sAHur$&_#?8&K25147fMpw+E(qRpUW@lsjZ9IbClivB50 z#7fHyzzxjJGJ=tCC>cWa`b0u{6;Q2VV@Ykz`~|`3rPE7irt%eiT~R}D)xYTCoM!g< zkFdvBB79x4Xg@wWgtK2%;YLKGjsco>CFF?TF9`KKt6^heUwlA~8#@Evt?HL#;MXep zvJCtOivEra{5Cc2_hjI=HS5;uZk-uYNL!qP;G>+pqS!@Dnr>q=BvP z+TGtV4WoNG+^YLO(FcL8-?N|5B)v0#KHP8gPWc7y`4g&;BizK|o+G`uro2QL42+%^ z1^hf=x@gaS0Y6QcuGzCkz>gEAOZMy*@HYt46?=9G_(8&S!JaJw{xV^@UQe5Vzet!a z*Rxi@w-TnS_0$RY2Euf)o+<%fOPH?JQzqam2-Br{`~r>>rYrRn2>4RM3pNy(_Thv-f5JjK$9^-=>Af4})x9IW2hv-SMS1*}&w8&$*1V|t;x*4S=1ODfgTJwz5IMB5O?b%WVhhhPA=?hnP9_>6@y|vry zh}1M33>nZGdzF77RtT)w1qp*F&E7~c=eP8JG0Er0|$C0 zmp$kDd|j{D@6Jd%N<>kG=Co zW2tV>vFjfM_k#AEK-cwUP_q13?-8_WJIq%8QlM+*eIsbUEtOjTLFiX$`eX)u_4$FF zBkzTKSMR0I|2qfLQyeYT=T)z&Ub$*T;F@>IJh1bL$puKmfv&76B`6PcZkt>}h4yzB z{js;V`^UI})rDY1T0iS_9uTZR^2r~1d-K1&O`t2c2~PRj)`F&X=ZykcyVDyIRc{o9 z;B>73H%+d3>LA3G@88#sLH#7E7~TH{Zh@W2$yMdOj|;>sAhz$%?<^+AuBp!z`i-UA z-^<^26Pi=oH6Iyz8JN4%K!Z3v^X> z$37EffzD@=Ih{?L0-euw=YqVZD?0!WLamz4?EGz9A_ca;nk)=-!Px~q&}rpw8%BKB zyrEDo(B(^&_}YDR%HF!Nz;oUn3`SmoE@}O6V213D{OvCwrUkC~9y{xzHPshauc^MI zI`|BYJ_#roeK?Z*?OkYYd2jc9T2(LOP5!novG&e+M-d3ik9FVvd({wcttd^3(wWNu zfM_p?4wb)Dz4sGzNq1+8nC1D~?u4AcRs+NKx$d1QF>^&(4H>a)=e!x<(!C~Cw^)={ zvb<|vwh%OPEJ$GH?j@i?_wJZL&RtUv!sZAa2ap8V%WQIO=bP_Tit&4;-Mx-nI~Rc# z2Cg)cO9NYJZ^FSE5y%2Ny`9kZId3}vXnz@;Yzx<-DB;j(Mqb|yP# zJ_i5qJ_H%G{vrD3&Uw%0`i<^IP?NY-(r3>T{V5<`-8&S6D#5_pDX8X6 zLM(=P&PLVlV~V0wvhzuH1}S#VOmJL2=RJX8o$O{S;&qbU&qb$tbI9j6C=$c$d->b` zAb8FEOiVEIo?rr3dRJ7g>B^d%zoV5DdSC*v{VQUyE}RUD{fZX59kA|)o%8O3<+?9+ zNmzzrc-5W2L(RKIGVeYl<@-Bd>5gm4@8@re&_lbN-=Yb%UEWWTaQu`XEAQ=Wo?I5_ zTsXO;7PrdU&hTV^ZD;M|BHjvkgD$y~yCc6v80mbLdb>5=wgQZ6y5Q-$8H+Fg`OItS z_G9_m9>M5C_$xr$Mff`b4PMwamGV{i`%U*4^knty?^ky|cl9tC{c6o4bBpq~y#Ou? z=T7}0i1W7%1+ZxLAFrOZu(Mmv%MCA5Wap0pTYqf^4!n`YIj+`xqt<-AdiHaHuIYi! z@<7*e`0ly(rk9pB^j2^EzFBkNS6K@?r*?qlQu9~UofDRJZjhn1Yic2oJ$GVo$a!$z zBe0{0_C2RauPm)-?fjFW#!@p%CjfDK{j z_u1)BWAN2hF*N#MZSS>5)rwAW3?I7Acglumg&5*Yk? zBt1`Zyu)Vup4O6ur_%3gga&DmvjKNs`w8T3(6l{MfZMk|1&$(ka|-kkyd?#G3g6qe zKLz&C6}vjn!Zs{+TvJQ__G_t?oL&&uZo<&)83A73tBu(%Fep%#s{7h`bir@hJ1SpR*N1;4_2 zYwJ5U){qR;pZ2zYz{TW6T$_pC36D}fFwfvwc(`;**qD;w1CRD-a}tkg@DNSs69Dv+ zn^HX0K}jngU%9Xi;)$7GQ-PJgWJ+Srl<-OEnu}wxG%!CDN23&dGTIXHua{5M{HPjh z^vefF{u8H^mY0H`3im_aNPivjz^Ua{OTI||G(xjvikTqXm@-)(z8 z1TXeVUcutLqO$Nlk1;Ew|DdKD%3 z+z9+?@R^EKU*vNi{RXa`)MGtt4$Z3st~##-H1qR{P-lLgUG4t;4wnCW{jUZ7zp((O32|wKGhvPA z5ax9nrfyyu=CfB`xiU$;=hI_Zzu)-ePrWgc990!LQ}XIo8LY6y#kCnPKFHv;S;2aY z>1U6aQ^eJ+o*ODMgYQXr>A0ky-RWmecPPdh-;G~)yi{WBQTpj;cv>DN9-;qUMF=|y zSli*Kg2fXW@Wb3C%C+7?$UnhNzaP(3ivZo$-O_Zeos)4QKa7!WT5}y;Ah?w z{^2tI8Ugyf$X`?EZ=oHmfAss8%>L2uU;Y+Ze@~r%w*JxYoBp0Qx$7=juwahAWK}&@ zwe8bt@v1r=^H-G4DxER4yj>t?o+M%8R8*6bfehJt#9Y*GXiNTG{uI4A3f*a*i;(gN zh;_wR^;|&4J9zs^CGM8(yB)KiW!fKLQnEb0y{K$u`R)?P?2iP}dl#5xWqI*l92LB? z!PfH(33f)wh|$uziCM4h*-ob4B9Lw0$-J5Udob~Q6Su7Lhk)@titJ(UFtY;E(fPVYDcR@$S{B=2|yR@pxwE58B*_EI#-J5hmk_F<^wout6kb|>b0?_~2? z=z+O7jf??=bBzlU=oWrJ&zs+9NS#d(Sej6Yw3T zJ(lp<3f^tn#e{1W{D5hnOn9k+_n3A$;d9KXqW)gf{ubdnp}keS-?V2@-g2{B$p4;c z3}GMd05nv1laaHQ9r*3sUZ9G+PtZipezxIBX)VK9M2=5MW7*ChN&a*_n0Sf{;4(L( zLbm-7V8NN~6r72r7=is%V+(=(6M#Hw;kh2StaUqZhm%&I_u<^Pz)d}m;+FlO1-G-Z zvf8p(kaaw8xszb+0^g;Vpv1Wje0-OUMHYVO>_R8{E^9$Ydx~u%pHJ0yn7)N3F}5IG zWGY%)&@K{1Aht{4Xg*z9V4p<3i%sh6DK4@j@H^iURo8F7;s#6Xr=Yy=Y?JE;PjQ*e z^@gw33=6Q*&Liwf0e#t}_21z$SYUS)FHk&}vU{o4o<_l=MaMJfleX(F| z6~hUeQQ%u+J_$vvVmRT`=wja`<|hJ%6Lzv0A=3tTs~ArBd1@Lq86>P?IN`5hbYG(| zkyQ*QEFu3(%>@u^6~hTHr~DT4n2--AyqU^hZq9{zR`Eg8_Rz#hVNCOKP5U(Jd$lP-VezM?eLq~rw^?*B z+V8PHVtcok_X>S>cGPt; zUc~Yn6nxlYUyO>rE(IU)*ymB78x`E`v8&nMoeDncu_safO~MPU;!iy`pKbVVF_((| z+G1hQam09L(X7ognH|p_+s?R%A&h&0U`7KC;|HB6E& z;yAlyzaV{9kW%=OzNEr{o+^^w`i>y|AVpe$k(8D#xT=QV&OWV$Qvmu5tHrQEj!TMor_XYJ`T7i{ZJ8-E4@juU$w6h`gEXtB*zc5bBt0ad$<8s@(f2jE)+lk_ zfHdF3R28Au@o`K&BB4s>DE;hF2~{~iLOXnWsFtTV;M`9M-;kQEHil5}oj{3c3ml zd7xglZR0LkjzdmTN#|M30CTuRP;q*aRE)2Zipm?F8)=SL&Jk2AQ&g=fD#2Bdj;J(! zuRaN;PLdkFb-(Bc!?}{sFC}CC#)g1b%URkHe>1RpS+OJP^v?yT=%LCPs&E zm`PU~Rp%=-`PHL+9cQ5tCWASKygh+5BLx$#vaTl2QD#__7TAxow~td`k==nV@fDd2 z%^3FfeQe-plQGy+Tw*U~>G3AxELT}`DQJusTAt!c`~Q&DI3=jcUPig&73Y94@;Qc= z3FaZRVN{WCqWLxIx`WzGO6j_d4J=OS%Fj1_lT8L|u5w3ykrJku?Wj4b%y*(W7A)}sb8s&d^Zc;u;6uj9B{ao!bGay8ElRog6j8z$c|ZBg zFxx~apJmB7vP)A86S;bF%C>it-xui#73P;kjR!;xMkKBjW#nP-HAec`Au~-b3`X8W z21N|Q**3>Z zwoOmOBnw03ZbYHqp28Kb6Gk|-PmsSq4CiGyg?-`#;NVt{0|L8*O@m`P-QaGYtbVD0 zRUS%@`xP9~%(gE;KKB=pP%gn>x4)@ghaq>g?%h*Wud z5@;#}<%lJe{sEXHOiep+($r-I&XtgpGn|$1i_W5PLhbB^O86F=shDNr_NjD!MC3nh$|ly%N);FdE*LaUv_o;0-9 zDTm2)S(8%%ZaF8uiT4Ni8Ru+rEphCbn`iEi1!|2CI0R z>Dga*vZH@;ko*+uR}vl{o(eGvppGp)%)gLSrOU={!iD%FtELRH&9af$Cymheqy$ z(#Hpr3FD63N@^k1n=2JEobSROxu?IR)Vm7KlzWEsiUKE$Wkl|ol2ws&5z7`xXsmNS zp@kCiJ3pe(#a|X&N}Qc+@)8M^Imf~8asyh~&j{5>sLDBo63&)Tz$qk`S_#!T#pJS7 zLaUwES+-0pBTFIWy4Hx#vo#&EeuHcZGyHoaf<9xffAS;Ui~}bd3bzBc~%; z*C6L&dz(0bB)XgLvO1qh-q z&?E~O&cfuCZ65}rXp1xSH~8>Y3|A+|9T%J&9T$$lG)}HGaDlT5J?=OX8sRi~0Od)j z$nimICtpHiojs&1kj?iy--YsyP=-T!8%*j9mu2{QfT8RZN~qGgjP=x@uW~8~DL)N3 z7s3}E<(YNPH86ssJae^kE1}U+`da5X*w;~h+T4e%LB!I>X%9Lh5dMO}5Lt z7Bu5T<4iAQj2A8Qcv(21Ee1PV0&k3c3nnyQ$r4W>%zdaf{ui{#&$BvEF#bnmD)avF zuR&$=zp_XKRrv7o1+B_+#@M~^AM<=mGI|>Y6SEO8%nL1J(tpt~wW?^+Is{9zPC>N}q1968HB?}}6k0&# z7l^zR+Tu0FzKPB=Z}LjB^g`T}Bw^;D(Pik56F#Cw_jpYG(qku#&damGt{80?C&pOH zW{K;BGuc1yc})Gf>+UppgCc)VkQbA_S2b6i zEZq9tEc(r2{5whbk%Y~2PdNi9^F2{|GqR_)L}6YDzekuG(G+|(dd(;)Wb@weh-Yj1 z)zs3o0`ss{=|tG%4G$+t!|Ty^*hO{(u{9c zjBgW+*P=2R-zF;GP6&)8#K-z%{5i?ExRD-~51;G>3ptGPr5lK0lms1=&|xG=+ufTKpz3Bs72;RG_qnfGIP+H znPFt!QY>c_0La6@o^>{aYC#XFQgeehi4WdptU(!BpO#5b(T>Kr-WQWL{_H7G&zsVdZrot9T61cL7x#K;}G*q>3LP^DHtm zUqNOydYspc?EuaaCat6kh7?{*S)05w_5k-bif7!1%rvy5{6%tq0#FB_ii61fgqfF+ z8Hyn>`!VRw>o+Q02m@DqfYQ&Q)Hp2)dAz=$(uy}x^b(7BRWe4GtL`q~l=KCwybkHi z|3twS%*BF=flyQJBGqcEd_U3|AERK1s&337t(hf;$q>sw#ZTCnvxiRSRoD`Zy#kFe zvlX^XV^3w2_9<-lWW~WtH@6k`sKyFsA0j5yAy$>CVOMJroEYEIB5Y$$KK$Lh$@3GShFJPrmpLa>@XZRVzigQkXL#79?4ZAo znZxm8-lDMjYnVAJsOi6X_+w;Q7a%?BK?$6G5&+-hCN(n6(<>p< zx7gw<6cB#Xfb_AlXzuSY&htj_hcZeKZqfiBAm`^QviC8z3MNQEtT$$%IrEIUF*s&H z#VG(#{Xy^_ww(bIz{%h>tV;neppnBqr+@~C%-zJ_n5KEg6q>nHxR5!-(&q;l<}hU<;z?zID+ZiZFn^hLJ@a6-H$(#wP@FdX6%gI3{ zuL;n0BnNLzVI{n1h-uao5Q{0l~! zC+13)!@PoEII7uFXI3jD0ojcxG;>%@@E)n8LM<$aQIb;lxI!p=I&4>@u!4ScN~!>l z2WX2r0vw}6sz#12g$bx2HS-IKao&^}us*AB0TTdFU7-nx4P)X^RgCi>N>x^J!r>@s z){-$+C$c)0R*;e6bV8btomn-MCO9!o!GT_qrl~1RQ=OF7l@I1lc7dpLN?LjHI5n+4 z!KpbW1(lYXXXa`f2+r9=Ptz?MhGv$HGs_E?o2#-{=UgCMr91}!CfEvuVhWz&Wd@iE zfk9^GP+(Yh7VDC)u6tSzyqDX&D&1T$dq_Nm&v7XZ?sF9g?>aM={e616Tq5R8#Be&p zjipw``51m4gYQsG^Rqk$ck!Vf;c4xO_%s|;Fl}8!!?cddSvdJ&YIC%;y<_US*7j-m zXlPorwV}B^95Do?0{T(hrw5Kr;dl+1Z;60=*o_HC5)E-T0^bz5!A2gK z;YPG=#K{iHh~&ppCuFWZ7Hf8sHOE@lx#9Ya$w(+34{dZK+crjcxCNU6MG-+f`iFvb zx7RGP4jCU7S--PB95JWN@MM|UjpF`f_Ui1XrY*YQ(A;Sc&9$7>w_2CKHO)GD<;x>( zdBpnKX8UVQe_+~QvyOR6tsAbg8n} zogU9grgi64_F48itI$3u2s~4Vi*%XYezv{G`n_czv|qJ`9lX_QI?MXel}YQ-tj5E; zqgK9smi6ULyR2I_C#^H>d#vhvtoM!NmwsmLw>*=~-&tEX*>72&SRY#3HhpM0A0D!X z18tvS*F1cvJ<_{%gx_Q7l`??dZfH?Mxv8vWMW*0i^*H$ir`b-CvR z^WM)*Tikx{m+%#fX{vKca1e+%{G=@&!4W9pcov@45?mQ?kKlZf_68m*!oyFNVP8sP zb8Le={scZ3Pa2J>oiX%k{NEPGqwLmt96Qt2jKf@l@d%GQ2}j~YhNJ7F7>+!7gkHZe z(umJ=6A2vR5=zR8^i!1M;vs+N2>Cydu_8AB~8i zVFYWI1rwq55phfj*tEu4uZYBB6cEA@CXvhABdrY)AurMv$9RoHDQ@`TF)f#g?}r7C z4e=;Ws;S3$I0g=ZiNFFJ<%*8Aa2icARByCx3?l5H0LQFcX5cYDUc@&>;=&T~2&(dU z94LzeR@kagILsu`UZ2EqH%TKNX^udKs}f2(aKH@orEskog$FD3zM>$v4S_<&576jF z3w==_&;4m=g7u9cl)#BI&Fw9%h+)A{d|g8fA6T;fhDhkLW*h+&Yi#5z306!5*NH9+ z)hAFTDJ;cZPV8(pQJf>gcEVkR3a~9yhHJ#)x{G<3PAI;yvAwl{5=9mEv(ds%Krgh{ zBg#eFl5iXNNMi%Ef#7y|f{r0f-`67Ap<3FpDXXn{Beq#VNSpK%>1)cp8iVYs^`Yi= zc2*rawV^43lW*$zHR;Bn+Fd0q))Iy{ zc8zqTP;;WKxjkXXqn2n!_VD7G+C{V{dkt1&#}RDCb}%?%q6Ko1Y32}{FPyLr!!g0; z@C{RYYa+U?H4^s2E8<3dusO0m(#-nnacC1dIOS<=!Pdxz3}0&vM_ZIR7vLPHWQ6Ao z$zh43hs4QE!YD42xf=yE90UgxL6^pOBw{2kN58j$5nTeGr>w*1K-7_)4pU1TkX(4Q zi)~wM15Df)T!-lmW}^AhQKlaFNYdp$BHFanN8&QtaE#L&GIY4w$US-R#VGtn4RQ2P zzYzyxHAI@5VX%ZD0++ZU?qN)c0S|&!r8+x|;{~w|STK2WZYo*c@8NL&D&%7zCmK{U`=>a}+UEGR&|WEsI8L zcI^3tpr)-DR}gYJ3=_gk(Rd=saM~I}WNeEI8T}965?zQ00t+P#c#j}!2%-xbaZs6n z)M#bMM!b)OInr2-r;)*BS|jU1$>@49(KIKTqK*3OEM=hfRQy6EG?!t6AuuUMx`6>A zq@WO!N=vA%O^sw7FH-Rx6i||ubcYkp0+=`w@dhevXaT~9T)xhEAnj*xG9eTdg(oyL z#}eoNUT{u3$CaGRF&r*W#Y#1>#e9jefyFKjN0$++<5oZ-R>-Zb zbf}f_jq^EHsHJqWV5~VDRI`%wWwA1apYz1J_(nM#S`%2iORvM3cVf#AS?EQC4F4P| zD@3TJC@gkV7q^5kHHe9j){3=aQjx~f4NlGbsgTb_v|rpX{TR|0f=#HcT|YB)()lsc zr9-@%h{#abfM64B=M*wz$@Pou|R#!RgTA|0U? z9F}LaG>bI>^x@3MrY~Uh2+xe7Jdl|HK^^x}fWm=lvc zcQD#|d3zN8K<|aes|8y!HO-4N9YMhK=@Aj^QF z$5ulu5^rE*d5oZ#J7HU4IaMv@9)4=r%9b&_h$t(Z4^|OpF$OQhiWp;pt9#u|LbUMh zaIBq+2&k#&Sht%bc_^bADJsMWlOU7`7I4dGQp5`QCqoV-iw5XQTz;sEnETU9!Svut ztyDP5#6pkfOQwD*aBVAt5hDcVS2;m&dXqm+q`G=-ELt9x4k(X11ST$Hz9^H+M+QmG z(xMTKasesVx{@6xatuAXD_RP>GpCo&()+L|Y**`*V4?}X_vss%193qNK`YdXxCPm4 zGWlQ*Q5Jzu;(xuIP_wJ(ZK;JGvS2L6R*)u`RRJT2Ur#M<%7d2RU`m|5DSl#c(bJ$} z5QK>}C8eq{f?qL02{cPgQ+gz&T$x);Xk2z8DjULhes;dJ-U4|2GBJ^eV73VB^^F`c2r%gT73wFQ9xaeb zgDH^=gEIQB4Ask;^;m(mhMQ42xL&N6^+Y2T#0jZkcq~>$=m}0dMBDfSp8r|;OgJ~^MfNrxU5(;vY$aD=Up5s?O&j_*r7dP{6gq|D6Cu?B+-cp zhC>lYpa9O6MX=%77BVLmcOw3R5Ru2NKV1af&A6pj|CnL8a#UT8qgz*|rd`=D%7dkI z^a&Ao<`!!g15!jH4p0NXXA+@xXuddjHNhDq780vK`nQ|`#d;aaie)XMGA0!rEcMR} z5dxC2HY2eyAr_Aa>cMkjt@`0eI+}@)gk~Y4HK_A+VOGJ9mc+tSt!HF&>aoDpi!@nP zjHMvnaq9~YO2uUwt29cdc<&)DyiF9>03?1@bc#w%W2Mekr%-iURrdBYO65|CU*&Wy zk5P8-ISRKzrKWK~LS;MBs7&UpsY+9cU*+7~bzVy`jk<^;(^7!?Yq;x{TSjv8y&BMB zETe7ny&6ahSgo_^7S-u&+FYwsEm4`>D*dKP(KX*v+5bqRR4$e5R=IDe6uqTueJ_nt zxm2=S<3l2vc1>>tu7l}jbM)*C63mAcl)X;g|_Wpu5y ztaEj(_foa`X~>7_ygWKJHrP5pCXFl5`EhAnkstdJgKL#59DER8GE`B&1o5}kiFjq~gLf2MIoI{#W4SD^Dp z(l}e^_10&hpwu;eU!Yp_QmSQT_v(tVEJ?@V`KZdj=EA+N@`v#fniuJG{v(CMc+}a6 zczeXlG%mgs-(~Rnp-NfvW0m*eg(ffJPEh%oE?le1->Fits|`AzZdZA~IQh@qF1%_y3m0J_WcVAKQAU8a3i`>DH34?8{N++}+B>7nN?)5A~? zL3f$S6)3Z$Vi)pOr zufdA`8m#EA!HWJGtmv=7iorBEB^B4p?$vp2`R8RCm-M&ZCH<{;iPrtF3d9U!naUHF zsXcL0RQj&FaHdN!onM$ztWIb7`5G^*I3RIAh3 zv}ITHx9p1kmhI;i|1aC*3L2N`V4JBm24ku$Q+;vdlhnmu2>y zyG%Mv`kt-&X=J*;(uFd2qAJoO#A9qyvuT=gfF`Eqr~#UoDjT4Qsj>l@m?|5fiK()* zRx+2V8$wd1Nd%Y&hsHA9x<_2$N9VthS{v5std0)|Z<$8m@ak`c zOZr>klKxh>WH2ktajB*A=cm=u+3pnT;!L%$678?m#e>Pye;|yF(RqGJ$P24xo&7Y0 zT9YYnU^A>a4j(Y`I!~phu|^`&cik1*#_n;KDaBou**teyruE%rncd(nOKT-_ud4=Y z-O&G;tbxkp2-Kfv^fykzIqH{5zDm(MI(vBv73{BMP%Ei>#597LN}i$^%t$d>qqB`E zR9$8*?Sxs1WQbvPOz{gUjk+#X`(mxxIVu>!PjyzWO=c^e z(G>4BI;(j@xujAqv-W$c*2gOK7;U!B4^8RO?UEy?HyDup{46a4~r@2?fktJcj} zvq|FgT|Y4xt(M*TmwcIm^-qll75pugKCe>!`}h+z-K06o+&`NC7Ny5v`eo{)*J^rM zvs;;Fk4lfI^r%Wp)CjyoxsZ+spDH*r3TXe*9j-k|yUjnlKDxbnUHs?To7tYfx4w>e z+TMSyJ^$YNdN^@k8m~DjZB(iDlNS{%snYlV>H2@Iygx^8lqNQ|@KdN#ypxb=lg{BA zsYofl3@+ul-r=cu$}S-BElz28V=HPJBE=g^QKH`g!Ggg<2h4*ig6VW}2H#9aD@8euACKw!M^$~D>S;;E{?xg?nr$UAIryjRSE-Cn zA5ax3mqltiGK!GrRfT^f(e?HD#X8-r3qZq5sV4#41Ng_YgEg5xFIcDgg@)E&)9I8m zAkQM!us)Air)5eK^`~sDzd{>fWOUnz>sACh-J=xN@^yXP{??58`aETwu2zb%KEKb; ztlt3~MW~4-bzZdo`>KZpi}V| zv~*>px}HXDL&jZSpKq;G#ZHsUujEq@jyhBIrz>2E`k}7VgDzTTwf%InZUv5c-T#?? zk9Z*~xvot6?M9iqekJzj@zQCo79`Or`3f{1M1~~VKhl4%SyE)$OY5)ee?6nVJ>D;h zZ0tzm_2=sE1&v#Nk*Z&$>SxN!g!$5ozNhuq=V9x=BfU$tU)xRB*LpphAz%L;#XS>H zfU8m_sk^SP(-% zFHN?8vZQ!mvLx9rlhoax%E`=YNT`2V242@cIRj5xUOMe|Sd6Kif<=n{pt+mGC-lb zj$N{bymvD&#UPI6Geev0bp1=FzeX04mFWxrveA^e_|L?4`+`>$( z=f}SEIfkD1`r`ZlU24h4G4wpump;$X^H5)WerjIni!U(rywMjw49A}M-6)Z_@E5Li zoOc&mMj=iy7>Is^q2qF2`jLi?w|()W3>`=N;*T?QeC&(Y-sr~C&T2C6iw0gzviLs1XAaO`46l^?V#WgLB0-DH=Z%4JW-m z6=gl>cuiJ#KbpX6s!WVCfj9B@=JlxsI!>Oe==B*Sn!Z`l>vIw`z1TSmKKgV4CC1pU z==J#rn*Iw4ulMQul|J_?e907v(ew{1ygqY5;~x|FQP^KC>DjNmo>lZ!icgkA8$VWf zea3>uzpn6=8FCq~X`es_zE|K!8Cxd$1?L@rc@-g!o5m4!mrK1Cl!Bv=7M^pX!D{@IFk&1MwL>2>#ST@CydP^K_5`#H9yR9MHOQ-}gXr>wzDR zzec2gk7;`TC1!mLiN-PAHVB{34T9&N0~|>16NBJ?JP7{vLGT|Ag6A<@1IguqMt*mL zRDKfh1JU#N=7I3@1pb5GEmQh(n-BbO#xYgtA~gV(Df-NQxk%vqE5s*=1IfK&5d4k6 z_tix5+&u{WHwM8U7zF>)Ab7qLpVVJ{<1^rg8~xW;Cf1w75Fhlp9Uv3e1mFj1uYsML z&B1jo*zt=Ghq2kBA&y-_*o%pe;)B5jE0-+~*4C_8DgLP7!amSh3tUCvnA&;~6b}f4 zq4o~(d3`hXXopK@&74tgumIl*cMzI^jSKkLIv8$mX~9kyDQD3+3x$})%d3|z3TlXA zbUrObJdI3A!B^Zo<3N6-+yJCLavtEr^;E_FyG&(~+>RvonG8bA zZ9%e#yHdplhx9f^Hy637Ns)?e=X%4K-bqof7~sJu_Uwo)-I82=Z?4$)fl|9_WMOJc zg9HcI06Abm+DrrOdXiN#OVV{x8{Q@Ku7|NrPtMxxb1ebsHCA3xTTV z5`*p6_*0ihhz&%P vM+9uNRBoIK1{*p;?14}-x;$<4>7_Fbb>x8XKe_2*pbbOhd!GCQr^f#U2mYzu literal 0 HcmV?d00001 diff --git a/test/extensions/compiled32/__init__.py b/test/extensions/compiled32/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/extensions/compiled32/compiled.so b/test/extensions/compiled32/compiled.so new file mode 100755 index 0000000000000000000000000000000000000000..df34cfa0770f9d827e2bd93dbc2054b69a0c0a1c GIT binary patch literal 38086 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 Np@i2?=_YCi{9mC)3vmDd literal 0 HcmV?d00001