pike.git / src / opcodes.c

version» Context lines:

pike.git/src/opcodes.c:1:   /*   || This file is part of Pike. For copyright information see COPYRIGHT.   || Pike is distributed under GPL, LGPL and MPL. See the file COPYING   || for more information. - || $Id: opcodes.c,v 1.145 2003/04/28 00:32:43 mast Exp $ + || $Id: opcodes.c,v 1.146 2003/04/28 18:08:35 mast Exp $   */      #include "global.h"   #include <errno.h>   #include <math.h>   #include <ctype.h>   #include "interpret.h"   #include "svalue.h"   #include "array.h"   #include "stralloc.h"
pike.git/src/opcodes.c:23:   #include "fd_control.h"   #include "cyclic.h"   #include "builtin_functions.h"   #include "module_support.h"   #include "security.h"   #include "bignum.h"   #include "operators.h"      #define sp Pike_sp    - RCSID("$Id: opcodes.c,v 1.145 2003/04/28 00:32:43 mast Exp $"); + RCSID("$Id: opcodes.c,v 1.146 2003/04/28 18:08:35 mast Exp $");      void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind)   { -  INT32 i; -  +    #ifdef PIKE_SECURITY    if(what->type <= MAX_COMPLEX)    if(!CHECK_DATA_SECURITY(what->u.array, SECURITY_BIT_INDEX))    Pike_error("Index permission denied.\n");   #endif       switch(what->type)    {   #ifdef AUTO_BIGNUM    case T_INT:    {    INT_TYPE val = what->u.integer;       convert_svalue_to_bignum(what);    index_no_free(to, what, ind);    if(IS_UNDEFINED(to)) {    if (val) { -  if (ind->type == T_STRING) +  if (ind->type == T_STRING && !ind->u.string->size_shift)    Pike_error("Indexing the integer %"PRINTPIKEINT"d "    "with unknown method \"%s\".\n", val, ind->u.string->str);    else -  Pike_error("Indexing the integer %"PRINTPIKEINT"d " -  "with an unknown method.\n", val); +  Pike_error("Indexing the integer %"PRINTPIKEINT"d with %s.\n", +  val, get_name_of_type (ind->type));    } else { -  if(ind->type == T_STRING) +  if(ind->type == T_STRING && !ind->u.string->size_shift)    Pike_error("Indexing the NULL value with \"%s\".\n", ind->u.string->str);    else -  Pike_error("Indexing the NULL value.\n"); +  Pike_error("Indexing the NULL value with %s.\n", +  get_name_of_type (ind->type));    }    }    }    break;   #endif /* AUTO_BIGNUM */       case T_ARRAY:    simple_array_index_no_free(to,what->u.array,ind);    break;       case T_MAPPING:    mapping_index_no_free(to,what->u.mapping,ind);    break;       case T_OBJECT:    object_index_no_free(to, what->u.object, ind);    break;    -  case T_MULTISET: -  i=multiset_member(what->u.multiset, ind); +  case T_MULTISET: { +  int i=multiset_member(what->u.multiset, ind);    to->type=T_INT;    to->subtype=i ? NUMBER_UNDEFINED : 0;    to->u.integer=i;    break; -  +  }       case T_STRING:    if(ind->type==T_INT)    { -  i=ind->u.integer; +  INT_TYPE i=ind->u.integer;    if(i<0)    i+=what->u.string->len;    if(i<0 || i>=what->u.string->len)    {    if(what->u.string->len == 0) -  Pike_error("Attempt to index the empty string with %d.\n", i); +  Pike_error("Attempt to index the empty string with %"PRINTPIKEINT"d.\n", i);    else -  Pike_error("Index %d is out of string range 0 - %ld.\n", -  i, PTRDIFF_T_TO_LONG(what->u.string->len - 1)); +  Pike_error("Index %"PRINTPIKEINT"d is out of string range " +  "0 - %"PRINTPTRDIFFT"d.\n", i, what->u.string->len - 1);    } else    i=index_shared_string(what->u.string,i);    to->type=T_INT;    to->subtype=NUMBER_NUMBER;    to->u.integer=i;    break;    }else{ -  Pike_error("Index is not an integer.\n"); +  if (ind->type == T_STRING && !ind->u.string->size_shift) +  Pike_error ("Expected integer as string index, got \"%s\".\n", +  ind->u.string->str); +  else +  Pike_error ("Expected integer as string index, got %s.\n", +  get_name_of_type (ind->type));    }       case T_PROGRAM:    program_index_no_free(to, what->u.program, ind);    break;       case T_FUNCTION:    {    struct program *p = program_from_svalue(what);    if (p) {    program_index_no_free(to, p, ind);    break;    }    }    /* FALL THROUGH */       default: -  Pike_error("Indexing a basic type.\n"); +  if (ind->type == T_INT) +  Pike_error ("Cannot index %s with %"PRINTPIKEINT"d.\n", +  get_name_of_type (what->type), ind->u.integer); +  else if (ind->type == T_FLOAT) +  Pike_error ("Cannot index %s with %"PRINTPIKEFLOAT"g.\n", +  get_name_of_type (what->type), ind->u.float_number); +  else if (ind->type == T_STRING && !ind->u.string->size_shift) +  Pike_error ("Cannot index %s with \"%s\".\n", get_name_of_type (what->type), +  ind->u.string->str); +  else +  Pike_error ("Cannot index %s with %s.\n", get_name_of_type (what->type), +  get_name_of_type (ind->type));    }   }      void o_index(void)   {    struct svalue s;    index_no_free(&s,sp-2,sp-1);    pop_n_elems(2);    *sp=s;    dmalloc_touch_svalue(sp);