06983f1996-09-22Fredrik Hübinette (Hubbe) /*\ ||| This file a part of Pike, and is copyright by Fredrik Hubinette ||| Pike is distributed as GPL (General Public License) ||| See the files COPYING and DISCLAIMER for more information. \*/
24ddc71998-03-28Henrik Grubbström (Grubba)  /*
d4a1362001-02-09Fredrik Hübinette (Hubbe)  * $Id: pike_types.h,v 1.47 2001/02/09 10:29:54 hubbe Exp $
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"
6e21a52000-08-09Henrik Grubbström (Grubba) /* Also used in struct node_identifier */ union node_data { struct { int number; struct program *prog; } id; struct svalue sval; struct { struct node_s *a, *b; } node; struct { struct node_identifier *a, *b; } node_id; struct { int a, b; } integer; };
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) struct node_s {
6e21a52000-08-09Henrik Grubbström (Grubba) #if defined(SHARED_NODES)
a2d5581999-11-11Henrik Grubbström (Grubba)  unsigned INT32 refs;
93b7202000-08-14Henrik Grubbström (Grubba)  size_t hash;
a2d5581999-11-11Henrik Grubbström (Grubba)  struct node_s *next; #endif /* SHARED_NODES */
71f3a21998-11-22Fredrik Hübinette (Hubbe) #ifdef PIKE_DEBUG
3c0c281998-01-26Fredrik Hübinette (Hubbe)  struct pike_string *current_file; #endif
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  struct pike_string *type;
454d541999-09-18Fredrik Hübinette (Hubbe)  struct pike_string *name;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe)  struct node_s *parent;
1696e21999-11-20Henrik Grubbström (Grubba)  unsigned INT16 line_number; unsigned INT16 node_info; unsigned INT16 tree_info;
a2d5581999-11-11Henrik Grubbström (Grubba)  /* The stuff from this point on is hashed. */ unsigned INT16 token;
6e21a52000-08-09Henrik Grubbström (Grubba)  union node_data u;
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) };
6e21a52000-08-09Henrik Grubbström (Grubba) #ifdef SHARED_NODES_MK2 struct node_identifier { ptrdiff_t refs; struct node_identifier *next;
93b7202000-08-14Henrik Grubbström (Grubba)  size_t hash;
6e21a52000-08-09Henrik Grubbström (Grubba)  INT16 token; union node_data u; }; #endif /* SHARED_NODES_MK2 */
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) #ifndef STRUCT_NODE_S_DECLARED #define STRUCT_NODE_S_DECLARED #endif
1347171998-04-23Fredrik Hübinette (Hubbe) 
b1f4eb1998-01-13Fredrik Hübinette (Hubbe) typedef struct node_s node;
b8cda21997-01-21Fredrik Hübinette (Hubbe) 
1347171998-04-23Fredrik Hübinette (Hubbe) #define PIKE_TYPE_STACK_SIZE 100000 extern unsigned char type_stack[PIKE_TYPE_STACK_SIZE]; extern unsigned char *pike_type_mark_stack[PIKE_TYPE_STACK_SIZE/4];
1d53281996-11-25Fredrik Hübinette (Hubbe) extern int max_correct_args;
6f0d752000-12-16Marcus Comstedt PMOD_EXPORT extern struct pike_string *string_type_string; PMOD_EXPORT extern struct pike_string *int_type_string; PMOD_EXPORT extern struct pike_string *float_type_string; PMOD_EXPORT extern struct pike_string *object_type_string; PMOD_EXPORT extern struct pike_string *function_type_string; PMOD_EXPORT extern struct pike_string *program_type_string; PMOD_EXPORT extern struct pike_string *array_type_string; PMOD_EXPORT extern struct pike_string *list_type_string; PMOD_EXPORT extern struct pike_string *mapping_type_string; PMOD_EXPORT extern struct pike_string *type_type_string; PMOD_EXPORT extern struct pike_string *mixed_type_string; PMOD_EXPORT extern struct pike_string *void_type_string; PMOD_EXPORT extern struct pike_string *zero_type_string; PMOD_EXPORT extern struct pike_string *any_type_string; PMOD_EXPORT extern struct pike_string *weak_type_string;
06983f1996-09-22Fredrik Hübinette (Hubbe) 
b2d75f1999-10-25Fredrik Hübinette (Hubbe) #define CONSTTYPE(X) make_shared_binary_string(X,CONSTANT_STRLEN(X))
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(); \
d1cac52000-09-07Henrik Grubbström (Grubba)  if(q_q_q_q) fatal("Type stack out of wack! %ld\n", \ 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) 
8e8b2e1999-11-24Henrik Grubbström (Grubba) /* Hmm, these will cause fatals if they fail... */
1347171998-04-23Fredrik Hübinette (Hubbe) #define push_type(X) do { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  if(Pike_compiler->type_stackp >= type_stack + sizeof(type_stack)) \
1347171998-04-23Fredrik Hübinette (Hubbe)  yyerror("Type stack overflow."); \
8e8b2e1999-11-24Henrik Grubbström (Grubba)  else { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  *Pike_compiler->type_stackp=(X); \ Pike_compiler->type_stackp++; \
8e8b2e1999-11-24Henrik Grubbström (Grubba)  } \
1347171998-04-23Fredrik Hübinette (Hubbe) } while(0)
91aab41999-12-13Martin Stjernholm #define unsafe_push_type(X) do { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  *Pike_compiler->type_stackp=(X); \ Pike_compiler->type_stackp++; \
91aab41999-12-13Martin Stjernholm } while(0)
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)) \
6e21a52000-08-09Henrik Grubbström (Grubba)  fatal("Type mark stack overflow."); \
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)  } \
1347171998-04-23Fredrik Hübinette (Hubbe) } while(0)
91aab41999-12-13Martin Stjernholm #define unsafe_type_stack_mark() do { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  *Pike_compiler->pike_type_mark_stackp=Pike_compiler->type_stackp; \ Pike_compiler->pike_type_mark_stackp++; \
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 */
45ee5d1999-02-10Fredrik Hübinette (Hubbe) void check_type_string(struct pike_string *s);
be478c1997-08-30Henrik Grubbström (Grubba) void init_types(void);
e0755c2000-08-15Henrik Grubbström (Grubba) ptrdiff_t pop_stack_mark(void);
be478c1997-08-30Henrik Grubbström (Grubba) void pop_type_stack(void); void type_stack_pop_to_mark(void); void type_stack_reverse(void);
b660c81999-03-01Fredrik Hübinette (Hubbe) void push_type_int(INT32 i);
91aab41999-12-13Martin Stjernholm void push_type_int_backwards(INT32 i);
b660c81999-03-01Fredrik Hübinette (Hubbe) INT32 extract_type_int(char *p);
06983f1996-09-22Fredrik Hübinette (Hubbe) void push_unfinished_type(char *s); void push_finished_type(struct pike_string *type);
2a6d261998-03-25Fredrik Hübinette (Hubbe) void push_finished_type_backwards(struct pike_string *type);
61e9a01998-01-25Fredrik Hübinette (Hubbe) struct pike_string *debug_pop_unfinished_type(void); struct pike_string *debug_pop_type(void);
4142a61998-05-19Fredrik Hübinette (Hubbe) struct pike_string *debug_compiler_pop_type(void);
06983f1996-09-22Fredrik Hübinette (Hubbe) struct pike_string *parse_type(char *s);
e0755c2000-08-15Henrik Grubbström (Grubba) void stupid_describe_type(char *a, ptrdiff_t len);
06983f1996-09-22Fredrik Hübinette (Hubbe) void simple_describe_type(struct pike_string *s); char *low_describe_type(char *t); struct pike_string *describe_type(struct pike_string *type); TYPE_T compile_type_to_runtime_type(struct pike_string *s);
1696e21999-11-20Henrik Grubbström (Grubba) struct pike_string *or_pike_types(struct pike_string *a,
4d7b181999-12-07Fredrik Hübinette (Hubbe)  struct pike_string *b, int zero_implied);
71c1e31999-11-20Henrik Grubbström (Grubba) struct pike_string *and_pike_types(struct pike_string *a, struct pike_string *b);
fbf77a1999-12-21Henrik Grubbström (Grubba) int strict_check_call(char *fun_type, char *arg_type);
03318e2000-03-16Fredrik Hübinette (Hubbe) int check_soft_cast(struct pike_string *to, struct pike_string *from);
06983f1996-09-22Fredrik Hübinette (Hubbe) int match_types(struct pike_string *a,struct pike_string *b);
f1eb441999-11-23Henrik Grubbström (Grubba) int pike_types_le(struct pike_string *a,struct pike_string *b);
4d7b181999-12-07Fredrik Hübinette (Hubbe) struct pike_string *index_type(struct pike_string *type, struct pike_string *index_type, node *n);
1baf981999-12-19Henrik Grubbström (Grubba) struct pike_string *array_value_type(struct pike_string *array_type);
1a3e1b1999-04-13Fredrik Hübinette (Hubbe) struct pike_string *key_type(struct pike_string *type, node *n);
06983f1996-09-22Fredrik Hübinette (Hubbe) int check_indexing(struct pike_string *type,
b8cda21997-01-21Fredrik Hübinette (Hubbe)  struct pike_string *index_type, node *n);
06983f1996-09-22Fredrik Hübinette (Hubbe) int count_arguments(struct pike_string *s);
3aa7831999-06-02Fredrik Hübinette (Hubbe) int minimum_arguments(struct pike_string *s);
06983f1996-09-22Fredrik Hübinette (Hubbe) struct pike_string *check_call(struct pike_string *args,
46aa641999-12-29Henrik Grubbström (Grubba)  struct pike_string *type, int strict);
5b4dd31998-02-23Fredrik Hübinette (Hubbe) INT32 get_max_args(struct pike_string *type);
4d7b181999-12-07Fredrik Hübinette (Hubbe) struct pike_string *zzap_function_return(char *a, INT32 id);
06983f1996-09-22Fredrik Hübinette (Hubbe) struct pike_string *get_type_of_svalue(struct svalue *s);
6334d21999-12-22Henrik Grubbström (Grubba) struct pike_string *object_type_to_program_type(struct pike_string *obj_t);
06983f1996-09-22Fredrik Hübinette (Hubbe) char *get_name_of_type(int t);
be478c1997-08-30Henrik Grubbström (Grubba) void cleanup_pike_types(void);
b477901998-06-05Fredrik Hübinette (Hubbe) int type_may_overload(char *type, int lfun);
03318e2000-03-16Fredrik Hübinette (Hubbe) void yyexplain_nonmatching_types(struct pike_string *type_a, struct pike_string *type_b, int flags);
46aa641999-12-29Henrik Grubbström (Grubba) struct pike_string *make_pike_type(char *t);
d4a1362001-02-09Fredrik Hübinette (Hubbe) int pike_type_allow_premature_toss(char *type);
06983f1996-09-22Fredrik Hübinette (Hubbe) /* Prototypes end here */
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) #define dtObjImpl(PROGRAM) {unsafe_push_type(PIKE_T_OBJECT); unsafe_push_type(0); push_type_int_backwards((PROGRAM)->id);}
0c33f51999-12-14Martin Stjernholm #define dtObjIs(PROGRAM) {unsafe_push_type(PIKE_T_OBJECT); unsafe_push_type(1); push_type_int_backwards((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 { \
bad5162000-06-23Fredrik Hübinette (Hubbe)  if(Pike_compiler->type_stackp >= type_stack + sizeof(type_stack)) \
91aab41999-12-13Martin Stjernholm  fatal("Type stack overflow."); \ type_stack_reverse(); \ (TYPESTR)=pop_unfinished_type(); \ } while (0)
61e9a01998-01-25Fredrik Hübinette (Hubbe) #ifdef DEBUG_MALLOC
20f7a02000-03-20Fredrik Hübinette (Hubbe) #define pop_type() ((struct pike_string *)debug_malloc_pass(debug_pop_type())) #define compiler_pop_type() ((struct pike_string *)debug_malloc_pass(debug_compiler_pop_type()))
61e9a01998-01-25Fredrik Hübinette (Hubbe) #define pop_unfinished_type() \
20f7a02000-03-20Fredrik Hübinette (Hubbe)  ((struct pike_string *)debug_malloc_pass(debug_pop_unfinished_type()))
61e9a01998-01-25Fredrik Hübinette (Hubbe) #else #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 #endif
45ee5d1999-02-10Fredrik Hübinette (Hubbe) #ifndef PIKE_DEBUG #define check_type_string(X) #endif
06983f1996-09-22Fredrik Hübinette (Hubbe) #endif