pike.git / src / docode.c

version» Context lines:

pike.git/src/docode.c:123:      static int do_jump(int token,INT32 lbl)   {    if(lbl==-1) lbl=alloc_label();    emit(token, lbl);    return lbl;   }      static int do_docode2(node *n,int flags);    - #define DO_LVALUE 1 - #define DO_NOT_COPY 2 - #define DO_POP 4 -  +    #define ins_label(L) do_jump(F_LABEL, L)      static void do_pop(int x)   {    switch(x)    {    case 0: return;    case 1: emit2(F_POP_VALUE); break;    default: emit(F_POP_N_ELEMS,x); break;    }
pike.git/src/docode.c:259:    tmp1=do_docode(CAR(n),0);    if(tmp1!=1)    {    fatal("Internal compiler error, Yikes!\n");    }    emit2(F_PUSH_ARRAY);    return -0x7ffffff;       case '?':    { +  int adroppings , bdroppings; +     if(!CDDR(n))    {    tmp1=do_jump_when_zero(CAR(n), -1);    DO_CODE_BLOCK(CADR(n));    emit(F_LABEL, tmp1);    return 0;    }       if(!CADR(n))    {    tmp1=do_jump_when_non_zero(CAR(n), -1);    DO_CODE_BLOCK(CDDR(n));    emit(F_LABEL,tmp1);    return 0;    }    -  tmp1=count_args(CDDR(n)); -  tmp2=count_args(CADR(n)); +  tmp1=do_jump_when_zero(CAR(n),-1);    -  if(tmp2 < tmp1) tmp1=tmp2; +  adroppings=do_docode(CADR(n), flags); +  tmp3=emit(F_POP_N_ELEMS,0);    -  if(tmp1 == -1) -  fatal("Unknown number of args in ? :\n"); +  /* Else */ +  tmp2=do_jump(F_BRANCH,-1); +  emit(F_LABEL, tmp1);    -  tmp2=do_jump_when_zero(CAR(n),-1); +  bdroppings=do_docode(CDDR(n), flags); +  if(adroppings < bdroppings) +  { +  do_pop(bdroppings - adroppings); +  }    -  tmp3=do_docode(CADR(n), flags); -  if(tmp3 < tmp1) fatal("Count arguments was wrong.\n"); -  do_pop(tmp3 - tmp1); +  if(adroppings > bdroppings) +  { +  update_arg(tmp3,adroppings-bdroppings); +  adroppings=bdroppings; +  }    -  tmp3=do_jump(F_BRANCH,-1); +     emit(F_LABEL, tmp2); -  -  tmp2=do_docode(CDDR(n), flags); -  if(tmp2 < tmp1) fatal("Count arguments was wrong.\n"); -  do_pop(tmp2 - tmp1); -  emit(F_LABEL, tmp3); -  return tmp1; +  return adroppings;    }       case F_AND_EQ:    case F_OR_EQ:    case F_XOR_EQ:    case F_LSH_EQ:    case F_RSH_EQ:    case F_ADD_EQ:    case F_SUB_EQ:    case F_MULT_EQ:
pike.git/src/docode.c:492:    INT32 *prev_switch_jumptable = current_switch_jumptable;    INT32 break_save = current_break;    INT32 continue_save = current_continue;       current_switch_jumptable=0;    current_break=alloc_label();    current_continue=alloc_label();       if(CDR(n))    { -  tmp1=do_jump(F_BRANCH,-1); +  do_jump_when_zero(CAR(n),current_break);    tmp2=ins_label(-1); -  if(CDR(n)) DO_CODE_BLOCK(CADR(n)); +  DO_CODE_BLOCK(CADR(n));    ins_label(current_continue); -  if(CDR(n)) DO_CODE_BLOCK(CDDR(n)); -  emit(F_LABEL,tmp1); +  DO_CODE_BLOCK(CDDR(n));    }else{ -  tmp2=PC; +  tmp2=ins_label(-1);    }    do_jump_when_non_zero(CAR(n),tmp2);    ins_label(current_break);       current_switch_jumptable = prev_switch_jumptable;    current_break=break_save;    current_continue=continue_save;    return 0;    }   
pike.git/src/docode.c:875:    INT32 *prev_switch_jumptable = current_switch_jumptable;       current_switch_jumptable=0;    current_break=alloc_label();    current_continue=alloc_label();       tmp1=do_jump(F_CATCH,-1);    DO_CODE_BLOCK(CAR(n));    ins_label(current_continue);    ins_label(current_break); -  emit2(F_DUMB_RETURN); -  emit(F_LABEL,tmp1); +  emit2(F_THROW_ZERO); +  ins_label(tmp1);       current_break=break_save;    current_continue=continue_save;    current_switch_jumptable = prev_switch_jumptable;    return 1;    }       case F_LVALUE_LIST:    return do_docode(CAR(n),DO_LVALUE)+do_docode(CDR(n),DO_LVALUE);