[svn:parrot] r44911 - in branches/tt389_fix/src: . interp pmc

chromatic at svn.parrot.org chromatic at svn.parrot.org
Sat Mar 13 21:58:22 UTC 2010


Author: chromatic
Date: Sat Mar 13 21:58:21 2010
New Revision: 44911
URL: https://trac.parrot.org/parrot/changeset/44911

Log:
[OO] Made second stage class initialization create a PMCProxy for all intrinsic
PMC types and made intrinsic method registration use that proxy.  Several tests
fail, but this is closer to fixing TT #389.

Modified:
   branches/tt389_fix/src/interp/inter_misc.c
   branches/tt389_fix/src/oo.c
   branches/tt389_fix/src/pmc.c
   branches/tt389_fix/src/pmc/pmcproxy.pmc

Modified: branches/tt389_fix/src/interp/inter_misc.c
==============================================================================
--- branches/tt389_fix/src/interp/inter_misc.c	Sat Mar 13 21:58:17 2010	(r44910)
+++ branches/tt389_fix/src/interp/inter_misc.c	Sat Mar 13 21:58:21 2010	(r44911)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2001-2009, Parrot Foundation.
+Copyright (C) 2001-2010, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -84,13 +84,17 @@
         ARGIN(STRING *name))
 {
     ASSERT_ARGS(register_raw_nci_method_in_ns)
-    PMC    * const method      = pmc_new(interp, enum_class_NCI);
+    PMC    * const method = pmc_new(interp, enum_class_NCI);
 
     /* setup call func */
     VTABLE_set_pointer(interp, method, func);
 
+    /* insert into PMCProxy */
+    if (interp->vtables[type]->pmc_class)
+        VTABLE_add_method(interp, interp->vtables[type]->pmc_class, name, method);
     /* insert it into namespace */
-    VTABLE_set_pmc_keyed_str(interp, interp->vtables[type]->_namespace,
+    else
+        VTABLE_set_pmc_keyed_str(interp, interp->vtables[type]->_namespace,
             name, method);
 }
 

Modified: branches/tt389_fix/src/oo.c
==============================================================================
--- branches/tt389_fix/src/oo.c	Sat Mar 13 21:58:17 2010	(r44910)
+++ branches/tt389_fix/src/oo.c	Sat Mar 13 21:58:21 2010	(r44911)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2007-2009, Parrot Foundation.
+Copyright (C) 2007-2010, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -53,7 +53,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 static PMC * find_method_direct_1(PARROT_INTERP,
-    ARGIN(PMC *_class),
+    ARGIN(PMC const *_class),
     ARGIN(STRING *method_name))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
@@ -906,7 +906,6 @@
     if (!PMC_IS_NULL(found))
         return found;
 
-
     if (Parrot_str_equal(interp, method_name, CONST_STRING(interp, "__get_string")))
         return find_method_direct_1(interp, _class, CONST_STRING(interp, "__get_repr"));
 
@@ -1066,26 +1065,31 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CAN_RETURN_NULL
 static PMC *
-find_method_direct_1(PARROT_INTERP, ARGIN(PMC *_class),
+find_method_direct_1(PARROT_INTERP, ARGIN(PMC const *_class),
                               ARGIN(STRING *method_name))
 {
     ASSERT_ARGS(find_method_direct_1)
-    INTVAL i;
 
-    PMC * const  mro = _class->vtable->mro;
-    const INTVAL n   = VTABLE_elements(interp, mro);
+    PMC *mro   = _class->vtable->mro;
+    PMC *proxy = _class->vtable->pmc_class;
+    PMC *parent = VTABLE_get_pmc_keyed_int(interp, mro, 1);
 
-    for (i = 0; i < n; ++i) {
-        PMC *method, *ns;
+    if (!PMC_IS_NULL(proxy)) {
+        PMC *methods, *method;
 
-        _class = VTABLE_get_pmc_keyed_int(interp, mro, i);
-        ns     = VTABLE_get_namespace(interp, _class);
-        method = VTABLE_get_pmc_keyed_str(interp, ns, method_name);
+        GETATTR_Class_methods(interp, proxy, methods);
+        method = VTABLE_get_pmc_keyed_str(interp, methods, method_name);
 
         TRACE_FM(interp, _class, method_name, method);
 
         if (!PMC_IS_NULL(method))
             return method;
+        else {
+            PMC *parent = VTABLE_get_pmc_keyed_int(interp, mro, 1);
+
+            if (!PMC_IS_NULL(parent))
+                return find_method_direct_1(interp, parent, method_name);
+        }
     }
 
     TRACE_FM(interp, _class, method_name, NULL);

Modified: branches/tt389_fix/src/pmc.c
==============================================================================
--- branches/tt389_fix/src/pmc.c	Sat Mar 13 21:58:17 2010	(r44910)
+++ branches/tt389_fix/src/pmc.c	Sat Mar 13 21:58:21 2010	(r44911)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2001-2009, Parrot Foundation.
+Copyright (C) 2001-2010, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -22,6 +22,7 @@
 #include "pmc.str"
 #include "pmc/pmc_class.h"
 #include "pmc/pmc_callcontext.h"
+#include "pmc/pmc_namespace.h"
 
 /* HEADERIZER HFILE: include/parrot/pmc.h */
 
@@ -157,7 +158,8 @@
     {
         PMC *const classobj = interp->vtables[base_type]->pmc_class;
 
-        if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj))
+        if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj)
+        && classobj->vtable->base_type != enum_class_PMCProxy)
             return VTABLE_instantiate(interp, classobj, PMCNULL);
         else {
             PMC * const pmc = get_new_pmc_header(interp, base_type, 0);
@@ -485,7 +487,8 @@
     ASSERT_ARGS(pmc_new_noinit)
     PMC *const classobj = interp->vtables[base_type]->pmc_class;
 
-    if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj))
+    if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj)
+    && classobj->vtable->base_type != enum_class_PMCProxy)
         return VTABLE_instantiate(interp, classobj, PMCNULL);
 
     return get_new_pmc_header(interp, base_type, 0);
@@ -552,7 +555,8 @@
     ASSERT_ARGS(pmc_new_init)
     PMC *const classobj = interp->vtables[base_type]->pmc_class;
 
-    if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj))
+    if (!PMC_IS_NULL(classobj) && PObj_is_class_TEST(classobj)
+    && classobj->vtable->base_type != enum_class_PMCProxy)
         return VTABLE_instantiate(interp, classobj, init);
     else {
         PMC * const pmc = get_new_pmc_header(interp, base_type, 0);
@@ -858,20 +862,30 @@
 
         if (!vtable->_namespace) {
             /* need a namespace Hash, anchor at parent, name it */
-            PMC * const ns     = pmc_new(interp,
+            PMC * const ns = pmc_new(interp,
                     Parrot_get_ctx_HLL_type(interp, enum_class_NameSpace));
             vtable->_namespace = ns;
 
             /* anchor at parent, aka current_namespace, that is 'parrot' */
             VTABLE_set_pmc_keyed_str(interp,
-                    Parrot_pcc_get_namespace(interp, CURRENT_CONTEXT(interp)), class_name, ns);
+                Parrot_pcc_get_namespace(interp, CURRENT_CONTEXT(interp)),
+                class_name, ns);
         }
 
-        _class = vtable->pmc_class;
-        if (!_class)
-            _class = create_class_pmc(interp, parent_type);
+        if (!vtable->pmc_class) {
+            PMC * const typenum = temporary_pmc_new(interp, enum_class_Integer);
+            PMC *       proxy;
+            VTABLE_set_integer_native(interp, typenum, type);
+
+            proxy  = pmc_new_init(interp, enum_class_PMCProxy, typenum);
+
+            vtable->pmc_class                            = proxy;
+            PARROT_NAMESPACE(vtable->_namespace)->_class = proxy;
+            PARROT_CLASS(proxy)->_namespace              = vtable->_namespace;
+        }
 
-        VTABLE_push_pmc(interp, mro, _class);
+        VTABLE_push_pmc(interp, mro,
+            get_new_pmc_header(interp, parent_type, PObj_constant_FLAG));
     }
 }
 

Modified: branches/tt389_fix/src/pmc/pmcproxy.pmc
==============================================================================
--- branches/tt389_fix/src/pmc/pmcproxy.pmc	Sat Mar 13 21:58:17 2010	(r44910)
+++ branches/tt389_fix/src/pmc/pmcproxy.pmc	Sat Mar 13 21:58:21 2010	(r44911)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2001-2008, Parrot Foundation.
+Copyright (C) 2001-2010, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -154,7 +154,6 @@
         proxy_info             = PARROT_CLASS(SELF);
         proxy_info->id         = type_num;
         proxy_info->name       = interp->vtables[type_num]->whoami;
-        proxy_info->_namespace = interp->vtables[type_num]->_namespace;
 
         /* Build MRO (skip ourself). */
         mro_length = VTABLE_elements(interp, interp->vtables[type_num]->mro);
@@ -174,16 +173,11 @@
             VTABLE_push_pmc(interp, proxy_info->parents,
                     VTABLE_get_pmc_keyed_int(interp, proxy_info->all_parents, 1));
 
+        /* Extract any methods from the namespace */
         if (!PMC_IS_NULL(proxy_info->_namespace)
-        &&   PMC_IS_NULL(VTABLE_get_class(interp, proxy_info->_namespace))) {
-            /* Link the proxy and the namespace, caching the proxy object for
-             * later retrieval on class lookup. */
-             Parrot_pcc_invoke_method_from_c_args(interp, proxy_info->_namespace, CONST_STRING(interp, "set_class"), "P->", SELF);
-
-            /* Extract any methods from the namespace */
+        &&   PMC_IS_NULL(VTABLE_get_class(interp, proxy_info->_namespace)))
             Parrot_oo_extract_methods_from_namespace(interp, SELF,
                     proxy_info->_namespace);
-        }
 
         create_inherited_attributes(interp, SELF, type_num);
     }


More information about the parrot-commits mailing list