Changeset 355

Show
Ignore:
Timestamp:
06/20/08 15:50:40 (2 months ago)
Author:
bart
Message:

Fix disassembler

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • eaccelerator/trunk/ea_dasm.c

    r344 r355  
    3535extern eaccelerator_mm *eaccelerator_mm_instance; 
    3636 
     37#define LOOKUP(arr, index, max, ptr) if (index < max) { ptr = arr[index]; } else { ptr = "UNDEFINED (todo)"; }; 
     38 
    3739/* {{{ static const char *extopnames_declare[] */ 
    3840static const char *extopnames_declare[] = { 
     
    4244        "DECLARE_INHERITED_CLASS"       /* 3 */ 
    4345}; 
     46#define EXTOPNAMES_DECLARE_NUM 4 
     47#define GET_EXTOPNAMES_DECLARE(index, ptr) LOOKUP(extopnames_declare, index, EXTOPNAMES_DECLARE_NUM, ptr) 
    4448/* }}} */ 
    4549 
     
    5761        "IS_CONSTANT_ARRAY"                     /* 9 */ 
    5862}; 
     63#define EXTOPNAMES_CAST_NUM 10 
     64#define GET_EXTOPNAMES_CAST(index, ptr) LOOKUP(extopnames_cast, index, EXTOPNAMES_CAST_NUM, ptr) 
    5965/* }}} */ 
    6066 
     
    6470        "FETCH_ADD_LOCK"                        /* 1 */ 
    6571}; 
     72#define EXTOPNAMES_FETCH_NUM 2 
     73#define GET_EXTOPNAMES_FETCH(index, ptr) LOOKUP(extopnames_fetch, index, EXTOPNAMES_FETCH_NUM, ptr) 
    6674/* }}} */ 
    6775 
     
    7583        "FETCH_CLASS_AUTO"                      /* 5 */ 
    7684}; 
     85#define EXTOPNAMES_FETCH_CLASS_NUM 6 
     86#define GET_EXTOPNAMES_FETCH_CLASS(index, ptr) LOOKUP(extopnames_fetch_class, index, EXTOPNAMES_FETCH_CLASS_NUM, ptr) 
    7787/* }}} */ 
    7888 
     
    8494        "CTOR_CALL"                                     /* 3 */ 
    8595}; 
     96#define EXTOPNAMES_INIT_FCALL_NUM 4 
     97#define GET_EXTOPNAMES_INIT_FCALL(index, ptr) LOOKUP(extopnames_init_fcall, index, EXTOPNAMES_INIT_FCALL_NUM, ptr) 
    8698/* }}} */ 
    8799 
     
    93105        "ARG_SEND_BY_REF | ZEND_ARG_COMPILE_TIME_BOUND" /* 3 */ 
    94106}; 
     107#define EXTOPNAMES_SENDNOREF_NUM 4 
     108#define GET_EXTOPNAMES_SENDNOREF(index, ptr) LOOKUP(extopnames_sendnoref, index, EXTOPNAMES_SENDNOREF_NUM, ptr) 
    95109/* }}} */ 
    96110 
     
    103117    "UNKNOWN 1"                 /* 4 */ 
    104118}; 
     119#define FETCHTYPENAME_NUM 5 
     120#define GET_FETCHTYPENAME(index, ptr) LOOKUP(fetchtypename, index, FETCHTYPENAME_NUM, ptr) 
    105121/* }}} */ 
    106122 
     
    111127        "FE_FETCH_WITH_KEY"                     /* 2 */ 
    112128}; 
     129#define EXTOPNAMES_FE_NUM 3 
     130#define GET_EXTOPNAMES_FE(index, ptr) LOOKUP(extopnames_fe, index, EXTOPNAMES_FE_NUM, ptr) 
    113131/* }}} */ 
    114132 
     
    234252                strncpy(buf, get_opcode_dsc(opline->extended_value)->opname, sizeof(buf)); 
    235253            } else if ((op->ops & EXT_MASK) == EXT_CAST) { 
    236                 strncpy(buf, extopnames_cast[opline->extended_value], sizeof(buf)); 
     254                                const char *ptr = NULL; 
     255                                GET_EXTOPNAMES_CAST(opline->extended_value, ptr); 
     256                strncpy(buf, ptr, sizeof(buf)); 
    237257            } else if ((op->ops & EXT_MASK) == EXT_INIT_FCALL) { 
    238                 strncpy(buf, extopnames_init_fcall[opline->extended_value], sizeof(buf)); 
     258                                const char *ptr = NULL; 
     259                                GET_EXTOPNAMES_INIT_FCALL(opline->extended_value, ptr); 
     260                    strncpy(buf, ptr, sizeof(buf)); 
    239261            } else if ((op->ops & EXT_MASK) == EXT_FETCH) { 
    240                 strncpy(buf, extopnames_fetch[opline->extended_value], sizeof(buf)); 
     262                                const char *ptr = NULL; 
     263                                GET_EXTOPNAMES_FETCH(opline->extended_value, ptr); 
     264                strncpy(buf, ptr, sizeof(buf)); 
    241265            } else if ((op->ops & EXT_MASK) == EXT_FE) { 
    242                 strncpy(buf, extopnames_fe[opline->extended_value], sizeof(buf)); 
     266                                const char *ptr = NULL; 
     267                                GET_EXTOPNAMES_FE(opline->extended_value, ptr); 
     268                strncpy(buf, ptr, sizeof(buf)); 
    243269            } else if ((op->ops & EXT_MASK) == EXT_DECLARE) { 
    244                 strncpy(buf, extopnames_declare[opline->extended_value], sizeof(buf)); 
     270                                const char *ptr = NULL; 
     271                                GET_EXTOPNAMES_DECLARE(opline->extended_value, ptr); 
     272                strncpy(buf, ptr, sizeof(buf)); 
    245273            } else if ((op->ops & EXT_MASK) == EXT_SEND_NOREF) { 
    246                 strncpy(buf, extopnames_sendnoref[opline->extended_value], sizeof(buf)); 
     274                                const char *ptr = NULL; 
     275                                GET_EXTOPNAMES_SENDNOREF(opline->extended_value, ptr); 
     276                strncpy(buf, ptr, sizeof(buf)); 
    247277            } else if ((op->ops & EXT_MASK) == EXT_FCLASS) { 
    248                 // XXX: hack to prevent segfault  
    249                 snprintf(buf, sizeof(buf), "%s", extopnames_fetch_class[opline->extended_value]); 
     278                                const char *ptr = NULL; 
     279                                GET_EXTOPNAMES_FETCH_CLASS(opline->extended_value, ptr); 
     280                snprintf(buf, sizeof(buf), "%s", ptr); 
    250281            } else if ((op->ops & EXT_MASK) == EXT_IFACE) { 
    251282                snprintf(buf, sizeof(buf), "interface(%lu)", opline->extended_value); 
     
    368399                                snprintf(buf, sizeof(buf), "$var%u", VAR_NUM(opline->op2.u.var)); 
    369400                        } else if ((op->ops & OP2_MASK) == OP2_FETCH) { 
     401                                const char *typename = NULL; 
     402                                GET_FETCHTYPENAME(opline->op2.u.EA.type, typename); 
    370403                                if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { 
    371                                         snprintf(buf, sizeof(buf), "%s $class%u", fetchtypename[opline->op2.u.EA.type], VAR_NUM(opline->op2.u.var)); 
     404                                        snprintf(buf, sizeof(buf), "%s $class%u", typename, VAR_NUM(opline->op2.u.var)); 
    372405                                } else { 
    373                                         snprintf(buf, sizeof(buf), "%s", fetchtypename[opline->op2.u.EA.type]); 
     406                                        snprintf(buf, sizeof(buf), "%s", typename); 
    374407                                } 
    375408                        } else if ((op->ops & OP2_MASK) == OP2_INCLUDE) {