pike.git
/
src
/
docode.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/docode.c:423:
return !!CAR(n)+!!CDR(n); default: ret=0; if(car_is_node(n)) ret += count_cases(CAR(n)); if(cdr_is_node(n)) ret += count_cases(CDR(n)); return ret; } }
+
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; emit0(F_MARK); PUSH_CLEANUP_FRAME(do_pop_mark, 0); do_docode(CDR(n),DO_NOT_COPY); emit0(F_CALL_FUNCTION); POP_AND_DONT_CLEANUP; return 1; }
pike.git/src/docode.c:1166:
int depth = 0; node *lval = CDR(n); while( lval->token == F_AUTO_MAP_MARKER ) { lval = CAR(lval); depth++; } 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); } switch(CAR(n)->token) { case F_RANGE: if(node_is_eq(CDR(n),CAAR(n))) {