[pypy-svn] r25159 - pypy/dist/pypy/translator/c/test
tismer at codespeak.net
tismer at codespeak.net
Thu Mar 30 21:01:35 CEST 2006
Author: tismer
Date: Thu Mar 30 21:01:32 2006
New Revision: 25159
Modified:
pypy/dist/pypy/translator/c/test/test_wrapping.py
Log:
getting closer to a complete (two-way) wrapper. I have to say: writing assembly code is similar but simpler :-)
Modified: pypy/dist/pypy/translator/c/test/test_wrapping.py
==============================================================================
--- pypy/dist/pypy/translator/c/test/test_wrapping.py (original)
+++ pypy/dist/pypy/translator/c/test/test_wrapping.py Thu Mar 30 21:01:32 2006
@@ -19,7 +19,7 @@
missing = [object] * (func.func_code.co_argcount - len(argstypelist))
return missing + argstypelist
-def get_compiled_module(func, view=conftest.option.view, inline_threshold=1,
+def get_compiled_module(func, view=conftest.option.view, inline_threshold=0*1,
use_boehm=False, exports=[]):
from pypy.translator.translator import TranslationContext
from pypy.translator.backendopt.all import backend_optimizations
@@ -79,20 +79,12 @@
# stubs for special annotation/rtyping
-def create_pywrapper(thing):
- RaiseNameError
-
-def fetch_pywrapper(thing):
- RaiseNameError
-
def wrap_obj(thing):
- res = fetch_pywrapper(thing)
- if res is None:
- res = create_pywrapper(thing)
- return res
+ RaiseNameError
def unwrap_obj(pyobj, typ):
RaiseNameError
+unwrap_obj._annspecialcase_ = 'specialize:arg(1)'
def call_destructor(thing, savedrepr):
ll_call_destructor(thing, savedrepr)
@@ -108,11 +100,53 @@
This was only possible with Samuele's hints.
"""
-def rtype_wrap_object_create(hop):
+def rtype_destruct_object(hop):
+ v_any, c_spec = hop.inputargs(*hop.args_r)
+ repr = c_spec.value
+ if '_wrapper_' in repr.allinstancefields:
+ null = hop.inputconst(lltype.Ptr(lltype.PyObject), lltype.nullptr(lltype.PyObject))
+ repr.setfield(v_any, '_wrapper_', null, hop.llops)
+ hop.genop('gc_unprotect', [v_any])
+
+def rtype_unwrap_object(hop):
+ v_pyobj, v_type = hop.inputargs(*hop.args_r)
+ v_adr = hop.llops.gencapicall('PyCObject_AsVoidPtr', [v_pyobj],
+ resulttype=hop.r_result)
+ hop.genop('gc_protect', [v_adr])
+ return v_adr
+
+def rtype_wrap_object(hop):
v_any, = hop.inputargs(*hop.args_r)
+ repr = hop.args_r[0]
+ c_repr = hop.inputconst(lltype.Void, repr)
+ if '_wrapper_' in repr.allinstancefields:
+ return hop.gendirectcall(ll_wrap_object, v_any, c_repr)
+ else:
+ return hop.gendirectcall(create_pywrapper, v_any, c_repr)
+
+def ll_wrap_object(obj, repr):
+ ret = fetch_pywrapper(obj, repr)
+ if not ret:
+ ret = create_pywrapper(obj, repr)
+ return ret
+
+def create_pywrapper(thing, sr):
+ return ll_create_pywrapper(thing, sr)
+
+def ll_create_pywrapper(thing, sr):
+ return 42
+
+def fetch_pywrapper(thing, sr):
+ return ll_fetch_pywrapper(thing, sr)
+
+def ll_fetch_pywrapper(thing):
+ return 42
+
+def rtype_wrap_object_create(hop):
+ v_any, c_spec = hop.inputargs(*hop.args_r)
+ repr = c_spec.value
f = call_destructor
hop.genop('gc_protect', [v_any])
- repr = hop.args_r[0]
ARGTYPE = repr.lowleveltype
reprPBC = hop.rtyper.annotator.bookkeeper.immutablevalue(repr)
fp_dtor = hop.rtyper.annotate_helper_fn(f, [ARGTYPE, reprPBC])
@@ -126,28 +160,14 @@
return res
def rtype_wrap_object_fetch(hop):
- v_any, = hop.inputargs(*hop.args_r)
- repr = hop.args_r[0]
+ v_any, c_spec = hop.inputargs(*hop.args_r)
+ repr = c_spec.value
if '_wrapper_' in repr.allinstancefields:
return repr.getfield(v_any, '_wrapper_', hop.llops)
else:
null = hop.inputconst(lltype.Ptr(lltype.PyObject), lltype.nullptr(lltype.PyObject))
return null
-def rtype_destruct_object(hop):
- v_any, c_spec = hop.inputargs(*hop.args_r)
- repr = c_spec.value
- if '_wrapper_' in repr.allinstancefields:
- null = hop.inputconst(lltype.Ptr(lltype.PyObject), lltype.nullptr(lltype.PyObject))
- repr.setfield(v_any, '_wrapper_', null, hop.llops)
- hop.genop('gc_unprotect', [v_any])
-
-def rtype_unwrap_object(hop):
- v_pyobj, v_type = hop.inputargs(*hop.args_r)
- v_adr = hop.llops.gencapicall('PyCObject_AsVoidPtr', [v_pyobj],
- resulttype=hop.r_result)
- hop.genop('gc_protect', [v_adr])
- return v_adr
"""
The following registers the new mappings. The registration
@@ -160,25 +180,44 @@
"""
def do_register(t):
+ seen = {}
def compute_annotation_unwrap(s_wrapper, s_class_or_inst):
if hasattr(s_class_or_inst, 'classdef'):
classdef = s_class_or_inst.classdef
+ elif hasattr(s_class_or_inst, 'descriptions'):
+ descs = s_class_or_inst.descriptions
+ print 1000*"X"
+ print descs
+ print seen
+ for desc in descs.keys():
+ classdef = desc.getuniqueclassdef()
+ if classdef not in seen:
+ seen[classdef] = True
+ break
+ else:
+ if len(descs) > 1:
+ raise ValueError, ("had a problem finding the right class", descs)
else:
classdef = t.annotator.bookkeeper.getuniqueclassdef(s_class_or_inst.const)
+ seen[classdef] = True
return annmodel.SomeInstance(classdef)
- extregistry.register_value(create_pywrapper,
- compute_result_annotation=annmodel.SomeObject(),
+ extregistry.register_value(ll_create_pywrapper,
+ compute_result_annotation=annmodel.SomePtr(lltype.Ptr(lltype.PyObject)),
specialize_call=rtype_wrap_object_create)
- extregistry.register_value(fetch_pywrapper,
- compute_result_annotation=annmodel.SomeObject(),
+ extregistry.register_value(ll_fetch_pywrapper,
+ compute_result_annotation=annmodel.SomePtr(lltype.Ptr(lltype.PyObject)),
specialize_call=rtype_wrap_object_fetch)
extregistry.register_value(ll_call_destructor,
- compute_result_annotation=lambda *args:None,
+ compute_result_annotation=lambda *args: None,
specialize_call=rtype_destruct_object)
+ extregistry.register_value(wrap_obj,
+ compute_result_annotation=annmodel.SomeObject(),
+ specialize_call=rtype_wrap_object)
+
extregistry.register_value(unwrap_obj,
compute_result_annotation=compute_annotation_unwrap,
specialize_call=rtype_unwrap_object)
@@ -248,9 +287,11 @@
def call_wrap_obj(inst):
return wrap_obj(inst)
+call_wrap_obj._annspecialcase_ = 'specialize:argtype(0)'
def call_unwrap_obj(pyobj, klass):
return unwrap_obj(pyobj, klass)
+call_unwrap_obj._annspecialcase_ = 'specialize:arg(1)'
def democlass_helper_sub(a, b):
# prevend inlining
@@ -260,6 +301,10 @@
pyobj = call_wrap_obj(inst)
obj = call_unwrap_obj(pyobj, DemoClass)
ret = obj.demo()
+ inst = DemoSubclass(a, b, 42)
+ pyobj = call_wrap_obj(inst)
+ obj = call_unwrap_obj(pyobj, DemoSubclass)
+ ret = obj.demo()
return ret
def democlass_helper(a=int, b=int):
@@ -275,7 +320,7 @@
# creating an object, wrapping, unwrapping, call function, check whether __del__ is called
def test_wrap_call_dtor():
- f = getcompiled(democlass_helper, use_boehm=not True, exports=[DemoClass])
+ f = getcompiled(democlass_helper, use_boehm=not True, exports=[DemoSubclass])
ret = f(2, 3)
if P: print ret
assert ret[0] == 1
More information about the Pypy-commit
mailing list