Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Simon Cozens

On Fri, Sep 07, 2001 at 04:30:56PM -0400, Dan Sugalski wrote:
 =item find_method Px, Py, tz

Using what kind of dispatch mechanism? Or is that what the t is for?

Simon



Re: String API

2001-09-10 Thread Simon Cozens

On Mon, Sep 10, 2001 at 04:48:35AM -0700, Benjamin Stuhl wrote:
 *cough* Namespace pollution *cough*
 These should proably all be prefixed...

You're going to have a canary when you see the rest of the code... :)

Seriously, I see the string subsystem as being self-sufficient; it can be
detached from Parrot as a stand-alone string library, and hence shouldn't have
Parrot_... prefices.

Simon



Re: An overview of the Parrot interpreter

2001-09-10 Thread Paolo Molaro

On 09/07/01 Dan Sugalski wrote:
 The only optimizations that interpreter had, were computed goto and
 allocating the eval stack with alloca() instead of malloc().
 
 Doesn't this really get in the way of threading? You'll chew up great gobs 
 of system stack, and that's a scarce resource when running with threads.

The number of entries in the eval stack is bounded, I've never seen it
grow past 13.

 I think they worked also on outputting IL bytecode...
 
 Yep, but that version was slower. Dick Hardt snagged me at TPC this year (I 
 think I spent most of my non-speaking time being pinned to a table or bench 
 by folks with Things To Say... :) and made a .NET pitch. They were going 
 with the translation to .net but switched to embedding perl. It was a lot 
 faster. (Brad Kuhn had a paper on translating perl to java bytecode and he 
 had lots of trouble, but for different reasons)

My point is that using their experience, a few changes should be designed to
better support dynamic languages in the CLR in the same way that currently
the research is focused on extending it for functional languages, generics
etc.

lupus

-- 
-
[EMAIL PROTECTED] debian/rules
[EMAIL PROTECTED] Monkeys do it better



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 08:07 PM 9/9/2001 -0400, Uri Guttman wrote:
  DS == Dan Sugalski [EMAIL PROTECTED] writes:

   DS Yeah, I can't think of a good reason for a noop. We might have one
   DS anyway, though, just in case one comes along anyway.

in a hardware cpu they were commonly used to fill an instruction slot to
keep a pipeline filled, or to follow a branch decision, or to pad a long
running op.

Yup, I realize that. I wasn't sure that we might not have some sort of 
in-memory opcode whiteout thing we need to do, in which case it'd be useful 
and potentially faster than recalculating a bunch of jump addresses.

Here's a dumb question:  will parrot allow bytecode which is stored in a
perl scalar to be executed?

   DS Yup, in a restricted sandbox too, if you want. That way we'll be
   DS able to serialize code to bytestreams, spit them across the 'net,
   DS and execute them on the other end.

will the op code table need to be sent over if it is code from a module
which defines new op codes?

Basically we'll build a small freeze to disk section and send it over the 
wire instead of freezing to disk. It'll have all the standard stuff--fixup 
section, constants section, and code.


Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: String API

2001-09-10 Thread Dan Sugalski

At 12:53 PM 9/10/2001 +0100, Nicholas Clark wrote:
On Sun, Sep 09, 2001 at 10:16:27PM +0100, Simon Cozens wrote:
  =head1 Elements of the CSTRING structure
 
  Those implementing the CSTRING API will obviously need to know about
  how the CSTRING structure works. You can find the definition of this
  structure in Fstring.h:
 
  struct parrot_string {
void *bufstart;
IV buflen;
IV bufused;
IV flags;
IV strlen;
IV encoding;
IV type;
IV unused;
  };

At some point on p5p Ilya Zakharevich expressed regret that perl5 doesn't
support split buffers. A split buffer would allow things like regular
expressions to run faster when repeatedly substituting in the middle of a
string, as it reduces the amount of data to copy. With a single contiguous
buffer

As Simon's said, the buffer can certainly be pointing to a fancier data 
structure than heap 'o bytes. :) I hadn't considered that, though. I was 
thinking that split strings would be dealt with at a higher-level of 
abstraction--in the PMC (basically at the variable level) rather than in 
the string itself.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Wizard

Uri Guttman wrote:
 but having parrot op codes map to special instructions
 makes sense only if we are doing some form of machine instruction
 generation as with JIT or TIL.

Actually, I wasn't necessarily asking for any special ops (I'm not actually
asking for anything, it's just a suggestion), just that the boolean math
operations use a specific register or registers. I think this would make
implementing code generation on those platforms more straight-forward.
Things like:
   if( $port_read  0xF7 ) {...
would tell perl to place the word into the bool-specific register, and the
implementation for the platform could then see that the operation on that
register would be a more likely candidate for optimizations such as:
   LOW B0, AX ; get low-order byte of bool register (from DATA?)
   BITT B0, 4 ; test bit4 of B0
or whatever the actual ASM ops are.
  If the word were to be randomly assigned to any register, then all similar
operations would need to be tested for those potential optimizations. That's
not impossible, however in RT/embedded systems those ticks are at a premium.
  Again, I'm not implying this is necessary, but only a suggestion. It may
however also offer gains in some internal (event?/flag?) operations.
Grant M.
P.S. Dan, looking forward to meeting you on Tuesday night.
[EMAIL PROTECTED]







Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Brian Wheeler

On Mon, 2001-09-10 at 08:47, Dan Sugalski wrote:
 At 08:07 PM 9/9/2001 -0400, Uri Guttman wrote:
   DS == Dan Sugalski [EMAIL PROTECTED] writes:
 
DS Yeah, I can't think of a good reason for a noop. We might have one
DS anyway, though, just in case one comes along anyway.
 
 in a hardware cpu they were commonly used to fill an instruction slot to
 keep a pipeline filled, or to follow a branch decision, or to pad a long
 running op.
 
 Yup, I realize that. I wasn't sure that we might not have some sort of 
 in-memory opcode whiteout thing we need to do, in which case it'd be useful 
 and potentially faster than recalculating a bunch of jump addresses.
 
 Here's a dumb question:  will parrot allow bytecode which is stored in a
 perl scalar to be executed?
 
DS Yup, in a restricted sandbox too, if you want. That way we'll be
DS able to serialize code to bytestreams, spit them across the 'net,
DS and execute them on the other end.
 
 will the op code table need to be sent over if it is code from a module
 which defines new op codes?
 
 Basically we'll build a small freeze to disk section and send it over the 
 wire instead of freezing to disk. It'll have all the standard stuff--fixup 
 section, constants section, and code.
 

I was thinking about NOP this morning, and I realized that it might very
well be necessary.  If someone was writing a simple assembler for
parrot, it might be useful for padding.


Brian

 
   Dan
 
 --it's like this---
 Dan Sugalski  even samurai
 [EMAIL PROTECTED] have teddy bears and even
   teddy bears get drunk





Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 10:28 am, Brian Wheeler wrote:

 I was thinking about NOP this morning, and I realized that it might very
 well be necessary.  If someone was writing a simple assembler for
 parrot, it might be useful for padding.

Pad what?

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Bryan C . Warnock

Erk, we seem to be muddling around in that great grey area between what is 
Parrot and what is Perl.

Parrot is striving to be a common backend for multiple scripting languages, 
of which one is Perl 6, no?  And, of course, to adequately test Parrot, you 
need to concurrently develop Perl 6, yes?  And that is what is currently 
happening, yes?  No.  (At least, it doesn't seem so.)

Certainly, register creation, memory allocation, garbage collection, and 
opcode dispatch are definitely within the purview of Parrot.  However, the 
opcodes' code themselves aren't - they're provided by the language.

Of course, some concepts are global across multiple languages, so where *do* 
those commonalities lie?  Are those things part of a Parrot sublanguage that 
all superlanguages are expected to build on top of?

Parrot may provide facilities for vtable dispatch and string handling, but a 
language isn't roped into using them.

Things to keep in mind.  (And another reason why it's good to have Namespace 
Police :)

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Brian Wheeler

On Mon, 2001-09-10 at 09:16, Bryan C. Warnock wrote:
 On Monday 10 September 2001 10:28 am, Brian Wheeler wrote:
 
  I was thinking about NOP this morning, and I realized that it might very
  well be necessary.  If someone was writing a simple assembler for
  parrot, it might be useful for padding.
 
 Pad what?
 

How about preserving offsets during an optimization phase:

add i3,i1,1
add i3,i3,8

could become

add i3,i1,9
nop

without having to recompute offsets for later bytecode.

In the same way, you could also use it for reserving space for things
like debugging code, like adding 10 nops if debugging is turned off, and
using those 10 instructions for debugging if it is turned
onmaintaining the relative addresses of things.  Of course, one
could just recompile using the parrot assembler, so this would only be
for those tinkering with their own assembler, I suppose.

Honestly, I don't care either way, since add i0,i0,0 is the same
(basically) as a nop, but takes a little more cpu.  One could always
#define nop add i0,i0,0
:)

Brian






Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Dave Mitchell

Bryan C. Warnock [EMAIL PROTECTED] wrote:
 Erk, we seem to be muddling around in that great grey area between what is 
 Parrot and what is Perl.

Yes, which leads me on to think...

(With my maintainer of the Coding PDD hat on)

Presumably we have to decide what bits of code have a Parrot_ prefix,
and what bits are Perl_. And do we split off everything into two completely 
independent src trees, perhaps which compile to libparrot.a and libperl.a?
Or this articifcal separation too hard to achieve in practice?







Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Dan Sugalski

At 03:55 PM 9/10/2001 +0100, Dave Mitchell wrote:
Bryan C. Warnock [EMAIL PROTECTED] wrote:
  Erk, we seem to be muddling around in that great grey area between what is
  Parrot and what is Perl.

Yes, which leads me on to think...

(With my maintainer of the Coding PDD hat on)

Presumably we have to decide what bits of code have a Parrot_ prefix,
and what bits are Perl_. And do we split off everything into two completely
independent src trees, perhaps which compile to libparrot.a and libperl.a?
Or this articifcal separation too hard to achieve in practice?

We aren't going to split things out that hard. Generally speaking, the 
language-specific pieces will be:

1) Parser rules
2) Possibly compiler rules (maybe)
3) Variable vtable things

So pretty much everything should have a Parrot_ prefix on it, with the 
(possible) exception of the perl variable vtable code. (Though I think 
those should probably be Parrot_ as well. We can change them to Perl_ at 
some point if it becomes appropriate)

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Simon Cozens

On Mon, Sep 10, 2001 at 10:29:13AM -0400, Bryan C. Warnock wrote:
 Parrot is striving to be a common backend for multiple scripting languages, 
 of which one is Perl 6, no?  And, of course, to adequately test Parrot, you 
 need to concurrently develop Perl 6, yes?  And that is what is currently 
 happening, yes?  No.  (At least, it doesn't seem so.)

We're developing a CPU. We're developing a compiler target. After all, how
can you develop a compiler if you don't know what you're targeting it for? :)

 Certainly, register creation, memory allocation, garbage collection, and 
 opcode dispatch are definitely within the purview of Parrot.  However, the 
 opcodes' code themselves aren't - they're provided by the language.

Not really. Language-specific operations on Things are the purview of
vtables. THEY're provided by the language.

Simon



RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Brent Dax

Dan Sugalski:
# At 10:08 AM 9/10/2001 -0700, Wizard wrote:
# Uri Guttman wrote:
...
# Okay, I see what you're aiming at. I don't think we will,
# mainly because
# it's not going to do us a whole lot of good. Parrot's got
# more registers
# than any system on the planet that I know of, so the bit that handles
# converting to native machine code will need to do some analysis and
# register renaming anyway. It can handle putting things in the
# right places.

I seem to remember reading in an article somewhere that Itanium has 128
registers.

--Brent Dax
[EMAIL PROTECTED]

...and if the answers are inadequate, the pumpqueen will be overthrown
in a bloody coup by programmers flinging dead Java programs over the
walls with a trebuchet.




Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 11:16 am, Dan Sugalski wrote:
 No. We don't need perl to test the interpreter. Parser and compiler, yes,
 interpreter no.

The code that we are writing in assembler is Parrot opcode that we would 
expect a Perl parser and compiler to spit out.  (That's all I'm saying)


 Certainly, register creation, memory allocation, garbage collection, and
 opcode dispatch are definitely within the purview of Parrot.  However,
  the opcodes' code themselves aren't - they're provided by the language.

 Nope. The core opcodes are provided by the interpreter. A branch is a
 branch is a branch, no matter what language generated it.

Yes, but what are you defining as core opcodes?  Branches, okay.  Basic 
math, okay.  Basic string..., um, okay.  Call and method dispatch, okay.
Everything else in Perl that will eventually be an opcode?  I hope not.

 Things to keep in mind.  (And another reason why it's good to have
  Namespace Police :)

 For which reason we have brainwashed^Wrecruited Ben, it seems. Keen!
 (Smile and wave to the OMCL, Ben... :)

Like I said, just things to keep in mind.  There's a slight difference 
between designing and coding Parrot as an interpreter backend, and coding it 
as a backend to Perl that other languages can use.  (I'm in favor of the 
latter, though public opinion seems to favor the former.)

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Nathan Torkington

Bryan C. Warnock writes:
 Like I said, just things to keep in mind.  There's a slight difference 
 between designing and coding Parrot as an interpreter backend, and coding it 
 as a backend to Perl that other languages can use.  (I'm in favor of the 
 latter, though public opinion seems to favor the former.)

Here's my Official Word.  Right now it's too early to know whether
building perl6's runtime to also support other languages will impact
perl6's speed or size.  We also have faced skepticism about the whole
effort from other languages.

So we're proceeding with designing perl6.  We're leaving the door open
for other languages, but we're not going to significantly delay or
impede perl6 to support them.  Dan and Simon have both been talking
with Python folks about their language, and I'm sure there'll be demos
to the Python crowd soon to show them that it's feasible and attempt
to get their buy-in.

If we get other languages interested to the point where we share our
internals with them, then we'll go through the painful divorce process
of dividing assets between Perl and Parrot.  But until then, let's
assume that Parrot will only officially be part of the Perl project,
and focus on writing more Parrot code instead of arguing about
namespaces.

That may mean we may face a little pain down the road, but at the
moment I'm much more interested in getting something to have pain
about than I am about planning for a future that *might* come about.
If we get the other languages interested, it'd be such a big win (in
terms of development resources) that we'd be *happy* to do the work of
separating parrot from perl.

Make sense?

Nat





Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 12:58 pm, Nathan Torkington wrote:
 Here's my Official Word.  Right now it's too early to know whether
 building perl6's runtime to also support other languages will impact
 perl6's speed or size.  We also have faced skepticism about the whole
 effort from other languages.

 So we're proceeding with designing perl6.  We're leaving the door open
 for other languages, but we're not going to significantly delay or
 impede perl6 to support them.  

Most excellent.

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Uri Guttman

 W == Wizard  [EMAIL PROTECTED] writes:

  W Uri Guttman wrote:
   but having parrot op codes map to special instructions
   makes sense only if we are doing some form of machine instruction
   generation as with JIT or TIL.

  W Actually, I wasn't necessarily asking for any special ops (I'm not
  W actually asking for anything, it's just a suggestion), just that
  W the boolean math operations use a specific register or registers. I
  W think this would make implementing code generation on those
  W platforms more straight-forward.

which level of code generation are you refering to? parrot op codes or
machine instructions? 

  W Things like:
  Wif( $port_read  0xF7 ) {...
  W would tell perl to place the word into the bool-specific register, and the
  W implementation for the platform could then see that the operation on that
  W register would be a more likely candidate for optimizations such as:
  WLOW B0, AX ; get low-order byte of bool register (from DATA?)
  WBITT B0, 4 ; test bit4 of B0
  W or whatever the actual ASM ops are.

same question.

  W   If the word were to be randomly assigned to any register, then
  W all similar operations would need to be tested for those potential
  W optimizations. That's not impossible, however in RT/embedded
  W systems those ticks are at a premium.

again, i think you are conflating parrot registers with machine
registers. they are not the same and there is no mapping from one to the
other on any particular platform. when we get to TIL or JIT which both
will generate real machine code, then architecture specific
optimizations will be addressed. right now the actual machine
architecture is (mostly) irrelevant in discussing parrot op
codes. parrot op codes will be implemented in portable c and not in
platform dependent assembler for the obvious portability reasons.

uri

PS. my cc's to you are bouncing with a delivery warning. this is replied
only to the list.




-- 
Uri Guttman  -  [EMAIL PROTECTED]  --  http://www.sysarch.com
SYStems ARCHitecture and Stem Development -- http://www.stemsystems.com
Search or Offer Perl Jobs  --  http://jobs.perl.org



RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Wizard

Well, I used to do some embedded systems programming using C, and many of
the compilers would make attempts to optimize logical ops like
  if( byte_variable  0xF7 ){...
into something using a processor op equivalent to the 8051C
   testbit( byte_variable, bit_offset).
The 8051 processor has several direct, optimized, bit-test and manipulation
ops built-in, equivalent to the 8051C testbit, bitset, high, and low (and
probably more that I don't recall - it's been more than 10 years). These ops
were heavily used in embedded systems (they likely still are ;-).
   The idea behind the separate boolean register(s) would be to make it
simpler for the implementer of perl on one of these targets to decide what
to test for optimization. It could also make it more better for
determining what ops require extended functionality (like carrys/overflows
for integers... or maybe not).
   I have plans on being at your demo on Tuesday and, if you'd like, I think
I still have an old Intel 8051 code manual around somewhere that you can
have. Or if I'm not making myself clear enough (which happens fairly
regularly ;-), tell me... I promise not to be offended.
Let me know,
Grant M.




Re: String API

2001-09-10 Thread Edwin Steiner

[EMAIL PROTECTED] (Simon Cozens) writes:

 =head2 Cunused
 
 This field is, as its name suggests, unused; however, it can be used to
 hold a pointer to the correct vtable for foreign strings.

Wouldn't it be better to put a vtable * directly inside struct
parrot_string instead of the 'encoding' enum? That would save the
'unused' slot for foreign encodings and you wouldn't need an
additional layer of wrapper functions (or another way of indirection)
for enc_foreign.

The small integer ids you need for transcoding table lookups,
etc. could be stored in a dedicated slot in the string vtables, or
returned by a vtable function.

-Edwin




Re: String API

2001-09-10 Thread Jason Gloudon


Will the buffers associated with a string be managed by Parrot's memory
management, and be visible to the garbage collector ? Or will these buffers be
allocated from their own pool of memory not subject to garbage collection.

-- 
Jason



FYI, that last email was sent last night...

2001-09-10 Thread Wizard

I'm having trouble with my hosting company (wehost.net is poop!). That last
email was a reply that I sent last night at 6pm. Please ignore it :-P
Grant M.






Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Dan Sugalski

At 01:20 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
On Monday 10 September 2001 01:08 pm, Simon Cozens wrote:
  And in addition - why are we worrying about namespace collision RIGHT NOW?
  Sure, when Parrot can be embedded, then we should ensure that our names
  aren't going to clash. But who in their right minds is going to embed
  Parrot in anything in its current state? (Leon, I said in their right
  minds)
 
  It's not a priority, compared to getting working code out there. We can
  sort it out later.

Oh, how many times have I heard that before?

Yeah, me too. :)

Seriously, I think we should get it right from the start, if for no other 
reason than I can stop writing opcode and utility functions with the same 
name and coring the interpreter. (Which would be a nice change) It is my 
fault to begin with, since I started the show with no prefixes.

It may also make things easier when we start dynaloading libraries, as 
we'll be doing pretty darned soon. (String and opcode function libraries, 
at least, and the rest will follow)

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 06:26 PM 9/9/2001 -0700, Wizard wrote:
into something using a processor op equivalent to the 8051C
testbit( byte_variable, bit_offset).

This is pretty much

   testbit I0, 6

to test whether bit 6 is set i I0, right?

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Nathan Torkington

Bryan C. Warnock writes:
 It's not a prioirty, but it's so much easier to walk the correct path from 
 the start.  Since it's all Parrot, it's even easier.

I agree.  How about this: when the code is available (i.e., this
afternoon), why don't you sit down with whoever else feels
passionately about this, and add the namespace protection?  There's no
reason why it can't be added early, and I agree with Simon that he has
higher priority things to worry about, but there's no reason why you
or anyone else can't add it in.  And it should be easy to add it in
while the codebase is small.

Namespace protection seems tricky.  You need a list of symbols,
categorized public or private.  You need to automatically check the
symbol list (e.g., output of nm) to see you're not exporting
un-prefixed symbols.  And so on.  The more of this stuff that can be
automated, the better.

Go to it!

Nat






RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 10:55 AM 9/10/2001 -0700, Hong Zhang wrote:
  At 06:26 PM 9/9/2001 -0700, Wizard wrote:
  into something using a processor op equivalent to the 8051C
  testbit( byte_variable, bit_offset).
 
  This is pretty much
 
 testbit I0, 6
 
  to test whether bit 6 is set i I0, right?

What is the difference from

   and I0, I0, (1  6)

Well, I took a shortcut, it'd probably be:

   testbit I0, 6, SOME_LABEL_TO_JUMP_TO_IF_THE_BIT_IS_SET

But I was posting mainly to get some clarification as to what Grant was 
talking about.

Unless if we want Parrot to handle multi-media data, there is
not reasons to introduce many bitops (such as rotate, leading
zeros, trailing zeros).

At the moment I tend to agree, but since perl has some bitwise operations 
we need to support at least those.

I expect the bit ops will probably get consigned to a loadable library the 
same way that the transcendental ops will be, in which case it doesn't hurt 
to define a bunch for now since they won't get in the way.

Besides, they are, if properly defined, useful. And they have the advantage 
that one or two people can split off to do them as they think necessary, so 
we can have another semi-independent development project. I don't want one 
or two people (Namely me... :) to be holding up development that other 
folks could be doing.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Muddled Boundaries - Perl 6 vs Parrot

2001-09-10 Thread Benjamin Stuhl

--- Bryan C. Warnock [EMAIL PROTECTED] wisely wrote:
 On Monday 10 September 2001 01:08 pm, Simon Cozens wrote:
  And in addition - why are we worrying about namespace
 collision RIGHT NOW?
  Sure, when Parrot can be embedded, then we should
 ensure that our names
  aren't going to clash. But who in their right minds is
 going to embed
  Parrot in anything in its current state? (Leon, I said
 in their right
  minds)
 
  It's not a priority, compared to getting working code
 out there. We can
  sort it out later.
 
 Oh, how many times have I heard that before?
 
 It's not a prioirty, but it's so much easier to walk the
 correct path from 
 the start.  Since it's all Parrot, it's even easier.

Hear, hear! I remember the pain in 5.005_5* of turning off
PERL_POLLUTE. I expect that there may still be CPAN modules
that won't build without manually defining it.

It's much better if we get it right from the start so that
there's less that we need to go back and fix.

-- BKS

__
Do You Yahoo!?
Get personalized email addresses from Yahoo! Mail
http://personal.mail.yahoo.com/



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Simon Cozens

On Sat, Sep 08, 2001 at 12:00:24PM -0400, Dan Sugalski wrote:
 Okay, I'm whipping together the fancy math section of the interpreter 
 assembly language. I've got:
 
 sin, cos, tan : Plain ones
 asin, acos, atan  : arc-whatevers
 shinh, cosh, tanh : Hyperbolic whatevers
 log2, log10, log  : Base 2, base 10, and explicit base logarithms
 pow   : Raise x to the y power
 
 Can anyone think of things I've forgotten? It's been a while since I've 
 done numeric work.

FWIW, it's just dawned on me that if we want all of these things to be
overloadable by PMCs, they need to have vtable entries. The PMC vtable
is going to be considerably bigger than we anticipated.

Simon



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 09:15 PM 9/10/2001 +0100, Simon Cozens wrote:
FWIW, it's just dawned on me that if we want all of these things to be
overloadable by PMCs, they need to have vtable entries. The PMC vtable
is going to be considerably bigger than we anticipated.

Who the heck is going to override arctangent? (No, don't tell me, I don't 
want to know)

For stuff like this I don't see a point in having a vtable entry for the 
transcendentals. atan is atan is atan. (Now, having said that, someone's 
going to define it for matrices or something wacky like that) At absolute 
worst I can see having a single vtable entry that gets passed in a 
transcendental function number or have the vtable be double-level for 
these, where there's just a pointer to transcendental functions table 
entry in the main vtable, so everyone shares the same table unless they 
want to get really extreme.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread David M. Lloyd

On Mon, 10 Sep 2001, Simon Cozens wrote:

 On Sat, Sep 08, 2001 at 12:00:24PM -0400, Dan Sugalski wrote:
  Okay, I'm whipping together the fancy math section of the interpreter
  assembly language. I've got:
 
  sin, cos, tan   : Plain ones
  asin, acos, atan: arc-whatevers
  shinh, cosh, tanh   : Hyperbolic whatevers
  log2, log10, log: Base 2, base 10, and explicit base logarithms
  pow : Raise x to the y power
 
  Can anyone think of things I've forgotten? It's been a while since I've
  done numeric work.

 FWIW, it's just dawned on me that if we want all of these things to be
 overloadable by PMCs, they need to have vtable entries. The PMC vtable
 is going to be considerably bigger than we anticipated.

Does that mean that opcodes like these are just going to call functions
pointed to by vtable entries (that is, not have a 'default
implementation')?

It makes more sense to me to just have these functions act on numbers
(like float and bigfloat), and auto-numify like Perl 5 does.  Forgive me
if I am missing something (I usually am :).

- D

[EMAIL PROTECTED]




Re: Parrot 0.0.1 is released.

2001-09-10 Thread Sam Tregar


 Patches should be sent to the perl6-internals mailing list, where I'll take a
 look at them and apply them to the CVS tree.

Ooo, ooo - me first.  Since you turned on -Wall in the Makefile I thought
it would be nice if it compiled without warnings.  Below is a patch that
does that on my system.

This is the output from cvs -q diff -u.  Is this is the best way to send
a multi-file patch from the CVS checkout?

-sam

Index: basic_opcodes.ops
===
RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v
retrieving revision 1.4
diff -u -r1.4 basic_opcodes.ops
--- basic_opcodes.ops   2001/09/10 15:48:36 1.4
+++ basic_opcodes.ops   2001/09/10 21:28:39
@@ -60,7 +60,7 @@

 // PRINT Ix
 AUTO_OP print_i {
-  printf(I reg %i is %i\n, P1, INT_REG(P1));
+  printf(I reg %li is %li\n, P1, INT_REG(P1));
 }

 // BRANCH CONSTANT
@@ -152,7 +152,7 @@

 // PRINT Nx
 AUTO_OP print_n {
-  printf(N reg %i is %Lf\n, P1, NUM_REG(P1));
+  printf(N reg %li is %Lf\n, P1, NUM_REG(P1));
 }

 // INC Nx
@@ -257,7 +257,7 @@
 // PRINT Sx
 AUTO_OP print_s {
   STRING *s = STR_REG(P1);
-   printf(S reg %i is %.*s\n, P1, string_length(s), s-bufstart);
+   printf(S reg %li is %.*s\n, P1, (int) string_length(s), (char *) s-bufstart);
 }

 // LEN Ix, Sx
@@ -272,4 +272,4 @@

 // NOOP
 AUTO_OP noop {
-}
\ No newline at end of file
+}
Index: bytecode.c
===
RCS file: /home/perlcvs/parrot/bytecode.c,v
retrieving revision 1.3
diff -u -r1.3 bytecode.c
--- bytecode.c  2001/09/10 09:50:39 1.3
+++ bytecode.c  2001/09/10 21:28:39
@@ -93,7 +93,7 @@
 }
 num--;
 if (len  0 || (len  0  num == 0)) {
-printf(Bytecode error: string constant segment corrupted: %i, %i\n, 
len, num);
+printf(Bytecode error: string constant segment corrupted: %i, %i\n, 
+(int) len, (int) num);
 exit(1);
 }
 }
Index: parrot.h
===
RCS file: /home/perlcvs/parrot/parrot.h,v
retrieving revision 1.2
diff -u -r1.2 parrot.h
--- parrot.h2001/09/07 15:23:40 1.2
+++ parrot.h2001/09/10 21:28:39
@@ -25,6 +25,7 @@
 #include sys/stat.h
 #include fcntl.h
 #include errno.h
+#include string.h

 #define NUM_REGISTERS 32
 #define PARROT_MAGIC 0x13155a1
Index: register.c
===
RCS file: /home/perlcvs/parrot/register.c,v
retrieving revision 1.2
diff -u -r1.2 register.c
--- register.c  2001/09/10 15:49:27 1.2
+++ register.c  2001/09/10 21:28:39
@@ -10,10 +10,10 @@
   struct IRegChunk *chunk_base;

   chunk_base = CHUNK_BASE(interpreter-int_reg);
-  printf(Chunk base is %x for %x\n, chunk_base, interpreter-int_reg);
+  printf(Chunk base is %x for %x\n, (unsigned int) chunk_base, (unsigned int) 
+interpreter-int_reg);
   /* Do we have any slots left in the current chunk? */
   if (chunk_base-free) {
-printf(Free was %i\n, chunk_base-free);
+printf(Free was %i\n, (int) chunk_base-free);
 interpreter-int_reg = chunk_base-IReg[chunk_base-used++];
 chunk_base-free--;
   }
Index: test_main.c
===
RCS file: /home/perlcvs/parrot/test_main.c,v
retrieving revision 1.2
diff -u -r1.2 test_main.c
--- test_main.c 2001/09/10 10:05:23 1.2
+++ test_main.c 2001/09/10 21:28:40
@@ -35,19 +35,19 @@
   int i;
   time_t foo;

-  printf(String %p has length %i: %.*s\n, s, string_length(s), 
string_length(s), s-bufstart);
+  printf(String %p has length %i: %.*s\n, s, (int) string_length(s), (int) 
+string_length(s), (char *) s-bufstart);
   string_concat(s, t, 0);
-  printf(String %p has length %i: %.*s\n, s, string_length(s), 
string_length(s), s-bufstart);
+  printf(String %p has length %i: %.*s\n, s, (int) string_length(s), (int) 
+string_length(s), (char *) s-bufstart);
   string_chopn(s, 4);
-  printf(String %p has length %i: %.*s\n, s, string_length(s), 
string_length(s), s-bufstart);
+  printf(String %p has length %i: %.*s\n, s, (int) string_length(s), (int) 
+string_length(s), (char *) s-bufstart);
   string_chopn(s, 4);
-  printf(String %p has length %i: %.*s\n, s, string_length(s), 
string_length(s), s-bufstart);
+  printf(String %p has length %i: %.*s\n, s, (int) string_length(s), (int) 
+string_length(s), (char *) s-bufstart);
   foo = time(0);
   for (i = 0; i  1; i++) {
 string_concat(s, t, 0);
 string_chopn(s, 4);
   }
-  printf(1000 concats and chops took %i seconds.\n, time(0)-foo);
+  printf(1000 concats and chops took %li seconds.\n, time(0)-foo);
   string_destroy(s);
   }
   /* Otherwise load in the program they gave and try that */




Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Ken Fox

Dan Sugalski wrote:
 =item if tx, X, Y

What's the purpose of providing Y? Does it make anything easier
allowing Y != 0?

 =item jump tx

I expected a call op too. Not a named sub call, but just call
tx where tx has the same semantics as in jump.

A return op is needed too.

 =item iton Nx, Iy
 =item ntoi Ix, Ny
 =item tostring Sx, ty, Iz

Are these good names? They aren't very regular IMHO. Why is
integer abbreviated i and string left spelled out? Why does
tostring have three operands and the other two?

 =item inc tx, nn *
 =item dec tx, nn *

 Decrement register x by nn. nn is an integer constant. If nn is
 omitted, decrement by 1.

Variable length ops don't sound so cool to me. Why not use
add/sub to inc/dec by something other than 1?

Also, it would be nice if inc/dec *always* kept Parrot semantics
instead of automagically transmogrifying to Perl inc/dec. Is
this the plan?

 =head2 Register and stack ops

I'm a little confused why we can only push/pop entire register
frames. Won't this make function value returns via registers
impossible? IMHO, instead of push/pop a rotate command
would be nice. That would allow SPARC-like register usage which
has always seemed elegant to me.

 =item warp [string]
 
 Reset the current register stacks to the state they were in when the
 warp was set. Resets only the frame pointers, doesn't guarantee the
 contents of the registers. Be Ivery careful modifying the frame
 pointers by, for example, pushing register frames.

I don't understand this explanation. It sounds like you are setting
up co-routines or maybe resuming a continuation. Shouldn't the ops
be a little safer? IMHO we don't want a co-routine construction set,
we just want co-routines.

 =item find_lex Px, sy
 
 Find the lexical of name sy and store the PMC pointer in register Px.

You're expecting the current lexical scope to be carried implicitly
via the PC? Seems like find_lex should really be implemented as a
vtable method on a compiler's scope object.

 =item find_method Px, Py, tz
 =item call_method Px, ty

Multi-methods are notably absent. I'm assuming that Parrot does not
understand multi-methods and requires the object (or the compiler
generating the object) to register a multi-method dispatcher as the
single-dispatch method known to Parrot.

This only lets us use multi-methods where arg0 is an object. Is
this sufficient for implementing Perl 6?

- Ken



Re: Parrot 0.0.1 is released.

2001-09-10 Thread Simon Cozens

On Mon, Sep 10, 2001 at 09:42:38PM +0100, Simon Cozens wrote:
 From CPAN: http://www.cpan.org/authors/id/S/SI/SIMON/parrot-0.0.1.tar.gz
http://www.cpan.org/src/parrot-0.0.1.tar.gz
(once the mirrors have updated)
 
 From CVS:  See the Parrot CVS home page at http://cvs.perl.org/

OK, I screwed that one up good and proper. :( Be nice, I'm new to this
game. Please use the anon CVS where you can, because that'll always be
up to date, and won't suffer from any packaging issues.

Emergency fixed package available at
http://www.netthink.co.uk/downloads/parrot-0.0.1.tar.gz

I've even tested this one.

Sorry, and this time, have more fun.

Simon



Re: Parrot 0.0.1 is released.

2001-09-10 Thread Simon Cozens

On Mon, Sep 10, 2001 at 05:25:46PM -0400, Sam Tregar wrote:
 Ooo, ooo - me first.  Since you turned on -Wall in the Makefile I thought
 it would be nice if it compiled without warnings.  Below is a patch that
 does that on my system.

Thanks, applied. (Although I consider it a temporary fix, because when
we have a configure system and IV isn't necessarily a long, we'll need to 
do something more permanent.)

 This is the output from cvs -q diff -u.  Is this is the best way to send
 a multi-file patch from the CVS checkout?
 
Yes, thanks.

Simon



Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Dan Sugalski

At 05:41 PM 9/10/2001 -0400, Ken Fox wrote:
Dan Sugalski wrote:
  =item if tx, X, Y

What's the purpose of providing Y? Does it make anything easier
allowing Y != 0?

Hmmm. No, it doesn't, it just bloats out the opcode stream by an IV. I'll 
fix that.

  =item jump tx

I expected a call op too. Not a named sub call, but just call
tx where tx has the same semantics as in jump.

A return op is needed too.

In the next rev, I just haven't mailed it out yet.

  =item iton Nx, Iy
  =item ntoi Ix, Ny
  =item tostring Sx, ty, Iz

Are these good names? They aren't very regular IMHO. Why is
integer abbreviated i and string left spelled out? Why does
tostring have three operands and the other two?

No, because, and the third is a string type, on the off chance you wanted a 
non-native string. (Unicode, EBCDIC, whatever) Respectively. :)

  =item inc tx, nn *
  =item dec tx, nn *

  Decrement register x by nn. nn is an integer constant. If nn is
  omitted, decrement by 1.

Variable length ops don't sound so cool to me. Why not use
add/sub to inc/dec by something other than 1?

They aren't variable length. They're actually inc_i  inc_i_ic (and inc_n, 
inc_n_nc, and so on...) under the hood. The assembler is supposed to be 
smart enough to see you did:

   inc N2, 5

and know it's supposed to emit the inc_n_nc form.

The assembler's not that smart yet.

Also, it would be nice if inc/dec *always* kept Parrot semantics
instead of automagically transmogrifying to Perl inc/dec. Is
this the plan?

Dunno what you mean. I  N registers increment numerically, PMC registers 
get the variable's vtable inc function called, and I don't know what 
happens if we do it on a string register. We might not allow it.

  =head2 Register and stack ops

I'm a little confused why we can only push/pop entire register
frames. Won't this make function value returns via registers
impossible? IMHO, instead of push/pop a rotate command
would be nice. That would allow SPARC-like register usage which
has always seemed elegant to me.

There are things missing. There's a fetch from the past op, a 
push-with-clone op, and a push on the generic stack op. They're just not in 
the doc I mailed yet.

  =item warp [string]
 
  Reset the current register stacks to the state they were in when the
  warp was set. Resets only the frame pointers, doesn't guarantee the
  contents of the registers. Be Ivery careful modifying the frame
  pointers by, for example, pushing register frames.

I don't understand this explanation. It sounds like you are setting
up co-routines or maybe resuming a continuation. Shouldn't the ops
be a little safer? IMHO we don't want a co-routine construction set,
we just want co-routines.

It's more for the case when we've pushed a few frames of registers and need 
to get back to the marker for a moment. Sort of like 
setjmp/longjmp/comefromjmp in C. (If it had a comefromjmp to undo the 
longjmp...)

Might turn out to be a stupid thing. If so, it's out of there.

  =item find_lex Px, sy
 
  Find the lexical of name sy and store the PMC pointer in register Px.

You're expecting the current lexical scope to be carried implicitly
via the PC?

No, it'll be in the interpreter struct.

Seems like find_lex should really be implemented as a
vtable method on a compiler's scope object.

Well, if we had one we could, I suppose.

  =item find_method Px, Py, tz
  =item call_method Px, ty

Multi-methods are notably absent.

Haven't gotten there yet.

I'm assuming that Parrot does not
understand multi-methods and requires the object (or the compiler
generating the object) to register a multi-method dispatcher as the
single-dispatch method known to Parrot.

Nope, multimethod dispatch will be built in, at least for some number of 
args. (At least 2, maybe more) It's a lot more efficient if parrot handles 
that.

This only lets us use multi-methods where arg0 is an object. Is
this sufficient for implementing Perl 6?

Ummm... how on earth do you plan on calling a method of something that's 
not an object? Methods sorta require them... :)

Anyway, I realized that bit of the PDD was unfinished after I sent it. I'd 
hoped to correct it before it got poked at, but didn't get a chance.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Brian Wheeler

First off, here's an inconsistancy I found:  In test.pasm

REDO:   eq_i_ic I2, I4, DONE, NEXT

appears.  Shouldn't this be comparing to a constant, not a register?  It
became a little obvious when I made a few changes to the
assembler/disassembler to give more details about the data (and to allow
shortcuts like add I1,I2,I3 to go to add_i I1,I2,I3, etc)

There's 3 pieces:  opcode_table, disassemble.pl and assemble.pl

The opcode_table patch changes the argument encoding to use these terms:
#   i   Integer constant
#   I   Integer register
#   n   Numeric constant
#   N   Numeric register
#   s   String constant?
#   S   String register
#   D   Destination 

The opcodes definitions were changed accordingly.


Disassemble.pl takes the new definitions and prints things out a little
prettier (test.pbc):
 time_i I1
0008 set_i_ic I2 0
0014 set_i_ic I3 1
0020 set_i_ic I4 1000
002c eq_i_ic I2 4 0058 0040
0040 add_i I2 I2 I3
0050 branch_ic 002c
0058 time_i I5
0060 print_i I1
0068 print_i I5
0070 print_i I2
0078 sub_i I2 I5 I1
0088 print_i I2
0090 set_i_ic I1 3
009c mul_i I4 I4 I1
00ac iton_n_i N1 I4
00b8 iton_n_i N2 I2
00c4 print_i I4
00cc print_n N1
00d4 print_i I2
00dc print_n N2
00e4 div_n N1 N1 N2
00f4 print_n N1

It also skips the magic number, and skips (but doesn't handle) the
constant data.  String registers aren't handled either...yet

assemble.pl:  this just contains workarounds to the new opcode_table
format.

Brian


Lastly, here's the patch:
Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.5
diff -u -r1.5 assemble.pl
--- assemble.pl 2001/09/10 17:30:29 1.5
+++ assemble.pl 2001/09/10 22:04:29
@@ -10,6 +10,15 @@
 %pack_type = (i = 'l',
  n = 'd',
  );
+my %real_type=('i'='i',
+  'n'='n',
+  'N'='i',
+  'I'='i',
+  'S'='i',
+  's'='i',
+  'D'='i');
+
+
 my $sizeof_packi = length(pack($pack_type{i},1024));
 
 
@@ -20,6 +29,7 @@
 s/^\s+//;
 next unless $_;
 my ($code, $name, $args, @types) = split /\s+/, $_;
+@types=map { $_ = $real_type{$_}} @types;
 $opcodes{$name} = {CODE = $code,
   ARGS = $args,
   TYPES = [@types]
Index: disassemble.pl
===
RCS file: /home/perlcvs/parrot/disassemble.pl,v
retrieving revision 1.1
diff -u -r1.1 disassemble.pl
--- disassemble.pl  2001/08/29 12:07:02 1.1
+++ disassemble.pl  2001/09/10 22:04:29
@@ -7,10 +7,20 @@
 
 my %unpack_type;
 %unpack_type = (i = 'l',
+   I = 'l',
n = 'd',
+   N = 'l',
+   D = 'l',
+   S = 'l',
+   s = 'l',
);
 my %unpack_size = (i = 4,
   n = 8,
+  I = 4,
+  N = 4,
+  D = 4,
+  S = 4,
+  s = 4,
   );
 
 open OPCODES, opcode_table or die Can't get opcode table, $!/$^E;
@@ -28,16 +38,34 @@
   }
 }
 
+
 $/ = \4;
+my $magic=;
+my $constants=;
+ $constants=;
+
+my $offset=0;
 while () {
 $code = unpack 'l', $_;
 $args = $opcodes[$code]{ARGS};
-print $opcodes[$code]{NAME};
+my $op_offset=$offset;
+print sprintf(%08x,$offset), ,$opcodes[$code]{NAME};
+$offset+=4;
+
 if ($args) {
foreach (1..$args) {
local $/ = \$unpack_size{$opcodes[$code]{TYPES}[$_-1]};
$data = ;
-   print  , unpack $unpack_type{$opcodes[$code]{TYPES}[$_-1]},
$data;+ $offset+=$ {$/ };
+   if($opcodes[$code]{TYPES}[$_-1] eq N ||
+  $opcodes[$code]{TYPES}[$_-1] eq I) {
+   print  ,$opcodes[$code]{TYPES}[$_-1],unpack
$unpack_type{$opcodes[$code]{TYPES}[$_-1]}, $data;
+   } elsif($opcodes[$code]{TYPES}[$_-1] eq D) {
+   # handle destination
+   print 
,sprintf(%08x,$op_offset+unpack($unpack_type{$opcodes[$code]{TYPES}[$_-1]},$data)*4);
+   } else {
+   print  , unpack $unpack_type{$opcodes[$code]{TYPES}[$_-1]}, $data;
+   }
}
 }
 print \n;
Index: opcode_table
===
RCS file: /home/perlcvs/parrot/opcode_table,v
retrieving revision 1.5
diff -u -r1.5 opcode_table
--- opcode_table2001/09/10 15:48:36 1.5
+++ opcode_table2001/09/10 22:04:30
@@ -9,61 +9,70 @@
 # not the type of the register or anything. So N3 is still an i, since
that
 # 3 specifying the register should be packed as an integer.
 
+# Revised arg types:
+#  i   Integer constant
+#  I   Integer register
+#  n   Numeric constant
+#  

Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Dan Sugalski

At 05:23 PM 9/10/2001 -0500, Brian Wheeler wrote:
First off, here's an inconsistancy I found:  In test.pasm

REDO:   eq_i_ic I2, I4, DONE, NEXT

appears.  Shouldn't this be comparing to a constant, not a register?

Nope, though if I let you in on the actual secret it's help.

That should really be eq_i_ic_ic. (Well, actually there should be only one 
label, and we fall through otherwise. It's a bug in implementation and 
assembly, not opcode name... :) The intention is the last _x covers the 
last arg, the next to last covers the next to last arg, and so on. When we 
run out, we repeat the innermost type.

The ultimate intention is that you'd write that as a plain:

 eq I2, I4, DONE, NEXT

or probably

 eq I2, I4, DONE

and either way the assembler would know DONE was a constant and we needed i 
registers since that was specified, and emit the eq_i_ic opcode.

It
became a little obvious when I made a few changes to the
assembler/disassembler to give more details about the data (and to allow
shortcuts like add I1,I2,I3 to go to add_i I1,I2,I3, etc)


The opcode_table patch changes the argument encoding to use these terms:
#   i   Integer constant
#   I   Integer register
#   n   Numeric constant
#   N   Numeric register
#   s   String constant?
#   S   String register
#   D   Destination

I was using a trailing c to note a constant since we're using the opcode 
name as a C function name, and we're not counting on case-sensitivity in 
symbols.

Other than that (well, and Simon has a patch in to the repository to yank 
out the opcode numbers entirely from opcode_table) it looks keen.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Simon Cozens

On Mon, Sep 10, 2001 at 06:23:02PM -0400, Dan Sugalski wrote:
 That should really be eq_i_ic_ic. (Well, actually there should be only one 
 label, and we fall through otherwise. It's a bug in implementation and 
 assembly, not opcode name... :) 

Patches are... :)

 I was using a trailing c to note a constant since we're using the opcode 
 name as a C function name, and we're not counting on case-sensitivity in 
 symbols.

*nodnod*. I knew there was a reason something smelt funny about that.

 Other than that (well, and Simon has a patch in to the repository to yank 
 out the opcode numbers entirely from opcode_table) it looks keen.

Brian, if you could cvs update (or grab the snapshot from 
http://www.netthink.co.uk/downloads/parrot-0.0.1.tar.gz) and rework your
patch given Dan's comments, I'd appreciate it.

Thanks,
Simon



Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Bart Lateur

On Mon, 10 Sep 2001 17:13:44 -0400, Dan Sugalski wrote:

Who the heck is going to override arctangent? (No, don't tell me, I don't 
want to know)

Perhaps you do. Think BigFloat. Or Complex.

-- 
Bart.



Re: Speaking of namespaces...

2001-09-10 Thread Damien Neil

On Mon, Sep 10, 2001 at 06:58:23PM -0400, Dan Sugalski wrote:
 At 03:52 PM 9/10/2001 -0700, Damien Neil wrote:
 Parrot fails to work in very obscure ways on FreeBSD.  After some
 poking around, I tracked the problem to the end op--this appears
 to conflict with something inside libc.  Renaming the op fixes the
 problem.
 
 Ah, that's what was  killing the build on Nat's machine. Patch, by chance?

The following quick-and-dirty patch appears to work.  This prefixes
all opcode functions with Parrot_op_.  I'd have made the prefix
configurable, but the opcode generation is spread across three
different files.

(Aside: What's the best way to generate a useful patch with cvs?
The following comes from cvs -q diff -u.)

   - Damien

Index: build_interp_starter.pl
===
RCS file: /home/perlcvs/parrot/build_interp_starter.pl,v
retrieving revision 1.2
diff -u -u -r1.2 build_interp_starter.pl
--- build_interp_starter.pl 2001/09/10 21:26:09 1.2
+++ build_interp_starter.pl 2001/09/10 23:07:08
@@ -27,7 +27,7 @@
 my($name) = split /\s+/;
 my $num = $count;
 $num = 0 if $name eq 'end';
-print INTERP \tx[$num] = $name; \\\n;
+print INTERP \tx[$num] = Parrot_op_$name; \\\n;
 $count++ unless $name eq 'end';
 }
 print INTERP } while (0);\n;
Index: make_op_header.pl
===
RCS file: /home/perlcvs/parrot/make_op_header.pl,v
retrieving revision 1.3
diff -u -u -r1.3 make_op_header.pl
--- make_op_header.pl   2001/09/10 21:26:09 1.3
+++ make_op_header.pl   2001/09/10 23:07:08
@@ -6,7 +6,7 @@
 next if /^\s*#/ or /^\s*$/;
 chomp;
 ($name, undef) = split /\t/, $_;
-print IV *$name(IV *, struct Perl_Interp *);\n;
+print IV *Parrot_op_$name(IV *, struct Perl_Interp *);\n;
 }
 
 BEGIN {
Index: process_opfunc.pl
===
RCS file: /home/perlcvs/parrot/process_opfunc.pl,v
retrieving revision 1.3
diff -u -u -r1.3 process_opfunc.pl
--- process_opfunc.pl   2001/09/10 21:26:09 1.3
+++ process_opfunc.pl   2001/09/10 23:07:08
@@ -105,7 +105,7 @@
 my $line = shift;
 my ($name) = $line =~ /AUTO_OP\s+(\w+)/;
 
-print OUTPUT IV *$name(IV cur_opcode[], struct Perl_Interp *interpreter) {\n;
+print OUTPUT IV *Parrot_op_$name(IV cur_opcode[], struct Perl_Interp 
+*interpreter) {\n;
 return($name,   return cur_opcode + 
 . $opcode{$name}{RETURN_OFFSET}. ;\n}\n);
 }
@@ -114,7 +114,7 @@
 my $line = shift;
 my ($name) = $line =~ /MANUAL_OP\s+(\w+)/;
 
-print OUTPUT IV *$name(IV cur_opcode[], struct Perl_Interp *interpreter) {\n;
+print OUTPUT IV *Parrot_op_$name(IV cur_opcode[], struct Perl_Interp 
+*interpreter) {\n;
 print OUTPUT   IV return_offset = 1;\n;
 return($name,   return cur_opcode + return_offset;\n}\n);
 }
Index: test.pbc
===
RCS file: /home/perlcvs/parrot/test.pbc,v
retrieving revision 1.2
diff -u -u -r1.2 test.pbc
Binary files /tmp/cvsqe7MSGr3cy and test.pbc differ



Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Bryan C . Warnock

I think Dan mentioned this,  but it looks like the suffixes can be derived 
from the args being passed in.  That would greatly simply the assembler to 
just the function names: set, eq, add, branch.

Were there problems with the scheme, is someone working on it, or did it 
fall through the cracks?  (I'm very much in favor of such a change, and will 
pick it up if no one else is working on it.)

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Speaking of namespaces...

2001-09-10 Thread Damien Neil

On Mon, Sep 10, 2001 at 04:04:20PM -0700, Damien Neil wrote:
 The following quick-and-dirty patch appears to work.  This prefixes
 all opcode functions with Parrot_op_.  I'd have made the prefix
 configurable, but the opcode generation is spread across three
 different files.

Oops--that breaks the assembler.  This patch fixes the assembler to
work with the prior patch.

- Damien


Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.6
diff -u -u -r1.6 assemble.pl
--- assemble.pl 2001/09/10 21:26:08 1.6
+++ assemble.pl 2001/09/10 23:43:30
@@ -15,7 +15,7 @@
 open GUTS, interp_guts.h;
 my $opcode;
 while (GUTS) {
-next unless /\tx\[(\d+)\] = ([a-z_]+);/;
+next unless /\tx\[(\d+)\] = Parrot_op_([a-z_]+);/;
 $opcodes{$2}{CODE} = $1;
 }
 



RE: Speaking of namespaces...

2001-09-10 Thread Brent Dax

Damien Neil:
# On Mon, Sep 10, 2001 at 06:58:23PM -0400, Dan Sugalski wrote:
#  At 03:52 PM 9/10/2001 -0700, Damien Neil wrote:
#  Parrot fails to work in very obscure ways on FreeBSD.  After some
#  poking around, I tracked the problem to the end op--this appears
#  to conflict with something inside libc.  Renaming the op fixes the
#  problem.
#  
#  Ah, that's what was  killing the build on Nat's machine. 
# Patch, by chance?
# 
# The following quick-and-dirty patch appears to work.  This prefixes
# all opcode functions with Parrot_op_.  I'd have made the prefix
# configurable, but the opcode generation is spread across three
# different files.
# 
# (Aside: What's the best way to generate a useful patch with cvs?
# The following comes from cvs -q diff -u.)

This patch seems to work on the FreeBSD box I have access to.  Now to figure out 
what's causing all those 'use of uninitialized value at assembler.pl line 81' 
messages...

--Brent Dax
[EMAIL PROTECTED]

...and if the answers are inadequate, the pumpqueen will be overthrown in a bloody 
coup by programmers flinging dead Java programs over the walls with a trebuchet.  




RE: Speaking of namespaces...

2001-09-10 Thread Brent Dax

Damien Neil:
# On Mon, Sep 10, 2001 at 04:04:20PM -0700, Damien Neil wrote:
#  The following quick-and-dirty patch appears to work.  This prefixes
#  all opcode functions with Parrot_op_.  I'd have made the prefix
#  configurable, but the opcode generation is spread across three
#  different files.
# 
# Oops--that breaks the assembler.  This patch fixes the assembler to
# work with the prior patch.

That explains it!  :^)

--Brent Dax
[EMAIL PROTECTED]

...and if the answers are inadequate, the pumpqueen will be overthrown in a bloody 
coup by programmers flinging dead Java programs over the walls with a trebuchet.  




RE: Parrot 0.0.1 is released.

2001-09-10 Thread Jeffrey Coleman Carlyle

Am I missing something (well, clearly I am), but are test.pasm and
test2.pasm missing from the CVS repository?


// Jeffrey Coleman Carlyle:   Computer Science Graduate Student at the
// University of Illinois at Urbana-Champaign; Creator of StratoSetup,
// Windows Restart, comp.os.msdos.programmer FAQ; Kentucky roadgeek;
// RULER OF EARTH! www.rulerofearth.org  www.jeffc.org

-Original Message-
From: Simon Cozens [mailto:[EMAIL PROTECTED]] 
Sent: Monday, September 10, 2001 3:43 PM
To: [EMAIL PROTECTED]; [EMAIL PROTECTED]
Subject: Parrot 0.0.1 is released.

Because the game of hide-and-seek was still going on, it took Edmund
and Lucy some time to find the others. But when at last they were
all
together (which happened in the long room, where the suit of armour
was) Lucy burst out:

Peter! Susan! It's all true. Edmund has seen it too. There is a
country you can get to through the wardrobe. Edmund and I both got
in.
We met one another in there, in the wood. Go on, Edmund; tell them
all
about it.

 - The Lion, The Witch and the
Wardrobe,
  CS
Lewis

I suppose (unlike Edmund did) I should tell you all about it. What we're
releasing today is a very, very early alpha of the Parrot interpreter.
At
the moment, we have support for some simple operations on integer,
floating
point and string registers, and the ability to read in and execute
bytecode.
We also have an assembler which can generate bytecode output from Parrot
assembly.

You can get the source tarball in (currently) two different ways:
From CPAN:
http://www.cpan.org/authors/id/S/SI/SIMON/parrot-0.0.1.tar.gz
   http://www.cpan.org/src/parrot-0.0.1.tar.gz
   (once the mirrors have updated)

From CVS:  See the Parrot CVS home page at http://cvs.perl.org/

Once you've unpacked parrot, you should be able to make test_prog, and
use the Parrot assembler to turn assembly into bytecode:

make test_prog
perl assemble.pl test.pasm  test.pbc
./test_prog test.pbc
perl assemble.pl test2.pasm  test2.pbc
./test_prog test2.pbc

The first test program will add some numbers together, count to
10,000,000,
and tell you how long it took; the second test program will print a
familiar
greeting.

In the next email, coming in a couple of minutes, I'll outline two areas
where I really, really need some patches before we go much further; you
should also note that Parrot has a bug/request tracking system at

http://parrotbugs.develooper.com/

which will be filled with some more things that I'd like people to take
a
look at.

Patches should be sent to the perl6-internals mailing list, where I'll
take a
look at them and apply them to the CVS tree. As time goes by, people who
regularly submit good patches will be given committer access to the
tree, and
can help me out applying other patches from the list.

IMPORTANT! Please note that we haven't decided the final license for
Parrot 
yet. You currently receive Parrot under the same terms as Perl 5: your
choice 
of either the Artistic or General Public Licenses.

Have fun,
Simon

-- 
set_s_sc S1, Just Another Parrot Hacker, 
print_s  S1




Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 06:23 pm, Dan Sugalski wrote:
 At 05:23 PM 9/10/2001 -0500, Brian Wheeler wrote:
 First off, here's an inconsistancy I found:  In test.pasm
 
 REDO:   eq_i_ic I2, I4, DONE, NEXT
 
 appears.  Shouldn't this be comparing to a constant, not a register?

 Nope, though if I let you in on the actual secret it's help.

 That should really be eq_i_ic_ic. (Well, actually there should be only one
 label, and we fall through otherwise. It's a bug in implementation and
 assembly, not opcode name... :) The intention is the last _x covers the
 last arg, the next to last covers the next to last arg, and so on. When we
 run out, we repeat the innermost type.

Why are you doing right-to-left instead of left-to-right? 

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Patch to assembler/disassembler + parrot asm

2001-09-10 Thread Brian Wheeler

 
 At 05:23 PM 9/10/2001 -0500, Brian Wheeler wrote:
 First off, here's an inconsistancy I found:  In test.pasm
 
 REDO:   eq_i_ic I2, I4, DONE, NEXT
 
 appears.  Shouldn't this be comparing to a constant, not a register?
 
 Nope, though if I let you in on the actual secret it's help.
 
 That should really be eq_i_ic_ic. (Well, actually there should be only one 
 label, and we fall through otherwise. It's a bug in implementation and 
 assembly, not opcode name... :) The intention is the last _x covers the 
 last arg, the next to last covers the next to last arg, and so on. When we 
 run out, we repeat the innermost type.
 
 The ultimate intention is that you'd write that as a plain:
 
  eq I2, I4, DONE, NEXT
 
 or probably
 
  eq I2, I4, DONE
 
 and either way the assembler would know DONE was a constant and we needed i 
 registers since that was specified, and emit the eq_i_ic opcode.

BUT, I'm more confused now :)

If eq_i_ic is really treated as /eq(_i)+_ic/ then this code still
doesn't work:

eq_i_ic I1,I2,NEXT,DONE

because that'd be like eq_i_i_ic_ic, right?

I assume that opcodes aren't going to have variable arguments at this level,
so there should be a one-to-one mapping between function and opcode, right?

A thought (though gross):  if we restrict mneumonics to not use the underscore,
then anything after _ can be the op signature.

The opcode_table could use these characters for different data types:
integer i
integer constantj
numeric n
numeric constanto
address a
string  s
string constant t

The file could be reorganized as:

set 2   i   j
set 2   i   i
set 2   n   o
set 2   s   t


The perl scripts which create the interfaces (process_opfunc.pl, etc) could
use this information to create 4 opcodes:
set_ij
set_ii
set_no
set_st

When the assembler comes across 'set I1,I2', It knows the set_ii form is
the one to use.  The disassembler can dump it as 'set_ii I1,I2' or
(I suppose) as 'set I1,I2'

Also, doing it this way takes out the special cases for the comparison and
jump ops:  the fixups are known to be done with things that have type 'a'

  


 
 It
 became a little obvious when I made a few changes to the
 assembler/disassembler to give more details about the data (and to allow
 shortcuts like add I1,I2,I3 to go to add_i I1,I2,I3, etc)
 
 
 The opcode_table patch changes the argument encoding to use these terms:
 #   i   Integer constant
 #   I   Integer register
 #   n   Numeric constant
 #   N   Numeric register
 #   s   String constant?
 #   S   String register
 #   D   Destination
 
 I was using a trailing c to note a constant since we're using the opcode 
 name as a C function name, and we're not counting on case-sensitivity in 
 symbols.
 

fair enough... 

 Other than that (well, and Simon has a patch in to the repository to yank 
 out the opcode numbers entirely from opcode_table) it looks keen.
 

I'll take a peek and see what all depends on the opcode_table file...

Brian

   Dan
 
 --it's like this---
 Dan Sugalski  even samurai
 [EMAIL PROTECTED] have teddy bears and even
   teddy bears get drunk
 




Re: Patch to assembler/disassembler + parrot asm

2001-09-10 Thread Brian Wheeler


another thought...

 
 A thought (though gross):  if we restrict mneumonics to not use the underscore,
 then anything after _ can be the op signature.
 
 The opcode_table could use these characters for different data types:
 integer   i
 integer constant  j
 numeric   n
 numeric constant  o
 address   a
 strings
 string constant   t
 
 The file could be reorganized as:
 
 set   2   i   j
 set   2   i   i
 set   2   n   o
 set   2   s   t
 

what if the table had another column (optional) at the end:

set 2   i   j   set_i

which gave the name of the C function which implemented it.  that way the
assembly ops are independant of the C function names and multiple ops could
map to a single C routine (if needed) 

I've got to know...what's the significance of the magic number? :)

Brian



Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Ken Fox

Bryan C. Warnock wrote:
 On Monday 10 September 2001 06:23 pm, Dan Sugalski wrote:
  When we run out, we repeat the innermost type.
 
 Why are you doing right-to-left instead of left-to-right?

Because it would be harder to repeat the innermost type then? ;)
Most binary ops will take identical inner args. This is just
a readability optimization to avoid things like _i_i.

Avoiding type extensions completely seems best if the compiler
and disassembler are smart enough. I'm not sure we'll be able
to do that though -- more complex addressing modes may lose
type info. (But that assumes someday we get more complex
addressing modes... ;)

- Ken



Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Dan Sugalski

At 08:00 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
On Monday 10 September 2001 06:23 pm, Dan Sugalski wrote:
  At 05:23 PM 9/10/2001 -0500, Brian Wheeler wrote:
  First off, here's an inconsistancy I found:  In test.pasm
  
  REDO:   eq_i_ic I2, I4, DONE, NEXT
  
  appears.  Shouldn't this be comparing to a constant, not a register?
 
  Nope, though if I let you in on the actual secret it's help.
 
  That should really be eq_i_ic_ic. (Well, actually there should be only one
  label, and we fall through otherwise. It's a bug in implementation and
  assembly, not opcode name... :) The intention is the last _x covers the
  last arg, the next to last covers the next to last arg, and so on. When we
  run out, we repeat the innermost type.

Why are you doing right-to-left instead of left-to-right?

Because I think backwards from most people, apparently. :)

That and generally speaking if there are three args the second is the same 
type as the first, while the third is the variant. Generally.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




RE: Speaking of namespaces...

2001-09-10 Thread Dan Sugalski

At 04:56 PM 9/10/2001 -0700, Brent Dax wrote:
This patch seems to work on the FreeBSD box I have access to.  Now to 
figure out what's causing all those 'use of uninitialized value at 
assembler.pl line 81' messages...

It's the blank lines in opcode_table. The assembler (and disassembler) at 
some point didn't grok 'em. Patches have been applied, but you might've 
checked out before that happened.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 08:47 pm, Dan Sugalski wrote:
 Because I think backwards from most people, apparently. :)

 That and generally speaking if there are three args the second is the same
 type as the first, while the third is the variant. Generally.

Tayyib.  Handling constants now.  Everything else seems to work on the 
assembler side.

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



RE: Parrot 0.0.1 is released.

2001-09-10 Thread Brent Dax

# -Original Message-
# From: Jeffrey Coleman Carlyle [mailto:[EMAIL PROTECTED]]
# Sent: Monday, September 10, 2001 5:04 PM
# To: 'Simon Cozens'
# Cc: [EMAIL PROTECTED]
# Subject: RE: Parrot 0.0.1 is released.
#
#
# Am I missing something (well, clearly I am), but are test.pasm and
# test2.pasm missing from the CVS repository?

Check the t/ directory.

--Brent Dax
[EMAIL PROTECTED]

...and if the answers are inadequate, the pumpqueen will be overthrown
in a bloody coup by programmers flinging dead Java programs over the
walls with a trebuchet.




Re: Speaking of namespaces...

2001-09-10 Thread Damien Neil

On Mon, Sep 10, 2001 at 08:48:48PM -0400, Dan Sugalski wrote:
 At 04:56 PM 9/10/2001 -0700, Brent Dax wrote:
 This patch seems to work on the FreeBSD box I have access to.  Now to 
 figure out what's causing all those 'use of uninitialized value at 
 assembler.pl line 81' messages...
 
 It's the blank lines in opcode_table. The assembler (and disassembler) at 
 some point didn't grok 'em. Patches have been applied, but you might've 
 checked out before that happened.

No, in this case, it's my fault.  I didn't realize the assembler
reads op name/number mappings out of interp_guts.h, so my patch
broke the assembler.

I'm thinking of writing something to generate a Parrot::Opcode.pm
module, so code doesn't need to parse opcode_table and interp_guts.h.
Sound reasonable?

   - Damien



Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Ken Fox

Dan Sugalski wrote:
 At 05:41 PM 9/10/2001 -0400, Ken Fox wrote:
  You're expecting the current lexical scope to be carried implicitly
  via the PC?
 
 No, it'll be in the interpreter struct.

But how does the interpreter know where a lexical scope begins
and ends in the bytecode? For example, a jump FOO might change
scopes. How is the scope discovered?

 This only lets us use multi-methods where arg0 is an object. Is
 this sufficient for implementing Perl 6?
 
 Ummm... how on earth do you plan on calling a method of something that's
 not an object? Methods sorta require them... :)

sub add(int x, int y) : multi { ... }
sub add(int x, num y) : multi { ... }
sub add(num x, num y) : multi { ... }

That makes sense to me. My syntax is probably wrong, but the intention
is clear. I'd be surprised if Damian doesn't want this.

- Ken



Re: Parrot 0.0.1 is released.

2001-09-10 Thread Ken Fox

Jeffrey Coleman Carlyle wrote:
 Am I missing something (well, clearly I am), but are test.pasm and
 test2.pasm missing from the CVS repository?

Look in ./t

- Ken



Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Dan Sugalski

At 08:44 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
On Monday 10 September 2001 08:47 pm, Dan Sugalski wrote:
  Because I think backwards from most people, apparently. :)
 
  That and generally speaking if there are three args the second is the same
  type as the first, while the third is the variant. Generally.

Tayyib.

Is that a good thing or a bad thing? :)

Handling constants now.  Everything else seems to work on the
assembler side.

Keen. Constants are odd, since they can happen in a number of ways. Int and 
float constants get embedded in the opcode stream, the rest go into the 
constants section and fixup sections of the bytecode, and that's still in flux.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Speaking of namespaces...

2001-09-10 Thread Dan Sugalski

At 05:49 PM 9/10/2001 -0700, Damien Neil wrote:
On Mon, Sep 10, 2001 at 08:48:48PM -0400, Dan Sugalski wrote:
  At 04:56 PM 9/10/2001 -0700, Brent Dax wrote:
  This patch seems to work on the FreeBSD box I have access to.  Now to
  figure out what's causing all those 'use of uninitialized value at
  assembler.pl line 81' messages...
 
  It's the blank lines in opcode_table. The assembler (and disassembler) at
  some point didn't grok 'em. Patches have been applied, but you might've
  checked out before that happened.

No, in this case, it's my fault.  I didn't realize the assembler
reads op name/number mappings out of interp_guts.h, so my patch
broke the assembler.

Nothing should read out of interp_guts.h. That's autogenerated from 
opcode_table. Or it was yesterday, but things might've changed. :)

I'm thinking of writing something to generate a Parrot::Opcode.pm
module, so code doesn't need to parse opcode_table and interp_guts.h.
Sound reasonable?

Yes, please do. I knew we needed one the second time I needed to parse 
opcode_table, I just haven't stopped long enough to be lazy and still 
program. (In those cases I came to a full stop...)

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Dan Sugalski

At 09:05 PM 9/10/2001 -0400, Ken Fox wrote:
Dan Sugalski wrote:
  At 05:41 PM 9/10/2001 -0400, Ken Fox wrote:
   You're expecting the current lexical scope to be carried implicitly
   via the PC?
 
  No, it'll be in the interpreter struct.

But how does the interpreter know where a lexical scope begins
and ends in the bytecode? For example, a jump FOO might change
scopes. How is the scope discovered?

   jump FOO

doesn't change scope.

   newscope scope_template_in_fixup_section

does. And

   exitscope

leaves one. :)

  This only lets us use multi-methods where arg0 is an object. Is
  this sufficient for implementing Perl 6?
 
  Ummm... how on earth do you plan on calling a method of something that's
  not an object? Methods sorta require them... :)

sub add(int x, int y) : multi { ... }
sub add(int x, num y) : multi { ... }
sub add(num x, num y) : multi { ... }

That makes sense to me. My syntax is probably wrong, but the intention
is clear. I'd be surprised if Damian doesn't want this.

Ah, multimethod subroutines. Those are a different beast entirely. For 
those the destination sub code is responsible for dispatch, that way you 
only pay the penalty to decode the arg types for those subs that actually 
do multimethodish things.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Parrot 0.0.1 is released.

2001-09-10 Thread Dan Sugalski

At 09:06 PM 9/10/2001 -0400, Ken Fox wrote:
Jeffrey Coleman Carlyle wrote:
  Am I missing something (well, clearly I am), but are test.pasm and
  test2.pasm missing from the CVS repository?

Look in ./t

Right. We moved them around a bit ago. Joys of a new project--everything's 
in flux, and the documentation doesn't quite keep pace. (Sometimes its 
ahead, sometimes its behind, but it beats having two source modules out of 
sync :)

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 08:58 pm, Dan Sugalski wrote:
 
 Tayyib.

 Is that a good thing or a bad thing? :)

It's an okay thing.  Literally.  


 Handling constants now.  Everything else seems to work on the
 assembler side.

 Keen. Constants are odd, since they can happen in a number of ways. Int
 and float constants get embedded in the opcode stream, the rest go into
 the constants section and fixup sections of the bytecode, and that's still
 in flux.

Yes, constants are the current problem child, because string and integer 
constants come down to the guts of the assembler the same way, and I can't 
base it off of the destination type.

I think I'll need to do mangling beforehand, or come up with another 
mechanism.  (One of which I already have in mind.)

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



RE: Patch to assembler/disassembler + parrot asm

2001-09-10 Thread Brent Dax

Dan Sugalski:
...
# The jump ops will be easy to figure--either they'll take a
# register, a
# constant number, or a label. We don't allow labels that could
# be confused
# with registers. (No I0: anywhere...)

Noo!  How will I write really confusing JAPHs now?  :^)

--Brent Dax
[EMAIL PROTECTED]

...and if the answers are inadequate, the pumpqueen will be overthrown
in a bloody coup by programmers flinging dead Java programs over the
walls with a trebuchet.




Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 09:00 pm, Dan Sugalski wrote:
 But how does the interpreter know where a lexical scope begins
 and ends in the bytecode? For example, a jump FOO might change
 scopes. How is the scope discovered?

jump FOO

 doesn't change scope.

Is that a doesn't or won't?

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Speaking of namespaces...

2001-09-10 Thread Damien Neil

On Mon, Sep 10, 2001 at 08:56:52PM -0400, Dan Sugalski wrote:
 I'm thinking of writing something to generate a Parrot::Opcode.pm
 module, so code doesn't need to parse opcode_table and interp_guts.h.
 Sound reasonable?
 
 Yes, please do. I knew we needed one the second time I needed to parse 
 opcode_table, I just haven't stopped long enough to be lazy and still 
 program. (In those cases I came to a full stop...)

OK, I'll do that sometime tonight.  Should it parse opcode_table,
or should it be generated with the contents of opcode_table?

  - Damien



length_s_i patch

2001-09-10 Thread Bryan C . Warnock

Okay, we'll start small. length_s_i is backwards - should be length_i_s. 
Patch fixes code and test.

Index: basic_opcodes.ops
===
RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v
retrieving revision 1.6
diff -u -r1.6 basic_opcodes.ops
--- basic_opcodes.ops   2001/09/10 21:47:25 1.6
+++ basic_opcodes.ops   2001/09/11 01:13:43
@@ -311,7 +311,7 @@
 }
 
 // LEN Ix, Sx
-AUTO_OP length_s_i {
+AUTO_OP length_i_s {
   INT_REG(P1) = string_length(STR_REG(P2));
 }
 
Index: opcode_table
===
RCS file: /home/perlcvs/parrot/opcode_table,v
retrieving revision 1.6
diff -u -r1.6 opcode_table
--- opcode_table2001/09/10 21:26:09 1.6
+++ opcode_table2001/09/11 01:13:44
@@ -44,7 +44,7 @@
 
 set_s_sc   2   i i
 print_s1   i
-length_s_i 2   i i
+length_i_s 2   i i
 chopn_s_ic 2   i i
 
 # Comparators
Index: t/test2.pasm
===
RCS file: /home/perlcvs/parrot/t/test2.pasm,v
retrieving revision 1.1
diff -u -r1.1 test2.pasm
--- t/test2.pasm2001/09/10 22:18:43 1.1
+++ t/test2.pasm2001/09/11 01:13:44
@@ -2,7 +2,7 @@
 set_i_ic I1, 0
 set_s_sc S1, Hello World
 REDO:   eq_i_ic I1, I2, DONE, NEXT
-NEXT:   length_s_i I1, S1
+NEXT:   length_i_s I1, S1
 print_s S1
 chopn_s_ic S1, 1
 branch_ic REDO


-- 
Bryan C. Warnock
[EMAIL PROTECTED]



RE: Patch to assembler/disassembler + parrot asm

2001-09-10 Thread Dan Sugalski

At 06:16 PM 9/10/2001 -0700, Brent Dax wrote:
Dan Sugalski:
...
# The jump ops will be easy to figure--either they'll take a
# register, a
# constant number, or a label. We don't allow labels that could
# be confused
# with registers. (No I0: anywhere...)

Noo!  How will I write really confusing JAPHs now?  :^)

use APL; ? ;-P

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Dan Sugalski

At 09:01 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
On Monday 10 September 2001 09:00 pm, Dan Sugalski wrote:
  But how does the interpreter know where a lexical scope begins
  and ends in the bytecode? For example, a jump FOO might change
  scopes. How is the scope discovered?
 
 jump FOO
 
  doesn't change scope.

Is that a doesn't or won't?

Won't.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Speaking of namespaces...

2001-09-10 Thread Dan Sugalski

At 06:02 PM 9/10/2001 -0700, Damien Neil wrote:
On Mon, Sep 10, 2001 at 08:56:52PM -0400, Dan Sugalski wrote:
  I'm thinking of writing something to generate a Parrot::Opcode.pm
  module, so code doesn't need to parse opcode_table and interp_guts.h.
  Sound reasonable?
 
  Yes, please do. I knew we needed one the second time I needed to parse
  opcode_table, I just haven't stopped long enough to be lazy and still
  program. (In those cases I came to a full stop...)

OK, I'll do that sometime tonight.  Should it parse opcode_table,
or should it be generated with the contents of opcode_table?

Parse opcode_table. Sync up your source first, there have been some changes 
to the format in the last few hours.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Patch: missing comparison _ics

2001-09-10 Thread Bryan C . Warnock

This patch (temporarily) fixes the missing _ic on comparison opcodes.

Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.6
diff -u -r1.6 assemble.pl
--- assemble.pl 2001/09/10 21:26:08 1.6
+++ assemble.pl 2001/09/11 01:27:58
@@ -68,12 +68,12 @@
 $args[0] = fixup($args[0])
 if $opcode eq branch_ic and $args[0] =~ /[a-zA-Z]/;
 
-#if ($opcode eq eq_i_ic or $opcode eq lt_i_ic) {
-if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic$/) {
+#if ($opcode eq eq_i_ic_ic or $opcode eq lt_i_ic_ic) {
+if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic_ic$/) {
 $args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
 $args[3] = fixup($args[3]) if $args[3] =~ /[a-zA-Z]/;
 }
-if ($opcode eq if_i_ic) {
+if ($opcode eq if_i_ic_ic) {
 $args[1] = fixup($args[1]) if $args[1] =~ /[a-zA-Z]/;
 $args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
 }
Index: basic_opcodes.ops
===
RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v
retrieving revision 1.6
diff -u -r1.6 basic_opcodes.ops
--- basic_opcodes.ops   2001/09/10 21:47:25 1.6
+++ basic_opcodes.ops   2001/09/11 01:27:58
@@ -41,7 +41,7 @@
 }
 
 // EQ Ix, Iy, EQ_BRANCH, NE_BRANCH
-MANUAL_OP eq_i_ic {
+MANUAL_OP eq_i_ic_ic {
   if (INT_REG(P1) == INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -50,7 +50,7 @@
 }
 
 // NE Ix, Iy, NE_BRANCH, EQ_BRANCH
-MANUAL_OP ne_i_ic {
+MANUAL_OP ne_i_ic_ic {
   if (INT_REG(P1) != INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -59,7 +59,7 @@
 }
 
 // LT Ix, Iy, LT_BRANCH, GE_BRANCH
-MANUAL_OP lt_i_ic {
+MANUAL_OP lt_i_ic_ic {
   if (INT_REG(P1)  INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -68,7 +68,7 @@
 }
 
 // LE Ix, Iy, LE_BRANCH, GT_BRANCH
-MANUAL_OP le_i_ic {
+MANUAL_OP le_i_ic_ic {
   if (INT_REG(P1) = INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -77,7 +77,7 @@
 }
 
 // GT Ix, Iy, GT_BRANCH, LE_BRANCH
-MANUAL_OP gt_i_ic {
+MANUAL_OP gt_i_ic_ic {
   if (INT_REG(P1)  INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -86,7 +86,7 @@
 }
 
 // GE Ix, Iy, GE_BRANCH, LT_BRANCH
-MANUAL_OP ge_i_ic {
+MANUAL_OP ge_i_ic_ic {
   if (INT_REG(P1) = INT_REG(P2)) {
 RETURN(P3);
   } else {
@@ -95,7 +95,7 @@
 }
 
 // IF IXx, TRUE_BRANCH, FALSE_BRANCH
-MANUAL_OP if_i_ic {
+MANUAL_OP if_i_ic_ic {
   if (INT_REG(P1)) {
 RETURN(P2);
   } else {
@@ -178,7 +178,7 @@
 }
 
 // EQ Nx, Ny, EQ_BRANCH, NE_BRANCH
-MANUAL_OP eq_n_ic {
+MANUAL_OP eq_n_ic_ic {
   if (NUM_REG(P1) == NUM_REG(P2)) {
 RETURN(P3);
   } else {
@@ -187,7 +187,7 @@
 }
 
 // IF Nx, TRUE_BRANCH, FALSE_BRANCH
-MANUAL_OP if_n_ic {
+MANUAL_OP if_n_ic_ic {
   if (NUM_REG(P1)) {
 RETURN(P2);
   } else {
@@ -311,7 +311,7 @@
 }
 
 // LEN Ix, Sx
-AUTO_OP length_s_i {
+AUTO_OP length_i_s {
   INT_REG(P1) = string_length(STR_REG(P2));
 }
 
Index: opcode_table
===
RCS file: /home/perlcvs/parrot/opcode_table,v
retrieving revision 1.6
diff -u -r1.6 opcode_table
--- opcode_table2001/09/10 21:26:09 1.6
+++ opcode_table2001/09/11 01:27:58
@@ -44,25 +44,25 @@
 
 set_s_sc   2   i i
 print_s1   i
-length_s_i 2   i i
+length_i_s 2   i i
 chopn_s_ic 2   i i
 
 # Comparators
 
-eq_i_ic4   i i i i
-eq_n_ic4   i i i i
-ne_i_ic4   i i i i
-lt_i_ic4   i i i i
-le_i_ic4   i i i i
-gt_i_ic4   i i i i
-ge_i_ic4   i i i i
+eq_i_ic_ic 4   i i i i
+eq_n_ic_ic 4   i i i i
+ne_i_ic_ic 4   i i i i
+lt_i_ic_ic 4   i i i i
+le_i_ic_ic 4   i i i i
+gt_i_ic_ic 4   i i i i
+ge_i_ic_ic 4   i i i i
 
 # Flow control
 
 jump_i 1   i
 branch_ic  1   i
-if_i_ic3   i i i
-if_n_ic3   i i i
+if_i_ic_ic 3   i i i
+if_n_ic_ic 3   i i i
 
 # Convertors
 
Index: t/test.pasm
===
RCS file: /home/perlcvs/parrot/t/test.pasm,v
retrieving revision 1.1
diff -u -r1.1 test.pasm
--- t/test.pasm 2001/09/10 22:18:43 1.1
+++ t/test.pasm 2001/09/11 01:27:58
@@ -2,7 +2,7 @@
 set_i_ic I2, 0
 set_i_ic I3, 1
 set_i_ic I4, 1000
-REDO:   eq_i_ic I2, I4, DONE, NEXT
+REDO:   eq_i_ic_ic I2, I4, DONE, NEXT
 NEXT:   add_i I2, I2, I3
 branch_ic REDO
 DONE:   time_i I5
Index: t/test2.pasm
===
RCS file: /home/perlcvs/parrot/t/test2.pasm,v
retrieving revision 1.1
diff -u -r1.1 test2.pasm
--- t/test2.pasm2001/09/10 22:18:43 1.1
+++ t/test2.pasm2001/09/11 01:27:58
@@ -1,8 +1,8 @@
 set_i_ic I2, 1
 set_i_ic I1, 0
 set_s_sc S1, Hello World
-REDO:   eq_i_ic I1, I2, DONE, NEXT
-NEXT:   length_s_i I1, S1
+REDO:   

Re: PDD 6: Parrot Assembly Language

2001-09-10 Thread Dan Sugalski

At 09:26 PM 9/10/2001 -0400, Ken Fox wrote:
Dan Sugalski wrote:
 jump FOO
 
  doesn't change scope.
 
 newscope scope_template_in_fixup_section
 
  does. And
 
 exitscope
 
  leaves one. :)

Ok. That clears it up a little. The current scope is part of
the VM internal state and compilers need to generate state
change instructions if they use lexicals.

Yes. More to the point only if they need to have a new set of lexicals. 
We'll probably have scopeless subs.

(Actually, I hope
they only need state change instructions if they need the
scope's symbol table...)

Just to check my understanding, Perl 6 will compile

   { bar { foo } blah }

into

newscope
bar
newscope
foo
exitscope
blah
exitscope

Something like that, yes.

What happens with:

goto FOO; { bar { FOO: foo } blah }

Is goto responsible for figuring out it has entered bar's
scope and setting the VM state so that the exitscopes are
properly balanced?

I'm not sure what we'll do in that situation. gotos into scopes might not 
be allowed.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Speaking of namespaces...

2001-09-10 Thread Bryan C . Warnock

On Monday 10 September 2001 09:27 pm, Dan Sugalski wrote:

 Parse opcode_table. Sync up your source first, there have been some
 changes to the format in the last few hours.

I'll wait on those changes before delving back into the assembler for the
simplified instruction handling.  

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Patch: assembler deferred output

2001-09-10 Thread Bryan C . Warnock

Following patch defers output of opcode until the end of an error-free run.
Also introduces a primitive '-c' option to allow checking of assembly only 
(a la Perl).

Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.6
diff -u -r1.6 assemble.pl
--- assemble.pl 2001/09/10 21:26:08 1.6
+++ assemble.pl 2001/09/11 01:45:34
@@ -5,6 +5,11 @@
 use strict;
 
 my(%opcodes, %labels);
+my ($output, $opt_c);
+if (@ARGV and $ARGV[0] eq -c) {
+shift @ARGV;
+$opt_c = 1;
+}
 
 my %pack_type;
 %pack_type = (i = 'l',
@@ -52,14 +57,16 @@
 
 # Now assemble
 $pc = 0;
+my $line = 0;
 while ($_ = shift @code) {
+$line++;
 chomp;
 s/,/ /g;
 
 my ($opcode, @args) = split /\s+/, $_;
 
 if (!exists $opcodes{lc $opcode}) {
-   die No opcode $opcode;
+   die No opcode $opcode at line $line:\n  $_\n;
 }
 if (@args != $opcodes{$opcode}{ARGS}) {
die wrong arg count--got . scalar @args.  needed  . 
$opcodes{$opcode}{ARGS};
@@ -68,25 +75,27 @@
 $args[0] = fixup($args[0])
 if $opcode eq branch_ic and $args[0] =~ /[a-zA-Z]/;
 
-#if ($opcode eq eq_i_ic or $opcode eq lt_i_ic) {
-   if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic$/) {
+#if ($opcode eq eq_i_ic_ic or $opcode eq lt_i_ic_ic) {
+if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic_ic$/) {
 $args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
 $args[3] = fixup($args[3]) if $args[3] =~ /[a-zA-Z]/;
 }
-if ($opcode eq if_i_ic) {
+if ($opcode eq if_i_ic_ic) {
 $args[1] = fixup($args[1]) if $args[1] =~ /[a-zA-Z]/;
 $args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
 }
 
-print pack l, $opcodes{$opcode}{CODE};
+$output .= pack l, $opcodes{$opcode}{CODE};
 foreach (0..$#args) {
$args[$_] =~ s/^[INPS]?(\d+)$/$1/i;
my $type = $pack_type{$opcodes{$opcode}{TYPES}[$_]};
-   print pack $type, $args[$_];
+   $output .= pack $type, $args[$_];
 }
 $pc += 1+@args;
 }
 
+print $output unless (defined $opt_c and $opt_c);
+
 sub fixup {
 my $l = shift;
 die Unknown label $l unless exists $labels{$l};
@@ -100,10 +109,10 @@
 return $constants{$s} = $#constants;
 }
 
-sub emit_magic { print pack($pack_type{i}, 0x13155a1) }
+sub emit_magic { $output .= pack($pack_type{i}, 0x13155a1) }
 
 # Dummy for now.
-sub emit_fixup_section { print pack($pack_type{i}, 0) }
+sub emit_fixup_section { $output .= pack($pack_type{i}, 0) }
 
 sub emit_constants_section {
 # First, compute how big it's going to be.
@@ -116,17 +125,17 @@
 }
 
 $size += $sizeof_packi if @constants; # That's for the number of 
constants
-print pack($pack_type{i}, $size);
+$output .= pack($pack_type{i}, $size);
 return unless @constants; # Zero means end of segment.
 
 # Then spit out how many constants there are, so we can allocate
-print pack($pack_type{i}, scalar @constants);
+$output .= pack($pack_type{i}, scalar @constants);
 
 # Now emit each constant
 for (@constants) {
-print pack($pack_type{i},0) x 3; # Flags, encoding, type
-print pack($pack_type{i},length($_)); # Strlen followed by that 
many bytes.
-print $_;
-print \0 x (length($_) % $sizeof_packi); # Padding;
+$output .= pack($pack_type{i},0) x 3; # Flags, encoding, type
+$output .= pack($pack_type{i},length($_)); # Strlen followed by 
that many bytes.
+$output .= $_;
+$output .= \0 x (length($_) % $sizeof_packi); # Padding;
 }
 }

-- 
Bryan C. Warnock
[EMAIL PROTECTED]



Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Dan Sugalski

At 07:25 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
I think Dan mentioned this,  but it looks like the suffixes can be derived
from the args being passed in.  That would greatly simply the assembler to
just the function names: set, eq, add, branch.

Were there problems with the scheme, is someone working on it, or did it
fall through the cracks?  (I'm very much in favor of such a change, and will
pick it up if no one else is working on it.)

No, I dont' think so, and yes, respectively. (Or, rather, we did the easy 
literal stuff first and planned on smartening up the assembler later. It's 
in the TODO even... :)

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Patch to assembler/disassembler + parrot asm

2001-09-10 Thread Brian Wheeler

On Mon, 2001-09-10 at 19:54, Dan Sugalski wrote:
 At 07:45 PM 9/10/2001 -0500, Brian Wheeler wrote:
 If eq_i_ic is really treated as /eq(_i)+_ic/ then this code still
 doesn't work:
 
 eq_i_ic I1,I2,NEXT,DONE
 
 because that'd be like eq_i_i_ic_ic, right?
 
 Right. But don't forget, I screwed up the eq op--it ought to have a single 
 destination. :)
 

DOH!  That's the trick :)



 I assume that opcodes aren't going to have variable arguments at this level,
 so there should be a one-to-one mapping between function and opcode, right?
 
 Each opcode number has a single function, yes. The same high-level 
 opcode, for example eq or add, might map to two or more different 'real' 
 opcodes based on the types of the args. There won't be any runtime 
 morphing--it's more The assembler sees the first arg of foo as a numberic 
 register and the second as a constant, so it must be foo_n_nc.
 
 A thought (though gross):  if we restrict mneumonics to not use the 
 underscore,
 then anything after _ can be the op signature.
 
 Too gross. We don't need to go there. :)
 

Just checking.


 Also, doing it this way takes out the special cases for the comparison and
 jump ops:  the fixups are known to be done with things that have type 'a'
 
 The jump ops will be easy to figure--either they'll take a register, a 
 constant number, or a label. We don't allow labels that could be confused 
 with registers. (No I0: anywhere...)
 
 

I've had more thoughts about my first patch.  The case issue isn't an
issue since it only touches the generation tools, not the C code that's
generated (at least, not directly).


It also provides the additional information needed to let the assembler
choose the correct opcode, and the disassembler to dump things nicely :)

I've also fixed up the supporting tools.  As a test case, I rebuilt
test_prog, assembled test.parm, ran it and dissassembled it.  Looks for
for that one, at least :)

Please consider this new patch.

Brian


Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.6
diff -u -r1.6 assemble.pl
--- assemble.pl 2001/09/10 21:26:08 1.6
+++ assemble.pl 2001/09/11 02:02:15
@@ -9,7 +9,16 @@
 my %pack_type;
 %pack_type = (i = 'l',
  n = 'd',
- );
+ );
+
+my %real_type=('i'='i',
+  'n'='n',
+  'N'='i',
+  'I'='i',
+  'S'='i',
+  's'='i',
+  'D'='i');
+
 my $sizeof_packi = length(pack($pack_type{i},1024));
 
 open GUTS, interp_guts.h;
@@ -26,8 +35,11 @@
 s/^\s+//;
 next unless $_;
 my ($name, $args, @types) = split /\s+/, $_;
+my @rtypes=@types;
+@types=map { $_ = $real_type{$_}} @types;
 $opcodes{$name}{ARGS} = $args;
 $opcodes{$name}{TYPES} = [@types];
+$opcodes{$name}{RTYPES}=[@rtypes];
 }
 
 my $pc = 0;
@@ -65,23 +77,17 @@
die wrong arg count--got . scalar @args.  needed  .
$opcodes{$opcode}{ARGS};
 }
 
-$args[0] = fixup($args[0])
-if $opcode eq branch_ic and $args[0] =~ /[a-zA-Z]/;
-
-#if ($opcode eq eq_i_ic or $opcode eq lt_i_ic) {
-if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic$/) {
-$args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
-$args[3] = fixup($args[3]) if $args[3] =~ /[a-zA-Z]/;
-}
-if ($opcode eq if_i_ic) {
-$args[1] = fixup($args[1]) if $args[1] =~ /[a-zA-Z]/;
-$args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
-}
-
 print pack l, $opcodes{$opcode}{CODE};
 foreach (0..$#args) {
-   $args[$_] =~ s/^[INPS]?(\d+)$/$1/i;
-   my $type = $pack_type{$opcodes{$opcode}{TYPES}[$_]};
+   my($rtype)=$opcodes{$opcode}{RTYPES}[$_];
+   my($type)=$opcodes{$opcode}{TYPES}[$_];
+   if($rtype eq I || $rtype eq N || $rtype eq P || $rtype eq S) {
+   # its a register argument
+   $args[$_]=~s/^[INPS](\d+)$/$1/i;
+   } elsif($rtype eq D) {
+   # a destination
+   $args[$_]=fixup($args[$_]);
+   }
print pack $type, $args[$_];
 }
 $pc += 1+@args;
Index: disassemble.pl
===
RCS file: /home/perlcvs/parrot/disassemble.pl,v
retrieving revision 1.3
diff -u -r1.3 disassemble.pl
--- disassemble.pl  2001/09/10 21:45:33 1.3
+++ disassemble.pl  2001/09/11 02:02:16
@@ -8,14 +8,25 @@
 
 my(%opcodes, @opcodes);
 
-my %unpack_type;
-%unpack_type = (i = 'l',
-   n = 'd',
-   );
+
+my %unpack_type = (i = 'l',
+  I = 'l',
+  n = 'd',
+  N = 'l',
+  D = 'l',
+  S = 'l',
+  s = 'l',
+  );
 my %unpack_size = (i = 4,
   n = 8,
+  I = 4,
+  N = 4,
+  D = 4,
+  S = 4,
+  s = 4,
   );
 
+
 open GUTS, 

Re: Patch to assembler/disassembler + parrot asm inconsistancies

2001-09-10 Thread Brian Wheeler

On Mon, 2001-09-10 at 20:52, Dan Sugalski wrote:
 At 07:25 PM 9/10/2001 -0400, Bryan C. Warnock wrote:
 I think Dan mentioned this,  but it looks like the suffixes can be derived
 from the args being passed in.  That would greatly simply the assembler to
 just the function names: set, eq, add, branch.
 
 Were there problems with the scheme, is someone working on it, or did it
 fall through the cracks?  (I'm very much in favor of such a change, and will
 pick it up if no one else is working on it.)
 
 No, I dont' think so, and yes, respectively. (Or, rather, we did the easy 
 literal stuff first and planned on smartening up the assembler later. It's 
 in the TODO even... :)
 
 

Hint, Nudge, Wink:  the last patch I sent that hits on the assembler
should make it very easy to add better assembly checking

For example, register checking could be done like this:

if($rtype eq I || $rtype eq N || $rtype eq P || $rtype eq S) {
# its a register argument
if($args[$_]=~m/^[INPS](\d+)$/) {
my($arg_num)=$1;
if($arg_num  32) {
# bad register number
} else {
$args[$_]=$arg_num;
}
} else {
# non-register being used!
}
} ...

Brian




Another Patch...

2001-09-10 Thread Brian Wheeler

This patch (which is pretty big) does:

* Changes the opcode_table file to provide additional information about
the operands.  Case shouldn't be a problem since that data never becomes
a C symbol [this is pretty much as before]

* Padding errors solved:  assemble.pl and bytecode.c were padding the
constants incorrectly.  It should have been 4-(size % 4), not just (size
% 4).  It is now fixed in both places.

* assembler has less special cases, and should be easier to hang error
checking on

* disassembler dumps constant table and the format is a bit prettier,
including register names, etc.  Test2.pbc dumps as this:

# Constants: 1 entries (32 bytes)
# ID  FlagsEncoding Type Size Data
:    000b Hello World
# Code Section
:  set_i_ic I2, 1
000c:  set_i_ic I1, 0
0018:  set_s_sc S1, [string ]
0024:  eq_i_ic  I1, I2, 0060, 0038
0038:  length_s_i   S1, I1
0044:  print_s  S1
004c:  chopn_s_ic   S1, 1
0058:  branch_ic0024
0060:  end


Let me know what you guys think!
Brian

[Crap, there's some wordwrapping below.  Too bad you can plug emacs into
evolution :) ]


Index: assemble.pl
===
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.6
diff -u -r1.6 assemble.pl
--- assemble.pl 2001/09/10 21:26:08 1.6
+++ assemble.pl 2001/09/11 03:14:32
@@ -9,7 +9,16 @@
 my %pack_type;
 %pack_type = (i = 'l',
  n = 'd',
- );
+ );
+
+my %real_type=('i'='i',
+  'n'='n',
+  'N'='i',
+  'I'='i',
+  'S'='i',
+  's'='i',
+  'D'='i');
+
 my $sizeof_packi = length(pack($pack_type{i},1024));
 
 open GUTS, interp_guts.h;
@@ -26,8 +35,11 @@
 s/^\s+//;
 next unless $_;
 my ($name, $args, @types) = split /\s+/, $_;
+my @rtypes=@types;
+@types=map { $_ = $real_type{$_}} @types;
 $opcodes{$name}{ARGS} = $args;
 $opcodes{$name}{TYPES} = [@types];
+$opcodes{$name}{RTYPES}=[@rtypes];
 }
 
 my $pc = 0;
@@ -65,23 +77,17 @@
die wrong arg count--got . scalar @args.  needed  .
$opcodes{$opcode}{ARGS};
 }
 
-$args[0] = fixup($args[0])
-if $opcode eq branch_ic and $args[0] =~ /[a-zA-Z]/;
-
-#if ($opcode eq eq_i_ic or $opcode eq lt_i_ic) {
-if ($opcode =~ /^(eq|ne|lt|le|gt|ge)_i_ic$/) {
-$args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
-$args[3] = fixup($args[3]) if $args[3] =~ /[a-zA-Z]/;
-}
-if ($opcode eq if_i_ic) {
-$args[1] = fixup($args[1]) if $args[1] =~ /[a-zA-Z]/;
-$args[2] = fixup($args[2]) if $args[2] =~ /[a-zA-Z]/;
-}
-
 print pack l, $opcodes{$opcode}{CODE};
 foreach (0..$#args) {
-   $args[$_] =~ s/^[INPS]?(\d+)$/$1/i;
-   my $type = $pack_type{$opcodes{$opcode}{TYPES}[$_]};
+   my($rtype)=$opcodes{$opcode}{RTYPES}[$_];
+   my($type)=$opcodes{$opcode}{TYPES}[$_];
+   if($rtype eq I || $rtype eq N || $rtype eq P || $rtype eq S) {
+   # its a register argument
+   $args[$_]=~s/^[INPS](\d+)$/$1/i;
+   } elsif($rtype eq D) {
+   # a destination
+   $args[$_]=fixup($args[$_]);
+   }
print pack $type, $args[$_];
 }
 $pc += 1+@args;
@@ -112,7 +118,10 @@
 for (@constants) {
 $size += 4*$sizeof_packi;
 $size += length($_);
-$size += length($_) % $sizeof_packi; # Padding
+   my($pad)=length($_) % $sizeof_packi;
+   if($pad) {
+   $size+=$sizeof_packi-$pad;
+   }
 }
 
 $size += $sizeof_packi if @constants; # That's for the number of
constants
@@ -127,6 +136,9 @@
 print pack($pack_type{i},0) x 3; # Flags, encoding, type
 print pack($pack_type{i},length($_)); # Strlen followed by that
many bytes.
 print $_;
-print \0 x (length($_) % $sizeof_packi); # Padding;
+   my $pad=(length($_) % $sizeof_packi);
+   if($pad) {
+   print \0 x ($sizeof_packi-(length($_) % $sizeof_packi)); #
Padding;
+   }
 }
 }
Index: bytecode.c
===
RCS file: /home/perlcvs/parrot/bytecode.c,v
retrieving revision 1.4
diff -u -r1.4 bytecode.c
--- bytecode.c  2001/09/10 21:47:26 1.4
+++ bytecode.c  2001/09/11 03:14:33
@@ -79,6 +79,7 @@
 IV encoding = GRAB_IV(program_code);
 IV type = GRAB_IV(program_code);
 IV buflen   = GRAB_IV(program_code);
+   int pad;
 
 len -= 4 * sizeof(IV);
 
@@ -87,9 +88,11 @@
 len -= buflen;
 
 /* Padding */
-if (buflen % sizeof(IV)) {
-len -= buflen % sizeof(IV);
-(char*)*program_code += buflen % sizeof(IV);
+   pad=buflen % sizeof(IV);
+   if(pad) {
+ pad=sizeof(IV)-pad;
+ len -= pad;
+ (char*)*program_code += pad;
 }
 num--;
 if (len  0 || 

RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 10:58 AM 9/10/2001 -0700, David Whipp wrote:
Dan Sugalski wrote:
  Okay, I'm whipping together the fancy math section of the
  interpreter assembly language. I've got:
[...]
  Can anyone think of things I've forgotten? It's been a while
  since I've done numeric work.

I'm not sure where this belongs, but I'd really like to have
a usage model for some of the edges of arithmetic. For example,
it should be possible to enable/disable overflow and underflow
exceptions. Basically, Perl5 should be IEE754 compliant; and it
should support the (optional) traps. It would also nice to have
a saturation-on-overflow mode/type.

I'd intended the basic math ops on floats and ints (the ones in I and N 
registers) to ignore over and underflow stuff, or potentially throw 
exceptions, though there's no exception code at the moment. For math ops on 
variables, I'd intended they catch the exceptions and handle upgrading as 
appropriate. (The assumption being that the compiler would generate the 
low-level int/float code and make sure things don't over/underflow. I'm 
thinking that was probably a naive thought... :)

If you have this type of stuff for floats; it'd be consistant to
have it for integers, too.

Yep. For variable operations we'd need it certainly, to catch cases where 
we need to go to the bigint format.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Hong Zhang

 Uri Guttman  
  we are planning automatic over/underflow to bigfloat. so there is no
  need for traps. they could be provided at the time of the 
  conversion to big*.
 
 OK. But will Perl support signaling and non-signaling NANs?

I don't think we should go for automatic overflow/underflow between
float and bigfloat. The float exception (overflow, underflow, inexact,
divide zero, ...) is very difficult to handle. Using Unix signal is 
expensive and very platform-specific (lots of ucontext issues). Since
C language does not support floating-point signal, we may use some
assembly code to handle it, it will be porting nightmare.

Since most of floating-point assumes IEEE-semantics, taking automatic
float/bigfloat will change this assumption significantly. It may a
lot of code and algorithm. I think it is safer just to provide a
BigDecimal class for developers to use, and keep the basic float
semantics (close to 64-bit IEEE-754 if possible).

Hong



RE: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Dan Sugalski

At 02:12 PM 9/10/2001 -0700, Hong Zhang wrote:
  Uri Guttman
   we are planning automatic over/underflow to bigfloat. so there is no
   need for traps. they could be provided at the time of the
   conversion to big*.
 
  OK. But will Perl support signaling and non-signaling NANs?

I don't think we should go for automatic overflow/underflow between
float and bigfloat.

Not for N registers, no. Perl's standard scalar variable will do this, though.

The float exception (overflow, underflow, inexact,
divide zero, ...) is very difficult to handle.

That's why we wrap it in a generic macro and leave it for the individual 
ports to handle.

Using Unix signal is
expensive and very platform-specific (lots of ucontext issues). Since
C language does not support floating-point signal, we may use some
assembly code to handle it, it will be porting nightmare.

Not if we do it right to start. Yes, there may be snippets of assembly in 
solaris.c/vms.c/linux.c/whatever.c, but that's fine. We can use a boring 
test comparison as a generic replacement on platforms people don't want to 
use a specific one on.

Since most of floating-point assumes IEEE-semantics, taking automatic
float/bigfloat will change this assumption significantly.

Most people I know that use floating point numbers don't have any idea that 
there are well-defined IEEE semantics, let alone what they are. Some folks 
are, and for them we'll make sure you can avoid leaving IEEE floats.

Of course, that's as much an argument for automatically going straight to 
bigfloats rather than going to native floats, since if people generally 
have no idea what the errors inherent in IEEE floats are they probably 
ought not use them. That's something to take up with Larry, though.

It may a
lot of code and algorithm. I think it is safer just to provide a
BigDecimal class for developers to use, and keep the basic float
semantics (close to 64-bit IEEE-754 if possible).

IEEE floats suck. (I've got an amazingly bad opinion of a lot of 
widely-accepted computer practice, don't I? :) They're an OK option for 
what they are, and the hardware speed support is nice, but let's face it, 
they're a compromise with adequate characteristics, and the design 
compromises are usually the wrong ones (with the single exception of speed) 
for what most people do with floats in perl.

Dan

--it's like this---
Dan Sugalski  even samurai
[EMAIL PROTECTED] have teddy bears and even
  teddy bears get drunk




Re: Math functions? (Particularly transcendental ones)

2001-09-10 Thread Uri Guttman

 DW == David Whipp [EMAIL PROTECTED] writes:

  DW Dan Sugalski wrote:
   Okay, I'm whipping together the fancy math section of the 
   interpreter assembly language. I've got:
  DW [...]
   Can anyone think of things I've forgotten? It's been a while 
   since I've done numeric work.

  DW I'm not sure where this belongs, but I'd really like to have
  DW a usage model for some of the edges of arithmetic. For example,
  DW it should be possible to enable/disable overflow and underflow
  DW exceptions. Basically, Perl5 should be IEE754 compliant; and it
  DW should support the (optional) traps. It would also nice to have
  DW a saturation-on-overflow mode/type.

we are planning automatic over/underflow to bigfloat. so there is no
need for traps. they could be provided at the time of the conversion to
big*.

  DW If you have this type of stuff for floats; it'd be consistant to
  DW have it for integers, too.

overflow to bigint is also planned.

uri

-- 
Uri Guttman  -  [EMAIL PROTECTED]  --  http://www.sysarch.com
SYStems ARCHitecture and Stem Development -- http://www.stemsystems.com
Search or Offer Perl Jobs  --  http://jobs.perl.org



Parrot 0.0.1 is released.

2001-09-10 Thread Simon Cozens

Because the game of hide-and-seek was still going on, it took Edmund
and Lucy some time to find the others. But when at last they were all
together (which happened in the long room, where the suit of armour
was) Lucy burst out:

Peter! Susan! It's all true. Edmund has seen it too. There is a
country you can get to through the wardrobe. Edmund and I both got in.
We met one another in there, in the wood. Go on, Edmund; tell them all
about it.

 - The Lion, The Witch and the Wardrobe,
  CS Lewis

I suppose (unlike Edmund did) I should tell you all about it. What we're
releasing today is a very, very early alpha of the Parrot interpreter. At
the moment, we have support for some simple operations on integer, floating
point and string registers, and the ability to read in and execute bytecode.
We also have an assembler which can generate bytecode output from Parrot
assembly.

You can get the source tarball in (currently) two different ways:
From CPAN: http://www.cpan.org/authors/id/S/SI/SIMON/parrot-0.0.1.tar.gz
   http://www.cpan.org/src/parrot-0.0.1.tar.gz
   (once the mirrors have updated)

From CVS:  See the Parrot CVS home page at http://cvs.perl.org/

Once you've unpacked parrot, you should be able to make test_prog, and
use the Parrot assembler to turn assembly into bytecode:

make test_prog
perl assemble.pl test.pasm  test.pbc
./test_prog test.pbc
perl assemble.pl test2.pasm  test2.pbc
./test_prog test2.pbc

The first test program will add some numbers together, count to 10,000,000,
and tell you how long it took; the second test program will print a familiar
greeting.

In the next email, coming in a couple of minutes, I'll outline two areas
where I really, really need some patches before we go much further; you
should also note that Parrot has a bug/request tracking system at

http://parrotbugs.develooper.com/

which will be filled with some more things that I'd like people to take a
look at.

Patches should be sent to the perl6-internals mailing list, where I'll take a
look at them and apply them to the CVS tree. As time goes by, people who
regularly submit good patches will be given committer access to the tree, and
can help me out applying other patches from the list.

IMPORTANT! Please note that we haven't decided the final license for Parrot 
yet. You currently receive Parrot under the same terms as Perl 5: your choice 
of either the Artistic or General Public Licenses.

Have fun,
Simon

-- 
set_s_sc S1, Just Another Parrot Hacker, 
print_s  S1