Re: calling conventions, variable-length parameter lists

2003-08-14 Thread TOGoS

Leopold Toetsch wrote:
 TOGoS wrote:
 Unprototyped :-) I guess I didn't make that
 quite clear, enough.

 Setup a param array, that's all.

 leo 
 Umm... OK. Here's what I've done: I created 2
 functions that I can use when dealing
 with variable-length parameter lists. One
 to turn an array into pcc-compliant parameters,
 
 Wrong approach AFAIK. Just pass the array as one
 param. Its like the
 slurpy [EMAIL PROTECTED] in Perl6. In printstuff you then iterate
 over this array and
 print items.
 
 leo

But how is the caller supposed to know to do that?
Remember, I plan to get the 'printstuff' function by
saying:

   find_lex P0, printstuff

As far as the caller knows, the function it's calling
could have a signature like

   func (thing1, thing2, *morethings)

or like

   func (*lotsofparamshere)

That's the problem with being unprototyped :-)

How will Perl6 deal with anonymous subs with
slurpy params? And while we're at it, how will
it deal with anonymous subs with named params?
That one's even harder ;-)

__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread TOGoS
  Unprototyped :-) I guess I didn't make that quite
  clear, enough.

 Setup a param array, that's all.

 leo

Umm... OK. Here's what I've done: I created 2
functions that I can use when dealing
with variable-length parameter lists. One
to turn an array into pcc-compliant parameters,
and one to turn incoming pcc-params into an array.
AFAIK, these would also work for returns, as
(especially with the CPS calling conventions)
returns are almost identical to calls.
Tell me if you think this is reasonable :)

.sub _main # puts params in array, then calls
   # _array_to_params to make
   # pcc-compliant parameters

  # this is eequivalent to Ruby:
  #  array = [I, like, pickles]
  #  printstuff(*array)

  newsub P0, .Sub, _printstuff
  newsub P1, .Continuation, ret1
  $P1 = new PerlArray
  push $P1, I
  push $P1, like
  push $P1, pickles
  P16 = $P1
  call _array_to_params
  # unfortunately we can't use pcc_begin, etc.
  # here because we set up the params manually
  I3 = -1
  I4 = 0
  invoke
 ret1:
  end
.end

.sub _main2 # alternative main that just
# calls printstuff as a pcc_sub
  newsub $P0, .Sub, _printstuff
  newsub P1, .Continuation, ret1
  $P1 = new PerlString
  $P1 = I
  $P2 = new PerlString
  $P2 = like
  $P3 = new PerlString
  $P3 = pickles
  .pcc_begin non_prototyped
  .arg $P1
  .arg $P2
  .arg $P3
  .pcc_call $P0, P1
 ret1:
  .pcc_end
  end
.end

.pcc_sub _printstuff non_prototyped
  # prints all parameters, separated by space,
  # and followed by a newline
  
  # equivalent to Ruby:
  #   def printstuff(*stuff)
  # for t in stuff
  #   print t,  
  # end
  # print \n
  #   end

  P16 = new PerlArray
  call _params_to_array
  $I0 = 0
  $I1 = P16
 loopstart:
  if $I0 == $I1 goto done
  $S0 = P16[$I0]
  print $S0
  print  
  $I0 = $I0 + 1
  goto loopstart
 done:
  print \n
  .pcc_begin_return
  .pcc_end_return
.end

# here are the params - array functions

.sub _params_to_array
  # called at the beginning of a function if it
  # has been passed
  # parameters with the calling conventions.
  # Assumes all PMCs.
  # puts results in existing array in P16

  # munges I0, I3, P4. uses them for
  # temporary variables

  I0 = I1 + I2 # total length of array
  assign P16, I0
  unless I2 = 1 goto done
  P16[0] = P5
  unless I2 = 2 goto done
  P16[1] = P6
  unless I2 = 3 goto done
  P16[2] = P7
  unless I2 = 4 goto done
  P16[3] = P8
  unless I2 = 5 goto done
  P16[4] = P9
  unless I2 = 6 goto done
  P16[5] = P10
  unless I2 = 7 goto done
  P16[6] = P11
  unless I2 = 8 goto done
  P16[7] = P12
  unless I2 = 9 goto done
  P16[8] = P13
  unless I2 = 10 goto done
  P16[9] = P14
  unless I2 = 11 goto done
  P16[10] = P15
  unless I1 = 0 goto done
  I0 = 0  # temp
  I3 = 11 # temp
 loopstart:
  P4 = P3[I0]
  P16[I3] = P4
  I0 = I0 + 1
  I3 = I3 + 1
  unless I0 == I1 goto loopstart

 done:
  ret
.end

.sub _array_to_params
  # turn the array of PMCs in P16 into a
  # set of parameters

  # only sets I1 (num overflow)
  #   and I2 (num pmc regs)
  #   and I3 (overflow params)
  # munges I0, I3, P4. uses them for
  # temporary variables

  I0 = P16 # get length of incoming array

  unless I0 = 1 goto nooverflow
  P5 = P16[0]
  unless I0 = 2 goto nooverflow
  P6 = P16[1]
  unless I0 = 3 goto nooverflow
  P7 = P16[2]
  unless I0 = 4 goto nooverflow
  P8 = P16[3]
  unless I0 = 5 goto nooverflow
  P9 = P16[4]
  unless I0 = 6 goto nooverflow
  P10 = P16[5]
  unless I0 = 7 goto nooverflow
  P11 = P16[6]
  unless I0 = 8 goto nooverflow
  P12 = P16[7]
  unless I0 = 9 goto nooverflow
  P13 = P16[8]
  unless I0 = 10 goto nooverflow
  P14 = P16[9]
  unless I0 = 11 goto nooverflow
  P15 = P16[10]
  unless I0 = 12 goto nooverflow

 overflow:  
  I2 = 11  # num PMC regs
  I1 = I0 - 11 # num overflow
  P3 = new PerlArray
  assign P3, I1
  I0 = 0  # temp
  I3 = 11 # temp
 loopstart:
  P4 = P16[I3]
  P3[I0] = P4
  I0 = I0 + 1
  I3 = I3 + 1
  unless I0 == I1 goto loopstart

 nooverflow:
  I2 = I0 # num PMC regs
  I1 = 0  # num overflow

 done:
  ret
.end


__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread TOGoS
Luke said:

 sub ($param1, [EMAIL PROTECTED])
 
 In which case, if it's prototyped, we stuff
 everything besides the
 first parameter into a PMC representing
 @otherparams.
 
 And if you meant something else, can't help ya.
 
 Luke

Maybe I misunderstand what 'prototyped' means. I
assume this means that the caller knows exactly what
function it is calling, and so knows that how the
callee expects its parameters to be organised (one in
P5, the rest in an array in P6 or whatever). If you
don't know exactly what function you're calling (like
you got a Sub object out of a variable) then you have
to do a non_prototyped call on it.

now, assuming I got that right:

Are you saying that it will be impossible to implement
variable-length parameter lists to non-prototyped
functions? Because that's kind of essential to at
least a few languages. Ruby's 'print' function, for
instance, has a signature that looks something like
this:

  print(*stuff_to_print)

Now, you take that method and pass it out to someone,
and they want to call it. How are they to know that
they're supposed to shove the parameters into an
array? Now, if you *always* put all the parameters
into an array for non_prototyped subs, this wouldn't
be a problem.

But otherwise you can't host Ruby. And I *know* you
don't plan to miss out on that, so obviously I'm
missing something :-)

__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


calling conventions, variable-length parameter lists

2003-08-14 Thread TOGoS
I want to be able to have a function with
this kind of signature:

func ($param1, *$otherparams)

AFAIK, there is no way to implement this
with the current calling conventions. You
would have to do something with variable
register IDs, which we don't have and which
would probably be a bad idea, anyway.

Maybe non_prototyped pcc subs should
always have all their parameters shoved
into an array? (and likewise for return
values :-). Hopefully most subroutine calls
will be prototyped, anyway, so it wouldn't
cause too much of an overall speed-hit, and it
would make many things a lot simpler (not
to mention even *possible*).

__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread TOGoS

--- TOGoS [EMAIL PROTECTED] wrote:
 
 Leopold Toetsch wrote:
  TOGoS wrote:
  Unprototyped :-) I guess I didn't make that
  quite clear, enough.
 
  Setup a param array, that's all.
 
  leo 
  Umm... OK. Here's what I've done: I created 2
  functions that I can use when dealing
  with variable-length parameter lists. One
  to turn an array into pcc-compliant parameters,
  
  Wrong approach AFAIK. Just pass the array as one
  param. Its like the
  slurpy [EMAIL PROTECTED] in Perl6. In printstuff you then
 iterate
  over this array and
  print items.
  
  leo
 
 But how is the caller supposed to know to do that?
 Remember, I plan to get the 'printstuff' function by
 saying:

Oh. Nevermind. I see what you mean, now. Don't do

  printstuff(*params)

, but just do 

  printstuff(params)

instead. I can't think of an example off the
top of my head where this wouldn't work, but
it will happen that people'll want to use
variable-length parameter lists on unprototyped
functions (like the anonymous perl6 slurpy
function). Also, Ruby's 'print' works
like this. So it will have to be dealt with.

__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread Luke Palmer
 Luke said:
 
  sub ($param1, [EMAIL PROTECTED])
  
  In which case, if it's prototyped, we stuff
  everything besides the
  first parameter into a PMC representing
  @otherparams.
  
  And if you meant something else, can't help ya.
  
  Luke
 
 Maybe I misunderstand what 'prototyped' means. I
 assume this means that the caller knows exactly what
 function it is calling, and so knows that how the
 callee expects its parameters to be organised (one in
 P5, the rest in an array in P6 or whatever). If you
 don't know exactly what function you're calling (like
 you got a Sub object out of a variable) then you have
 to do a non_prototyped call on it.
 
 now, assuming I got that right:
 
 Are you saying that it will be impossible to implement
 variable-length parameter lists to non-prototyped
 functions? Because that's kind of essential to at
 least a few languages. Ruby's 'print' function, for
 instance, has a signature that looks something like
 this:
 
   print(*stuff_to_print)
 
 Now, you take that method and pass it out to someone,
 and they want to call it. How are they to know that
 they're supposed to shove the parameters into an
 array? Now, if you *always* put all the parameters
 into an array for non_prototyped subs, this wouldn't
 be a problem.

Ahh, you're talking about unprototyped calls.  Misunderstood you
there.

Sure that will be possible.  You put the first 11 args in P5-P15, and
the rest in P4.  You tell the sub that there are I2 parameters in the
registers, and I1 parameters in P4.

And the reasoning behind this, I think, is that for many subs,
interpreting prototyped and non-prototyped calls will need no
distinction: the same code can be used for both.

At first I was a little uneasy about using PMC registers for parameter
passing, lest the bookkeeping code should get in the way of efficiency
(of both code generation and the generated code itself).  But, I
realized that this bookkeeping code would probably be there even if we
used an array, and registers are likely to be faster.

Plus, parameters to functions are likely to be used in the code of the
function (and likewise with return values), so we're just skipping
unloading the array into registers.

 But otherwise you can't host Ruby. And I *know* you
 don't plan to miss out on that, so obviously I'm
 missing something :-)

Meh.  :-)

Luke


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread Luke Palmer
 I want to be able to have a function with
 this kind of signature:
 
 func ($param1, *$otherparams)

Uh.

What kind of signature?  What does that mean?

If it's Perl 6, 

sub ($param1, *$otherparams)

Is nothing special: it takes two parameters.  Did you mean

sub ($param1, [EMAIL PROTECTED])

In which case, if it's prototyped, we stuff everything besides the
first parameter into a PMC representing @otherparams.

And if you meant something else, can't help ya.

Luke

 AFAIK, there is no way to implement this
 with the current calling conventions. You
 would have to do something with variable
 register IDs, which we don't have and which
 would probably be a bad idea, anyway.
 
 Maybe non_prototyped pcc subs should
 always have all their parameters shoved
 into an array? (and likewise for return
 values :-). Hopefully most subroutine calls
 will be prototyped, anyway, so it wouldn't
 cause too much of an overall speed-hit, and it
 would make many things a lot simpler (not
 to mention even *possible*).
 __
 Do you Yahoo!?
 Yahoo! SiteBuilder - Free, easy-to-use web site design software
 http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-14 Thread Leopold Toetsch
Luke Palmer [EMAIL PROTECTED] wrote:

 Sure that will be possible.  You put the first 11 args in P5-P15, and
 the rest in P4.

s/P4/P3/g

 Luke

leo


Re: calling conventions, variable-length parameter lists

2003-08-10 Thread Michal Wallace
On Fri, 8 Aug 2003, TOGoS wrote:

 I want to be able to have a function with
 this kind of signature:
 
 func ($param1, *$otherparams)
 
 AFAIK, there is no way to implement this
 with the current calling conventions. You
 would have to do something with variable
 register IDs, which we don't have and which
 would probably be a bad idea, anyway.
 
 Maybe non_prototyped pcc subs should
 always have all their parameters shoved
 into an array? (and likewise for return
 values :-). Hopefully most subroutine calls
 will be prototyped, anyway, so it wouldn't
 cause too much of an overall speed-hit, and it
 would make many things a lot simpler (not
 to mention even *possible*).

Why not make $otherparams a PerlArray? 
I haven't gotten this far with python, but
I'm not sure I understand why that 
wouldn't work?

Maybe there should be a register reserved
for an Array and another for a Hash (for
extra keyword arguments)?

Sincerely,
 
Michal J Wallace
Sabren Enterprises, Inc.
-
contact: [EMAIL PROTECTED]
hosting: http://www.cornerhost.com/
my site: http://www.withoutane.com/
--




Re: calling conventions, variable-length parameter lists

2003-08-09 Thread TOGoS
Luke said:
 Plus, parameters to functions are likely to be used
 in the code of the
 function (and likewise with return values), so we're
 just skipping
 unloading the array into registers.

OK. That makes sense, but my problem is:
in the case that the called function *does* treat its
parameter list as an array, it's going to have to have
some ugly code:

(pretend this is some kinda pseudo-imcc)
sub print
  if numparams = 1
print P5
  end
  if numparams = 2
print P6
  end
  if numparams = 3
print P7
  end
  ...whole bunch of checks and prints...
  if numparams = 16
for p in P4
  print p
end
  end
end

maybe this kind of unprototyped function is expected
to be uncommon enough that we can put up with having
to emit code like the above... But unless people are
really sure this is the way to go, it seems to me that
we ought to be able to do better :-S Perhaps there
could be a set of opcodes that allow called functions
to treat the parameter list as a single array? That
might be the best of both worlds. Kind of like the
save_top op saving your code from 16 save operations.
Except more important :-P

sub print
  load_params P0 # all your parameters are now in $P0
  for p in P0
print p
  end
end

Anyway, yeah. My ConfigScript interpreter would like
that. ;-)

__
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com


Re: calling conventions, variable-length parameter lists

2003-08-09 Thread Leopold Toetsch
Michal Wallace [EMAIL PROTECTED] wrote:
 On Fri, 8 Aug 2003, TOGoS wrote:

 Unprototyped :-) I guess I didn't make that quite
 clear, enough.

Setup a param array, that's all.

 Hmm. That would be easy if there were an easy way
 to loop through the registers...

  reg = 5
  for x = 1 to numparams:
 $P0 = P[reg+x]

... which will never happen, because the register allocator can't track
this kind of reg access.

 Michal J Wallace

leo