From 2ea6df9752c1f6da1809dedbc68f525238dc24a8 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Tue, 17 Jan 2017 18:54:33 -0500 Subject: [PATCH] memory management --- c/containers/local_stack.c | 2 +- c/containers/xvfuncs.c | 51 ++++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/c/containers/local_stack.c b/c/containers/local_stack.c index 7dc7e20c9..047e35353 100644 --- a/c/containers/local_stack.c +++ b/c/containers/local_stack.c @@ -288,7 +288,7 @@ void local_stack_frame_assign_extended_nonindexed(local_stack_frame_t* pframe, // ---------------------------------------------------------------- void local_stack_frame_assign_extended_indexed(local_stack_frame_t* pframe, int vardef_frame_relative_index, sllmv_t* pmvkeys, - mlhmmv_xvalue_t new_value) // xxx by ptr + mlhmmv_xvalue_t new_value) { LOCAL_STACK_TRACE(printf("LOCAL STACK FRAME %p SET %d\n", pframe, vardef_frame_relative_index)); LOCAL_STACK_BOUNDS_CHECK(pframe, "ASSIGN", TRUE, vardef_frame_relative_index); diff --git a/c/containers/xvfuncs.c b/c/containers/xvfuncs.c index ce5b6e522..22553b48f 100644 --- a/c/containers/xvfuncs.c +++ b/c/containers/xvfuncs.c @@ -4,32 +4,43 @@ // ---------------------------------------------------------------- boxed_xval_t b_xx_haskey_xfunc(boxed_xval_t* pmapval, boxed_xval_t* pkeyval) { + boxed_xval_t rv; if (pmapval->xval.is_terminal) { - return box_ephemeral_val(mv_from_bool(FALSE)); + rv = box_ephemeral_val(mv_from_bool(FALSE)); } else if (!pkeyval->xval.is_terminal) { - return box_ephemeral_val(mv_from_bool(FALSE)); + rv = box_ephemeral_val(mv_from_bool(FALSE)); } else { - return box_ephemeral_val( + rv = box_ephemeral_val( mv_from_bool( mlhmmv_level_has_key(pmapval->xval.pnext_level, &pkeyval->xval.terminal_mlrval) ) ); } + if (pmapval->is_ephemeral) + mlhmmv_xvalue_free(&pmapval->xval); + if (pkeyval->is_ephemeral) + mlhmmv_xvalue_free(&pkeyval->xval); + return rv; } // ---------------------------------------------------------------- -boxed_xval_t i_x_length_xfunc(boxed_xval_t* pxval1) { - if (pxval1->xval.is_terminal) { - return box_ephemeral_val( +// xxx memmgt +boxed_xval_t i_x_length_xfunc(boxed_xval_t* pbxval1) { + boxed_xval_t rv; + if (pbxval1->xval.is_terminal) { + rv = box_ephemeral_val( mv_from_int(1) ); } else { - return box_ephemeral_val( + rv = box_ephemeral_val( mv_from_int( - pxval1->xval.pnext_level->num_occupied + pbxval1->xval.pnext_level->num_occupied ) ); } + if (pbxval1->is_ephemeral) + mlhmmv_xvalue_free(&pbxval1->xval); + return rv; } // ---------------------------------------------------------------- @@ -47,11 +58,16 @@ static int depth_aux(mlhmmv_xvalue_t* pxval) { } boxed_xval_t i_x_depth_xfunc(boxed_xval_t* pbxval1) { - return box_ephemeral_val( + boxed_xval_t rv = box_ephemeral_val( mv_from_int( depth_aux(&pbxval1->xval) ) ); + + if (pbxval1->is_ephemeral) + mlhmmv_xvalue_free(&pbxval1->xval); + + return rv; } // ---------------------------------------------------------------- @@ -67,16 +83,21 @@ static int leafcount_aux(mlhmmv_xvalue_t* pxval) { } } -// xxx memmgt boxed_xval_t i_x_leafcount_xfunc(boxed_xval_t* pbxval1) { - return box_ephemeral_val( + boxed_xval_t rv = box_ephemeral_val( mv_from_int( leafcount_aux(&pbxval1->xval) ) ); + + if (pbxval1->is_ephemeral) + mlhmmv_xvalue_free(&pbxval1->xval); + + return rv; } // ---------------------------------------------------------------- +// xxx memmgt boxed_xval_t variadic_mapsum_xfunc(boxed_xval_t* pbxvals, int nxvals) { // xxx to-do optmization: transfer arg 1 if it's ephemeral mlhmmv_xvalue_t sum = mlhmmv_xvalue_alloc_empty_map(); @@ -95,6 +116,7 @@ boxed_xval_t variadic_mapsum_xfunc(boxed_xval_t* pbxvals, int nxvals) { } // ---------------------------------------------------------------- +// xxx memmgt boxed_xval_t variadic_mapdiff_xfunc(boxed_xval_t* pbxvals, int nxvals) { mlhmmv_xvalue_t diff = mlhmmv_xvalue_alloc_empty_map(); if (nxvals == 0) { @@ -128,6 +150,7 @@ boxed_xval_t variadic_mapdiff_xfunc(boxed_xval_t* pbxvals, int nxvals) { } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that both arguments are string-valued terminals. boxed_xval_t m_ss_splitnv_xfunc(boxed_xval_t* pstringval, boxed_xval_t* psepval) { mlhmmv_xvalue_t map = mlhmmv_xvalue_alloc_empty_map(); @@ -148,6 +171,7 @@ boxed_xval_t m_ss_splitnv_xfunc(boxed_xval_t* pstringval, boxed_xval_t* psepval) } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that both arguments are string-valued terminals. boxed_xval_t m_ss_splitnvx_xfunc(boxed_xval_t* pstringval, boxed_xval_t* psepval) { mlhmmv_xvalue_t map = mlhmmv_xvalue_alloc_empty_map(); @@ -169,6 +193,7 @@ boxed_xval_t m_ss_splitnvx_xfunc(boxed_xval_t* pstringval, boxed_xval_t* psepval } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that all arguments are string-valued terminals. boxed_xval_t m_sss_splitkv_xfunc(boxed_xval_t* pstringval, boxed_xval_t* ppairsepval, boxed_xval_t* plistsepval) { mlhmmv_xvalue_t map = mlhmmv_xvalue_alloc_empty_map(); @@ -200,6 +225,7 @@ boxed_xval_t m_sss_splitkv_xfunc(boxed_xval_t* pstringval, boxed_xval_t* ppairse } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that all arguments are string-valued terminals. boxed_xval_t m_sss_splitkvx_xfunc(boxed_xval_t* pstringval, boxed_xval_t* ppairsepval, boxed_xval_t* plistsepval) { mlhmmv_xvalue_t map = mlhmmv_xvalue_alloc_empty_map(); @@ -234,6 +260,7 @@ boxed_xval_t m_sss_splitkvx_xfunc(boxed_xval_t* pstringval, boxed_xval_t* ppairs #define SB_JOIN_ALLOC_SIZE 128 // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that the separator is a string-valued terminal. boxed_xval_t s_ms_joink_xfunc(boxed_xval_t* pmapval, boxed_xval_t* psepval) { if (pmapval->xval.is_terminal) { @@ -262,6 +289,7 @@ boxed_xval_t s_ms_joink_xfunc(boxed_xval_t* pmapval, boxed_xval_t* psepval) { } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that the separator is a string-valued terminal. boxed_xval_t s_ms_joinv_xfunc(boxed_xval_t* pmapval, boxed_xval_t* psepval) { if (pmapval->xval.is_terminal) { @@ -292,6 +320,7 @@ boxed_xval_t s_ms_joinv_xfunc(boxed_xval_t* pmapval, boxed_xval_t* psepval) { } // ---------------------------------------------------------------- +// xxx memmgt // Precondition: the caller has ensured that the separators are string-valued terminals. boxed_xval_t s_mss_joinkv_xfunc(boxed_xval_t* pmapval, boxed_xval_t* ppairsepval, boxed_xval_t* plistsepval) { if (pmapval->xval.is_terminal) {