pike.git / src / encode.c

version» Context lines:

pike.git/src/encode.c:1092: Inside #if 0
  #if 0    Pike_error("Cannot encode C programs.\n");   #endif    } else {    EDB(1, fprintf(stderr,    "%*sencode: encoding program overloading a C program.\n",    data->depth, ""));    }    }    - #ifdef OLD_PIKE_ENCODE_PROGRAM -  -  EDB(1, -  fprintf(stderr, "%*sencode: encoding program in old style\n", -  data->depth, "")); -  -  /* Type 1 -- Old-style encoding. */ -  -  code_entry(TAG_PROGRAM, 1, data); -  push_compact_version(); -  encode_value2(Pike_sp-1,data, 0); -  pop_stack(); -  code_number(p->flags,data); -  code_number(p->storage_needed,data); -  code_number(p->xstorage,data); /**/ -  code_number(p->parent_info_storage,data); /**/ -  -  code_number(p->alignment_needed,data); -  code_number(p->timestamp.tv_sec,data); -  code_number(p->timestamp.tv_usec,data); -  -  if(p->parent) -  ref_push_program(p->parent); -  else -  push_int(0); -  encode_value2(Pike_sp-1,data, 0); /**/ -  pop_stack(); -  - #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) \ -  code_number( p->PIKE_CONCAT(num_,NAME), data); - #include "program_areas.h" -  -  code_number(PIKE_BYTECODE_METHOD, data); -  - #ifdef ENCODE_PROGRAM - #ifdef PIKE_DEBUG -  { -  ptrdiff_t bufpos = data->buf.s.len; - #endif /* PIKE_DEBUG */ -  ENCODE_PROGRAM(p, &(data->buf)); - #ifdef PIKE_DEBUG -  if (p->num_program * sizeof(p->program[0]) != -  data->buf.s.len - bufpos) { -  Pike_fatal("ENCODE_PROGRAM() failed:\n" -  "Encoded data len: %ld\n" -  "Expected data len: %ld\n", -  DO_NOT_WARN((long)(p->num_program * sizeof(p->program[0]))), -  DO_NOT_WARN((long)(data->buf.s.len - bufpos))); -  } -  } - #endif /* PIKE_DEBUG */ - #else /* !ENCODE_PROGRAM */ -  adddata2(p->program, p->num_program); - #endif /* ENCODE_PROGRAM */ -  -  adddata2(p->relocations, p->num_relocations); -  -  adddata2(p->linenumbers, p->num_linenumbers); -  -  for(d=0;d<p->num_identifier_index;d++) -  code_number(p->identifier_index[d],data); -  -  for(d=0;d<p->num_variable_index;d++) -  code_number(p->variable_index[d],data); -  -  for(d=0;d<p->num_identifier_references;d++) -  { -  code_number(p->identifier_references[d].inherit_offset,data); -  code_number(p->identifier_references[d].identifier_offset,data); -  code_number(p->identifier_references[d].id_flags,data); -  EDB(3,fprintf(stderr,"IDREF%x > %d: { %d, %d, %d }\n", -  p->id,d, -  p->identifier_references[d].inherit_offset, -  p->identifier_references[d].identifier_offset, -  p->identifier_references[d].id_flags);); -  } -  -  for(d=0;d<p->num_strings;d++) adddata(p->strings[d]); -  -  for(d=0;d<p->num_inherits;d++) -  { -  code_number(p->inherits[d].inherit_level,data); -  code_number(p->inherits[d].identifier_level,data); -  code_number(p->inherits[d].parent_offset,data); -  code_number(p->inherits[d].parent_identifier,data); -  code_number(p->inherits[d].storage_offset,data); -  -  if(p->inherits[d].parent) -  { -  ref_push_function(p->inherits[d].parent, -  p->inherits[d].parent_identifier); -  EDB(3,fprintf(stderr,"INHERIT%x coded as func { %p, %d }\n", -  p->id, p->inherits[d].parent, -  p->inherits[d].parent_identifier);); -  }else if(p->inherits[d].prog){ -  ref_push_program(p->inherits[d].prog); -  }else{ -  Pike_error("Failed to encode inherit #%d\n", d); -  push_int(0); -  } -  encode_value2(Pike_sp-1,data, 1); -  pop_stack(); -  -  adddata3(p->inherits[d].name); -  -  EDB(3,fprintf(stderr,"INHERIT%x > %d: %d id=%d\n", -  p->id,d, -  p->inherits[d].prog->num_identifiers, -  p->inherits[d].prog->id);); -  } -  -  for(d=0;d<p->num_identifiers;d++) -  { -  adddata(p->identifiers[d].name); -  encode_type(p->identifiers[d].type, data); -  code_number(p->identifiers[d].identifier_flags,data); -  code_number(p->identifiers[d].run_time_type,data); -  code_number(p->identifiers[d].opt_flags,data); -  code_number(p->identifiers[d].filename_strno, data); -  code_number(p->identifiers[d].linenumber, data); -  if (IDENTIFIER_IS_ALIAS(p->identifiers[d].identifier_flags)) { -  code_number(p->identifiers[d].func.ext_ref.depth,data); -  code_number(p->identifiers[d].func.ext_ref.id,data); -  } else if (!IDENTIFIER_IS_C_FUNCTION(p->identifiers[d].identifier_flags)) { -  code_number(p->identifiers[d].func.offset,data); -  } else { -  Pike_error("Cannot encode functions implemented in C " -  "(identifier=\"%S\").\n", -  p->identifiers[d].name); -  } -  } -  -  for(d=0;d<NUM_LFUNS;d++) -  code_number(p->lfuns[d], data); -  -  for(d=0;d<p->num_constants;d++) -  { -  encode_value2(& p->constants[d].sval, data, 0); -  adddata3(NULL /* p->constants[d].name */); -  } -  - #else /* !OLD_PIKE_ENCODE_PROGRAM */ -  +     /* Portable encoding (4 and 5). */       if (!force_encode) {    /* Encode later (5). */    EDB(1, fprintf(stderr, "%*sencode: delayed encoding of program\n",    data->depth, ""));    code_entry (TAG_PROGRAM, 5, data);    data->delayed = append_array (data->delayed, val);    tmp = low_mapping_lookup (data->encoded, val);    if (!tmp)
pike.git/src/encode.c:1926:   #endif /* 0 */    push_int(0);    encode_value2(Pike_sp-1, data, 0);    dmalloc_touch_svalue(Pike_sp-1);    Pike_sp--;   #if 0    }   #endif /* 0 */    }    } - #endif /* OLD_PIKE_ENCODE_PROGRAM */ +     }else{    code_entry(TAG_PROGRAM, 0, data);    encode_value2(Pike_sp-1, data, 0);    pop_stack();    }    break;    }    }      encode_done:;
pike.git/src/encode.c:3251:    }       add_ref(p);    pop_stack();    push_program(p);    break;    }       case 1: /* Old-style encoding. */    { -  int d, in; -  size_t size=0; -  char *dat=0; -  struct program *p; -  struct object *placeholder=0; -  ONERROR err, err1, err2, err3, err4; -  -  lock_pike_compiler(); -  SET_ONERROR(err, unlock_pike_compiler, 0); -  -  fprintf (stderr, "Warning: Using old-style encoding\n"); -  -  EDB(2,fprintf(stderr, "%*sDecoding a program to <%d>: ", -  data->depth, "", entry_id.u.integer); -  print_svalue(stderr, &entry_id); -  fputc('\n', stderr);); -  -  SETUP_DECODE_MEMOBJ(T_PROGRAM, program, p, low_allocate_program(),;); -  -  debug_malloc_touch(p); -  SET_ONERROR(err3, zap_unfinished_program, p); -  -  if(data->pass == 1) -  { - #if TWO_PASS_DECODE_WORKS -  if(! data->supporter.prog) -  data->supporter.prog = p; - #endif -  -  debug_malloc_touch(p); -  ref_push_program(p); -  apply(decoder_codec (data), "__register_new_program", 1); -  -  /* return a placeholder */ -  if(TYPEOF(Pike_sp[-1]) == T_OBJECT) -  { -  placeholder=Pike_sp[-1].u.object; -  if(placeholder->prog != null_program) -  decode_error(data, NULL, "Placeholder object is not " -  "a __null_program clone.\n"); -  dmalloc_touch_svalue(Pike_sp-1); -  Pike_sp--; +  decode_error(data, NULL, "Failed to decode program. Old-style program encoding is not supported, anymore.\n");    } -  else if (TYPEOF(Pike_sp[-1]) != T_INT || -  Pike_sp[-1].u.integer) -  decode_error (data, NULL, "Expected placeholder object or zero " -  "from __register_new_program.\n"); -  else { -  pop_stack(); -  } -  } +     -  if(placeholder) -  SET_ONERROR(err4, zap_placeholder, placeholder); -  -  decode_value2(data); -  push_compact_version(); -  if(!is_eq(Pike_sp-1,Pike_sp-2) - #ifdef ENCODE_DEBUG -  && !data->debug - #endif -  ) -  decode_error(data, NULL, "Cannot decode programs encoded " -  "with other pike version %O.\n", Pike_sp - 2); -  pop_n_elems(2); -  - #ifdef ENCODE_DEBUG -  if (!data->debug) - #endif -  data->pickyness++; -  -  debug_malloc_touch(p); -  decode_number(p->flags,data); -  -  if(data->pass == 1) -  { -  p->flags &= ~(PROGRAM_FINISHED | PROGRAM_OPTIMIZED | -  PROGRAM_FIXED | PROGRAM_PASS_1_DONE); -  p->flags |= PROGRAM_AVOID_CHECK; -  } -  decode_number(p->storage_needed,data); -  decode_number(p->xstorage,data); -  decode_number(p->parent_info_storage,data); -  decode_number(p->alignment_needed,data); -  decode_number(p->timestamp.tv_sec,data); -  decode_number(p->timestamp.tv_usec,data); -  -  if(data->pass && p->parent) -  { -  free_program(p->parent); -  p->parent=0; -  } -  -  debug_malloc_touch(p); -  decode_value2(data); -  switch(TYPEOF(Pike_sp[-1])) -  { -  case T_INT: -  p->parent=0; -  break; -  case T_PROGRAM: -  p->parent=Pike_sp[-1].u.program; -  break; -  case T_FUNCTION: -  p->parent=program_from_svalue(Pike_sp-1); -  break; -  default: -  if (data->pickyness) -  decode_error(data, NULL, "Program decode failed. Got: %O\n", -  Pike_sp - 1); -  p->parent = 0; -  break; -  } -  if(p->parent) { -  add_ref(p->parent); -  } -  pop_stack(); -  -  debug_malloc_touch(p); -  - #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) \ -  decode_number( p->PIKE_CONCAT(num_,NAME), data); - #include "program_areas.h" -  -  -  if(data->pass == 1) -  { -  int overflow = 0; -  size_t tmp = 0; - #ifdef PIKE_USE_MACHINE_CODE -  /* We want our program to be in mexec-allocated memory... */ - #define BAR(NUMTYPE,TYPE,ARGTYPE,NAME) - #endif /* PIKE_USE_MACHINE_CODE */ - #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) \ -  if (size) { \ -  size=DO_ALIGN(size, ALIGNOF(TYPE)); \ -  overflow |= !size; \ -  } \ -  overflow |= DO_SIZE_T_MUL_OVERFLOW(sizeof(p->NAME[0]), p->PIKE_CONCAT(num_,NAME), &tmp)\ -  | DO_SIZE_T_ADD_OVERFLOW(size, tmp, &size); - #include "program_areas.h" -  -  if (overflow) -  decode_error(data, NULL, "Program area sizes overflowed.\n"); -  -  dat=xalloc(size); -  debug_malloc_touch(dat); -  MEMSET(dat,0,size); -  size=0; - #ifdef PIKE_USE_MACHINE_CODE -  /* We want our program to be in mexec-allocated memory... */ - #define BAR(NUMTYPE,TYPE,ARGTYPE,NAME) \ -  if (DO_SIZE_T_MUL_OVERFLOW(p->PIKE_CONCAT(num_, NAME), sizeof(p->NAME[0]), &tmp))\ -  decode_error(data, NULL, "Program area sizes overflowed.\n");\ -  p->NAME = (TYPE *)mexec_alloc(tmp); - #endif /* PIKE_USE_MACHINE_CODE */ - #define FOO(NUMTYPE,TYPE,ARGTYPE,NAME) \ -  size=DO_ALIGN(size, ALIGNOF(TYPE)); \ -  p->NAME=(TYPE *)(dat+size); \ -  size+=p->PIKE_CONCAT(num_,NAME)*sizeof(p->NAME[0]); - #include "program_areas.h" -  -  for(e=0;e<p->num_constants;e++) -  mark_free_svalue (&p->constants[e].sval); -  -  debug_malloc_touch(dat); -  debug_malloc_touch(p); -  -  p->total_size=size + sizeof(struct program); -  -  p->flags |= PROGRAM_OPTIMIZED; -  } -  -  { -  INT32 bytecode_method = 0; -  decode_number(bytecode_method, data); -  if (bytecode_method != PIKE_BYTECODE_METHOD) { -  decode_error(data, NULL, -  "Unsupported byte-code method: %d. Expected %d\n", -  bytecode_method, PIKE_BYTECODE_METHOD); -  } -  } -  -  getdata2(p->program, p->num_program); -  getdata2(p->relocations, p->num_relocations); -  - #ifdef DECODE_PROGRAM -  { -  int byteorder = PIKE_BYTEORDER; /* FIXME: Used by bytecode.h */ -  DECODE_PROGRAM(p); -  } - #endif /* DECODE_PROGRAM */ -  make_program_executable(p); -  -  getdata2(p->linenumbers, p->num_linenumbers); -  -  /* Now with the linenumber info in place it gets useful to -  * include the program in error messages. */ -  - #ifdef DEBUG_MALLOC -  if(p->num_linenumbers && p->linenumbers && -  EXTRACT_UCHAR(p->linenumbers)==127) -  { -  char *foo = p->linenumbers + 1; -  int len = get_small_number(&foo); -  int shift = *foo; -  char *fname = ++foo; -  foo += len << shift; -  get_small_number(&foo); /* pc offset */ -  /* FIXME: Dmalloc doesn't support wide filenames. */ -  debug_malloc_name(p, fname, get_small_number(&foo)); -  } - #endif -  -  -  debug_malloc_touch(p); -  for(d=0;d<p->num_identifier_index;d++) -  { -  decode_number(p->identifier_index[d],data); -  if(p->identifier_index[d] > p->num_identifier_references) -  { -  p->identifier_index[d]=0; -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, "Malformed program in decode.\n"); -  } -  } -  -  debug_malloc_touch(p); -  for(d=0;d<p->num_variable_index;d++) -  { -  decode_number(p->variable_index[d],data); -  if(p->variable_index[d] > p->num_identifiers) -  { -  p->variable_index[d]=0; -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, "Malformed program in decode.\n"); -  } -  } -  -  debug_malloc_touch(p); -  for(d=0;d<p->num_identifier_references;d++) -  { -  decode_number(p->identifier_references[d].inherit_offset,data); -  if(p->identifier_references[d].inherit_offset > p->num_inherits) -  { -  p->identifier_references[d].inherit_offset=0; -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, "Malformed program in decode.\n"); -  } -  decode_number(p->identifier_references[d].identifier_offset,data); -  decode_number(p->identifier_references[d].id_flags,data); -  -  EDB(3,fprintf(stderr,"IDREF%x < %d: { %d, %d, %d }\n", -  p->id,d, -  p->identifier_references[d].inherit_offset, -  p->identifier_references[d].identifier_offset, -  p->identifier_references[d].id_flags); ); -  } -  -  debug_malloc_touch(p); -  for(d=0;d<p->num_strings;d++) -  getdata(p->strings[d]); -  -  debug_malloc_touch(p); -  debug_malloc_touch(dat); -  - /* p->inherits[0].prog=p; -  p->inherits[0].parent_offset=1; - */ -  -  if(placeholder && data->pass==1) -  { -  if(placeholder->prog != null_program) -  { -  debug_malloc_touch(placeholder); -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, "Placeholder is no longer " -  "a __null_program clone.\n"); -  }else{ -  free_program(placeholder->prog); -  add_ref(placeholder->prog = p); -  debug_malloc_touch(placeholder); -  } -  } -  -  debug_malloc_touch(p); -  -  in=p->num_inherits; -  for(d=0;d<in;d++) -  { -  decode_number(p->inherits[d].inherit_level,data); -  decode_number(p->inherits[d].identifier_level,data); -  decode_number(p->inherits[d].parent_offset,data); -  decode_number(p->inherits[d].parent_identifier,data); -  decode_number(p->inherits[d].storage_offset,data); -  -  decode_value2(data); -  if(d==0) -  { -  if(TYPEOF(Pike_sp[-1]) != T_PROGRAM || -  Pike_sp[-1].u.program != p) { -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, -  "Program decode of self inherit failed. Got: %O\n", -  Pike_sp - 2); -  } -  sub_ref(p); -  } -  -  if(data->pass > 1) -  { -  if(p->inherits[d].prog) -  { -  free_program(p->inherits[d].prog); -  p->inherits[d].prog=0; -  } -  -  if(p->inherits[d].parent) -  { -  free_object(p->inherits[d].parent); -  p->inherits[d].parent=0; -  } -  } -  -  switch(TYPEOF(Pike_sp[-1])) -  { -  case T_PROGRAM: -  EDB(3, fprintf(stderr,"INHERIT%x = prog\n",p->id); ); -  p->inherits[d].prog=Pike_sp[-1].u.program; -  Pike_sp--; -  dmalloc_touch_svalue(Pike_sp); -  break; -  -  case T_FUNCTION: -  if(SUBTYPEOF(Pike_sp[-1]) != FUNCTION_BUILTIN) { -  EDB(3, fprintf(stderr,"INHERIT%x = func { %p, %d} \n",p->id,Pike_sp[-1].u.object, SUBTYPEOF(Pike_sp[-1])); ); -  -  p->inherits[d].parent_identifier = SUBTYPEOF(Pike_sp[-1]); -  p->inherits[d].prog=program_from_svalue(Pike_sp-1); -  if(!p->inherits[d].prog) { -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, "Failed to decode " -  "inherited program. Got: %O\n", Pike_sp - 2); -  } -  add_ref(p->inherits[d].prog); -  p->inherits[d].parent=Pike_sp[-1].u.object; -  Pike_sp--; -  dmalloc_touch_svalue(Pike_sp); -  break; -  } -  /* Fall through */ -  -  default: -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, -  "Failed to decode inherited program. Got: %O\n", -  Pike_sp - 2); -  } -  -  p->num_inherits=d+1; -  -  getdata3(p->inherits[d].name); -  -  EDB(3, fprintf(stderr,"INHERIT%x < %d: %d id=%d\n", -  p->id,d, -  p->inherits[d].prog->num_identifiers, -  p->inherits[d].prog->id); ); -  } -  -  debug_malloc_touch(dat); -  -  -  SET_ONERROR(err1, restore_type_stack, Pike_compiler->type_stackp); -  SET_ONERROR(err2, restore_type_mark, Pike_compiler->pike_type_mark_stackp); -  -  debug_malloc_touch(p); -  for(d=0;d<p->num_identifiers;d++) -  { -  getdata(p->identifiers[d].name); -  decode_type(p->identifiers[d].type,data); -  decode_number(p->identifiers[d].identifier_flags,data); -  decode_number(p->identifiers[d].run_time_type,data); -  decode_number(p->identifiers[d].opt_flags,data); -  decode_number(p->identifiers[d].filename_strno, data); -  decode_number(p->identifiers[d].linenumber, data); -  if (IDENTIFIER_IS_ALIAS(p->identifiers[d].identifier_flags)) { -  decode_number(p->identifiers[d].func.ext_ref.depth, data); -  decode_number(p->identifiers[d].func.ext_ref.id, data); -  } else if (!IDENTIFIER_IS_C_FUNCTION(p->identifiers[d].identifier_flags)) -  { -  decode_number(p->identifiers[d].func.offset,data); -  } else { -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, -  "Cannot decode function implemented in C: %S\n", -  p->identifiers[d].name); -  } -  } -  -  -  UNSET_ONERROR(err2); -  UNSET_ONERROR(err1); -  -  debug_malloc_touch(dat); -  -  debug_malloc_touch(p); -  for(d=0;d<NUM_LFUNS;d++) -  decode_number(p->lfuns[d],data); -  -  debug_malloc_touch(dat); -  -  debug_malloc_touch(p); -  -  fsort_program_identifier_index(p->identifier_index, -  p->identifier_index + -  p->num_identifier_index - 1, -  p); -  -  debug_malloc_touch(dat); -  debug_malloc_touch(p); -  -  p->flags |= PROGRAM_PASS_1_DONE | PROGRAM_FIXED; -  for(d=0;d<p->num_constants;d++) -  { -  decode_value2(data); -  if(data->pass > 1) -  { -  assign_svalue(& p->constants[d].sval , Pike_sp -1 ); -  pop_stack(); -  }else{ -  dmalloc_touch_svalue(Pike_sp-1); -  p->constants[d].sval=*--Pike_sp; -  } -  dmalloc_touch_svalue(Pike_sp); -  { -  struct pike_string *dummy = NULL; -  getdata3(dummy /*p->constants[d].name*/); -  if (dummy) free_string(dummy); -  } -  } -  - #ifdef PIKE_DEBUG -  { -  int q; -  for(q=0;q<p->num_inherits;q++) -  if(!p->inherits[q].prog) -  Pike_fatal("FOOBAR!@!!!\n"); -  } - #endif -  -  if(placeholder && data->pass == 1) -  { -  if(placeholder->storage) -  { -  ref_push_program (p); -  decode_error(data, Pike_sp - 1, -  "Placeholder already has storage!\n"); -  } else { -  placeholder->storage=p->storage_needed ? -  xcalloc(p->storage_needed, 1) : -  NULL; -  call_c_initializers(placeholder); -  } -  } -  - #ifdef ENCODE_DEBUG -  if (!data->debug) - #endif -  data->pickyness--; -  -  if(placeholder) -  { -  free_object(placeholder); -  UNSET_ONERROR(err4); -  } -  UNSET_ONERROR(err3); -  -  ref_push_program(p); -  -  if(!(p->flags & PROGRAM_FINISHED) - #if TWO_PASS_DECODE_WORKS -  && !data->supporter.depends_on - #endif -  ) -  { -  /* Logic for the PROGRAM_FINISHED flag: -  * The purpose of this code is to make sure that the PROGRAM_FINISHED -  * flag is not set on the program until all inherited programs also -  * have that flag. -Hubbe -  */ -  for(d=1;d<p->num_inherits;d++) -  if(! (p->inherits[d].prog->flags & PROGRAM_FINISHED)) -  break; -  -  if(d == p->num_inherits) -  { -  p->flags &=~ PROGRAM_AVOID_CHECK; -  p->flags |= PROGRAM_FINISHED; -  -  if (placeholder) -  { -  if(!init_placeholder(placeholder)) -  placeholder=0; -  } -  -  /* Go through the linked list of unfinished programs -  * to see what programs are now finished. -  */ -  { -  struct unfinished_prog_link *l, **ptr; -  - #ifdef PIKE_DEBUG -  check_program(p); - #endif /* PIKE_DEBUG */ -  -  /* It is possible that we need to restart loop -  * in some cases... /Hubbe -  */ -  for(ptr= &data->unfinished_programs ; (l=*ptr);) -  { -  struct program *pp=l->prog; -  for(d=1;d<pp->num_inherits;d++) -  if(! (pp->inherits[d].prog->flags & PROGRAM_FINISHED)) -  break; -  -  if(d == pp->num_inherits) -  { -  fsort_program_identifier_index(pp->identifier_index, -  pp->identifier_index + -  pp->num_identifier_index - 1, -  pp); -  -  pp->flags &=~ PROGRAM_AVOID_CHECK; -  pp->flags |= PROGRAM_FINISHED; -  - #ifdef PIKE_DEBUG -  check_program(pp); - #endif /* PIKE_DEBUG */ -  -  *ptr = l->next; -  free(l); -  }else{ -  ptr=&l->next; -  } -  } -  } -  -  /* Go through the linked list of unfinished objects -  * to see what objects are now finished. -  */ -  { -  int decode_fun = -1; -  struct unfinished_obj_link *l, **ptr; -  if (data->unfinished_objects) { -  decode_fun = find_identifier("decode_object", -  decoder_codec (data)->prog); -  if (decode_fun < 0) -  decode_error(data, Pike_sp - 1, -  "Cannot decode objects without a " -  "\"decode_object\" function in the codec.\n"); -  } -  for(ptr= &data->unfinished_objects ; (l=*ptr);) -  { -  int fun; -  struct object *o=l->o; -  if(o->prog) -  { -  if(o->prog->flags & PROGRAM_FINISHED) -  { -  apply_lfun(o, LFUN___INIT, 0); -  pop_stack(); -  /* FIXME: Should call LFUN_CREATE here in <= 7.2 -  * compatibility mode. */ -  }else{ -  ptr=&l->next; -  continue; -  } -  } -  -  /* Note: We steal the references from l. */ -  push_object(o); -  *(Pike_sp++) = l->decode_arg; -  -  *ptr = l->next; -  free(l); -  -  /* Let the codec do it's job... */ -  apply_low(decoder_codec (data), decode_fun, 2); -  if ((TYPEOF(Pike_sp[-1]) == T_ARRAY) && -  o->prog && -  ((fun = FIND_LFUN(o->prog, LFUN_CREATE)) != -1)) { -  /* Call lfun::create(@args). */ -  INT32 args; -  Pike_sp--; -  args = Pike_sp->u.array->size; -  if (args) { -  /* Note: Eats reference to the array. */ -  push_array_items(Pike_sp->u.array); -  } else { -  free_array(Pike_sp->u.array); -  } -  apply_low(o, fun, args); -  } -  pop_stack(); -  } -  } -  }else{ -  struct unfinished_prog_link *l; -  l=ALLOC_STRUCT(unfinished_prog_link); -  l->prog=p; -  l->next=data->unfinished_programs; -  data->unfinished_programs=l; -  } -  } -  -  CALL_AND_UNSET_ONERROR(err); -  goto decode_done; -  } -  +     case 2:    decode_value2(data);    decode_value2(data);    if(TYPEOF(Pike_sp[-2]) == T_INT)    {    pop_stack();    }else{    f_arrow(2);    }    if(TYPEOF(Pike_sp[-1]) != T_PROGRAM && data->pickyness)