diff --git a/src/operators.c b/src/operators.c index 41786f81786b1696310cc8903b7f53135426f3c6..2d7ccf0ae71e90bc00c96484a5d40cfcab0abee8 100644 --- a/src/operators.c +++ b/src/operators.c @@ -6,7 +6,7 @@ /**/ #include "global.h" #include <math.h> -RCSID("$Id: operators.c,v 1.79 1999/12/15 07:50:00 hubbe Exp $"); +RCSID("$Id: operators.c,v 1.80 1999/12/18 17:49:05 mast Exp $"); #include "interpret.h" #include "svalue.h" #include "multiset.h" @@ -2501,18 +2501,45 @@ void init_operators(void) tFuncV(tStr,tStr,tStr)), OPT_TRY_OPTIMIZE,0,generate_minus); -#define LOG_TYPE "function(mixed,object...:mixed)|function(object,mixed...:mixed)|function(int...:int)|function(mapping(0=mixed:1=mixed)...:mapping(0:1))|function(multiset(2=mixed)...:multiset(2))|function(array(3=mixed)...:array(3))|function(string...:string)|function(type|program,type|program...:type)" - - add_efun2("`&",f_and,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_and); - - add_efun2("`|",f_or,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_or); - - add_efun2("`^",f_xor,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_xor); - -#define SHIFT_TYPE "function(object,mixed:mixed)|function(mixed,object:mixed)|function(int,int:int)" - - add_efun2("`<<",f_lsh,SHIFT_TYPE,OPT_TRY_OPTIMIZE,0,generate_lsh); - add_efun2("`>>",f_rsh,SHIFT_TYPE,OPT_TRY_OPTIMIZE,0,generate_rsh); + ADD_EFUN2("`&",f_and, + tOr8(tFunc(tSetvar(0,tMix),tVar(0)), + tOr(tFuncV(tMix tObj,tMix,tMix), + tFuncV(tObj tMix,tMix,tMix)), + tFuncV(tInt tInt,tInt,tInt), + tOr(tFunc(tMapping tSetvar(1,tMapping),tVar(1)), + tFuncV(tMapping tMapping tSetvar(2,tMapping), + tSetvar(3,tMapping),tOr(tVar(2),tVar(3)))), + tOr(tFunc(tMultiset tSetvar(4,tMultiset),tVar(4)), + tFuncV(tMultiset tMultiset tSetvar(5,tMultiset), + tSetvar(6,tMultiset),tOr(tVar(5),tVar(6)))), + tOr(tFunc(tArray tSetvar(7,tArray),tVar(7)), + tFuncV(tArray tArray tSetvar(8,tArray), + tSetvar(9,tArray),tOr(tVar(8),tVar(9)))), + tFuncV(tString tString,tString,tString), + tFuncV(tOr(tType,tPrg) tOr(tType,tPrg),tOr(tType,tPrg),tType)), + OPT_TRY_OPTIMIZE,optimize_binary,generate_and); + +#define LOG_TYPE \ + tOr7(tOr(tFuncV(tMix tObj,tMix,tMix), \ + tFuncV(tObj,tMix,tMix)), \ + tFuncV(tInt,tInt,tInt), \ + tFuncV(tSetvar(1,tMapping),tSetvar(2,tMapping),tOr(tVar(1),tVar(2))), \ + tFuncV(tSetvar(3,tMultiset),tSetvar(4,tMultiset),tOr(tVar(3),tVar(4))), \ + tFuncV(tSetvar(5,tArray),tSetvar(6,tArray),tOr(tVar(5),tVar(6))), \ + tFuncV(tString,tString,tString), \ + tFuncV(tOr(tType,tPrg),tOr(tType,tPrg),tType)) + + ADD_EFUN2("`|",f_or,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_or); + + ADD_EFUN2("`^",f_xor,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_xor); + +#define SHIFT_TYPE \ + tOr(tOr(tFuncV(tMix tObj,tMix,tMix), \ + tFuncV(tObj tMix,tMix,tMix)), \ + tFuncV(tInt,tInt,tInt)) + + ADD_EFUN2("`<<",f_lsh,SHIFT_TYPE,OPT_TRY_OPTIMIZE,0,generate_lsh); + ADD_EFUN2("`>>",f_rsh,SHIFT_TYPE,OPT_TRY_OPTIMIZE,0,generate_rsh); /* !function(!object...:mixed)&function(mixed...:mixed)|" "function(array(array(1=mixed)),array(1=mixed):array(1))|"