pike.git / src / pike_types.c

version» Context lines:

pike.git/src/pike_types.c:1:   /*\   ||| This file a part of Pike, and is copyright by Fredrik Hubinette   ||| Pike is distributed as GPL (General Public License)   ||| See the files COPYING and DISCLAIMER for more information.   \*/   /**/   #include "global.h" - RCSID("$Id: pike_types.c,v 1.72 1999/11/24 21:44:02 hubbe Exp $"); + RCSID("$Id: pike_types.c,v 1.73 1999/11/25 00:09:56 grubba Exp $");   #include <ctype.h>   #include "svalue.h"   #include "pike_types.h"   #include "stralloc.h"   #include "stuff.h"   #include "array.h"   #include "program.h"   #include "constants.h"   #include "object.h"   #include "multiset.h"
pike.git/src/pike_types.c:1673:   /*    * Check the partial ordering relation.    *    * mixed    *    * int float string program function object    *    * zero    *    * void +  * +  * 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.    */   static int low_pike_types_le(char *a,char *b)   {    int ret;    if(a == b) return 1;       switch(EXTRACT_UCHAR(a))    {    case T_AND:    /* OK if either of the parts is a subset. */
pike.git/src/pike_types.c:1867:    return 1;    }    }       if(EXTRACT_UCHAR(a) != EXTRACT_UCHAR(b)) return 0;       ret=1;    switch(EXTRACT_UCHAR(a))    {    case T_FUNCTION: +  /* +  * function(A...:B) <= function(C...:D) iff C <= A && B <= D +  */    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;
pike.git/src/pike_types.c:1888:    }       if(EXTRACT_UCHAR(b)==T_MANY)    {    b_tmp=b+1;    }else{    b_tmp=b;    b+=type_length(b);    }    -  if(!low_pike_types_le(a_tmp, b_tmp)) return 0; +  if(!low_pike_types_le(b_tmp, a_tmp)) return 0;    }    /* check the 'many' type */    a++;    b++; -  if (!low_pike_types_le(a, b)) +  if (!low_pike_types_le(b, a))    return 0;       a+=type_length(a);    b+=type_length(b);       /* check the returntype */ -  /* NOTE: The order between a & b is switched. */ -  if(!low_pike_types_le(b,a)) return 0; +  if(!low_pike_types_le(a,b)) return 0;    break;       case T_MAPPING:    /* -  * mapping(A:B) <= mapping(C:D) iff C <= A && B <= D. +  * mapping(A:B) <= mapping(C:D) iff ((C <= A) || (A <= C)) && B <= D. +  * +  * The reason for the weak index type test, is that it's not an error +  * to index a mapping with a nonexistant key.    */ -  if(!low_pike_types_le(++b,++a)) return 0; +  if(!low_pike_types_le(++b,++a) && !low_pike_types_le(b, a)) return 0;    return low_pike_types_le(a+type_length(a),b+type_length(b));       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));
pike.git/src/pike_types.c:1977:       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: +  /* It's not an error to index a multiset with a nonexistant key. */ +  if(!low_pike_types_le(++a,++b) && +  !low_pike_types_le(b, a)) return 0; +  break; +     case T_ARRAY:    if(!low_pike_types_le(++a,++b)) return 0;       case T_FLOAT:    case T_STRING:    case T_PROGRAM:    case T_ZERO:    case T_VOID:    case T_MIXED:    break;