Skip to content

Commit

Permalink
Fix C optimizations broken on Py3k.
Browse files Browse the repository at this point in the history
- The bare import of '_zope_c_optimizations' prevented them from being
  used.

- After enabling them via absolute imports, they would fail due to
  http://bugs.python.org/issue15657.

Fixes #60.
  • Loading branch information
tseaver committed Nov 15, 2016
1 parent 88c34a3 commit 53246e5
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 13 deletions.
4 changes: 3 additions & 1 deletion CHANGES.rst
Expand Up @@ -4,7 +4,9 @@ Changes
4.3.3 (unreleased)
------------------

- Nothing changed yet.
- Fix C optimizations broken on Py3k. See the Python bug at:
http://bugs.python.org/issue15657
(https://github.com/zopefoundation/zope.interface/issues/60)


4.3.2 (2016-09-05)
Expand Down
9 changes: 9 additions & 0 deletions src/zope/interface/_zope_interface_coptimizations.c
Expand Up @@ -25,6 +25,15 @@
#define Py_TYPE(o) ((o)->ob_type)
#endif

#if PY_MAJOR_VERSION >= 3
#define PY3K
#endif

#ifdef PY3K
/* See http://bugs.python.org/issue15657 */
#define METH_KEYWORDS 0x0003
#endif

static PyObject *str__dict__, *str__implemented__, *strextends;
static PyObject *BuiltinImplementationSpecifications, *str__provides__;
static PyObject *str__class__, *str__providedBy__;
Expand Down
4 changes: 2 additions & 2 deletions src/zope/interface/adapter.py
Expand Up @@ -398,7 +398,7 @@ def subscriptions(self, required, provided):
LookupBasePy = LookupBaseFallback # BBB

try:
from _zope_interface_coptimizations import LookupBase
from zope.interface._zope_interface_coptimizations import LookupBase
except ImportError: #pragma NO COVER
LookupBase = LookupBaseFallback

Expand Down Expand Up @@ -434,7 +434,7 @@ def subscriptions(self, required, provided):
VerifyingBasePy = VerifyingBaseFallback #BBB

try:
from _zope_interface_coptimizations import VerifyingBase
from zope.interface._zope_interface_coptimizations import VerifyingBase
except ImportError: #pragma NO COVER
VerifyingBase = VerifyingBaseFallback

Expand Down
16 changes: 9 additions & 7 deletions src/zope/interface/declarations.py
Expand Up @@ -640,11 +640,11 @@ def __get__(self, inst, cls):

# Try to get C base:
try:
import _zope_interface_coptimizations
import zope.interface._zope_interface_coptimizations
except ImportError: #pragma NO COVERAGE
pass
else: #pragma NO COVERAGE
from _zope_interface_coptimizations import ClassProvidesBase
from zope.interface._zope_interface_coptimizations import ClassProvidesBase


class ClassProvides(Declaration, ClassProvidesBase):
Expand Down Expand Up @@ -917,13 +917,15 @@ def _normalizeargs(sequence, output = None):
_empty = Declaration()

try:
import _zope_interface_coptimizations
import zope.interface._zope_interface_coptimizations
except ImportError: #pragma NO COVER
pass
else: #pragma NO COVER PyPy
from _zope_interface_coptimizations import implementedBy
from _zope_interface_coptimizations import providedBy
from _zope_interface_coptimizations import getObjectSpecification
from _zope_interface_coptimizations import ObjectSpecificationDescriptor
from zope.interface._zope_interface_coptimizations import implementedBy
from zope.interface._zope_interface_coptimizations import providedBy
from zope.interface._zope_interface_coptimizations import (
getObjectSpecification)
from zope.interface._zope_interface_coptimizations import (
ObjectSpecificationDescriptor)

objectSpecificationDescriptor = ObjectSpecificationDescriptor()
6 changes: 3 additions & 3 deletions src/zope/interface/interface.py
Expand Up @@ -114,7 +114,7 @@ def isOrExtends(self, interface):

SpecificationBase = SpecificationBasePy
try:
from _zope_interface_coptimizations import SpecificationBase
from zope.interface._zope_interface_coptimizations import SpecificationBase
except ImportError: #pragma NO COVER
pass

Expand Down Expand Up @@ -155,14 +155,14 @@ def __adapt__(self, obj):

InterfaceBase = InterfaceBasePy
try:
from _zope_interface_coptimizations import InterfaceBase
from zope.interface._zope_interface_coptimizations import InterfaceBase
except ImportError: #pragma NO COVER
pass


adapter_hooks = []
try:
from _zope_interface_coptimizations import adapter_hooks
from zope.interface._zope_interface_coptimizations import adapter_hooks
except ImportError: #pragma NO COVER
pass

Expand Down

0 comments on commit 53246e5

Please sign in to comment.