OSDN Git Service

(LibGoblin)
authorKoine Yuusuke <koinec@users.osdn.me>
Tue, 3 Sep 2019 03:45:25 +0000 (12:45 +0900)
committerKoine Yuusuke <koinec@users.osdn.me>
Tue, 3 Sep 2019 03:45:25 +0000 (12:45 +0900)
  * Implement: DW_OP_swap/rot/abs/and/or/div (NOT Tested!!)

libgoblin/drd64_libgoblin_dwarf_expression.c

index ceeefd8..32fd3e0 100644 (file)
@@ -96,7 +96,9 @@ DWord
        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];
 
@@ -106,6 +108,7 @@ DWord
                  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 
 
        // ------------------------
        if( NULL == p_exp )     {
@@ -204,11 +207,13 @@ DWord
                                qw_value        = t_stack[dw_depth - 1].value.qw_value;
                                PUSH_DWARF( qw_value );
                                break;
+
                        case DW_OP_drop:                                // 0x13
                                if( 0 == dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
                                qw_value        = POP_DWARF();
                                break;
+
                        case DW_OP_over:                                // 0x14
                                if( 2 > dw_depth )
                                        { goto  goto_DWARF_Expression_Evaluate_post; }
@@ -217,6 +222,7 @@ DWord
                                qw_value        = t_stack[dw_value].value.qw_value;
                                PUSH_DWARF( qw_value );
                                break;
+
                        case DW_OP_pick:                                // 0x15
                                // 2019/09/02 Lunch-Coding (Required TEST!!)
                                b_value = *pb_now++;
@@ -229,18 +235,68 @@ DWord
                                qw_value        = t_stack[dw_value].value.qw_value;
                                PUSH_DWARF( qw_value );
                                break;
+
                        case DW_OP_swap:                                // 0x16
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 2 > 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;
                                break;
+
                        case DW_OP_rot:                                 // 0x17
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 3 > 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;
                                break;
+
                        case DW_OP_xderef:                              // 0x18
                                break;
+
                        case DW_OP_abs:                                 // 0x19
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 0 == 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( 0 > ii_value )      { ii_value      *= -1; }
+                                       PUSH_DWARF_SIGN( ii_value );
+                               }
                                break;
+
                        case DW_OP_and:                                 // 0x1a
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 2 > dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               qw_value        = POP_DWARF();
+                               qw_temp         = POP_DWARF();
+                               qw_value        &= qw_temp;
+                               PUSH_DWARF( qw_value );
                                break;
+
                        case DW_OP_div:                                 // 0x1b
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 2 > dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               ii_temp         = POP_DWARF_SIGN();
+                               ii_value        = POP_DWARF_SIGN();
+                               if( 0 == ii_temp )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               ii_value        /= ii_temp;
+                               PUSH_DWARF_SIGN( ii_value );
                                break;
+
                        case DW_OP_minus:                               // 0x1c
                                break;
                        case DW_OP_mod:                                 // 0x1d
@@ -252,7 +308,16 @@ DWord
                        case DW_OP_not:                                 // 0x20
                                break;
                        case DW_OP_or:                                  // 0x21
+                               // 2019/09/03 Lunch-Coding (Required TEST!!)
+                               if( 2 > dw_depth )
+                                       { goto  goto_DWARF_Expression_Evaluate_post; }
+
+                               qw_value        = POP_DWARF();
+                               qw_temp         = POP_DWARF();
+                               qw_value        |= qw_temp;
+                               PUSH_DWARF( qw_value );
                                break;
+
                        case DW_OP_plus:                                // 0x22
                                break;
                        case DW_OP_plus_uconst:                 // 0x23