pike.git
/
src
/
operators.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/operators.c:1:
/* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
-
|| $Id: operators.c,v 1.
215
2006
/
08
/
21
18
:
37
:
44
grubba Exp $
+
|| $Id: operators.c,v 1.
216
2007
/
03
/
20
17
:
41
:
54
grubba Exp $
*/ #include "global.h" #include <math.h> #include "interpret.h" #include "svalue.h" #include "multiset.h" #include "mapping.h" #include "array.h" #include "stralloc.h"
pike.git/src/operators.c:1920:
Inside #if 0
TMP_OPT(f_gt, "`<="); TMP_OPT(f_le, "`>"); TMP_OPT(f_ge, "`<"); #endif #undef TMP_OPT if((more_args = is_call_to(*first_arg, f_search)) && (count_args(*more_args) == 2)) { node *search_args = *more_args; if ((search_args->token == F_ARG_LIST) && CAR(search_args) &&
-
(CAR(search_args)->type
==
string_type_string) &&
+
pike_types_le
(CAR(search_args)->type
,
string_type_string) &&
CDR(search_args) &&
-
(CDR(search_args)->type
==
string_type_string)) {
+
pike_types_le
(CDR(search_args)->type
,
string_type_string)) {
/* !search(string a, string b) => has_prefix(a, b) */ ADD_NODE_REF(*more_args); return mkefuncallnode("has_prefix", search_args); } } } return 0; }
pike.git/src/operators.c:1950:
n->tree_info |= OPT_SIDE_EFFECT; return NULL; } } return NULL; } static node *optimize_binary(node *n) { node **first_arg, **second_arg, *ret;
-
if(count_args(CDR(n))==2)
+
int args;
+
+
if(
(args =
count_args(CDR(n))
)
==2)
{ first_arg=my_get_arg(&_CDR(n), 0); second_arg=my_get_arg(&_CDR(n), 1); #ifdef PIKE_DEBUG if(!first_arg || !second_arg) Pike_fatal("Couldn't find argument!\n"); #endif if((*second_arg)->type == (*first_arg)->type &&
pike.git/src/operators.c:1998:
ret = mknode(F_APPLY, CAR(n), mknode(F_ARG_LIST, *first_arg, CDR(*second_arg))) ))); return ret; } } }
+
#if 0 /* Does not work for multiplication. */
+
/* Strengthen the string type. */
+
if (n->type && (n->type->type == T_STRING) &&
+
CAR_TO_INT(n->type) == 32 && (args > 0)) {
+
int str_width = 6; /* Width generated in int and float conversions. */
+
while (args--) {
+
struct pike_type *t;
+
node **arg = my_get_arg(&_CDR(n), args);
+
if (!arg || !(t = (*arg)->type)) continue;
+
if (t->type == T_STRING) {
+
int w = CAR_TO_INT(t);
+
if (w > str_width) str_width = w;
+
}
+
}
+
if (str_width != 32) {
+
type_stack_mark();
+
push_string_type(str_width);
+
free_type(n->type);
+
n->type = pop_unfinished_type();
+
}
+
}
+
#endif /* 0 */
return 0; } static int generate_comparison(node *n) { if(count_args(CDR(n))==2) { if(do_docode(CDR(n),DO_NOT_COPY) != 2) Pike_fatal("Count args was wrong in generate_comparison.\n");
pike.git/src/operators.c:5171:
static node *optimize_sizeof(node *n) { if (CDR(n) && (CDR(n)->token == F_APPLY) && (CADR(n)) && (CADR(n)->token == F_CONSTANT) && (CADR(n)->u.sval.type == T_FUNCTION) && (CADR(n)->u.sval.subtype == FUNCTION_BUILTIN)) { extern struct program *string_split_iterator_program; /* sizeof(efun(...)) */ if ((CADR(n)->u.sval.u.efun->function == f_divide) && CDDR(n) && (CDDR(n)->token == F_ARG_LIST) &&
-
CADDR(n) && (CADDR(n)->type
==
string_type_string) &&
+
CADDR(n) &&
pike_types_le
(CADDR(n)->type
,
string_type_string) &&
CDDDR(n) && (CDDDR(n)->token == F_CONSTANT) && (CDDDR(n)->u.sval.type == T_STRING) && (CDDDR(n)->u.sval.u.string->len == 1)) { p_wchar2 split = index_shared_string(CDDDR(n)->u.sval.u.string, 0); /* sizeof(`/(str, "x")) */ ADD_NODE_REF2(CADDR(n), return mkefuncallnode("sizeof", mkapplynode(mkprgnode(string_split_iterator_program), mknode(F_ARG_LIST, CADDR(n),
pike.git/src/operators.c:5193:
); } if ((CADR(n)->u.sval.u.efun->function == f_minus) && CDDR(n) && (CDDR(n)->token == F_ARG_LIST) && CADDR(n) && (CADDR(n)->token == F_APPLY) && CAADDR(n) && (CAADDR(n)->token == F_CONSTANT) && (CAADDR(n)->u.sval.type == T_FUNCTION) && (CAADDR(n)->u.sval.subtype == FUNCTION_BUILTIN) && (CAADDR(n)->u.sval.u.efun->function == f_divide) && CDADDR(n) && (CDADDR(n)->token == F_ARG_LIST) &&
-
CADADDR(n) && (CADADDR(n)->type
==
string_type_string) &&
+
CADADDR(n) &&
pike_types_le
(CADADDR(n)->type
,
string_type_string) &&
CDDADDR(n) && (CDDADDR(n)->token == F_CONSTANT) && (CDDADDR(n)->u.sval.type == T_STRING) && (CDDADDR(n)->u.sval.u.string->len == 1) && CDDDR(n)) { /* sizeof(`-(`/(str, "x"), y)) */ if (((CDDDR(n)->token == F_CONSTANT) && (CDDDR(n)->u.sval.type == T_ARRAY) && (CDDDR(n)->u.sval.u.array->size == 1) && (CDDDR(n)->u.sval.u.array->item[0].type == T_STRING) && (CDDDR(n)->u.sval.u.array->item[0].u.string->len == 0)) ||
pike.git/src/operators.c:5535:
ADD_EFUN2("`*", f_multiply, tOr9(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction), tFunc(tArr(tArr(tSetvar(1,tMix))) tArr(tSetvar(1,tMix)),tArr(tVar(1))), tFuncV(tInt,tInt,tInt), tIfnot(tFuncV(tNone,tNot(tFlt),tMix), tFuncV(tOr(tFlt,tInt),tOr(tFlt,tInt),tFlt)), tFunc(tArr(tStr) tStr,tStr), tFunc(tArr(tSetvar(0,tMix)) tInt,tArr(tVar(0))), tFunc(tArr(tSetvar(0,tMix)) tFlt,tArr(tVar(0))),
-
tFunc(tStr tInt,
tStr
),
-
tFunc(tStr tFlt,
tStr
)),
+
tFunc(
tSetvar(0,
tStr
)
tInt,
tVar(0
)
)
,
+
tFunc(
tSetvar(0,
tStr
)
tFlt,
tVar(0
))
)
,
OPT_TRY_OPTIMIZE,optimize_binary,generate_multiply); /* !function(!object...:mixed)&function(mixed...:mixed)|" "function(int,int...:int)|" "!function(int...:mixed)&function(float|int...:float)|" "function(array(0=mixed),array|int|float...:array(array(0)))|" "function(string,string|int|float...:array(string)) */ ADD_EFUN2("`/", f_divide, tOr5(tIfnot(tFuncV(tNone,tNot(tOr(tObj,tMix)),tMix),tFunction), tFuncV(tInt, tInt, tInt),