Re: [pypy-dev] Avoiding code duplication

2006-04-15 Thread Antonio Cuni

Armin Rigo wrote:


I think this is kind-of-reasonable.  The ADT method approach of the
lltypesystem was introduced late during the development of the rtyper;
by now, it would be reasonable to define common method names between the
ADT methods of the lltypesystem and the GENERIC_METHODS of the
ootypesystem.

I am unsure about the performance penalty.  The current version of many
ll helpers, for example, read the 'items' pointer only once and reuse
it; if this gets replaced by ADT methods like 'getitem_nonneg()', it
means that althought the call is probably inlined there is still the
overhead of reading 'items' through each iteration in the list.  Who
knows, maybe C compilers will notice and move the read out of the loop.
Just give it a try on a small example like ll_listindex(), I guess...


Well,
as we decided on #pypy I've changed the ADT interface. As I wrote in the 
commit log:



The interface of ListRepr and FixedSizeListRepr has changed: two
accessor methods has been added: ll_getitem_fast and
ll_setitem_fast. They should be used instead of the ll_items()[index]
idiom: that way when ootypesystem's list will support that interface
we will able to write function useable with both typesystem with no
modification.

The various ll_* helper function has been adapted to use the new
interface. Moreover function that accessed directly to the l.length
field has been changed to call the ll_length() method instead, for
the same reasons as above.


The next step is to rename ootypesystem's list _GENERIC_METHODS to match 
the ADT methods in lltypesystem's list, then we could try to share most 
of ll_* function that currently belongs only to lltypesystem/rlist.py.

I hope I will do it tomorrow.


A different comment: as you mentioned on IRC it would be nice if the
back-end could choose which methods it implements natively.  At one
point there was the idea that maybe the 'oopspec' attributes that
started to show up in lltypesystem/rlist.py (used by the JIT only) could
be useful in this respect.  If I remember correctly, the idea didn't
work out because of the different 'lowleveltype' needed, and the
difference in the interface.  Merging the ADT method names of lltyped
lists and the GENERIC_METHODS of ootyped lists could be a step in this
direction again.  The interesting point is that each oo back-end could
then choose to special-case the ll_xxx() functions with the oopspecs
that they recognize, and just translate the other ones normally.  (The
ll back-ends always translate them all.)


I saw that 'oopspec' attributes, but I didn't understand the exact 
semantic; your proposal sounds reasonable to me: if I can figure out 
correctly this way the typesystem specific code would be reduced to the 
minimum and will help to port other Repr such as rdict to ootypesystem, 
too. I'll investigate a bit in this direction as soon as I can.


good Easter to all,
ciao Anto
___
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev


Re: [pypy-dev] Avoiding code duplication

2006-04-15 Thread Armin Rigo
Hi Antonio,

On Sat, Apr 15, 2006 at 12:59:07PM +0200, Antonio Cuni wrote:
 I saw that 'oopspec' attributes, but I didn't understand the exact 
 semantic;

The oopspec string tells what is the abstract list operation that this
particular ll_*() function implement.  For example:

def ll_prepend(l, newitem):
...
ll_prepend.oopspec = 'list.insert(l, 0, newitem)'

means that ll_prepend() is equivalent to an insert with the index set to
zero.  In the stirng, the pseudo-arguments between the ( ) are either
real argument names of the ll_ function, or constants.

So for example, if a backend has got its own way to implement the
insert() calls in general, it could figure out from the oopspec that the
ll_prepend() helper can be replaced by a custom stub invoking the
backend's own version of insertion with an index of 0.  That's
essentially what the JIT does -- see handle_highlevel_operation() in
jit/hintannotator/model.py.


A bientot,

Armin.
___
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev


Re: [pypy-dev] Avoiding code duplication

2006-04-14 Thread Samuele Pedroni

Armin Rigo wrote:


Hi Antonio,

On Fri, Apr 14, 2006 at 04:53:28PM +0200, Antonio Cuni wrote:
 


# lltypesystem
def ll_listindex(lst, obj, eqfn):
   items = lst.ll_items()
(...)
   if items[j] == obj:

# ootypesystem
def ll_listindex(lst, obj, eqfn):
(...)
   if lst.getitem_nonneg(j) == obj:
   



 

Another solution could be to add an extra level of indirection but I 
guess this could bring to some efficiency penalty.
   



I think this is kind-of-reasonable.  The ADT method approach of the
lltypesystem was introduced late during the development of the rtyper;
by now, it would be reasonable to define common method names between the
ADT methods of the lltypesystem and the GENERIC_METHODS of the
ootypesystem.

I am unsure about the performance penalty.  The current version of many
ll helpers, for example, read the 'items' pointer only once and reuse
it; if this gets replaced by ADT methods like 'getitem_nonneg()', it
means that althought the call is probably inlined there is still the
overhead of reading 'items' through each iteration in the list.  Who
knows, maybe C compilers will notice and move the read out of the loop.
Just give it a try on a small example like ll_listindex(), I guess...

A different comment: as you mentioned on IRC it would be nice if the
back-end could choose which methods it implements natively.  At one
point there was the idea that maybe the 'oopspec' attributes that
started to show up in lltypesystem/rlist.py (used by the JIT only) could
be useful in this respect.  If I remember correctly, the idea didn't
work out because of the different 'lowleveltype' needed,


yes, the problem was not re-using code as such, indeed it should not be hard
to write generic code that can be shared using adt methods etc.
The problem was trying to share the same type between ootype and lltype,
Instances are not Ptrs and don't even behave similarly enough, this is where
trying to reuse completely the lltypesystem rlist and rtuple code broke.


and the
difference in the interface.  Merging the ADT method names of lltyped
lists and the GENERIC_METHODS of ootyped lists could be a step in this
direction again.  The interesting point is that each oo back-end could
then choose to special-case the ll_xxx() functions with the oopspecs
that they recognize, and just translate the other ones normally.  (The
ll back-ends always translate them all.)


A bientot,

Armin.
___
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev
 



___
pypy-dev@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-dev