OSDN Git Service

Squashed commit of the following:
authorKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 5 Sep 2019 11:41:04 +0000 (20:41 +0900)
committerKoine Yuusuke(koinec) <koinec@users.osdn.me>
Thu, 5 Sep 2019 11:41:04 +0000 (20:41 +0900)
commit f7d145c67295bef2ec18c311003049c194cd6f25
Author: Koine Yuusuke(koinec) <koinec@users.osdn.me>
Date:   Thu Sep 5 20:40:05 2019 +0900

     (LibGoblin)
      * WorkBackup

commit c2fdd563b21911e4b382f4784b7be34dbf3468bd
Author: Koine Yuusuke(koinec) <koinec@users.osdn.me>
Date:   Thu Sep 5 20:08:46 2019 +0900

     (LibGoblin)
      * WorkBackup

libgoblin/drd64_libgoblin_dwarf_expression.c
libgoblin/drd64_libgoblin_dwarf_expression.h
libgoblin/drd64_libgoblin_type_dwarf.h
libgoblin/test_libgoblin_dwarf_expression.c

index 32fd3e0..e493dab 100644 (file)
@@ -44,9 +44,17 @@ void
        DWARF_Expression_ClearValue(
                        LibGoblin_DWARF_Expression      *p_exp )
 {
+       int             i_id;
+       LibGoblin_DWARF_Expression      *p_next;
+
        assert( NULL != p_exp );
 
-       memset( p_exp, 0x00, sizeof( LibGoblin_DWARF_Expression ) );
+       i_id                    = p_exp->i_id;
+       p_next                  = p_exp->p_next;
+       memset( p_exp, 0x00, sizeof( LibGoblin_DWARF_Expression ) );
+       p_exp->i_id             = i_id;
+       p_exp->p_next   = p_next;
+
        return;
 }
 
@@ -93,22 +101,19 @@ DWord
        Byte    b_reg;
        Byte    *pb_now;
        QWord   qw_remain;
-       DWord   dw_depth;
        DWord   dw_value;
        QWord   qw_value;
        QWord   qw_temp;
        Int64   ii_value;
        Int64   ii_temp;
-       LibGoblin_DWARF_Expression_Stack
-                                       t_stack[LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH];
 
-#define        PUSH_DWARF(n)           {t_stack[dw_depth++].value.qw_value = (n);} 
-#define        PUSH_DWARF_SIGN(n)      \
-               { t_stack[dw_depth].value.ii_value = (n); \
-                 t_stack[dw_depth].b_flag = LIBGOBLIN_DWARF_STACK_SIGN; \
-                 dw_depth++; } 
-#define        POP_DWARF()             t_stack[dw_depth--].value.qw_value 
-#define        POP_DWARF_SIGN()        t_stack[dw_depth--].value.ii_value 
+#define        PUSH_DWARF(m,n)         {(m)->t_stack[(m)->dw_depth++].value.qw_value = (n);} 
+#define        PUSH_DWARF_SIGN(m,n)    \
+               { (m)->t_stack[(m)->dw_depth].value.ii_value = (n); \
+                 (m)->t_stack[(m)->dw_depth].b_flag = LIBGOBLIN_DWARF_STACK_SIGN; \
+                 (m)->dw_depth++; } 
+#define        POP_DWARF(m)            (m)->t_stack[(m)->dw_depth--].value.qw_value 
+#define        POP_DWARF_SIGN(m)       (m)->t_stack[(m)->dw_depth--].value.ii_value 
 
        // ------------------------
        if( NULL == p_exp )     {
@@ -121,14 +126,14 @@ DWord
 
        // ------------------------
        pb_now                                  = pb_data;
-       dw_depth                                = 0;
+       //dw_depth                              = 0;
        qw_remain                               = (( 0 == dw_size ) ? 512 : (QWord)dw_size );
        qw_value                                = 0x00000000;
        p_exp->result.qw_value  = 0x00000000;
        p_exp->dw_requested             = LIBGOBLIN_DWARF_DATA_NONE;
-       p_exp->dw_status                        = LIBGOBLIN_DWARF_STATUS_ERROR;
-
-       memset( &t_stack, 0x00,
+       p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_ERROR;
+       p_exp->dw_depth                 = 0;
+       memset( &((p_exp)->t_stack), 0x00,
                sizeof( LibGoblin_DWARF_Expression_Stack ) * LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH );
 
        do      {
@@ -138,7 +143,7 @@ DWord
                switch( b_opcode )      {
                        case DW_OP_addr:                                // 0x03
                                if( p_exp->dw_setdata & LIBGOBLIN_DWARF_DATA_ADDRSIZE )
-                                       { PUSH_DWARF( p_exp->dw_addrsize ); }
+                                       { PUSH_DWARF( p_exp,  p_exp->dw_addrsize ); }
                                else
                                        { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_ADDRSIZE; }
                                break;
@@ -147,80 +152,80 @@ DWord
                        case DW_OP_const1u:                             // 0x08
                                qw_value        = (QWord)*pb_now++;
                                qw_remain--;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const1s:                             // 0x09
                                ii_value        = (Int64)*((char *)pb_now);
                                pb_now++;
                                qw_remain--;
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const2u:                             // 0x0a
                                qw_value        = (QWord)*((Word *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const2s:                             // 0x0b
                                ii_value        = (Int64)*((short *)pb_now);
                                pb_now          += 2;
                                qw_remain       -= 2;
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const4u:                             // 0x0c
                                qw_value        = (QWord)*((DWord *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const4s:                             // 0x0d
                                ii_value        = (Int64)*((int *)pb_now);
                                pb_now          += 4;
                                qw_remain       -= 4;
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_const8u:                             // 0x0e
                                qw_value        = (QWord)*((QWord *)pb_now);
                                pb_now          += 8;
                                qw_remain       -= 8;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_const8s:                             // 0x0f
                                ii_value        = (Int64)*((Int64 *)pb_now);
                                pb_now          += 8;
                                qw_remain       -= 8;
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
                        case DW_OP_constu:                              // 0x10
                                pb_now  = DWARF_Common_DecodeULEB128( &qw_value, pb_now, &qw_remain );
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
                        case DW_OP_consts:                              // 0x11
                                pb_now  = DWARF_Common_DecodeLEB128( &ii_value, pb_now, &qw_remain );
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
 
                        case DW_OP_dup:                                 // 0x12
-                               if( 0 == dw_depth )
+                               if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               qw_value        = t_stack[dw_depth - 1].value.qw_value;
-                               PUSH_DWARF( qw_value );
+                               qw_value        = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_drop:                                // 0x13
-                               if( 0 == dw_depth )
+                               if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                               qw_value        = POP_DWARF();
+                               qw_value        = POP_DWARF( p_exp );
                                break;
 
                        case DW_OP_over:                                // 0x14
-                               if( 2 > dw_depth )
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               dw_value        = dw_depth - 2;
-                               qw_value        = t_stack[dw_value].value.qw_value;
-                               PUSH_DWARF( qw_value );
+                               dw_value        = p_exp->dw_depth - 2;
+                               qw_value        = p_exp->t_stack[dw_value].value.qw_value;
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_pick:                                // 0x15
@@ -228,34 +233,34 @@ DWord
                                b_value = *pb_now++;
                                qw_remain--;
 
-                               if( dw_depth < (DWord)b_value )
+                               if( p_exp->dw_depth < (DWord)b_value )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               dw_value        = dw_depth - (DWord)b_value;
-                               qw_value        = t_stack[dw_value].value.qw_value;
-                               PUSH_DWARF( qw_value );
+                               dw_value        = p_exp->dw_depth - (DWord)b_value;
+                               qw_value        = p_exp->t_stack[dw_value].value.qw_value;
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_swap:                                // 0x16
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 2 > dw_depth )
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                               qw_value        = t_stack[dw_depth - 2].value.qw_value;
-                               t_stack[dw_depth - 2].value.qw_value
-                                                       = t_stack[dw_depth - 1].value.qw_value;
-                               t_stack[dw_depth - 1].value.qw_value    = qw_value;
+                               qw_value        = p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value;
+                               p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value
+                                                       = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
+                               p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value      = qw_value;
                                break;
 
                        case DW_OP_rot:                                 // 0x17
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 3 > dw_depth )
+                               if( 3 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                               qw_value        = t_stack[dw_depth - 1].value.qw_value;
-                               t_stack[dw_depth - 1].value.qw_value
-                                                       = t_stack[dw_depth - 2].value.qw_value;
-                               t_stack[dw_depth - 2].value.qw_value
-                                                       = t_stack[dw_depth - 3].value.qw_value;
-                               t_stack[dw_depth - 3].value.qw_value    = qw_value;
+                               qw_value        = p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value;
+                               p_exp->t_stack[p_exp->dw_depth - 1].value.qw_value
+                                                       = p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value;
+                               p_exp->t_stack[p_exp->dw_depth - 2].value.qw_value
+                                                       = p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value;
+                               p_exp->t_stack[p_exp->dw_depth - 3].value.qw_value      = qw_value;
                                break;
 
                        case DW_OP_xderef:                              // 0x18
@@ -263,38 +268,38 @@ DWord
 
                        case DW_OP_abs:                                 // 0x19
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 0 == dw_depth )
+                               if( 0 == p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
-                       if( LIBGOBLIN_DWARF_STACK_SIGN == t_stack[dw_depth].b_flag )    {
-                                       ii_value        = POP_DWARF_SIGN();
+                       if( LIBGOBLIN_DWARF_STACK_SIGN == p_exp->t_stack[p_exp->dw_depth].b_flag )      {
+                                       ii_value        = POP_DWARF_SIGN( p_exp );
                                        if( 0 > ii_value )      { ii_value      *= -1; }
-                                       PUSH_DWARF_SIGN( ii_value );
+                                       PUSH_DWARF_SIGN( p_exp, ii_value );
                                }
                                break;
 
                        case DW_OP_and:                                 // 0x1a
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 2 > dw_depth )
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               qw_value        = POP_DWARF();
-                               qw_temp         = POP_DWARF();
+                               qw_value        = POP_DWARF( p_exp );
+                               qw_temp         = POP_DWARF( p_exp );
                                qw_value        &= qw_temp;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_div:                                 // 0x1b
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 2 > dw_depth )
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               ii_temp         = POP_DWARF_SIGN();
-                               ii_value        = POP_DWARF_SIGN();
+                               ii_temp         = POP_DWARF_SIGN( p_exp );
+                               ii_value        = POP_DWARF_SIGN( p_exp );
                                if( 0 == ii_temp )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
                                ii_value        /= ii_temp;
-                               PUSH_DWARF_SIGN( ii_value );
+                               PUSH_DWARF_SIGN( p_exp, ii_value );
                                break;
 
                        case DW_OP_minus:                               // 0x1c
@@ -309,13 +314,13 @@ DWord
                                break;
                        case DW_OP_or:                                  // 0x21
                                // 2019/09/03 Lunch-Coding (Required TEST!!)
-                               if( 2 > dw_depth )
+                               if( 2 > p_exp->dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
 
-                               qw_value        = POP_DWARF();
-                               qw_temp         = POP_DWARF();
+                               qw_value        = POP_DWARF( p_exp );
+                               qw_temp         = POP_DWARF( p_exp );
                                qw_value        |= qw_temp;
-                               PUSH_DWARF( qw_value );
+                               PUSH_DWARF( p_exp, qw_value );
                                break;
 
                        case DW_OP_plus:                                // 0x22
@@ -380,7 +385,7 @@ DWord
                        case DW_OP_lit30:                               // 0x4e
                        case DW_OP_lit31:                               // 0x4f
                                b_value = b_opcode - DW_OP_lit0;
-                               PUSH_DWARF( (QWord)b_value );
+                               PUSH_DWARF( p_exp, (QWord)b_value );
                                break;
 
                        case DW_OP_reg0:                                // 0x50
@@ -489,7 +494,7 @@ DWord
                                        else
                                                { qw_value      = p_exp->qw_reg[b_reg] + (QWord)ii_value; }
 
-                                       PUSH_DWARF( qw_value );
+                                       PUSH_DWARF( p_exp, qw_value );
                                }
                                else
                                        { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); }
@@ -506,7 +511,7 @@ DWord
                                        else
                                                { qw_value      = p_exp->qw_frame_base + (QWord)ii_value; }
 
-                                       PUSH_DWARF( qw_value );
+                                       PUSH_DWARF( p_exp, qw_value );
                                }
                                else
                                        { p_exp->dw_requested |= LIBGOBLIN_DWARF_DATA_FRAME_BASE; }
@@ -526,7 +531,7 @@ DWord
                                        else
                                                { qw_value      = p_exp->qw_reg[b_reg] + (QWord)ii_value; }
 
-                                       PUSH_DWARF( qw_value );
+                                       PUSH_DWARF( p_exp, qw_value );
                                }
                                else
                                        { p_exp->dw_requested |= (LIBGOBLIN_DWARF_DATA_REG | b_reg); }
@@ -595,9 +600,9 @@ DWord
 
        if( LIBGOBLIN_DWARF_DATA_NONE != p_exp->dw_requested )
                { p_exp->dw_status      = LIBGOBLIN_DWARF_STATUS_REQUESTED; }
-       else if( 0 < dw_depth ) {
+       else if( 0 < p_exp->dw_depth )  {
                p_exp->dw_status                = LIBGOBLIN_DWARF_STATUS_EVALUATED;
-               p_exp->result.qw_value  = t_stack[ dw_depth - 1 ].value.qw_value;
+               p_exp->result.qw_value  = p_exp->t_stack[ p_exp->dw_depth - 1 ].value.qw_value;
        }
 
 goto_DWARF_Expression_Evaluate_post:
@@ -605,4 +610,105 @@ goto_DWARF_Expression_Evaluate_post:
 }
 
 
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+LibGoblin_DWARF_Expression *
+       DWARF_Expression_Alloc(
+                       void )
+{
+       int             i_id;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       if( NULL == gp_dweempty )       {
+               return NULL;
+       }
+
+       p_exp           = gp_dweempty;
+       gp_dweempty     = p_exp->p_next;
+
+       i_id            = p_exp->i_id;
+       memset( p_exp, 0x00, sizeof( LibGoblin_DWARF_Expression ) );
+       p_exp->i_id             = i_id;
+       p_exp->p_next   = NULL;
+
+       return p_exp;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+int
+       DWARF_Expression_Free(
+                       LibGoblin_DWARF_Expression *p_exp )
+{
+       LibGoblin_DWARF_Expression      *p_next;
+
+       if( NULL == p_exp )     {
+               return -0x01;
+       }
+
+       assert( NULL == p_exp->p_next );
+
+       p_next                  = gp_dweempty;
+       gp_dweempty             = p_exp;
+       p_exp->p_next   = p_next;
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+int
+       DWARF_Expression_Init(
+                       void )
+{
+       int             i_cnt;
+       DWord   dw_size;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       if( NULL != gp_dwexpression )   {
+               return -0x01;
+       }
+
+       dw_size = sizeof( LibGoblin_DWARF_Expression )
+                                               * LIBGOBLIN_DWARF_EXPRESSION_UNITS;
+       gp_dwexpression = (LibGoblin_DWARF_Expression *)malloc( dw_size );
+       if( NULL == gp_dwexpression )   {
+               return -0x02;
+       }
+       memset( gp_dwexpression, 0x00, dw_size );
+
+       for( i_cnt = 0; i_cnt < LIBGOBLIN_DWARF_EXPRESSION_UNITS; i_cnt++ )     {
+               p_exp                   = gp_dwexpression + i_cnt;      
+               p_exp->i_id             = i_cnt;
+               p_exp->p_next   = gp_dwexpression + i_cnt + 1;
+       }
+       p_exp->p_next           = NULL;
+
+       gp_dweempty                             = gp_dwexpression;
+
+       return 0x00;
+}
+
+
+/*----------------------------------------------------------------------
+----------------------------------------------------------------------*/
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+int
+       DWARF_Expression_Term(
+                       void )
+{
+       assert( NULL != gp_dwexpression );
+       free( gp_dwexpression );
+
+       gp_dwexpression                 = NULL;
+
+       return 0x00;
+}
+
+
 /* EOF of drd64_.c ----------------------------------- */
index bddf131..5c8299e 100644 (file)
@@ -45,6 +45,13 @@ Comment:
        #define LIBGOBLIN_DWARF_EXPRESSION_EXTERN       extern
 #endif
 
+#define        LIBGOBLIN_DWARF_EXPRESSION_UNITS        32
+
+#ifdef DRD64_SRC_LIBGOBLIN_DWARF_EXPRESSION
+       LibGoblin_DWARF_Expression      *gp_dwexpression        = NULL;
+       LibGoblin_DWARF_Expression      *gp_dweempty            = NULL;
+#endif
+
 LIBGOBLIN_DWARF_EXPRESSION_EXTERN
        void DWARF_Expression_ClearValue( LibGoblin_DWARF_Expression *p_exp );
 LIBGOBLIN_DWARF_EXPRESSION_EXTERN
@@ -54,6 +61,15 @@ LIBGOBLIN_DWARF_EXPRESSION_EXTERN
        DWord DWARF_Expression_Evaluate(
                                LibGoblin_DWARF_Expression *p_exp, Byte *pb_data, DWord dw_size );
 
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       LibGoblin_DWARF_Expression *DWARF_Expression_Alloc( void );
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       int DWARF_Expression_Free( LibGoblin_DWARF_Expression *p_exp );
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       int DWARF_Expression_Init( void );
+LIBGOBLIN_DWARF_EXPRESSION_EXTERN
+       int DWARF_Expression_Term( void );
+
 
 #endif /* DRD64_HEADER_LIBGOBLIN_BINFO */
 
index 6f0405a..685cafc 100644 (file)
@@ -38,7 +38,7 @@ Comment:
 #define DRD64_HEADER_LIBGOBLIN_TYPE_DWARF
 
 /*=====================================================================*/
-#define        LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH  32
+#define        LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH  256
 
 #define        LIBGOBLIN_DWARF_STATUS_EVALUATED        0x00
 #define        LIBGOBLIN_DWARF_STATUS_REQUESTED        0x01
@@ -62,6 +62,10 @@ typedef      struct  {
 
 /*=====================================================================*/
 typedef        struct  {
+       // Internal Data ---
+       int             i_id;
+       void    *p_next;
+
        DWord   dw_status;
        DWord   dw_requested;
        DWord   dw_setdata;
@@ -75,6 +79,11 @@ typedef      struct  {
        QWord   qw_reg[32];             // for DW_OP_bregX
        DWord   dw_addrsize;    // for DW_OP_addr
        QWord   qw_frame_base;  // for DW_OP_fbreg (value is DW_AT_frame_base)
+
+
+       DWord   dw_depth;
+       LibGoblin_DWARF_Expression_Stack        t_stack[ LIBGOBLIN_DWARF_EXPRESSION_STACK_DEPTH ];
+
 } LibGoblin_DWARF_Expression;
 
 /*=====================================================================*/
index e861b28..18b23a5 100644 (file)
@@ -38,6 +38,76 @@ Comment:
 #include"drd64_libgoblin.h"
 #include"test_libgoblin.h"
 
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_InitTerm_test00_001( void )
+{
+       int             i_result;
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( -0x01 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+       
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+       
+       return;
+}
+
+
+/*--------------------------------------------------------------------*/
+void Test_LibGoblin_DWARF_Expression_AllocFree_test00_001( void )
+{
+       int             i_cnt;
+       int             i_result;
+       LibGoblin_DWARF_Expression      *p_exp[32 + 3];
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt++ )   {
+               p_exp[ i_cnt ]  = DWARF_Expression_Alloc();
+               CU_ASSERT( NULL != p_exp[ i_cnt ] );
+               CU_ASSERT( i_cnt == p_exp[ i_cnt ]->i_id );
+       }
+       p_exp[ 32 ]     = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL == p_exp[ 32 ] );
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt++ )   {
+               i_result        = DWARF_Expression_Free( p_exp[ i_cnt ] );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt++ )   {
+               p_exp[ i_cnt ]  = DWARF_Expression_Alloc();
+               CU_ASSERT( NULL != p_exp[ i_cnt ] );
+               CU_ASSERT( (31 - i_cnt) == p_exp[ i_cnt ]->i_id );
+       }
+       p_exp[ 32 ]     = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL == p_exp[ 32 ] );
+
+       for( i_cnt = 0; i_cnt < 32; i_cnt++ )   {
+               i_result        = DWARF_Expression_Free( p_exp[ i_cnt ] );
+               CU_ASSERT( 0x00 == i_result );
+       }
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+
+       return;
+}
+
+
 /*----------------------------------------------------------------------
 ----------------------------------------------------------------------*/
 void Test_LibGoblin_DWARF_Expression_CheckStruct(
@@ -67,18 +137,25 @@ void Test_LibGoblin_DWARF_Expression_CheckStruct(
 void Test_LibGoblin_DWARF_Expression_CheckLitX(
                                        Byte b_opcode, QWord qw_value )
 {
+       int             i_result;
        Byte    b_data[2];
        DWord   dw_result;
-       LibGoblin_DWARF_Expression      t_exp;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
 
        b_data[0]       = b_opcode;
 
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == qw_value );
+       CU_ASSERT( p_exp->result.qw_value == qw_value );
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
 
        return;
 }
@@ -86,9 +163,10 @@ void Test_LibGoblin_DWARF_Expression_CheckLitX(
 /*--------------------------------------------------------------------*/
 void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
 {
+       int             i_result;
        Byte    b_data[16];
        DWord   dw_result;
-       LibGoblin_DWARF_Expression      t_exp;
+       LibGoblin_DWARF_Expression      *p_exp;
        short   *ps_value;
        Word    *pw_value;
        int             *pi_value;
@@ -96,6 +174,8 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        Int64   *pii_value;
        QWord   *pqw_value;
 
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
 
        // DW_OP_lit0 - lit31 ---------
        Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit0,  0 );
@@ -134,134 +214,140 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
        Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit30,30 );
        Test_LibGoblin_DWARF_Expression_CheckLitX( DW_OP_lit31,31 );
 
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
+
        // DW_OP_addr ------------------
        b_data[0]       = DW_OP_addr;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                LIBGOBLIN_DWARF_DATA_ADDRSIZE, LIBGOBLIN_DWARF_DATA_NONE );
 
-       t_exp.dw_addrsize       = 8;
-       t_exp.dw_setdata        |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       p_exp->dw_addrsize      = 8;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_ADDRSIZE;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_ADDRSIZE );
-       CU_ASSERT( t_exp.result.qw_value == 8 );
+       CU_ASSERT( p_exp->result.qw_value == 8 );
 
        // DW_OP_const1u --------------
        b_data[0]       = DW_OP_const1u;
        b_data[1]       = 0x12;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 0x12 );
+       CU_ASSERT( p_exp->result.qw_value == 0x12 );
        
        // DW_OP_const1s --------------
        b_data[0]       = DW_OP_const1s;
        b_data[1]       = (Byte)((char)-1);
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.ii_value == -1 );
+       CU_ASSERT( p_exp->result.ii_value == -1 );
        
        // DW_OP_const2u --------------
        b_data[0]       = DW_OP_const2u;
        pw_value        = (Word *)&(b_data[1]);
        *pw_value       = 0x1234;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 0x1234 );
+       CU_ASSERT( p_exp->result.qw_value == 0x1234 );
        
        // DW_OP_const2s --------------
        b_data[0]       = DW_OP_const2s;
        ps_value        = (short *)&(b_data[1]);
        *ps_value       = -12345;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.ii_value == -12345 );
+       CU_ASSERT( p_exp->result.ii_value == -12345 );
 
        // DW_OP_const4u --------------
        b_data[0]       = DW_OP_const4u;
        pdw_value       = (DWord *)&(b_data[1]);
        *pdw_value      = 0x12345678;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 5 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 5 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 0x12345678 );
+       CU_ASSERT( p_exp->result.qw_value == 0x12345678 );
        
        // DW_OP_const4s --------------
        b_data[0]       = DW_OP_const4s;
        pi_value        = (int *)&(b_data[1]);
        *pi_value       = -1234567890;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 5 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 5 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.ii_value == -1234567890 );
+       CU_ASSERT( p_exp->result.ii_value == -1234567890 );
 
        // DW_OP_const8u --------------
        b_data[0]       = DW_OP_const8u;
        pqw_value       = (QWord *)&(b_data[1]);
        *pqw_value      = 0x1234567890abcdef;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 9 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 9 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value ==  0x1234567890abcdef );
+       CU_ASSERT( p_exp->result.qw_value ==  0x1234567890abcdef );
        
        // DW_OP_const8s --------------
        b_data[0]       = DW_OP_const8s;
        pii_value       = (Int64 *)&(b_data[1]);
        *pii_value      = -123456789012345;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 9 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 9 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.ii_value == -123456789012345 );
+       CU_ASSERT( p_exp->result.ii_value == -123456789012345 );
 
        // DW_OP_constu --------------
        b_data[0]       = DW_OP_constu;
        b_data[1]       = 0xb9;
        b_data[2]       = 0x64;         // value = 12857 (0xb9 0x64)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 12857 );
+       CU_ASSERT( p_exp->result.qw_value == 12857 );
        
        // DW_OP_consts --------------
        b_data[0]       = DW_OP_consts;
        b_data[1]       = 0xff;
        b_data[2]       = 0x7e;         // value = -129 (0xff 0x7e)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.ii_value == -129 );
+       CU_ASSERT( p_exp->result.ii_value == -129 );
        
-/*
-       printf( "  [DEBUG] DWARF Expression: status= %2xh, requested= %2xh, setdata=%2xh, result= %8xh\n",
-                       t_exp.dw_status, t_exp.dw_requested, t_exp.dw_setdata, t_exp.qw_result );
-*/
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
 
        return;
 }
@@ -270,42 +356,50 @@ void Test_LibGoblin_DWARF_Expression_Constant_test00_001( void )
 /*--------------------------------------------------------------------*/
 void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode )
 {
+       int             i_result;
        Byte    b_reg;
        Byte    b_data[16];
        DWord   dw_result;
-       LibGoblin_DWARF_Expression      t_exp;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
+
        
        b_reg   = b_opcode - DW_OP_breg0;
 
        b_data[0]       = b_opcode;
        b_data[1]       = 0x81;
        b_data[2]       = 0x01;         // value = 129 (0x81 0x01)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                (LIBGOBLIN_DWARF_DATA_REG | b_reg), LIBGOBLIN_DWARF_DATA_NONE );
 
-       t_exp.qw_reg[b_reg]     = 0x80000000;
-       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       p_exp->qw_reg[b_reg]    = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
 
 
        b_data[0]       = b_opcode;
        b_data[1]       = 0xff;
        b_data[2]       = 0x7e;         // value = -129 (0xff 0x7e)
-       DWARF_Expression_ClearValue( &t_exp );
-       t_exp.qw_reg[b_reg]     = 0x80000000;
-       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       p_exp->qw_reg[b_reg]    = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | b_reg);
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | b_reg) );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 - 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) );
+
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
 
        return;
 }
@@ -313,40 +407,47 @@ void Test_LibGoblin_DWARF_Expression_RegBase_bregX( Byte b_opcode )
 
 void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
 {
+       int             i_result;
        Byte    b_data[16];
        DWord   dw_result;
-       LibGoblin_DWARF_Expression      t_exp;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
 
        // DW_OP_fbreg --------------
        b_data[0]       = DW_OP_fbreg;
        b_data[1]       = 0x81;
        b_data[2]       = 0x01;         // value = 129 (0x81 0x01)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE );
 
-       t_exp.qw_frame_base     = 0x80000000;
-       t_exp.dw_setdata        |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       p_exp->qw_frame_base    = 0x80000000;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
 
 
        b_data[0]       = DW_OP_fbreg;
        b_data[1]       = 0xff;
        b_data[2]       = 0x7e;         // value = -129 (0xff 0x7e)
-       DWARF_Expression_ClearValue( &t_exp );
-       t_exp.qw_frame_base     = 0x80000000;
-       t_exp.dw_setdata        |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       p_exp->qw_frame_base    = 0x80000000;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 - 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) );
 
 
        // DW_OP_bregX --------------
@@ -389,34 +490,40 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
        b_data[1]       = 0x0a;
        b_data[2]       = 0x81;
        b_data[3]       = 0x01;         // value = 129 (0x81 0x01)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                (LIBGOBLIN_DWARF_DATA_REG | 0x0a), LIBGOBLIN_DWARF_DATA_NONE );
 
-       t_exp.qw_reg[0x0a]      = 0x80000000;
-       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | 0x0a );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       p_exp->qw_reg[0x0a]     = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | 0x0a );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x0a) );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
 
 
        b_data[0]       = DW_OP_bregx;
        b_data[1]       = 0x1f;
        b_data[2]       = 0xff;
        b_data[3]       = 0x7e;         // value = -129 (0xff 0x7e)
-       DWARF_Expression_ClearValue( &t_exp );
-       t_exp.qw_reg[0x1f]      = 0x80000000;
-       t_exp.dw_setdata        |= (LIBGOBLIN_DWARF_DATA_REG | 0x1f );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 4 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       p_exp->qw_reg[0x1f]     = 0x80000000;
+       p_exp->dw_setdata       |= (LIBGOBLIN_DWARF_DATA_REG | 0x1f );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 4 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, (LIBGOBLIN_DWARF_DATA_REG | 0x1f ) );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 - 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 - 129) );
+
 
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
 
        return;
 }
@@ -425,78 +532,87 @@ void Test_LibGoblin_DWARF_Expression_RegBase_test01_001( void )
 /*--------------------------------------------------------------------*/
 void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
 {
+       int             i_result;
        Byte    b_data[16];
        DWord   dw_result;
-       LibGoblin_DWARF_Expression      t_exp;
+       LibGoblin_DWARF_Expression      *p_exp;
+
+
+       i_result        = DWARF_Expression_Init();
+       CU_ASSERT( 0x00 == i_result );
+
+       p_exp           = DWARF_Expression_Alloc();
+       CU_ASSERT( NULL != p_exp );
+
 
        // DW_OP_dup ---------------
        b_data[0]       = DW_OP_dup;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_dup;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 10 );
+       CU_ASSERT( p_exp->result.qw_value == 10 );
 
        // DW_OP_drop ---------------
        b_data[0]       = DW_OP_drop;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_drop;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
 
        b_data[0]       = DW_OP_lit31;
        b_data[1]       = DW_OP_lit10;
        b_data[2]       = DW_OP_drop;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 31 );
+       CU_ASSERT( p_exp->result.qw_value == 31 );
 
        // DW_OP_over ---------------
        b_data[0]       = DW_OP_over;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 1 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 1 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
 
        b_data[0]       = DW_OP_lit10;
        b_data[1]       = DW_OP_over;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 2 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 2 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_ERROR,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
 
        b_data[0]       = DW_OP_lit30;
        b_data[1]       = DW_OP_lit11;
        b_data[2]       = DW_OP_drop;
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_NONE );
-       CU_ASSERT( t_exp.result.qw_value == 30 );
+       CU_ASSERT( p_exp->result.qw_value == 30 );
 
        // DW_OP_pick ---------------
 
@@ -506,21 +622,27 @@ void Test_LibGoblin_DWARF_Expression_StackOperation_test02_001( void )
        b_data[0]       = DW_OP_fbreg;
        b_data[1]       = 0x81;
        b_data[2]       = 0x01;         // value = 129 (0x81 0x01)
-       DWARF_Expression_ClearValue( &t_exp );
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       DWARF_Expression_ClearValue( p_exp );
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_REQUESTED,
                                LIBGOBLIN_DWARF_DATA_FRAME_BASE, LIBGOBLIN_DWARF_DATA_NONE );
 
-       t_exp.qw_frame_base     = 0x80000000;
-       t_exp.dw_setdata        |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
-       dw_result       = DWARF_Expression_Evaluate( &t_exp, b_data, 3 );
-       Test_LibGoblin_DWARF_Expression_CheckStruct( &t_exp,
+       p_exp->qw_frame_base    = 0x80000000;
+       p_exp->dw_setdata       |= LIBGOBLIN_DWARF_DATA_FRAME_BASE;
+       dw_result       = DWARF_Expression_Evaluate( p_exp, b_data, 3 );
+       Test_LibGoblin_DWARF_Expression_CheckStruct( p_exp,
                                LIBGOBLIN_DWARF_STATUS_EVALUATED,
                                LIBGOBLIN_DWARF_DATA_NONE, LIBGOBLIN_DWARF_DATA_FRAME_BASE );
-       CU_ASSERT( t_exp.result.qw_value == (0x80000000 + 129) );
+       CU_ASSERT( p_exp->result.qw_value == (0x80000000 + 129) );
 */
 
+       i_result        = DWARF_Expression_Free( p_exp );
+       CU_ASSERT( 0x00 == i_result );
+
+       i_result        = DWARF_Expression_Term();
+       CU_ASSERT( 0x00 == i_result );
+
        return;
 }
 
@@ -535,7 +657,10 @@ int
        CU_pSuite       pt_goblin;
 
        pt_goblin       = CU_add_suite( "LibGoblin_DWARF_Expression", NULL, NULL );
-
+       CU_add_test( pt_goblin, "Test_LibGoblin_DWARF_Expression_InitTerm_test00_001",
+                                                                       Test_LibGoblin_DWARF_Expression_InitTerm_test00_001 );
+       CU_add_test( pt_goblin, "Test_LibGoblin_DWARF_Expression_AllocFree_test00_001",
+                                                                       Test_LibGoblin_DWARF_Expression_AllocFree_test00_001 );
        CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_Constant_test00_001",
                                                                 Test_LibGoblin_DWARF_Expression_Constant_test00_001 );
        CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_RegBase_test01_001",
@@ -543,7 +668,6 @@ int
        CU_add_test( pt_goblin, "LibGoblin_DWARF_Expression_StackOperation_test02_001",
                                                                 Test_LibGoblin_DWARF_Expression_StackOperation_test02_001 );
 
-
        return 0x00;
 }