Simon Cozens <[EMAIL PROTECTED]> wrote:
> On Mon, Nov 19, 2001 at 03:29:00PM +0000, Dave Mitchell wrote:
> > I'd prefer the "you have 8 private bits, the rest is Parrot's" approach
> > rather than the "Parrot has 8 bits and the rest is yours for now, we'll
> > let you know when we want to grab some more back off you" approach. I think
> > that way, we'll have less backwards compatibility issues for 3rd party code.
> 
> You are right, of course. Thankfully, you're right sufficiently early
> that all you need to send me a patch for is the documentation and
> include/parrot/pmc.h :)

My bluff has been called!
Okay, here's a stab at it. I'm keen that we use enums to define constants,
rather than using #define.

--- ./docs/vtables.pod  Mon Nov 19 23:44:15 2001
+++ ./docs/vtables.pod  Tue Nov 20 00:29:34 2001
@@ -100,17 +100,23 @@
 is to define a structure that will hook onto the C<data>, if your data
 type needs to use that, and then also define some user-defined flags.
 
-Flags are accessed by C<< pmc->flags >>, but a number of these flags
-are reserved by Parrot internally. Hence, you should start your
-user-defined flags from offset C<PMC_USER_FLAG>, like this:
+Flags are accessed by C<< pmc->flags >>. Most of the bits in the flag word
+are reserved for use by parrot itself, but a number of them have been
+assigned for general use by individual classes. These are referred to as
+C<PMC_private0_FLAG> .. C<PMC_private7_FLAG>. (The '7' may change during the
+early development of parrot, but will become pretty fixed at some point.)
 
-    #define FOOBYNUMBER_IS_BIGNUM (1<<(PMC_USER_FLAG))
-    #define FOOBYNUMBER_IS_BIGINT (1<<(PMC_USER_FLAG+1))
-    ...
+Normally, you will want to alias these generic bit names to something
+more meaningful within your class:
 
-You're quite at liberty to make these two definitions in a separate
-header file, but I find it more convenient to keep everything together
-in F<foobynumber.c>.
+    enum {
+       Foobynumber_is_bignum = PMC_private0_FLAG,
+       Foobynumber_is_bigint = PMC_private1_FLAG,
+       ....
+    };
+
+You're quite at liberty to declare these in a separate header file, but I
+find it more convenient to keep everything together in F<foobynumber.c>.
 
 You may also use the C<cache> union in the PMC structure to remove
 some extraneous dereferences in your code if that would help. 
--- ./include/parrot/pmc.h      Mon Nov 19 23:44:15 2001
+++ ./include/parrot/pmc.h      Tue Nov 20 00:29:37 2001
@@ -33,7 +33,29 @@
   SYNC *synchronize;
 };
 
-#define PMC_USER_FLAG 9 /* Unreserved flags start here */
+/* PMC flag bits */
+
+typedef enum {
+    /* the first 8 bits are for private use by individual vtable
+     * classes. It is suggested that you alias these within an individual
+     * class's header file
+     */
+    PMC_private0_FLAG   = 2 << 0,
+    PMC_private1_FLAG   = 2 << 1,
+    PMC_private2_FLAG   = 2 << 2,
+    PMC_private3_FLAG   = 2 << 3,
+    PMC_private4_FLAG   = 2 << 4,
+    PMC_private5_FLAG   = 2 << 5,
+    PMC_private6_FLAG   = 2 << 6,
+    PMC_private7_FLAG   = 2 << 7,
+
+    /* The rest of the flags are for use by Parrot */
+
+    PMC_tba_FLAG        = 2 << 8, /* XXX none yet, just an example... */
+} PMC_flags;
+
+/* XXX add various bit test macros once we have need of them */
+
 
 #endif
 

Reply via email to