diff --git a/src/docode.c b/src/docode.c index 627cd81c354bcc5800717ccae802763871c82aee..80b397cfb00e0ac4ffc579b5afc9c3c0c028e377 100644 --- a/src/docode.c +++ b/src/docode.c @@ -4,7 +4,7 @@ ||| See the files COPYING and DISCLAIMER for more information. \*/ #include "global.h" -RCSID("$Id: docode.c,v 1.39 1998/07/31 06:51:41 hubbe Exp $"); +RCSID("$Id: docode.c,v 1.40 1998/10/09 23:30:21 hubbe Exp $"); #include "las.h" #include "program.h" #include "language.h" @@ -993,7 +993,11 @@ static int do_docode2(node *n,int flags) return 2; }else{ tmp1=do_docode(CAR(n), DO_NOT_COPY); + code_expression(CDR(n), DO_NOT_COPY, "index"); + if(CDR(n)->token != F_CONSTANT && + match_types(CDR(n)->type, string_type_string)) + emit2(F_CLEAR_STRING_SUBTYPE); emit2(F_INDEX); diff --git a/src/peep.in b/src/peep.in index 3f5f173d0dd94ab7d9243480177f58d1ed44c691..bbe854d811630509ae13ee2c2a3d81f5aa1a3a8c 100644 --- a/src/peep.in +++ b/src/peep.in @@ -1,5 +1,5 @@ // -// $Id: peep.in,v 1.22 1998/09/01 20:25:10 hubbe Exp $ +// $Id: peep.in,v 1.23 1998/10/09 23:30:22 hubbe Exp $ // NOP : @@ -130,8 +130,20 @@ MARK LOCAL [ $3o != F_SIZEOF && $3o != F_INDEX ]: MARK_AND_LOCAL ($2a) MARK STRING : MARK_AND_STRING($2a) LOCAL SIZEOF: SIZEOF_LOCAL ($1a) STRING INDEX: STRING_INDEX ($1a) + +STRING CLEAR_STRING_SUBTYPE: STRING ($1a) +CONST0 CLEAR_STRING_SUBTYPE: CONST0 +CONST1 CLEAR_STRING_SUBTYPE: CONST1 +CONST_1 CLEAR_STRING_SUBTYPE: CONST_1 +NUMBER CLEAR_STRING_SUBTYPE: NUMBER($1a) +NEG_NUMBER CLEAR_STRING_SUBTYPE: NEG_NUMBER($1a) + LOCAL INDEX: LOCAL_INDEX ($1a) +LOCAL CLEAR_STRING_SUBTYPE INDEX: LOCAL_INDEX ($1a) + LOCAL LOCAL INDEX: LOCAL_LOCAL_INDEX($2a) BYTE($1a) +LOCAL LOCAL CLEAR_STRING_SUBTYPE INDEX: LOCAL_LOCAL_INDEX($2a) BYTE($1a) + CONST0 INDEX: POS_INT_INDEX (0) CONST_1 INDEX: NEG_INT_INDEX (1) CONST1 INDEX: POS_INT_INDEX (1) diff --git a/src/testsuite.in b/src/testsuite.in index e18e0a0904c63c38605711fbe97e849641c14d72..c083dc7d449a2fb29c758d66b18fcc624aa3a1f3 100644 --- a/src/testsuite.in +++ b/src/testsuite.in @@ -1,4 +1,4 @@ -stest_true([["$Id: testsuite.in,v 1.122 1998/09/01 17:05:24 grubba Exp $"]]) +stest_true([["$Id: testsuite.in,v 1.123 1998/10/09 23:30:23 hubbe Exp $"]]) cond([[all_constants()->_verify_internals]], [[ test_do(_verify_internals()) @@ -1257,6 +1257,8 @@ test_eq((<'f','o','o'>)['f'],1) test_eq((<'f','o','o'>)['b'],0) test_eq((<'f','o','o'>)[-1],0) +test_eq([[class Z { mixed `->(mixed x) { return this_object()[x]; } int foo() { return 1; }}()->foo()]],1) + // index assigning test_any(mixed a=({1}); a[0]=2; return equal(a,({2})),1) test_any(mixed a=(<1>); a[1]=2; return equal(a,(<1>)),1)