1999-02-01
1999-02-01 02:47:18 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
-
90e978be3d2da5bee0358a2e56c4780c8712134b
(108 lines)
(+83/-25)
[
Show
| Annotate
]
Branch: 7.9
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();
}