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.
\*/
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
5425bb | 1997-05-30 | Henrik Grubbström (Grubba) | | RCSID("$Id: pike_types.c,v 1.23 1997/05/30 02:40:10 grubba 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"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
5267b7 | 1995-08-09 | 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);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | static int type_length(char *t);
|
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) | | |
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
*/
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *string_type_string;
struct pike_string *int_type_string;
struct pike_string *float_type_string;
struct pike_string *function_type_string;
struct pike_string *object_type_string;
struct pike_string *program_type_string;
struct pike_string *array_type_string;
struct pike_string *multiset_type_string;
struct pike_string *mapping_type_string;
struct pike_string *mixed_type_string;
struct pike_string *void_type_string;
struct pike_string *any_type_string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
static void CHECK_TYPE(struct pike_string *s)
{
if(debug_findstring(s) != s)
fatal("Type string not shared.\n");
if(type_length(s->str) != s->len)
fatal("Length of type is wrong.\n");
}
#else
#define CHECK_TYPE(X)
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void init_types()
{
string_type_string=parse_type("string");
int_type_string=parse_type("int");
object_type_string=parse_type("object");
program_type_string=parse_type("program");
float_type_string=parse_type("float");
mixed_type_string=parse_type("mixed");
array_type_string=parse_type("array");
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | multiset_type_string=parse_type("multiset");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | mapping_type_string=parse_type("mapping");
function_type_string=parse_type("function");
void_type_string=parse_type("void");
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | any_type_string=parse_type("void|mixed");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
static int type_length(char *t)
{
char *q=t;
|
041a73 | 1996-11-12 | Mirar (Pontus Hagland) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(EXTRACT_UCHAR(t++))
{
default:
fatal("error in type string.\n");
case T_FUNCTION:
while(EXTRACT_UCHAR(t)!=T_MANY) t+=type_length(t);
t++;
case T_MAPPING:
case T_OR:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t+=type_length(t);
case T_ARRAY:
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_NOT:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t+=type_length(t);
case T_INT:
case T_FLOAT:
case T_STRING:
case T_PROGRAM:
case T_MIXED:
case T_VOID:
case T_UNKNOWN:
break;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
case T_OBJECT:
t+=sizeof(INT32);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
return t-q;
}
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
#define STACK_SIZE 100000
static unsigned char type_stack[STACK_SIZE];
static unsigned char *type_stackp=type_stack;
static unsigned char *mark_stack[STACK_SIZE/4];
static unsigned char **mark_stackp=mark_stack;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | void push_type(unsigned char tmp)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | *type_stackp=tmp;
type_stackp++;
if(type_stackp > type_stack + sizeof(type_stack))
yyerror("Type stack overflow.");
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
void type_stack_mark()
{
*mark_stackp=type_stackp;
mark_stackp++;
if(mark_stackp > mark_stack + NELEM(mark_stack))
yyerror("Type mark stack overflow.");
}
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | INT32 pop_stack_mark()
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
mark_stackp--;
if(mark_stackp<mark_stack)
fatal("Type mark stack underflow\n");
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | return type_stackp - *mark_stackp;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
void pop_type_stack()
{
type_stackp--;
if(type_stackp<type_stack)
fatal("Type stack underflow\n");
}
void type_stack_pop_to_mark()
{
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stackp-=pop_stack_mark();
#ifdef DEBUG
if(type_stackp<type_stack)
fatal("Type stack underflow\n");
#endif
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | void reset_type_stack()
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stack_pop_to_mark();
type_stack_mark();
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | void type_stack_reverse()
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | INT32 a;
a=pop_stack_mark();
|
5425bb | 1997-05-30 | Henrik Grubbström (Grubba) | | reverse((char *)(type_stackp-a),a,1);
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | void push_type_int(unsigned INT32 i)
{
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | int e;
for(e=sizeof(i)-1;e>=0;e--)
push_type(((unsigned char *)&i)[e]);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | }
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | void push_unfinished_type(char *s)
{
int e;
e=type_length(s);
for(e--;e>=0;e--) push_type(s[e]);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void push_finished_type(struct pike_string *type)
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
int e;
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | CHECK_TYPE(type);
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | for(e=type->len-1;e>=0;e--) push_type(type->str[e]);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *pop_unfinished_type()
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | {
int 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);
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stackp-=len;
MEMCPY(s->str, type_stackp, len);
reverse(s->str, len, 1);
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | s=end_shared_string(s);
CHECK_TYPE(s);
return s;
|
726071 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *pop_type()
|
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;
}
|
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;
if(!strcmp(buf,"int")) push_type(T_INT);
else if(!strcmp(buf,"float")) push_type(T_FLOAT);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | else if(!strcmp(buf,"object"))
{
push_type_int(0);
push_type(T_OBJECT);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | else if(!strcmp(buf,"program")) push_type(T_PROGRAM);
else if(!strcmp(buf,"string")) push_type(T_STRING);
else if(!strcmp(buf,"void")) push_type(T_VOID);
else if(!strcmp(buf,"mixed")) push_type(T_MIXED);
else if(!strcmp(buf,"unknown")) push_type(T_UNKNOWN);
else if(!strcmp(buf,"function"))
{
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s == '(')
{
++*s;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | 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();
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
if(**s==',')
{
++*s;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
else if(s[0][0]=='.' && s[0][1]=='.' && s[0][2]=='.')
{
type_stack_reverse();
push_type(T_MANY);
type_stack_reverse();
*s+=3;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s != ':') error("Missing ':' after ... in function type.\n");
break;
}
pop_stack_mark();
pop_stack_mark();
}
++*s;
type_stack_mark();
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
if(**s != ')') error("Missing ')' in function type.\n");
++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
}else{
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
push_type(T_MANY);
}
push_type(T_FUNCTION);
}
else if(!strcmp(buf,"mapping"))
{
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s == '(')
{
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ++*s;
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s != ':') error("Expecting ':'.\n");
++*s;
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
++*s;
|
4d0653 | 1996-05-04 | Fredrik Hübinette (Hubbe) | | type_stack_reverse();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
push_type(T_MIXED);
push_type(T_MIXED);
}
push_type(T_MAPPING);
}
else if(!strcmp(buf,"array"))
{
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s == '(')
{
++*s;
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
++*s;
}else{
push_type(T_MIXED);
}
push_type(T_ARRAY);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | else if(!strcmp(buf,"multiset"))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s == '(')
{
++*s;
|
ec8c9e | 1996-11-01 | Fredrik Hübinette (Hubbe) | | internal_parse_type(_s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
++*s;
}else{
push_type(T_MIXED);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | push_type(T_MULTISET);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
else
error("Couldn't parse type. (%s)\n",buf);
|
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)
{
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**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;
internal_parse_typeB(s);
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(**s != ')') error("Expecting ')'.\n");
break;
default:
internal_parse_typeA(s);
}
}
static void internal_parse_typeCC(char **s)
{
internal_parse_typeB(s);
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**s)) ++*s;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | while(**s == '*')
{
++*s;
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**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) | |
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**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) | |
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | while(ISSPACE(**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) | | {
|
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");
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
#ifdef DEBUG
void stupid_describe_type(char *a,INT32 len)
{
INT32 e;
for(e=0;e<len;e++)
{
if(e) printf(" ");
switch(EXTRACT_UCHAR(a+e))
{
case T_INT: printf("int"); break;
case T_FLOAT: printf("float"); break;
case T_STRING: printf("string"); break;
case T_PROGRAM: printf("program"); break;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
printf("object(%ld)",(long)EXTRACT_INT(a+e+1));
e+=sizeof(INT32);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_FUNCTION: printf("function"); break;
case T_ARRAY: printf("array"); break;
case T_MAPPING: printf("mapping"); break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET: printf("multiset"); break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_UNKNOWN: printf("unknown"); break;
case T_MANY: printf("many"); break;
case T_OR: printf("or"); break;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND: printf("and"); break;
case T_NOT: printf("not"); break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_VOID: printf("void"); break;
case T_MIXED: printf("mixed"); break;
default: printf("%d",EXTRACT_UCHAR(a+e)); break;
}
}
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++))
{
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_VOID: my_strcat("void"); break;
case T_MIXED: my_strcat("mixed"); break;
case T_UNKNOWN: my_strcat("unknown"); break;
case T_INT: my_strcat("int"); break;
case T_FLOAT: my_strcat("float"); break;
case T_PROGRAM: my_strcat("program"); break;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
my_strcat("object");
break;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_STRING: my_strcat("string"); break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_FUNCTION:
{
int s;
my_strcat("function(");
s=0;
while(EXTRACT_UCHAR(t) != T_MANY)
{
if(s++) my_strcat(", ");
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
t++;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t) == T_VOID)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t++;
}else{
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(s++) my_strcat(", ");
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(" ...");
}
my_strcat(" : ");
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | my_strcat(")");
break;
}
case T_ARRAY:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t)==T_MIXED)
{
my_strcat("array");
t++;
}else{
t=low_describe_type(t);
my_strcat("*");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
my_strcat("multiset");
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(t)!=T_MIXED)
{
my_strcat("(");
t=low_describe_type(t);
my_strcat(")");
}else{
t++;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_NOT:
my_strcat("!");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
break;
case T_OR:
t=low_describe_type(t);
my_strcat(" | ");
t=low_describe_type(t);
break;
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
case T_AND:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | my_strcat(" & ");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t=low_describe_type(t);
|
bce86c | 1996-02-25 | 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);
my_strcat(":");
t=low_describe_type(t);
my_strcat(")");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
}
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) | | {
|
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();
}
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;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_MANY:
case T_UNKNOWN:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | case T_AND:
case T_NOT:
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return T_MIXED;
default:
return EXTRACT_UCHAR(t);
}
}
|
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);
}
#define A_EXACT 1
#define B_EXACT 2
|
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)
|
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);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(ret) return ret;
a+=type_length(a);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return low_match_types(a,b,flags);
case T_NOT:
if(low_match_types(a+1,b,flags | B_EXACT))
return 0;
return a;
|
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);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(ret) return ret;
b+=type_length(b);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return low_match_types(a,b,flags);
case T_NOT:
if(low_match_types(a,b+1, flags | A_EXACT))
return 0;
return a;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
0d202a | 1995-10-20 | Fredrik Hübinette (Hubbe) | |
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(EXTRACT_UCHAR(a) == T_MIXED && !(flags & A_EXACT)) return a;
if(EXTRACT_UCHAR(b) == T_MIXED && !(flags & B_EXACT)) return a;
|
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;
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case TWOT(T_OBJECT, T_FUNCTION):
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | {
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | struct program *p;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | if((p=id_to_program(EXTRACT_INT(a+1))))
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | {
int i=p->lfuns[LFUN_CALL];
if(i == -1) return 0;
return low_match_types(ID_FROM_INT(p, i)->type->str, b, flags);
}
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | return a;
}
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case TWOT(T_FUNCTION, T_OBJECT):
{
struct program *p;
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | if((p=id_to_program(EXTRACT_INT(b+1))))
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | {
int i=p->lfuns[LFUN_CALL];
if(i == -1) return 0;
return low_match_types(a, ID_FROM_INT(p, i)->type->str, flags);
}
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);
}
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!low_match_types(a_tmp, b_tmp, flags)) return 0;
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | if(++correct_args > max_correct_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{
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!low_match_types(a,b,flags)) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!low_match_types(a,b,flags)) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!low_match_types(++a,++b,flags)) return 0;
if(!low_match_types(a+type_length(a),b+type_length(b),flags)) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
a++;
b++;
if(!EXTRACT_INT(a) || !EXTRACT_INT(b)) break;
if(EXTRACT_INT(a) != EXTRACT_INT(b)) 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:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | if(!low_match_types(++a,++b,flags)) return 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_INT:
case T_FLOAT:
case T_STRING:
case T_PROGRAM:
case T_VOID:
case T_MIXED:
break;
default:
fatal("error in type string.\n");
}
return ret;
}
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();
if(o1 == o2)
{
if(!o1)
{
return 0;
}else{
push_finished_type(o1);
}
}
else if(o1 == mixed_type_string || o2 == mixed_type_string)
{
push_type(T_MIXED);
}
else
{
if(o1) push_finished_type(o1);
if(o2) push_finished_type(o2);
if(o1 && o2) push_type(T_OR);
}
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;
}
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | a=low_match_types(a,b,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(a)
{
switch(EXTRACT_UCHAR(a))
{
case T_FUNCTION:
a++;
while(EXTRACT_UCHAR(a)!=T_MANY) a+=type_length(a);
a++;
a+=type_length(a);
push_unfinished_type(a);
return 1;
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
push_type_int(0);
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) | | {
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | CHECK_TYPE(a);
CHECK_TYPE(b);
|
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) | | }
|
2a5096 | 1995-08-23 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | static struct pike_string *low_index_type(char *t, node *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
switch(EXTRACT_UCHAR(t++))
{
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
{
struct program *p=id_to_program(EXTRACT_INT(t));
if(p)
{
if(n->token == F_ARROW)
{
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(p->lfuns[LFUN_ARROW] != -1 || p->lfuns[LFUN_ASSIGN_ARROW] != -1)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | {
reference_shared_string(mixed_type_string);
return mixed_type_string;
}
}else{
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(p->lfuns[LFUN_INDEX] != -1 || p->lfuns[LFUN_ASSIGN_INDEX] != -1)
|
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)
{
INT32 i;
i=find_shared_string_identifier(CDR(n)->u.sval.u.string, p);
if(i==-1)
{
reference_shared_string(int_type_string);
return int_type_string;
}else{
reference_shared_string(ID_FROM_INT(p, i)->type);
return ID_FROM_INT(p, i)->type;
}
}
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
reference_shared_string(mixed_type_string);
return mixed_type_string;
case T_OR:
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *a,*b;
|
36feac | 1997-03-06 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | a=low_index_type(t,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | t+=type_length(t);
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | b=low_index_type(t,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!b) return a;
if(!a) return b;
push_finished_type(b);
push_finished_type(a);
push_type(T_OR);
|
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:
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return low_index_type(t+type_length(t),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);
case T_ARRAY:
return make_shared_binary_string(t, type_length(t));
}
}
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | struct pike_string *index_type(struct pike_string *type, node *n)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *t;
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | t=low_index_type(type->str,n);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | 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:
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return !low_check_indexing(type,index_type,n);
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | case T_STRING:
case T_ARRAY:
|
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) | | {
struct program *p=id_to_program(EXTRACT_INT(type));
if(p)
{
if(n->token == F_ARROW)
{
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(p->lfuns[LFUN_ARROW] != -1 || p->lfuns[LFUN_ASSIGN_ARROW] != -1)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return 1;
}else{
|
255d35 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | if(p->lfuns[LFUN_INDEX] != -1 || p->lfuns[LFUN_ASSIGN_INDEX] != -1)
|
b8cda2 | 1997-01-21 | Fredrik Hübinette (Hubbe) | | return 1;
}
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:
|
bce86c | 1996-02-25 | Fredrik Hübinette (Hubbe) | | return !!low_match_types(type,index_type,0);
|
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) | | {
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | CHECK_TYPE(type);
CHECK_TYPE(index_type);
|
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) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | int count_arguments(struct pike_string *s)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int num;
char *q;
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | CHECK_TYPE(s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | q=s->str;
if(EXTRACT_UCHAR(q) != T_FUNCTION) return MAX_LOCAL;
q++;
num=0;
while(EXTRACT_UCHAR(q)!=T_MANY)
{
num++;
q+=type_length(q);
}
q++;
if(EXTRACT_UCHAR(q)!=T_VOID) return ~num;
return num;
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *check_call(struct pike_string *args,
|
1d5328 | 1996-11-25 | Fredrik Hübinette (Hubbe) | | struct pike_string *type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
b9e4ba | 1996-11-18 | Fredrik Hübinette (Hubbe) | | CHECK_TYPE(args);
CHECK_TYPE(type);
|
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))
{
|
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;
}
}
|
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)
{
ret=int_type_string;
}else{
ret=ID_FROM_INT(p,s->subtype)->type;
}
}
reference_shared_string(ret);
return ret;
case T_ARRAY:
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
push_type(T_MIXED);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_type(T_ARRAY);
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | return pop_unfinished_type();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | type_stack_mark();
push_type(T_MIXED);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | push_type(T_MULTISET);
|
3db32a | 1997-03-04 | Fredrik Hübinette (Hubbe) | | 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();
|
6557ff | 1996-06-09 | Fredrik Hübinette (Hubbe) | | push_type(T_MIXED);
push_type(T_MIXED);
|
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)
{
push_type_int(s->u.object->prog->id);
}else{
push_type_int(0);
}
|
041a73 | 1996-11-12 | Mirar (Pontus Hagland) | | push_type(T_OBJECT);
|
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)
{
ret=int_type_string;
}else{
ret=mixed_type_string;
}
reference_shared_string(ret);
return ret;
|
9f6847 | 1997-03-08 | Fredrik Hübinette (Hubbe) | | case T_PROGRAM:
{
char *a;
int id=s->u.program->lfuns[LFUN_CREATE];
if(id>=0)
{
a=ID_FROM_INT(s->u.program, id)->type->str;
}else{
a=function_type_string->str;
}
if(EXTRACT_UCHAR(a)==T_FUNCTION)
{
type_stack_mark();
push_type_int(s->u.program->id);
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();
}
}
|
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) | | }
}
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";
|
3c04e8 | 1997-03-13 | Fredrik Hübinette (Hubbe) | | case T_VOID: return "void";
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default: return "unknown";
}
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void cleanup_pike_types()
|
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);
free_string(mixed_type_string);
free_string(void_type_string);
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | free_string(any_type_string);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|