06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | * $Id: pike_types.h,v 1.43 2000/08/15 15:59:49 grubba Exp $
|
24ddc7 | 1998-03-28 | Henrik Grubbström (Grubba) | | */
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #ifndef PIKE_TYPES_H
#define PIKE_TYPES_H
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #include "svalue.h"
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | |
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;
};
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct node_s
{
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | | #if defined(SHARED_NODES)
|
a2d558 | 1999-11-11 | Henrik Grubbström (Grubba) | | unsigned INT32 refs;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | size_t hash;
|
a2d558 | 1999-11-11 | Henrik Grubbström (Grubba) | | struct node_s *next;
#endif /* SHARED_NODES */
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | struct pike_string *current_file;
#endif
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct pike_string *type;
|
454d54 | 1999-09-18 | Fredrik Hübinette (Hubbe) | | struct pike_string *name;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct node_s *parent;
|
1696e2 | 1999-11-20 | Henrik Grubbström (Grubba) | | unsigned INT16 line_number;
unsigned INT16 node_info;
unsigned INT16 tree_info;
|
a2d558 | 1999-11-11 | Henrik Grubbström (Grubba) | |
unsigned INT16 token;
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | | union node_data u;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | };
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | | #ifdef SHARED_NODES_MK2
struct node_identifier
{
ptrdiff_t refs;
struct node_identifier *next;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | size_t hash;
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | | INT16 token;
union node_data u;
};
#endif /* SHARED_NODES_MK2 */
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | #ifndef STRUCT_NODE_S_DECLARED
#define STRUCT_NODE_S_DECLARED
#endif
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | |
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | typedef struct node_s node;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | |
|
134717 | 1998-04-23 | Fredrik 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];
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | extern int max_correct_args;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | extern struct pike_string *string_type_string;
extern struct pike_string *int_type_string;
extern struct pike_string *float_type_string;
extern struct pike_string *object_type_string;
extern struct pike_string *function_type_string;
extern struct pike_string *program_type_string;
extern struct pike_string *array_type_string;
extern struct pike_string *list_type_string;
extern struct pike_string *mapping_type_string;
|
bb8d1d | 1999-12-15 | Henrik Grubbström (Grubba) | | extern struct pike_string *type_type_string;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | extern struct pike_string *mixed_type_string;
extern struct pike_string *void_type_string;
|
f1eb44 | 1999-11-23 | Henrik Grubbström (Grubba) | | extern struct pike_string *zero_type_string;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | extern struct pike_string *any_type_string;
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | extern struct pike_string *weak_type_string;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | #define CONSTTYPE(X) make_shared_binary_string(X,CONSTANT_STRLEN(X))
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | #define init_type_stack() type_stack_mark()
#define exit_type_stack() do {\
int q_q_q_q=pop_stack_mark(); \
if(q_q_q_q) fatal("Type stack out of wack! %d\n",q_q_q_q); \
} while(0)
#else
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | #define init_type_stack type_stack_mark
#define exit_type_stack pop_stack_mark
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | #endif
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | |
|
8e8b2e | 1999-11-24 | Henrik Grubbström (Grubba) | |
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | #define push_type(X) do { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->type_stackp >= type_stack + sizeof(type_stack)) \
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | yyerror("Type stack overflow."); \
|
8e8b2e | 1999-11-24 | Henrik Grubbström (Grubba) | | else { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | *Pike_compiler->type_stackp=(X); \
Pike_compiler->type_stackp++; \
|
8e8b2e | 1999-11-24 | Henrik Grubbström (Grubba) | | } \
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | } while(0)
|
91aab4 | 1999-12-13 | Martin Stjernholm | | #define unsafe_push_type(X) do { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | *Pike_compiler->type_stackp=(X); \
Pike_compiler->type_stackp++; \
|
91aab4 | 1999-12-13 | Martin Stjernholm | | } while(0)
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | |
#define type_stack_mark() do { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->pike_type_mark_stackp >= pike_type_mark_stack + NELEM(pike_type_mark_stack)) \
|
6e21a5 | 2000-08-09 | Henrik Grubbström (Grubba) | | fatal("Type mark stack overflow."); \
|
8e8b2e | 1999-11-24 | Henrik Grubbström (Grubba) | | else { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | *Pike_compiler->pike_type_mark_stackp=Pike_compiler->type_stackp; \
Pike_compiler->pike_type_mark_stackp++; \
|
8e8b2e | 1999-11-24 | Henrik Grubbström (Grubba) | | } \
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | } while(0)
|
91aab4 | 1999-12-13 | Martin Stjernholm | | #define unsafe_type_stack_mark() do { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | *Pike_compiler->pike_type_mark_stackp=Pike_compiler->type_stackp; \
Pike_compiler->pike_type_mark_stackp++; \
|
91aab4 | 1999-12-13 | Martin Stjernholm | | } while(0)
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | #define reset_type_stack() do { \
type_stack_pop_to_mark(); \
type_stack_mark(); \
} while(0)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | void check_type_string(struct pike_string *s);
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void init_types(void);
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | ptrdiff_t pop_stack_mark(void);
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void pop_type_stack(void);
void type_stack_pop_to_mark(void);
void type_stack_reverse(void);
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | void push_type_int(INT32 i);
|
91aab4 | 1999-12-13 | Martin Stjernholm | | void push_type_int_backwards(INT32 i);
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | INT32 extract_type_int(char *p);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void push_unfinished_type(char *s);
void push_finished_type(struct pike_string *type);
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | void push_finished_type_backwards(struct pike_string *type);
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *debug_pop_unfinished_type(void);
struct pike_string *debug_pop_type(void);
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *debug_compiler_pop_type(void);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *parse_type(char *s);
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | void stupid_describe_type(char *a, ptrdiff_t len);
|
06983f | 1996-09-22 | Fredrik 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);
|
1696e2 | 1999-11-20 | Henrik Grubbström (Grubba) | | struct pike_string *or_pike_types(struct pike_string *a,
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *b,
int zero_implied);
|
71c1e3 | 1999-11-20 | Henrik Grubbström (Grubba) | | struct pike_string *and_pike_types(struct pike_string *a,
struct pike_string *b);
|
fbf77a | 1999-12-21 | Henrik Grubbström (Grubba) | | int strict_check_call(char *fun_type, char *arg_type);
|
03318e | 2000-03-16 | Fredrik Hübinette (Hubbe) | | int check_soft_cast(struct pike_string *to, struct pike_string *from);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int match_types(struct pike_string *a,struct pike_string *b);
|
f1eb44 | 1999-11-23 | Henrik Grubbström (Grubba) | | int pike_types_le(struct pike_string *a,struct pike_string *b);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *index_type(struct pike_string *type,
struct pike_string *index_type,
node *n);
|
1baf98 | 1999-12-19 | Henrik Grubbström (Grubba) | | struct pike_string *array_value_type(struct pike_string *array_type);
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | struct pike_string *key_type(struct pike_string *type, node *n);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int check_indexing(struct pike_string *type,
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | struct pike_string *index_type,
node *n);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int count_arguments(struct pike_string *s);
|
3aa783 | 1999-06-02 | Fredrik Hübinette (Hubbe) | | int minimum_arguments(struct pike_string *s);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *check_call(struct pike_string *args,
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | struct pike_string *type,
int strict);
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | INT32 get_max_args(struct pike_string *type);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *zzap_function_return(char *a, INT32 id);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *get_type_of_svalue(struct svalue *s);
|
6334d2 | 1999-12-22 | Henrik Grubbström (Grubba) | | struct pike_string *object_type_to_program_type(struct pike_string *obj_t);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | char *get_name_of_type(int t);
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void cleanup_pike_types(void);
|
b47790 | 1998-06-05 | Fredrik Hübinette (Hubbe) | | int type_may_overload(char *type, int lfun);
|
03318e | 2000-03-16 | Fredrik Hübinette (Hubbe) | | void yyexplain_nonmatching_types(struct pike_string *type_a,
struct pike_string *type_b,
int flags);
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | struct pike_string *make_pike_type(char *t);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | |
|
91aab4 | 1999-12-13 | Martin Stjernholm | |
#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);}
|
0c33f5 | 1999-12-14 | Martin Stjernholm | | #define dtObjIs(PROGRAM) {unsafe_push_type(PIKE_T_OBJECT); unsafe_push_type(1); push_type_int_backwards((PROGRAM)->id);}
|
91aab4 | 1999-12-13 | Martin 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))
|
2cd8ca | 2000-07-28 | Fredrik Hübinette (Hubbe) | | #define dtMix {unsafe_push_type(PIKE_T_MIXED);}
#define dtMixed {unsafe_push_type(PIKE_T_MIXED);}
|
91aab4 | 1999-12-13 | Martin 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 { \
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->type_stackp >= type_stack + sizeof(type_stack)) \
|
91aab4 | 1999-12-13 | Martin Stjernholm | | fatal("Type stack overflow."); \
type_stack_reverse(); \
(TYPESTR)=pop_unfinished_type(); \
} while (0)
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG_MALLOC
|
20f7a0 | 2000-03-20 | Fredrik 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()))
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | #define pop_unfinished_type() \
|
20f7a0 | 2000-03-20 | Fredrik Hübinette (Hubbe) | | ((struct pike_string *)debug_malloc_pass(debug_pop_unfinished_type()))
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | #else
#define pop_type debug_pop_type
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | #define compiler_pop_type debug_compiler_pop_type
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | #define pop_unfinished_type debug_pop_unfinished_type
#endif
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | #ifndef PIKE_DEBUG
#define check_type_string(X)
#endif
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #endif
|