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.58 1999/08/16 20:43:07 mast Exp $"); + RCSID("$Id: operators.c,v 1.59 1999/08/17 01:05:56 mast 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:1922:      void f_index_assign(INT32 args)   {    switch (args) {    case 0:    case 1:    case 2:    PIKE_ERROR("`[]=", "Too few arguments.\n", sp, args);    break;    case 3: -  switch (sp[-3].type) { -  case T_STRING: { -  INT32 i, c; -  get_all_args ("`[]=", 2, "%i%i", &i, &c); -  modify_shared_string (sp[-3].u.string, i, c); +  if(sp[-2].type==T_STRING) sp[-2].subtype=0; +  assign_lvalue (sp-3, sp-1); +  assign_svalue (sp-3, sp-1); +  pop_n_elems (args-1);    break; -  } -  case T_OBJECT: -  object_set_index (sp[-3].u.object, sp-2, sp-1); -  break; -  case T_ARRAY: -  simple_set_index (sp[-3].u.array, sp-2, sp-1); -  break; -  case T_MAPPING: -  mapping_insert (sp[-3].u.mapping, sp-2, sp-1); -  break; -  case T_MULTISET: -  if (svalue_is_true (sp-1)) -  multiset_insert (sp[-3].u.multiset, sp-2); -  else -  multiset_delete (sp[-3].u.multiset, sp-2); -  break; +     default: -  SIMPLE_BAD_ARG_ERROR ("`[]=", 1, "string|object|array|mapping|multiset"); +  PIKE_ERROR("`[]=", "Too many arguments.\n", sp, args);    } -  + } +  + void f_arrow_assign(INT32 args) + { +  switch (args) { +  case 0: +  case 1: +  case 2: +  PIKE_ERROR("`->=", "Too few arguments.\n", sp, args); +  break; +  case 3: +  if(sp[-2].type==T_STRING) sp[-2].subtype=1; +  assign_lvalue (sp-3, sp-1);    assign_svalue (sp-3, sp-1);    pop_n_elems (args-1);    break;    default: -  PIKE_ERROR("`[]=", "Too many arguments.\n", sp, args); +  PIKE_ERROR("`->=", "Too many arguments.\n", sp, args);    }   }      void f_sizeof(INT32 args)   {    INT32 tmp;    if(args<1)    PIKE_ERROR("sizeof", "Too few arguments.\n", sp, args);       tmp=pike_sizeof(sp-args);
pike.git/src/operators.c:2057:      void init_operators(void)   {    /* function(string,int:int)|function(object,string:mixed)|function(array(0=mixed),int:0)|function(mapping(mixed:1=mixed),mixed:1)|function(multiset,mixed:int)|function(string,int,int:string)|function(array(2=mixed),int,int:array(2))|function(program:mixed) */    ADD_EFUN2("`[]",f_index,tOr7(tFunc(tStr tInt,tInt),tFunc(tObj tStr,tMix),tFunc(tArr(tSetvar(0,tMix)) tInt,tVar(0)),tFunc(tMap(tMix,tSetvar(1,tMix)) tMix,tVar(1)),tFunc(tMultiset tMix,tInt),tFunc(tStr tInt tInt,tStr),tOr(tFunc(tArr(tSetvar(2,tMix)) tInt tInt,tArr(tVar(2))),tFunc(tPrg,tMix))),OPT_TRY_OPTIMIZE,0,0);       /* function(array(object|mapping|multiset|array),string:array(mixed))|function(object|mapping|multiset|program,string:mixed) */    ADD_EFUN2("`->",f_arrow,tOr(tFunc(tArr(tOr4(tObj,tMapping,tMultiset,tArray)) tStr,tArr(tMix)),tFunc(tOr4(tObj,tMapping,tMultiset,tPrg) tStr,tMix)),OPT_TRY_OPTIMIZE,0,0);       ADD_EFUN("`[]=", f_index_assign, -  tOr5(tFunc(tStr tInt tInt, tInt), -  tFunc(tObj tStr tSetvar(0,tMix), tVar(0)), +  tOr4(tFunc(tObj tStr tSetvar(0,tMix), tVar(0)),    tFunc(tArr(tSetvar(1,tMix)) tInt tVar(1), tVar(1)),    tFunc(tMap(tSetvar(2,tMix), tSetvar(3,tMix)) tVar(2) tVar(3), tVar(3)),    tFunc(tSet(tSetvar(4,tMix)) tVar(4) tSetvar(5,tMix), tVar(5))),    0); /* OPT_ASSIGNMENT|OPT_TRY_OPTIMIZE); ? */    -  +  ADD_EFUN("`->=", f_arrow_assign, +  tOr3(tFunc(tArr(tOr4(tArray,tObj,tMultiset,tMapping)) tStr tSetvar(0,tMix), tVar(0)), +  tFunc(tOr(tObj, tMultiset) tStr tSetvar(1,tMix), tVar(1)), +  tFunc(tMap(tMix, tSetvar(2,tMix)) tStr tVar(2), tVar(2))), +  0); /* OPT_ASSIGNMENT|OPT_TRY_OPTIMIZE); ? */ +     /* function(mixed...:int) */    ADD_EFUN2("`==",f_eq,tFuncV(tNone,tMix,tInt),OPT_TRY_OPTIMIZE,optimize_eq,generate_comparison);    /* function(mixed...:int) */    ADD_EFUN2("`!=",f_ne,tFuncV(tNone,tMix,tInt),OPT_TRY_OPTIMIZE,0,generate_comparison);    /* function(mixed:int) */    add_efun2("`!",f_not,"function(mixed:int(0..1))",OPT_TRY_OPTIMIZE,optimize_not,generate_not);      #define CMP_TYPE "!function(!object...:mixed)&function(mixed...:int(0..1))|function(int|float...:int(0..1))|function(string...:int(0..1))"    add_efun2("`<", f_lt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);    add_efun2("`<=",f_le,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison);