Branch: Tag:

1998-05-25

1998-05-25 10:38:47 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

made it possible to set index in strings

Rev: lib/modules/Yabu.pmod/test.pike:1.3
Rev: src/builtin_functions.c:1.111
Rev: src/docode.c:1.38
Rev: src/docode.h:1.7
Rev: src/interpret.c:1.85
Rev: src/main.c:1.53
Rev: src/module_support.c:1.12
Rev: src/object.c:1.52
Rev: src/operators.c:1.33
Rev: src/operators.h:1.5
Rev: src/stralloc.c:1.36
Rev: src/stralloc.h:1.16
Rev: src/testsuite.in:1.114

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: docode.c,v 1.37 1998/05/17 20:06:43 grubba Exp $"); + RCSID("$Id: docode.c,v 1.38 1998/05/25 10:38:44 hubbe Exp $");   #include "las.h"   #include "program.h"   #include "language.h"
220:    }    }    +  if(flags & DO_LVALUE_IF_POSSIBLE) +  { +  flags|=DO_INDIRECT; +  flags &=~DO_LVALUE_IF_POSSIBLE; +  }else{ +  flags &=~DO_INDIRECT; +  } +     switch(n->token)    {    case F_EXTERNAL:    emit(F_LDA, n->u.integer.a); -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    {    emit(F_EXTERNAL_LVALUE, n->u.integer.b);    return 2;
686:    }       case F_ARG_LIST: -  tmp1=do_docode(CAR(n),flags & ~DO_LVALUE); +  tmp1=do_docode(CAR(n),flags & ~WANT_LVALUE);    tmp1+=do_docode(CDR(n),flags);    return tmp1;   
944:    case F_ARROW:    if(CDR(n)->token != F_CONSTANT || CDR(n)->u.sval.type!=T_STRING)    fatal("Bugg in F_ARROW, index not string."); -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    {    /* FIXME!!!! ??? I wonder what needs fixing... /Hubbe */    tmp1=do_docode(CAR(n), 0);
963:    return tmp1;       case F_INDEX: -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    { -  tmp1=do_docode(CAR(n), 0); +  int mklval=CAR(n) && match_types(CAR(n)->type, string_type_string); +  tmp1=do_docode(CAR(n), +  mklval ? DO_LVALUE_IF_POSSIBLE : 0); +  if(tmp1==2) +  { + #ifdef DEBUG +  if(!mklval) +  fatal("Unwanted lvalue!\n"); + #endif +  emit2(F_INDIRECT); +  } +     if(do_docode(CDR(n),0) != 1)    fatal("Internal compiler error, please report this (1).");    if(CDR(n)->token != F_CONSTANT &&
975:    }else{    tmp1=do_docode(CAR(n), DO_NOT_COPY);    code_expression(CDR(n), DO_NOT_COPY, "index"); +     emit2(F_INDEX); -  +     if(!(flags & DO_NOT_COPY))    {    while(n && (n->token==F_INDEX || n->token==F_ARROW)) n=CAR(n);
1046:    case F_LOCAL:    if(n->u.number >= compiler_frame->max_number_of_locals)    yyerror("Illegal to use local variable here."); -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    {    emit(F_LOCAL_LVALUE,n->u.number);    return 2;
1058:    case F_IDENTIFIER:    if(IDENTIFIER_IS_FUNCTION(ID_FROM_INT(new_program, n->u.number)->identifier_flags))    { -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    {    yyerror("Cannot assign functions.\n");    }else{    emit(F_LFUN,n->u.number);    }    }else{ -  if(flags & DO_LVALUE) +  if(flags & WANT_LVALUE)    {    emit(F_GLOBAL_LVALUE,n->u.number);    return 2;