Leo --
Here's one of the early fingerprinting patches, 2001-09-14:
http://archive.develooper.com/perl6-internals@;perl.org/msg04063.html
Here's where Simon removed Digest::MD5, 2001-09-18:
http://archive.develooper.com/cvs-parrot@;perl.org/msg00151.html
Here's one of the messages about how I'd like to see us link op
implementations with their op codes:
http://archive.develooper.com/perl6-internals@;perl.org/msg06193.html
You can use that to vector into the thread. My ideas have changed a bit
since then (see below), but
you can get some of the idea there.
Here's another message that touched on this kind of stuff:
http://archive.develooper.com/perl6-internals@;perl.org/msg06270.html
What I advocate is having possibly only one (maybe too extreme, but
doable) built-in op pre-loaded
at opcode zero. This op's name is "useop", and its arguments give an
opcode (optable index), and
sufficent information for the interpreter to chase down the opinfo (and
opfunc). In the best scenario, this
could mean even doing some dynamic loading of oplibs. BTW, that was the
point of my initial bloated-
but-lightning fast oplookup switch() tree implementation, which has now
been replaced with something
I expect is more sane (I went that extreme because I was getting push-back
that the by-name lookups
would be slow, and even though I never advocated looking them up in DO_OP,
I still wanted to
demonstrate that they could be *very* fast).
Now, whether or not you statically link other oplibs, I suggest not having
every op be allocated a slot
in the optable. Rather, the initial few ops in the startup code of a chunk
of Parrot code is responsible
for utilizing useop to arrange the appropriate optable for that code. For
example, assembling
mops.pasm would result in the first chunk of code making 13 calls to useop
to attach the ops used by
that code. No longer to we care what order ops are in their oplibs,
because opcodes are not a
meaningful concept at a static level (in the Parrot source).
I've noticed that the current setup concats *.ops into one big core_ops.c,
which is very different from
what I was trying to move us towards long ago. I'm an advocate of smaller
and independant *.ops
files, separately compiled, and (possibly) only some actually statically
linked in. An additional by-name
lookup will be needed to map oplib names (and possibly version info, if we
determine that is necessary)
to the oplibinfo structures we got from the statically or dynamically
linked oplibs. The oplibinfo structures
give you the function pointer to call to look up ops by name in that
oplib.
One final interesting (at least to me) note: A chunk of code could
overwrite the optable entry zero with
some noo?p-equivalent op to prevent any further changes to its optable
once it has things the way it
wants them.
Regards,
-- Gregor
Leopold Toetsch <[EMAIL PROTECTED]>
11/03/2002 02:49 PM
To: [EMAIL PROTECTED]
cc: Josh Wilmes <[EMAIL PROTECTED]>, Brent Dax <[EMAIL PROTECTED]>,
"'Andy
Dougherty'" <[EMAIL PROTECTED]>, "'Perl6 Internals'"
<[EMAIL PROTECTED]>
Subject: Re: Need for fingerprinting? [was: Re: What to do if
Digest::MD5 is
unavailable?]
[EMAIL PROTECTED] wrote:
> All --
>
> FWIW, this stuff came up early on in Parrot's infancy.
Pointers, hints, information ...
> On a related note, I'm working on a toy VM outside of Parrot to
> demonstrate the technique I've proposed here in the past,
Pointers, hints, information ...
thanks,
leo ;-)