pike.git / src / docode.c

version» Context lines:

pike.git/src/docode.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: docode.c,v 1.15 1997/03/17 03:04:37 hubbe Exp $"); + RCSID("$Id: docode.c,v 1.16 1997/04/17 22:47:06 hubbe Exp $");   #include "las.h"   #include "program.h"   #include "language.h"   #include "pike_types.h"   #include "stralloc.h"   #include "interpret.h"   #include "constants.h"   #include "array.h"   #include "pike_macros.h"   #include "error.h"
pike.git/src/docode.c:158:   }         static int is_efun(node *n, c_fun fun)   {    return n && n->token == F_CONSTANT &&    n->u.sval.subtype == FUNCTION_BUILTIN &&    n->u.sval.u.efun->function == fun;   }    + static void code_expression(node *n, int flags, char *err) + { +  switch(do_docode(n, flags & ~ DO_POP)) +  { +  case 0: my_yyerror("Void expression for %s",err); +  case 1: return; +  case 2: +  fatal("Internal compiler error (%s), line %ld, file %s\n", +  err, +  (long)current_line, +  current_file?current_file->str:"Unknown"); +  } + } +    void do_cond_jump(node *n, int label, int iftrue, int flags)   {    iftrue=!!iftrue;    if((flags & DO_POP) && node_is_tossable(n))    {    int t,f;    t=!!node_is_true(n);    f=!!node_is_false(n);    if(t || f)    {
pike.git/src/docode.c:198:       case F_APPLY:    if(!is_efun(CAR(n), f_not)) break;       case F_NOT:    if(!(flags & DO_POP)) break;    do_cond_jump(CDR(n), label , !iftrue, flags | DO_NOT_COPY);    return;    }    -  if(do_docode(n, flags&DO_NOT_COPY)!=1) -  fatal("Infernal compiler skiterror.\n"); +  code_expression(n, flags | DO_NOT_COPY, "condition");       if(flags & DO_POP)    {    if(iftrue)    do_jump(F_BRANCH_WHEN_NON_ZERO, label);    else    do_jump(F_BRANCH_WHEN_ZERO, label);    }else{    if(iftrue)    do_jump(F_LOR, label);
pike.git/src/docode.c:275:    case F_INDEX:    case F_ARROW:    case F_ARG_LIST:    break;    }    }       switch(n->token)    {    case F_PUSH_ARRAY: -  tmp1=do_docode(CAR(n),0); -  if(tmp1!=1) -  { -  fatal("Internal compiler error, Yikes!\n"); -  } +  code_expression(CAR(n), 0, "`@");    emit2(F_PUSH_ARRAY);    return -0x7ffffff;       case '?':    {    INT32 *prev_switch_jumptable = current_switch_jumptable;    int adroppings , bdroppings;    current_switch_jumptable=0;      
pike.git/src/docode.c:357:    case F_DIV_EQ:    tmp1=do_docode(CAR(n),DO_LVALUE);   #ifdef DEBUG    if(tmp1 != 2)    fatal("HELP! FATAL INTERNAL COMPILER ERROR\n");   #endif       if(match_types(CAR(n)->type,array_type_string) ||    match_types(CAR(n)->type,string_type_string))    { -  if(do_docode(CDR(n), 0)!=1) -  fatal("Internal compiler error, shit happens\n"); +  code_expression(CDR(n), 0, "assignment");    emit2(F_LTOSVAL2);    }else{    emit2(F_LTOSVAL); -  if(do_docode(CDR(n), 0)!=1) -  fatal("Internal compiler error, shit happens (again)\n"); +  code_expression(CDR(n), 0, "assignment");    }          switch(n->token)    {    case F_ADD_EQ: emit2(F_ADD); break;    case F_AND_EQ: emit2(F_AND); break;    case F_OR_EQ: emit2(F_OR); break;    case F_XOR_EQ: emit2(F_XOR); break;    case F_LSH_EQ: emit2(F_LSH); break;
pike.git/src/docode.c:409:    case F_MOD:    case F_SUBTRACT:    case F_DIVIDE:    case F_MULTIPLY:    if(node_is_eq(CDR(n),CAAR(n)))    {    tmp1=do_docode(CDR(n),DO_LVALUE);    if(match_types(CDR(n)->type,array_type_string) ||    match_types(CDR(n)->type,string_type_string))    { -  if(do_docode(CDAR(n),DO_NOT_COPY)!=1) -  fatal("Infernal compiler error (dumpar core |ver hela mattan).\n"); +  code_expression(CDAR(n), 0, "binary operand");    emit2(F_LTOSVAL2);    }else{    emit2(F_LTOSVAL); -  if(do_docode(CDAR(n),DO_NOT_COPY)!=1) -  fatal("Infernal compiler error (dumpar core).\n"); +  code_expression(CDAR(n), 0, "binary operand");    }       emit2(CAR(n)->token);       emit2(n->token);    return n->token==F_ASSIGN;    }       default:    switch(CDR(n)->token)    {    case F_LOCAL:    if(CDR(n)->u.number >= local_variables->max_number_of_locals)    yyerror("Illegal to use local variable here.");    -  if(do_docode(CAR(n),0)!=1) yyerror("RHS is void!"); +  code_expression(CAR(n), 0, "RHS");    emit(flags & DO_POP ? F_ASSIGN_LOCAL_AND_POP:F_ASSIGN_LOCAL,    CDR(n)->u.number );    break;       case F_IDENTIFIER:    if(!IDENTIFIER_IS_VARIABLE( ID_FROM_INT(& fake_program, CDR(n)->u.number)->flags))    {    yyerror("Cannot assign functions or constants.\n");    }else{ -  if(do_docode(CAR(n),0)!=1) yyerror("RHS is void!"); +  code_expression(CAR(n), 0, "RHS");    emit(flags & DO_POP ? F_ASSIGN_GLOBAL_AND_POP:F_ASSIGN_GLOBAL,    CDR(n)->u.number);    }    break;       default:    tmp1=do_docode(CDR(n),DO_LVALUE);    if(do_docode(CAR(n),0)!=1) yyerror("RHS is void!");    emit2(flags & DO_POP ? F_ASSIGN_AND_POP:F_ASSIGN);    break;    }    return flags & DO_POP ? 0 : 1;    }       case F_LAND:    case F_LOR:    tmp1=alloc_label();    do_cond_jump(CAR(n), tmp1, n->token == F_LOR, 0); -  if(do_docode(CDR(n),0)!=1) fatal("Compiler internal error.\n"); +  if(do_docode(CDR(n),0)!=1) fatal("Compiler logical error.\n");    emit(F_LABEL,tmp1);    return 1;       case F_EQ:    case F_NE:    case F_ADD:    case F_LT:    case F_LE:    case F_GT:    case F_GE:
pike.git/src/docode.c:488:    case F_OR:    case F_AND:    case F_NOT:    case F_COMPL:    case F_NEGATE:    fatal("Optimizer errror.\n");       case F_RANGE:    tmp1=do_docode(CAR(n),DO_NOT_COPY);    if(do_docode(CDR(n),DO_NOT_COPY)!=2) -  fatal("Compiler internal error.\n"); +  fatal("Compiler internal error (at %ld).\n",(long)current_line);    emit2(n->token);    return tmp1;       case F_INC:    case F_POST_INC:    tmp1=do_docode(CAR(n),DO_LVALUE);   #ifdef DEBUG    if(tmp1 != 2)    fatal("HELP! FATAL INTERNAL COMPILER ERROR\n");   #endif
pike.git/src/docode.c:970:    {    tmp1=do_docode(CAR(n), 0);    if(do_docode(CDR(n),0) != 1)    fatal("Internal compiler error, please report this (1).");    if(CDR(n)->token != F_CONSTANT &&    match_types(CDR(n)->type, string_type_string))    emit2(F_CLEAR_STRING_SUBTYPE);    return 2;    }else{    tmp1=do_docode(CAR(n), DO_NOT_COPY); -  if(do_docode(CDR(n),DO_NOT_COPY) != 1) -  fatal("Internal compiler error, please report this (1)."); +  code_expression(CDR(n), DO_NOT_COPY, "index");    emit2(F_INDEX);    if(!(flags & DO_NOT_COPY))    {    while(n && (n->token==F_INDEX || n->token==F_ARROW)) n=CAR(n);    if(n->token==F_CONSTANT && !(n->node_info & OPT_EXTERNAL_DEPEND))    emit2(F_COPY_VALUE);    }    }    return tmp1;