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.179 2003/05/15 15:33:30 mast Exp $
+ || $Id: operators.c,v 1.180 2003/11/10 01:19:51 mast Exp $
*/
#include "global.h"
#include <math.h>
- RCSID("$Id: operators.c,v 1.179 2003/05/15 15:33:30 mast Exp $");
+ RCSID("$Id: operators.c,v 1.180 2003/11/10 01:19:51 mast Exp $");
#include "interpret.h"
#include "svalue.h"
#include "multiset.h"
#include "mapping.h"
#include "array.h"
#include "stralloc.h"
#include "opcodes.h"
#include "operators.h"
#include "language.h"
#include "pike_memory.h"
pike.git/src/operators.c:143:
*! @expr{0@} (zero) otherwise.
*!
*! This is the inverse of @[`<()].
*!
*! @seealso
*! @[`<=()], @[`>()], @[`<()]
*/
COMPARISON(f_ge,"`>=",!is_lt)
- #define CALL_OPERATOR(OP, args) \
- if(!sp[-args].u.object->prog) \
+ #define CALL_OPERATOR(OP, args) do { \
+ int i; \
+ if(!sp[-args].u.object->prog) \
bad_arg_error(lfun_names[OP], sp-args, args, 1, "object", sp-args, \
- "Called in destructed object.\n"); \
- if(FIND_LFUN(sp[-args].u.object->prog,OP) == -1) \
+ "Called in destructed object.\n"); \
+ if((i = FIND_LFUN(sp[-args].u.object->prog,OP)) == -1) \
bad_arg_error(lfun_names[OP], sp-args, args, 1, "object", sp-args, \
- "Operator not in object.\n"); \
- apply_lfun(sp[-args].u.object, OP, args-1); \
- free_svalue(sp-2); \
- sp[-2]=sp[-1]; \
- sp--; \
- dmalloc_touch_svalue(sp);
+ "Operator not in object.\n"); \
+ apply_low(sp[-args].u.object, i, args-1); \
+ free_svalue(sp-2); \
+ sp[-2]=sp[-1]; \
+ sp--; \
+ dmalloc_touch_svalue(sp); \
+ } while (0)
/*! @decl mixed `+(mixed arg1)
*! @decl mixed `+(object arg1, mixed ... extras)
*! @decl string `+(string arg1, string|int|float arg2)
*! @decl string `+(int|float arg1, string arg2)
*! @decl int `+(int arg1, int arg2)
*! @decl float `+(float arg1, int|float arg2)
*! @decl float `+(int|float arg1, float arg2)
*! @decl array `+(array arg1, array arg2)
*! @decl mapping `+(mapping arg1, mapping arg2)
pike.git/src/operators.c:238:
switch(types)
{
default:
if(!args)
{
SIMPLE_TOO_FEW_ARGS_ERROR("`+", 1);
}else{
if(types & BIT_OBJECT)
{
+ if (args == 1)
+ return;
+
if(sp[-args].type == T_OBJECT && sp[-args].u.object->prog)
{
-
+ int i;
if(sp[-args].u.object->refs==1 &&
- FIND_LFUN(sp[-args].u.object->prog,LFUN_ADD_EQ) != -1)
+ (i = FIND_LFUN(sp[-args].u.object->prog,LFUN_ADD_EQ)) != -1)
{
- apply_lfun(sp[-args].u.object, LFUN_ADD_EQ, args-1);
+ apply_low(sp[-args].u.object, i, args-1);
stack_pop_keep_top();
return;
}
- if(FIND_LFUN(sp[-args].u.object->prog,LFUN_ADD) != -1)
+ if((i = FIND_LFUN(sp[-args].u.object->prog,LFUN_ADD)) != -1)
{
- apply_lfun(sp[-args].u.object, LFUN_ADD, args-1);
+ apply_low(sp[-args].u.object, i, args-1);
free_svalue(sp-2);
sp[-2]=sp[-1];
sp--;
dmalloc_touch_svalue(sp);
return;
}
}
-
+
for(e=1;e<args;e++)
{
-
+ int i;
if(sp[e-args].type == T_OBJECT &&
sp[e-args].u.object->prog &&
- FIND_LFUN(sp[e-args].u.object->prog,LFUN_RADD) != -1)
+ (i = FIND_LFUN(sp[e-args].u.object->prog,LFUN_RADD)) != -1)
{
struct svalue *tmp=sp+e-args;
check_stack(e);
assign_svalues_no_free(sp, sp-args, e, -1);
sp+=e;
- apply_lfun(tmp->u.object, LFUN_RADD, e);
+ apply_low(tmp->u.object, i, e);
if(args - e > 1)
{
assign_svalue(tmp, sp-1);
pop_stack();
f_add(args - e);
assign_svalue(sp-e-1,sp-1);
pop_n_elems(e);
}else{
assign_svalue(sp-args-1,sp-1);
pop_n_elems(args);
pike.git/src/operators.c:888: Inside #if defined(AUTO_BIGNUM)
stack_swap();
f_cast();
return 1;
}
#endif
return 0;
}
static int call_lfun(int left, int right)
{
+ int i;
if(sp[-2].type == T_OBJECT &&
sp[-2].u.object->prog &&
- FIND_LFUN(sp[-2].u.object->prog,left) != -1)
+ (i = FIND_LFUN(sp[-2].u.object->prog,left)) != -1)
{
- apply_lfun(sp[-2].u.object, left, 1);
+ apply_low(sp[-2].u.object, i, 1);
free_svalue(sp-2);
sp[-2]=sp[-1];
sp--;
dmalloc_touch_svalue(sp);
return 1;
}
if(sp[-1].type == T_OBJECT &&
sp[-1].u.object->prog &&
- FIND_LFUN(sp[-1].u.object->prog,right) != -1)
+ (i = FIND_LFUN(sp[-1].u.object->prog,right)) != -1)
{
push_svalue(sp-2);
- apply_lfun(sp[-2].u.object, right, 1);
+ apply_low(sp[-2].u.object, i, 1);
free_svalue(sp-3);
sp[-3]=sp[-1];
sp--;
dmalloc_touch_svalue(sp);
pop_stack();
return 1;
}
return 0;
}
pike.git/src/operators.c:1043:
s=make_shared_string("");
ret=string_replace(sp[-2].u.string,sp[-1].u.string,s);
free_string(sp[-2].u.string);
free_string(sp[-1].u.string);
free_string(s);
sp[-2].u.string=ret;
sp--;
return;
}
+ /* FIXME: Support types? */
+
default:
{
int args = 2;
SIMPLE_BAD_ARG_ERROR("`-", 1,
"int|float|string|mapping|multiset|array|object");
}
}
}
/*! @decl mixed `-(mixed arg1)
pike.git/src/operators.c:1572:
struct mapping *m;
m=merge_mappings(sp[-2].u.mapping, sp[-1].u.mapping, PIKE_ARRAY_OP_OR);
pop_n_elems(2);
push_mapping(m);
return;
}
case T_MULTISET:
{
struct multiset *l;
- l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_OR);
+ l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, PIKE_ARRAY_OP_OR_LEFT);
pop_n_elems(2);
push_multiset(l);
return;
}
case T_ARRAY:
{
struct array *a;
- a=merge_array_with_order(sp[-2].u.array, sp[-1].u.array, PIKE_ARRAY_OP_OR);
+ a=merge_array_with_order(sp[-2].u.array, sp[-1].u.array, PIKE_ARRAY_OP_OR_LEFT);
pop_n_elems(2);
push_array(a);
return;
}
case T_TYPE:
{
struct pike_type *t;
t = or_pike_types(sp[-2].u.type, sp[-1].u.type, 0);
pop_n_elems(2);