Author: Wim Lavrijsen <wlavrij...@lbl.gov> Branch: reflex-support Changeset: r58872:21866df6f6b4 Date: 2012-11-13 15:56 -0800 http://bitbucket.org/pypy/pypy/changeset/21866df6f6b4/
Log: fix immutable directives diff --git a/pypy/module/cppyy/converter.py b/pypy/module/cppyy/converter.py --- a/pypy/module/cppyy/converter.py +++ b/pypy/module/cppyy/converter.py @@ -67,9 +67,10 @@ class TypeConverter(object): + _immutable_fields_ = ['libffitype', 'uses_local', 'name'] + libffitype = lltype.nullptr(jit_libffi.FFI_TYPE_P.TO) uses_local = False - name = "" def __init__(self, space, extra): @@ -127,6 +128,8 @@ class ArrayTypeConverterMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'size'] + libffitype = jit_libffi.types.pointer def __init__(self, space, array_size): @@ -156,6 +159,8 @@ class PtrTypeConverterMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'size'] + libffitype = jit_libffi.types.pointer def __init__(self, space, array_size): @@ -218,6 +223,8 @@ class ConstRefNumericTypeConverterMixin(NumericTypeConverterMixin): _mixin_ = True + _immutable_fields_ = ['uses_local'] + uses_local = True def convert_argument_libffi(self, space, w_obj, address, call_local): @@ -246,6 +253,8 @@ class VoidConverter(TypeConverter): + _immutable_fields_ = ['libffitype', 'name'] + libffitype = jit_libffi.types.void def __init__(self, space, name): @@ -297,6 +306,8 @@ address[0] = self._unwrap_object(space, w_value) class FloatConverter(ffitypes.typeid(rffi.FLOAT), FloatTypeConverterMixin, TypeConverter): + _immutable_fields_ = ['default'] + def __init__(self, space, default): if default: fval = float(rfloat.rstring_to_float(default)) @@ -310,6 +321,8 @@ return space.wrap(float(rffiptr[0])) class ConstFloatRefConverter(FloatConverter): + _immutable_fields_ = ['libffitype', 'typecode'] + libffitype = jit_libffi.types.pointer typecode = 'F' @@ -318,6 +331,8 @@ raise FastCallNotPossible class DoubleConverter(ffitypes.typeid(rffi.DOUBLE), FloatTypeConverterMixin, TypeConverter): + _immutable_fields_ = ['default'] + def __init__(self, space, default): if default: self.default = rffi.cast(self.c_type, rfloat.rstring_to_float(default)) @@ -325,6 +340,8 @@ self.default = rffi.cast(self.c_type, 0.) class ConstDoubleRefConverter(ConstRefNumericTypeConverterMixin, DoubleConverter): + _immutable_fields_ = ['libffitype', 'typecode'] + libffitype = jit_libffi.types.pointer typecode = 'D' @@ -347,6 +364,8 @@ class VoidPtrConverter(TypeConverter): + _immutable_fields_ = ['libffitype'] + libffitype = jit_libffi.types.pointer def _unwrap_object(self, space, w_obj): @@ -367,6 +386,8 @@ x[0] = self._unwrap_object(space, w_obj) class VoidPtrPtrConverter(TypeConverter): + _immutable_fields_ = ['uses_local'] + uses_local = True def convert_argument(self, space, w_obj, address, call_local): @@ -388,9 +409,12 @@ pass # no set on buffer/array/None class VoidPtrRefConverter(VoidPtrPtrConverter): + _immutable_fields_ = ['uses_local'] uses_local = True class InstancePtrConverter(TypeConverter): + _immutable_fields_ = ['libffitype', 'cppclass'] + libffitype = jit_libffi.types.pointer def __init__(self, space, cppclass): @@ -433,6 +457,7 @@ address[0] = rffi.cast(rffi.VOIDP, self._unwrap_object(space, w_value)) class InstanceConverter(InstancePtrConverter): + def convert_argument_libffi(self, space, w_obj, address, call_local): from pypy.module.cppyy.interp_cppyy import FastCallNotPossible raise FastCallNotPossible # TODO: by-value is a jit_libffi special case @@ -447,6 +472,8 @@ self._is_abstract(space) class InstancePtrPtrConverter(InstancePtrConverter): + _immutable_fields_ = ['uses_local'] + uses_local = True def convert_argument(self, space, w_obj, address, call_local): @@ -478,6 +505,8 @@ class StdStringConverter(InstanceConverter): + _immutable_fields_ = ['cppclass'] + def __init__(self, space, extra): from pypy.module.cppyy import interp_cppyy cppclass = interp_cppyy.scope_byname(space, "std::string") @@ -508,6 +537,8 @@ capi.c_free_stdstring(rffi.cast(capi.C_OBJECT, rffi.cast(rffi.VOIDPP, arg)[0])) class StdStringRefConverter(InstancePtrConverter): + _immutable_fields_ = ['cppclass'] + def __init__(self, space, extra): from pypy.module.cppyy import interp_cppyy cppclass = interp_cppyy.scope_byname(space, "std::string") @@ -515,6 +546,8 @@ class PyObjectConverter(TypeConverter): + _immutable_fields_ = ['libffitype'] + libffitype = jit_libffi.types.pointer def convert_argument(self, space, w_obj, address, call_local): @@ -643,9 +676,11 @@ for c_type, names in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): + _immutable_ = True def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoll(default)) class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): + _immutable_ = True libffitype = jit_libffi.types.pointer for name in names: _converters[name] = BasicConverter @@ -658,9 +693,11 @@ for c_type, names in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): + _immutable_ = True def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoll(default)) class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): + _immutable_ = True libffitype = jit_libffi.types.pointer typecode = 'r' def convert_argument(self, space, w_obj, address, call_local): @@ -682,9 +719,11 @@ for c_type, names in type_info: class BasicConverter(ffitypes.typeid(c_type), IntTypeConverterMixin, TypeConverter): + _immutable_ = True def __init__(self, space, default): self.default = rffi.cast(self.c_type, capi.c_strtoull(default)) class ConstRefConverter(ConstRefNumericTypeConverterMixin, BasicConverter): + _immutable_ = True libffitype = jit_libffi.types.pointer for name in names: _converters[name] = BasicConverter @@ -735,4 +774,3 @@ for c_type, alias in aliases: _converters[alias] = _converters[c_type] _add_aliased_converters() - diff --git a/pypy/module/cppyy/executor.py b/pypy/module/cppyy/executor.py --- a/pypy/module/cppyy/executor.py +++ b/pypy/module/cppyy/executor.py @@ -27,6 +27,8 @@ NULL = lltype.nullptr(jit_libffi.FFI_TYPE_P.TO) class FunctionExecutor(object): + _immutable_fields_ = ['libffitype'] + libffitype = NULL def __init__(self, space, extra): @@ -42,6 +44,8 @@ class PtrTypeExecutor(FunctionExecutor): + _immutable_fields_ = ['libffitype', 'typecode'] + libffitype = jit_libffi.types.pointer typecode = 'P' @@ -63,6 +67,8 @@ class VoidExecutor(FunctionExecutor): + _immutable_fields_ = ['libffitype'] + libffitype = jit_libffi.types.void def execute(self, space, cppmethod, cppthis, num_args, args): @@ -139,6 +145,8 @@ class InstancePtrExecutor(FunctionExecutor): + _immutable_fields_ = ['libffitype', 'cppclass'] + libffitype = jit_libffi.types.pointer def __init__(self, space, cppclass): @@ -314,8 +322,10 @@ for c_type, stub, names in type_info: class BasicExecutor(ffitypes.typeid(c_type), NumericExecutorMixin, FunctionExecutor): + _immutable_ = True c_stubcall = staticmethod(stub) class BasicRefExecutor(ffitypes.typeid(c_type), NumericRefExecutorMixin, FunctionExecutor): + _immutable_fields_ = ['libffitype'] libffitype = jit_libffi.types.pointer for name in names: _executors[name] = BasicExecutor @@ -341,6 +351,7 @@ for tcode, names in ptr_info: class PtrExecutor(PtrTypeExecutor): + _immutable_fields_ = ['typecode'] typecode = tcode for name in names: _executors[name+'*'] = PtrExecutor diff --git a/pypy/module/cppyy/ffitypes.py b/pypy/module/cppyy/ffitypes.py --- a/pypy/module/cppyy/ffitypes.py +++ b/pypy/module/cppyy/ffitypes.py @@ -12,6 +12,8 @@ class BoolTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.uchar c_type = rffi.UCHAR c_ptrtype = rffi.UCHARP @@ -28,6 +30,8 @@ class CharTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.schar c_type = rffi.CHAR c_ptrtype = rffi.CCHARP # there's no such thing as rffi.CHARP @@ -51,6 +55,8 @@ class ShortTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.sshort c_type = rffi.SHORT c_ptrtype = rffi.SHORTP @@ -60,6 +66,8 @@ class UShortTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.ushort c_type = rffi.USHORT c_ptrtype = rffi.USHORTP @@ -69,6 +77,8 @@ class IntTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.sint c_type = rffi.INT c_ptrtype = rffi.INTP @@ -78,6 +88,8 @@ class UIntTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.uint c_type = rffi.UINT c_ptrtype = rffi.UINTP @@ -87,6 +99,8 @@ class LongTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.slong c_type = rffi.LONG c_ptrtype = rffi.LONGP @@ -96,6 +110,8 @@ class ULongTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.ulong c_type = rffi.ULONG c_ptrtype = rffi.ULONGP @@ -105,6 +121,8 @@ class LongLongTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.sint64 c_type = rffi.LONGLONG c_ptrtype = rffi.LONGLONGP @@ -114,6 +132,8 @@ class ULongLongTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype'] + libffitype = jit_libffi.types.uint64 c_type = rffi.ULONGLONG c_ptrtype = rffi.ULONGLONGP @@ -123,6 +143,8 @@ class FloatTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype', 'typecode'] + libffitype = jit_libffi.types.float c_type = rffi.FLOAT c_ptrtype = rffi.FLOATP @@ -136,6 +158,8 @@ class DoubleTypeMixin(object): _mixin_ = True + _immutable_fields_ = ['libffitype', 'c_type', 'c_ptrtype', 'typecode'] + libffitype = jit_libffi.types.double c_type = rffi.DOUBLE c_ptrtype = rffi.DOUBLEP diff --git a/pypy/module/cppyy/interp_cppyy.py b/pypy/module/cppyy/interp_cppyy.py --- a/pypy/module/cppyy/interp_cppyy.py +++ b/pypy/module/cppyy/interp_cppyy.py @@ -118,6 +118,11 @@ also takes care of offset casting and recycling of known objects through the memory_regulator.""" + _attrs_ = ['space', 'scope', 'index', 'cppmethod', 'arg_defs', 'args_required', + 'args_expected', 'converters', 'executor', '_funcaddr', 'cif_descr', + 'uses_local'] + _immutable_ = True + def __init__(self, space, containing_scope, method_index, arg_defs, args_required): self.space = space self.scope = containing_scope @@ -144,7 +149,6 @@ @jit.unroll_safe def call(self, cppthis, args_w): - #jit.promote(self) assert lltype.typeOf(cppthis) == capi.C_OBJECT # check number of given arguments against required (== total - defaults) @@ -160,7 +164,7 @@ self._setup(cppthis) except Exception, e: pass - + # some calls, e.g. for ptr-ptr or reference need a local array to store data for # the duration of the call if self.uses_local: @@ -188,7 +192,6 @@ @jit.unroll_safe def do_fast_call(self, cppthis, args_w, call_local): - #jit.promote(self) if self.cif_descr is None: raise FastCallNotPossible cif_descr = self.cif_descr @@ -312,7 +315,6 @@ @jit.unroll_safe def prepare_arguments(self, args_w, call_local): - #jit.promote(self) args = capi.c_allocate_function_args(len(args_w)) stride = capi.c_function_arg_sizeof() for i in range(len(args_w)): @@ -364,6 +366,8 @@ all the needed functionality, by allowing the C++ this pointer to be null in the call. An optimization is expected there, however.""" + _immutable_ = True + def __repr__(self): return "CPPFunction: %s" % self.signature() @@ -373,6 +377,8 @@ it allocates memory for the newly constructed object and sets ownership to Python.""" + _immutable_ = True + def call(self, cppthis, args_w): newthis = capi.c_allocate(self.scope) assert lltype.typeOf(newthis) == capi.C_OBJECT @@ -393,6 +399,8 @@ operator[](int). The former function takes an extra argument to assign to the return type of the latter.""" + _immutable_ = True + def call(self, cppthis, args_w): end = len(args_w)-1 if 0 <= end: @@ -408,7 +416,9 @@ """Dispatcher that is actually available at the app-level: it is a collection of (possibly) overloaded methods or functions. It calls these in order and deals with error handling and reporting.""" - #_immutable_fields_ = ["functions[*]"] + + _attrs_ = ['space', 'scope', 'functions'] + _immutable_fields_ = ['scope', 'functions[*]'] def __init__(self, space, containing_scope, functions): self.space = space @@ -443,7 +453,7 @@ # # TODO: figure out what happens if a callback into from the C++ call # raises a Python exception. - #jit.promote(self) + jit.promote(self) for i in range(len(self.functions)): cppyyfunc = self.functions[i] try: @@ -486,6 +496,8 @@ class W_CPPDataMember(Wrappable): + _attrs_ = ['space', 'scope', 'converter', 'offset', '_is_static'] + _immutable_fields = ['scope', 'converter', 'offset', '_is_static'] def __init__(self, space, containing_scope, type_name, offset, is_static): self.space = space @@ -532,7 +544,8 @@ class W_CPPScope(Wrappable): - #_immutable_fields_ = ["methods[*]", "datamembers[*]"] + _attrs_ = ['space', 'name', 'handle', 'methods', 'datamembers'] + _immutable_fields_ = ['kind', 'name'] kind = "scope" @@ -632,6 +645,8 @@ # classes for inheritance. Both are python classes, though, and refactoring # may be in order at some point. class W_CPPNamespace(W_CPPScope): + _immutable_fields_ = ['kind'] + kind = "namespace" def _make_cppfunction(self, pyname, index): @@ -715,6 +730,9 @@ class W_CPPClass(W_CPPScope): + _attrs_ = ['space', 'default_constructor', 'name', 'handle', 'methods', 'datamembers'] + _immutable_fields_ = ['kind', 'default_constructor', 'methods[*]', 'datamembers[*]'] + kind = "class" def __init__(self, space, name, opaque_handle): @@ -819,6 +837,8 @@ class W_CPPTemplateType(Wrappable): + _attrs_ = ['space', 'name', 'handle'] + _immutable_fields = ['name', 'handle'] def __init__(self, space, name, opaque_handle): self.space = space @@ -840,6 +860,7 @@ class W_CPPInstance(Wrappable): + _attrs_ = ['space', 'cppclass', '_rawobject', 'isref', 'python_owns'] _immutable_fields_ = ["cppclass", "isref"] def __init__(self, space, cppclass, rawobject, isref, python_owns): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit