Branch: Tag:

2014-08-14

2014-08-14 15:32:53 by Per Hedbor <ph@opera.com>

Fixed some more cases of automap on the left side of an assignment.

It more or less works as one would expect now.

430:    }   }    + static int has_automap(node *n) + { +  if(!n) return 0; +  switch(n->token) +  { +  case F_AUTO_MAP_MARKER: +  case F_AUTO_MAP: +  return 1;    -  +  default: +  if(car_is_node(n) && has_automap(CAR(n)) ) +  return 1; +  if( cdr_is_node(n) && has_automap(CDR(n)) ) +  return 1; +  } +  return 0; + } +  +    int generate_call_function(node *n)   {    struct compilation *c = THIS_COMPILATION;
1173:    do_docode(lval,0); /* note: not lvalue */    if(do_docode(CAR(n),0)!=1)    yyerror("RHS is void!"); +  +  if( CAR(n)->token == F_AUTO_MAP_MARKER || +  CAR(n)->token == F_AUTO_MAP || +  /* Well, hello there... ;) */ +  /* This is what is generated by a[*] += 10 and such. */ +  (CAR(n)->token == F_SOFT_CAST && +  has_automap(CAR(n)))) +  {    emit1(F_ASSIGN_INDICES,depth); -  +  } +  else +  emit1(F_ASSIGN_ALL_INDICES,depth); +     if( flags & DO_POP )    emit0( F_POP_VALUE );    return !(flags&DO_POP);