Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[perl #16087] [PATCH] Scratchpad pmc

10 views
Skip to first unread message

Jonathan Sillito

unread,
Aug 12, 2002, 3:10:00 PM8/12/02
to Dan Sugalski, Melvin Smith, Perl internals mailing list
Dan, some time ago you mentioned that you were preparing a position doc
on issues raised in the 'maybe-PATCH: sub/continuation/dlsym/coroutine
clean-up' thread. Are you nearly ready with that doc? Does this patch
(i.e. a scratchpad pmc) fit into what you have in mind?

Sorry to be harassing you about this, but I am anxious to do more coding
and I just want to be sure that I am moving in roughly the right
direction ...

... well, while I am already harassing you two, I'll try a few questions.

1) The Parrot_Sub struct in sub.h has its own user_stack and
control_stack. Why is this necessary?

2) If they are necessary, then does that mean the caller needs to save
and restore their user_stack and control_stack?

3) Some of the caller save burden (and overhead?) could be minimized if
there was 'ret' vtable method that was called to do some clean up ... ok
so that is not a question just some random thought.

4) Parrot_Coroutine's 'init' is not longer used and can go away, I guess
I could remove it in a future patch ... ok so that's not a question
either.

Anyway, thanks for any info!
--
Jonathan Sillito


On Thu, 2002-08-08 at 14:29, Jonathan Sillito wrote:
> # New Ticket Created by Jonathan Sillito
> # Please include the string: [perl #16087]
> # in the subject line of all future correspondence about this issue.
> # <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=16087 >
>
>
> The main purpose of this patch is to give scratchpads a pointer to their
> parent pad. In the process I added a Scratchpad pmc that uses its data
> pointer to point to a PerlHash (temporarily) and uses its cache pointer
> to point to its parent. I am not sure about this use of the cache
> pointer, but it is only used internally so it should be easy to change.
>
> The scratchpad.pmc file is attached, the important bits (so far) are the
> init(), mark(), set_pmc_keyed() and get_pmc_keyed() vtable methods.
>
> The attached patch has the following effects:
>
> - changes lexical ops in core.ops to use Scratchpad pmc.
> - adds Scratchpad to enum in include/parrot/pmc.h
> - adds Parrot_Scratchpad_class_init(enum_class_Scratchpad); to
> global_setup.c
> - adds additional test to t/op/lexicals.t
> - fixes examples/assembly/lexicals.pasm (reverses PMC and string
> arguments to store_lex op).
>
> MISSING
> -------
>
> Access by integer index, I am waiting for a way to pass a pad descriptor
> (or at least the number of lexicals to go in the pad) to the init vtable
> method.
>
> There is no integration with subs/coroutines/continuations. I will add
> this if people think this approach is reasonable.
>
> Comments?
> --
> Jonathan Sillito
>
>
>
> -- attachment 1 ------------------------------------------------------
> url: http://rt.perl.org/rt2/attach/33293/27417/874baa/lexicals.patch
>
> -- attachment 2 ------------------------------------------------------
> url: http://rt.perl.org/rt2/attach/33293/27418/a51da2/scratchpad.pmc
>
> ----
>

> Index: core.ops
> ===================================================================
> RCS file: /cvs/public/parrot/core.ops,v
> retrieving revision 1.195
> diff -u -r1.195 core.ops
> --- core.ops 7 Aug 2002 04:01:24 -0000 1.195
> +++ core.ops 8 Aug 2002 20:19:54 -0000
> @@ -3662,8 +3662,8 @@
> =cut
>
> op new_pad() {
> - PMC* hash = pmc_new(interpreter, enum_class_PerlHash);
> - stack_push(interpreter, &interpreter->ctx.pad_stack, hash, STACK_ENTRY_DESTINATION, STACK_CLEANUP_NULL);
> + PMC * pad = pmc_new(interpreter, enum_class_Scratchpad);
> + stack_push(interpreter, &interpreter->ctx.pad_stack, pad, STACK_ENTRY_DESTINATION, STACK_CLEANUP_NULL);
>
> goto NEXT();
> }
> @@ -3674,24 +3674,22 @@
> }
>
> op store_lex(in STR, in PMC) {
> - PMC * hash = NULL;
> + PMC * pad;
> KEY key;
> Stack_entry_type type = 0;
> MAKE_KEY(key, $1, enum_key_string, struct_val);
> - hash = (PMC *)stack_peek(interpreter, interpreter->ctx.pad_stack, &type);
> - hash->vtable->set_pmc_keyed(interpreter, hash, NULL, $2, &key);
> + pad = (PMC *)stack_peek(interpreter, interpreter->ctx.pad_stack, &type);
> + pad->vtable->set_pmc_keyed(interpreter, pad, NULL, $2, &key);
> goto NEXT();
> }
>
> op find_lex(out PMC, in STR) {
> - PMC * hash = NULL;
> + PMC * pad;
> KEY key;
> Stack_entry_type type = 0;
> MAKE_KEY(key, $2, enum_key_string, struct_val);
> - hash = (PMC *)stack_peek(interpreter, interpreter->ctx.pad_stack, &type);
> - $1 = hash->vtable->get_pmc_keyed(interpreter, hash, &key);
> -
> - /* FIXME: should the not found case be an internal_exception ? */
> + pad = (PMC *)stack_peek(interpreter, interpreter->ctx.pad_stack, &type);
> + $1 = pad->vtable->get_pmc_keyed(interpreter, pad, &key);
>
> goto NEXT();
> }
> Index: global_setup.c
> ===================================================================
> RCS file: /cvs/public/parrot/global_setup.c,v
> retrieving revision 1.31
> diff -u -r1.31 global_setup.c
> --- global_setup.c 4 Aug 2002 22:54:31 -0000 1.31
> +++ global_setup.c 8 Aug 2002 20:19:54 -0000
> @@ -34,6 +34,7 @@
> Parrot_Coroutine_class_init(enum_class_Coroutine);
> Parrot_CSub_class_init(enum_class_CSub);
> Parrot_Continuation_class_init(enum_class_Continuation);
> + Parrot_Scratchpad_class_init(enum_class_Scratchpad);
>
> /* Now register the names of the PMCs */
>
> Index: include/parrot/pmc.h
> ===================================================================
> RCS file: /cvs/public/parrot/include/parrot/pmc.h,v
> retrieving revision 1.34
> diff -u -r1.34 pmc.h
> --- include/parrot/pmc.h 4 Aug 2002 22:56:06 -0000 1.34
> +++ include/parrot/pmc.h 8 Aug 2002 20:19:54 -0000
> @@ -27,6 +27,7 @@
> enum_class_Coroutine,
> enum_class_Continuation,
> enum_class_CSub,
> + enum_class_Scratchpad,
> enum_class_max = 100
> };
> VAR_SCOPE VTABLE Parrot_base_vtables[enum_class_max];
> Index: t/op/lexicals.t
> ===================================================================
> RCS file: /cvs/public/parrot/t/op/lexicals.t,v
> retrieving revision 1.2
> diff -u -r1.2 lexicals.t
> --- t/op/lexicals.t 6 Aug 2002 22:42:35 -0000 1.2
> +++ t/op/lexicals.t 8 Aug 2002 20:19:54 -0000
> @@ -1,6 +1,6 @@
> #! perl -w
>
> -use Parrot::Test tests => 2;
> +use Parrot::Test tests => 3;
>
> output_is(<<CODE, <<OUTPUT, "simple store and fetch");
> new_pad
> @@ -53,6 +53,27 @@
> 0
> 2
> 0
> +OUTPUT
> +
> +output_is(<<CODE, <<OUTPUT, "undefined lexicals");
> + new P0, .PerlInt
> + set P0, 30
> +
> + # outer most lexical scope
> + new_pad
> +
> + # nested lexical scope
> + new_pad
> + store_lex "a", P0
> + pop_pad
> +
> + # should be undefined (printing undef does nothing)
> + find_lex P2, "a"
> + print P2
> + print "\\n"
> + end
> +CODE
> +
> OUTPUT
>
> 1;
> Index: examples/assembly/lexical.pasm
> ===================================================================
> RCS file: /cvs/public/parrot/examples/assembly/lexical.pasm,v
> retrieving revision 1.1
> diff -u -r1.1 lexical.pasm
> --- examples/assembly/lexical.pasm 31 Jul 2002 02:48:49 -0000 1.1
> +++ examples/assembly/lexical.pasm 8 Aug 2002 20:19:54 -0000
> @@ -15,14 +15,14 @@
>
> # outer most lexical scope
> new_pad
> -store_lex P0, "a"
> +store_lex "a", P0
> find_lex P3, "a"
> print P3 # prints 0
> print "\n"
>
> new_pad
> -store_lex P1, "b"
> -store_lex P1, "a"
> +store_lex "b", P1
> +store_lex "a", P1
>
> find_lex P3, "a"
> print P3 # prints 1
> ----
>

> /* Scratchpad.pmc
> * Copyright: (When this is determined...it will go here)
> * CVS Info
> * $Id$
> * Overview:
> * These are the vtable functions for the Scratchpad base class
> * Data Structure and Algorithms:
> * SELF->data stores the lexicals
> * SELF->cache points to the parent Scratchpad, if there is one
> * and is NULL otherwise
> * History:
> * Initial revision by sillito 2002/08/08
> * Notes:
> * References:
> */
>
> #include "parrot/parrot.h"
>
> pmclass Scratchpad {
>
> void init () {
> /* get parent */
> PMC * parent;
> Stack_entry_type type = 0;
> parent = (PMC *)stack_peek(interpreter,
> interpreter->ctx.pad_stack, &type);
> SELF->cache.pmc_val = parent;
>
> /* temporarily using a hash to store lexicals */
> SELF->data = pmc_new(interpreter, enum_class_PerlHash);
>
> SELF->flags |= (PMC_is_PMC_ptr_FLAG | PMC_custom_mark_FLAG);
> }
>
> void init_pmc (PMC* initializer) {
> }
>
> void morph (INTVAL type) {
> }
>
> PMC* mark (PMC* tail) {
> /*
> * this assumes that the data pointer points to something
> * with a customer mark routine, which hash does ...
> */
> tail = ((PMC *)SELF->data)->vtable->mark(interpreter,
> SELF->data, tail);
> if (SELF->cache.pmc_val) {
> tail = Parrot_Scratchpad_mark(interpreter, SELF->cache.pmc_val, tail);
> }
>
> return tail;
> }
>
> void destroy () {
> }
>
> INTVAL type () {
> return enum_class_Scratchpad;
> }
> /*
> INTVAL type_keyed (KEY* key) {
> }
>
> INTVAL type_keyed_int (INTVAL* key) {
> }
>
> UINTVAL subtype (INTVAL type) {
> }
>
> UINTVAL subtype_keyed (KEY* key, INTVAL type) {
> }
>
> UINTVAL subtype_keyed_int (INTVAL* key, INTVAL type) {
> }
> */
> STRING* name () {
> return whoami;
> }
> /*
> STRING* name_keyed (KEY* key) {
> }
>
> STRING* name_keyed_int (INTVAL* key) {
> }
>
> PMC* clone () {
> }
>
> PMC* clone_keyed (KEY* key) {
> }
>
> PMC* clone_keyed_int (INTVAL* key) {
> }
>
> PMC* find_method (STRING* method_name) {
> }
>
> PMC* find_method_keyed (KEY* key, STRING* method_name) {
> }
>
> PMC* find_method_keyed_int (INTVAL* key, STRING* method_name) {
> }
>
> INTVAL get_integer () {
> }
>
> INTVAL get_integer_keyed (KEY* key) {
> }
>
> INTVAL get_integer_keyed_int (INTVAL* key) {
> }
>
> FLOATVAL get_number () {
> }
>
> FLOATVAL get_number_keyed (KEY* key) {
> }
>
> FLOATVAL get_number_keyed_int (INTVAL* key) {
> }
>
> BIGNUM* get_bignum () {
> }
>
> BIGNUM* get_bignum_keyed (KEY* key) {
> }
>
> BIGNUM* get_bignum_keyed_int (INTVAL* key) {
> }
>
> STRING* get_string () {
> }
>
> STRING* get_string_keyed (KEY* key) {
> }
>
> STRING* get_string_keyed_int (INTVAL* key) {
> }
>
> INTVAL get_bool () {
> }
>
> INTVAL get_bool_keyed (KEY* key) {
> }
>
> INTVAL get_bool_keyed_int (INTVAL* key) {
> }
>
> INTVAL elements () {
> }
>
> INTVAL elements_keyed (KEY* key) {
> }
>
> INTVAL elements_keyed_int (INTVAL* key) {
> }
>
> PMC* get_pmc () {
> }
> */
> PMC* get_pmc_keyed (KEY* key) {
> PMC * value;
> value = ((PMC *)SELF->data)->vtable->get_pmc_keyed(interpreter,
> SELF->data, key);
>
> if (value->vtable->type(interpreter, value) == enum_class_PerlUndef &&
> SELF->cache.pmc_val) {
> value = SELF->cache.pmc_val->vtable->get_pmc_keyed(interpreter,
> SELF->cache.pmc_val, key);
> }
>
> return value;
> }
>
> /* implement this for getting lexicals by position
> PMC* get_pmc_keyed_int (INTVAL* key) {
> }
> */
> /*
> INTVAL is_same (PMC* value) {
> }
>
> INTVAL is_same_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> INTVAL is_same_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> void set_integer (PMC* value) {
> }
>
> void set_integer_native (INTVAL value) {
> }
>
> void set_integer_same (PMC* value) {
> }
>
> void set_integer_keyed (KEY* key, INTVAL value) {
> }
>
> void set_integer_keyed_int (INTVAL* key, INTVAL value) {
> }
>
> void set_number (PMC* value) {
> }
>
> void set_number_native (FLOATVAL value) {
> }
>
> void set_number_same (PMC* value) {
> }
>
> void set_number_keyed (KEY* key, FLOATVAL value) {
> }
>
> void set_number_keyed_int (INTVAL* key, FLOATVAL value) {
> }
>
> void set_bignum (PMC* value) {
> }
>
> void set_bignum_native (BIGNUM* value) {
> }
>
> void set_bignum_same (PMC* value) {
> }
>
> void set_bignum_keyed (KEY* key, BIGNUM* value) {
> }
>
> void set_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
> }
>
> void set_string (PMC* value) {
> }
>
> void set_string_native (STRING* value) {
> }
>
> void set_string_unicode (STRING* value) {
> }
>
> void set_string_other (STRING* value) {
> }
>
> void set_string_same (PMC* value) {
> }
>
> void set_string_keyed (KEY* key, STRING* value) {
> }
>
> void set_string_keyed_int (INTVAL* key, STRING* value) {
> }
>
> void set_pmc (PMC* value) {
> }
> */
> void set_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
> ((PMC *)SELF->data)->vtable->set_pmc_keyed(interpreter,
> SELF->data, key, value, value_key);
> }
> /*
> void set_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> void set_same (PMC* value) {
> }
>
> void set_same_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> void set_same_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> INTVAL pop_integer () {
> }
>
> INTVAL pop_integer_keyed (KEY* key) {
> }
>
> INTVAL pop_integer_keyed_int (INTVAL* key) {
> }
>
> FLOATVAL pop_float () {
> }
>
> FLOATVAL pop_float_keyed (KEY* key) {
> }
>
> FLOATVAL pop_float_keyed_int (INTVAL* key) {
> }
>
> BIGNUM* pop_bignum () {
> }
>
> BIGNUM* pop_bignum_keyed (KEY* key) {
> }
>
> BIGNUM* pop_bignum_keyed_int (INTVAL* key) {
> }
>
> STRING* pop_string () {
> }
>
> STRING* pop_string_keyed (KEY* key) {
> }
>
> STRING* pop_string_keyed_int (INTVAL* key) {
> }
>
> PMC* pop_pmc () {
> }
>
> PMC* pop_pmc_keyed (KEY* key) {
> }
>
> PMC* pop_pmc_keyed_int (INTVAL* key) {
> }
>
> void push_integer (INTVAL value) {
> }
>
> void push_integer_keyed (KEY* key, INTVAL value) {
> }
>
> void push_integer_keyed_int (INTVAL* key, INTVAL value) {
> }
>
> void push_float (FLOATVAL value) {
> }
>
> void push_float_keyed (KEY* key, FLOATVAL value) {
> }
>
> void push_float_keyed_int (INTVAL* key, FLOATVAL value) {
> }
>
> void push_bignum (BIGNUM* value) {
> }
>
> void push_bignum_keyed (KEY* key, BIGNUM* value) {
> }
>
> void push_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
> }
>
> void push_string (STRING* value) {
> }
>
> void push_string_keyed (KEY* key, STRING* value) {
> }
>
> void push_string_keyed_int (INTVAL* key, STRING* value) {
> }
>
> void push_pmc (PMC* value) {
> }
>
> void push_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> void push_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> INTVAL shift_integer () {
> }
>
> INTVAL shift_integer_keyed (KEY* key) {
> }
>
> INTVAL shift_integer_keyed_int (INTVAL* key) {
> }
>
> FLOATVAL shift_float () {
> }
>
> FLOATVAL shift_float_keyed (KEY* key) {
> }
>
> FLOATVAL shift_float_keyed_int (INTVAL* key) {
> }
>
> BIGNUM* shift_bignum () {
> }
>
> BIGNUM* shift_bignum_keyed (KEY* key) {
> }
>
> BIGNUM* shift_bignum_keyed_int (INTVAL* key) {
> }
>
> STRING* shift_string () {
> }
>
> STRING* shift_string_keyed (KEY* key) {
> }
>
> STRING* shift_string_keyed_int (INTVAL* key) {
> }
>
> PMC* shift_pmc () {
> }
>
> PMC* shift_pmc_keyed (KEY* key) {
> }
>
> PMC* shift_pmc_keyed_int (INTVAL* key) {
> }
>
> void unshift_integer (INTVAL value) {
> }
>
> void unshift_integer_keyed (KEY* key, INTVAL value) {
> }
>
> void unshift_integer_keyed_int (INTVAL* key, INTVAL value) {
> }
>
> void unshift_float (FLOATVAL value) {
> }
>
> void unshift_float_keyed (KEY* key, FLOATVAL value) {
> }
>
> void unshift_float_keyed_int (INTVAL* key, FLOATVAL value) {
> }
>
> void unshift_bignum (BIGNUM* value) {
> }
>
> void unshift_bignum_keyed (KEY* key, BIGNUM* value) {
> }
>
> void unshift_bignum_keyed_int (INTVAL* key, BIGNUM* value) {
> }
>
> void unshift_string (STRING* value) {
> }
>
> void unshift_string_keyed (KEY* key, STRING* value) {
> }
>
> void unshift_string_keyed_int (INTVAL* key, STRING* value) {
> }
>
> void unshift_pmc (PMC* value) {
> }
>
> void unshift_pmc_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> void unshift_pmc_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> void add (PMC* value, PMC* dest) {
> }
>
> void add_int (INTVAL value, PMC* dest) {
> }
>
> void add_bignum (BIGNUM* value, PMC* dest) {
> }
>
> void add_float (FLOATVAL value, PMC* dest) {
> }
>
> void add_same (PMC* value, PMC* dest) {
> }
>
> void add_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void add_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void subtract (PMC* value, PMC* dest) {
> }
>
> void subtract_int (INTVAL value, PMC* dest) {
> }
>
> void subtract_bignum (BIGNUM* value, PMC* dest) {
> }
>
> void subtract_float (FLOATVAL value, PMC* dest) {
> }
>
> void subtract_same (PMC* value, PMC* dest) {
> }
>
> void subtract_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void subtract_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void multiply (PMC* value, PMC* dest) {
> }
>
> void multiply_int (INTVAL value, PMC* dest) {
> }
>
> void multiply_bignum (BIGNUM* value, PMC* dest) {
> }
>
> void multiply_float (FLOATVAL value, PMC* dest) {
> }
>
> void multiply_same (PMC* value, PMC* dest) {
> }
>
> void multiply_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void multiply_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void divide (PMC* value, PMC* dest) {
> }
>
> void divide_int (INTVAL value, PMC* dest) {
> }
>
> void divide_bignum (BIGNUM* value, PMC* dest) {
> }
>
> void divide_float (FLOATVAL value, PMC* dest) {
> }
>
> void divide_same (PMC* value, PMC* dest) {
> }
>
> void divide_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void divide_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void modulus (PMC* value, PMC* dest) {
> }
>
> void modulus_int (INTVAL value, PMC* dest) {
> }
>
> void modulus_bignum (BIGNUM* value, PMC* dest) {
> }
>
> void modulus_float (FLOATVAL value, PMC* dest) {
> }
>
> void modulus_same (PMC* value, PMC* dest) {
> }
>
> void modulus_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void modulus_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void neg (PMC* dest) {
> }
>
> void neg_keyed (KEY* key, PMC* dest, KEY* dest_key) {
> }
>
> void neg_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_or (PMC* value, PMC* dest) {
> }
>
> void bitwise_or_int (INTVAL value, PMC* dest) {
> }
>
> void bitwise_or_same (PMC* value, PMC* dest) {
> }
>
> void bitwise_or_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_or_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_and (PMC* value, PMC* dest) {
> }
>
> void bitwise_and_int (INTVAL value, PMC* dest) {
> }
>
> void bitwise_and_same (PMC* value, PMC* dest) {
> }
>
> void bitwise_and_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_and_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_xor (PMC* value, PMC* dest) {
> }
>
> void bitwise_xor_int (INTVAL value, PMC* dest) {
> }
>
> void bitwise_xor_same (PMC* value, PMC* dest) {
> }
>
> void bitwise_xor_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_xor_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_not (PMC* dest) {
> }
>
> void bitwise_not_keyed (KEY* key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_not_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_shl (PMC* value, PMC* dest) {
> }
>
> void bitwise_shl_int (INTVAL value, PMC* dest) {
> }
>
> void bitwise_shl_same (PMC* value, PMC* dest) {
> }
>
> void bitwise_shl_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_shl_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void bitwise_shr (PMC* value, PMC* dest) {
> }
>
> void bitwise_shr_int (INTVAL value, PMC* dest) {
> }
>
> void bitwise_shr_same (PMC* value, PMC* dest) {
> }
>
> void bitwise_shr_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void bitwise_shr_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void concatenate (PMC* value, PMC* dest) {
> }
>
> void concatenate_native (STRING* value, PMC* dest) {
> }
>
> void concatenate_unicode (STRING* value, PMC* dest) {
> }
>
> void concatenate_other (STRING* value, PMC* dest) {
> }
>
> void concatenate_same (PMC* value, PMC* dest) {
> }
>
> void concatenate_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void concatenate_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> INTVAL is_equal (PMC* value) {
> }
>
> INTVAL is_equal_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> INTVAL is_equal_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> INTVAL cmp (PMC* value) {
> }
>
> INTVAL cmp_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> INTVAL cmp_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> INTVAL cmp_num (PMC* value) {
> }
>
> INTVAL cmp_num_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> INTVAL cmp_num_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> INTVAL cmp_string (PMC* value) {
> }
>
> INTVAL cmp_string_keyed (KEY* key, PMC* value, KEY* value_key) {
> }
>
> INTVAL cmp_string_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key) {
> }
>
> void logical_or (PMC* value, PMC* dest) {
> }
>
> void logical_or_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void logical_or_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void logical_and (PMC* value, PMC* dest) {
> }
>
> void logical_and_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void logical_and_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void logical_xor (PMC* value, PMC* dest) {
> }
>
> void logical_xor_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void logical_xor_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void logical_not (PMC* dest) {
> }
>
> void logical_not_keyed (KEY* key, PMC* dest, KEY* dest_key) {
> }
>
> void logical_not_keyed_int (INTVAL* key, PMC* dest, INTVAL* dest_key) {
> }
>
> void repeat (PMC* value, PMC* dest) {
> }
>
> void repeat_int (INTVAL value, PMC* dest) {
> }
>
> void repeat_keyed (KEY* key, PMC* value, KEY* value_key, PMC* dest, KEY* dest_key) {
> }
>
> void repeat_keyed_int (INTVAL* key, PMC* value, INTVAL* value_key, PMC* dest, INTVAL* dest_key) {
> }
>
> void repeat_int_keyed (KEY* key, INTVAL value, PMC* dest, KEY* dest_key) {
> }
>
> void repeat_int_keyed_int (INTVAL* key, INTVAL value, PMC* dest, INTVAL* dest_key) {
> }
>
> void increment () {
> }
>
> void increment_keyed (KEY* key) {
> }
>
> void increment_keyed_int (INTVAL* key) {
> }
>
> void decrement () {
> }
>
> void decrement_keyed (KEY* key) {
> }
>
> void decrement_keyed_int (INTVAL* key) {
> }
>
> INTVAL exists_keyed (KEY* key) {
> }
>
> INTVAL exists_keyed_int (INTVAL* key) {
> }
>
> INTVAL defined () {
> }
>
> INTVAL defined_keyed (KEY* key) {
> }
>
> INTVAL defined_keyed_int (INTVAL* key) {
> }
>
> void delete_keyed (KEY* key) {
> }
>
> void delete_keyed_int (INTVAL* key) {
> }
>
> KEY* nextkey_keyed (KEY* key) {
> }
>
> KEY* nextkey_keyed_int (INTVAL* key) {
> }
>
> void substr (INTVAL offset, INTVAL length, PMC* dest) {
> }
>
> void substr_keyed (KEY* key, INTVAL offset, INTVAL length, PMC* dest, KEY* dest_key) {
> }
>
> void substr_keyed_int (INTVAL* key, INTVAL offset, INTVAL length, PMC* dest, INTVAL* dest_key) {
> }
>
> STRING* substr_str (INTVAL offset, INTVAL length) {
> }
>
> STRING* substr_str_keyed (KEY* key, INTVAL offset, INTVAL length) {
> }
>
> STRING* substr_str_keyed_int (INTVAL* key, INTVAL offset, INTVAL length) {
> }
>
> void* invoke (void* next) {
> }
> */
> }

Dan Sugalski

unread,
Aug 13, 2002, 2:31:57 AM8/13/02
to Jonathan Sillito, Melvin Smith, Perl internals mailing list
At 1:10 PM -0600 8/12/02, Jonathan Sillito wrote:
>Dan, some time ago you mentioned that you were preparing a position doc
>on issues raised in the 'maybe-PATCH: sub/continuation/dlsym/coroutine
>clean-up' thread. Are you nearly ready with that doc? Does this patch
>(i.e. a scratchpad pmc) fit into what you have in mind?

D'oh! I'll try and get it out by the end of the week.

>1) The Parrot_Sub struct in sub.h has its own user_stack and
>control_stack. Why is this necessary?

I think this is already covered. Thinko. :)

>2) If they are necessary, then does that mean the caller needs to save
>and restore their user_stack and control_stack?

Nope.

>3) Some of the caller save burden (and overhead?) could be minimized if
>there was 'ret' vtable method that was called to do some clean up ... ok
>so that is not a question just some random thought.

I don't quite understand where a vtable ret method would help. While
sub things are gotten to via PMC, they're not 'real' PMCs as such.

>4) Parrot_Coroutine's 'init' is not longer used and can go away, I guess
>I could remove it in a future patch ... ok so that's not a question
>either.

Init needs some additions. We need an init parameter. I'll get to
that this week.


--
Dan

--------------------------------------"it's like this"-------------------
Dan Sugalski even samurai
d...@sidhe.org have teddy bears and even
teddy bears get drunk

0 new messages