pike.git / src / las.c

version» Context lines:

pike.git/src/las.c:1181: Inside #if defined(__CHECKER__)
  #ifdef __CHECKER__    _CDR(res) = 0;   #endif    res->u.trampoline.ident=i;    res->u.trampoline.frame=frame;       for(f=Pike_compiler->compiler_frame;f != frame;f=f->previous)    f->lexical_scope|=SCOPE_SCOPED;    f->lexical_scope|=SCOPE_SCOPE_USED;    - #ifdef SHARED_NODES +     res->u.trampoline.prog = Pike_compiler->new_program; - #endif /* SHARED_NODES */ +        check_tree(res,0);    return res;   }      node *debug_mkexternalnode(struct program *parent_prog, int i)   {   #if 0    return mkidentifiernode(add_ext_ref(Pike_compiler, parent_prog, i));   
pike.git/src/las.c:1837:       if(a == b) return 1;    if(!a || !b) return 0;    if(a->token != b->token) return 0;       fatal_check_c_stack(16384);       switch(a->token)    {    case F_TRAMPOLINE: /* FIXME, the context has to be the same! */ - #ifdef SHARED_NODES +     if(a->u.trampoline.prog != b->u.trampoline.prog)    return 0; - #endif +     return a->u.trampoline.ident == b->u.trampoline.ident &&    a->u.trampoline.frame == b->u.trampoline.frame;       case F_EXTERNAL:    case F_GET_SET:    case F_LOCAL:    return a->u.integer.a == b->u.integer.a &&    a->u.integer.b == b->u.integer.b;       case F_CAST:
pike.git/src/las.c:4058:    break;    }   #ifdef PIKE_DEBUG    if (n != orig_n) {    Pike_fatal("zzap_try_optimize() lost track of parent.\n");    }   #endif /* PIKE_DEBUG */    n->parent = parent;   }    - #if defined(SHARED_NODES) && 0 - /* FIXME: Ought to use parent pointer to avoid recursion. */ - static void find_usage(node *n, unsigned char *usage, -  unsigned char *switch_u, -  const unsigned char *cont_u, -  const unsigned char *break_u, -  const unsigned char *catch_u) - { -  if (!n) -  return; +     -  fatal_check_c_stack(16384); -  -  switch(n->token) { -  case F_ASSIGN: -  case F_ASSIGN_SELF: -  if ((CAR(n)->token == F_LOCAL) && (!CDR(n)->u.integer.b)) { -  usage[CAR(n)->u.integer.a] = 0; -  } else if (CAR(n)->token == F_ARRAY_LVALUE) { -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  } -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  -  case F_SSCANF: -  { -  int i; -  -  /* catch_usage is restored if sscanf throws an error. */ -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_u[i]; -  } -  /* Only the first two arguments are evaluated. */ -  if (CAR(n)) { -  find_usage(CDAR(n), usage, switch_u, cont_u, break_u, catch_u); -  find_usage(CAAR(n), usage, switch_u, cont_u, break_u, catch_u); -  } -  return; -  } -  -  case F_CATCH: -  { -  unsigned char catch_usage[MAX_LOCAL]; -  int i; -  -  memcpy(catch_usage, usage, MAX_LOCAL); -  find_usage(CAR(n), usage, switch_u, cont_u, catch_usage, catch_usage); -  for(i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_usage[i]; -  } -  return; -  } -  -  case F_AUTO_MAP: -  case F_APPLY: -  { -  int i; -  -  /* catch_usage is restored if the function throws an error. */ -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_u[i]; -  } -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case F_LVALUE_LIST: -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  if (CAR(n)) { -  if ((CAR(n)->token == F_LOCAL) && (!CAR(n)->u.integer.b)) { -  usage[CAR(n)->u.integer.a] = 0; -  } -  } -  return; -  -  case F_ARRAY_LVALUE: -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  -  case F_CONTINUE: -  memcpy(usage, cont_u, MAX_LOCAL); -  return; -  -  case F_BREAK: -  memcpy(usage, break_u, MAX_LOCAL); -  return; -  -  case F_DEFAULT: -  case F_CASE: -  case F_CASE_RANGE: -  { -  int i; -  -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  for(i = 0; i < MAX_LOCAL; i++) { -  switch_u[i] |= usage[i]; -  } -  return; -  } -  -  case F_SWITCH: -  { -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char switch_usage[MAX_LOCAL]; -  int i; -  -  memset(switch_usage, 0, MAX_LOCAL); -  memcpy(break_usage, usage, MAX_LOCAL); -  -  find_usage(CDR(n), usage, switch_usage, cont_u, break_usage, catch_u); -  -  for(i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= switch_usage[i]; -  } -  -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case F_RETURN: -  memset(usage, 0, MAX_LOCAL); -  /* FIXME: The function arguments should be marked "used", since -  * they are seen in backtraces. -  */ -  return; -  -  case F_LOR: -  case F_LAND: -  { -  unsigned char trail_usage[MAX_LOCAL]; -  int i; -  -  memcpy(trail_usage, usage, MAX_LOCAL); -  -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  for(i=0; i < MAX_LOCAL; i++) { -  usage[i] |= trail_usage[i]; -  } -  -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case '?': -  { -  unsigned char cadr_usage[MAX_LOCAL]; -  unsigned char cddr_usage[MAX_LOCAL]; -  int i; -  -  memcpy(cadr_usage, usage, MAX_LOCAL); -  memcpy(cddr_usage, usage, MAX_LOCAL); -  -  find_usage(CADR(n), cadr_usage, switch_u, cont_u, break_u, catch_u); -  find_usage(CDDR(n), cddr_usage, switch_u, cont_u, break_u, catch_u); -  -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] = cadr_usage[i] | cddr_usage[i]; -  } -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case F_DO: -  { -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  find_usage(CDR(n), usage, switch_u, cont_u, break_usage, catch_u); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  find_usage(CAR(n), usage, switch_u, break_usage, continue_usage, -  catch_u); -  return; -  } -  -  case F_FOR: -  { -  unsigned char loop_usage[MAX_LOCAL]; -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  int i; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  /* for(;a;b) c; is handled like: -  * -  * if (a) { do { c; b; } while(a); } -  */ -  -  memset(loop_usage, 0, MAX_LOCAL); -  -  find_usage(CAR(n), loop_usage, switch_u, cont_u, break_u, catch_u); -  if (CDR(n)) { -  find_usage(CDDR(n), loop_usage, switch_u, cont_u, break_usage, -  catch_u); -  -  memcpy(continue_usage, loop_usage, MAX_LOCAL); -  -  find_usage(CADR(n), loop_usage, switch_u, continue_usage, break_usage, -  catch_u); -  } -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= loop_usage[i]; -  } -  -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case F_FOREACH: -  { -  unsigned char loop_usage[MAX_LOCAL]; -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  int i; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  /* Find the usage from the loop */ -  -  memset(loop_usage, 0, MAX_LOCAL); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  find_usage(CDR(n), loop_usage, switch_u, continue_usage, break_usage, -  catch_u); -  if (CDAR(n)->token == F_LOCAL) { -  if (!(CDAR(n)->u.integer.b)) { -  loop_usage[CDAR(n)->u.integer.a] = 0; -  } -  } else if (CDAR(n)->token == F_LVALUE_LIST) { -  find_usage(CDAR(n), loop_usage, switch_u, cont_u, break_u, catch_u); -  } -  -  for(i=0; i < MAX_LOCAL; i++) { -  usage[i] |= loop_usage[i]; -  } -  -  find_usage(CAAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return; -  } -  -  case F_LOCAL: -  /* Use of local variable. */ -  if (!n->u.integer.b) { -  /* Recently used, and used at all */ -  usage[n->u.integer.a] = 3; -  } -  return; -  -  default: -  if (cdr_is_node(n)) { -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  } -  if (car_is_node(n)) { -  find_usage(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  } -  return; -  } - } -  - /* Note: Always builds a new tree. */ - static node *low_localopt(node *n, -  unsigned char *usage, -  unsigned char *switch_u, -  const unsigned char *cont_u, -  const unsigned char *break_u, -  const unsigned char *catch_u) - { -  node *car, *cdr; -  -  if (!n) -  return NULL; -  -  switch(n->token) { -  /* FIXME: Does not support F_LOOP yet. */ -  case F_ASSIGN: -  case F_ASSIGN_SELF: -  if ((CAR(n)->token == F_LOCAL) && (!CAR(n)->u.integer.b)) { -  /* Assignment of local variable */ -  if (!(usage[CAR(n)->u.integer.a] & 1)) { -  /* Value isn't used. */ -  struct pike_type *ref_type; -  MAKE_CONSTANT_TYPE(ref_type, tOr(tComplex, tString)); -  if (!match_types(CAR(n)->type, ref_type)) { -  /* The variable doesn't hold a refcounted value. */ -  free_type(ref_type); -  return low_localopt(CDR(n), usage, switch_u, cont_u, -  break_u, catch_u); -  } -  free_type(ref_type); -  } -  usage[CAR(n)->u.integer.a] = 0; -  car = CAR(n); -  ADD_NODE_REF(car); -  } else if (CAR(n)->token == F_ARRAY_LVALUE) { -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  } else { -  car = CAR(n); -  ADD_NODE_REF(car); -  } -  return mknode(n->token, low_localopt(CDR(n), usage, switch_u, cont_u, -  break_u, catch_u), car); -  -  case F_SSCANF: -  { -  int i; -  -  /* catch_usage is restored if sscanf throws an error. */ -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_u[i]; -  } -  /* Only the first two arguments are evaluated. */ -  if (CAR(n)) { -  cdr = low_localopt(CDAR(n), usage, switch_u, cont_u, break_u, catch_u); -  car = low_localopt(CAAR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  if (CDR(n)) { -  ADD_NODE_REF(CDR(n)); -  } -  return mknode(F_SSCANF, mknode(F_ARG_LIST, car, cdr), CDR(n)); -  } -  ADD_NODE_REF(n); -  return n; -  } -  -  case F_CATCH: -  { -  unsigned char catch_usage[MAX_LOCAL]; -  int i; -  -  memcpy(catch_usage, usage, MAX_LOCAL); -  car = low_localopt(CAR(n), usage, switch_u, cont_u, catch_usage, -  catch_usage); -  for(i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_usage[i]; -  } -  return mknode(F_CATCH, car, 0); -  } -  break; -  -  case F_AUTO_MAP: -  case F_APPLY: -  { -  int i; -  -  /* catch_usage is restored if the function throws an error. */ -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] |= catch_u[i]; -  } -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return mknode(n->token, car, cdr); -  } -  -  case F_LVALUE_LIST: -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  if (CAR(n)) { -  if ((CAR(n)->token == F_LOCAL) && (!CAR(n)->u.integer.b)) { -  /* Array assignment of local variable. */ -  if (!(usage[CDR(n)->u.integer.a] & 1)) { -  /* Variable isn't used. */ -  /* FIXME: Warn? */ -  } -  usage[CAR(n)->u.integer.a] = 0; -  } -  ADD_NODE_REF(CAR(n)); -  } -  return mknode(F_LVALUE_LIST, CAR(n), cdr); -  -  case F_ARRAY_LVALUE: -  return mknode(F_ARRAY_LVALUE, low_localopt(CAR(n), usage, switch_u, cont_u, -  break_u, catch_u), 0); -  -  -  -  case F_CAST: -  return mkcastnode(n->type, low_localopt(CAR(n), usage, switch_u, cont_u, -  break_u, catch_u)); -  -  case F_SOFT_CAST: -  return mksoftcastnode(n->type, low_localopt(CAR(n), usage, switch_u, -  cont_u, break_u, catch_u)); -  -  case F_CONTINUE: -  memcpy(usage, cont_u, MAX_LOCAL); -  ADD_NODE_REF(n); -  return n; -  -  case F_BREAK: -  memcpy(usage, break_u, MAX_LOCAL); -  ADD_NODE_REF(n); -  return n; -  -  case F_DEFAULT: -  case F_CASE: -  case F_CASE_RANGE: -  { -  int i; -  -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  for(i = 0; i < MAX_LOCAL; i++) { -  switch_u[i] |= usage[i]; -  } -  return mknode(n->token, car, cdr); -  } -  -  case F_SWITCH: -  { -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char switch_usage[MAX_LOCAL]; -  int i; -  -  memset(switch_usage, 0, MAX_LOCAL); -  memcpy(break_usage, usage, MAX_LOCAL); -  -  cdr = low_localopt(CDR(n), usage, switch_usage, cont_u, break_usage, -  catch_u); -  -  for(i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= switch_usage[i]; -  } -  -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return mknode(F_SWITCH, car, cdr); -  } -  -  case F_RETURN: -  memset(usage, 0, MAX_LOCAL); -  /* FIXME: The function arguments should be marked "used", since -  * they are seen in backtraces. -  */ -  return mknode(F_RETURN, low_localopt(CAR(n), usage, switch_u, cont_u, -  break_u, catch_u), 0); -  -  case F_LOR: -  case F_LAND: -  { -  unsigned char trail_usage[MAX_LOCAL]; -  int i; -  -  memcpy(trail_usage, usage, MAX_LOCAL); -  -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  for(i=0; i < MAX_LOCAL; i++) { -  usage[i] |= trail_usage[i]; -  } -  -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  return mknode(n->token, car, cdr); -  } -  -  case '?': -  { -  unsigned char cadr_usage[MAX_LOCAL]; -  unsigned char cddr_usage[MAX_LOCAL]; -  int i; -  -  memcpy(cadr_usage, usage, MAX_LOCAL); -  memcpy(cddr_usage, usage, MAX_LOCAL); -  -  car = low_localopt(CADR(n), cadr_usage, switch_u, cont_u, break_u, -  catch_u); -  cdr = low_localopt(CDDR(n), cddr_usage, switch_u, cont_u, break_u, -  catch_u); -  -  for (i=0; i < MAX_LOCAL; i++) { -  usage[i] = cadr_usage[i] | cddr_usage[i]; -  } -  cdr = mknode(':', car, cdr); -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  return mknode('?', car, cdr); -  } -  -  case F_DO: -  { -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  int i; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  /* Find the usage from the loop */ -  find_usage(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  find_usage(CAR(n), usage, switch_u, continue_usage, break_usage, -  catch_u); -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= break_usage[i]; -  } -  -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_usage, -  catch_u); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  car = low_localopt(CAR(n), usage, switch_u, continue_usage, break_usage, -  catch_u); -  -  return mknode(F_DO, car, cdr); -  } -  -  case F_FOR: -  { -  unsigned char loop_usage[MAX_LOCAL]; -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  int i; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  /* -  * if (a A|B) { -  * B -  * do { -  * B -  * c; -  * continue: -  * D -  * b; -  * C -  * } while (a A|B); -  * A -  * } -  * break: -  * A -  */ -  -  /* Find the usage from the loop. */ -  -  memset(loop_usage, 0, MAX_LOCAL); -  -  find_usage(CAR(n), loop_usage, switch_u, cont_u, break_u, catch_u); -  if (CDR(n)) { -  find_usage(CDDR(n), loop_usage, switch_u, cont_u, break_usage, -  catch_u); -  -  memcpy(continue_usage, loop_usage, MAX_LOCAL); -  -  find_usage(CADR(n), loop_usage, switch_u, continue_usage, break_usage, -  catch_u); -  } -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= loop_usage[i]; -  } -  -  /* The last thing to be evaluated is the conditional */ -  car = low_localopt(CAR(n), usage, switch_u, cont_u, break_u, catch_u); -  -  if (CDR(n)) { -  node *cadr, *cddr; -  -  /* The incrementor */ -  cddr = low_localopt(CDDR(n), usage, switch_u, cont_u, break_usage, -  catch_u); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  /* The body */ -  cadr = low_localopt(CADR(n), usage, switch_u, continue_usage, -  break_usage, catch_u); -  cdr = mknode(':', cadr, cddr); -  } else { -  cdr = 0; -  } -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= break_usage[i]; -  } -  -  /* The conditional is also the first thing to be evaluated. */ -  find_usage(car, usage, switch_u, cont_u, break_u, catch_u); -  -  return mknode(F_FOR, car, cdr); -  } -  -  case F_FOREACH: -  { -  unsigned char loop_usage[MAX_LOCAL]; -  unsigned char break_usage[MAX_LOCAL]; -  unsigned char continue_usage[MAX_LOCAL]; -  int i; -  -  memcpy(break_usage, usage, MAX_LOCAL); -  -  /* -  * D -  * arr = copy_value(arr); -  * int i = 0; -  * A|B -  * while (i < sizeof(arr)) { -  * B -  * loopvar = arr[i]; -  * C -  * body; -  * continue: -  * A|B -  * } -  * break: -  * A -  */ -  -  /* Find the usage from the loop */ -  memset(loop_usage, 0, MAX_LOCAL); -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  -  find_usage(CDR(n), loop_usage, switch_u, continue_usage, break_usage, -  catch_u); -  if (CDAR(n)->token == F_LOCAL) { -  if (!(CDAR(n)->u.integer.b)) { -  loop_usage[CDAR(n)->u.integer.a] = 0; -  } -  } else if (CDAR(n)->token == F_LVALUE_LIST) { -  find_usage(CDAR(n), loop_usage, switch_u, cont_u, break_u, catch_u); -  } -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= loop_usage[i]; -  } -  -  memcpy(continue_usage, usage, MAX_LOCAL); -  cdr = low_localopt(CDR(n), usage, switch_u, continue_usage, break_usage, -  catch_u); -  if (CDAR(n)->token == F_LOCAL) { -  if (!(CDAR(n)->u.integer.b)) { -  usage[CDAR(n)->u.integer.a] = 0; -  } -  } else if (CDAR(n)->token == F_LVALUE_LIST) { -  find_usage(CDAR(n), usage, switch_u, cont_u, break_u, catch_u); -  } -  -  for (i = 0; i < MAX_LOCAL; i++) { -  usage[i] |= break_usage[i]; -  } -  -  car = low_localopt(CAAR(n), usage, switch_u, cont_u, break_u, catch_u); -  ADD_NODE_REF(CDAR(n)); -  return mknode(F_FOREACH, mknode(F_VAL_LVAL, car, CDAR(n)), cdr); -  } -  -  case F_LOCAL: -  /* Use of local variable. */ -  if (!n->u.integer.b) { -  /* Recently used, and used at all */ -  usage[n->u.integer.a] = 3; -  } -  ADD_NODE_REF(n); -  return n; -  -  default: -  if (cdr_is_node(n)) { -  cdr = low_localopt(CDR(n), usage, switch_u, cont_u, break_u, catch_u); -  return mknode(n->token, low_localopt(CAR(n), usage, switch_u, cont_u, -  break_u, catch_u), -  cdr); -  } -  if (car_is_node(n)) { -  ADD_NODE_REF(CDR(n)); -  return mknode(n->token, low_localopt(CAR(n), usage, switch_u, cont_u, -  break_u, catch_u), -  CDR(n)); -  } -  ADD_NODE_REF(n); -  return n; -  } - } -  - static node *localopt(node *n) - { -  unsigned char usage[MAX_LOCAL]; -  unsigned char b_usage[MAX_LOCAL]; -  unsigned char c_usage[MAX_LOCAL]; -  unsigned char s_usage[MAX_LOCAL]; -  unsigned char catch_usage[MAX_LOCAL]; -  node *n2; -  -  memset(usage, 0, MAX_LOCAL); -  memset(b_usage, 0, MAX_LOCAL); -  memset(c_usage, 0, MAX_LOCAL); -  memset(s_usage, 0, MAX_LOCAL); -  memset(catch_usage, 0, MAX_LOCAL); -  -  n2 = low_localopt(n, usage, s_usage, c_usage, b_usage, catch_usage); -  - #ifdef PIKE_DEBUG -  if (l_flag > 0) { -  if ((n2 != n) || (l_flag > 4)) { -  fputs("\nBefore localopt: ", stderr); -  print_tree(n); -  -  fputs("After localopt: ", stderr); -  print_tree(n2); -  } -  } - #endif /* PIKE_DEBUG */ -  -  free_node(n); -  return n2; - } - #endif /* SHARED_NODES && 0 */ -  +    static void optimize(node *n)   {    node *tmp1, *tmp2, *tmp3;    struct compilation *c = THIS_COMPILATION;    struct pike_string *save_file =    dmalloc_touch(struct pike_string *, c->lex.current_file);    INT_TYPE save_line = c->lex.current_line;    struct pike_string *plus_name = lfun_strings[LFUN_ADD];    struct pike_string *minus_name = lfun_strings[LFUN_SUBTRACT];   
pike.git/src/las.c:5299:    {    tmp.offset=-1;   #ifdef PIKE_DEBUG    if(a_flag > 4)    {    fputs("Making prototype (pass 1) for: ", stderr);    print_tree(n);    }   #endif    }else{ - #if defined(SHARED_NODES) && 0 -  /* Try the local variable usage analyser. */ -  n = localopt(n); -  /* Try optimizing some more. */ -  optimize(n); - #endif /* SHARED_NODES && 0 */ +     n = mknode(F_ARG_LIST, n, 0);       if((foo=is_stupid_func(n, args, vargs, type)))    {    if(TYPEOF(*foo) == T_FUNCTION && SUBTYPEOF(*foo) == FUNCTION_BUILTIN)    {    tmp.c_fun=foo->u.efun->function;    if(tmp.c_fun != f_destruct &&    tmp.c_fun != f_this_object &&    tmp.c_fun != f_backtrace)