[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