summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2008-12-26 17:14:44 +0000
committerNicholas Clark <nick@ccl4.org>2008-12-27 21:12:12 +0000
commit123892d916359369839f3896f283189be71dc32c (patch)
tree189e4891a00ab4e74c3fe294b3ce2bd26b47d0ef
parentfa60396f123333e92849ecaecffb9252458d6678 (diff)
downloadperl-123892d916359369839f3896f283189be71dc32c.tar.gz
Add MRO_GET_PRIVATE_DATA() to use the cached mro private data where possible.
-rw-r--r--hv.h5
-rw-r--r--mro.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/hv.h b/hv.h
index 66fb6f2d8e..1481d5b8e9 100644
--- a/hv.h
+++ b/hv.h
@@ -57,6 +57,11 @@ struct mro_meta {
HV *isa; /* Everything this class @ISA */
};
+#define MRO_GET_PRIVATE_DATA(smeta, which) \
+ (((smeta)->mro_which && (which) == (smeta)->mro_which) \
+ ? MUTABLE_SV((smeta)->mro_linear_c3) \
+ : Perl_mro_get_private_data(aTHX_ (smeta), (which)))
+
/* Subject to change.
Don't access this directly.
*/
diff --git a/mro.c b/mro.c
index 23070d990d..4ce939becb 100644
--- a/mro.c
+++ b/mro.c
@@ -231,7 +231,7 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
meta = HvMROMETA(stash);
/* return cache if valid */
- if((retval = MUTABLE_AV(Perl_mro_get_private_data(aTHX_ meta, dfs_alg)))) {
+ if((retval = MUTABLE_AV(MRO_GET_PRIVATE_DATA(meta, dfs_alg)))) {
return retval;
}
@@ -382,7 +382,7 @@ S_mro_get_linear_isa_c3(pTHX_ HV* stash, U32 level)
meta = HvMROMETA(stash);
/* return cache if valid */
- if((retval = MUTABLE_AV(Perl_mro_get_private_data(aTHX_ meta, c3_alg)))) {
+ if((retval = MUTABLE_AV(MRO_GET_PRIVATE_DATA(meta, c3_alg)))) {
return retval;
}