cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
867079 | 1999-02-28 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
da77e2 | 2000-09-08 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: pike_types.c,v 1.139 2000/09/08 17:06:29 hubbe Exp $");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include <ctype.h>
#include "svalue.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "pike_types.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "stralloc.h"
#include "stuff.h"
#include "array.h"
#include "program.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "constants.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "object.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "multiset.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "mapping.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "error.h"
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | #include "las.h"
#include "language.h"
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | #include "lex.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
6c3940 | 1999-10-28 | Fredrik Hübinette (Hubbe) | | #include "bignum.h"
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | #include "main.h"
|
f76b4c | 2000-05-11 | Henrik Grubbström (Grubba) | | #include "opcodes.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | #define PIKE_TYPE_DEBUG
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | int max_correct_args;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | static void internal_parse_type(char **s);
|
89da11 | 2000-08-15 | Henrik Grubbström (Grubba) | | static ptrdiff_t type_length(char *t);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | static int low_pike_types_le(char *a, char *b,
int array_cnt, unsigned int flags);
|
2573d1 | 1999-12-22 | Henrik Grubbström (Grubba) | | static int low_check_indexing(char *type, char *index_type, node *n);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | #define TWOT(X,Y) (((X) << 8)+(Y))
#define EXTRACT_TWOT(X,Y) TWOT(EXTRACT_UCHAR(X), EXTRACT_UCHAR(Y))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | |
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | * basic type are string, type, int, float, object and program
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * arrays are coded like by the value T_ARRAY followed by the
* data type, if the type is not known it is T_MIXED, ie:
* T_ARRAY <data type>
* mappings are followed by two arguments, the first is the type
* for the indices, and the second is the type of the data, ie:
* T_MAPPING <indice type> <data type>
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | * multiset works similarly to arrays.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * functions are _very_ special:
* they are coded like this:
* T_FUNCTION <arg type> <arg type> ... <arg type> T_MANY <arg type> <return type>
* note that the type after T_MANY can be T_VOID
* T_MIXED matches anything except T_VOID
* T_UNKNOWN only matches T_MIXED and T_UNKNOWN
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | * objects are coded thus:
* T_OBJECT <0/1> <program_id>
* ^
|
3d5c7d | 1999-12-12 | Henrik Grubbström (Grubba) | | * 0 means 'implements'
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | * 1 means 'is' (aka 'clone of')
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | * Integers are encoded as:
* T_INT <min> <max>
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | * Everything except T_VOID matches T_ZERO.
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct pike_string *string_type_string;
PMOD_EXPORT struct pike_string *int_type_string;
PMOD_EXPORT struct pike_string *float_type_string;
PMOD_EXPORT struct pike_string *function_type_string;
PMOD_EXPORT struct pike_string *object_type_string;
PMOD_EXPORT struct pike_string *program_type_string;
PMOD_EXPORT struct pike_string *array_type_string;
PMOD_EXPORT struct pike_string *multiset_type_string;
PMOD_EXPORT struct pike_string *mapping_type_string;
PMOD_EXPORT struct pike_string *type_type_string;
PMOD_EXPORT struct pike_string *mixed_type_string;
PMOD_EXPORT struct pike_string *void_type_string;
PMOD_EXPORT struct pike_string *zero_type_string;
PMOD_EXPORT struct pike_string *any_type_string;
PMOD_EXPORT struct pike_string *weak_type_string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | static struct pike_string *a_markers[10],*b_markers[10];
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | static struct program *implements_a;
static struct program *implements_b;
|
22ca07 | 1998-04-08 | Fredrik Hübinette (Hubbe) | | static void clear_markers(void)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
unsigned int e;
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | for(e=0;e<NELEM(a_markers);e++)
{
if(a_markers[e])
{
free_string(a_markers[e]);
a_markers[e]=0;
}
if(b_markers[e])
{
free_string(b_markers[e]);
b_markers[e]=0;
}
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | void check_type_string(struct pike_string *s)
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | {
if(debug_findstring(s) != s)
fatal("Type string not shared.\n");
if(type_length(s->str) != s->len)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
stupid_describe_type(s->str,s->len);
|
6f9590 | 2000-08-17 | Henrik Grubbström (Grubba) | | fatal("Length of type is wrong. (should be %ld, is %ld)\n",
PTRDIFF_T_TO_LONG(type_length(s->str)),
PTRDIFF_T_TO_LONG(s->len));
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | }
#endif
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void init_types(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
8bd216 | 1999-02-11 | Fredrik Hübinette (Hubbe) | | string_type_string = CONSTTYPE(tString);
int_type_string = CONSTTYPE(tInt);
object_type_string = CONSTTYPE(tObj);
|
ed5262 | 1999-02-11 | Fredrik Hübinette (Hubbe) | | program_type_string = CONSTTYPE(tPrg);
|
8bd216 | 1999-02-11 | Fredrik Hübinette (Hubbe) | | float_type_string = CONSTTYPE(tFloat);
mixed_type_string=CONSTTYPE(tMix);
array_type_string=CONSTTYPE(tArray);
multiset_type_string=CONSTTYPE(tMultiset);
mapping_type_string=CONSTTYPE(tMapping);
function_type_string=CONSTTYPE(tFunction);
|
bb8d1d | 1999-12-15 | Henrik Grubbström (Grubba) | | type_type_string=CONSTTYPE(tType);
|
8bd216 | 1999-02-11 | Fredrik Hübinette (Hubbe) | | void_type_string=CONSTTYPE(tVoid);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | zero_type_string=CONSTTYPE(tZero);
|
8bd216 | 1999-02-11 | Fredrik Hübinette (Hubbe) | | any_type_string=CONSTTYPE(tOr(tVoid,tMix));
|
c2a496 | 1999-12-15 | Henrik Grubbström (Grubba) | | weak_type_string=CONSTTYPE(tOr4(tArray,tMultiset,tMapping,
|
17cc3a | 1999-12-23 | Henrik Grubbström (Grubba) | | tFuncV(tNone,tZero,tOr(tMix,tVoid))));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | static ptrdiff_t type_length(char *t)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
char *q=t;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | one_more_type:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(t++))
{
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | default:
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | fatal("error in type string %d.\n",EXTRACT_UCHAR(t-1));
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
break;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | |
case T_SCOPE:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_ASSIGN:
t++;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | goto one_more_type;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case T_FUNCTION:
while(EXTRACT_UCHAR(t)!=T_MANY) t+=type_length(t);
t++;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TUPLE:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_MAPPING:
case T_OR:
case T_AND:
t+=type_length(t);
case T_ARRAY:
case T_MULTISET:
case T_NOT:
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | goto one_more_type;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case T_FLOAT:
case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
case T_MIXED:
case T_VOID:
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_UNKNOWN:
break;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | |
case T_INT:
t+=sizeof(INT32)*2;
break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case T_OBJECT:
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | t++;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | t+=sizeof(INT32);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
return t-q;
}
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | unsigned char type_stack[PIKE_TYPE_STACK_SIZE];
unsigned char *pike_type_mark_stack[PIKE_TYPE_STACK_SIZE/4];
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | ptrdiff_t pop_stack_mark(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->pike_type_mark_stackp--;
if(Pike_compiler->pike_type_mark_stackp<pike_type_mark_stack)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | fatal("Type mark stack underflow\n");
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | return Pike_compiler->type_stackp - *Pike_compiler->pike_type_mark_stackp;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void pop_type_stack(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->type_stackp--;
if(Pike_compiler->type_stackp<type_stack)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | fatal("Type stack underflow\n");
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void type_stack_pop_to_mark(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->type_stackp-=pop_stack_mark();
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->type_stackp<type_stack)
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | fatal("Type stack underflow\n");
#endif
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void type_stack_reverse(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
393a59 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t a;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | a=pop_stack_mark();
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | reverse((char *)(Pike_compiler->type_stackp-a),a,1);
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | void push_type_int(INT32 i)
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
393a59 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t e;
for(e = 0; e < (ptrdiff_t)sizeof(i); e++)
push_type(DO_NOT_WARN((unsigned char)((i>>(e*8)) & 0xff)));
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | }
|
91aab4 | 1999-12-13 | Martin Stjernholm | | void push_type_int_backwards(INT32 i)
{
int e;
for(e=(int)sizeof(i);e-->0;)
push_type( (i>>(e*8)) & 0xff );
}
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | INT32 extract_type_int(char *p)
{
int e;
INT32 ret=0;
for(e=0;e<(int)sizeof(INT32);e++)
ret=(ret<<8) | EXTRACT_UCHAR(p+e);
return ret;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | void push_unfinished_type(char *s)
{
|
393a59 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t e;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | e=type_length(s);
for(e--;e>=0;e--) push_type(s[e]);
}
|
27f6ba | 1999-11-24 | Fredrik Hübinette (Hubbe) | | static void push_unfinished_type_with_markers(char *s,
struct pike_string **am)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
|
89da11 | 2000-08-15 | Henrik Grubbström (Grubba) | | int d,e,c;
ptrdiff_t len=type_length(s);
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
for(e=0;e<len;e++)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | switch(c=EXTRACT_UCHAR(s+e))
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | #if 1
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
if(am[c-'0'])
{
push_finished_type_backwards(am[c-'0']);
}else{
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_type(T_ZERO);
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | }
break;
#endif
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | case T_ASSIGN:
|
27f6ba | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #if 1
e++;
#else
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_type(c);
push_type(EXTRACT_UCHAR(s+ ++e));
|
27f6ba | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #endif
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | break;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | |
case T_INT:
push_type(c);
for(d=0;d<(int)sizeof(INT32)*2;d++)
push_type(EXTRACT_UCHAR(s+ ++e));
break;
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | |
case T_OBJECT:
push_type(c);
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | for(d=0;d<(int)sizeof(INT32)+1;d++) push_type(EXTRACT_UCHAR(s+ ++e));
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | break;
default:
push_type(c);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
}
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void push_finished_type(struct pike_string *type)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | ptrdiff_t e;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(type);
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | for(e=type->len-1;e>=0;e--) push_type(type->str[e]);
}
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | void push_finished_type_backwards(struct pike_string *type)
{
int e;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(type);
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | MEMCPY(Pike_compiler->type_stackp, type->str, type->len);
Pike_compiler->type_stackp+=type->len;
|
2a6d26 | 1998-03-25 | Fredrik Hübinette (Hubbe) | | }
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *debug_pop_unfinished_type(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
393a59 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t len, e;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | len=pop_stack_mark();
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | s=begin_shared_string(len);
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | Pike_compiler->type_stackp-=len;
MEMCPY(s->str, Pike_compiler->type_stackp, len);
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | reverse(s->str, len, 1);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | s=end_shared_string(s);
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(s);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | return s;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *debug_pop_type(void)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | s=pop_unfinished_type();
type_stack_mark();
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | return s;
}
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | struct pike_string *debug_compiler_pop_type(void)
{
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(Pike_compiler->num_parse_error)
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | {
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | type_stack_pop_to_mark();
|
4142a6 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
reference_shared_string(mixed_type_string);
return mixed_type_string;
}else{
struct pike_string *s;
s=pop_unfinished_type();
type_stack_mark();
return s;
}
}
|
b432bb | 1996-10-29 | Per Hedbor | | static void internal_parse_typeA(char **_s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
f044a8 | 1996-12-06 | Fredrik Hübinette (Hubbe) | | char buf[80];
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | unsigned int len;
|
b432bb | 1996-10-29 | Per Hedbor | | unsigned char **s = (unsigned char **)_s;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
len=0;
|
f044a8 | 1996-12-06 | Fredrik Hübinette (Hubbe) | | for(len=0;isidchar(EXTRACT_UCHAR(s[0]+len));len++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(len>=sizeof(buf)) error("Buffer overflow in parse_type\n");
buf[len] = s[0][len];
}
buf[len]=0;
*s += len;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | switch(buf[0])
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | case 'z':
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!strcmp(buf,"zero")) { push_type(T_ZERO); break; }
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | goto bad_type;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | case 'i':
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | if(!strcmp(buf,"int"))
{
while(ISSPACE(**s)) ++*s;
if(**s=='(')
{
INT32 min,max;
++*s;
while(ISSPACE(**s)) ++*s;
|
01a957 | 2000-02-03 | Henrik Grubbström (Grubba) | | min=STRTOL((char *)*s,(char **)s,0);
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
if(s[0][0]=='.' && s[0][1]=='.')
s[0]+=2;
else
error("Missing .. in integer type.\n");
while(ISSPACE(**s)) ++*s;
|
01a957 | 2000-02-03 | Henrik Grubbström (Grubba) | | max=STRTOL((char *)*s,(char **)s,0);
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
if(**s != ')') error("Missing ')' in integer range.\n");
++*s;
push_type_int(max);
push_type_int(min);
}else{
push_type_int(MAX_INT32);
push_type_int(MIN_INT32);
}
push_type(T_INT);
break;
}
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | goto bad_type;
case 'f':
if(!strcmp(buf,"function"))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
if(**s == '(')
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | ++*s;
while(ISSPACE(**s)) ++*s;
type_stack_mark();
while(1)
{
if(**s == ':')
{
push_type(T_MANY);
push_type(T_VOID);
break;
}
type_stack_mark();
type_stack_mark();
type_stack_mark();
internal_parse_type(_s);
type_stack_reverse();
if(**s==',')
{
++*s;
while(ISSPACE(**s)) ++*s;
}
else if(s[0][0]=='.' && s[0][1]=='.' && s[0][2]=='.')
{
type_stack_reverse();
push_type(T_MANY);
type_stack_reverse();
*s+=3;
while(ISSPACE(**s)) ++*s;
if(**s != ':') error("Missing ':' after ... in function type.\n");
break;
}
pop_stack_mark();
pop_stack_mark();
}
++*s;
type_stack_mark();
internal_parse_type(_s);
type_stack_reverse();
if(**s != ')') error("Missing ')' in function type.\n");
++*s;
type_stack_reverse();
}else{
|
368817 | 1999-11-26 | Fredrik Hübinette (Hubbe) | | push_type(T_VOID);
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
|
368817 | 1999-11-26 | Fredrik Hübinette (Hubbe) | | push_type(T_OR);
push_type(T_VOID);
|
a0b73f | 2000-01-03 | Martin Stjernholm | | push_type(T_ZERO);
|
368817 | 1999-11-26 | Fredrik Hübinette (Hubbe) | | push_type(T_OR);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(T_MANY);
}
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | push_type(T_FUNCTION);
break;
}
if(!strcmp(buf,"float")) { push_type(T_FLOAT); break; }
goto bad_type;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | case 'o':
if(!strcmp(buf,"object"))
{
push_type_int(0);
push_type(0);
push_type(T_OBJECT);
break;
}
goto bad_type;
case 'p':
if(!strcmp(buf,"program")) { push_type(T_PROGRAM); break; }
goto bad_type;
case 's':
if(!strcmp(buf,"string")) { push_type(T_STRING); break; }
goto bad_type;
case 'v':
if(!strcmp(buf,"void")) { push_type(T_VOID); break; }
goto bad_type;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case 't':
if (!strcmp(buf,"tuple"))
{
while(ISSPACE(**s)) ++*s;
if(**s == '(')
{
type_stack_mark();
++*s;
type_stack_mark();
internal_parse_type(_s);
type_stack_reverse();
if(**s != ',') error("Expecting ','.\n");
++*s;
type_stack_mark();
internal_parse_type(_s);
type_stack_reverse();
if(**s != ')') error("Expecting ')'.\n");
++*s;
type_stack_reverse();
}else{
push_type(T_MIXED);
push_type(T_MIXED);
}
push_type(T_TUPLE);
break;
}
if(!strcmp(buf,"type")) { push_type(T_TYPE); break; }
goto bad_type;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | case 'm':
if(!strcmp(buf,"mixed")) { push_type(T_MIXED); break; }
if(!strcmp(buf,"mapping"))
{
while(ISSPACE(**s)) ++*s;
if(**s == '(')
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ++*s;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(**s != ':') error("Expecting ':'.\n");
++*s;
type_stack_mark();
internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
++*s;
type_stack_reverse();
}else{
push_type(T_MIXED);
push_type(T_MIXED);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | push_type(T_MAPPING);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | if(!strcmp(buf,"multiset"))
{
while(ISSPACE(**s)) ++*s;
if(**s == '(')
{
++*s;
internal_parse_type(_s);
if(**s != ')') error("Expecting ')'.\n");
++*s;
}else{
push_type(T_MIXED);
}
push_type(T_MULTISET);
break;
}
goto bad_type;
case 'u':
if(!strcmp(buf,"unknown")) { push_type(T_UNKNOWN); break; }
goto bad_type;
case 'a':
if(!strcmp(buf,"array"))
{
while(ISSPACE(**s)) ++*s;
if(**s == '(')
{
++*s;
internal_parse_type(_s);
if(**s != ')') error("Expecting ')'.\n");
++*s;
}else{
push_type(T_MIXED);
}
push_type(T_ARRAY);
break;
}
goto bad_type;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if(atoi(buf)<10)
{
while(ISSPACE(**s)) ++*s;
if(**s=='=')
{
++*s;
internal_parse_type(_s);
push_type(buf[0]);
push_type(T_ASSIGN);
}else{
push_type(buf[0]);
}
break;
}
default:
bad_type:
error("Couldn't parse type. (%s)\n",buf);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | }
static void internal_parse_typeB(char **s)
{
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | switch(**s)
{
case '!':
++*s;
internal_parse_typeB(s);
push_type(T_NOT);
break;
case '(':
++*s;
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | internal_parse_type(s);
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | break;
default:
internal_parse_typeA(s);
}
}
static void internal_parse_typeCC(char **s)
{
internal_parse_typeB(s);
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | while(**s == '*')
{
++*s;
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | push_type(T_ARRAY);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | }
static void internal_parse_typeC(char **s)
{
type_stack_mark();
type_stack_mark();
internal_parse_typeCC(s);
type_stack_reverse();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
if(**s == '&')
{
++*s;
type_stack_mark();
internal_parse_typeC(s);
type_stack_reverse();
type_stack_reverse();
push_type(T_AND);
}else{
type_stack_reverse();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | }
static void internal_parse_type(char **s)
{
internal_parse_typeC(s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
291600 | 1998-01-16 | Henrik Grubbström (Grubba) | | while(ISSPACE(**((unsigned char **)s))) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | while(**s == '|')
{
++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | internal_parse_typeC(s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(T_OR);
}
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | * It takes a string on the exact same format as Pike and returns a type
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | * struct.
*/
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *parse_type(char *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | unsigned char *ts=Pike_compiler->type_stackp;
unsigned char **ptms=Pike_compiler->pike_type_mark_stackp;
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | #endif
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | internal_parse_type(&s);
if( *s )
fatal("Extra junk at end of type definition.\n");
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | ret=pop_unfinished_type();
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
bad516 | 2000-06-23 | Fredrik Hübinette (Hubbe) | | if(ts!=Pike_compiler->type_stackp || ptms!=Pike_compiler->pike_type_mark_stackp)
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | fatal("Type stack whacked in parse_type.\n");
#endif
return ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | void stupid_describe_type(char *a, ptrdiff_t len)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
e0755c | 2000-08-15 | Henrik Grubbström (Grubba) | | ptrdiff_t e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | for(e=0;e<len;e++)
{
if(e) printf(" ");
switch(EXTRACT_UCHAR(a+e))
{
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
printf("%c",EXTRACT_UCHAR(a+e));
break;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | |
case T_SCOPE: printf("scope"); break;
case T_TUPLE: printf("tuple"); break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_ASSIGN: printf("="); break;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | case T_INT:
{
INT32 min=extract_type_int(a+e+1);
INT32 max=extract_type_int(a+e+1+sizeof(INT32));
printf("int");
if(min!=MIN_INT32 || max!=MAX_INT32)
printf("(%ld..%ld)",(long)min,(long)max);
e+=sizeof(INT32)*2;
break;
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_FLOAT: printf("float"); break;
case T_STRING: printf("string"); break;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE: printf("type"); break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM: printf("program"); break;
case T_OBJECT:
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | printf("object(%s %ld)",
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | EXTRACT_UCHAR(a+e+1)?"is":"implements",
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | (long)extract_type_int(a+e+2));
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | e+=sizeof(INT32)+1;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | break;
case T_FUNCTION: printf("function"); break;
case T_ARRAY: printf("array"); break;
case T_MAPPING: printf("mapping"); break;
case T_MULTISET: printf("multiset"); break;
case T_UNKNOWN: printf("unknown"); break;
case T_MANY: printf("many"); break;
case T_OR: printf("or"); break;
case T_AND: printf("and"); break;
case T_NOT: printf("not"); break;
case T_VOID: printf("void"); break;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO: printf("zero"); break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_MIXED: printf("mixed"); break;
default: printf("%d",EXTRACT_UCHAR(a+e)); break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
printf("\n");
}
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void simple_describe_type(struct pike_string *s)
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | {
stupid_describe_type(s->str,s->len);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
char *low_describe_type(char *t)
{
switch(EXTRACT_UCHAR(t++))
{
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
my_putchar(EXTRACT_UCHAR(t-1));
break;
case T_ASSIGN:
my_putchar('(');
my_putchar(EXTRACT_UCHAR(t++));
my_putchar('=');
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | my_putchar(')');
break;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | |
case T_SCOPE:
my_putchar('{');
my_putchar(EXTRACT_UCHAR(t++));
my_putchar(',');
t = low_describe_type(t);
my_putchar('}');
break;
case T_TUPLE:
my_putchar('[');
t = low_describe_type(t);
my_putchar(',');
t = low_describe_type(t);
my_putchar(']');
break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_VOID: my_strcat("void"); break;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO: my_strcat("zero"); break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_MIXED: my_strcat("mixed"); break;
case T_UNKNOWN: my_strcat("unknown"); break;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | case T_INT:
{
INT32 min=extract_type_int(t);
INT32 max=extract_type_int(t+sizeof(INT32));
my_strcat("int");
if(min!=MIN_INT32 || max!=MAX_INT32)
{
char buffer[100];
sprintf(buffer,"(%ld..%ld)",(long)min,(long)max);
my_strcat(buffer);
}
t+=sizeof(INT32)*2;
break;
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_FLOAT: my_strcat("float"); break;
case T_PROGRAM: my_strcat("program"); break;
case T_OBJECT:
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | if(extract_type_int(t+1))
|
0ee27b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | {
char buffer[100];
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | sprintf(buffer,"object(%s %ld)",*t?"is":"implements",
|
3d5c7d | 1999-12-12 | Henrik Grubbström (Grubba) | | (long)extract_type_int(t+1));
|
0ee27b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | my_strcat(buffer);
}else{
my_strcat("object");
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | t+=sizeof(INT32)+1;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
break;
case T_STRING: my_strcat("string"); break;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE: my_strcat("type"); break;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case T_FUNCTION:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | {
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | int s;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | my_strcat("function");
if(EXTRACT_UCHAR(t) == T_MANY &&
|
a0b73f | 2000-01-03 | Martin Stjernholm | | ((EXTRACT_UCHAR(t+1) == T_ZERO &&
EXTRACT_UCHAR(t+2) == T_OR &&
((EXTRACT_UCHAR(t+3) == T_MIXED && EXTRACT_UCHAR(t+4) == T_VOID) ||
(EXTRACT_UCHAR(t+4) == T_MIXED && EXTRACT_UCHAR(t+3) == T_VOID)))
||
(EXTRACT_UCHAR(t+1) == T_OR
&&
((EXTRACT_UCHAR(t+2) == T_ZERO && EXTRACT_UCHAR(t+3) == T_VOID) ||
(EXTRACT_UCHAR(t+3) == T_ZERO && EXTRACT_UCHAR(t+2) == T_VOID))
&&
EXTRACT_UCHAR(t+4) == T_OR
&&
((EXTRACT_UCHAR(t+5) == T_MIXED && EXTRACT_UCHAR(t+6) == T_VOID) ||
(EXTRACT_UCHAR(t+6) == T_MIXED && EXTRACT_UCHAR(t+5) == T_VOID)))))
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | |
|
a0b73f | 2000-01-03 | Martin Stjernholm | | if (EXTRACT_UCHAR(t+1) == T_ZERO) {
|
e0f7f5 | 1999-12-11 | Henrik Grubbström (Grubba) | | t += 5;
} else {
|
a0b73f | 2000-01-03 | Martin Stjernholm | |
|
e0f7f5 | 1999-12-11 | Henrik Grubbström (Grubba) | | t += 7;
}
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | } else {
my_strcat("(");
s=0;
while(EXTRACT_UCHAR(t) != T_MANY)
{
if(s++) my_strcat(", ");
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | t++;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t) == T_VOID)
{
t++;
}else{
if(s++) my_strcat(", ");
t=low_describe_type(t);
my_strcat(" ...");
}
my_strcat(" : ");
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | my_strcat(")");
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
break;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | }
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | my_strcat("array");
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t)==T_MIXED)
{
t++;
}else{
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | my_strcat("(");
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | my_strcat(")");
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
break;
case T_MULTISET:
my_strcat("multiset");
if(EXTRACT_UCHAR(t)!=T_MIXED)
{
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
}else{
t++;
}
break;
case T_NOT:
my_strcat("!");
|
da996d | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(t) > T_NOT) {
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
} else {
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | break;
case T_OR:
|
da996d | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(t) > T_OR) {
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
} else {
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | my_strcat(" | ");
|
da996d | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(t) > T_OR) {
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
} else {
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | break;
case T_AND:
|
da996d | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(t) > T_AND) {
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
} else {
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | my_strcat(" & ");
|
da996d | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(t) > T_AND) {
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
} else {
t=low_describe_type(t);
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
my_strcat("mapping");
if(EXTRACT_UCHAR(t)==T_MIXED && EXTRACT_UCHAR(t+1)==T_MIXED)
{
t+=2;
}else{
my_strcat("(");
t=low_describe_type(t);
|
e0f7f5 | 1999-12-11 | Henrik Grubbström (Grubba) | | my_strcat(":");
t=low_describe_type(t);
my_strcat(")");
}
break;
default:
{
char buf[20];
my_strcat("unknown code(");
sprintf(buf, "%d", EXTRACT_UCHAR(t-1));
my_strcat(buf);
my_strcat(")");
break;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
return t;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *describe_type(struct pike_string *type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | check_type_string(type);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!type) return make_shared_string("mixed");
init_buf();
low_describe_type(type->str);
return free_buf();
}
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | static int low_is_same_type(char *a, char *b)
{
if(type_length(a) != type_length(b)) return 0;
return !MEMCMP(a,b,type_length(a));
}
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | static TYPE_T low_compile_type_to_runtime_type(char *t)
{
TYPE_T tmp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(t))
{
case T_OR:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t++;
tmp=low_compile_type_to_runtime_type(t);
if(tmp == low_compile_type_to_runtime_type(t+type_length(t)))
return tmp;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TUPLE:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | default:
return T_MIXED;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
return T_INT;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_SCOPE:
return low_compile_type_to_runtime_type(t+2);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
case T_MAPPING:
case T_MULTISET:
case T_OBJECT:
case T_PROGRAM:
case T_FUNCTION:
case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | case T_INT:
case T_FLOAT:
return EXTRACT_UCHAR(t);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | TYPE_T compile_type_to_runtime_type(struct pike_string *s)
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | {
return low_compile_type_to_runtime_type(s->str);
}
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | |
|
05fe34 | 1999-11-20 | Henrik Grubbström (Grubba) | | static int low_find_exact_type_match(char *needle, char *haystack,
int separator)
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
|
05fe34 | 1999-11-20 | Henrik Grubbström (Grubba) | | while(EXTRACT_UCHAR(haystack) == separator)
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
haystack++;
|
05fe34 | 1999-11-20 | Henrik Grubbström (Grubba) | | if(low_find_exact_type_match(needle, haystack, separator))
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | return 1;
haystack+=type_length(haystack);
}
return low_is_same_type(needle, haystack);
}
static void very_low_or_pike_types(char *to_push, char *not_push)
{
while(EXTRACT_UCHAR(to_push)==T_OR)
{
to_push++;
very_low_or_pike_types(to_push, not_push);
to_push+=type_length(to_push);
}
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
|
05fe34 | 1999-11-20 | Henrik Grubbström (Grubba) | | if(!low_find_exact_type_match(to_push, not_push, T_OR))
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
push_unfinished_type(to_push);
push_type(T_OR);
}
}
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | static void low_or_pike_types(char *t1, char *t2, int zero_implied)
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
if(!t1)
{
if(!t2)
push_type(T_VOID);
else
push_unfinished_type(t2);
}
|
475ab4 | 1999-11-29 | Fredrik Hübinette (Hubbe) | | else if((!t2)
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | || (EXTRACT_UCHAR(t2) == T_ZERO && zero_implied)
|
475ab4 | 1999-11-29 | Fredrik Hübinette (Hubbe) | | )
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
push_unfinished_type(t1);
}
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | else if (EXTRACT_UCHAR(t1) == T_ZERO && zero_implied)
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | {
push_unfinished_type(t2);
}
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | else if(EXTRACT_UCHAR(t1)==T_MIXED || EXTRACT_UCHAR(t2)==T_MIXED)
{
push_type(T_MIXED);
}
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | else if(EXTRACT_UCHAR(t1)==T_INT && EXTRACT_UCHAR(t2)==T_INT)
{
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | INT32 i1,i2;
i1=extract_type_int(t1+1+sizeof(INT32));
i2=extract_type_int(t2+1+sizeof(INT32));
push_type_int(MAXIMUM(i1,i2));
i1=extract_type_int(t1+1);
i2=extract_type_int(t2+1);
push_type_int(MINIMUM(i1,i2));
push_type(T_INT);
}
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | else if (EXTRACT_UCHAR(t1) == T_SCOPE)
{
if (EXTRACT_UCHAR(t2) == T_SCOPE) {
low_or_pike_types(t1+2, t2+2, zero_implied);
if (EXTRACT_UCHAR(t1+1) > EXTRACT_UCHAR(t2+1))
push_type(EXTRACT_UCHAR(t1+1));
else
push_type(EXTRACT_UCHAR(t2+1));
} else {
low_or_pike_types(t1+2, t2, zero_implied);
push_type(EXTRACT_UCHAR(t1+1));
}
push_type(T_SCOPE);
}
else if (EXTRACT_UCHAR(t2) == T_SCOPE)
{
low_or_pike_types(t1, t2+2, zero_implied);
push_type(EXTRACT_UCHAR(t2+1));
push_type(T_SCOPE);
}
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | else
{
push_unfinished_type(t1);
very_low_or_pike_types(t2,t1);
}
}
static void medium_or_pike_types(struct pike_string *a,
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *b,
int zero_implied)
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | low_or_pike_types( a ? a->str : 0 , b ? b->str : 0 , zero_implied);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | }
|
9b7f57 | 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)
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | {
type_stack_mark();
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | medium_or_pike_types(a,b,1 );
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
}
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | static void very_low_and_pike_types(char *to_push, char *not_push)
{
while(EXTRACT_UCHAR(to_push)==T_AND)
{
to_push++;
very_low_and_pike_types(to_push, not_push);
to_push+=type_length(to_push);
}
|
05fe34 | 1999-11-20 | Henrik Grubbström (Grubba) | | if(!low_find_exact_type_match(to_push, not_push, T_AND))
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | {
push_unfinished_type(to_push);
push_type(T_AND);
}
}
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | static void even_lower_and_pike_types(char *t1, char *t2)
{
while(EXTRACT_UCHAR(t2) == T_OR)
{
t2++;
even_lower_and_pike_types(t1, t2);
t2 += type_length(t2);
}
if (EXTRACT_UCHAR(t1) == EXTRACT_UCHAR(t2)) {
if (EXTRACT_UCHAR(t1) == T_INT) {
INT32 i1,i2;
INT32 upper_bound,lower_bound;
i1=extract_type_int(t1+1+sizeof(INT32));
i2=extract_type_int(t2+1+sizeof(INT32));
upper_bound = MINIMUM(i1,i2);
i1=extract_type_int(t1+1);
i2=extract_type_int(t2+1);
lower_bound = MAXIMUM(i1,i2);
if (upper_bound >= lower_bound) {
push_type_int(upper_bound);
push_type_int(lower_bound);
push_type(T_INT);
push_type(T_OR);
}
} else {
push_unfinished_type(t1);
push_type(T_OR);
}
}
}
static int lower_and_pike_types(char *t1, char *t2)
{
int is_complex = 0;
while(EXTRACT_UCHAR(t1)==T_OR)
{
t1++;
is_complex |= lower_and_pike_types(t1, t2);
t1 += type_length(t1);
}
switch(EXTRACT_UCHAR(t1)) {
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | case T_VOID:
break;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_PROGRAM:
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | case T_FLOAT:
case T_INT:
even_lower_and_pike_types(t1, t2);
break;
default:
return 1;
}
return is_complex;
}
static int low_and_push_complex_pike_type(char *type)
{
int is_complex = 0;
while(EXTRACT_UCHAR(type) == T_OR)
{
|
e8c6c3 | 1999-11-21 | Henrik Grubbström (Grubba) | | int new_complex;
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | type++;
|
b8ba15 | 1999-11-21 | Henrik Grubbström (Grubba) | | new_complex = low_and_push_complex_pike_type(type);
|
e8c6c3 | 1999-11-21 | Henrik Grubbström (Grubba) | | if (new_complex) {
|
bcb32d | 1999-11-21 | Henrik Grubbström (Grubba) | | if (is_complex) {
push_type(T_OR);
} else {
is_complex = 1;
}
|
e8c6c3 | 1999-11-21 | Henrik Grubbström (Grubba) | | }
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | type += type_length(type);
}
switch(EXTRACT_UCHAR(type)) {
case T_VOID:
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
case T_PROGRAM:
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | case T_FLOAT:
case T_INT:
break;
default:
push_unfinished_type(type);
if (is_complex) {
push_type(T_OR);
}
return 1;
}
return is_complex;
}
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | static void low_and_pike_types(char *t1, char *t2)
{
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(!t1 || EXTRACT_UCHAR(t1) == T_VOID ||
!t2 || EXTRACT_UCHAR(t2) == T_VOID)
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | {
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | push_type(T_VOID);
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | else if(EXTRACT_UCHAR(t1) == T_ZERO ||
EXTRACT_UCHAR(t2) == T_ZERO)
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | {
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | push_type(T_ZERO);
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | }
|
784c5c | 1999-11-20 | Henrik Grubbström (Grubba) | | else if(EXTRACT_UCHAR(t1)==T_MIXED)
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | {
|
784c5c | 1999-11-20 | Henrik Grubbström (Grubba) | | push_unfinished_type(t2);
}
else if(EXTRACT_UCHAR(t2)==T_MIXED)
{
push_unfinished_type(t1);
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | }
else if(EXTRACT_UCHAR(t1)==T_INT && EXTRACT_UCHAR(t2)==T_INT)
{
INT32 i1,i2;
INT32 upper_bound,lower_bound;
i1=extract_type_int(t1+1+sizeof(INT32));
i2=extract_type_int(t2+1+sizeof(INT32));
upper_bound = MINIMUM(i1,i2);
i1=extract_type_int(t1+1);
i2=extract_type_int(t2+1);
lower_bound = MAXIMUM(i1,i2);
if (upper_bound >= lower_bound) {
push_type_int(upper_bound);
push_type_int(lower_bound);
push_type(T_INT);
} else {
push_type(T_VOID);
}
}
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | else if (EXTRACT_UCHAR(t1) == T_SCOPE)
{
if (EXTRACT_UCHAR(t2) == T_SCOPE) {
low_and_pike_types(t1+2, t2+2);
if (EXTRACT_UCHAR(t1+1) > EXTRACT_UCHAR(t2+1))
push_type(EXTRACT_UCHAR(t1+1));
else
push_type(EXTRACT_UCHAR(t2+1));
} else {
low_and_pike_types(t1+2, t2);
push_type(EXTRACT_UCHAR(t1+1));
}
push_type(T_SCOPE);
}
else if (EXTRACT_UCHAR(t2) == T_SCOPE)
{
low_and_pike_types(t1, t2+2);
push_type(EXTRACT_UCHAR(t2+1));
push_type(T_SCOPE);
}
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | else if((EXTRACT_UCHAR(t1)==T_STRING && EXTRACT_UCHAR(t2)==T_STRING) ||
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | (EXTRACT_UCHAR(t1)==T_TYPE && EXTRACT_UCHAR(t2)==T_TYPE) ||
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | (EXTRACT_UCHAR(t1)==T_FLOAT && EXTRACT_UCHAR(t2)==T_FLOAT) ||
(EXTRACT_UCHAR(t1)==T_PROGRAM && EXTRACT_UCHAR(t2)==T_PROGRAM))
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | {
push_unfinished_type(t1);
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | }
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | else if(low_pike_types_le(t1, t2, 0, 0))
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | {
push_unfinished_type(t1);
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | else if(low_pike_types_le(t2, t1, 0, 0))
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | {
push_unfinished_type(t2);
}
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | | else
{
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | push_type(T_ZERO);
|
85200e | 1999-11-21 | Henrik Grubbström (Grubba) | |
if (lower_and_pike_types(t1, t2)) {
if (low_and_push_complex_pike_type(t2)) {
low_and_push_complex_pike_type(t1);
push_type(T_AND);
push_type(T_OR);
}
}
|
69b6ab | 1999-11-20 | Henrik Grubbström (Grubba) | | }
}
static void medium_and_pike_types(struct pike_string *a,
struct pike_string *b)
{
low_and_pike_types( a ? a->str : 0 , b ? b->str : 0 );
}
struct pike_string *and_pike_types(struct pike_string *a,
struct pike_string *b)
{
type_stack_mark();
medium_and_pike_types(a,b);
return pop_unfinished_type();
}
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | static struct pike_string *low_object_lfun_type(char *t, short lfun)
{
struct program *p;
int i;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | p=id_to_program(extract_type_int(t+2));
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | if(!p) return 0;
|
134717 | 1998-04-23 | Fredrik Hübinette (Hubbe) | | i=FIND_LFUN(p, lfun);
if(i==-1) return 0;
|
0ee27b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | return ID_FROM_INT(p, i)->type;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | |
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | #define A_EXACT 1
#define B_EXACT 2
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | #define NO_MAX_ARGS 4
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | #define NO_SHORTCUTS 8
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
#ifdef PIKE_TYPE_DEBUG
static int indent=0;
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | static char *low_match_types(char *a,char *b, int flags)
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_TYPE_DEBUG
{
int e;
char *s;
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | static char *low_match_types2(char *a,char *b, int flags);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | init_buf();
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | for(e=0;e<indent;e++) my_strcat(" ");
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | my_strcat("low_match_types(");
low_describe_type(a);
if(type_length(a) + type_length(b) > 10)
{
my_strcat(",\n");
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat(" ");
low_describe_type(b);
my_strcat(",\n");
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat(" ");
}else{
my_strcat(", ");
low_describe_type(b);
my_strcat(", ");
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | }
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (flags) {
int f = 0;
if (flags & A_EXACT) {
my_strcat("A_EXACT");
f = 1;
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | }
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (flags & B_EXACT) {
if (f) {
my_strcat(" | ");
}
my_strcat("B_EXACT");
f = 1;
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | }
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (flags & NO_MAX_ARGS) {
if (f) {
my_strcat(" | ");
}
my_strcat("NO_MAX_ARGS");
f = 1;
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | }
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (flags & NO_SHORTCUTS) {
if (f) {
my_strcat(" | ");
}
my_strcat("NO_SHORTCUTS");
f = 1;
}
} else {
my_strcat("0");
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | }
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | my_strcat(");\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
indent++;
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | }
a=low_match_types2(a,b,flags);
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | indent--;
init_buf();
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat("= ");
if(a)
low_describe_type(a);
else
my_strcat("NULL");
my_strcat("\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
}
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | return a;
}
static char *low_match_types2(char *a,char *b, int flags)
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | int correct_args;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | char *ret;
if(a == b) return a;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(a))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | ret=low_match_types(a,b,flags);
if(!ret) return 0;
a+=type_length(a);
return low_match_types(a,b,flags);
case T_OR:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | ret=low_match_types(a,b,flags);
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | if(ret && !(flags & NO_SHORTCUTS)) return ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a+=type_length(a);
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | if(ret)
{
low_match_types(a,b,flags);
return ret;
}else{
return low_match_types(a,b,flags);
}
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
case T_NOT:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | if(low_match_types(a+1,b,(flags ^ B_EXACT ) | NO_MAX_ARGS))
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return 0;
return a;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case T_ASSIGN:
ret=low_match_types(a+2,b,flags);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | if(ret && EXTRACT_UCHAR(b)!=T_VOID)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
int m=EXTRACT_UCHAR(a+1)-'0';
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
type_stack_mark();
push_unfinished_type_with_markers(b, b_markers);
tmp=pop_unfinished_type();
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(a_markers[m], tmp, 0);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | if(a_markers[m]) free_string(a_markers[m]);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | free_string(tmp);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | a_markers[m]=pop_unfinished_type();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
#ifdef PIKE_TYPE_DEBUG
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | char *s;
int e;
init_buf();
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat("a_markers[");
|
f25837 | 2000-09-08 | Henrik Grubbström (Grubba) | | my_putchar((char)(m+'0'));
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | my_strcat("]=");
low_describe_type(a_markers[m]->str);
my_strcat("\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
}
#endif
#ifdef PIKE_DEBUG
if(a_markers[m]->str[0] == m+'0')
fatal("Cyclic type!\n");
#endif
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
return ret;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
int m=EXTRACT_UCHAR(a)-'0';
if(a_markers[m])
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | {
#ifdef PIKE_DEBUG
if(a_markers[m]->str[0] == EXTRACT_UCHAR(a))
fatal("Cyclic type!\n");
if(EXTRACT_UCHAR(a_markers[m]->str) == T_OR &&
a_markers[m]->str[1] == EXTRACT_UCHAR(a))
fatal("Cyclic type!\n");
#endif
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | return low_match_types(a_markers[m]->str, b, flags);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | }
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | else
return low_match_types(mixed_type_string->str, b, flags);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(b))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | b++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | ret=low_match_types(a,b,flags);
if(!ret) return 0;
b+=type_length(b);
return low_match_types(a,b,flags);
case T_OR:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | b++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | ret=low_match_types(a,b,flags);
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | if(ret && !(flags & NO_SHORTCUTS)) return ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | b+=type_length(b);
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | if(ret)
{
low_match_types(a,b,flags);
return ret;
}else{
return low_match_types(a,b,flags);
}
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
case T_NOT:
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | if(low_match_types(a,b+1, (flags ^ A_EXACT ) | NO_MAX_ARGS))
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return 0;
return a;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | |
case T_ASSIGN:
ret=low_match_types(a,b+2,flags);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | if(ret && EXTRACT_UCHAR(a)!=T_VOID)
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | {
int m=EXTRACT_UCHAR(b+1)-'0';
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_unfinished_type_with_markers(a, a_markers);
tmp=pop_unfinished_type();
type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(b_markers[m], tmp, 0);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | if(b_markers[m]) free_string(b_markers[m]);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | free_string(tmp);
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | b_markers[m]=pop_unfinished_type();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_TYPE_DEBUG
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | char *s;
int e;
init_buf();
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat("b_markers[");
|
f25837 | 2000-09-08 | Henrik Grubbström (Grubba) | | my_putchar((char)(m+'0'));
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | my_strcat("]=");
low_describe_type(b_markers[m]->str);
my_strcat("\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
}
#endif
#ifdef PIKE_DEBUG
if(b_markers[m]->str[0] == m+'0')
fatal("Cyclic type!\n");
#endif
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | }
return ret;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
int m=EXTRACT_UCHAR(b)-'0';
if(b_markers[m])
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | {
#ifdef PIKE_DEBUG
if(b_markers[m]->str[0] == EXTRACT_UCHAR(b))
fatal("Cyclic type!\n");
#endif
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | return low_match_types(a, b_markers[m]->str, flags);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | }
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | else
return low_match_types(a, mixed_type_string->str, flags);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | |
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | |
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | if(((EXTRACT_UCHAR(a) == T_ZERO || EXTRACT_UCHAR(a) == T_MIXED) &&
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | !(flags & (A_EXACT|B_EXACT)) &&
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | EXTRACT_UCHAR(b) != T_VOID))
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | {
#if 1
switch(EXTRACT_UCHAR(b))
{
case T_ARRAY:
low_match_types(array_type_string->str,b , flags);
break;
case T_MAPPING:
low_match_types(mapping_type_string->str,b, flags);
break;
case T_FUNCTION:
low_match_types(function_type_string->str,b, flags);
break;
case T_MULTISET:
low_match_types(multiset_type_string->str,b, flags);
break;
}
#endif
return a;
}
|
327c05 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | if((( EXTRACT_UCHAR(b) == T_ZERO || EXTRACT_UCHAR(b) == T_MIXED) &&
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | !(flags & (A_EXACT|B_EXACT)) &&
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | EXTRACT_UCHAR(a) != T_VOID))
{
#if 1
switch(EXTRACT_UCHAR(a))
{
case T_ARRAY:
low_match_types(a , array_type_string->str, flags);
break;
case T_MAPPING:
low_match_types(a , mapping_type_string->str, flags);
break;
case T_FUNCTION:
low_match_types(a , function_type_string->str, flags);
break;
case T_MULTISET:
low_match_types(a , multiset_type_string->str, flags);
break;
}
#endif
return a;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | |
if (EXTRACT_UCHAR(a) == T_ZERO)
a = tInt0;
if (EXTRACT_UCHAR(b) == T_ZERO)
b = tInt0;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | |
switch(EXTRACT_TWOT(a,b))
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case TWOT(T_PROGRAM, T_FUNCTION):
case TWOT(T_FUNCTION, T_PROGRAM):
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | return a;
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | |
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case TWOT(T_OBJECT, T_FUNCTION):
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
if((s=low_object_lfun_type(a, LFUN_CALL)))
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | return low_match_types(s->str,b,flags);
if (flags & B_EXACT) {
return 0;
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | return a;
}
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case TWOT(T_FUNCTION, T_OBJECT):
{
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
if((s=low_object_lfun_type(b, LFUN_CALL)))
|
f37dad | 1999-12-11 | Henrik Grubbström (Grubba) | | return low_match_types(a,s->str,flags);
if (flags & A_EXACT) {
return 0;
}
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | return a;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(a) != EXTRACT_UCHAR(b)) return 0;
ret=a;
switch(EXTRACT_UCHAR(a))
{
case T_FUNCTION:
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | correct_args=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a++;
b++;
while(EXTRACT_UCHAR(a)!=T_MANY || EXTRACT_UCHAR(b)!=T_MANY)
{
char *a_tmp,*b_tmp;
if(EXTRACT_UCHAR(a)==T_MANY)
{
a_tmp=a+1;
}else{
a_tmp=a;
a+=type_length(a);
}
if(EXTRACT_UCHAR(b)==T_MANY)
{
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | b_tmp=b+1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
b_tmp=b;
b+=type_length(b);
}
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!low_match_types(a_tmp, b_tmp,
(flags | NO_MAX_ARGS) & ~(A_EXACT|B_EXACT)))
return 0;
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | if(++correct_args > max_correct_args)
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | if(!(flags & NO_MAX_ARGS))
max_correct_args=correct_args;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
a++;
b++;
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(b)==T_VOID || EXTRACT_UCHAR(a)==T_VOID)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
a+=type_length(a);
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | b+=type_length(b);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!low_match_types(a,b, (flags | NO_MAX_ARGS) & ~(A_EXACT|B_EXACT)))
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | if(!(flags & NO_MAX_ARGS))
max_correct_args=0x7fffffff;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
7eda1d | 1999-11-26 | Henrik Grubbström (Grubba) | | if ((EXTRACT_UCHAR(b) == T_VOID) && (EXTRACT_UCHAR(a) != T_VOID)) {
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if (!low_match_types(a, tZero, flags & ~(A_EXACT|B_EXACT))) return 0;
|
7eda1d | 1999-11-26 | Henrik Grubbström (Grubba) | | } else if ((EXTRACT_UCHAR(a) == T_VOID) && (EXTRACT_UCHAR(b) != T_VOID)) {
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!low_match_types(tZero,b,flags & ~(A_EXACT|B_EXACT))) return 0;
} else if(!low_match_types(a,b,flags & ~(A_EXACT|B_EXACT))) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!low_match_types(++a,++b,flags & ~(A_EXACT|B_EXACT))) return 0;
if(!low_match_types(a+type_length(a),b+type_length(b),
flags & ~(A_EXACT|B_EXACT))) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
|
636e47 | 1998-04-15 | Fredrik Hübinette (Hubbe) | | #if 0
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | if(extract_type_int(a+2) || extract_type_int(b+2))
|
636e47 | 1998-04-15 | Fredrik Hübinette (Hubbe) | | {
fprintf(stderr,"Type match1: ");
stupid_describe_type(a,type_length(a));
fprintf(stderr,"Type match2: ");
stupid_describe_type(b,type_length(b));
}
#endif
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | if(!extract_type_int(a+2) || !extract_type_int(b+2)) break;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
if(EXTRACT_UCHAR(a+1) == EXTRACT_UCHAR(b+1))
{
if(EXTRACT_UCHAR(a+1))
{
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | if(extract_type_int(a+2) != extract_type_int(b+2)) return 0;
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }else{
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | |
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | break;
}
}
{
struct program *ap,*bp;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | ap=id_to_program(extract_type_int(a+2));
bp=id_to_program(extract_type_int(b+2));
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | |
if(!ap || !bp) break;
|
636e47 | 1998-04-15 | Fredrik Hübinette (Hubbe) | |
|
0cbc27 | 1999-12-14 | Fredrik Hübinette (Hubbe) | | #if 0
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | |
if (!implements(ap,bp) && !implements(bp,ap))
return 0;
#else /* !1 */
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(a+1))
{
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | if(!implements(implements_a=ap,implements_b=bp))
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | return 0;
}else{
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | if(!implements(implements_a=bp,implements_b=ap))
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | #endif /* 1 */
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | break;
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | case T_INT:
{
INT32 amin=extract_type_int(a+1);
INT32 amax=extract_type_int(a+1+sizeof(INT32));
INT32 bmin=extract_type_int(b+1);
INT32 bmax=extract_type_int(b+1+sizeof(INT32));
if(amin > bmax || bmin > amax) return 0;
break;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | if(!low_match_types(++a,++b,flags & ~(A_EXACT|B_EXACT))) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_FLOAT:
case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
case T_VOID:
case T_MIXED:
break;
default:
fatal("error in type string.\n");
}
return ret;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | |
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | #define LE_WEAK_OBJECTS 1 /* Perform weaker checking of objects. */
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | |
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | |
dfda7e | 1999-11-25 | Henrik Grubbström (Grubba) | | *
* Note that non-destructive operations are assumed.
* ie it's assumed that calling a function(mapping(string|int:string|int):void)
* with a mapping(int:int) won't change the type of the mapping after the
* operation.
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | */
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | static int low_pike_types_le(char *a, char *b,
int array_cnt, unsigned int flags)
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | #ifdef PIKE_TYPE_DEBUG
{
int e;
char *s;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | static int low_pike_types_le2(char *a, char *b,
int array_cnt, unsigned int flags);
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | int res;
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | char buf[50];
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | |
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | init_buf();
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | for(e=0;e<indent;e++) my_strcat(" ");
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | my_strcat("low_pike_types_le(");
low_describe_type(a);
if(type_length(a) + type_length(b) > 10)
{
my_strcat(",\n");
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat(" ");
low_describe_type(b);
}else{
my_strcat(", ");
low_describe_type(b);
}
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if(type_length(a) + type_length(b) > 10)
{
my_strcat(",\n");
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat(" ");
}else{
my_strcat(", ");
}
sprintf(buf, "%d", array_cnt);
my_strcat(buf);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | my_strcat(", ");
sprintf(buf, "0x%08x", flags);
my_strcat(buf);
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | my_strcat(");\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
indent++;
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | }
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | res=low_pike_types_le2(a, b, array_cnt, flags);
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | |
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | indent--;
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | |
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | for(e=0;e<indent;e++) fprintf(stderr, " ");
fprintf(stderr, "= %d\n", res);
}
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | return res;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | static int low_pike_types_le2(char *a, char *b,
int array_cnt, unsigned int flags)
|
ae1818 | 1999-11-25 | Henrik Grubbström (Grubba) | | #endif /* PIKE_TYPE_DEBUG */
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | {
int ret;
if(a == b) return 1;
switch(EXTRACT_UCHAR(a))
{
case T_AND:
a++;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret = low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(ret) return ret;
a += type_length(a);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_OR:
a++;
|
144ce3 | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(a) == T_VOID) {
a += type_length(a);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
144ce3 | 1999-12-19 | Henrik Grubbström (Grubba) | | } else {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret=low_pike_types_le(a, b, array_cnt, flags);
|
144ce3 | 1999-12-19 | Henrik Grubbström (Grubba) | | if (!ret) return 0;
a+=type_length(a);
if (EXTRACT_UCHAR(a) == T_VOID) {
return 1;
} else {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
144ce3 | 1999-12-19 | Henrik Grubbström (Grubba) | | }
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_NOT:
|
72a1e9 | 1999-12-19 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(b) == T_NOT) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(b+1, a+1, -array_cnt, flags);
|
72a1e9 | 1999-12-19 | Henrik Grubbström (Grubba) | | }
|
69a943 | 1999-12-21 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(a+1) == T_NOT) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a+2, b, array_cnt, flags);
|
69a943 | 1999-12-21 | Henrik Grubbström (Grubba) | | }
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if (low_pike_types_le(a+1, b, array_cnt, flags)) {
|
72a1e9 | 1999-12-19 | Henrik Grubbström (Grubba) | | return 0;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return !low_pike_types_le(b, a+1, -array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_ASSIGN:
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret=low_pike_types_le(a+2, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(ret && EXTRACT_UCHAR(b)!=T_VOID)
{
int m=EXTRACT_UCHAR(a+1)-'0';
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | int i;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | type_stack_mark();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_unfinished_type_with_markers(b, b_markers);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | for(i=array_cnt; i > 0; i--)
push_type(T_ARRAY);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | tmp=pop_unfinished_type();
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | |
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(a_markers[m], tmp, 0);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(a_markers[m]) free_string(a_markers[m]);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | free_string(tmp);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | a_markers[m]=pop_unfinished_type();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_TYPE_DEBUG
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | char *s;
int e;
init_buf();
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat("a_markers[");
|
f25837 | 2000-09-08 | Henrik Grubbström (Grubba) | | my_putchar((char)(m+'0'));
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | my_strcat("]=");
low_describe_type(a_markers[m]->str);
my_strcat("\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
}
#endif
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
return ret;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
int m=EXTRACT_UCHAR(a)-'0';
if(a_markers[m])
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a_markers[m]->str, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | else
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(mixed_type_string->str, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
}
switch(EXTRACT_UCHAR(b))
{
case T_AND:
b++;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret = low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(!ret) return 0;
b+=type_length(b);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_OR:
b++;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret=low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if (ret) return ret;
b+=type_length(b);
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_NOT:
|
69a943 | 1999-12-21 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(b+1) == T_NOT) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b+2, array_cnt, flags);
|
69a943 | 1999-12-21 | Henrik Grubbström (Grubba) | | }
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if (low_pike_types_le(a, b+1, array_cnt, flags)) {
|
72a1e9 | 1999-12-19 | Henrik Grubbström (Grubba) | | return 0;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return !low_pike_types_le(b+1, a, -array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_ASSIGN:
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | ret=low_pike_types_le(a, b+2, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(ret && EXTRACT_UCHAR(a)!=T_VOID)
{
int m=EXTRACT_UCHAR(b+1)-'0';
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | int i;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | type_stack_mark();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | push_unfinished_type_with_markers(a, a_markers);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | for(i = array_cnt; i < 0; i++)
push_type(T_ARRAY);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | tmp=pop_unfinished_type();
type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(b_markers[m], tmp, 0);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | if(b_markers[m]) free_string(b_markers[m]);
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | free_string(tmp);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | b_markers[m]=pop_unfinished_type();
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_TYPE_DEBUG
|
6f2835 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if (l_flag>2) {
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | char *s;
int e;
init_buf();
for(e=0;e<indent;e++) my_strcat(" ");
my_strcat("b_markers[");
|
f25837 | 2000-09-08 | Henrik Grubbström (Grubba) | | my_putchar((char)(m+'0'));
|
02f063 | 1999-11-24 | Fredrik Hübinette (Hubbe) | | my_strcat("]=");
low_describe_type(b_markers[m]->str);
my_strcat("\n");
fprintf(stderr,"%s",(s=simple_free_buf()));
free(s);
}
#endif
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
return ret;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
int m=EXTRACT_UCHAR(b)-'0';
if(b_markers[m])
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b_markers[m]->str, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | else
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, mixed_type_string->str, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if ((array_cnt < 0) && (EXTRACT_UCHAR(b) == T_ARRAY)) {
while (EXTRACT_UCHAR(b) == T_ARRAY) {
b++;
if (!++array_cnt) break;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | } else if ((array_cnt > 0) && (EXTRACT_UCHAR(a) == T_ARRAY)) {
while (EXTRACT_UCHAR(a) == T_ARRAY) {
a++;
if (!--array_cnt) break;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | }
|
8043d5 | 1999-12-17 | Henrik Grubbström (Grubba) | |
if (EXTRACT_UCHAR(a) == T_VOID) {
if (array_cnt >= 0) {
if (!array_cnt && (EXTRACT_UCHAR(b) == T_VOID)) {
return 1;
}
return 0;
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
|
8043d5 | 1999-12-17 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(b) == T_VOID) {
if (array_cnt <= 0) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | return 0;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
|
8043d5 | 1999-12-17 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(b) == T_MIXED) {
if (array_cnt <= 0) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | return 1;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
|
8043d5 | 1999-12-17 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(a) == T_MIXED) {
if (array_cnt >= 0) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | return 0;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
if (EXTRACT_UCHAR(a) == T_ZERO) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if (array_cnt >= 0) {
return 1;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
if (EXTRACT_UCHAR(b) == T_ZERO) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if (array_cnt <= 0) {
return 0;
}
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
switch(EXTRACT_TWOT(a,b))
{
case TWOT(T_PROGRAM, T_FUNCTION):
case TWOT(T_FUNCTION, T_PROGRAM):
return 1;
case TWOT(T_OBJECT, T_FUNCTION):
{
struct pike_string *s;
if((s=low_object_lfun_type(a, LFUN_CALL)))
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(s->str, b, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | return 1;
}
case TWOT(T_FUNCTION, T_OBJECT):
{
struct pike_string *s;
if((s=low_object_lfun_type(b, LFUN_CALL)))
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, s->str, array_cnt, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | return 1;
}
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | |
case TWOT(T_FUNCTION, T_ARRAY):
{
while (EXTRACT_UCHAR(b) == T_ARRAY) {
b++;
array_cnt++;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | }
case TWOT(T_ARRAY, T_FUNCTION):
{
while (EXTRACT_UCHAR(a) == T_ARRAY) {
a++;
array_cnt--;
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a, b, array_cnt, flags);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
if(EXTRACT_UCHAR(a) != EXTRACT_UCHAR(b)) return 0;
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(a) == T_FUNCTION) {
|
dfda7e | 1999-11-25 | Henrik Grubbström (Grubba) | |
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | |
7eda1d | 1999-11-26 | Henrik Grubbström (Grubba) | | * function(:int) <= function(:void)
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | * function(string:int) != function(int:int)
* function(int:int) != function(:int)
|
8043d5 | 1999-12-17 | Henrik Grubbström (Grubba) | | *
* FIXME: Enforcing of all required arguments?
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | */
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | a++;
b++;
while(EXTRACT_UCHAR(a)!=T_MANY || EXTRACT_UCHAR(b)!=T_MANY)
{
char *a_tmp,*b_tmp;
if(EXTRACT_UCHAR(a)==T_MANY)
{
a_tmp=a+1;
}else{
a_tmp=a;
a+=type_length(a);
}
if(EXTRACT_UCHAR(b)==T_MANY)
{
b_tmp=b+1;
}else{
b_tmp=b;
b+=type_length(b);
}
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(a_tmp) != T_VOID) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if (!low_pike_types_le(b_tmp, a_tmp, 0, flags)) {
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | return 0;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | }
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
a++;
b++;
|
69a943 | 1999-12-21 | Henrik Grubbström (Grubba) | | if ((EXTRACT_UCHAR(a) != T_VOID) && (EXTRACT_UCHAR(b) != T_VOID)) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if (!low_pike_types_le(b, a, 0, flags)) {
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | return 0;
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | }
|
3d1293 | 1999-11-25 | Henrik Grubbström (Grubba) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
a+=type_length(a);
b+=type_length(b);
|
95a83d | 1999-12-26 | Henrik Grubbström (Grubba) | |
if ((EXTRACT_UCHAR(b) != T_VOID) && (EXTRACT_UCHAR(a) != T_VOID)) {
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if(!low_pike_types_le(a, b, array_cnt, flags)) return 0;
|
438d42 | 1999-11-26 | Henrik Grubbström (Grubba) | | }
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | return 1;
}
if (array_cnt) return 0;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | switch(EXTRACT_UCHAR(a))
{
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_MAPPING:
|
3ac0d1 | 1999-12-12 | Martin Stjernholm | | * mapping(A:B) <= mapping(C:D) iff A <= C && B <= D.
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | */
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if(!low_pike_types_le(++a, ++b, 0, flags)) return 0;
return low_pike_types_le(a+type_length(a), b+type_length(b), 0, flags);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_OBJECT:
#if 0
if(extract_type_int(a+2) || extract_type_int(b+2))
{
fprintf(stderr,"Type match1: ");
stupid_describe_type(a,type_length(a));
fprintf(stderr,"Type match2: ");
stupid_describe_type(b,type_length(b));
}
#endif
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | |
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | * object(1 x) <= object(1 y) iff x == y
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | * object(1 x) <= object(0 y) iff x implements y
* Not WEAK_OBJECTS:
* object(0 x) <= object(0 y) iff x implements y
* WEAK_OBJECTS:
* object(0 x) <= object(0 y) iff x is_compatible y
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | */
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
if(!extract_type_int(b+2))
return 1;
if(!extract_type_int(a+2))
return 0;
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if ((EXTRACT_UCHAR(a+1) || !EXTRACT_UCHAR(b+1)) &&
(extract_type_int(a+2) == extract_type_int(b+2)))
return 1;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (EXTRACT_UCHAR(b+1)) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | return 0;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
{
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | struct program *ap = id_to_program(extract_type_int(a+2));
struct program *bp = id_to_program(extract_type_int(b+2));
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | if (!ap || !bp) {
return 0;
}
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | if ((flags & LE_WEAK_OBJECTS) && (!EXTRACT_UCHAR(a+1))) {
return is_compatible(implements_a=ap, implements_b=bp);
}
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | return implements(implements_a=ap, implements_b=bp);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
break;
case T_INT:
{
INT32 amin=extract_type_int(a+1);
INT32 amax=extract_type_int(a+1+sizeof(INT32));
INT32 bmin=extract_type_int(b+1);
INT32 bmax=extract_type_int(b+1+sizeof(INT32));
if(amin < bmin || amax > bmax) return 0;
break;
}
case T_MULTISET:
case T_ARRAY:
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if(!low_pike_types_le(++a, ++b, 0, flags)) return 0;
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | |
case T_FLOAT:
case T_STRING:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_PROGRAM:
case T_ZERO:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_VOID:
case T_MIXED:
break;
default:
fatal("error in type string.\n");
}
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | return 1;
}
int strict_check_call(char *fun_type, char *arg_type)
{
while ((EXTRACT_UCHAR(fun_type) == T_OR) ||
(EXTRACT_UCHAR(fun_type) == T_ARRAY)) {
if (EXTRACT_UCHAR(fun_type++) == T_OR) {
int res = strict_check_call(fun_type, arg_type);
if (res) return res;
fun_type += type_length(fun_type);
}
}
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(fun_type, arg_type, 0, 0);
}
int check_soft_cast(struct pike_string *to, struct pike_string *from)
{
|
8fea16 | 1999-12-31 | Henrik Grubbström (Grubba) | | return low_pike_types_le(to->str, from->str, 0, LE_WEAK_OBJECTS);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
static int low_get_return_type(char *a,char *b)
{
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | int tmp;
switch(EXTRACT_UCHAR(a))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_OR:
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *o1,*o2;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | a++;
o1=o2=0;
type_stack_mark();
if(low_get_return_type(a,b))
{
o1=pop_unfinished_type();
type_stack_mark();
}
if(low_get_return_type(a+type_length(a),b))
o2=pop_unfinished_type();
else
pop_stack_mark();
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | if(!o1 && !o2) return 0;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(o1,o2, 0);
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
if(o1) free_string(o1);
if(o2) free_string(o2);
return 1;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | tmp=low_get_return_type(a,b);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | type_stack_pop_to_mark();
if(!tmp) return 0;
return low_get_return_type(a+type_length(a),b);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | a++;
tmp=low_get_return_type(a,b);
if(!tmp) return 0;
push_type(T_ARRAY);
return 1;
}
|
5ac766 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | a=low_match_types(a,b,NO_SHORTCUTS);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(a)
{
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | #if 0
if ((lex.pragmas & ID_STRICT_TYPES) &&
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | !low_pike_types_le(a, b, 0, 0)) {
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | yywarning("Type mismatch");
}
#endif /* 0 */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(a))
{
case T_FUNCTION:
a++;
while(EXTRACT_UCHAR(a)!=T_MANY) a+=type_length(a);
a++;
a+=type_length(a);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | push_unfinished_type_with_markers(a, a_markers );
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return 1;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
push_type_int(0);
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | push_type(0);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | push_type(T_OBJECT);
return 1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
push_type(T_MIXED);
return 1;
}
}
return 0;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int match_types(struct pike_string *a,struct pike_string *b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(a);
check_type_string(b);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | clear_markers();
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return 0!=low_match_types(a->str, b->str,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | int pike_types_le(struct pike_string *a,struct pike_string *b)
{
check_type_string(a);
check_type_string(b);
clear_markers();
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | return low_pike_types_le(a->str, b->str, 0, 0);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | }
|
2a5096 | 1995-08-23 | Fredrik Hübinette (Hubbe) | |
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG_MALLOC
|
fe6bb6 | 2000-03-26 | Henrik Grubbström (Grubba) | | #define low_index_type(X,Y,Z) ((struct pike_string *)debug_malloc_pass(debug_low_index_type((X),(Y),(Z))))
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | #else
#define low_index_type debug_low_index_type
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | static struct pike_string *debug_low_index_type(char *t,
char *index_type,
node *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | struct program *p;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | |
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | switch(low_check_indexing(t, index_type, n))
{
case 0: return 0;
case -1:
reference_shared_string(zero_type_string);
return zero_type_string;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(t++))
{
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
{
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | p=id_to_program(extract_type_int(t+1));
comefrom_int_index:
|
dcab7e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | if(p && n)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | INT32 i;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | if(n->token == F_ARROW)
{
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | |
|
bc6852 | 1999-12-18 | Martin Stjernholm | | if((i=FIND_LFUN(p,LFUN_ARROW))!=-1)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | |
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | if(i!=-1 &&
(tmp=check_call(function_type_string, ID_FROM_INT(p, i)->type,
0)))
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return tmp;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | reference_shared_string(mixed_type_string);
return mixed_type_string;
}
}else{
|
bc6852 | 1999-12-18 | Martin Stjernholm | | if((i=FIND_LFUN(p,LFUN_INDEX)) != -1)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | {
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | |
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | if(i!=-1 &&
(tmp=check_call(function_type_string, ID_FROM_INT(p, i)->type,
0)))
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return tmp;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | reference_shared_string(mixed_type_string);
return mixed_type_string;
}
}
if(CDR(n)->token == F_CONSTANT && CDR(n)->u.sval.type==T_STRING)
{
i=find_shared_string_identifier(CDR(n)->u.sval.u.string, p);
if(i==-1)
{
|
b8c29a | 1998-08-19 | Fredrik Hübinette (Hubbe) | | reference_shared_string(mixed_type_string);
return mixed_type_string;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | }else{
|
da52b7 | 1999-11-23 | Fredrik Hübinette (Hubbe) | | #if 0
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t) ||
(p->identifier_references[i].id_flags & ID_NOMASK) ||
(ID_FROM_INT(p, i)->identifier_flags & IDENTIFIER_PROTOTYPED))
{
|
da52b7 | 1999-11-23 | Fredrik Hübinette (Hubbe) | | #endif
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | reference_shared_string(ID_FROM_INT(p, i)->type);
return ID_FROM_INT(p, i)->type;
|
da52b7 | 1999-11-23 | Fredrik Hübinette (Hubbe) | | #if 0
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | }else{
reference_shared_string(mixed_type_string);
return mixed_type_string;
}
|
da52b7 | 1999-11-23 | Fredrik Hübinette (Hubbe) | | #endif
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | }
}
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
reference_shared_string(mixed_type_string);
return mixed_type_string;
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_MIXED:
if (lex.pragmas & ID_STRICT_TYPES) {
yywarning("Indexing mixed.");
}
reference_shared_string(mixed_type_string);
return mixed_type_string;
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | case T_INT:
#ifdef AUTO_BIGNUM
p=get_auto_bignum_program_or_zero();
goto comefrom_int_index;
#endif
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
fb2f66 | 1998-11-05 | Fredrik Hübinette (Hubbe) | | case T_VOID:
case T_FLOAT:
return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_OR:
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *a,*b;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | a=low_index_type(t,index_type,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t+=type_length(t);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | b=low_index_type(t,index_type,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!b) return a;
if(!a) return b;
|
a946c7 | 1998-03-02 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(a,b,1);
|
3c0c28 | 1998-01-26 | Fredrik Hübinette (Hubbe) | | free_string(a);
free_string(b);
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return low_index_type(t+type_length(t),index_type,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_STRING:
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | reference_shared_string(int_type_string);
return int_type_string;
case T_MAPPING:
t+=type_length(t);
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | return make_shared_binary_string(t, type_length(t));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_ARRAY:
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | {
|
04da27 | 2000-03-10 | Henrik Grubbström (Grubba) | | struct pike_string *a;
if(low_pike_types_le(tString, index_type, 0, 0) &&
(a = low_index_type(t, tString, n))) {
|
fc4213 | 2000-03-10 | Henrik Grubbström (Grubba) | | type_stack_mark();
push_finished_type(a);
free_string(a);
push_type(T_ARRAY);
|
04da27 | 2000-03-10 | Henrik Grubbström (Grubba) | | if (low_match_types(tInt, index_type, 0)) {
push_unfinished_type(t);
push_type(T_OR);
}
|
fc4213 | 2000-03-10 | Henrik Grubbström (Grubba) | | return pop_unfinished_type();
|
04da27 | 2000-03-10 | Henrik Grubbström (Grubba) | | }
if (low_match_types(tInt, index_type, 0)) {
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | return make_shared_binary_string(t, type_length(t));
}
|
04da27 | 2000-03-10 | Henrik Grubbström (Grubba) | |
return 0;
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | struct pike_string *index_type(struct pike_string *type,
struct pike_string *index_type,
node *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *t;
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | clear_markers();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | t=low_index_type(type->str,index_type->str,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!t) copy_shared_string(t,mixed_type_string);
return t;
}
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | |
|
144ce3 | 1999-12-19 | Henrik Grubbström (Grubba) | | static struct pike_string *low_array_value_type(char *arr_t)
{
struct pike_string *res = NULL;
struct pike_string *sub_t;
while (EXTRACT_UCHAR(arr_t) == T_OR) {
arr_t++;
sub_t = low_array_value_type(arr_t);
arr_t += type_length(arr_t);
if (sub_t) {
if (res) {
struct pike_string *new = or_pike_types(res, sub_t, 1);
free_string(res);
free_string(sub_t);
res = new;
} else {
res = sub_t;
}
}
}
if (EXTRACT_UCHAR(arr_t) != T_ARRAY)
return res;
arr_t++;
sub_t = make_shared_binary_string(arr_t, type_length(arr_t));
if (res) {
struct pike_string *new = or_pike_types(res, sub_t, 1);
free_string(res);
free_string(sub_t);
return new;
}
return sub_t;
}
struct pike_string *array_value_type(struct pike_string *array_type)
{
struct pike_string *t = low_array_value_type(array_type->str);
if (!t) copy_shared_string(t, mixed_type_string);
return t;
}
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG_MALLOC
|
fe6bb6 | 2000-03-26 | Henrik Grubbström (Grubba) | | #define low_key_type(X,Y) ((struct pike_string *)debug_malloc_pass(debug_low_key_type((X),(Y))))
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | #else
#define low_key_type debug_low_key_type
#endif
static struct pike_string *debug_low_key_type(char *t, node *n)
{
switch(EXTRACT_UCHAR(t++))
{
case T_OBJECT:
{
struct program *p=id_to_program(extract_type_int(t+1));
if(p && n)
{
if(n->token == F_ARROW)
{
if(FIND_LFUN(p,LFUN_ARROW)!=-1 || FIND_LFUN(p,LFUN_ASSIGN_ARROW)!=-1)
{
reference_shared_string(mixed_type_string);
return mixed_type_string;
}
}else{
if(FIND_LFUN(p,LFUN_INDEX) != -1 || FIND_LFUN(p,LFUN_ASSIGN_INDEX) != -1)
{
reference_shared_string(mixed_type_string);
return mixed_type_string;
}
}
}
reference_shared_string(string_type_string);
return string_type_string;
}
default:
reference_shared_string(mixed_type_string);
return mixed_type_string;
case T_VOID:
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO:
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE:
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | case T_FLOAT:
case T_INT:
return 0;
case T_OR:
{
struct pike_string *a,*b;
a=low_key_type(t,n);
t+=type_length(t);
b=low_key_type(t,n);
if(!b) return a;
if(!a) return b;
type_stack_mark();
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | medium_or_pike_types(a,b,1);
|
1a3e1b | 1999-04-13 | Fredrik Hübinette (Hubbe) | | free_string(a);
free_string(b);
return pop_unfinished_type();
}
case T_AND:
return low_key_type(t+type_length(t),n);
case T_ARRAY:
case T_STRING:
reference_shared_string(int_type_string);
return int_type_string;
case T_MAPPING:
case T_MULTISET:
return make_shared_binary_string(t, type_length(t));
}
}
struct pike_string *key_type(struct pike_string *type, node *n)
{
struct pike_string *t;
clear_markers();
t=low_key_type(type->str,n);
if(!t) copy_shared_string(t,mixed_type_string);
return t;
}
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | static int low_check_indexing(char *type, char *index_type, node *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
switch(EXTRACT_UCHAR(type++))
{
case T_OR:
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return low_check_indexing(type,index_type,n) ||
low_check_indexing(type+type_length(type),index_type,n);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
case T_AND:
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return low_check_indexing(type,index_type,n) &&
low_check_indexing(type+type_length(type),index_type,n);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
case T_NOT:
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return low_check_indexing(type,index_type,n)!=1;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
de2a58 | 1997-09-28 | Fredrik Hübinette (Hubbe) | | if(low_match_types(string_type_string->str, index_type,0) &&
low_check_indexing(type, index_type,n))
return 1;
case T_STRING:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return !!low_match_types(int_type_string->str, index_type,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_OBJECT:
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | {
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | struct program *p=id_to_program(extract_type_int(type+1));
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | if(p)
{
if(n->token == F_ARROW)
{
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | if(FIND_LFUN(p,LFUN_ARROW)!=-1 || FIND_LFUN(p,LFUN_ASSIGN_ARROW)!=-1)
return 1;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | }else{
|
6bc928 | 1998-04-10 | Fredrik Hübinette (Hubbe) | | if(FIND_LFUN(p,LFUN_INDEX)!=-1 || FIND_LFUN(p,LFUN_ASSIGN_INDEX)!=-1)
return 1;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | }
return !!low_match_types(string_type_string->str, index_type,0);
}else{
return 1;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_MAPPING:
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return low_match_types(type,index_type,0) ? 1 : -1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | #ifdef AUTO_BIGNUM
case T_INT:
#endif
case T_PROGRAM:
return !!low_match_types(string_type_string->str, index_type,0);
|
43f12e | 1998-09-29 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_MIXED:
return 1;
default:
return 0;
}
}
|
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)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(type);
check_type_string(index_type);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | |
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return low_check_indexing(type->str, index_type->str, n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | static int low_count_arguments(char *q)
{
int num,num2;
|
d429a7 | 1998-02-24 | Fredrik Hübinette (Hubbe) | |
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(q++))
{
case T_OR:
num=low_count_arguments(q);
num2=low_count_arguments(q+type_length(q));
if(num<0 && num2>0) return num;
if(num2<0 && num>0) return num2;
if(num2<0 && num<0) return ~num>~num2?num:num2;
return num>num2?num:num2;
case T_AND:
num=low_count_arguments(q);
num2=low_count_arguments(q+type_length(q));
if(num<0 && num2>0) return num2;
if(num2<0 && num>0) return num;
if(num2<0 && num<0) return ~num<~num2?num:num2;
return num<num2?num:num2;
|
d429a7 | 1998-02-24 | Fredrik Hübinette (Hubbe) | | default: return 0x7fffffff;
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | |
case T_FUNCTION:
num=0;
while(EXTRACT_UCHAR(q)!=T_MANY)
{
num++;
q+=type_length(q);
}
q++;
if(EXTRACT_UCHAR(q)!=T_VOID) return ~num;
return num;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int count_arguments(struct pike_string *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(s);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | |
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | return low_count_arguments(s->str);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
3aa783 | 1999-06-02 | Fredrik Hübinette (Hubbe) | |
static int low_minimum_arguments(char *q)
{
int num;
switch(EXTRACT_UCHAR(q++))
{
case T_OR:
case T_AND:
return MAXIMUM(low_count_arguments(q),
low_count_arguments(q+type_length(q)));
default: return 0;
case T_FUNCTION:
num=0;
while(EXTRACT_UCHAR(q)!=T_MANY)
{
if(low_match_types(void_type_string->str, q, B_EXACT))
return num;
num++;
q+=type_length(q);
}
return num;
}
}
int minimum_arguments(struct pike_string *s)
{
int ret;
check_type_string(s);
ret=low_minimum_arguments(s->str);
#if 0
fprintf(stderr,"minimum_arguments(");
simple_describe_type(s);
fprintf(stderr," ) -> %d\n",ret);
#endif
return ret;
}
|
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)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(args);
check_type_string(type);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | clear_markers();
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | max_correct_args=0;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(low_get_return_type(type->str,args->str))
{
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | if (strict) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | if (!strict_check_call(type->str, args->str)) {
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | struct pike_string *type_t = describe_type(type);
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | |
|
52169d | 1999-12-21 | Henrik Grubbström (Grubba) | | if (!low_pike_types_le(type->str, tFuncV(tNone,tZero,tMix), 0, 0)) {
|
613459 | 1999-12-15 | Henrik Grubbström (Grubba) | | yywarning("Calling non-function value.");
yywarning("Type called: %s", type_t->str);
} else {
struct pike_string *arg_t = describe_type(args);
yywarning("Arguments not strictly compatible.");
yywarning("Expected: %s", type_t->str);
yywarning("Got : %s", arg_t->str);
free_string(arg_t);
}
|
fbafd0 | 1999-12-12 | Henrik Grubbström (Grubba) | | free_string(type_t);
}
}
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | pop_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return 0;
}
}
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | INT32 get_max_args(struct pike_string *type)
{
INT32 ret,tmp=max_correct_args;
|
45ee5d | 1999-02-10 | Fredrik Hübinette (Hubbe) | | check_type_string(type);
|
9e5238 | 1998-03-01 | Fredrik Hübinette (Hubbe) | | clear_markers();
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | type = check_call(function_type_string, type, 0);
|
5b4dd3 | 1998-02-23 | Fredrik Hübinette (Hubbe) | | if(type) free_string(type);
ret=max_correct_args;
max_correct_args=tmp;
return tmp;
}
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
struct pike_string *zzap_function_return(char *a, INT32 id)
{
switch(EXTRACT_UCHAR(a))
{
case T_OR:
{
struct pike_string *ar, *br, *ret=0;
a++;
ar=zzap_function_return(a,id);
br=zzap_function_return(a+type_length(a),id);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | if(ar && br) ret=or_pike_types(ar,br,0);
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | if(ar) free_string(ar);
if(br) free_string(br);
return ret;
}
case T_FUNCTION:
type_stack_mark();
push_type_int(id);
push_type(1);
push_type(T_OBJECT);
type_stack_mark();
a++;
while(EXTRACT_UCHAR(a)!=T_MANY)
{
type_stack_mark();
push_unfinished_type(a);
type_stack_reverse();
a+=type_length(a);
}
a++;
push_type(T_MANY);
type_stack_mark();
push_unfinished_type(a);
type_stack_reverse();
type_stack_reverse();
push_type(T_FUNCTION);
return pop_unfinished_type();
|
a0b73f | 2000-01-03 | Martin Stjernholm | |
case T_ARRAY:
return zzap_function_return(a+1,id);
|
300234 | 2000-02-29 | Henrik Grubbström (Grubba) | |
case T_MIXED:
return zzap_function_return(tFuncV(tVoid,tOr(tMix,tVoid),tObj), id);
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | }
|
2d47b9 | 1999-11-27 | Fredrik Hübinette (Hubbe) | | |
6b4a2b | 1999-10-31 | Henrik Grubbström (Grubba) | | fatal("zzap_function_return() called with unexpected value: %d\n",
EXTRACT_UCHAR(a));
|
2d47b9 | 1999-11-27 | Fredrik Hübinette (Hubbe) | | */
|
6b4a2b | 1999-10-31 | Henrik Grubbström (Grubba) | | return NULL;
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *get_type_of_svalue(struct svalue *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(s->type)
{
case T_FUNCTION:
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | if(s->subtype == FUNCTION_BUILTIN)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
ret=s->u.efun->type;
}else{
struct program *p;
p=s->u.object->prog;
if(!p)
{
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | ret=zero_type_string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
ret=ID_FROM_INT(p,s->subtype)->type;
}
}
reference_shared_string(ret);
return ret;
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | case T_MULTISET:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | {
struct pike_string *arg_type;
struct array *a;
if (s->type == T_MULTISET) {
a = s->u.multiset->ind;
} else {
a = s->u.array;
}
|
502d85 | 1999-12-30 | Martin Stjernholm | | #if 0
int i;
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | |
copy_shared_string(arg_type, zero_type_string);
for (i = 0; i < a->size; i++) {
struct pike_string *tmp1 = get_type_of_svalue(a->item+i);
struct pike_string *tmp2 = or_pike_types(arg_type, tmp1, 1);
free_string(arg_type);
free_string(tmp1);
arg_type = tmp2;
}
#else /* !0 */
|
502d85 | 1999-12-30 | Martin Stjernholm | | if (a->size)
copy_shared_string(arg_type, mixed_type_string);
else
copy_shared_string(arg_type, zero_type_string);
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | #endif /* 0 */
type_stack_mark();
push_unfinished_type(arg_type->str);
free_string(arg_type);
push_type(s->type);
return pop_unfinished_type();
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_MAPPING:
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
57a4ab | 2000-01-27 | Fredrik Hübinette (Hubbe) | | if (m_sizeof(s->u.mapping)) {
|
502d85 | 1999-12-30 | Martin Stjernholm | | push_type(T_MIXED);
push_type(T_MIXED);
}
else {
push_type(T_ZERO);
push_type(T_ZERO);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(T_MAPPING);
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
041a73 | 1996-11-12 | Mirar (Pontus Hagland) | | case T_OBJECT:
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
if(s->u.object->prog)
{
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | #ifdef AUTO_BIGNUM
if(is_bignum_object(s->u.object))
{
push_type_int(MAX_INT32);
push_type_int(MIN_INT32);
push_type(T_INT);
}
else
#endif
{
push_type_int(s->u.object->prog->id);
push_type(1);
push_type(T_OBJECT);
}
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }else{
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | |
push_type(T_ZERO);
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | }
return pop_unfinished_type();
|
041a73 | 1996-11-12 | Mirar (Pontus Hagland) | |
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | case T_INT:
if(s->u.integer)
{
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | push_type_int(s->u.integer);
push_type_int(s->u.integer);
push_type(T_INT);
return pop_unfinished_type();
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | }else{
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | ret=zero_type_string;
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | }
reference_shared_string(ret);
return ret;
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
{
char *a;
|
b2d75f | 1999-10-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *tmp;
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | int id;
|
da77e2 | 2000-09-08 | Fredrik Hübinette (Hubbe) | | if(s->u.program->identifiers)
|
993ba7 | 2000-02-15 | Fredrik Hübinette (Hubbe) | | {
|
da77e2 | 2000-09-08 | Fredrik Hübinette (Hubbe) | | id=FIND_LFUN(s->u.program,LFUN_CREATE);
if(id>=0)
{
a=ID_FROM_INT(s->u.program, id)->type->str;
if((tmp=zzap_function_return(a, s->u.program->id)))
return tmp;
tmp=describe_type(ID_FROM_INT(s->u.program, id)->type);
free_string(tmp);
}
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | }
|
2d47b9 | 1999-11-27 | Fredrik Hübinette (Hubbe) | |
|
da77e2 | 2000-09-08 | Fredrik Hübinette (Hubbe) | | a=tFunc( tNone ,tObj);
|
2d47b9 | 1999-11-27 | Fredrik Hübinette (Hubbe) | | if((tmp=zzap_function_return(a, s->u.program->id)))
return tmp;
fatal("Completely failed to zzap function return!\n");
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(s->type);
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
6334d2 | 1999-12-22 | Henrik Grubbström (Grubba) | | static struct pike_string *low_object_type_to_program_type(char *obj_t)
{
struct pike_string *res = NULL;
struct pike_string *sub;
struct svalue sval;
int id;
while(EXTRACT_UCHAR(obj_t) == T_OR) {
obj_t++;
sub = low_object_type_to_program_type(obj_t);
if (!sub) {
if (res) {
free_string(res);
}
return NULL;
}
if (res) {
struct pike_string *tmp = or_pike_types(res, sub, 1);
free_string(res);
free_string(sub);
res = tmp;
} else {
res = sub;
}
obj_t += type_length(obj_t);
}
sval.type = T_PROGRAM;
if ((EXTRACT_UCHAR(obj_t) != T_OBJECT) ||
(!(id = extract_type_int(obj_t + 2))) ||
(!(sval.u.program = id_to_program(id))) ||
(!(sub = get_type_of_svalue(&sval)))) {
if (res) {
free_string(res);
}
return NULL;
}
|
0b5792 | 2000-03-23 | Henrik Grubbström (Grubba) | |
|
6334d2 | 1999-12-22 | Henrik Grubbström (Grubba) | | if (res) {
struct pike_string *tmp = or_pike_types(res, sub, 1);
free_string(res);
free_string(sub);
return tmp;
}
return sub;
}
struct pike_string *object_type_to_program_type(struct pike_string *obj_t)
{
return low_object_type_to_program_type(obj_t->str);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | char *get_name_of_type(int t)
{
switch(t)
{
case T_ARRAY: return "array";
|
45c897 | 1997-01-03 | Fredrik Hübinette (Hubbe) | | case T_FLOAT: return "float";
case T_FUNCTION: return "function";
case T_INT: return "int";
case T_LVALUE: return "lvalue";
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_MAPPING: return "mapping";
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET: return "multiset";
|
45c897 | 1997-01-03 | Fredrik Hübinette (Hubbe) | | case T_OBJECT: return "object";
case T_PROGRAM: return "program";
case T_STRING: return "string";
|
fc0ad4 | 1999-12-11 | Henrik Grubbström (Grubba) | | case T_TYPE: return "type";
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | case T_ZERO: return "zero";
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | case T_VOID: return "void";
|
e080e7 | 2000-09-04 | Martin Stjernholm | | case T_MAPPING_DATA: return "mapping_data";
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default: return "unknown";
}
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void cleanup_pike_types(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
free_string(string_type_string);
free_string(int_type_string);
free_string(float_type_string);
free_string(function_type_string);
free_string(object_type_string);
free_string(program_type_string);
free_string(array_type_string);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | free_string(multiset_type_string);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_string(mapping_type_string);
|
bb8d1d | 1999-12-15 | Henrik Grubbström (Grubba) | | free_string(type_type_string);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | free_string(mixed_type_string);
free_string(void_type_string);
|
93dd41 | 1999-11-23 | Henrik Grubbström (Grubba) | | free_string(zero_type_string);
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | free_string(any_type_string);
|
e5e0d9 | 1999-12-13 | Henrik Grubbström (Grubba) | | free_string(weak_type_string);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
b47790 | 1998-06-05 | Fredrik Hübinette (Hubbe) | |
int type_may_overload(char *type, int lfun)
{
switch(EXTRACT_UCHAR(type++))
{
case T_ASSIGN:
return type_may_overload(type+1,lfun);
case T_FUNCTION:
case T_ARRAY:
default:
return 0;
case T_OR:
return type_may_overload(type,lfun) ||
type_may_overload(type+type_length(type),lfun);
case T_AND:
return type_may_overload(type,lfun) &&
type_may_overload(type+type_length(type),lfun);
case T_NOT:
return !type_may_overload(type,lfun);
case T_MIXED:
return 1;
case T_OBJECT:
{
|
b660c8 | 1999-03-01 | Fredrik Hübinette (Hubbe) | | struct program *p=id_to_program(extract_type_int(type+1));
|
b47790 | 1998-06-05 | Fredrik Hübinette (Hubbe) | | if(!p) return 1;
return FIND_LFUN(p, lfun)!=-1;
}
}
}
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | |
void yyexplain_nonmatching_types(struct pike_string *type_a,
|
03318e | 2000-03-16 | Fredrik Hübinette (Hubbe) | | struct pike_string *type_b,
int flags)
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | {
implements_a=0;
implements_b=0;
match_types(type_a,type_b);
|
0b5792 | 2000-03-23 | Henrik Grubbström (Grubba) | | #if 0
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | if(!(implements_a && implements_b &&
type_a->str[0]==T_OBJECT &&
type_b->str[0]==T_OBJECT))
|
0b5792 | 2000-03-23 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *s1,*s2;
s1=describe_type(type_a);
s2=describe_type(type_b);
|
03318e | 2000-03-16 | Fredrik Hübinette (Hubbe) | | if(flags & YYTE_IS_WARNING)
{
yywarning("Expected: %s",s1->str);
yywarning("Got : %s",s2->str);
}else{
my_yyerror("Expected: %s",s1->str);
my_yyerror("Got : %s",s2->str);
}
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | free_string(s1);
free_string(s2);
}
if(implements_a && implements_b)
|
03318e | 2000-03-16 | Fredrik Hübinette (Hubbe) | | yyexplain_not_implements(implements_a,implements_b,flags);
|
20ea77 | 1999-12-15 | Fredrik Hübinette (Hubbe) | | }
|
95a83d | 1999-12-26 | Henrik Grubbström (Grubba) | |
struct pike_string *make_pike_type(char *t)
{
return make_shared_binary_string(t, type_length(t));
}
|