diff --git a/src/opcodes.c b/src/opcodes.c index cebe906a2ff17726af7cf5ae59316afa9046cd4e..7ba3d3c45eca41e7825d035cf02b020c3ecacbc4 100644 --- a/src/opcodes.c +++ b/src/opcodes.c @@ -2,7 +2,7 @@ || 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.149 2003/08/05 12:58:42 mast Exp $ +|| $Id: opcodes.c,v 1.150 2003/08/13 15:45:53 grubba Exp $ */ #include "global.h" @@ -30,7 +30,7 @@ #define sp Pike_sp -RCSID("$Id: opcodes.c,v 1.149 2003/08/05 12:58:42 mast Exp $"); +RCSID("$Id: opcodes.c,v 1.150 2003/08/13 15:45:53 grubba Exp $"); void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind) { @@ -42,33 +42,6 @@ void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind) 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 && !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 %s.\n", - val, get_name_of_type (ind->type)); - } else { - 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 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; @@ -132,18 +105,57 @@ void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind) } /* FALL THROUGH */ +#ifdef AUTO_BIGNUM + case T_INT: + if (ind->type == T_STRING) { + 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->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 a wide string.\n", + val); + } else { + if(!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 with a wide string.\n"); + } + } + break; + } + + /* FALL_THROUGH */ +#endif /* AUTO_BIGNUM */ + default: if (ind->type == T_INT) Pike_error ("Cannot index %s with %"PRINTPIKEINT"d.\n", - get_name_of_type (what->type), ind->u.integer); + (what->type == T_INT && !what->u.integer)? + "the NULL value":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); + (what->type == T_INT && !what->u.integer)? + "the NULL value":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), + Pike_error ("Cannot index %s with \"%s\".\n", + (what->type == T_INT && !what->u.integer)? + "the NULL value":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), + Pike_error ("Cannot index %s with %s.\n", + (what->type == T_INT && !what->u.integer)? + "the NULL value":get_name_of_type(what->type), get_name_of_type (ind->type)); } } @@ -2125,6 +2137,9 @@ static INT32 low_sscanf(struct pike_string *data, struct pike_string *format) ptrdiff_t matched_chars; int x; INT32 i; + + check_c_stack(sizeof(struct sscanf_set)*2 + 512); + switch(data->size_shift*3 + format->size_shift) { /* input_shift : match_shift */ case 0: