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.134 2001/09/29 06:19:26 hubbe Exp $"); + RCSID("$Id: docode.c,v 1.135 2001/09/29 08:47:03 hubbe Exp $");   #include "las.h"   #include "program.h"   #include "pike_types.h"   #include "stralloc.h"   #include "interpret.h"   #include "constants.h"   #include "array.h"   #include "pike_macros.h"   #include "pike_error.h"   #include "pike_memory.h"
pike.git/src/docode.c:514:    }    emit0(F_MARK);    code_expression(n, 0, "[*]");    emit1(F_NUMBER, depth);    emit_apply_builtin("__builtin.automap_marker");    return 1;    }    }   }    + static void emit_builtin_svalue(char *func) + { +  INT32 tmp1; +  struct pike_string *n1=make_shared_string(func); +  node *n=find_module_identifier(n1,0); +  free_string(n1);    -  +  switch(n?n->token:0) +  { +  case F_CONSTANT: +  tmp1=store_constant(&n->u.sval, +  n->tree_info & OPT_EXTERNAL_DEPEND, +  n->name); +  emit1(F_CONSTANT, DO_NOT_WARN((INT32)tmp1)); +  break; +  +  default: +  my_yyerror("docode: Failed to make svalue for builtin %s",func); +  } +  free_node(n); + } +    static int do_docode2(node *n, INT16 flags)   {    ptrdiff_t tmp1,tmp2,tmp3;       if(!n) return 0;       if(flags & DO_LVALUE)    {    switch(n->token)    {
pike.git/src/docode.c:711:    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:    case F_MOD_EQ:    case F_DIV_EQ: -  tmp1=do_docode(CAR(n),DO_LVALUE); - #ifdef PIKE_DEBUG -  if(tmp1 != 2) -  fatal("HELP! FATAL INTERNAL COMPILER ERROR (7)\n"); - #endif -  -  +     if(CAR(n)->token == F_AUTO_MAP_MARKER ||    CDR(n)->token == F_AUTO_MAP_MARKER)    {    char *opname; -  struct pike_string *opstr; -  node *op; +     -  emit0(F_MARK); -  +     if(CAR(n)->token == F_AUTO_MAP_MARKER)    {    int depth=0;    node *tmp=CAR(n);    while(tmp->token == F_AUTO_MAP_MARKER)    {    depth++;    tmp=CAR(tmp);    } -  +  tmp1=do_docode(tmp,DO_LVALUE);    emit0(F_MARK); -  +  emit0(F_MARK);    emit0(F_LTOSVAL);    emit1(F_NUMBER,depth);    emit_apply_builtin("__builtin.automap_marker");    }else{ -  +  tmp1=do_docode(CAR(n),DO_LVALUE);    emit0(F_LTOSVAL);    }       switch(n->token)    {    case F_ADD_EQ: opname="`+"; break;    case F_AND_EQ: opname="`&"; break;    case F_OR_EQ: opname="`|"; break;    case F_XOR_EQ: opname="`^"; break;    case F_LSH_EQ: opname="`<<"; break;    case F_RSH_EQ: opname="`>>"; break;    case F_SUB_EQ: opname="`-"; break;    case F_MULT_EQ:opname="`*"; break;    case F_MOD_EQ: opname="`%"; break;    case F_DIV_EQ: opname="`/"; break;    default:    fatal("Really???\n");    opname="`make gcc happy";    }    -  opstr=findstring(opname); -  if(!opstr || !(op=find_module_identifier(opstr, 0))) -  { -  my_yyerror("Failed to find operator %s\n",opname); -  do_pop(2); -  return 1; -  } +  emit_builtin_svalue(opname); +  emit2(F_REARRANGE,1,1);    -  code_expression(op, 0, "assignment"); -  free_node(op); -  emit0(F_SWAP); -  +     if(CDR(n)->token == F_AUTO_MAP)    {    do_encode_automap_arg_list(CDR(n), 0);    }else{    code_expression(CDR(n), 0, "assignment");    }    emit_apply_builtin("__automap__");    }else{ -  +  tmp1=do_docode(CAR(n),DO_LVALUE); + #ifdef PIKE_DEBUG +  if(tmp1 != 2) +  fatal("HELP! FATAL INTERNAL COMPILER ERROR (7)\n"); + #endif +     if(n->token == F_ADD_EQ && (flags & DO_POP))    {    code_expression(CDR(n), 0, "assignment");    emit0(F_ADD_TO_AND_POP);    return 0;    }       if(CAR(n)->token != F_AUTO_MAP &&    (match_types(CAR(n)->type, array_type_string) ||    match_types(CAR(n)->type, string_type_string) ||
pike.git/src/docode.c:980:       case F_RANGE:    tmp1=do_docode(CAR(n),DO_NOT_COPY_TOPLEVEL);    if(do_docode(CDR(n),DO_NOT_COPY)!=2)    fatal("Compiler internal error (at %ld).\n",(long)lex.current_line);    emit0(n->token);    return DO_NOT_WARN((INT32)tmp1);       case F_INC:    case F_POST_INC: +  if(CAR(n)->token == F_AUTO_MAP_MARKER) +  { +  int depth=0; +  int ret=0; +  node *tmp=CAR(n); +  while(tmp->token == F_AUTO_MAP_MARKER) +  { +  depth++; +  tmp=CAR(tmp); +  } +  +  tmp1=do_docode(tmp,DO_LVALUE); +  if(n->token == F_POST_INC) +  { +  emit0(F_LTOSVAL); +  emit2(F_REARRANGE,1,2); +  ret++; +  flags|=DO_POP; +  } +  + #ifdef PIKE_DEBUG +  if(tmp1 != 2) +  fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n"); + #endif +  +  emit0(F_MARK); +  emit0(F_MARK); +  emit0(F_LTOSVAL); +  emit1(F_NUMBER, depth); +  emit_apply_builtin("__builtin.automap_marker"); +  emit_builtin_svalue("`+"); +  emit2(F_REARRANGE,1,1); +  emit1(F_NUMBER, 1); +  emit_apply_builtin("__automap__"); +  +  if(flags & DO_POP) +  { +  emit0(F_ASSIGN_AND_POP); +  }else{ +  emit0(F_ASSIGN); +  ret++; +  } +  return ret; +  }else{    tmp1=do_docode(CAR(n),DO_LVALUE);   #ifdef PIKE_DEBUG    if(tmp1 != 2)    fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n");   #endif       if(flags & DO_POP)    {    emit0(F_INC_AND_POP);    return 0;    }else{    emit0(n->token);    return 1;    } -  +  }       case F_DEC:    case F_POST_DEC: -  +  if(CAR(n)->token == F_AUTO_MAP_MARKER) +  { +  int depth=0; +  int ret=0; +  node *tmp=CAR(n); +  while(tmp->token == F_AUTO_MAP_MARKER) +  { +  depth++; +  tmp=CAR(tmp); +  } +  +  tmp1=do_docode(tmp,DO_LVALUE); +  if(n->token == F_POST_DEC) +  { +  emit0(F_LTOSVAL); +  emit2(F_REARRANGE,1,2); +  ret++; +  flags|=DO_POP; +  } +  + #ifdef PIKE_DEBUG +  if(tmp1 != 2) +  fatal("HELP! FATAL INTERNAL COMPILER ERROR (1)\n"); + #endif +  +  emit0(F_MARK); +  emit0(F_MARK); +  emit0(F_LTOSVAL); +  emit1(F_NUMBER, depth); +  emit_apply_builtin("__builtin.automap_marker"); +  emit_builtin_svalue("`-"); +  emit2(F_REARRANGE,1,1); +  emit1(F_NUMBER, 1); +  emit_apply_builtin("__automap__"); +  +  if(flags & DO_POP) +  { +  emit0(F_ASSIGN_AND_POP); +  }else{ +  emit0(F_ASSIGN); +  ret++; +  } +  return ret; +  }else{    tmp1=do_docode(CAR(n),DO_LVALUE);   #ifdef PIKE_DEBUG    if(tmp1 != 2)    fatal("HELP! FATAL INTERNAL COMPILER ERROR (2)\n");   #endif    if(flags & DO_POP)    {    emit0(F_DEC_AND_POP);    return 0;    }else{    emit0(n->token);    return 1;    } -  +  }       case F_FOR:    {    INT32 *prev_switch_jumptable = current_switch_jumptable;    BLOCK_BEGIN;    PUSH_STATEMENT_LABEL;       current_switch_jumptable=0;    current_label->break_label=alloc_label();    current_label->continue_label=alloc_label();
pike.git/src/docode.c:2049:    do_docode(CDR(n), (INT16)(flags | DO_LVALUE));       case F_AUTO_MAP:    emit0(F_MARK);    code_expression(CAR(n), 0, "automap function");    do_encode_automap_arg_list(CDR(n),0);    emit_apply_builtin("__automap__");    return 1;       case F_AUTO_MAP_MARKER: -  if(flags & DO_LVALUE) return do_docode(CAR(n), flags); +     yyerror("[*] not supported here.\n");    emit0(F_CONST0);    return 1;       default:    fatal("Infernal compiler error (unknown parse-tree-token %d).\n", n->token);    return 0; /* make gcc happy */    }   }