Changeset 44

Show
Ignore:
Timestamp:
12/27/04 15:02:31 (4 years ago)
Author:
segv74
Message:

1. pretty disassembler's output
2. change FE_FETCH's opcode type from EXT_FETCH to EXT_FE (FE = foreach)

Files:

Legend:

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

    r35 r44  
    57675767}; 
    57685768 
     5769static const char* extopnames_fe[] = { 
     5770  "",                         /* 0 */ 
     5771  "FE_FETCH_BYREF",           /* 1 */ 
     5772  "FE_FETCH_WITH_KEY"         /* 2 */ 
     5773}; 
     5774 
    57695775static void dump_write(const char* s, uint len) { 
    57705776  uint i = 0; 
     
    58885894} 
    58895895 
     5896static const char *color_list[] = { 
     5897  "#FF0000", 
     5898  "#00FF00", 
     5899  "#0000FF", 
     5900  "#FFFF00", 
     5901  "#00FFFF", 
     5902  "#FF00FF", 
     5903  "#800000", 
     5904  "#008000", 
     5905  "#000080", 
     5906  "#808000", 
     5907  "#008080", 
     5908  "#800080" 
     5909}; 
     5910 
     5911static char *color(int num) { 
     5912  return color_list[num % (sizeof(color_list)/sizeof(char *))]; 
     5913} 
     5914 
     5915static char *get_file_contents(char *filename) 
     5916{ 
     5917  struct stat st; 
     5918  char *buf; 
     5919  FILE *fp; 
     5920 
     5921  if (stat(filename, &st) == -1) 
     5922    return NULL; 
     5923 
     5924  buf = emalloc(st.st_size); 
     5925  if (buf == NULL) 
     5926    return NULL; 
     5927 
     5928  fp = fopen(filename, "rb"); 
     5929  fread(buf, 1, st.st_size, fp); 
     5930  fclose(fp); 
     5931 
     5932  return buf; 
     5933} 
     5934 
     5935static void print_file_line(char *p, int line) 
     5936{ 
     5937  char *s; 
     5938 
     5939  if (p == NULL) { 
     5940    zend_printf("..can't open file.."); 
     5941    return; 
     5942  } 
     5943 
     5944  while (line > 0 && *p) { 
     5945    if (*p == '\n') { 
     5946      line --; 
     5947    } 
     5948    else if (line == 1) { 
     5949      if (*p == '<') 
     5950        zend_printf("&lt;"); 
     5951      else if (*p == '>') 
     5952        zend_printf("&gt;"); 
     5953      else 
     5954        zend_printf("%c", *p); 
     5955    } 
     5956 
     5957    p++; 
     5958  } 
     5959} 
     5960 
    58905961static void dump_op_array(eaccelerator_op_array* p TSRMLS_DC) { 
    58915962  zend_op *opline; 
    58925963  zend_op *end; 
     5964  char *filebuf; 
     5965  unsigned last_line = 0; 
    58935966 
    58945967#ifdef ZEND_ENGINE_2 
    5895   zend_printf("T = %u, size = %u\n, brk_count = %u<br>\n", p->T, p->last, p->last_brk_cont); 
    5896 #else 
    5897   zend_printf("T = %u, size = %u\n, uses_globals = %d, brk_count = %u<br>\n", p->T, p->last ,p->uses_globals, p->last_brk_cont); 
     5968  zend_printf("T = %u, size = %u\n, brk_count = %u, file = %s<br>\n", p->T, p->last, p->last_brk_cont, p->filename); 
     5969#else 
     5970  zend_printf("T = %u, size = %u\n, uses_globals = %d, brk_count = %u, file = %s<br>\n", p->T, p->last ,p->uses_globals, p->last_brk_cont, p->filename); 
    58985971#endif 
    58995972 
     
    59195992    end = opline + p->last; 
    59205993 
     5994    filebuf = get_file_contents(p->filename); 
     5995 
    59215996    ZEND_PUTS("<table border=\"0\" cellpadding=\"3\" cellspacing=\"1\" width=\"900\" bgcolor=\"#000000\" align=\"center\" style=\"table-layout:fixed\">\n"); 
    59225997    ZEND_PUTS("<thead valign=\"middle\" bgcolor=\"#9999cc\"><tr><th width=\"40\">N</th><th width=\"160\">OPCODE</th><th width=\"160\">EXTENDED_VALUE</th><th width=\"220\">OP1</th><th width=\"220\">OP2</th><th width=\"80\">RESULT</th></tr></thead>\n"); 
     
    59245999    for (;opline < end; opline++) { 
    59256000      const opcode_dsc* op = get_opcode_dsc(opline->opcode); 
     6001 
     6002      while (last_line < opline->lineno) { 
     6003        last_line++; 
     6004        zend_printf("<tr><td colspan=6 bgcolor=black><pre><font color=#80ff80>"); 
     6005        print_file_line(filebuf, last_line); 
     6006        zend_printf("</font></pre></td></tr>\n"); 
     6007      } 
     6008 
    59266009      if (op != NULL) { 
    5927         zend_printf("<tr><td>%d </td><td>%s </td>",n, op->opname); 
     6010        zend_printf("<tr><td><font color=%s>%d</font> </td><td>%s </td>",color(n), n, op->opname); 
    59286011        if ((op->ops & EXT_MASK) == EXT_OPLINE) { 
    5929           zend_printf("<td>opline(%lu) </td>",opline->extended_value); 
     6012          zend_printf("<td><font color=%s>opline(%lu)</font> </td>",color(opline->extended_value),opline->extended_value); 
    59306013        } else if ((op->ops & EXT_MASK) == EXT_FCALL) { 
    59316014          zend_printf("<td>args(%lu) </td>",opline->extended_value); 
     
    59406023        } else if ((op->ops & EXT_MASK) == EXT_FETCH) { 
    59416024          zend_printf("<td>%s </td>", extopnames_fetch[opline->extended_value]); 
     6025        } else if ((op->ops & EXT_MASK) == EXT_FE) { 
     6026          zend_printf("<td>%s </td>", extopnames_fe[opline->extended_value]); 
    59426027        } else if ((op->ops & EXT_MASK) == EXT_DECLARE) { 
    59436028          zend_printf("<td>%s </td>", extopnames_declare[opline->extended_value]); 
     
    59516036          zend_printf("<td>$class%u </td>",VAR_NUM(opline->extended_value)); 
    59526037        } else if ((op->ops & EXT_MASK) == EXT_BIT) { 
    5953           zend_printf("<td>%d </td>",opline->extended_value?1:0); 
     6038          zend_printf("<td>%s </td>",opline->extended_value?"true":"false"); 
    59546039        } else if ((op->ops & EXT_MASK) == EXT_ISSET) { 
    59556040          if (opline->extended_value == ZEND_ISSET) { 
     
    59896074 
    59906075      if ((op->ops & OP1_MASK) == OP1_OPLINE) { 
    5991         zend_printf("<td>opline(%d) </td>",opline->op1.u.opline_num); 
     6076        zend_printf("<td><font color=%s>opline(%d)</font> </td>", color(opline->op1.u.opline_num), opline->op1.u.opline_num); 
    59926077#ifdef ZEND_ENGINE_2 
    59936078      } else if ((op->ops & OP1_MASK) == OP1_JMPADDR) { 
    5994         zend_printf("<td>opline(%u) </td>",(unsigned int)(opline->op1.u.jmp_addr - p->opcodes)); 
     6079        zend_printf("<td><font color=%s>opline(%u)</font> </td>", 
     6080            color((unsigned int)(opline->op1.u.jmp_addr - p->opcodes)), 
     6081            (unsigned int)(opline->op1.u.jmp_addr - p->opcodes)); 
    59956082      } else if ((op->ops & OP1_MASK) == OP1_CLASS) { 
    59966083        zend_printf("<td>$class%u </td>",VAR_NUM(opline->op1.u.var)); 
     
    60166103            offset = jmp_to->parent; 
    60176104          } while (--level > 0); 
    6018           zend_printf("<td>opline(%d) </td>",jmp_to->brk); 
     6105          zend_printf("<td><font color=%s>opline(%d)</font> </td>",color(jmp_to->brk),jmp_to->brk); 
    60196106        } else { 
    60206107brk_failed: 
     
    60356122            offset = jmp_to->parent; 
    60366123          } while (--level > 0); 
    6037           zend_printf("<td>opline(%d) </td>",jmp_to->cont); 
     6124          zend_printf("<td><font color=%s>opline(%d)</font> </td>",color(jmp_to->cont),jmp_to->cont); 
    60386125        } else { 
    60396126cont_failed: 
     
    60436130        zend_printf("<td>arg(%ld) </td>",opline->op1.u.constant.value.lval); 
    60446131      } else if ((op->ops & OP1_MASK) == OP1_VAR) { 
    6045         zend_printf("<td>$var%u </td>",VAR_NUM(opline->op1.u.var)); 
     6132        zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->op1.u.var)), VAR_NUM(opline->op1.u.var)); 
    60466133      } else if ((op->ops & OP1_MASK) == OP1_TMP) { 
    6047         zend_printf("<td>$tmp%u </td>",VAR_NUM(opline->op1.u.var)); 
     6134        zend_printf("<td><font color=%s>$tmp%u</font> </td>", color(VAR_NUM(opline->op1.u.var)), VAR_NUM(opline->op1.u.var)); 
    60486135      } else { 
    60496136        if (opline->op1.op_type == IS_CONST) { 
     
    60526139          ZEND_PUTS(" </td>"); 
    60536140        } else if (opline->op1.op_type == IS_TMP_VAR) { 
    6054           zend_printf("<td>$tmp%u </td>",VAR_NUM(opline->op1.u.var)); 
     6141          zend_printf("<td><font color=%s>$tmp%u</font> </td>", color(VAR_NUM(opline->op1.u.var)), VAR_NUM(opline->op1.u.var)); 
    60556142        } else if (opline->op1.op_type == IS_VAR) { 
    6056           zend_printf("<td>$var%u </td>",VAR_NUM(opline->op1.u.var)); 
     6143          zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->op1.u.var)), VAR_NUM(opline->op1.u.var)); 
    60576144        } else if (opline->op1.op_type == IS_UNUSED) { 
    60586145          ZEND_PUTS("<td>&nbsp;</td>"); 
     
    60636150 
    60646151      if ((op->ops & OP2_MASK) == OP2_OPLINE) { 
    6065         zend_printf("<td>opline(%d) </td>",opline->op2.u.opline_num); 
     6152        zend_printf("<td><font color=%s>opline(%d)</font> </td>",color(opline->op2.u.opline_num),opline->op2.u.opline_num); 
    60666153#ifdef ZEND_ENGINE_2 
    60676154      } else if ((op->ops & OP2_MASK) == OP2_JMPADDR) { 
    6068         zend_printf("<td>opline(%u) </td>",(unsigned int)(opline->op2.u.jmp_addr - p->opcodes)); 
     6155        zend_printf("<td><font color=%s>opline(%u)</font> </td>",color((unsigned int)(opline->op2.u.jmp_addr - p->opcodes)),(unsigned int)(opline->op2.u.jmp_addr - p->opcodes)); 
    60696156      } else if ((op->ops & OP2_MASK) == OP2_CLASS) { 
    60706157          zend_printf("<td>$class%u </td>",VAR_NUM(opline->op2.u.var)); 
    60716158#endif 
    60726159      } else if ((op->ops & OP2_MASK) == OP2_VAR) { 
    6073           zend_printf("<td>$var%u </td>",VAR_NUM(opline->op2.u.var)); 
     6160          zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->op2.u.var)), VAR_NUM(opline->op2.u.var)); 
    60746161      } else if ((op->ops & OP2_MASK) == OP2_FETCH) { 
    60756162#ifdef ZEND_ENGINE_2 
     
    61126199          ZEND_PUTS(" </td>"); 
    61136200        } else if (opline->op2.op_type == IS_TMP_VAR) { 
    6114           zend_printf("<td>$tmp%u </td>",VAR_NUM(opline->op2.u.var)); 
     6201          zend_printf("<td><font color=%s>$tmp%u</font> </td>", color(VAR_NUM(opline->op2.u.var)), VAR_NUM(opline->op2.u.var)); 
    61156202        } else if (opline->op2.op_type == IS_VAR) { 
    6116           zend_printf("<td>$var%u </td>",VAR_NUM(opline->op2.u.var)); 
     6203          zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->op2.u.var)), VAR_NUM(opline->op2.u.var)); 
    61176204        } else if (opline->op2.op_type == IS_UNUSED) { 
    61186205          ZEND_PUTS("<td>&nbsp; </td>"); 
     
    61296216            ZEND_PUTS("</td>"); 
    61306217          } else if (opline->result.op_type == IS_TMP_VAR) { 
    6131             zend_printf("<td>$tmp%u</td>",VAR_NUM(opline->result.u.var)); 
     6218            zend_printf("<td><font color=%s>$tmp%u</font> </td>", color(VAR_NUM(opline->op2.u.var)), VAR_NUM(opline->op2.u.var)); 
    61326219          } else if (opline->result.op_type == IS_VAR) { 
    61336220            if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) 
    6134               zend_printf("<td>$var%u <small>(unused)</small></td>",VAR_NUM(opline->result.u.var)); 
     6221              zend_printf("<td><font color=%s>$var%u <small>(unused)</small></font> </td>", color(VAR_NUM(opline->result.u.var)), VAR_NUM(opline->result.u.var)); 
    61356222            else 
    6136               zend_printf("<td>$var%u</td>",VAR_NUM(opline->result.u.var)); 
     6223              zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->result.u.var)), VAR_NUM(opline->result.u.var)); 
    61376224          } else if (opline->result.op_type == IS_UNUSED) { 
    61386225            ZEND_PUTS("<td>&nbsp;</td>"); 
     
    61456232          break; 
    61466233        case RES_TMP: 
    6147           zend_printf("<td>$tmp%u</td>",VAR_NUM(opline->result.u.var)); 
     6234          zend_printf("<td><font color=%s>$tmp%u</font> </td>", color(VAR_NUM(opline->result.u.var)), VAR_NUM(opline->result.u.var)); 
    61486235          break; 
    61496236        case RES_VAR: 
    61506237          if ((opline->result.u.EA.type & EXT_TYPE_UNUSED) != 0) { 
    6151             zend_printf("<td>$var%u <small>(unused)</small></td>",VAR_NUM(opline->result.u.var)); 
     6238            zend_printf("<td><font color=%s>$var%u <small>(unused)</small></font> </td>", color(VAR_NUM(opline->result.u.var)), VAR_NUM(opline->result.u.var)); 
    61526239          } else { 
    6153             zend_printf("<td>$var%u</td>",VAR_NUM(opline->result.u.var)); 
     6240            zend_printf("<td><font color=%s>$var%u</font> </td>", color(VAR_NUM(opline->result.u.var)), VAR_NUM(opline->result.u.var)); 
    61546241          } 
    61556242          break; 
     
    61656252    } 
    61666253    ZEND_PUTS("</tbody></table>\n"); 
     6254 
     6255    efree(filebuf); 
    61676256  } 
    61686257} 
  • eaccelerator/trunk/encoder.c

    r41 r44  
    867867          case EXT_INIT_FCALL: 
    868868          case EXT_FETCH: 
     869          case EXT_FE: 
    869870          case EXT_CAST: 
    870871          case EXT_DECLARE: 
  • eaccelerator/trunk/loader.c

    r37 r44  
    606606          case EXT_INIT_FCALL: 
    607607          case EXT_FETCH: 
     608          case EXT_FE: 
    608609          case EXT_CAST: 
    609610          case EXT_DECLARE: 
  • eaccelerator/trunk/opcodes.c

    r37 r44  
    170170#endif 
    171171  OPDEF("FE_RESET",                  EXT_BIT    | OP1_STD    | OP2_UNUSED | RES_VAR), /* 77 */ 
    172   OPDEF("FE_FETCH",                  EXT_FETCH  | OP1_STD    | OP2_OPLINE | RES_TMP), /* 78 */ 
     172  OPDEF("FE_FETCH",                  EXT_FE     | OP1_STD    | OP2_OPLINE | RES_TMP), /* 78 */ 
    173173  OPDEF("EXIT",                      EXT_UNUSED | OP1_STD    | OP2_UNUSED | RES_UNUSED), /* 79 */ 
    174174  OPDEF("FETCH_R",                   EXT_UNUSED | OP1_STD    | OP2_FETCH  | RES_VAR), /* 80 */ 
  • eaccelerator/trunk/opcodes.h

    r21 r44  
    5050#define EXT_CLASS      0x00e00 
    5151#define EXT_ASSIGN     0x00f00 
     52#define EXT_FE         0x01000 
    5253 
    5354#define OP1_MASK       0x000f0