diff --git a/src/treeopt.in b/src/treeopt.in index 4db18b5a991f480170fff1333ebf52b29588496a..8e4a5fbd538f55f6649859478d17e5c902f78248 100644 --- a/src/treeopt.in +++ b/src/treeopt.in @@ -1,6 +1,6 @@ // -*- c -*- // -// $Id: treeopt.in,v 1.46 2000/10/01 18:08:48 grubba Exp $ +// $Id: treeopt.in,v 1.47 2000/10/02 13:52:04 grubba Exp $ // // The tree optimizer // @@ -88,6 +88,37 @@ F_APPLY(0 = F_CONSTANT } ; +// `-(`-(a,b),c) => `-(a, b, c) +// NOTE: We do some ugly stuff here to avoid +// resolving the resulting type multiple times. +F_APPLY(0 = F_CONSTANT + [$$->u.sval.type == T_FUNCTION] + [$$->u.sval.subtype == FUNCTION_BUILTIN] + [$$->u.sval.u.efun->function == f_minus], + 2 = F_ARG_LIST(F_APPLY($0, 1), 3)): + { + node *arglist = $2; +#ifdef SHARED_NODES + sub_node(n); +#endif /* SHARED_NODES */ + ADD_NODE_REF2($1, + ADD_NODE_REF2($3, + _CDR(n) = mknode(F_ARG_LIST, $1, $3))); +#ifdef SHARED_NODES + n->hash = hash_node(n); + n->node_info |= OPT_DEFROSTED; +#endif /* SHARED_NODES */ + free_node(arglist); +#ifdef PIKE_DEBUG + if (l_flag > 4) { + fprintf(stderr, "Result: "); + print_tree(n); + } +#endif /* PIKE_DEBUG */ + continue; + } + ; + // `*(`*(a,b),c) => `*(a, b, c) // NOTE: We do some ugly stuff here to avoid // resolving the resulting type multiple times.