# New Ticket Created by  Mattia Barbon 
# Please include the string:  [perl #24817]
# in the subject line of all future correspondence about this issue. 
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=24817 >


  Hello,
this patch

* renames Parrot_INTERP and Parrot_STRING to Parrot_Interp and Parrot_String,
  which matches the rest of Parrot types, as well as the embedding interface
* Adds Parrot_PMC_get/set_vtable
* makes the extending interface compilable with a C++ compiler
  (removed typedef struct Parrot_Interp* Parrot_Interp)
  (note: only *compiles*, it probably does not link yet)
* changes typedefs in extend.h from
  typedef void* <type> 
  to
  typedef struct type_* type
  which allows for slightly better type safety

Regards
Mattia

Index: include/parrot/dynext.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/dynext.h,v
retrieving revision 1.4
diff -u -2 -r1.4 dynext.h
--- include/parrot/dynext.h     30 Sep 2003 09:29:41 -0000      1.4
+++ include/parrot/dynext.h     5 Jan 2004 20:52:34 -0000
@@ -11,5 +11,5 @@
 
 /* dynamic lib/oplib/PMC loading */
-PMC *Parrot_load_lib(Interp *interpreter, STRING *lib, PMC *initializer);
+Parrot_PMC Parrot_load_lib(Parrot_Interp interpreter, Parrot_String lib, Parrot_PMC 
initializer);
 
 #endif
Index: include/parrot/extend.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/extend.h,v
retrieving revision 1.12
diff -u -2 -r1.12 extend.h
--- include/parrot/extend.h     31 Dec 2003 11:54:32 -0000      1.12
+++ include/parrot/extend.h     5 Jan 2004 20:52:35 -0000
@@ -16,4 +16,6 @@
 #define PARROT_EXTEND_H_GUARD
 
+#include <stddef.h>             /* size_t */
+
 #include "parrot/config.h"      /* PARROT_VERSION, PARROT_JIT_CAPABLE... */
 #include "parrot/interpreter.h" /* give us the interpreter flags */
@@ -24,67 +26,67 @@
    we'll split this into two pieces and not install the core version,
    but that would be really annoying */
-#if defined(PARROT_IN_CORE)
+#if !defined(PARROT_IN_CORE)
 
-#define Parrot_INTERP struct Parrot_Interp *
-#define Parrot_STRING STRING *
-#define Parrot_PMC PMC *
-#define Parrot_Language Parrot_Int
-
-#else
-
-typedef void * Parrot_INTERP;
-typedef void * Parrot_STRING;
-typedef void * Parrot_PMC;
+typedef struct Parrot_String_* Parrot_String;
+typedef struct Parrot_PMC_* Parrot_PMC;
 typedef Parrot_Int Parrot_Language;
-typedef void * Parrot_Encoding;
-typedef void * Parrot_CharType;
-typedef const void * Parrot_Const_Encoding;
-typedef const void * Parrot_Const_CharType;
+typedef struct Parrot_Encoding_* Parrot_Encoding;
+typedef struct Parrot_Chartype_* Parrot_CharType;
+typedef const struct Parrot_Encoding_* Parrot_Const_Encoding;
+typedef const struct Parrot_Chartype_* Parrot_Const_CharType;
+typedef struct _vtable* Parrot_Vtable;
+/* XXX for vtables */
+typedef void BIGNUM;
+typedef void visit_info;
 
 #endif
 
-Parrot_STRING Parrot_PMC_get_string(Parrot_INTERP, Parrot_PMC);
-void *Parrot_PMC_get_pointer(Parrot_INTERP, Parrot_PMC);
-Parrot_Int Parrot_PMC_get_intval(Parrot_INTERP, Parrot_PMC);
-Parrot_Int Parrot_PMC_get_intval_intkey(Parrot_INTERP, Parrot_PMC, Parrot_Int);
-Parrot_Float Parrot_PMC_get_numval(Parrot_INTERP, Parrot_PMC);
-char *Parrot_PMC_get_cstring(Parrot_INTERP, Parrot_PMC);
-char *Parrot_PMC_get_cstringn(Parrot_INTERP, Parrot_PMC, Parrot_Int *);
-
-void Parrot_PMC_set_string(Parrot_INTERP, Parrot_PMC, Parrot_STRING);
-void Parrot_PMC_set_pointer(Parrot_INTERP, Parrot_PMC, void *);
-void Parrot_PMC_set_cstring(Parrot_INTERP, Parrot_PMC, const char *);
-void Parrot_PMC_set_cstringn(Parrot_INTERP, Parrot_PMC, const char *, Parrot_Int);
-void Parrot_PMC_set_intval(Parrot_INTERP, Parrot_PMC, Parrot_Int);
-void Parrot_PMC_set_intval_intkey(Parrot_INTERP, Parrot_PMC, Parrot_Int, Parrot_Int);
-void Parrot_PMC_set_numval(Parrot_INTERP, Parrot_PMC, Parrot_Float);
+#include "parrot/vtable.h"      /* Parrot_Vtable */
+
+Parrot_String Parrot_PMC_get_string(Parrot_Interp, Parrot_PMC);
+void *Parrot_PMC_get_pointer(Parrot_Interp, Parrot_PMC);
+Parrot_Int Parrot_PMC_get_intval(Parrot_Interp, Parrot_PMC);
+Parrot_Int Parrot_PMC_get_intval_intkey(Parrot_Interp, Parrot_PMC, Parrot_Int);
+Parrot_Float Parrot_PMC_get_numval(Parrot_Interp, Parrot_PMC);
+char *Parrot_PMC_get_cstring(Parrot_Interp, Parrot_PMC);
+char *Parrot_PMC_get_cstringn(Parrot_Interp, Parrot_PMC, Parrot_Int *);
+Parrot_Vtable Parrot_PMC_get_vtable(Parrot_Interp, Parrot_PMC);
+
+void Parrot_PMC_set_string(Parrot_Interp, Parrot_PMC, Parrot_String);
+void Parrot_PMC_set_pointer(Parrot_Interp, Parrot_PMC, void *);
+void Parrot_PMC_set_cstring(Parrot_Interp, Parrot_PMC, const char *);
+void Parrot_PMC_set_cstringn(Parrot_Interp, Parrot_PMC, const char *, Parrot_Int);
+void Parrot_PMC_set_intval(Parrot_Interp, Parrot_PMC, Parrot_Int);
+void Parrot_PMC_set_intval_intkey(Parrot_Interp, Parrot_PMC, Parrot_Int, Parrot_Int);
+void Parrot_PMC_set_numval(Parrot_Interp, Parrot_PMC, Parrot_Float);
+void Parrot_PMC_set_vtable(Parrot_Interp, Parrot_PMC, Parrot_Vtable);
 
-Parrot_PMC Parrot_PMC_new(Parrot_INTERP, Parrot_Int);
+Parrot_PMC Parrot_PMC_new(Parrot_Interp, Parrot_Int);
 Parrot_PMC Parrot_PMC_null(void);
-Parrot_Int Parrot_PMC_typenum(Parrot_INTERP, const char *);
+Parrot_Int Parrot_PMC_typenum(Parrot_Interp, const char *);
 
 void Parrot_free_cstring(char *);
 
-void Parrot_call(Parrot_INTERP, Parrot_PMC, Parrot_Int, ...);
-void Parrot_call_method(Parrot_INTERP, Parrot_PMC, Parrot_STRING, Parrot_Int, ...);
+void Parrot_call(Parrot_Interp, Parrot_PMC, Parrot_Int, ...);
+void Parrot_call_method(Parrot_Interp, Parrot_PMC, Parrot_String, Parrot_Int, ...);
 
-Parrot_Int    Parrot_get_intreg(Parrot_INTERP, Parrot_Int);
-Parrot_Float  Parrot_get_numreg(Parrot_INTERP, Parrot_Int);
-Parrot_STRING Parrot_get_strreg(Parrot_INTERP, Parrot_Int);
-Parrot_PMC    Parrot_get_pmcreg(Parrot_INTERP, Parrot_Int);
-
-void Parrot_set_intreg(Parrot_INTERP, Parrot_Int, Parrot_Int);
-void Parrot_set_numreg(Parrot_INTERP, Parrot_Int, Parrot_Float);
-void Parrot_set_strreg(Parrot_INTERP, Parrot_Int, Parrot_STRING);
-void Parrot_set_pmcreg(Parrot_INTERP, Parrot_Int, Parrot_PMC);
-
-Parrot_STRING Parrot_new_string(Parrot_INTERP, char *, int, Parrot_Encoding, 
Parrot_CharType, Parrot_Language, Parrot_Int);
-
-Parrot_Const_CharType Parrot_find_chartype(Parrot_INTERP, char*);
-Parrot_Language Parrot_find_language(Parrot_INTERP, char*);
-Parrot_Const_Encoding Parrot_find_encoding(Parrot_INTERP, char*);
+Parrot_Int    Parrot_get_intreg(Parrot_Interp, Parrot_Int);
+Parrot_Float  Parrot_get_numreg(Parrot_Interp, Parrot_Int);
+Parrot_String Parrot_get_strreg(Parrot_Interp, Parrot_Int);
+Parrot_PMC    Parrot_get_pmcreg(Parrot_Interp, Parrot_Int);
+
+void Parrot_set_intreg(Parrot_Interp, Parrot_Int, Parrot_Int);
+void Parrot_set_numreg(Parrot_Interp, Parrot_Int, Parrot_Float);
+void Parrot_set_strreg(Parrot_Interp, Parrot_Int, Parrot_String);
+void Parrot_set_pmcreg(Parrot_Interp, Parrot_Int, Parrot_PMC);
+
+Parrot_String Parrot_new_string(Parrot_Interp, const char *, int, Parrot_Encoding, 
Parrot_CharType, Parrot_Language, Parrot_Int);
+
+Parrot_Const_CharType Parrot_find_chartype(Parrot_Interp, char*);
+Parrot_Language Parrot_find_language(Parrot_Interp, char*);
+Parrot_Const_Encoding Parrot_find_encoding(Parrot_Interp, char*);
 
-void Parrot_register_pmc(Parrot_INTERP, Parrot_PMC);
-void Parrot_unregister_pmc(Parrot_INTERP, Parrot_PMC);
+void Parrot_register_pmc(Parrot_Interp, Parrot_PMC);
+void Parrot_unregister_pmc(Parrot_Interp, Parrot_PMC);
 
 #endif
Index: include/parrot/interpreter.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/interpreter.h,v
retrieving revision 1.114
diff -u -2 -r1.114 interpreter.h
--- include/parrot/interpreter.h        2 Jan 2004 14:09:32 -0000       1.114
+++ include/parrot/interpreter.h        5 Jan 2004 20:52:37 -0000
@@ -55,9 +55,13 @@
 
 /* &end_gen */
-struct Parrot_Interp;
-
-typedef struct Parrot_Interp *Parrot_Interp;
 
 #if defined(PARROT_IN_CORE)
+#define Parrot_String STRING *
+#define Parrot_PMC PMC *
+#define Parrot_Language Parrot_Int
+#define Parrot_Vtable struct _vtable*
+
+struct Parrot_Interp;
+typedef struct Parrot_Interp *Parrot_Interp;
 
 typedef Parrot_Interp_flag Interp_flags;
@@ -353,6 +357,8 @@
                 void *func, const char *name, const char *proto);
 #else
+struct Parrot_Interp_;
+typedef struct Parrot_Interp_ *Parrot_Interp;
 
-typedef void * *(*native_func_t)(struct Parrot_Interp *interpreter,
+typedef void * *(*native_func_t)(Parrot_Interp interpreter,
                                  void *cur_opcode,
                                  void *start_code);
Index: src/extend.c
===================================================================
RCS file: /cvs/public/parrot/src/extend.c,v
retrieving revision 1.16
diff -u -2 -r1.16 extend.c
--- src/extend.c        31 Dec 2003 11:54:41 -0000      1.16
+++ src/extend.c        5 Jan 2004 20:52:42 -0000
@@ -31,5 +31,5 @@
  */
 
-Parrot_STRING Parrot_PMC_get_string(Parrot_INTERP interp, Parrot_PMC pmc) {
+Parrot_String Parrot_PMC_get_string(Parrot_Interp interp, Parrot_PMC pmc) {
   return VTABLE_get_string(interp, pmc);
 }
@@ -41,5 +41,5 @@
  */
 
-void *Parrot_PMC_get_pointer(Parrot_INTERP interp, Parrot_PMC pmc) {
+void *Parrot_PMC_get_pointer(Parrot_Interp interp, Parrot_PMC pmc) {
     return VTABLE_get_pointer(interp, pmc);
 }
@@ -50,5 +50,5 @@
  */
 
-Parrot_Int Parrot_PMC_get_intval(Parrot_INTERP interp, Parrot_PMC pmc) {
+Parrot_Int Parrot_PMC_get_intval(Parrot_Interp interp, Parrot_PMC pmc) {
     return VTABLE_get_integer(interp, pmc);
 }
@@ -59,5 +59,5 @@
  */
 
-Parrot_Int Parrot_PMC_get_intval_intkey(Parrot_INTERP interp, Parrot_PMC pmc, 
Parrot_Int key) {
+Parrot_Int Parrot_PMC_get_intval_intkey(Parrot_Interp interp, Parrot_PMC pmc, 
Parrot_Int key) {
     return VTABLE_get_integer_keyed_int(interp, pmc, key);
 }
@@ -68,5 +68,5 @@
  */
 
-Parrot_Float Parrot_PMC_get_numval(Parrot_INTERP interp, Parrot_PMC pmc) {
+Parrot_Float Parrot_PMC_get_numval(Parrot_Interp interp, Parrot_PMC pmc) {
     return VTABLE_get_number(interp, pmc);
 }
@@ -77,5 +77,5 @@
  * the PMC.
  */
-char *Parrot_PMC_get_cstring(Parrot_INTERP interp, Parrot_PMC pmc) {
+char *Parrot_PMC_get_cstring(Parrot_Interp interp, Parrot_PMC pmc) {
     STRING *retval;
     retval = VTABLE_get_string(interp, pmc);
@@ -91,5 +91,5 @@
  * without disturbing the interface.
  */
-char *Parrot_PMC_get_cstringn(Parrot_INTERP interp, Parrot_PMC pmc, Parrot_Int 
*length) {
+char *Parrot_PMC_get_cstringn(Parrot_Interp interp, Parrot_PMC pmc, Parrot_Int 
*length) {
     char *retval;
     retval = string_to_cstring(interp, VTABLE_get_string(interp, pmc));
@@ -98,9 +98,17 @@
 }
 
+/*=for api extend Parrot_PMC_get_vtable
+ *
+ * Return a pointer to the vtable of the passed-in PMC
+ */
+Parrot_Vtable Parrot_PMC_get_vtable(Parrot_Interp interp, Parrot_PMC pmc) {
+    return pmc->vtable;
+}
+
 /*=for api extend Parrot_PMC_set_string
  *
  * Assign the passed-in parrot string to the passed-in PMC
  */
-void Parrot_PMC_set_string(Parrot_INTERP interp, Parrot_PMC pmc, Parrot_STRING value) 
{
+void Parrot_PMC_set_string(Parrot_Interp interp, Parrot_PMC pmc, Parrot_String value) 
{
     VTABLE_set_string_native(interp, pmc, value);
 }
@@ -110,5 +118,5 @@
  * Assign the passed-in pointer to the passed-in PMC
  */
-void Parrot_PMC_set_pointer(Parrot_INTERP interp, Parrot_PMC pmc, void *value) {
+void Parrot_PMC_set_pointer(Parrot_Interp interp, Parrot_PMC pmc, void *value) {
     VTABLE_set_pointer(interp, pmc, value);
 }
@@ -118,5 +126,5 @@
  * Assign the passed-in parrot integer to the passed-in PMC
  */
-void Parrot_PMC_set_intval(Parrot_INTERP interp, Parrot_PMC pmc, Parrot_Int value) {
+void Parrot_PMC_set_intval(Parrot_Interp interp, Parrot_PMC pmc, Parrot_Int value) {
     VTABLE_set_integer_native(interp, pmc, value);
 }
@@ -126,5 +134,5 @@
  * Assign the passed-in parrot integer to the passed-in PMC
  */
-void Parrot_PMC_set_intval_intkey(Parrot_INTERP interp, Parrot_PMC pmc, Parrot_Int 
value, Parrot_Int key) {
+void Parrot_PMC_set_intval_intkey(Parrot_Interp interp, Parrot_PMC pmc, Parrot_Int 
value, Parrot_Int key) {
     VTABLE_set_integer_keyed_int(interp, pmc, key, value);
 }
@@ -134,5 +142,5 @@
  * Assign the passed-in parrot number to the passed-in PMC
  */
-void Parrot_PMC_set_numval(Parrot_INTERP interp, Parrot_PMC pmc, Parrot_Float value) {
+void Parrot_PMC_set_numval(Parrot_Interp interp, Parrot_PMC pmc, Parrot_Float value) {
     VTABLE_set_number_native(interp, pmc, value);
 }
@@ -142,5 +150,5 @@
  * Assign the passed-in null-terminated C string to the passed-in PMC
  */
-void Parrot_PMC_set_cstring(Parrot_INTERP interp, Parrot_PMC pmc, const char *value) {
+void Parrot_PMC_set_cstring(Parrot_Interp interp, Parrot_PMC pmc, const char *value) {
     VTABLE_set_string_native(interp, pmc, string_from_cstring(interp, value, 0));
 }
@@ -150,13 +158,21 @@
  * Assign the passed-in length-noted string  to the passed-in PMC
  */
-void Parrot_PMC_set_cstringn(Parrot_INTERP interp, Parrot_PMC pmc, const char *value, 
Parrot_Int length) {
+void Parrot_PMC_set_cstringn(Parrot_Interp interp, Parrot_PMC pmc, const char *value, 
Parrot_Int length) {
     VTABLE_set_string_native(interp, pmc, string_from_cstring(interp, value, length));
 }
 
+/*=for api extend Parrot_PMC_get_vtable
+ *
+ * Set the vtable of the PMC to the passed-in vtable
+ */
+void Parrot_PMC_set_vtable(Parrot_Interp interp, Parrot_PMC pmc, Parrot_Vtable 
vtable) {
+    pmc->vtable = vtable;
+}
+
 /*=for api extend Parrot_PMC_new
  *
  * Create and return a new PMC
  */
-Parrot_PMC Parrot_PMC_new(Parrot_INTERP interp, Parrot_Int type) {
+Parrot_PMC Parrot_PMC_new(Parrot_Interp interp, Parrot_Int type) {
     Parrot_PMC newpmc;
     newpmc = pmc_new_noinit(interp, type);
@@ -169,5 +185,5 @@
  * Returns the internal identifier that represents the named class
  */
-Parrot_Int Parrot_PMC_typenum(Parrot_INTERP interp, const char *class) {
+Parrot_Int Parrot_PMC_typenum(Parrot_Interp interp, const char *class) {
     return pmc_type(interp, string_from_cstring(interp, class, 0));
 }
@@ -190,5 +206,5 @@
  * Call a parrot subroutine, with PMC parameters
  */
-void Parrot_call(Parrot_INTERP interpreter, Parrot_PMC sub,
+void Parrot_call(Parrot_Interp interpreter, Parrot_PMC sub,
                  Parrot_Int argcount, ...) {
     Parrot_Int inreg = 0;
@@ -228,6 +244,6 @@
  * Call a parrot method, with PMC parameters
  */
-void Parrot_call_method(Parrot_INTERP interp, Parrot_PMC sub,
-                        Parrot_STRING method, Parrot_Int argcount, ...) {
+void Parrot_call_method(Parrot_Interp interp, Parrot_PMC sub,
+                        Parrot_String method, Parrot_Int argcount, ...) {
 }
 
@@ -237,5 +253,5 @@
  * Return the value of an integer register
  */
-Parrot_Int Parrot_get_intreg(Parrot_INTERP interpreter, Parrot_Int regnum) {
+Parrot_Int Parrot_get_intreg(Parrot_Interp interpreter, Parrot_Int regnum) {
     return REG_INT(regnum);
 }
@@ -245,5 +261,5 @@
  * Return the value of a numeric register
  */
-Parrot_Float Parrot_get_numreg(Parrot_INTERP interpreter, Parrot_Int regnum) {
+Parrot_Float Parrot_get_numreg(Parrot_Interp interpreter, Parrot_Int regnum) {
     return REG_NUM(regnum);
 }
@@ -253,5 +269,5 @@
  * Return the value of a string register
  */
-Parrot_STRING Parrot_get_strreg(Parrot_INTERP interpreter, Parrot_Int regnum) {
+Parrot_String Parrot_get_strreg(Parrot_Interp interpreter, Parrot_Int regnum) {
     return REG_STR(regnum);
 }
@@ -261,5 +277,5 @@
  * Return the value of a PMC register
  */
-Parrot_PMC Parrot_get_pmcreg(Parrot_INTERP interpreter, Parrot_Int regnum) {
+Parrot_PMC Parrot_get_pmcreg(Parrot_Interp interpreter, Parrot_Int regnum) {
     return REG_PMC(regnum);
 }
@@ -269,5 +285,5 @@
  * Set the value of an I register
  */
-void Parrot_set_intreg(Parrot_INTERP interpreter, Parrot_Int regnum, Parrot_Int 
value) {
+void Parrot_set_intreg(Parrot_Interp interpreter, Parrot_Int regnum, Parrot_Int 
value) {
     REG_INT(regnum) = value;
 }
@@ -277,5 +293,5 @@
  * Set the value of an N register
  */
-void Parrot_set_numreg(Parrot_INTERP interpreter, Parrot_Int regnum, Parrot_Float 
value) {
+void Parrot_set_numreg(Parrot_Interp interpreter, Parrot_Int regnum, Parrot_Float 
value) {
     REG_NUM(regnum) = value;
 }
@@ -285,5 +301,5 @@
  * Set the value of an S register
  */
-void Parrot_set_strreg(Parrot_INTERP interpreter, Parrot_Int regnum, Parrot_STRING 
value) {
+void Parrot_set_strreg(Parrot_Interp interpreter, Parrot_Int regnum, Parrot_String 
value) {
     REG_STR(regnum) = value;
 }
@@ -293,5 +309,5 @@
  * Set the value of a P  register
  */
-void Parrot_set_pmcreg(Parrot_INTERP interpreter, Parrot_Int regnum, Parrot_PMC 
value) {
+void Parrot_set_pmcreg(Parrot_Interp interpreter, Parrot_Int regnum, Parrot_PMC 
value) {
     REG_PMC(regnum) = value;
 }
@@ -306,6 +322,6 @@
  *
  */
-Parrot_STRING Parrot_new_string(Parrot_INTERP interpreter,
-                                char *buffer, int length,
+Parrot_String Parrot_new_string(Parrot_Interp interpreter,
+                                const char *buffer, int length,
                                 Parrot_Encoding encoding,
                                 Parrot_CharType charset,
@@ -319,5 +335,5 @@
  * Find the magic token for an encoding, by name
  */
-Parrot_Const_Encoding Parrot_find_encoding(Parrot_INTERP interpreter, char 
*encoding_name) {
+Parrot_Const_Encoding Parrot_find_encoding(Parrot_Interp interpreter, char 
*encoding_name) {
     return Parrot_encoding_lookup(encoding_name);
 }
@@ -328,5 +344,5 @@
  *
  */
-Parrot_Language Parrot_find_language(Parrot_INTERP interpreter, char *langauge) {
+Parrot_Language Parrot_find_language(Parrot_Interp interpreter, char *langauge) {
     return 0;
 }
@@ -337,5 +353,5 @@
  *
  */
-Parrot_Const_CharType Parrot_find_chartype(Parrot_INTERP interpreter, char *chartype) 
{
+Parrot_Const_CharType Parrot_find_chartype(Parrot_Interp interpreter, char *chartype) 
{
     return Parrot_chartype_lookup(chartype);
 }
@@ -350,5 +366,5 @@
 
 void
-Parrot_register_pmc(Parrot_INTERP interpreter, Parrot_PMC pmc)
+Parrot_register_pmc(Parrot_Interp interpreter, Parrot_PMC pmc)
 {
     dod_register_pmc(interpreter, pmc);
@@ -364,5 +380,5 @@
 
 void
-Parrot_unregister_pmc(Parrot_INTERP interpreter, Parrot_PMC pmc)
+Parrot_unregister_pmc(Parrot_Interp interpreter, Parrot_PMC pmc)
 {
     dod_unregister_pmc(interpreter, pmc);

Reply via email to