pike.git / src / operators.c

version» Context lines:

pike.git/src/operators.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"   #include <math.h> - RCSID("$Id: operators.c,v 1.136 2001/05/10 22:35:20 grubba Exp $"); + RCSID("$Id: operators.c,v 1.137 2001/05/19 21:37:32 grubba Exp $");   #include "interpret.h"   #include "svalue.h"   #include "multiset.h"   #include "mapping.h"   #include "array.h"   #include "stralloc.h"   #include "opcodes.h"   #include "operators.h"   #include "language.h"   #include "pike_memory.h"
pike.git/src/operators.c:3365:    INT32 tmp;    if(args<1)    PIKE_ERROR("sizeof", "Too few arguments.\n", sp, args);       tmp=pike_sizeof(sp-args);       pop_n_elems(args);    push_int(tmp);   }    + static node *optimize_sizeof(node *n) + { +  if (CDR(n) && (CDR(n)->token == F_APPLY) && +  (CADR(n)) && (CADR(n)->token == F_CONSTANT) && +  (CADR(n)->u.sval.type == T_FUNCTION) && +  (CADR(n)->u.sval.subtype == FUNCTION_BUILTIN)) { +  extern struct program *string_split_iterator_program; +  /* sizeof(efun(...)) */ +  if ((CADR(n)->u.sval.u.efun->function == f_divide) && +  CDDR(n) && (CDDR(n)->token == F_ARG_LIST) && +  CADDR(n) && (CADDR(n)->type == string_type_string) && +  CDDDR(n) && (CDDDR(n)->token == F_CONSTANT) && +  (CDDDR(n)->u.sval.type == T_STRING) && +  (CDDDR(n)->u.sval.u.string->len == 1)) { +  p_wchar2 split = index_shared_string(CDDDR(n)->u.sval.u.string, 0); +  +  /* sizeof(`/(str, "x")) */ +  ADD_NODE_REF2(CADDR(n), +  return mkefuncallnode("sizeof", +  mkapplynode(mkprgnode(string_split_iterator_program), +  mknode(F_ARG_LIST, CADDR(n), +  mkintnode(split)))); +  ); +  } +  if ((CADR(n)->u.sval.u.efun->function == f_minus) && +  CDDR(n) && (CDDR(n)->token == F_ARG_LIST) && +  CADDR(n) && (CADDR(n)->token == F_APPLY) && +  CAADDR(n) && (CAADDR(n)->token == F_CONSTANT) && +  (CAADDR(n)->u.sval.type == T_FUNCTION) && +  (CAADDR(n)->u.sval.subtype == FUNCTION_BUILTIN) && +  (CAADDR(n)->u.sval.u.efun->function == f_divide) && +  CDADDR(n) && (CDADDR(n)->token == F_ARG_LIST) && +  CADADDR(n) && (CADADDR(n)->type == string_type_string) && +  CDDADDR(n) && (CDDADDR(n)->token == F_CONSTANT) && +  (CDDADDR(n)->u.sval.type == T_STRING) && +  (CDDADDR(n)->u.sval.u.string->len == 1) && +  CDDDR(n)) { +  /* sizeof(`-(`/(str, "x"), y)) */ +  if (((CDDDR(n)->token == F_CONSTANT) && +  (CDDDR(n)->u.sval.type == T_ARRAY) && +  (CDDDR(n)->u.sval.u.array->size == 1) && +  (CDDDR(n)->u.sval.u.array->item[0].type == T_STRING) && +  (CDDDR(n)->u.sval.u.array->item[0].u.string->len == 0)) || +  ((CDDDR(n)->token == F_APPLY) && +  CADDDR(n) && (CADDDR(n)->token == F_CONSTANT) && +  (CADDDR(n)->u.sval.type == T_FUNCTION) && +  (CADDDR(n)->u.sval.subtype == FUNCTION_BUILTIN) && +  (CADDDR(n)->u.sval.u.efun->function == f_allocate) && +  CDDDDR(n) && (CDDDDR(n)->token == F_ARG_LIST) && +  CADDDDR(n) && (CADDDDR(n)->token == F_CONSTANT) && +  (CADDDDR(n)->u.sval.type == T_INT) && +  (CADDDDR(n)->u.sval.u.integer == 1) && +  CDDDDDR(n) && (CDDDDDR(n)->token == F_CONSTANT) && +  (CDDDDDR(n)->u.sval.type == T_STRING) && +  (CDDDDDR(n)->u.sval.u.string->len == 0))) { +  /* sizeof(`-(`/(str, "x"), ({""}))) */ +  p_wchar2 split = index_shared_string(CDDADDR(n)->u.sval.u.string, 0); +  ADD_NODE_REF2(CADADDR(n), +  return mkefuncallnode("sizeof", +  mkapplynode(mkprgnode(string_split_iterator_program), +  mknode(F_ARG_LIST, CADADDR(n), +  mknode(F_ARG_LIST, +  mkintnode(split), +  mkintnode(1))))); +  ); +  } +  } +  } +  return NULL; + } +    static int generate_sizeof(node *n)   {    node **arg;    if(count_args(CDR(n)) != 1) return 0;    if(do_docode(CDR(n),DO_NOT_COPY) != 1)    fatal("Count args was wrong in sizeof().\n");    emit0(F_SIZEOF);    return 1;   }   
pike.git/src/operators.c:3675:    tOr6(tFunc(tObj,tMix),    tFunc(tInt,tInt),    tFunc(tFlt,tFlt),    tFunc(tStr,tStr),    tFunc(tType(tSetvar(0, tMix)), tType(tNot(tVar(0)))),    tFunc(tPrg(tObj), tType(tMix))),    OPT_TRY_OPTIMIZE,0,generate_compl);    /* function(string|multiset|array|mapping|object:int) */    ADD_EFUN2("sizeof", f_sizeof,    tFunc(tOr5(tStr,tMultiset,tArray,tMapping,tObj),tInt), -  OPT_TRY_OPTIMIZE, 0,generate_sizeof); +  OPT_TRY_OPTIMIZE, optimize_sizeof, generate_sizeof);       /* function(mixed,mixed ...:mixed) */    ADD_EFUN2("`()",f_call_function,tFuncV(tMix,tMix,tMix),OPT_SIDE_EFFECT | OPT_EXTERNAL_DEPEND,0,generate_call_function);       /* This one should be removed */    /* function(mixed,mixed ...:mixed) */    ADD_EFUN2("call_function",f_call_function,tFuncV(tMix,tMix,tMix),OPT_SIDE_EFFECT | OPT_EXTERNAL_DEPEND,0,generate_call_function);          start_new_program();