Commit eaae74a0 authored by Jérome Perrin's avatar Jérome Perrin

*: keep using func_code and not yet __code__ with scripts

On Zope2, python scripts do not have __code__, they only have
func_code (and same for __defauls__/func_defaults).
We tried to backport the support of __code__ from Zope4 as a Zope2
patch - it was SlapOS patch 4fa33dfc6 (erp5: py3: `func_{code,defaults}`
was replaced in Python3 by `__{code,defaults}__`., 2022-04-25),
but this patch was incomplete. We tried to backport more, but then
realized that we don't need to use __code__ on ERP5 master yet,
because ERP5 master branch is still supporting Zope2 only.

This patch revert a small part of a17bb910 (py2/py3: Make Products
code compatible with both python2 and python3., 2022-04-13), the part
where we use f.__code__ where f might be a python script. For now,
we'll apply this patch only on the Zope4 branch.

A few places where f.func_code was used and f was a for sure not a
python script but a simple class method or function are kept here, as
__code__ support is missing only on in ZODB scripts.
parent 83e69b6b
...@@ -164,7 +164,7 @@ class Alarm(XMLObject, PeriodicityMixin): ...@@ -164,7 +164,7 @@ class Alarm(XMLObject, PeriodicityMixin):
activate_kw['tag'] = '%s_%x' % (self.getRelativeUrl(), getrandbits(32)) activate_kw['tag'] = '%s_%x' % (self.getRelativeUrl(), getrandbits(32))
tag = activate_kw['tag'] tag = activate_kw['tag']
method = getattr(self, method_id) method = getattr(self, method_id)
func_code = method.__code__ func_code = method.func_code
try: try:
has_kw = func_code.co_flags & CO_VARKEYWORDS has_kw = func_code.co_flags & CO_VARKEYWORDS
except AttributeError: except AttributeError:
......
...@@ -41,7 +41,7 @@ class Accessor(Method): ...@@ -41,7 +41,7 @@ class Accessor(Method):
def __getinitargs__(self): def __getinitargs__(self):
init = getattr(self, '__init__', None) init = getattr(self, '__init__', None)
if init is not None: if init is not None:
varnames = init.__code__.co_varnames varnames = init.func_code.co_varnames
args = [] args = []
for name in varnames: for name in varnames:
if name == 'self': if name == 'self':
......
...@@ -181,7 +181,7 @@ class Predicate(XMLObject): ...@@ -181,7 +181,7 @@ class Predicate(XMLObject):
try: try:
result = method(self) result = method(self)
except TypeError: except TypeError:
if method.__code__.co_argcount != isinstance(method, MethodType): if method.func_code.co_argcount != isinstance(method, MethodType):
raise raise
# backward compatibilty with script that takes no argument # backward compatibilty with script that takes no argument
warn('Predicate %s uses an old-style method (%s) that does not' warn('Predicate %s uses an old-style method (%s) that does not'
......
...@@ -71,8 +71,8 @@ class InteractorMethod(Method): ...@@ -71,8 +71,8 @@ class InteractorMethod(Method):
self.after_action_list = [] self.after_action_list = []
self.before_action_list = [] self.before_action_list = []
self.method = method self.method = method
self.__code__ = self.func_code = method.__code__ self.func_code = method.func_code
self.__defaults__ = self.func_defaults = method.__defaults__ self.func_defaults = method.func_defaults
self.__name__ = method.__name__ self.__name__ = method.__name__
def registerBeforeAction(self, action, args, kw): def registerBeforeAction(self, action, args, kw):
......
...@@ -234,7 +234,7 @@ def deprecated(message=''): ...@@ -234,7 +234,7 @@ def deprecated(message=''):
@simple_decorator @simple_decorator
def _deprecated(wrapped): def _deprecated(wrapped):
m = message or "Use of '%s' function (%s, line %s) is deprecated." % ( m = message or "Use of '%s' function (%s, line %s) is deprecated." % (
wrapped.__name__, wrapped.__module__, wrapped.__code__.co_firstlineno) wrapped.__name__, wrapped.__module__, wrapped.func_code.co_firstlineno)
def deprecated(*args, **kw): def deprecated(*args, **kw):
warnings.warn(m, DeprecationWarning, 2) warnings.warn(m, DeprecationWarning, 2)
return wrapped(*args, **kw) return wrapped(*args, **kw)
......
...@@ -44,7 +44,7 @@ def volatileCached(self, func): ...@@ -44,7 +44,7 @@ def volatileCached(self, func):
self._v_SimpleItem_Item_vCache = cache_dict = {} self._v_SimpleItem_Item_vCache = cache_dict = {}
# Use whole func_code as a key, as it is the only reliable way to identify a # Use whole func_code as a key, as it is the only reliable way to identify a
# function. # function.
key = func.__code__ key = func.func_code
try: try:
return cache_dict[key] return cache_dict[key]
except KeyError: except KeyError:
......
...@@ -1452,7 +1452,7 @@ class Catalog(Folder, ...@@ -1452,7 +1452,7 @@ class Catalog(Folder,
if meta_type in self.HAS_ARGUMENT_SRC_METATYPE_SET: if meta_type in self.HAS_ARGUMENT_SRC_METATYPE_SET:
return method.arguments_src.split() return method.arguments_src.split()
elif meta_type in self.HAS_FUNC_CODE_METATYPE_SET: elif meta_type in self.HAS_FUNC_CODE_METATYPE_SET:
return method.__code__.co_varnames[:method.__code__.co_argcount] return method.func_code.co_varnames[:method.func_code.co_argcount]
# Note: Raising here would completely prevent indexation from working. # Note: Raising here would completely prevent indexation from working.
# Instead, let the method actually fail when called, so _catalogObjectList # Instead, let the method actually fail when called, so _catalogObjectList
# can log the error and carry on. # can log the error and carry on.
...@@ -1838,7 +1838,7 @@ class Catalog(Folder, ...@@ -1838,7 +1838,7 @@ class Catalog(Folder,
else: else:
search_key = self.getSearchKey(key, 'RelatedKey') search_key = self.getSearchKey(key, 'RelatedKey')
else: else:
func_code = script.__code__ func_code = script.func_code
search_key = ( search_key = (
AdvancedSearchKeyWrapperForScriptableKey if ( AdvancedSearchKeyWrapperForScriptableKey if (
# 5: search_value (under any name), "search_key", "group", # 5: search_value (under any name), "search_key", "group",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment