diff --git a/src/operators.c b/src/operators.c index ecbe77f120c0ff121854367be59e66e7b6a009ed..ee1d097ba437e427bfefdb3ab7943990936fe95e 100644 --- a/src/operators.c +++ b/src/operators.c @@ -312,7 +312,8 @@ static int generate_comparison(node *n) { if(count_args(CDR(n))==2) { - do_docode(CDR(n),DO_NOT_COPY); + if(do_docode(CDR(n),DO_NOT_COPY) != 2) + fatal("Count args was wrong in generate_comparison.\n"); if(CAR(n)->u.sval.u.efun->function == f_eq) emit2(F_EQ); @@ -1128,6 +1129,28 @@ void o_range() } } +void f_sizeof(INT32 args) +{ + INT32 tmp; + if(args<1) + error("Too few arguments to sizeof()\n"); + + tmp=lpc_sizeof(sp-args); + + pop_n_elems(args); + push_int(tmp); +} + +static int generate_sizeof(node *n) +{ + node **arg; + if(count_args(CDR(n)) != 1) return 0; + if(do_docode(CDR(n),DO_NOT_COPY) != 1) + fatal("Count args was wrong in sizeof().\n"); + emit2(F_SIZEOF); + return 1; +} + void init_operators() { add_efun2("`==",f_eq,"function(mixed,mixed:int)",OPT_TRY_OPTIMIZE,0,generate_comparison); @@ -1165,4 +1188,5 @@ void init_operators() add_efun2("`%",f_mod,"function(object,mixed:mixed)|function(int,int:int)|!function(int,int:mixed)&function(int|float,int|float:float)",OPT_TRY_OPTIMIZE,0,generate_mod); add_efun2("`~",f_compl,"function(object:mixed)|function(int:int)|function(float:float)",OPT_TRY_OPTIMIZE,0,generate_compl); + add_efun2("sizeof", f_sizeof, "function(string|list|array|mapping|object:int)",0,0,generate_sizeof); }