Branch: Tag:

1999-02-01

1999-02-01 02:47:18 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

all alignment problems solved (I hope)

Rev: src/Makefile.in:1.126
Rev: src/modules/Gdbm/gdbmmod.c:1.6
Rev: src/modules/Gmp/mpz_glue.c:1.37
Rev: src/modules/Gz/zlibmod.c:1.22
Rev: src/modules/Image/colors.c:1.8
Rev: src/modules/Image/colortable.c:1.47
Rev: src/modules/Image/font.c:1.42
Rev: src/modules/Image/image.c:1.110
Rev: src/modules/Msql/msqlmod.c:1.9
Rev: src/modules/Mysql/mysql.c:1.25
Rev: src/modules/Mysql/result.c:1.14
Rev: src/modules/Odbc/odbc.c:1.13
Rev: src/modules/Odbc/odbc_result.c:1.16
Rev: src/modules/Oracle/oracle.c:1.15
Rev: src/modules/Perl/perlmod.c:1.4
Rev: src/modules/Pipe/pipe.c:1.29
Rev: src/modules/Postgres/pgresult.c:1.9
Rev: src/modules/Postgres/postgres.c:1.11
Rev: src/modules/Regexp/glue.c:1.13
Rev: src/modules/Ssleay/ssleay.c:1.10
Rev: src/modules/Yp/yp.c:1.15
Rev: src/modules/_Charset/charsetmod.c:1.8
Rev: src/modules/_Charset/iso2022.c:1.3
Rev: src/modules/_Crypto/cast.c:1.5
Rev: src/modules/_Crypto/cbc.c:1.13
Rev: src/modules/_Crypto/crypto.c:1.26
Rev: src/modules/_Crypto/des.c:1.12
Rev: src/modules/_Crypto/idea.c:1.12
Rev: src/modules/_Crypto/md2.c:1.5
Rev: src/modules/_Crypto/md5.c:1.11
Rev: src/modules/_Crypto/pipe.c:1.13
Rev: src/modules/_Crypto/rc4.c:1.8
Rev: src/modules/_Crypto/sha.c:1.14
Rev: src/modules/_Image_TTF/image_ttf.c:1.9
Rev: src/modules/files/file.c:1.137
Rev: src/modules/files/socket.c:1.41
Rev: src/modules/spider/accesseddb.c:1.17
Rev: src/modules/spider/dumudp.c:1.42
Rev: src/modules/spider/xml.c:1.6
Rev: src/modules/system/nt.c:1.7
Rev: src/object.c:1.56
Rev: src/operators.c:1.45
Rev: src/pike_macros.h:1.11
Rev: src/program.c:1.108
Rev: src/program.h:1.49
Rev: src/security.c:1.8
Rev: src/signal_handler.c:1.102
Rev: src/stralloc.c:1.53
Rev: src/threads.c:1.87

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: program.c,v 1.107 1999/01/31 09:02:00 hubbe Exp $"); + RCSID("$Id: program.c,v 1.108 1999/02/01 02:41:43 hubbe Exp $");   #include "program.h"   #include "object.h"   #include "dynamic_buffer.h"
488:    struct program *p;    p=ALLOC_STRUCT(program);    MEMSET(p, 0, sizeof(struct program)); +  p->alignment_needed=1;       GC_ALLOC();    p->refs=1;
775:    switch(run_time_type)    {    case T_FUNCTION: -  case T_MIXED: - #ifdef HAVE_ALIGNOF -  return ALIGNOF(struct svalue); - #else -  return ALIGNOF(union anything); - #endif +  case T_MIXED: return ALIGNOF(struct svalue);    case T_INT: return ALIGNOF(INT_TYPE);    case T_FLOAT: return ALIGNOF(FLOAT_TYPE);    default: return ALIGNOF(char *);
868: Inside #if defined(PIKE_DEBUG)
   if(p->inherits[e].storage_offset < 0)    fatal("Inherit->storage_offset is wrong.\n");    - #if 0 -  /* This test doesn't really work... */ -  if(p->inherits[e].storage_offset & (ALIGN_BOUND-1)) -  { -  fatal("inherit[%d].storage_offset is not properly aligned (%d).\n",e,p->inherits[e].storage_offset); +     } - #endif +    } - } +    #endif      struct program *end_first_pass(int finish)
981:    * Allocate needed for this program in the object structure.    * An offset to the data is returned.    */ - SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment) + SIZE_T low_add_storage(SIZE_T size, SIZE_T alignment, int modulo)   {    SIZE_T offset; -  offset=DO_ALIGN(new_program->storage_needed, alignment); + #ifdef PIKE_DEBUG +  if(alignment <=0 || (alignment & (alignment-1)) || alignment > 256) +  fatal("Alignment must be 1,2,4,8,16,32,64,128 or 256 not %d\n",alignment); + #endif +  offset=DO_ALIGN(OFFSETOF(object,storage)+ +  new_program->storage_needed, +  alignment)+modulo-OFFSETOF(object,storage); +  +  if(!new_program->storage_needed) +  new_program->inherits[0].storage_offset=offset; +  +  if(new_program->alignment_needed<alignment) +  new_program->alignment_needed=alignment; +     new_program->storage_needed = offset + size;   #ifdef PIKE_DEBUG -  if(alignment <=0) fatal("Alignment must be at least 1\n"); +     if(new_program->storage_needed<0)    fatal("add_storage failed horribly!\n");   #endif    return offset;   }    - SIZE_T add_storage(SIZE_T storage) - { -  return low_add_storage(storage, -  storage>ALIGN_BOUND? ALIGN_BOUND : storage ? (1<<my_log2(storage)) : 1); - } +       /*    * set a callback used to initialize clones of this program
1162:       inherit_offset = new_program->num_inherits;    -  storage_offset=add_storage(p->storage_needed); +  /* alignment magic */ +  storage_offset=p->inherits[0].storage_offset % p->alignment_needed; +  storage_offset=low_add_storage(p->storage_needed, +  p->alignment_needed, +  storage_offset)-storage_offset;       for(e=0; e<(int)p->num_inherits; e++)    {
1520:       n=low_define_variable(name,type,flags,    low_add_storage(sizeof_variable(run_time_type), -  alignof_variable(run_time_type)), +  alignof_variable(run_time_type),0),    run_time_type);      
2406:   }   #endif    + #undef THIS + #define THIS ((struct pike_trampoline *)(fp->current_storage))   struct program *pike_trampoline_program=0;      static void apply_trampoline(INT32 args)
2413:    error("Internal error: Trampoline magic failed!\n");   }    + static void init_trampoline(struct object *o) + { +  THIS->frame=0; + } +  + static void exit_trampoline(struct object *o) + { +  if(THIS->frame) +  { +  free_pike_frame(THIS->frame); +  THIS->frame=0; +  } + } +  + static void gc_check_frame(struct pike_frame *f) + { +  if(!f) return; +  if(!debug_gc_check(f,T_UNKNOWN,f) && f->malloced_locals) +  { +  if(f->current_object) gc_check(f->current_object); +  if(f->context.prog) gc_check(f->context.prog); +  if(f->context.parent) gc_check(f->context.parent); +  gc_check_svalues(f->locals,f->num_locals); +  if(f->scope) gc_check_frame(f->scope); +  } + } +  + static void gc_check_trampoline(struct object *o) + { +  gc_check_frame(THIS->frame); + } +  + static void gc_mark_frame(struct pike_frame *f) + { +  if(!f) return; +  if(gc_mark(f)) +  { +  if(f->current_object) gc_mark_object_as_referenced(f->current_object); +  if(f->context.prog) gc_mark_program_as_referenced(f->context.prog); +  if(f->context.parent) gc_mark_object_as_referenced(f->context.parent); +  if(f->malloced_locals)gc_mark_svalues(f->locals,f->num_locals); +  if(f->scope) gc_mark_frame(f->scope); +  } + } +  + static void gc_mark_trampoline(struct object *o) + { +  gc_mark_frame(THIS->frame); + } +  +    void init_program(void)   {    start_new_program(); -  add_storage(sizeof(struct pike_trampoline)); +  ADD_STORAGE(struct pike_trampoline);    add_function("`()",apply_trampoline,"function(mixed...:mixed)",0); -  +  set_init_callback(init_trampoline); +  set_exit_callback(exit_trampoline); +  set_gc_check_callback(gc_check_trampoline); +  set_gc_mark_callback(gc_mark_trampoline);    pike_trampoline_program=end_program();   }