develooper Front page | perl.cvs.parrot | Postings from January 2009

[svn:parrot] r34942 - branches/rvar/src/pmc

From:
pmichaud
Date:
January 4, 2009 14:34
Subject:
[svn:parrot] r34942 - branches/rvar/src/pmc
Message ID:
20090104223408.B148ECB9F9@x12.develooper.com
Author: pmichaud
Date: Sun Jan  4 14:34:07 2009
New Revision: 34942

Modified:
   branches/rvar/src/pmc/class.pmc

Log:
[oo]:  inspect_str on class objects returns shallow-copy hashes


Modified: branches/rvar/src/pmc/class.pmc
==============================================================================
--- branches/rvar/src/pmc/class.pmc	(original)
+++ branches/rvar/src/pmc/class.pmc	Sun Jan  4 14:34:07 2009
@@ -922,8 +922,21 @@
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                 "Unknown introspection value '%S'", what);
 
-        /* Clone and return. */
-        return PMC_IS_NULL(found) ? PMCNULL : VTABLE_clone(interp, found);
+        /* return found value */
+        if (PMC_IS_NULL(found)) { return PMCNULL; }
+        if (found->vtable->base_type == enum_class_Hash) {
+            /* for Hash return values, create and return a shallow 
+             * clone because the VTABLE_clone does a deep clone */
+            PMC * const hash = pmc_new(interp, enum_class_Hash);
+            PMC * const iter = VTABLE_get_iter(interp, found);
+            while (VTABLE_get_bool(interp, iter)) {
+                STRING * key = VTABLE_shift_string(interp, iter);
+                PMC * value  = VTABLE_get_pmc_keyed_str(interp, found, key);
+                VTABLE_set_pmc_keyed_str(interp, hash, key, value);
+            }
+            return hash;
+        }
+        return VTABLE_clone(interp, found);
     }
 
 /*



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About