From 13a16d31ed91a3267af9d78e9601b29dc422d0e2 Mon Sep 17 00:00:00 2001 From: Martin Stjernholm <mast@lysator.liu.se> Date: Sat, 31 May 2003 01:19:26 +0200 Subject: [PATCH] Fixed error checking for missing functions in iterator objects given to foreach(). (foreach() would previously simply loop forever with index 0 and value 0 if given something that isn't an iterator.) Rev: src/iterators.cmod:1.42 Rev: src/testsuite.in:1.650 --- src/iterators.cmod | 20 +++++++++++++++----- src/testsuite.in | 8 +++++++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/iterators.cmod b/src/iterators.cmod index 01de6dfe26..ca37724df3 100644 --- a/src/iterators.cmod +++ b/src/iterators.cmod @@ -2,11 +2,11 @@ || 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: iterators.cmod,v 1.41 2003/04/28 00:32:43 mast Exp $ +|| $Id: iterators.cmod,v 1.42 2003/05/30 23:19:26 mast Exp $ */ #include "global.h" -RCSID("$Id: iterators.cmod,v 1.41 2003/04/28 00:32:43 mast Exp $"); +RCSID("$Id: iterators.cmod,v 1.42 2003/05/30 23:19:26 mast Exp $"); #include "main.h" #include "object.h" #include "mapping.h" @@ -1787,6 +1787,8 @@ PIKEFUN object(Iterator) get_iterator(object|array|mapping|multiset|string data) /* sp[-4] = index; sp[-2] = value */ int foreach_iterate(struct object *o) { + int fun; + if(!o->prog) Pike_error("foreach on destructed iterator.\n"); if(o->prog->flags & PROGRAM_HAS_C_METHODS) @@ -1958,26 +1960,34 @@ int foreach_iterate(struct object *o) } /* Generic iteration */ - apply_lfun(o,LFUN_NOT,0); + fun = FIND_LFUN (o->prog, LFUN_NOT); + if (fun < 0) Pike_error ("Iterator object lacks `!.\n"); + apply_low(o, fun, 0); if(UNSAFE_IS_ZERO(Pike_sp-1)) { pop_stack(); if(Pike_sp[-4].type != T_INT) { - apply(o,"index",0); + fun = find_identifier ("index", o->prog); + if (fun < 0) Pike_error ("Iterator object lacks index().\n"); + apply_low(o, fun, 0); assign_lvalue(Pike_sp-5,Pike_sp-1); pop_stack(); } if(Pike_sp[-2].type != T_INT) { - apply(o,"value",0); + fun = find_identifier ("value", o->prog); + if (fun < 0) Pike_error ("Iterator object lacks value().\n"); + apply_low(o, fun, 0); assign_lvalue(Pike_sp-3,Pike_sp-1); pop_stack(); } push_int(1); + fun = FIND_LFUN (o->prog, LFUN_ADD_EQ); + if (fun < 0) Pike_error ("Iterator object lacks `+=.\n"); apply_lfun(o,LFUN_ADD_EQ,1); pop_stack(); return 1; diff --git a/src/testsuite.in b/src/testsuite.in index 90262900e4..c6f521a007 100644 --- a/src/testsuite.in +++ b/src/testsuite.in @@ -1,4 +1,4 @@ -test_true([["$Id: testsuite.in,v 1.649 2003/05/30 19:38:06 grubba Exp $"]]); +test_true([["$Id: testsuite.in,v 1.650 2003/05/30 23:19:26 mast Exp $"]]); // This triggered a bug only if run sufficiently early. test_compile_any([[#pike 7.2]]) @@ -6718,6 +6718,12 @@ test_any([[ return ret; ]],315) +test_eval_error([[ + int i; + foreach (class{}(); mixed a; mixed b) i++; + return i; +]]) + // do-while test_any(int e;string t=""; e=0; do{ t+=e; }while(++e<6); return t,"012345";) -- GitLab