Branch: Tag:

1998-03-31

1998-03-31 21:52:23 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

optimized

Rev: src/docode.c:1.34
Rev: src/interpret.c:1.72
Rev: src/language.yacc:1.67
Rev: src/lex.c:1.46
Rev: src/lex.h:1.11
Rev: src/main.c:1.44
Rev: src/main.h:1.8
Rev: src/peep.c:1.20
Rev: src/peep.in:1.13

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: docode.c,v 1.33 1998/03/01 11:40:46 hubbe Exp $"); + RCSID("$Id: docode.c,v 1.34 1998/03/31 21:52:16 hubbe Exp $");   #include "las.h"   #include "program.h"   #include "language.h"
989:    fatal("Bugg in F_ARROW, index not string.");    if(flags & DO_LVALUE)    { -  /* FIXME!!!! */ +  /* FIXME!!!! ??? I wonder what needs fixing... /Hubbe */    tmp1=do_docode(CAR(n), 0);    emit(F_ARROW_STRING, store_prog_string(CDR(n)->u.sval.u.string));    return 2;    }else{ -  +  struct program *p; +  if(CAR(n) && +  CDR(n) && +  EXTRACT_UCHAR(CAR(n)->type->str)==T_OBJECT && +  (tmp2=EXTRACT_INT(CAR(n)->type->str+1)) && +  (p=id_to_program(tmp2)) && +  (FIND_LFUN(p,LFUN_ARROW)==-1) && +  CDR(n)->token == F_CONSTANT && +  CDR(n)->u.sval.type==T_STRING) +  { +  tmp3=find_shared_string_identifier(CDR(n)->u.sval.u.string,p); +  if(tmp3==-1) +  { +  yywarning("Accessing a non-existant identifier"); +  DO_CODE_BLOCK(CAR(n)); +  emit(F_NUMBER,0); +  return 1; +  }else{ +  struct identifier *i=ID_FROM_INT(p,tmp3); +  if(IDENTIFIER_IS_FUNCTION(i->identifier_flags)) +  {    tmp1=do_docode(CAR(n), DO_NOT_COPY); -  +  emit(F_STRICT_ARROW, tmp3); +  emit(F_DATA, tmp2); +  return tmp1; +  } +  if(IDENTIFIER_IS_VARIABLE(i->identifier_flags)) +  { +  tmp1=do_docode(CAR(n), DO_NOT_COPY); +  emit(F_STRICT_ARROW_VARIABLE, tmp3); +  emit(F_DATA, tmp2); +  return tmp1; +  } +  } +  } +  tmp1=do_docode(CAR(n), DO_NOT_COPY);    emit(F_ARROW, store_prog_string(CDR(n)->u.sval.u.string));    if(!(flags & DO_NOT_COPY))    {