The attached patch is also in preparation for Rx3 (or whatever you want
to call it).  It implements a new Handle PMC type.  Handles simply
contain pointers.  They can't be directly manipulated directly by Parrot
bytecode; C code uses handle->vtable->get_value and ->set_value to
manipulate them.  They stringify to "Handle=0xDECAF" (or whatever) and
numify to 912559 (or whatever).

--Brent Dax
[EMAIL PROTECTED]
Configure pumpking for Perl 6

"Nothing important happened today."
    --George III of England's diary entry for 4-Jul-1776
--- ..\..\parrot-cvs\parrot\include\parrot\pmc.h        Thu Dec 20 01:09:06 2001
+++ include\parrot\pmc.h        Wed Jan  2 13:42:06 2002
@@ -19,6 +19,7 @@
     enum_class_PerlNum,
     enum_class_PerlString,
     enum_class_PerlArray,
+    enum_class_Handle,
     enum_class_max
 };
 VAR_SCOPE VTABLE Parrot_base_vtables[enum_class_max];
--- ..\..\parrot-cvs\parrot\classes\makefile.in Mon Dec 17 23:05:00 2001
+++ classes\makefile.in Wed Jan  2 13:29:02 2002
@@ -5,7 +5,7 @@
 
 H_FILES = $(INC)/parrot.h default.h
 
-O_FILES = default$(O) perlint$(O) perlstring$(O) perlnum$(O) perlarray$(O) 
perlundef$(O)
+O_FILES = default$(O) perlint$(O) perlstring$(O) perlnum$(O) perlarray$(O) 
+perlundef$(O) handle$(O)
 
 #DO NOT ADD C COMPILER FLAGS HERE
 #Add them in Configure.pl--look for the
@@ -21,7 +21,7 @@
 .c$(O):
        $(CC) $(CFLAGS) ${ld_out}$@ -c $<
 
-all : default$(O) perlint$(O) perlnum$(O) perlstring$(O) perlarray$(O) perlundef$(O)
+all : default$(O) perlint$(O) perlnum$(O) perlstring$(O) perlarray$(O) perlundef$(O) 
+handle$(O)
 
 default.c: default.pmc
        $(PERL) pmc2c.pl default.pmc
@@ -29,7 +29,7 @@
 default$(O): $(H_FILES)
 
 default.h: default.c
-       $(PERL) -ne "next unless /Parrot_default/; s/{/;/;s/^/extern /;print" 
default.c > default.h
+       $(PERL) -ne ${PQ}next unless /Parrot_default/; s/{/;/;s/^/extern /;print${PQ} 
+default.c > default.h
 
 perlint.c: perlint.pmc 
        $(PERL) pmc2c.pl perlint.pmc
@@ -56,6 +56,11 @@
 
 perlundef$(O): $(H_FILES)
 
+handle.c: handle.pmc
+       $(PERL) pmc2c.pl handle.pmc
+
+handle$(O): $(H_FILES)
+
 clean:
        $(RM_F) *.c *$(O) default.h
 
--- ..\..\parrot-cvs\parrot\global_setup.c      Thu Jan  3 14:18:06 2002
+++ global_setup.c      Thu Jan  3 15:19:32 2002
@@ -19,6 +19,7 @@
 void Parrot_PerlNum_class_init(void);
 void Parrot_PerlString_class_init(void);
 void Parrot_PerlArray_class_init(void);
+void Parrot_Handle_class_init(void);
 
 void
 init_world(void) {
@@ -29,6 +30,7 @@
     Parrot_PerlNum_class_init();
     Parrot_PerlString_class_init();
     Parrot_PerlArray_class_init();
+       Parrot_Handle_class_init();
 }
 
 /*
--- /dev/null   Wed Dec 31 16:00:00 1969
+++ classes\handle.pmc  Thu Jan  3 15:21:40 2002
@@ -0,0 +1,298 @@
+/* Handle.pmc
+ *  Copyright: (When this is determined...it will go here)
+ *  CVS Info
+ *     $Id$
+ *  Overview:
+ *     These are the vtable functions for the Handle base class
+ *  Data Structure and Algorithms:
+ *  History:
+ *  Notes:  The actual pointer is in cache.struct_val.
+ *  References:
+ */
+
+#include "parrot/parrot.h"
+#define ERROR fprintf(stderr, "An illegal operation was performed on a Handle.\n"); 
+exit(1); return 0;
+
+pmclass Handle {
+   INTVAL type () {
+   }
+
+   STRING* name () {
+      return whoami;
+   }
+
+   void init () {
+      pmc->cache.struct_val=NULL;
+   }
+
+   void clone (PMC* dest) {
+      dest->vtable=pmc->vtable;
+      dest->cache.struct_val=pmc->cache.struct_val;
+   }
+
+   void morph (INTVAL type) {
+   }
+
+   BOOLVAL move_to (void * destination) {
+   }
+
+   INTVAL real_size () {
+      return 0;
+   }
+
+   void destroy () {
+      /* nothing */
+   }
+
+   INTVAL get_integer () {
+      return (INTVAL)pmc->cache.struct_val;
+   }
+
+   INTVAL get_integer_index (INTVAL index) {
+   }
+
+   FLOATVAL get_number () {
+      return (FLOATVAL)(INTVAL)pmc->cache.struct_val;
+   }
+
+   FLOATVAL get_number_index (INTVAL index) {
+   }
+
+   STRING* get_string () {
+      char *target=mem_sys_allocate(64);
+      
+      sprintf(target, "Handle=0x%p", pmc->cache.struct_val);
+      
+      return string_make(interpreter, target, strlen(target), 0, 0, 0);
+   }
+
+   STRING* get_string_index (INTVAL index) {
+   }
+
+   BOOLVAL get_bool () {
+      return (BOOLVAL)pmc->cache.struct_val;
+   }
+
+   void* get_value () {
+      return pmc->cache.struct_val;
+   }
+
+   BOOLVAL is_same (PMC* pmc2) {
+      return pmc->vtable == pmc2->vtable && pmc->cache.struct_val == 
+pmc2->cache.struct_val;
+   }
+
+   void set_integer (PMC * value) {
+      ERROR;
+   }
+
+   void set_integer_native (INTVAL value) {
+      ERROR;
+   }
+
+   void set_integer_bigint (BIGINT value) {
+      ERROR;
+   }
+
+   void set_integer_same (PMC * value) {
+      ERROR;
+   }
+
+   void set_integer_index (INTVAL value, INTVAL index) {
+      ERROR;
+   }
+
+   void set_number (PMC * value) {
+      ERROR;
+   }
+
+   void set_number_native (FLOATVAL value) {
+      ERROR;
+   }
+
+   void set_number_bigfloat (BIGFLOAT value) {
+      ERROR;
+   }
+
+   void set_number_same (PMC * value) {
+      ERROR;
+   }
+
+   void set_number_index (FLOATVAL value, INTVAL index) {
+      ERROR;
+   }
+
+   void set_string (PMC * value) {
+      ERROR;
+   }
+
+   void set_string_native (STRING * value) {
+      ERROR;
+   }
+
+   void set_string_unicode (STRING * value) {
+      ERROR;
+   }
+
+   void set_string_other (STRING * value) {
+      ERROR;
+   }
+
+   void set_string_same (PMC * value) {
+      ERROR;
+   }
+
+   void set_string_index (STRING* value, INTVAL index) {
+      ERROR;
+   }
+
+   void set_value (void* value) {
+      pmc->cache.struct_val=value;
+   }
+
+   void add (PMC * value,  PMC* dest) {
+   }
+
+   void add_int (INTVAL value,  PMC* dest) {
+   }
+
+   void add_bigint (BIGINT value,  PMC* dest) {
+   }
+
+   void add_float (FLOATVAL value,  PMC* dest) {
+   }
+
+   void add_bigfloat (BIGFLOAT value,  PMC* dest) {
+   }
+
+   void add_same (PMC * value,  PMC* dest) {
+   }
+
+   void subtract (PMC * value,  PMC* dest) {
+   }
+
+   void subtract_int (INTVAL value,  PMC* dest) {
+   }
+
+   void subtract_bigint (BIGINT value,  PMC* dest) {
+   }
+
+   void subtract_float (FLOATVAL value,  PMC* dest) {
+   }
+
+   void subtract_bigfloat (BIGFLOAT value,  PMC* dest) {
+   }
+
+   void subtract_same (PMC * value,  PMC* dest) {
+   }
+
+   void multiply (PMC * value,  PMC* dest) {
+   }
+
+   void multiply_int (INTVAL value,  PMC* dest) {
+   }
+
+   void multiply_bigint (BIGINT value,  PMC* dest) {
+   }
+
+   void multiply_float (FLOATVAL value,  PMC* dest) {
+   }
+
+   void multiply_bigfloat (BIGFLOAT value,  PMC* dest) {
+   }
+
+   void multiply_same (PMC * value,  PMC* dest) {
+   }
+
+   void divide (PMC * value,  PMC* dest) {
+   }
+
+   void divide_int (INTVAL value,  PMC* dest) {
+   }
+
+   void divide_bigint (BIGINT value,  PMC* dest) {
+   }
+
+   void divide_float (FLOATVAL value,  PMC* dest) {
+   }
+
+   void divide_bigfloat (BIGFLOAT value,  PMC* dest) {
+   }
+
+   void divide_same (PMC * value,  PMC* dest) {
+   }
+
+   void modulus (PMC * value,  PMC* dest) {
+   }
+
+   void modulus_int (INTVAL value,  PMC* dest) {
+   }
+
+   void modulus_bigint (BIGINT value,  PMC* dest) {
+   }
+
+   void modulus_float (FLOATVAL value,  PMC* dest) {
+   }
+
+   void modulus_bigfloat (BIGFLOAT value,  PMC* dest) {
+   }
+
+   void modulus_same (PMC * value,  PMC* dest) {
+   }
+
+   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) {
+   }
+
+   BOOLVAL is_equal (PMC* value) {
+   }
+
+   void logical_or (PMC* value,  PMC* dest) {
+   }
+
+   void logical_and (PMC* value,  PMC* dest) {
+   }
+
+   void logical_not (PMC* value) {
+   }
+
+   void match (PMC * value,  REGEX* re) {
+   }
+
+   void match_native (STRING * value,  REGEX* re) {
+   }
+
+   void match_unicode (STRING * value,  REGEX* re) {
+   }
+
+   void match_other (STRING * value,  REGEX* re) {
+   }
+
+   void match_same (PMC * value,  REGEX* re) {
+   }
+
+   void repeat (PMC * value,  PMC* dest) {
+   }
+
+   void repeat_native (STRING * value,  PMC* dest) {
+   }
+
+   void repeat_unicode (STRING * value,  PMC* dest) {
+   }
+
+   void repeat_other (STRING * value,  PMC* dest) {
+   }
+
+   void repeat_same (PMC * value,  PMC* dest) {
+   }
+}

Reply via email to