e576bb2002-10-11Martin Nilsson /* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
c507ca2007-03-20Henrik Grubbström (Grubba) || $Id: pike_types.h,v 1.98 2007/03/20 17:30:21 grubba Exp $
e576bb2002-10-11Martin Nilsson */
24ddc71998-03-28Henrik Grubbström (Grubba) 
06983f1996-09-22Fredrik Hübinette (Hubbe) #ifndef PIKE_TYPES_H #define PIKE_TYPES_H
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) #include "svalue.h"
f2b8262001-03-03Henrik Grubbström (Grubba) #define PIKE_TYPE_STACK_SIZE 100000
23f1002001-03-03Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG void TYPE_STACK_DEBUG(const char *fun); #else /* !PIKE_DEBUG */ #define TYPE_STACK_DEBUG(X) #endif /* PIKE_DEBUG */
d68a072001-02-20Henrik Grubbström (Grubba) /* * The new type type. */ struct pike_type { INT32 refs; unsigned INT32 hash; struct pike_type *next;
1a647d2001-03-03Henrik Grubbström (Grubba)  unsigned INT16 flags; unsigned INT16 type;
d68a072001-02-20Henrik Grubbström (Grubba)  struct pike_type *car; struct pike_type *cdr; };
1a647d2001-03-03Henrik Grubbström (Grubba) 
23db452003-08-20Martin Stjernholm extern struct pike_type **pike_type_hash; extern size_t pike_type_hash_size;
03905b2003-06-30Martin Stjernholm #define CAR_TO_INT(TYPE) ((char *) (TYPE)->car - (char *) 0) #define CDR_TO_INT(TYPE) ((char *) (TYPE)->cdr - (char *) 0)
ec19262001-08-31Martin Stjernholm #include "block_alloc_h.h"
13af4a2005-04-08Henrik Grubbström (Grubba) BLOCK_ALLOC(pike_type, n/a);
ec19262001-08-31Martin Stjernholm 
1a647d2001-03-03Henrik Grubbström (Grubba) /* pike_type flags: */ #define PT_FLAG_MARKER 1 /* Type contains markers. */
9b5a822001-03-29Henrik Grubbström (Grubba) void debug_free_type(struct pike_type *t); #ifdef DEBUG_MALLOC
be6fec2001-04-01Henrik Grubbström (Grubba) #define copy_pike_type(D, S) add_ref((struct pike_type *)debug_malloc_pass(D = (S)))
9b5a822001-03-29Henrik Grubbström (Grubba) #else /* !DEBUG_MALLOC */
be6fec2001-04-01Henrik Grubbström (Grubba) #define copy_pike_type(D, S) add_ref(D = (S))
9b5a822001-03-29Henrik Grubbström (Grubba) #endif /* DEBUG_MALLOC */
1a647d2001-03-03Henrik Grubbström (Grubba) #define CONSTTYPE(X) make_pike_type(X)
f2b8262001-03-03Henrik Grubbström (Grubba) extern struct pike_type *type_stack[PIKE_TYPE_STACK_SIZE]; extern struct pike_type **pike_type_mark_stack[PIKE_TYPE_STACK_SIZE/4];
1a647d2001-03-03Henrik Grubbström (Grubba) 
9b5a822001-03-29Henrik Grubbström (Grubba) #ifdef DEBUG_MALLOC #define free_type(T) debug_free_type((struct pike_type *)debug_malloc_pass(T)) #define check_type_string(T) debug_check_type_string((struct pike_type *)debug_malloc_pass(T)) #else /* !DEBUG_MALLOC */ #define free_type debug_free_type
626d092001-03-29Henrik Grubbström (Grubba) #ifdef PIKE_DEBUG
9b5a822001-03-29Henrik Grubbström (Grubba) #define check_type_string debug_check_type_string
335a412001-03-29Henrik Grubbström (Grubba) #endif /* PIKE_DEBUG */
9b5a822001-03-29Henrik Grubbström (Grubba) #endif /* DEBUG_MALLOC */
d68a072001-02-20Henrik Grubbström (Grubba) 
1d53281996-11-25Fredrik Hübinette (Hubbe) extern int max_correct_args;
c507ca2007-03-20Henrik Grubbström (Grubba) PMOD_EXPORT extern struct pike_type *string0_type_string;
d68a072001-02-20Henrik Grubbström (Grubba) PMOD_EXPORT extern struct pike_type *string_type_string; PMOD_EXPORT extern struct pike_type *int_type_string; PMOD_EXPORT extern struct pike_type *float_type_string; PMOD_EXPORT extern struct pike_type *object_type_string; PMOD_EXPORT extern struct pike_type *function_type_string; PMOD_EXPORT extern struct pike_type *program_type_string; PMOD_EXPORT extern struct pike_type *array_type_string;
dc8ade2001-03-02Henrik Grubbström (Grubba) PMOD_EXPORT extern struct pike_type *multiset_type_string;
d68a072001-02-20Henrik Grubbström (Grubba) PMOD_EXPORT extern struct pike_type *mapping_type_string; PMOD_EXPORT extern struct pike_type *type_type_string; PMOD_EXPORT extern struct pike_type *mixed_type_string; PMOD_EXPORT extern struct pike_type *void_type_string; PMOD_EXPORT extern struct pike_type *zero_type_string; PMOD_EXPORT extern struct pike_type *any_type_string; PMOD_EXPORT extern struct pike_type *weak_type_string;
06983f1996-09-22Fredrik Hübinette (Hubbe) 
3699402001-02-20Henrik Grubbström (Grubba) #define CONSTTYPE(X) make_pike_type(X)
a7f0522001-03-02Henrik Grubbström (Grubba) #ifdef DEBUG_MALLOC struct pike_type_location { struct pike_type *t; struct pike_type_location *next; }; extern struct pike_type_location *all_pike_type_locations; #define MAKE_CONSTANT_TYPE(T, X) do { \ static struct pike_type_location type_; \
2129d22001-03-28Henrik Grubbström (Grubba)  if (!type_.t) { \
a7f0522001-03-02Henrik Grubbström (Grubba)  type_.t = CONSTTYPE(X); \ type_.next = all_pike_type_locations; \ all_pike_type_locations = &type_; \ } \
be6fec2001-04-01Henrik Grubbström (Grubba)  copy_pike_type((T), type_.t); \
a7f0522001-03-02Henrik Grubbström (Grubba)  } while(0) #else /* !DEBUG_MALLOC */ #define MAKE_CONSTANT_TYPE(T, X) do { \ static struct pike_type *type_; \ if (!type_) { \ type_ = CONSTTYPE(X); \ } \
be6fec2001-04-01Henrik Grubbström (Grubba)  copy_pike_type((T), type_); \
a7f0522001-03-02Henrik Grubbström (Grubba)  } while(0) #endif /* DEBUG_MALLOC */
b2d75f1999-10-25Fredrik Hübinette (Hubbe) 
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
fb2f661998-11-05Fredrik Hübinette (Hubbe) #define init_type_stack() type_stack_mark() #define exit_type_stack() do {\
393a592000-08-16Henrik Grubbström (Grubba)  ptrdiff_t q_q_q_q = pop_stack_mark(); \
5aad932002-08-15Marcus Comstedt  if(q_q_q_q) Pike_fatal("Type stack out of wack! %ld\n", \
d1cac52000-09-07Henrik Grubbström (Grubba)  PTRDIFF_T_TO_LONG(q_q_q_q)); \
fb2f661998-11-05Fredrik Hübinette (Hubbe)  } while(0) #else
36feac1997-03-06Fredrik Hübinette (Hubbe) #define init_type_stack type_stack_mark #define exit_type_stack pop_stack_mark
fb2f661998-11-05Fredrik Hübinette (Hubbe) #endif
36feac1997-03-06Fredrik Hübinette (Hubbe) 
7e877a2003-04-02Martin Stjernholm void debug_push_type(unsigned int type); void debug_push_reverse_type(unsigned int type);
9b5a822001-03-29Henrik Grubbström (Grubba) #ifdef DEBUG_MALLOC #define push_type(T) do { debug_push_type(T); debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_reverse_type(T) do { debug_push_reverse_type(T); debug_malloc_pass(debug_peek_type_stack()); } while(0) #else /* !DEBUG_MALLOC */ #define push_type debug_push_type #define push_reverse_type debug_push_reverse_type #endif /* DEBUG_MALLOC */
1a647d2001-03-03Henrik Grubbström (Grubba) 
1347171998-04-23Fredrik Hübinette (Hubbe) #define type_stack_mark() do { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  if(Pike_compiler->pike_type_mark_stackp >= pike_type_mark_stack + NELEM(pike_type_mark_stack)) \
6de0852004-01-23Martin Nilsson  Pike_fatal("Type mark stack overflow.\n"); \
8e8b2e1999-11-24Henrik Grubbström (Grubba)  else { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  *Pike_compiler->pike_type_mark_stackp=Pike_compiler->type_stackp; \ Pike_compiler->pike_type_mark_stackp++; \
8e8b2e1999-11-24Henrik Grubbström (Grubba)  } \
1a647d2001-03-03Henrik Grubbström (Grubba)  TYPE_STACK_DEBUG("type_stack_mark"); \
91aab41999-12-13Martin Stjernholm } while(0)
1347171998-04-23Fredrik Hübinette (Hubbe) #define reset_type_stack() do { \ type_stack_pop_to_mark(); \ type_stack_mark(); \ } while(0)
06983f1996-09-22Fredrik Hübinette (Hubbe) /* Prototypes begin here */
9b5a822001-03-29Henrik Grubbström (Grubba) void debug_check_type_string(struct pike_type *s);
be478c1997-08-30Henrik Grubbström (Grubba) void init_types(void);
e0755c2000-08-15Henrik Grubbström (Grubba) ptrdiff_t pop_stack_mark(void);
7e877a2003-04-02Martin Stjernholm void debug_pop_type_stack(unsigned int expected);
be478c1997-08-30Henrik Grubbström (Grubba) void type_stack_pop_to_mark(void); void type_stack_reverse(void);
9b5a822001-03-29Henrik Grubbström (Grubba) struct pike_type *debug_peek_type_stack(void);
69aa4b2003-01-26Mirar (Pontus Hagland) void debug_push_int_type(INT_TYPE min, INT_TYPE max);
94c3532007-03-03Henrik Grubbström (Grubba) void debug_push_string_type(INT32 bitwidth);
9b5a822001-03-29Henrik Grubbström (Grubba) void debug_push_object_type(int flag, INT32 id); void debug_push_object_type_backwards(int flag, INT32 id); void debug_push_type_name(struct pike_string *name);
b660c81999-03-01Fredrik Hübinette (Hubbe) INT32 extract_type_int(char *p);
9b5a822001-03-29Henrik Grubbström (Grubba) void debug_push_unfinished_type(char *s); void debug_push_assign_type(int marker); void debug_push_finished_type(struct pike_type *type); void debug_push_finished_type_backwards(struct pike_type *type);
d68a072001-02-20Henrik Grubbström (Grubba) struct pike_type *debug_pop_unfinished_type(void); struct pike_type *debug_pop_type(void); struct pike_type *debug_compiler_pop_type(void);
0929a02002-09-12Marcus Comstedt struct pike_type *parse_type(const char *s);
e0755c2000-08-15Henrik Grubbström (Grubba) void stupid_describe_type(char *a, ptrdiff_t len);
d68a072001-02-20Henrik Grubbström (Grubba) void simple_describe_type(struct pike_type *s);
3496412001-02-25Henrik Grubbström (Grubba) void my_describe_type(struct pike_type *type);
d68a072001-02-20Henrik Grubbström (Grubba) struct pike_string *describe_type(struct pike_type *type); TYPE_T compile_type_to_runtime_type(struct pike_type *s); struct pike_type *or_pike_types(struct pike_type *a, struct pike_type *b, int zero_implied); struct pike_type *and_pike_types(struct pike_type *a, struct pike_type *b);
b8a6882001-02-26Henrik Grubbström (Grubba) int strict_check_call(struct pike_type *fun_type, struct pike_type *arg_type);
d68a072001-02-20Henrik Grubbström (Grubba) int check_soft_cast(struct pike_type *to, struct pike_type *from); int match_types(struct pike_type *a,struct pike_type *b); int pike_types_le(struct pike_type *a, struct pike_type *b); struct pike_type *index_type(struct pike_type *type,
6e4c642002-09-11Marcus Comstedt  struct pike_type *type_of_index,
d68a072001-02-20Henrik Grubbström (Grubba)  node *n);
663cbf2002-05-15Henrik Grubbström (Grubba) struct pike_type *range_type(struct pike_type *type, struct pike_type *index1_type, struct pike_type *index2_type);
d68a072001-02-20Henrik Grubbström (Grubba) struct pike_type *array_value_type(struct pike_type *array_type); struct pike_type *key_type(struct pike_type *type, node *n); int check_indexing(struct pike_type *type,
6e4c642002-09-11Marcus Comstedt  struct pike_type *type_of_index,
b8cda21997-01-21Fredrik Hübinette (Hubbe)  node *n);
d68a072001-02-20Henrik Grubbström (Grubba) int count_arguments(struct pike_type *s); int minimum_arguments(struct pike_type *s);
1a647d2001-03-03Henrik Grubbström (Grubba) struct pike_type *check_call(struct pike_type *args, struct pike_type *type, int strict);
2d787e2006-10-27Henrik Grubbström (Grubba) struct pike_type *get_argument_type(struct pike_type *fun, int arg_no);
d40fac2001-02-26Henrik Grubbström (Grubba) struct pike_type *zzap_function_return(struct pike_type *t, INT32 id);
d68a072001-02-20Henrik Grubbström (Grubba) struct pike_type *get_type_of_svalue(struct svalue *s); struct pike_type *object_type_to_program_type(struct pike_type *obj_t);
e68c782006-07-05Martin Stjernholm PMOD_EXPORT char *get_name_of_type(TYPE_T t);
be478c1997-08-30Henrik Grubbström (Grubba) void cleanup_pike_types(void);
f52b4a2001-12-14Martin Nilsson void cleanup_pike_type_table(void);
d5b6742001-02-23Henrik Grubbström (Grubba) int type_may_overload(struct pike_type *type, int lfun);
d68a072001-02-20Henrik Grubbström (Grubba) void yyexplain_nonmatching_types(struct pike_type *type_a, struct pike_type *type_b,
03318e2000-03-16Fredrik Hübinette (Hubbe)  int flags);
9b5a822001-03-29Henrik Grubbström (Grubba) struct pike_type *debug_make_pike_type(const char *t);
9e6f6f2001-03-18Henrik Grubbström (Grubba) struct pike_string *type_to_string(struct pike_type *t);
d5b6742001-02-23Henrik Grubbström (Grubba) int pike_type_allow_premature_toss(struct pike_type *type);
06983f1996-09-22Fredrik Hübinette (Hubbe) /* Prototypes end here */
3913502002-06-25Henrik Grubbström (Grubba) #if 0 /* FIXME: Not supported under USE_PIKE_TYPE yet. */
91aab41999-12-13Martin Stjernholm /* "Dynamic types" - use with ADD_FUNCTION_DTYPE */ #define dtStore(TYPE) {int e; for (e=0; e<CONSTANT_STRLEN(TYPE); e++) unsafe_push_type((TYPE)[e]);} #define dtArr(VAL) {unsafe_push_type(PIKE_T_ARRAY); {VAL}} #define dtArray dtArr(dtMix) #define dtMap(IND,VAL) {unsafe_push_type(PIKE_T_MAPPING); {VAL} {IND}} #define dtMapping dtMap(dtMix,dtMix) #define dtSet(IND) {unsafe_push_type(PIKE_T_MULTISET); {IND}} #define dtMultiset dtSet(dtMix)
3611422001-02-20Henrik Grubbström (Grubba) #define dtObjImpl(PROGRAM) {push_object_type_backwards(0, (PROGRAM)->id);} #define dtObjIs(PROGRAM) {push_object_type_backwards(1, (PROGRAM)->id);}
91aab41999-12-13Martin Stjernholm #define dtObj dtStore(tObj) #define dtFuncV(ARGS,REST,RET) MagicdtFuncV(RET,REST,ARGS) #define dtFunc(ARGS,RET) MagicdtFunc(RET,ARGS) #define MagicdtFuncV(RET,REST,ARGS) {unsafe_push_type(PIKE_T_FUNCTION); {ARGS} unsafe_push_type(T_MANY); {REST} {RET}} #define MagicdtFunc(RET,ARGS) dtFuncV(ARGS {}, dtVoid, RET) #define dtFunction dtFuncV({},dtAny,dtAny) #define dtNone {} #define dtPrg {unsafe_push_type(PIKE_T_PROGRAM);} #define dtProgram {unsafe_push_type(PIKE_T_PROGRAM);} #define dtStr {unsafe_push_type(PIKE_T_STRING);} #define dtString {unsafe_push_type(PIKE_T_STRING);} #define dtType {unsafe_push_type(PIKE_T_TYPE);} #define dtFlt {unsafe_push_type(PIKE_T_FLOAT);} #define dtFloat {unsafe_push_type(PIKE_T_FLOAT);} #define dtIntRange(LOW,HIGH) {unsafe_push_type(PIKE_T_INT); push_type_int_backwards(LOW); push_type_int_backwards(HIGH);} #define dtInt dtStore(tInt) #define dtZero {unsafe_push_type(PIKE_T_ZERO);} #define dtVoid {unsafe_push_type(T_VOID);} #define dtVar(X) {unsafe_push_type(X);} #define dtSetvar(X,TYPE) {unsafe_push_type(T_ASSIGN); {TYPE}} #define dtNot(TYPE) {unsafe_push_type(T_NOT); {TYPE}} #define dtAnd(A,B) {unsafe_push_type(T_AND); {A} {B}} #define dtOr(A,B) {unsafe_push_type(T_OR); {A} {B}} #define dtOr3(A,B,C) dtOr(A,dtOr(B,C)) #define dtOr4(A,B,C,D) dtOr(A,dtOr3(B,C,D)) #define dtOr5(A,B,C,D,E) dtOr(A,dtOr4(B,C,D,E)) #define dtOr6(A,B,C,D,E,F) dtOr(A,dtOr5(B,C,D,E,F))
2cd8ca2000-07-28Fredrik Hübinette (Hubbe) #define dtMix {unsafe_push_type(PIKE_T_MIXED);} #define dtMixed {unsafe_push_type(PIKE_T_MIXED);}
91aab41999-12-13Martin Stjernholm #define dtComplex dtStore(tComplex) #define dtStringIndicable dtStore(tStringIndicable) #define dtRef dtStore(tRef) #define dtIfnot(A,B) dtAnd(dtNot(A),B) #define dtAny dtStore(tAny) #define DTYPE_START do { \ unsafe_type_stack_mark(); \ unsafe_type_stack_mark(); \ } while (0) #define DTYPE_END(TYPESTR) do { \
6de0852004-01-23Martin Nilsson  if(Pike_compiler->type_stackp >= type_stack + sizeof(type_stack)) \ Pike_fatal("Type stack overflow.\n"); \
91aab41999-12-13Martin Stjernholm  type_stack_reverse(); \ (TYPESTR)=pop_unfinished_type(); \ } while (0)
3913502002-06-25Henrik Grubbström (Grubba) #endif /* 0 */
91aab41999-12-13Martin Stjernholm 
61e9a01998-01-25Fredrik Hübinette (Hubbe) #ifdef DEBUG_MALLOC
ec19262001-08-31Martin Stjernholm void describe_all_types(void);
d68a072001-02-20Henrik Grubbström (Grubba) #define pop_type() ((struct pike_type *)debug_malloc_pass(debug_pop_type())) #define compiler_pop_type() ((struct pike_type *)debug_malloc_pass(debug_compiler_pop_type()))
61e9a01998-01-25Fredrik Hübinette (Hubbe) #define pop_unfinished_type() \
d68a072001-02-20Henrik Grubbström (Grubba)  ((struct pike_type *)debug_malloc_pass(debug_pop_unfinished_type()))
9b5a822001-03-29Henrik Grubbström (Grubba) #define make_pike_type(X) \ ((struct pike_type *)debug_malloc_pass(debug_make_pike_type(X)))
5b368e2001-03-31Henrik Grubbström (Grubba) #define pop_type_stack(E) do { debug_malloc_pass(debug_peek_type_stack()); debug_pop_type_stack(E); } while(0)
9b5a822001-03-29Henrik Grubbström (Grubba) #define push_int_type(MIN,MAX) do { debug_push_int_type(MIN,MAX);debug_malloc_pass(debug_peek_type_stack()); } while(0)
94c3532007-03-03Henrik Grubbström (Grubba) #define push_string_type(WIDTH) do { debug_push_string_type(WIDTH);debug_malloc_pass(debug_peek_type_stack()); } while(0)
9b5a822001-03-29Henrik Grubbström (Grubba) #define push_object_type(FLAG,ID) do { debug_push_object_type(FLAG,ID);debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_object_type_backwards(FLAG,ID) do { debug_push_object_type_backwards(FLAG,ID);debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_scope_type(LEVEL) do { debug_push_scope_type(LEVEL);debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_type_name(NAME) do { debug_push_type_name((struct pike_string *)debug_malloc_pass(NAME));debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_unfinished_type(S) ERROR #define push_assign_type(MARKER) do { debug_push_assign_type(MARKER);debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_finished_type(T) do { debug_push_finished_type((struct pike_type *)debug_malloc_pass(T));debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_finished_type_with_markers(T,M) do { debug_push_finished_type_with_markers((struct pike_type *)debug_malloc_pass(T),M);debug_malloc_pass(debug_peek_type_stack()); } while(0) #define push_finished_type_backwards(T) ERROR
61e9a01998-01-25Fredrik Hübinette (Hubbe) #else
52409b2001-03-29Henrik Grubbström (Grubba) #define make_pike_type debug_make_pike_type
61e9a01998-01-25Fredrik Hübinette (Hubbe) #define pop_type debug_pop_type
4142a61998-05-19Fredrik Hübinette (Hubbe) #define compiler_pop_type debug_compiler_pop_type
61e9a01998-01-25Fredrik Hübinette (Hubbe) #define pop_unfinished_type debug_pop_unfinished_type
9b5a822001-03-29Henrik Grubbström (Grubba) #define pop_type_stack debug_pop_type_stack #define push_int_type debug_push_int_type
94c3532007-03-03Henrik Grubbström (Grubba) #define push_string_type debug_push_string_type
9b5a822001-03-29Henrik Grubbström (Grubba) #define push_object_type debug_push_object_type #define push_object_type_backwards debug_push_object_type_backwards #define push_scope_type debug_push_scope_type #define push_type_name debug_push_type_name #define push_unfinished_type debug_push_unfinished_type #define push_assign_type debug_push_assign_type #define push_finished_type debug_push_finished_type
a0315f2001-03-29Henrik Grubbström (Grubba) #define push_finished_type_with_markers debug_push_finished_type_with_markers
9b5a822001-03-29Henrik Grubbström (Grubba) #define push_finished_type_backwards debug_push_finished_type_backwards
61e9a01998-01-25Fredrik Hübinette (Hubbe) #endif
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #ifndef PIKE_DEBUG #define check_type_string(X) #endif
06983f1996-09-22Fredrik Hübinette (Hubbe) #endif