Branch: Tag:

1998-02-01

1998-02-01 04:01:36 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

multi-lvalues implemented...

Rev: src/array.c:1.26
Rev: src/array.h:1.8
Rev: src/docode.c:1.30
Rev: src/interpret.c:1.66
Rev: src/language.yacc:1.59
Rev: src/las.c:1.50
Rev: src/lex.c:1.43
Rev: src/svalue.h:1.11

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: interpret.c,v 1.65 1998/02/01 02:07:24 hubbe Exp $"); + RCSID("$Id: interpret.c,v 1.66 1998/02/01 04:01:32 hubbe Exp $");   #include "interpret.h"   #include "object.h"   #include "program.h"
197:   {    switch(lval->type)    { +  case T_ARRAY_LVALUE: +  { +  INT32 e; +  struct array *a; +  ONERROR err; +  a=allocate_array(lval[1].u.array->size>>1); +  SET_ONERROR(err, do_free_array, a); +  for(e=0;e<a->size;e++) +  lvalue_to_svalue_no_free(a->item+e, lval[1].u.array->item+(e<<1)); +  to->type = T_ARRAY; +  to->u.array=a; +  UNSET_ONERROR(err); +  break; +  } +     case T_LVALUE:    assign_svalue_no_free(to, lval->u.lval);    break;
241:   {    switch(lval->type)    { +  case T_ARRAY_LVALUE: +  { +  INT32 e; +  if(from->type != T_ARRAY) +  error("Trying to assign combined lvalue from non-array.\n"); +  +  if(from->u.array->size < (lval[1].u.array->size>>1)) +  error("Not enough values for multiple assign.\n"); +  +  for(e=0;e<from->u.array->size;e++) +  assign_lvalue(lval[1].u.array->item+(e<<1),from->u.array->item+e); +  } +  break; +     case T_LVALUE:    assign_svalue(lval->u.lval,from);    break;
280:   {    switch(lval->type)    { +  case T_ARRAY_LVALUE: +  return 0; +     case T_LVALUE:    if(lval->u.lval->type == t) return & ( lval->u.lval->u );    return 0;
732:    sp+=2;    break;    +  CASE(F_ARRAY_LVALUE); +  f_aggregate(GET_ARG()*2); +  sp[-1].u.array->flags |= ARRAY_LVALUE; +  sp[0]=sp[-1]; +  sp[-1].type=T_ARRAY_LVALUE; +  sp++; +  break; +     CASE(F_CLEAR_2_LOCAL);    instr=GET_ARG();    free_svalues(fp->locals + instr, 2, -1);
1082:    }    break;    - #ifdef F_ASSIGN_ARRAY -  CASE(F_ASSIGN_ARRAY); -  { -  struct svalue *base=*--mark_sp; -  INT32 e,args=(sp-base)>>1 -  if(sp[-1].type != T_ARRAY) -  error("Bad argument to multiple assign, not an array.\n"); -  if(sp[-1].u.array->size < args) -  error("Not enough elements in array for multiple assign.\n"); -  -  for(e=0;e<args;e++) -  assign_lvalue(base+e*2,sp[-1].u.array->item+e); -  -  pop_n_elems(sp-base); -  break; -  } - #endif -  +     /* Stack machine stuff */    CASE(F_POP_VALUE); pop_stack(); break;    CASE(F_POP_N_ELEMS); pop_n_elems(GET_ARG()); break;