All --

As a first step to moving NV constants out of the byte code stream
and other goodness, I have produced this patch that gets rid of
bytecode.[hc] (for now) and has the interpreter rely on packfile.[hc]
for its bytecode interface.

The packfile.[hc] stuff has been modified a bit in anticipation of
multiple types of constants (NV soon, PV later). It now has a type
field (IV) and a string field (STRING *).

The packing and unpacking of constants has been modified (of course)
to reflect this new structure.

Also, I added 'end' to some of the test cases in t/op/*.t and modified
basic_opcodes.ops to access constants via the new 'code' member of
the Parrot_Interp struct.

I just made clean and test here and things went well. I'd like to get
some feedback from folks on other architectures (I'm on Linux Intel)
so we can know if I've hurt anyone on portability.

Something very much like this is going to be committed soon as part of
our final push for 0.0.2, which requires us to move NVs into the
const_table.

Stay tuned for more...


Regards,

-- Gregor
 _____________________________________________________________________ 
/     perl -e 'srand(-2091643526); print chr rand 90 for (0..4)'      \

   Gregor N. Purdy                          [EMAIL PROTECTED]
   Focus Research, Inc.                http://www.focusresearch.com/
   8080 Beckett Center Drive #203                   513-860-3570 vox
   West Chester, OH 45069                           513-860-3579 fax
\_____________________________________________________________________/
? packfile.patch
Index: MANIFEST
===================================================================
RCS file: /home/perlcvs/parrot/MANIFEST,v
retrieving revision 1.21
diff -u -r1.21 MANIFEST
--- MANIFEST    2001/09/25 09:12:57     1.21
+++ MANIFEST    2001/09/25 16:11:15
@@ -15,7 +15,6 @@
 assemble.pl
 basic_opcodes.ops
 build_interp_starter.pl
-bytecode.c
 config_h.in
 disassemble.pl
 docs/opcodes.pod
@@ -26,7 +25,6 @@
 docs/vtables.pod
 global_setup.c
 hints/mswin32.pl
-include/parrot/bytecode.h
 include/parrot/events.h
 include/parrot/exceptions.h
 include/parrot/global_setup.h
Index: Makefile.in
===================================================================
RCS file: /home/perlcvs/parrot/Makefile.in,v
retrieving revision 1.13
diff -u -r1.13 Makefile.in
--- Makefile.in 2001/09/22 17:20:58     1.13
+++ Makefile.in 2001/09/25 16:11:15
@@ -1,9 +1,9 @@
 O = ${o}
 
 INC=include/parrot
-H_FILES = $(INC)/config.h $(INC)/exceptions.h $(INC)/io.h $(INC)/op.h 
$(INC)/register.h $(INC)/string.h $(INC)/events.h $(INC)/interpreter.h $(INC)/memory.h 
$(INC)/parrot.h $(INC)/stacks.h $(INC)/packfile.h $(INC)/bytecode.h 
$(INC)/global_setup.h
+H_FILES = $(INC)/config.h $(INC)/exceptions.h $(INC)/io.h $(INC)/op.h 
+$(INC)/register.h $(INC)/string.h $(INC)/events.h $(INC)/interpreter.h 
+$(INC)/memory.h $(INC)/parrot.h $(INC)/stacks.h $(INC)/packfile.h 
+$(INC)/global_setup.h
 
-O_FILES = global_setup$(O) interpreter$(O) parrot$(O) register$(O) basic_opcodes$(O) 
memory$(O) packfile$(O) bytecode$(O) string$(O) strnative$(O)
+O_FILES = global_setup$(O) interpreter$(O) parrot$(O) register$(O) basic_opcodes$(O) 
+memory$(O) packfile$(O) string$(O) strnative$(O)
 
 #DO NOT ADD C COMPILER FLAGS HERE
 #Add them in Configure.pl--look for the
@@ -48,8 +48,6 @@
 interpreter$(O): interpreter.c $(H_FILES) $(INC)/interp_guts.h
 
 memory$(O): $(H_FILES)
-
-bytecode$(O): $(H_FILES)
 
 packfile$(O): $(H_FILES)
 
Index: basic_opcodes.ops
===================================================================
RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v
retrieving revision 1.24
diff -u -r1.24 basic_opcodes.ops
--- basic_opcodes.ops   2001/09/24 16:27:48     1.24
+++ basic_opcodes.ops   2001/09/25 16:11:16
@@ -425,7 +425,7 @@
 
 /* SET Sx, CONSTANT */
 AUTO_OP set_s_sc {
-  STR_REG(P1) = Parrot_string_constants[P2];
+  STR_REG(P1) = PCONST(P2)->string;
 }
 
 /* PRINT Sx */
@@ -436,8 +436,9 @@
 
 /* PRINT sc */
 AUTO_OP print_sc {
-  STRING *s = Parrot_string_constants[P1];
-  printf("%.*s",(int)string_length(s),(char *) s->bufstart);
+  STRING *s = PCONST(P1)->string;
+  IV l = string_length(s);
+  printf("%.*s",(int)l, (char *)s->bufstart);
 }
 
 
Index: interpreter.c
===================================================================
RCS file: /home/perlcvs/parrot/interpreter.c,v
retrieving revision 1.19
diff -u -r1.19 interpreter.c
--- interpreter.c       2001/09/24 17:19:47     1.19
+++ interpreter.c       2001/09/25 16:11:16
@@ -21,16 +21,17 @@
  * Check the bytecode's opcode table fingerprint.
  */
 void
-check_fingerprint(void) {
-    if (Parrot_num_string_constants == 0) {
+check_fingerprint(struct Parrot_Interp *interpreter) {
+/*    if (PNCONST == 0) { */
+    if (interpreter->code->const_table->const_count == 0) {
         fprintf(stderr, "Warning: Bytecode does not include opcode table 
fingerprint!\n");
     }
     else {
         const char * fp_data;
         IV           fp_len;
 
-        fp_data = Parrot_string_constants[0]->bufstart;
-        fp_len  = Parrot_string_constants[0]->buflen;
+        fp_data = PCONST(0)->string->bufstart;
+        fp_len  = PCONST(0)->string->buflen;
         
         if (strncmp(OPCODE_FINGERPRINT, fp_data, fp_len)) {
             fprintf(stderr, "Error: Opcode table fingerprint in bytecode does not 
match interpreter!\n");
@@ -45,20 +46,27 @@
  * run parrot operations until the program is complete
  */
 opcode_t *
-runops_notrace_core (struct Parrot_Interp *interpreter, opcode_t *code, IV code_size) 
{
+runops_notrace_core (struct Parrot_Interp *interpreter) {
     /* Move these out of the inner loop. No need to redeclare 'em each
        time through */
     opcode_t *(* func)();
     opcode_t *(**temp)();
-    opcode_t *code_start;
+    opcode_t * code_start;
+    IV         code_size;
+    opcode_t * code_end;
+    opcode_t * pc;
+
+    code_start = (opcode_t *)interpreter->code->byte_code;
+    code_size  = interpreter->code->byte_code_size;
+    code_end   = (opcode_t *)(interpreter->code->byte_code + code_size);
 
-    code_start = code;
+    pc = code_start;
 
-    while (code >= code_start && code < (code_start + code_size) && *code) {
-        DO_OP(code, temp, func, interpreter);
+    while (pc >= code_start && pc < code_end && *pc) {
+        DO_OP(pc, temp, func, interpreter);
     }
 
-    return code;
+    return pc;
 }
 
 /*
@@ -67,23 +75,23 @@
  * and ARGS. Used by runops_trace.
  */
 void
-trace_op(opcode_t * code_start, long code_size, opcode_t *code) {
+trace_op(opcode_t * code_start, opcode_t * code_end, opcode_t *pc) {
     int i;
 
-    if (code >= code_start && code < (code_start + code_size)) {
-        fprintf(stderr, "PC=%ld; OP=%ld (%s)", (long)(code - code_start), *code, 
op_names[*code]);
-        if (op_args[*code]) {
+    if (pc >= code_start && pc < code_end) {
+        fprintf(stderr, "PC=%ld; OP=%ld (%s)", (long)(pc - code_start), *pc, 
+op_names[*pc]);
+        if (op_args[*pc]) {
             fprintf(stderr, "; ARGS=(");
-            for(i = 0; i < op_args[*code]; i++) {
+            for(i = 0; i < op_args[*pc]; i++) {
                 if (i) { fprintf(stderr, ", "); }
-                fprintf(stderr, "%ld", *(code + i + 1));
+                fprintf(stderr, "%ld", *(pc + i + 1));
             }
             fprintf(stderr, ")");
         }
         fprintf(stderr, "\n");
     }
     else {
-        fprintf(stderr, "PC=%ld; OP=<err>\n", (long)(code - code_start));
+        fprintf(stderr, "PC=%ld; OP=<err>\n", (long)(pc - code_start));
     }
 }
 
@@ -92,24 +100,31 @@
  * Passed to runops_generic() by runops_trace().
  */
 opcode_t *
-runops_trace_core (struct Parrot_Interp *interpreter, opcode_t *code, IV code_size) {
+runops_trace_core (struct Parrot_Interp *interpreter) {
     /* Move these out of the inner loop. No need to redeclare 'em each
        time through */
     opcode_t *( *func)();
     opcode_t *(**temp)();
-    opcode_t *code_start;
+    opcode_t * code_start;
+    IV         code_size;
+    opcode_t * code_end;
+    opcode_t * pc;
 
-    code_start = code;
+    code_start = (opcode_t *)interpreter->code->byte_code;
+    code_size  = interpreter->code->byte_code_size;
+    code_end   = (opcode_t *)(interpreter->code->byte_code + code_size);
 
-    trace_op(code_start, code_size, code);
+    pc = code_start;
 
-    while (code >= code_start && code < (code_start + code_size) && *code) {
-        DO_OP(code, temp, func, interpreter);
+    trace_op(code_start, code_end, pc);
+    
+    while (pc >= code_start && pc < code_end && *pc) {
+        DO_OP(pc, temp, func, interpreter);
 
-        trace_op(code_start, code_size, code);
+        trace_op(code_start, code_end, pc);
     }
 
-    return code;
+    return pc;
 }
 
 /*=for api interpreter runops_generic
@@ -117,17 +132,22 @@
  * Generic runops, which takes a function pointer for the core.
  */
 void
-runops_generic (opcode_t * (*core)(struct Parrot_Interp *, opcode_t *, IV), struct 
Parrot_Interp *interpreter, opcode_t *code, IV code_size) {
+runops_generic (opcode_t * (*core)(struct Parrot_Interp *), struct Parrot_Interp 
+*interpreter) {
     opcode_t * code_start;
+    IV         code_size;
+    opcode_t * code_end;
+    IV *       pc;
 
-    check_fingerprint();
+    check_fingerprint(interpreter);
 
-    code_start = code;
+    code_start = (opcode_t *)interpreter->code->byte_code;
+    code_size  = interpreter->code->byte_code_size;
+    code_end   = (opcode_t *)(interpreter->code->byte_code + code_size);
 
-    code = core(interpreter, code, code_size);
+    pc = core(interpreter);
 
-    if (code < code_start || code >= (code_start + code_size)) {
-        fprintf(stderr, "Error: Control left bounds of byte-code block (now at 
location %d)!\n", code - code_start);
+    if (pc < code_start || pc >= code_end) {
+        fprintf(stderr, "Error: Control left bounds of byte-code block (now at 
+location %d)!\n", pc - code_start);
         exit(1);
     }
 }
@@ -137,8 +157,8 @@
  * run parrot operations until the program is complete
  */
 void
-runops (struct Parrot_Interp *interpreter, opcode_t *code, IV code_size) {
-    opcode_t * (*core)(struct Parrot_Interp *, opcode_t *, IV);
+runops (struct Parrot_Interp *interpreter, struct PackFile * code) {
+    opcode_t * (*core)(struct Parrot_Interp *);
 
     if (interpreter->flags & PARROT_TRACE_FLAG) {
         core = runops_trace_core;
@@ -147,7 +167,9 @@
         core = runops_notrace_core;
     }
 
-    runops_generic(core, interpreter, code, code_size);
+    interpreter->code = code;
+
+    runops_generic(core, interpreter);
 }
 
 /*=for api interpreter make_interpreter
@@ -228,6 +250,9 @@
     Init_IO(interpreter);
     
     /* Done. Return and be done with it */
+
+    interpreter->code = (struct PackFile *)NULL;
+
     return interpreter;   
 }
 
Index: packfile.c
===================================================================
RCS file: /home/perlcvs/parrot/packfile.c,v
retrieving revision 1.4
diff -u -r1.4 packfile.c
--- packfile.c  2001/09/20 21:41:40     1.4
+++ packfile.c  2001/09/25 16:11:16
@@ -53,9 +53,9 @@
 
 ***************************************/
 
-PackFile *
+struct PackFile *
 PackFile_new(void) {
-    PackFile * self = mem_sys_allocate(sizeof(PackFile));
+    struct PackFile * self = mem_sys_allocate(sizeof(struct PackFile));
 
     if (!self) {
         fprintf(stderr, "PackFile_new: Unable to allocate!\n");
@@ -99,7 +99,7 @@
 ***************************************/
 
 void
-PackFile_DELETE(PackFile * self) {
+PackFile_DELETE(struct PackFile * self) {
     if (!self) {
         fprintf(stderr, "PackFile_DELETE: self == NULL!\n");
         return;
@@ -130,7 +130,7 @@
 ***************************************/
 
 void
-PackFile_clear(PackFile * self) {
+PackFile_clear(struct PackFile * self) {
     if (!self) {
         fprintf(stderr, "PackFile_clear: self == NULL!\n");
         return;
@@ -164,7 +164,7 @@
 ***************************************/
 
 IV
-PackFile_get_magic(PackFile * self) {
+PackFile_get_magic(struct PackFile * self) {
     return self->magic;
 }
 
@@ -181,7 +181,7 @@
 ***************************************/
 
 void 
-PackFile_set_magic(PackFile * self, IV magic) {
+PackFile_set_magic(struct PackFile * self, IV magic) {
     self->magic = magic;
 }
 
@@ -197,7 +197,7 @@
 ***************************************/
 
 IV
-PackFile_get_byte_code_size(PackFile * self) {
+PackFile_get_byte_code_size(struct PackFile * self) {
     return self->byte_code_size;
 }
 
@@ -215,7 +215,7 @@
 ***************************************/
 
 char *
-PackFile_get_byte_code(PackFile * self) {
+PackFile_get_byte_code(struct PackFile * self) {
     return self->byte_code;
 }
 
@@ -234,7 +234,7 @@
 ***************************************/
 
 void
-PackFile_set_byte_code(PackFile * self, IV byte_code_size, char * byte_code) {
+PackFile_set_byte_code(struct PackFile * self, IV byte_code_size, char * byte_code) {
     if (self->byte_code) {
         mem_sys_free(self->byte_code);
         self->byte_code = NULL;
@@ -281,7 +281,7 @@
 ***************************************/
 
 IV
-PackFile_unpack(PackFile * self, char * packed, IV packed_size) {
+PackFile_unpack(struct PackFile * self, char * packed, IV packed_size) {
     IV *   segment_ptr;
     IV     segment_size;
     char * byte_code_ptr;
@@ -386,7 +386,7 @@
 ***************************************/
 
 IV
-PackFile_pack_size(PackFile * self) {
+PackFile_pack_size(struct PackFile * self) {
     IV magic_size          = sizeof(IV);
     IV segment_length_size = sizeof(IV);
     IV fixup_table_size    = PackFile_FixupTable_pack_size(self->fixup_table);
@@ -412,7 +412,7 @@
 ***************************************/
 
 void
-PackFile_pack(PackFile * self, char * packed) {
+PackFile_pack(struct PackFile * self, char * packed) {
     char * cursor              = packed;
     IV *   iv_ptr;
     IV     fixup_table_size    = PackFile_FixupTable_pack_size(self->fixup_table);
@@ -455,7 +455,7 @@
 ***************************************/
 
 void
-PackFile_dump(PackFile * self) {
+PackFile_dump(struct PackFile * self) {
     IV i;
 
     printf("MAGIC => 0x%08x,\n", self->magic);
@@ -511,9 +511,9 @@
 
 ***************************************/
 
-PackFile_FixupTable *
+struct PackFile_FixupTable *
 PackFile_FixupTable_new(void) {
-    PackFile_FixupTable * self = mem_sys_allocate(sizeof(PackFile_FixupTable));
+    struct PackFile_FixupTable * self = mem_sys_allocate(sizeof(struct 
+PackFile_FixupTable));
 
     self->dummy = 0;
 
@@ -532,7 +532,7 @@
 ***************************************/
 
 void
-PackFile_FixupTable_DELETE(PackFile_FixupTable * self) {
+PackFile_FixupTable_DELETE(struct PackFile_FixupTable * self) {
     if (!self) {
         fprintf(stderr, "PackFile_FixupTable_DELETE: self == NULL!\n");
         return;
@@ -555,7 +555,7 @@
 ***************************************/
 
 void
-PackFile_FixupTable_clear(PackFile_FixupTable * self) {
+PackFile_FixupTable_clear(struct PackFile_FixupTable * self) {
     if (!self) {
         fprintf(stderr, "PackFile_FixupTable_clear: self == NULL!\n");
         return;
@@ -580,7 +580,7 @@
 ***************************************/
 
 IV
-PackFile_FixupTable_unpack(PackFile_FixupTable * self, char * packed, IV packed_size) 
{
+PackFile_FixupTable_unpack(struct PackFile_FixupTable * self, char * packed, IV 
+packed_size) {
     return 1;
 }
 
@@ -597,7 +597,7 @@
 ***************************************/
 
 IV
-PackFile_FixupTable_pack_size(PackFile_FixupTable * self) {
+PackFile_FixupTable_pack_size(struct PackFile_FixupTable * self) {
     return 0;
 }
 
@@ -615,7 +615,7 @@
 ***************************************/
 
 void
-PackFile_FixupTable_pack(PackFile_FixupTable * self, char * packed) {
+PackFile_FixupTable_pack(struct PackFile_FixupTable * self, char * packed) {
     return;
 }
 
@@ -631,7 +631,7 @@
 ***************************************/
 
 void
-PackFile_FixupTable_dump(PackFile_FixupTable * self) {
+PackFile_FixupTable_dump(struct PackFile_FixupTable * self) {
     return;
 }
 
@@ -667,9 +667,9 @@
 
 ***************************************/
 
-PackFile_ConstTable *
+struct PackFile_ConstTable *
 PackFile_ConstTable_new(void) {
-    PackFile_ConstTable * self = mem_sys_allocate(sizeof(PackFile_ConstTable));
+    struct PackFile_ConstTable * self = mem_sys_allocate(sizeof(struct 
+PackFile_ConstTable));
 
     self->const_count = 0;
     self->constants   = NULL;
@@ -689,7 +689,7 @@
 ***************************************/
 
 void
-PackFile_ConstTable_DELETE(PackFile_ConstTable * self) {
+PackFile_ConstTable_DELETE(struct PackFile_ConstTable * self) {
     if (!self) {
         fprintf(stderr, "PackFile_ConstTable_DELETE: self == NULL!\n");
         return;
@@ -714,7 +714,7 @@
 ***************************************/
 
 void
-PackFile_ConstTable_clear(PackFile_ConstTable * self) {
+PackFile_ConstTable_clear(struct PackFile_ConstTable * self) {
     IV i;
 
     if (!self) {
@@ -747,7 +747,7 @@
 ***************************************/
 
 IV
-PackFile_ConstTable_get_const_count(PackFile_ConstTable * self) {
+PackFile_ConstTable_get_const_count(struct PackFile_ConstTable * self) {
     return self->const_count;
 }
 
@@ -764,15 +764,15 @@
 ***************************************/
 
 void
-PackFile_ConstTable_push_constant(PackFile_ConstTable * self, PackFile_Constant * 
constant) {
-    PackFile_Constant ** temp;
+PackFile_ConstTable_push_constant(struct PackFile_ConstTable * self, struct 
+PackFile_Constant * constant) {
+    struct PackFile_Constant ** temp;
     IV                   i;
 
     if (!constant) {
         return;
     }
 
-    temp = mem_sys_allocate((self->const_count + 1) * sizeof(PackFile_Constant *));
+    temp = mem_sys_allocate((self->const_count + 1) * sizeof(struct PackFile_Constant 
+*));
 
     if (!temp) {
         fprintf(stderr, "Unable to reallocate Constant array to push a new 
Constant!\n");
@@ -799,8 +799,8 @@
 
 ***************************************/
 
-PackFile_Constant *
-PackFile_ConstTable_constant(PackFile_ConstTable * self, IV index) {
+struct PackFile_Constant *
+PackFile_ConstTable_constant(struct PackFile_ConstTable * self, IV index) {
     if (index < 0 || index >= self->const_count) {
         return NULL;
     }
@@ -825,7 +825,7 @@
 ***************************************/
 
 IV
-PackFile_ConstTable_unpack(PackFile_ConstTable * self, char * packed, IV packed_size) 
{
+PackFile_ConstTable_unpack(struct PackFile_ConstTable * self, char * packed, IV 
+packed_size) {
     char * cursor;
     IV *   iv_ptr;
     IV     i;
@@ -842,7 +842,7 @@
         return 1;
     }
 
-    self->constants = mem_sys_allocate(self->const_count * sizeof(PackFile_Constant 
*));
+    self->constants = mem_sys_allocate(self->const_count * sizeof(struct 
+PackFile_Constant *));
 
     if (!self->constants) {
         fprintf(stderr, "PackFile_ConstTable_unpack: Could not allocate memory for 
array!\n");
@@ -874,7 +874,7 @@
 ***************************************/
 
 IV
-PackFile_ConstTable_pack_size(PackFile_ConstTable * self) {
+PackFile_ConstTable_pack_size(struct PackFile_ConstTable * self) {
     IV i;
     IV size = 0;
 
@@ -899,7 +899,7 @@
 ***************************************/
 
 void
-PackFile_ConstTable_pack(PackFile_ConstTable * self, char * packed) {
+PackFile_ConstTable_pack(struct PackFile_ConstTable * self, char * packed) {
     char * cursor;
     IV *   iv_ptr;
     IV     i;
@@ -931,7 +931,7 @@
 ***************************************/
 
 void
-PackFile_ConstTable_dump(PackFile_ConstTable * self) {
+PackFile_ConstTable_dump(struct PackFile_ConstTable * self) {
     IV     i;
 
     for(i = 0; i < self->const_count; i++) {
@@ -974,15 +974,12 @@
 
 ***************************************/
 
-PackFile_Constant *
+struct PackFile_Constant *
 PackFile_Constant_new(void) {
-    PackFile_Constant * self = mem_sys_allocate(sizeof(PackFile_Constant));
+    struct PackFile_Constant * self = mem_sys_allocate(sizeof(struct 
+PackFile_Constant));
 
-    self->flags    = 0;
-    self->encoding = 0;
-    self->type     = 0;
-    self->size     = 0;
-    self->data     = NULL;
+    self->type       = '\0';
+    self->string     = NULL;
 
     return self;
 }
@@ -999,7 +996,7 @@
 ***************************************/
 
 void
-PackFile_Constant_DELETE(PackFile_Constant * self) {
+PackFile_Constant_DELETE(struct PackFile_Constant * self) {
     if (!self) {
         fprintf(stderr, "PackFile_Constant_DELETE: self == NULL!\n");
         return;
@@ -1024,20 +1021,17 @@
 ***************************************/
 
 void
-PackFile_Constant_clear(PackFile_Constant * self) {
+PackFile_Constant_clear(struct PackFile_Constant * self) {
     if (!self) {
         fprintf(stderr, "PackFile_Constant_clear: self == NULL!\n");
         return;
     }
 
-    self->flags    = 0;
-    self->encoding = 0;
-    self->type     = 0;
-    self->size     = 0;
-
-    if (self->data) {
-        mem_sys_free(self->data);
-        self->data = NULL;
+    self->type     = '\0';
+
+    if (self->string) {
+        string_destroy(self->string);
+        self->string = NULL;
     }
 
     return;
@@ -1055,8 +1049,12 @@
 ***************************************/
 
 IV
-PackFile_Constant_get_flags(PackFile_Constant * self) {
-    return self->flags;
+PackFile_Constant_get_flags(struct PackFile_Constant * self) {
+    if (!self || !self->string) {
+        return 0;
+    }
+
+    return self->string->flags;
 }
 
 
@@ -1071,8 +1069,12 @@
 ***************************************/
 
 void
-PackFile_Constant_set_flags(PackFile_Constant * self, IV flags) {
-    self->flags = flags;
+PackFile_Constant_set_flags(struct PackFile_Constant * self, IV flags) {
+    if (!self || !self->string) {
+        return;
+    }
+
+    self->string->flags = flags;
 }
 
 
@@ -1087,8 +1089,12 @@
 ***************************************/
 
 IV
-PackFile_Constant_get_encoding(PackFile_Constant * self) {
-    return self->encoding;
+PackFile_Constant_get_encoding(struct PackFile_Constant * self) {
+    if (!self || !self->string) {
+        return;
+    }
+
+    return self->string->encoding->which;
 }
 
 /***************************************
@@ -1102,8 +1108,12 @@
 ***************************************/
 
 void
-PackFile_Constant_set_encoding(PackFile_Constant * self, IV encoding) {
-    self->encoding = encoding;
+PackFile_Constant_set_encoding(struct PackFile_Constant * self, IV encoding) {
+    if (!self || !self->string) {
+        return;
+    }
+
+    self->string->encoding = &Parrot_string_vtable[encoding];
 }
 
 
@@ -1118,7 +1128,11 @@
 ***************************************/
 
 IV
-PackFile_Constant_get_type(PackFile_Constant * self) {
+PackFile_Constant_get_type(struct PackFile_Constant * self) {
+    if (!self || !self->string) {
+        return;
+    }
+
     return self->type;
 }
 
@@ -1134,7 +1148,11 @@
 ***************************************/
 
 void
-PackFile_Constant_set_type(PackFile_Constant * self, IV type) {
+PackFile_Constant_set_type(struct PackFile_Constant * self, IV type) {
+    if (!self || !self->string) {
+        return;
+    }
+
     self->type = type;
 }
 
@@ -1151,8 +1169,12 @@
 ***************************************/
 
 IV
-PackFile_Constant_get_size(PackFile_Constant * self) {
-    return self->size;
+PackFile_Constant_get_size(struct PackFile_Constant * self) {
+    if (!self || !self->string) {
+        return;
+    }
+
+    return self->string->bufused;
 }
 
 
@@ -1160,15 +1182,19 @@
 
 =item get_data
 
-Retrieve the Constant's data.
+Retrieve the Constant's data. The data belongs to the PackFile Constant.
 
 =cut
 
 ***************************************/
 
 char *
-PackFile_Constant_get_data(PackFile_Constant * self) {
-    return self->data;
+PackFile_Constant_get_data(struct PackFile_Constant * self) {
+    if (!self || !self->string) {
+        return;
+    }
+
+    return self->string->bufstart;
 }
 
 
@@ -1176,31 +1202,35 @@
 
 =item set_data
 
-Set the Constant's data.
+Set the Constant's data. A copy is made.
 
 =cut
 
 ***************************************/
 
 void
-PackFile_Constant_set_data(PackFile_Constant * self, IV size, char * data) {
-    if (self->data) {
-        mem_sys_free(self->data);
-        self->data = NULL;
-        self->size = 0;
-    }
+PackFile_Constant_set_data(struct PackFile_Constant * self, IV size, char * data) {
+    IV       flags;
+    IV       encoding;
+    IV       type;
+    STRING * new_string;
 
-    self->data = mem_sys_allocate(size);
-
-    if (!self->data) {
-        fprintf(stderr, "Unable to allocate memory to copy PackFile Constant 
data!\n");
+    if (!self) {
         return;
     }
 
-    self->size = size;
+    flags = self->string->flags;
+    flags = self->string->encoding->which;
+    flags = self->string->type;
 
-    mem_sys_memcopy(self->data, data, size);
+    new_string = string_make(data, size, encoding, flags, type);
+
+    if (self->string) {
+        string_destroy(self->string);
+    }
 
+    self->string = new_string;
+
     return;
 }
 
@@ -1227,38 +1257,34 @@
 ***************************************/
 
 IV
-PackFile_Constant_unpack(PackFile_Constant * self, char * packed, IV packed_size) {
+PackFile_Constant_unpack(struct PackFile_Constant * self, char * packed, IV 
+packed_size) {
     char * cursor;
-    IV *   iv_ptr;
-    IV    i;
+    IV     flags;
+    IV     encoding;
+    IV     type;
+    IV     size;
 
-    cursor  = packed;
+    if (!self) {
+        return 0;
+    }
 
-    iv_ptr          = (IV *)cursor;
-    self->flags     = *iv_ptr;
-    cursor         += sizeof(IV);
-
-    iv_ptr          = (IV *)cursor;
-    self->encoding  = *iv_ptr;
-    cursor         += sizeof(IV);
-
-    iv_ptr          = (IV *)cursor;
-    self->type      = *iv_ptr;
-    cursor         += sizeof(IV);
-
-    iv_ptr          = (IV *)cursor;
-    self->size      = *iv_ptr;
-    cursor         += sizeof(IV);
+    cursor    = packed;
 
-    self->data = mem_sys_allocate(self->size);
+    flags     = *(IV *)cursor;
+    cursor   += sizeof(IV);
 
-    if (!self->data) {
-        fprintf(stderr, "PackFile_Constant_unpack: Unable to allocate memory!\n");
-        return 0;
-    }
+    encoding  = *(IV *)cursor;
+    cursor   += sizeof(IV);
+
+    type      = *(IV *)cursor;
+    cursor   += sizeof(IV);
 
-    mem_sys_memcopy(self->data, cursor, self->size);
+    size      = *(IV *)cursor;
+    cursor   += sizeof(IV);
 
+    self->type   = 'S';
+    self->string = string_make(cursor, size, encoding, flags, type);
+
     return 1;
 }
 
@@ -1275,10 +1301,14 @@
 ***************************************/
 
 IV
-PackFile_Constant_pack_size(PackFile_Constant * self) {
+PackFile_Constant_pack_size(struct PackFile_Constant * self) {
     IV padded_size;
+
+    if (!self) {
+        return 0;
+    }
 
-    padded_size = self->size;
+    padded_size = self->string->bufused;
 
     if (padded_size % sizeof(IV)) {
         padded_size += sizeof(IV) - (padded_size % sizeof(IV));
@@ -1296,42 +1326,46 @@
 block had better have at least the amount of memory indicated by
 PackFile_Constant_pack_size()!
 
-The data is zero-badded to an IV-boundary, so pad bytes may be added.
+The data is zero-padded to an IV-boundary, so pad bytes may be added.
 
 =cut
 
 ***************************************/
 
 void
-PackFile_Constant_pack(PackFile_Constant * self, char * packed) {
+PackFile_Constant_pack(struct PackFile_Constant * self, char * packed) {
     char * cursor;
     IV *   iv_ptr;
     IV     i;
 
+    if (!self) {
+        return;
+    }
+
     cursor  = packed;
 
     iv_ptr  = (IV *)cursor;
-    *iv_ptr = self->flags;
+    *iv_ptr = self->string->flags;
     cursor += sizeof(IV);
 
     iv_ptr  = (IV *)cursor;
-    *iv_ptr = self->encoding;
+    *iv_ptr = self->string->encoding->which;
     cursor += sizeof(IV);
 
     iv_ptr  = (IV *)cursor;
-    *iv_ptr = self->type;
+    *iv_ptr = self->string->type;
     cursor += sizeof(IV);
 
     iv_ptr  = (IV *)cursor;
-    *iv_ptr = self->size;
+    *iv_ptr = self->string->bufused;
     cursor += sizeof(IV);
 
-    if (self->data) {
-        mem_sys_memcopy(cursor, self->data, self->size);
-        cursor += self->size;
+    if (self->string->bufstart) {
+        mem_sys_memcopy(cursor, self->string->bufstart, self->string->bufused);
+        cursor += self->string->bufused;
 
-        if (self->size % sizeof(IV)) {
-            for(i = 0; i < (sizeof(IV) - (self->size % sizeof(IV))); i++) {
+        if (self->string->bufused % sizeof(IV)) {
+            for(i = 0; i < (sizeof(IV) - (self->string->bufused % sizeof(IV))); i++) {
                 cursor[i] = 0;
             }
         }
@@ -1352,14 +1386,17 @@
 ***************************************/
 
 void
-PackFile_Constant_dump(PackFile_Constant * self) {
+PackFile_Constant_dump(struct PackFile_Constant * self) {
+    if (!self) {
+        return;
+    }
 
     printf("    {\n");
-    printf("        FLAGS    => %04x,\n", self->flags);
-    printf("        ENCODING => %ld,\n",  self->encoding);
-    printf("        TYPE     => %ld,\n",  self->type);
-    printf("        SIZE     => %ld,\n",  self->size);
-    printf("        DATA     => '%s'\n",  self->data); /* TODO: Not a good idea in 
general */
+    printf("        FLAGS    => %04x,\n", self->string->flags);
+    printf("        ENCODING => %ld,\n",  self->string->encoding);
+    printf("        TYPE     => %ld,\n",  self->string->type);
+    printf("        SIZE     => %ld,\n",  self->string->bufused);
+    printf("        DATA     => '%s'\n",  self->string->bufstart); /* TODO: Not a 
+good idea in general */
     printf("    },\n");
 
     return;
Index: pdump.c
===================================================================
RCS file: /home/perlcvs/parrot/pdump.c,v
retrieving revision 1.1
diff -u -r1.1 pdump.c
--- pdump.c     2001/09/19 16:48:28     1.1
+++ pdump.c     2001/09/25 16:11:16
@@ -14,11 +14,11 @@
 
 int
 main(int argc, char **argv) {
-    struct stat file_stat;
-    int         fd;
-    char *      packed;
-    long        packed_size;
-    PackFile * pf;
+    struct stat       file_stat;
+    int               fd;
+    char *            packed;
+    long              packed_size;
+    struct PackFile * pf;
 
     if (argc != 2) {
         fprintf(stderr, "pdump: usage: pdump FILE\n");
Index: test_main.c
===================================================================
RCS file: /home/perlcvs/parrot/test_main.c,v
retrieving revision 1.12
diff -u -r1.12 test_main.c
--- test_main.c 2001/09/21 04:56:24     1.12
+++ test_main.c 2001/09/25 16:11:16
@@ -12,19 +12,6 @@
 
 #include "parrot/parrot.h"
 
-IV opcodes[] = {3, 1,                /* put the time in reg 1 */
-                0, 2, 0,             /* Set reg 2 to 0 */
-               0, 3, 1,             /* set reg 3 to 1 */
-               0, 4, 100000000,     /* set reg 4 to 100M  */
-                2, 2, 4, 11, 5,      /* is reg 2 eq to reg 4? */
-               1, 2, 2, 3,          /* Add register 2 to 3, store in 2 */
-               5, -9,               /* branch back to if */
-               3, 5,                /* Put the time in reg 5 */
-               4, 1,                /* Print reg 1 */
-               4, 5,                /* Print reg 5 */
-               6                    /* exit */
-                };
-
 int
 main(int argc, char **argv) {
     int i;
@@ -48,9 +35,10 @@
         tracing = 0;
     }
 
-    /* If we got only the program name, run the test program */
+    /* If we got only the program name, complain */
     if (argc == 1) {
-        runops(interpreter, (opcode_t*)opcodes, sizeof(opcodes));
+        fprintf(stderr, "%s: usage: %s prog\n", argv[0], argv[0]);
+        exit(1);
     }
     else if (argc == 2 && !strcmp(argv[1], "-s")) { /* String tests */
         STRING *s = string_make("foo", 3, enc_native, 0, 0);
@@ -79,6 +67,7 @@
         long program_size;
         struct stat file_stat;
         int fd;
+        struct PackFile * pf;
 
         if (stat(argv[1], &file_stat)) {
             printf("can't stat %s, code %i\n", argv[1], errno);
@@ -104,13 +93,14 @@
             return 1;
         }
         
-        program_code = init_bytecode(program_code, &program_size);
+        pf = PackFile_new();
+        PackFile_unpack(pf, (char *)program_code, program_size);
         
         if (tracing) {
             interpreter->flags |= PARROT_TRACE_FLAG;
         }
 
-        runops(interpreter, program_code, program_size);
+        runops(interpreter, pf);
         
     }
     return 0;
Index: include/parrot/interpreter.h
===================================================================
RCS file: /home/perlcvs/parrot/include/parrot/interpreter.h,v
retrieving revision 1.4
diff -u -r1.4 interpreter.h
--- include/parrot/interpreter.h        2001/09/24 17:19:48     1.4
+++ include/parrot/interpreter.h        2001/09/25 16:11:17
@@ -35,17 +35,23 @@
     IV flags;                            /* Various interpreter flags
                                            that signal that runops
                                            should do something */
+
+    struct PackFile * code;                      /* The code we are executing */
+
 };
 
 #define PARROT_DEBUG_FLAG 0x01         /* Bit in the flags that says
                                            we're debugging */
 #define PARROT_TRACE_FLAG 0x02         /* We're tracing execution */
 
+#define PCONST(i) PF_CONST(interpreter->code, (i))
+#define PNCONST   PF_NCONST(interpreter->code)
+
 struct Parrot_Interp *
 make_interpreter();
 
 void
-runops(struct Parrot_Interp *, opcode_t *, IV);
+runops(struct Parrot_Interp *, struct PackFile *);
 
 #endif
 
Index: include/parrot/packfile.h
===================================================================
RCS file: /home/perlcvs/parrot/include/parrot/packfile.h,v
retrieving revision 1.2
diff -u -r1.2 packfile.h
--- include/parrot/packfile.h   2001/09/19 19:37:21     1.2
+++ include/parrot/packfile.h   2001/09/25 16:11:17
@@ -3,193 +3,199 @@
 * $Id: packfile.h,v 1.2 2001/09/19 19:37:21 gregor Exp $
 */
 
+#ifndef PACKFILE_H
+#define PACKFILE_H
+
 #include <parrot/parrot.h>
 
+#define PF_NCONST(pf)  (pf)->const_table->const_count
+#define PF_CONST(pf,i) (pf)->const_table->constants[i]
+
 
 /*
 ** Structure Definitions:
 */
 
-typedef struct {
+struct PackFile_FixupTable {
     IV                    dummy;
-} PackFile_FixupTable;
+};
+
+
+struct PackFile_Constant {
+    IV       type;
+    STRING * string;
+};
 
 
-typedef struct {
-    IV     flags;
-    IV     encoding;
-    IV     type;
-    IV     size;
-    char * data;
-} PackFile_Constant;
-
-
-typedef struct {
-    IV                    const_count;
-    PackFile_Constant **  constants;
-} PackFile_ConstTable;
-
-
-typedef struct {
-    IV                    magic;
-    PackFile_FixupTable * fixup_table;
-    PackFile_ConstTable * const_table;
-    IV                    byte_code_size;
-    char *                byte_code;
-} PackFile;
+struct PackFile_ConstTable {
+    IV                           const_count;
+    struct PackFile_Constant **  constants;
+};
 
 
+struct PackFile {
+    IV                           magic;
+    struct PackFile_FixupTable * fixup_table;
+    struct PackFile_ConstTable * const_table;
+    IV                           byte_code_size;
+    char *                       byte_code;
+};
+
+
 /*
 ** PackFile Functions:
 */
 
-PackFile *
+struct PackFile *
 PackFile_new(void);
 
 void
-PackFile_DELETE(PackFile * self);
+PackFile_DELETE(struct PackFile * self);
 
 void
-PackFile_clear(PackFile * self);
+PackFile_clear(struct PackFile * self);
 
 IV
-PackFile_get_magic(PackFile * self);
+PackFile_get_magic(struct PackFile * self);
 
 void 
-PackFile_set_magic(PackFile * self, IV magic);
+PackFile_set_magic(struct PackFile * self, IV magic);
 
 IV
-PackFile_get_byte_code_size(PackFile * self);
+PackFile_get_byte_code_size(struct PackFile * self);
 
 char *
-PackFile_get_byte_code(PackFile * self);
+PackFile_get_byte_code(struct PackFile * self);
 
 void
-PackFile_set_byte_code(PackFile * self, IV byte_code_size, char * byte_code);
+PackFile_set_byte_code(struct PackFile * self, IV byte_code_size, char * byte_code);
 
 IV
-PackFile_unpack(PackFile * self, char * packed, IV packed_size);
+PackFile_unpack(struct PackFile * self, char * packed, IV packed_size);
 
 IV
-PackFile_pack_size(PackFile * self);
+PackFile_pack_size(struct PackFile * self);
 
 void
-PackFile_pack(PackFile * self, char * packed);
+PackFile_pack(struct PackFile * self, char * packed);
 
 void
-PackFile_dump(PackFile * self);
+PackFile_dump(struct PackFile * self);
 
 
 /*
 ** PackFile_FixupTable Functions:
 */
 
-PackFile_FixupTable *
+struct PackFile_FixupTable *
 PackFile_FixupTable_new(void);
 
 void
-PackFile_FixupTable_DELETE(PackFile_FixupTable * self);
+PackFile_FixupTable_DELETE(struct PackFile_FixupTable * self);
 
 void
-PackFile_FixupTable_clear(PackFile_FixupTable * self);
+PackFile_FixupTable_clear(struct PackFile_FixupTable * self);
 
 IV
-PackFile_FixupTable_unpack(PackFile_FixupTable * self, char * packed, IV packed_size);
+PackFile_FixupTable_unpack(struct PackFile_FixupTable * self, char * packed, IV 
+packed_size);
 
 IV
-PackFile_FixupTable_pack_size(PackFile_FixupTable * self);
+PackFile_FixupTable_pack_size(struct PackFile_FixupTable * self);
 
 void
-PackFile_FixupTable_pack(PackFile_FixupTable * self, char * packed);
+PackFile_FixupTable_pack(struct PackFile_FixupTable * self, char * packed);
 
 void
-PackFile_FixupTable_dump(PackFile_FixupTable * self);
+PackFile_FixupTable_dump(struct PackFile_FixupTable * self);
 
 
 /*
 ** PackFile_ConstTable Functions:
 */
 
-PackFile_ConstTable *
+struct PackFile_ConstTable *
 PackFile_ConstTable_new(void);
 
 void
-PackFile_ConstTable_DELETE(PackFile_ConstTable * self);
+PackFile_ConstTable_DELETE(struct PackFile_ConstTable * self);
 
 void
-PackFile_ConstTable_clear(PackFile_ConstTable * self);
+PackFile_ConstTable_clear(struct PackFile_ConstTable * self);
 
 IV
-PackFile_ConstTable_get_const_count(PackFile_ConstTable * self);
+PackFile_ConstTable_get_const_count(struct PackFile_ConstTable * self);
 
 void
-PackFile_ConstTable_push_constant(PackFile_ConstTable * self, PackFile_Constant * 
constant);
+PackFile_ConstTable_push_constant(struct PackFile_ConstTable * self, struct 
+PackFile_Constant * constant);
 
-PackFile_Constant *
-PackFile_ConstTable_constant(PackFile_ConstTable * self, IV index);
+struct PackFile_Constant *
+PackFile_ConstTable_constant(struct PackFile_ConstTable * self, IV index);
 
 IV
-PackFile_ConstTable_unpack(PackFile_ConstTable * self, char * packed, IV packed_size);
+PackFile_ConstTable_unpack(struct PackFile_ConstTable * self, char * packed, IV 
+packed_size);
 
 IV
-PackFile_ConstTable_pack_size(PackFile_ConstTable * self);
+PackFile_ConstTable_pack_size(struct PackFile_ConstTable * self);
 
 void
-PackFile_ConstTable_pack(PackFile_ConstTable * self, char * packed);
+PackFile_ConstTable_pack(struct PackFile_ConstTable * self, char * packed);
 
 void
-PackFile_ConstTable_dump(PackFile_ConstTable * self);
+PackFile_ConstTable_dump(struct PackFile_ConstTable * self);
 
 
 /*
 ** PackFile_Constant Functions:
 */
 
-PackFile_Constant *
+struct PackFile_Constant *
 PackFile_Constant_new(void);
 
 void
-PackFile_Constant_DELETE(PackFile_Constant * self);
+PackFile_Constant_DELETE(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_clear(PackFile_Constant * self);
+PackFile_Constant_clear(struct PackFile_Constant * self);
 
 IV
-PackFile_Constant_get_flags(PackFile_Constant * self);
+PackFile_Constant_get_flags(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_set_flags(PackFile_Constant * self, IV flags);
+PackFile_Constant_set_flags(struct PackFile_Constant * self, IV flags);
 
 IV
-PackFile_Constant_get_encoding(PackFile_Constant * self);
+PackFile_Constant_get_encoding(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_set_encoding(PackFile_Constant * self, IV encoding);
+PackFile_Constant_set_encoding(struct PackFile_Constant * self, IV encoding);
 
 IV
-PackFile_Constant_get_type(PackFile_Constant * self);
+PackFile_Constant_get_type(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_set_type(PackFile_Constant * self, IV type);
+PackFile_Constant_set_type(struct PackFile_Constant * self, IV type);
 
 IV
-PackFile_Constant_get_size(PackFile_Constant * self);
+PackFile_Constant_get_size(struct PackFile_Constant * self);
 
 char *
-PackFile_Constant_get_data(PackFile_Constant * self);
+PackFile_Constant_get_data(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_set_data(PackFile_Constant * self, IV size, char * data);
+PackFile_Constant_set_data(struct PackFile_Constant * self, IV size, char * data);
 
 IV
-PackFile_Constant_unpack(PackFile_Constant * self, char * packed, IV packed_size);
+PackFile_Constant_unpack(struct PackFile_Constant * self, char * packed, IV 
+packed_size);
 
 IV
-PackFile_Constant_pack_size(PackFile_Constant * self);
+PackFile_Constant_pack_size(struct PackFile_Constant * self);
 
 void
-PackFile_Constant_pack(PackFile_Constant * self, char * packed);
+PackFile_Constant_pack(struct PackFile_Constant * self, char * packed);
 
 void
-PackFile_Constant_dump(PackFile_Constant * self);
+PackFile_Constant_dump(struct PackFile_Constant * self);
+
+
+#endif /* PACKFILE_H */
 
Index: include/parrot/parrot.h
===================================================================
RCS file: /home/perlcvs/parrot/include/parrot/parrot.h,v
retrieving revision 1.1
diff -u -r1.1 parrot.h
--- include/parrot/parrot.h     2001/09/18 01:16:59     1.1
+++ include/parrot/parrot.h     2001/09/25 16:11:17
@@ -69,7 +69,7 @@
 #include "parrot/register.h"
 #include "parrot/exceptions.h"
 #include "parrot/memory.h"
-#include "parrot/bytecode.h"
+#include "parrot/packfile.h"
 #include "parrot/io.h"
 #include "parrot/op.h"
 #include "parrot/events.h"
Index: t/op/bitwise.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/bitwise.t,v
retrieving revision 1.1
diff -u -r1.1 bitwise.t
--- t/op/bitwise.t      2001/09/25 09:12:57     1.1
+++ t/op/bitwise.t      2001/09/25 16:11:17
@@ -49,6 +49,7 @@
        print   "\n"
        print   I0
        print   "\n"
+       end
 CODE
 4
 4
@@ -70,6 +71,7 @@
        print   "\n"
        print   I0
        print   "\n"
+       end
 CODE
 51
 51
Index: t/op/integer.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/integer.t,v
retrieving revision 1.6
diff -u -r1.6 integer.t
--- t/op/integer.t      2001/09/25 09:12:57     1.6
+++ t/op/integer.t      2001/09/25 16:11:17
@@ -104,6 +104,7 @@
        print   "\\n"
         end
        set     I0, 0
+       end
 CODE
 0
 1
Index: t/op/stacks.t
===================================================================
RCS file: /home/perlcvs/parrot/t/op/stacks.t,v
retrieving revision 1.1
diff -u -r1.1 stacks.t
--- t/op/stacks.t       2001/09/24 17:21:33     1.1
+++ t/op/stacks.t       2001/09/25 16:11:17
@@ -44,6 +44,7 @@
 @{[ print_int_regs() ]}
        pop_i
 @{[ print_int_regs() ]}
+       end
 CODE
 01234
 56789

Reply via email to