[svn:parrot] r41062 - in trunk: include/parrot src/gc src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Sun Sep 6 11:56:59 UTC 2009


Author: bacek
Date: Sun Sep  6 11:56:58 2009
New Revision: 41062
URL: https://trac.parrot.org/parrot/changeset/41062

Log:
Use fixed-size allocator for Parrot_Context

Modified:
   trunk/include/parrot/register.h
   trunk/include/parrot/sub.h
   trunk/src/gc/alloc_register.c
   trunk/src/pmc/context.pmc

Modified: trunk/include/parrot/register.h
==============================================================================
--- trunk/include/parrot/register.h	Sun Sep  6 11:35:37 2009	(r41061)
+++ trunk/include/parrot/register.h	Sun Sep  6 11:56:58 2009	(r41062)
@@ -171,6 +171,10 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
+size_t Parrot_pcc_calculate_context_size(SHIM_INTERP,
+    ARGIN(const UINTVAL *number_regs_used))
+        __attribute__nonnull__(2);
+
 PARROT_CANNOT_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
 PMC * Parrot_set_new_context(PARROT_INTERP,
@@ -228,6 +232,9 @@
 #define ASSERT_ARGS_Parrot_alloc_context __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(number_regs_used)
+#define ASSERT_ARGS_Parrot_pcc_calculate_context_size \
+     __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(number_regs_used)
 #define ASSERT_ARGS_Parrot_set_new_context __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(number_regs_used)

Modified: trunk/include/parrot/sub.h
==============================================================================
--- trunk/include/parrot/sub.h	Sun Sep  6 11:35:37 2009	(r41061)
+++ trunk/include/parrot/sub.h	Sun Sep  6 11:56:58 2009	(r41062)
@@ -232,15 +232,6 @@
 
 PARROT_CAN_RETURN_NULL
 PARROT_WARN_UNUSED_RESULT
-PMC* Parrot_find_dynamic_pad(PARROT_INTERP,
-    ARGIN(STRING *lex_name),
-    ARGIN(PMC *ctx))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3);
-
-PARROT_CAN_RETURN_NULL
-PARROT_WARN_UNUSED_RESULT
 PMC* Parrot_find_pad(PARROT_INTERP,
     ARGIN(STRING *lex_name),
     ARGIN(PMC *ctx))

Modified: trunk/src/gc/alloc_register.c
==============================================================================
--- trunk/src/gc/alloc_register.c	Sun Sep  6 11:35:37 2009	(r41061)
+++ trunk/src/gc/alloc_register.c	Sun Sep  6 11:56:58 2009	(r41062)
@@ -294,6 +294,25 @@
     CURRENT_CONTEXT(interp) = old;
 }
 
+/*
+
+=item C<size_t Parrot_pcc_calculate_context_size(PARROT_INTERP, const UINTVAL
+*number_regs_used)>
+
+Calculate size of Context.
+
+=cut
+
+*/
+size_t
+Parrot_pcc_calculate_context_size(SHIM_INTERP, ARGIN(const UINTVAL *number_regs_used))
+{
+    return ALIGNED_CTX_SIZE + ROUND_ALLOC_SIZE(
+            sizeof (INTVAL)   * number_regs_used[REGNO_INT] +
+            sizeof (FLOATVAL) * number_regs_used[REGNO_NUM] +
+            sizeof (STRING *) * number_regs_used[REGNO_STR] +
+            sizeof (PMC *)    * number_regs_used[REGNO_PMC]);
+}
 
 /*
 
@@ -330,7 +349,12 @@
     const size_t reg_alloc     = ROUND_ALLOC_SIZE(all_regs_size);
 
     const size_t to_alloc = reg_alloc + ALIGNED_CTX_SIZE;
-    ctx                   = (Parrot_Context *)mem_sys_allocate(to_alloc);
+
+#ifdef GC_USE_FIXED_SIZE_ALLOCATOR
+    ctx  = (Parrot_Context *)Parrot_gc_allocate_fixed_size_storage(interp, to_alloc);
+#else
+    ctx  = (Parrot_Context *)mem_sys_allocate(to_alloc);
+#endif
 
     ctx->n_regs_used[REGNO_INT] = number_regs_used[REGNO_INT];
     ctx->n_regs_used[REGNO_NUM] = number_regs_used[REGNO_NUM];

Modified: trunk/src/pmc/context.pmc
==============================================================================
--- trunk/src/pmc/context.pmc	Sun Sep  6 11:35:37 2009	(r41061)
+++ trunk/src/pmc/context.pmc	Sun Sep  6 11:56:58 2009	(r41062)
@@ -126,7 +126,18 @@
     VTABLE void destroy() {
         /* We own this pointer */
         Parrot_Context * const ctx = PMC_data_typed(SELF, Parrot_Context*);
+
+        if (!ctx)
+            return;
+
+#ifdef GC_USE_FIXED_SIZE_ALLOCATOR
+        Parrot_gc_free_fixed_size_storage(interp,
+                Parrot_pcc_calculate_context_size(INTERP, ctx->n_regs_used),
+                ctx);
+#else
         mem_sys_free(ctx);
+#endif
+        PMC_data(SELF) = NULL;
     }
 
 /*


More information about the parrot-commits mailing list