diff --git a/src/builtin_functions.c b/src/builtin_functions.c index ae9600155c29a0b1f013956122a6d3f8406924d5..3f2714ca4339c207934c652523e3f75a298e4a3e 100644 --- a/src/builtin_functions.c +++ b/src/builtin_functions.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: builtin_functions.c,v 1.352 2001/03/11 22:50:36 grubba Exp $"); +RCSID("$Id: builtin_functions.c,v 1.353 2001/03/17 16:37:41 grubba Exp $"); #include "interpret.h" #include "svalue.h" #include "pike_macros.h" @@ -2445,6 +2445,13 @@ static node *fix_overloaded_type(node *n, int lfun, const char *deftype, int def t=first_arg[0]->type; if(!t || match_types(t, object_type_string)) { +#ifdef USE_PIKE_TYPE + /* Skip any name-nodes. */ + while(t && t->type == PIKE_T_NAME) { + t = t->cdr; + } +#endif /* USE_PIKE_TYPE */ + /* FIXME: Ought to handle or-nodes here. */ if(t && ( #ifdef USE_PIKE_TYPE t->type @@ -7451,7 +7458,7 @@ void init_builtin_efuns(void) ADD_EFUN("_refs",f__refs,tFunc(tRef,tInt),OPT_EXTERNAL_DEPEND); ADD_EFUN("_leak",f__leak,tFunc(tRef,tInt),OPT_EXTERNAL_DEPEND); - ADD_EFUN("_typeof",f__typeof,tFunc(tMix,tType),0); + ADD_EFUN("_typeof", f__typeof, tFunc(tSetvar(0, tMix), tType(tVar(0))), 0); /* class __master * Used to prototype the master object. diff --git a/src/encode.c b/src/encode.c index 28a8f2fe905db45ffab2d5690d2eee9828722dd5..ff1ef7ef18722bee035d95cfae9aa17de5e37da9 100644 --- a/src/encode.c +++ b/src/encode.c @@ -25,7 +25,7 @@ #include "version.h" #include "bignum.h" -RCSID("$Id: encode.c,v 1.91 2001/03/17 00:02:08 grubba Exp $"); +RCSID("$Id: encode.c,v 1.92 2001/03/17 16:37:42 grubba Exp $"); /* #define ENCODE_DEBUG */ @@ -312,6 +312,7 @@ static void encode_type(struct pike_type *t, struct encode_data *data) t = t->cdr; goto one_more_type; + case T_TYPE: case T_ARRAY: case T_MULTISET: case T_NOT: @@ -404,6 +405,7 @@ one_more_type: case T_AND: t += low_encode_type(t, data); + case T_TYPE: case T_ARRAY: case T_MULTISET: case T_NOT: @@ -1197,6 +1199,7 @@ one_more_type: goto one_more_type; #endif /* USE_PIKE_TYPE */ + case T_TYPE: case T_ARRAY: case T_MULTISET: case T_NOT: @@ -1248,7 +1251,6 @@ one_more_type: case '8': case '9': case T_FLOAT: - case T_TYPE: case T_STRING: case T_PROGRAM: case T_MIXED: diff --git a/src/operators.c b/src/operators.c index 36d733ea1323f9e1e077b7f8aceb9d762e75cc7c..0e765b408f303776bc3e2e2d97fb49e40d6e5c56 100644 --- a/src/operators.c +++ b/src/operators.c @@ -6,7 +6,7 @@ /**/ #include "global.h" #include <math.h> -RCSID("$Id: operators.c,v 1.129 2001/03/04 19:27:18 mirar Exp $"); +RCSID("$Id: operators.c,v 1.130 2001/03/17 16:37:42 grubba Exp $"); #include "interpret.h" #include "svalue.h" #include "multiset.h" @@ -3409,7 +3409,8 @@ void init_operators(void) tVar(0), tVar(0),tInt01), tFuncV(tOr3(tObj,tProgram,tFunction) tMix,tMix,tInt01), tFuncV(tMix tOr3(tObj,tProgram,tFunction),tMix,tInt01), - tFuncV(tType tType,tOr3(tProgram,tFunction,tType),tInt01)), + tFuncV(tType(tMix) tType(tMix), + tOr3(tProgram,tFunction,tType(tMix)),tInt01)), OPT_WEAK_TYPE|OPT_TRY_OPTIMIZE,optimize_eq,generate_comparison); /* function(mixed...:int) */ ADD_EFUN2("`!=",f_ne, @@ -3419,7 +3420,8 @@ void init_operators(void) tVar(0), tVar(0),tInt01), tFuncV(tOr3(tObj,tProgram,tFunction) tMix,tMix,tInt01), tFuncV(tMix tOr3(tObj,tProgram,tFunction),tMix,tInt01), - tFuncV(tType tType,tOr3(tProgram,tFunction,tType),tInt01)), + tFuncV(tType(tMix) tType(tMix), + tOr3(tProgram,tFunction,tType(tMix)),tInt01)), OPT_WEAK_TYPE|OPT_TRY_OPTIMIZE,0,generate_comparison); /* function(mixed:int) */ ADD_EFUN2("`!",f_not,tFuncV(tMix,tVoid,tInt01), @@ -3499,7 +3501,7 @@ multiset & mapping -> mapping F_AND_TYPE(tMapping), F_AND_TYPE(tMultiset), F_AND_TYPE(tString), - F_AND_TYPE(tOr(tType,tPrg)) ), + F_AND_TYPE(tOr(tType(tMix),tPrg)) ), tIfnot(tFuncV(tNone, tNot(tMapping), tMix), tFuncV(tNone, @@ -3517,7 +3519,7 @@ multiset & mapping -> mapping tFuncV(tSetvar(3,tMultiset),tSetvar(4,tMultiset),tOr(tVar(3),tVar(4))), \ tFuncV(tSetvar(5,tArray),tSetvar(6,tArray),tOr(tVar(5),tVar(6))), \ tFuncV(tString,tString,tString), \ - tFuncV(tOr(tType,tPrg),tOr(tType,tPrg),tType)) + tFuncV(tOr(tType(tMix),tPrg),tOr(tType(tMix),tPrg),tType(tMix))) ADD_EFUN2("`|",f_or,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_or); @@ -3593,7 +3595,7 @@ multiset & mapping -> mapping tFunc(tInt,tInt), tFunc(tFlt,tFlt), tFunc(tStr,tStr), - tFunc(tOr(tType,tProgram),tType)), + tFunc(tOr(tType(tMix),tProgram),tType(tMix))), OPT_TRY_OPTIMIZE,0,generate_compl); /* function(string|multiset|array|mapping|object:int) */ ADD_EFUN2("sizeof", f_sizeof, diff --git a/src/pike_types.c b/src/pike_types.c index 651b31a9221c54d0b6bd15e27a79c8f085c94427..1c576af612cd1038cd40d8c9359249d76a6d43eb 100644 --- a/src/pike_types.c +++ b/src/pike_types.c @@ -5,7 +5,7 @@ \*/ /**/ #include "global.h" -RCSID("$Id: pike_types.c,v 1.161 2001/03/05 21:32:52 grubba Exp $"); +RCSID("$Id: pike_types.c,v 1.162 2001/03/17 16:37:43 grubba Exp $"); #include <ctype.h> #include "svalue.h" #include "pike_types.h" @@ -416,6 +416,11 @@ void push_scope_type(int level) void push_assign_type(int marker) { +#ifdef PIKE_DEBUG + if ((marker < '0') || (marker > '9')) { + fatal("Bad assign marker: %d\n", marker); + } +#endif /* PIKE_DEBUG */ *Pike_compiler->type_stackp = mk_type(T_ASSIGN, (void *)(ptrdiff_t)marker, *Pike_compiler->type_stackp, @@ -463,6 +468,7 @@ void push_type(unsigned INT16 type) case T_ARRAY: case T_MULTISET: case T_NOT: + case T_TYPE: /* Make a new type of the top type, and put it in car. */ *Pike_compiler->type_stackp = mk_type(type, *Pike_compiler->type_stackp, NULL, @@ -481,7 +487,6 @@ void push_type(unsigned INT16 type) case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_MIXED: case T_VOID: @@ -531,6 +536,7 @@ void pop_type_stack(void) case T_ARRAY: case T_MULTISET: case T_NOT: + case T_TYPE: /* car */ push_finished_type(top->car); break; @@ -543,7 +549,6 @@ void pop_type_stack(void) case T_OBJECT: case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_MIXED: case T_VOID: @@ -831,7 +836,8 @@ static void internal_parse_typeA(char **_s) push_reverse_type(T_TUPLE); break; } - if(!strcmp(buf,"type")) { push_type(T_TYPE); break; } + /* FIXME: Handle type(T) */ + if(!strcmp(buf,"type")) { push_type(T_MIXED); push_type(T_TYPE); break; } goto bad_type; case 'm': @@ -1123,7 +1129,11 @@ void simple_describe_type(struct pike_type *s) } case T_FLOAT: printf("float"); break; case T_STRING: printf("string"); break; - case T_TYPE: printf("type"); break; + case T_TYPE: + printf("type("); + simple_describe_type(s->car); + printf(")"); + break; case T_PROGRAM: printf("program"); break; case T_OBJECT: printf("object(%s %ld)", @@ -1269,7 +1279,11 @@ static void low_describe_type(struct pike_type *t) break; case T_STRING: my_strcat("string"); break; - case T_TYPE: my_strcat("type"); break; + case T_TYPE: + my_strcat("type("); + my_describe_type(t->car); + my_strcat(")"); + break; case PIKE_T_NAME: if (!((struct pike_string *)t->car)->size_shift) { @@ -1643,7 +1657,6 @@ static int lower_and_pike_types(struct pike_type *t1, struct pike_type *t2) break; case T_PROGRAM: case T_STRING: - case T_TYPE: case T_FLOAT: case T_INT: even_lower_and_pike_types(t1, t2); @@ -1675,7 +1688,6 @@ static int low_and_push_complex_pike_type(struct pike_type *type) case T_ZERO: case T_PROGRAM: case T_STRING: - case T_TYPE: case T_FLOAT: case T_INT: /* Simple type. Already handled. */ @@ -1751,7 +1763,6 @@ static void low_and_pike_types(struct pike_type *t1, } else if((t1->type == t2->type) && ((t1->type == T_STRING) || - (t1->type == T_TYPE) || (t1->type == T_FLOAT) || (t1->type == T_PROGRAM))) { @@ -2301,6 +2312,7 @@ static struct pike_type *low_match_types2(struct pike_type *a, } + case T_TYPE: case T_MULTISET: case T_ARRAY: if(!low_match_types(a->car, b->car, @@ -2308,7 +2320,6 @@ static struct pike_type *low_match_types2(struct pike_type *a, case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_ZERO: case T_VOID: @@ -2828,6 +2839,7 @@ static int low_pike_types_le2(struct pike_type *a, struct pike_type *b, } + case T_TYPE: case T_MULTISET: case T_ARRAY: a = a->car; @@ -2837,7 +2849,6 @@ static int low_pike_types_le2(struct pike_type *a, struct pike_type *b, case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_ZERO: case T_VOID: @@ -3740,6 +3751,12 @@ struct pike_type *get_type_of_svalue(struct svalue *s) return pop_unfinished_type(); } + case T_TYPE: + type_stack_mark(); + push_finished_type(s->u.type); + push_type(T_TYPE); + return pop_unfinished_type(); + default: type_stack_mark(); push_type(s->type); @@ -3921,6 +3938,7 @@ static struct pike_type *low_make_pike_type(unsigned char *type_string, low_make_pike_type(*cont, cont), PT_COPY_BOTH); case T_ARRAY: case T_MULTISET: + case T_TYPE: case T_NOT: /* Single type */ return mk_type(type, low_make_pike_type(type_string+1, cont), NULL, @@ -3941,7 +3959,6 @@ static struct pike_type *low_make_pike_type(unsigned char *type_string, case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_MIXED: case T_VOID: @@ -4111,6 +4128,7 @@ one_more_type: case T_ARRAY: case T_MULTISET: + case T_TYPE: case T_NOT: goto one_more_type; @@ -4126,7 +4144,6 @@ one_more_type: case '9': case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_MIXED: case T_VOID: @@ -4482,7 +4499,8 @@ static void internal_parse_typeA(char **_s) push_type(T_TUPLE); break; } - if(!strcmp(buf,"type")) { push_type(T_TYPE); break; } + /* FIXME: Support for type(T). */ + if(!strcmp(buf,"type")) { push_type(T_MIXED); push_type(T_TYPE); break; } goto bad_type; case 'm': @@ -4822,7 +4840,11 @@ static char *low_describe_type(char *t) /* Prog id */ break; case T_STRING: my_strcat("string"); break; - case T_TYPE: my_strcat("type"); break; + case T_TYPE: + my_strcat("type("); + t = low_describe_type(t); + my_strcat(")"); + break; case T_FUNCTION: { @@ -5217,7 +5239,6 @@ static int lower_and_pike_types(char *t1, char *t2) break; case T_PROGRAM: case T_STRING: - case T_TYPE: case T_FLOAT: case T_INT: even_lower_and_pike_types(t1, t2); @@ -5250,7 +5271,6 @@ static int low_and_push_complex_pike_type(char *type) case T_ZERO: case T_PROGRAM: case T_STRING: - case T_TYPE: case T_FLOAT: case T_INT: /* Simple type. Already handled. */ @@ -5328,7 +5348,6 @@ static void low_and_pike_types(char *t1, char *t2) push_type(T_SCOPE); } else if((EXTRACT_UCHAR(t1)==T_STRING && EXTRACT_UCHAR(t2)==T_STRING) || - (EXTRACT_UCHAR(t1)==T_TYPE && EXTRACT_UCHAR(t2)==T_TYPE) || (EXTRACT_UCHAR(t1)==T_FLOAT && EXTRACT_UCHAR(t2)==T_FLOAT) || (EXTRACT_UCHAR(t1)==T_PROGRAM && EXTRACT_UCHAR(t2)==T_PROGRAM)) { @@ -5867,13 +5886,13 @@ static char *low_match_types2(char *a,char *b, int flags) } + case T_TYPE: case T_MULTISET: case T_ARRAY: if(!low_match_types(++a,++b,flags & ~(A_EXACT|B_EXACT))) return 0; case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_ZERO: case T_VOID: @@ -6379,13 +6398,13 @@ static int low_pike_types_le2(char *a, char *b, } + case T_TYPE: case T_MULTISET: case T_ARRAY: if(!low_pike_types_le(++a, ++b, 0, flags)) return 0; case T_FLOAT: case T_STRING: - case T_TYPE: case T_PROGRAM: case T_ZERO: case T_VOID: @@ -7256,6 +7275,12 @@ struct pike_type *get_type_of_svalue(struct svalue *s) return pop_unfinished_type(); } + case T_TYPE: + type_stack_mark(); + push_finished_type(s->u.type); + push_type(T_TYPE); + return pop_unfinished_type(); + default: type_stack_mark(); push_type(s->type); @@ -7461,7 +7486,7 @@ void init_types(void) multiset_type_string = CONSTTYPE(tMultiset); mapping_type_string = CONSTTYPE(tMapping); function_type_string = CONSTTYPE(tFunction); - type_type_string = CONSTTYPE(tType); + type_type_string = CONSTTYPE(tType(tMix)); void_type_string = CONSTTYPE(tVoid); zero_type_string = CONSTTYPE(tZero); any_type_string = CONSTTYPE(tOr(tVoid,tMix)); diff --git a/src/svalue.h b/src/svalue.h index b8293d32163cda414efa55591d1feff20161b3b0..e75d460f7abef3df192f7cc45c97c414c4652dca 100644 --- a/src/svalue.h +++ b/src/svalue.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: svalue.h,v 1.79 2001/03/09 02:27:57 hubbe Exp $ + * $Id: svalue.h,v 1.80 2001/03/17 16:37:43 grubba Exp $ */ #ifndef SVALUE_H #define SVALUE_H @@ -138,7 +138,7 @@ struct svalue #define tProgram "\005" #define tStr "\006" #define tString "\006" -#define tType "\007" +#define tType(T) "\007" T #define tInt "\010\200\000\000\000\177\377\377\377" #define tInt0 "\010\000\000\000\000\000\000\000\000" #define tInt1 "\010\000\000\000\001\000\000\000\001"