I'm working on the concurrency branch, and specifically the Exception PMC.  
Here's a patch that does what I think it needs.... I'll run more tests and 
see if Parrot still works.

-- c

Index: src/pmc/exception.pmc
===================================================================
--- src/pmc/exception.pmc	(revision 27224)
+++ src/pmc/exception.pmc	(working copy)
@@ -10,32 +10,23 @@
 
 This is the exception base class.
 
-For now, this class is based on C<ResziablePMCArray>. This will change when the
-full PMC PDD is implemented.
-
 An exception object has these attributes:
 
 =over 4
 
-=item 0 C<_message>
+=item C<message>
 
 Textual representation of the exception.
 
-=item 1 C<_type>
+=item C<severity>
 
-The exception type, (see F<include/parrot/exceptions.h>, F<except_type.pasm>).
-
-=item 2 C<_severity>
-
-The severity of the exception, (see F<src/exceptions.h>,
+The severity of the exception, (see F<include/parrot/exceptions.h>,
 F<except_severity.pasm>).
 
-=item 3 C<payload>
+=item C<payload>
 
 Additional data for the exception.
 
-=item 4 C<unused>
-
 =back
 
 Optional:
@@ -64,9 +55,6 @@
 underscore (that is reserved for Parrot's internal usage. These are
 stored as properties.
 
-Note: currently, HLL information must be indexed by number. Slots 9 and 10
-are available for the HLL - This is subject to change.
-
 =back
 
 When an exception handler is called, the exception object is passed as
@@ -79,26 +67,6 @@
 
 #include "parrot/parrot.h"
 
-/* This finds the index of an attribute in an object's attribute store and
- * returns it. Returns -1 if the attribute does not exist. */
-static INTVAL
-get_attrib_index(PARROT_INTERP, PMC *self, STRING *name)
-{
-        if (!string_compare(interp, name, CONST_STRING(interp, "message")))
-            return 0;
-
-        if (!string_compare(interp, name, CONST_STRING(interp, "type")))
-            return 1;
-
-        if (!string_compare(interp, name, CONST_STRING(interp, "severity")))
-            return 2;
-
-        if (!string_compare(interp, name, CONST_STRING(interp, "payload")))
-            return 3;
-
-            return -1;
-}
-
 /*
 
 =head2 Methods
@@ -110,6 +78,9 @@
 */
 
 pmclass Exception extends ResizablePMCArray need_ext {
+    ATTR STRING *message;
+    ATTR PMC    *payload;
+    ATTR INTVAL  severity;
 
 /*
 
@@ -122,13 +93,39 @@
 */
 
     VTABLE void init() {
-        SUPER();
-        /* pre-fill 11 slots with PMCNULL */
-        SELF.set_integer_native(11);
+        Parrot_Exception * const exception =
+            mem_allocate_zeroed_typed(Parrot_Exception);
+
+        PObj_custom_mark_SET(SELF);
+        PObj_active_destroy_SET(SELF);
+
+        PMC_data(SELF)      = exception;
+        exception->message  = CONST_STRING(interp, "");
+        exception->severity = 0;
+        exception->payload  = PMCNULL;
     }
 
 /*
 
+=item C<void mark()>
+
+Mark any active exception data as live.
+
+=cut
+
+*/
+
+    VTABLE void mark() {
+        Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+
+        if (exception->message)
+            pobject_lives(interp, (PObj *)exception->message);
+        if (exception->payload)
+            pobject_lives(interp, (PObj *)exception->payload);
+    }
+
+/*
+
 =item C<STRING *get_string_keyed(PMC *key)>
 
 Returns the Parrot string value for C<*key>. The only current recognized
@@ -145,14 +142,17 @@
     VTABLE STRING *get_string_keyed(PMC *key) {
         STRING *s = key_string(INTERP, key);
 
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_message")))
-            return SELF.get_string_keyed_int(0);
+        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_message"))) {
+            Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+            return exception->message;
+        }
 
-        return 0;
+        return CONST_STRING(interp, "");
     }
 
     VTABLE STRING *get_string() {
-        return SELF.get_string_keyed_int(0);
+        Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+        return exception->message;
     }
 
 /*
@@ -168,12 +168,11 @@
     VTABLE INTVAL get_integer_keyed(PMC *key) {
         STRING *s = key_string(INTERP, key);
 
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_type")))
-            return SELF.get_integer_keyed_int(1);
+        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_severity"))) {
+            Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+            return exception->severity;
+        }
 
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_severity")))
-            return SELF.get_integer_keyed_int(2);
-
         return 0;
     }
 
@@ -194,24 +193,6 @@
 
 /*
 
-=item C<PMC *get_pmc_keyed_int(INTVAL key)>
-
-Returns the PMC value of the element at index C<key>, but ignores too
-big negative keys.
-
-=cut
-
-*/
-
-    VTABLE PMC *get_pmc_keyed_int(INTVAL key) {
-        if (key <= -PMC_int_val(SELF))
-            return PMCNULL;
-
-        return SUPER(key);
-    }
-
-/*
-
 =item C<void set_string_keyed(PMC *key, STRING *value)>
 
 Sets the Parrot string value for C<*key>.
@@ -223,8 +204,10 @@
     VTABLE void set_string_keyed(PMC *key, STRING *value) {
         STRING *s = key_string(INTERP, key);
 
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_message")))
-            SELF.set_string_keyed_int(0, value);
+        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_message"))) {
+            Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+            exception->message                 = value;
+        }
     }
 
 /*
@@ -240,11 +223,10 @@
     VTABLE void set_integer_keyed(PMC *key, INTVAL value) {
         STRING *s = key_string(INTERP, key);
 
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_type")))
-            SELF.set_integer_keyed_int(1, value);
-
-        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_severity")))
-            SELF.set_integer_keyed_int(2, value);
+        if (!string_compare(INTERP, s, CONST_STRING(INTERP, "_severity"))) {
+            Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
+            exception->severity                = value;
+        }
     }
 
 /*
@@ -271,7 +253,7 @@
 
 */
     VTABLE INTVAL is_equal(PMC *value) {
-        /* RT#46689 check parents */
+        /* RT #46689 check parents */
         if (value->vtable->base_type == enum_class_Exception
         ||  VTABLE_isa(INTERP, value, CONST_STRING(INTERP, "Exception")))
             return 1;
@@ -289,14 +271,26 @@
 
 */
     VTABLE PMC *get_attr_str(STRING *name) {
-        INTVAL index = get_attrib_index(interp, SELF, name);
+        Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
 
-        /* If lookup failed, exception. */
-        if (index == -1)
-            real_exception(interp, NULL, ATTRIB_NOT_FOUND,
-                "No such attribute '%S'", name);
+        if (!string_compare(interp, name, CONST_STRING(interp, "message"))) {
+            PMC *message_pmc = pmc_new(interp, enum_class_String);
+            VTABLE_set_string_native(interp, message_pmc, exception->message);
+            return message_pmc;
+        }
 
-       return SELF.get_pmc_keyed_int(index);
+        if (!string_compare(interp, name, CONST_STRING(interp, "severity"))) {
+            PMC *severity_pmc = pmc_new(interp, enum_class_Integer);
+            VTABLE_set_integer_native(interp, severity_pmc, exception->severity);
+            return severity_pmc;
+        }
+
+        if (!string_compare(interp, name, CONST_STRING(interp, "payload")))
+            return exception->payload;
+
+        /* If lookup failed, exception. */
+        real_exception(interp, NULL, ATTRIB_NOT_FOUND,
+            "No such attribute '%S'", name);
     }
 
 /*
@@ -309,96 +303,27 @@
 
 */
     VTABLE void set_attr_str(STRING *name, PMC *value) {
-        INTVAL index = get_attrib_index(interp, SELF, name);
+        Parrot_Exception * const exception = PARROT_EXCEPTION(SELF);
 
-        /* If lookup failed, exception. */
-        if (index == -1)
-            real_exception(interp, NULL, ATTRIB_NOT_FOUND,
-                "No such attribute '%S'", name);
+        if (!string_compare(interp, name, CONST_STRING(interp, "message"))) {
+            exception->message = VTABLE_get_string(interp, value);
+            return;
+        }
 
-        SELF.set_pmc_keyed_int(index, value);
-    }
+        if (!string_compare(interp, name, CONST_STRING(interp, "severity"))) {
+            exception->severity = VTABLE_get_integer(interp, value);
+            return;
+        }
 
-/*
+        if (!string_compare(interp, name, CONST_STRING(interp, "payload"))) {
+            exception->payload = value;
+            return;
+        }
 
-=item C<shift_*>, C<unshift_*>, C<pop_*>, C<push_*>
-
-These methods are silently ignored.
-
-=cut
-
-*/
-    VTABLE PMC *shift_pmc() {
-        /* fprintf(stderr, "don't do that then\n"); RT#46691 */
-        return PMCNULL;
+        /* If lookup failed, exception. */
+        real_exception(interp, NULL, ATTRIB_NOT_FOUND,
+            "No such attribute '%S'", name);
     }
-
-    VTABLE FLOATVAL shift_float() {
-        (void) SELF.shift_pmc();
-        return 0.0;
-    }
-
-    VTABLE INTVAL shift_integer() {
-        (void) SELF.shift_pmc();
-        return 0;
-    }
-
-    VTABLE STRING *shift_string() {
-        (void) SELF.shift_pmc();
-        return NULL;
-    }
-
-    void unshift_pmc(PMC *value) {
-        /* fprintf(stderr, "don't do that then\n"); RT#46691 */
-    }
-
-    VTABLE void unshift_float(FLOATVAL value) {
-        SELF.unshift_pmc(NULL);
-    }
-
-    VTABLE void unshift_integer(INTVAL value) {
-        SELF.unshift_pmc(NULL);
-    }
-
-    VTABLE void unshift_string(STRING *value) {
-        SELF.unshift_pmc(NULL);
-    }
-
-    void push_pmc(PMC *value) {
-        /* fprintf(stderr, "don't do that then\n"); RT#46691 */
-    }
-
-    VTABLE void push_float(FLOATVAL value) {
-        SELF.push_pmc(PMCNULL);
-    }
-
-    VTABLE void push_integer(INTVAL value) {
-        SELF.push_pmc(PMCNULL);
-    }
-
-    VTABLE void push_string(STRING *value) {
-        SELF.push_pmc(PMCNULL);
-    }
-
-    VTABLE PMC *pop_pmc() {
-        /* fprintf(stderr, "don't do that then\n"); RT#46691 */
-        return PMCNULL;
-    }
-
-    VTABLE FLOATVAL pop_float() {
-        (void) SELF.pop_pmc();
-        return 0.0;
-    }
-
-    VTABLE INTVAL pop_integer() {
-        (void) SELF.pop_pmc();
-        return 0;
-    }
-
-    VTABLE STRING *pop_string() {
-        (void) SELF.pop_pmc();
-        return NULL;
-    }
 }
 
 /*

Reply via email to