diff --git a/src/ChangeLog b/src/ChangeLog index e8023b919d62bcab8a7447ff71a01e451789ca4e..da17511e3725ab404a66b64a5738c95c1264502f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -8,6 +8,17 @@ Sat Feb 10 21:43:42 1996 Fredrik Hubinette <hubbe@sparky.signum.se> * simulate.lpc: fixed an add_efun for exec * Updated a LOT of docfiles. +Sat Feb 10 02:26:25 1996 Fredrik Hubinette <hubbe@tymin.signum.se> + + * array.c: fixed a coredump when doing & on one compact and + one noncompact array. + * language.y: fixed so that continue now always need a semicolon + after it. + * builtin_efuns.c: replace_many fixed. + * array.c: fix_type_field fixed. + * las.c: fixed node_is_equal, it can now see the differance between + different global variables :P + Mon Nov 20 16:52:32 1995 Fredrik Hubinette <hubbe@sparky.signum.se> * builtin_efuns.c (replace_many): Fixed an array bound read. diff --git a/src/array.c b/src/array.c index ff504ba561f3c40d22e85ba66f04293fa58eef5d..76e6f2a1e762f6c29146f8fa2c4d4b136ea0ff51 100644 --- a/src/array.c +++ b/src/array.c @@ -962,7 +962,7 @@ void array_fix_type_field(struct array *v) break; default: - v->type_field=1 << v->array_type; + t=1 << v->array_type; for(e=0; e<v->size; e++) { if(! SHORT_ITEM(v)[e].refs) @@ -973,6 +973,10 @@ void array_fix_type_field(struct array *v) } } +#ifdef DEBUG + if(t & ~(v->type_field)) + fatal("Type field out of order!\n"); +#endif v->type_field = t; } @@ -1245,7 +1249,7 @@ struct array *array_zip(struct array *a, struct array *b,INT32 *zipper) }else{ if(b->array_type == T_MIXED) { - assign_svalue(ITEM(ret)+e, ITEM(a)+*zipper); + assign_svalue_no_free(ITEM(ret)+e, ITEM(b)+~*zipper); }else{ assign_from_short_svalue_no_free(ITEM(ret)+e, SHORT_ITEM(b)+~*zipper, diff --git a/src/builtin_efuns.c b/src/builtin_efuns.c index 521705eff69ce9645721bb53577a62585edd3bd6..90507b5a82d29d993927b36842ca49c7fb6053b4 100644 --- a/src/builtin_efuns.c +++ b/src/builtin_efuns.c @@ -1071,7 +1071,9 @@ struct lpc_string * replace_many(struct lpc_string *str, } } if(a<from->size && - !low_quick_binary_strcmp(v[a].ind->str,v[a].ind->len,s,length)) + length >= v[a].ind->len && + !low_quick_binary_strcmp(v[a].ind->str,v[a].ind->len, + s,v[a].ind->len)) { c=v[a].ind->len; if(!c) c=1; diff --git a/src/language.y b/src/language.y index 23dd5d1376449529643fe9a40c9fa5281a09b1c4..46739d6791214206fd05cc476215adeb0909cb67 100644 --- a/src/language.y +++ b/src/language.y @@ -615,8 +615,8 @@ statement: unused2 ';' { $$=$1; } | return ';' | block {} | foreach - | break - | continue + | break ';' + | continue ';' | error ';' { $$=0; } | ';' { $$=0; } ; diff --git a/src/las.c b/src/las.c index 333ce0f661105f528e404f4b87ad2d5b9dddc071..8d3d7f8a9b5bc6c2334c95c2dc975df12e1d86e5 100644 --- a/src/las.c +++ b/src/las.c @@ -327,6 +327,7 @@ int node_is_eq(node *a,node *b) switch(a->token) { case F_LOCAL: + case F_IDENTIFIER: return a->u.number == b->u.number; case F_CAST: diff --git a/src/test/create_testsuite b/src/test/create_testsuite index b79a1b3adc7a25d090cec30f92d06e685e771c2c..3efeae6cb43b35648262606c244a1889ce3251cb 100755 --- a/src/test/create_testsuite +++ b/src/test/create_testsuite @@ -59,6 +59,11 @@ define(TESTNO,0) test_compile_error_low(master()->add_precompiled_program(\"/test\",compile_string(\"int foo() { return 17; }\",\"62\"))) +test_compile([[while(0)if(0)continue;else;]]) +test_program([[int b=1,c; int a() { c=b+2; return c==3; }]]) +test_true([[ ("foobar"/"o") & ({ "foo" }) ]]) +test_any([[ array a="foo bar"/" "; return sizeof(a & ({"foo"}))]],1) + test_eq("\377"[0],255) test_do(add_efun("foo",clone(class {int i;}))) test_eq(foo->i,0)