pike.git / src / mapping.c

version» Context lines:

pike.git/src/mapping.c:1855:    free_mapping_data(bmd);       if(!eq) break;    }    }    md->valrefs--;    free_mapping_data(md);    return eq;   }    - void describe_mapping(struct mapping *m,struct processing *p,int indent) - { -  struct processing doing; -  struct array *a; -  JMP_BUF catch; -  ONERROR err; -  INT32 e,d; -  char buf[40]; -  - #ifdef PIKE_DEBUG -  if(m->data->refs <=0) -  Pike_fatal("Zero refs in mapping->data\n"); - #endif -  -  if(! m->data->size) -  { -  my_strcat("([ ])"); -  return; -  } -  -  doing.next=p; -  doing.pointer_a=(void *)m; -  for(e=0;p;e++,p=p->next) -  { -  if(p->pointer_a == (void *)m) -  { -  sprintf(buf,"@%ld",(long)e); -  my_strcat(buf); -  return; -  } -  } -  -  if (Pike_in_gc > GC_PASS_PREPARE && Pike_in_gc < GC_PASS_FREE) { -  /* Have to do without any temporary allocations. */ -  struct keypair *k; -  int notfirst = 0; -  -  if (m->data->size == 1) { -  my_strcat("([ /* 1 element */\n"); -  } else { -  sprintf(buf, "([ /* %ld elements */\n", (long)m->data->size); -  my_strcat(buf); -  } -  -  NEW_MAPPING_LOOP(m->data) { -  if (notfirst) my_strcat(",\n"); -  else notfirst = 1; -  for(d = 0; d < indent; d++) -  my_putchar(' '); -  describe_svalue(&k->ind, indent+2, &doing); -  my_strcat (": "); -  describe_svalue(&k->val, indent+2, &doing); -  } -  -  my_putchar('\n'); -  for(e=2; e<indent; e++) my_putchar(' '); -  my_strcat("])"); -  return; -  } -  -  a = mapping_indices(m); -  SET_ONERROR(err, do_free_array, a); -  -  if(! m->data->size) { /* mapping_indices may remove elements */ -  my_strcat("([ ])"); -  } -  else { -  int save_t_flag = Pike_interpreter.trace_level; -  dynamic_buffer save_buf; -  -  if (m->data->size == 1) { -  my_strcat("([ /* 1 element */\n"); -  } else { -  sprintf(buf, "([ /* %ld elements */\n", (long)m->data->size); -  my_strcat(buf); -  } -  -  save_buffer (&save_buf); -  Pike_interpreter.trace_level = 0; -  if(SETJMP(catch)) { -  free_svalue(&throw_value); -  mark_free_svalue (&throw_value); -  } -  else -  sort_array_destructively(a); -  UNSETJMP(catch); -  Pike_interpreter.trace_level = save_t_flag; -  restore_buffer (&save_buf); -  -  for(e = 0; e < a->size; e++) -  { -  struct svalue *tmp; -  if(e) -  my_strcat(",\n"); -  -  for(d = 0; d < indent; d++) -  my_putchar(' '); -  -  describe_svalue(ITEM(a)+e, indent+2, &doing); -  my_strcat (": "); -  -  { -  int save_t_flag=Pike_interpreter.trace_level; -  Pike_interpreter.trace_level=0; -  -  tmp=low_mapping_lookup(m, ITEM(a)+e); -  -  Pike_interpreter.trace_level=save_t_flag; -  } -  if(tmp) -  describe_svalue(tmp, indent+2, &doing); -  else -  my_strcat("** gone **"); -  } -  -  my_putchar('\n'); -  for(e=2; e<indent; e++) my_putchar(' '); -  my_strcat("])"); -  } -  -  UNSET_ONERROR(err); -  free_array(a); - } -  - node *make_node_from_mapping(struct mapping *m) - { - #ifdef PIKE_DEBUG -  if(m->data->refs <=0) -  Pike_fatal("Zero refs in mapping->data\n"); - #endif -  -  mapping_fix_type_field(m); -  -  if(!mapping_is_constant(m,0)) -  { -  struct array *ind, *val; -  node *n; -  ind=mapping_indices(m); -  val=mapping_values(m); -  n=mkefuncallnode("mkmapping", -  mknode(F_ARG_LIST, -  make_node_from_array(ind), -  make_node_from_array(val))); -  free_array(ind); -  free_array(val); -  return n; -  }else{ -  struct svalue s; -  -  if(!m->data->size) -  return mkefuncallnode("aggregate_mapping",0); -  -  SET_SVAL(s, T_MAPPING, 0, mapping, m); -  return mkconstantsvaluenode(&s); -  } - } -  +    /*! @decl mapping aggregate_mapping(mixed ... elems)    *!    *! Construct a mapping.    *!    *! Groups the arguments together two and two in key-index pairs and    *! creates a mapping of those pairs. Generally, the mapping literal    *! syntax is handier: @expr{([ key1:val1, key2:val2, ... ])@}    *!    *! @seealso    *! @[sizeof()], @[mappingp()], @[mkmapping()]