Branch: Tag:

1996-09-22

1996-09-22 19:40:33 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

Pike

Rev: .cvsignore:1.1.1.1
Rev: README:1.1.1.1
Rev: bin/export.pike:1.1.1.1
Rev: bin/fixdepends.sh:1.1.1.1
Rev: bin/hilfe:1.1.1.1
Rev: bin/htmlify_docs.pike:1.1.1.1
Rev: bin/httpd.pike:1.1.1.1
Rev: bin/metatest:1.1.1.1
Rev: bin/mkpeep.pike:1.1.1.1
Rev: bin/rsif:1.1.1.1
Rev: doc/README:1.1.1.1
Rev: doc/builtin/_verify_internals:1.1.1.1
Rev: doc/builtin/add_constant:1.1.1.1
Rev: doc/builtin/aggregage_multiset:1.1.1.1
Rev: doc/builtin/aggregate:1.1.1.1
Rev: doc/builtin/aggregate_mapping:1.1.1.1
Rev: doc/builtin/alarm:1.1.1.1
Rev: doc/builtin/all_constants:1.1.1.1
Rev: doc/builtin/allocate:1.1.1.1
Rev: doc/builtin/arrayp:1.1.1.1
Rev: doc/builtin/backtrace:1.1.1.1
Rev: doc/builtin/call_function:1.1.1.1
Rev: doc/builtin/clone:1.1.1.1
Rev: doc/builtin/column:1.1.1.1
Rev: doc/builtin/combine_path:1.1.1.1
Rev: doc/builtin/compile_file:1.1.1.1
Rev: doc/builtin/compile_string:1.1.1.1
Rev: doc/builtin/copy_value:1.1.1.1
Rev: doc/builtin/crypt:1.1.1.1
Rev: doc/builtin/ctime:1.1.1.1
Rev: doc/builtin/destruct:1.1.1.1
Rev: doc/builtin/equal:1.1.1.1
Rev: doc/builtin/exit:1.1.1.1
Rev: doc/builtin/floatp:1.1.1.1
Rev: doc/builtin/function_name:1.1.1.1
Rev: doc/builtin/function_object:1.1.1.1
Rev: doc/builtin/functionp:1.1.1.1
Rev: doc/builtin/gc:1.1.1.1
Rev: doc/builtin/getpid:1.1.1.1
Rev: doc/builtin/glob:1.1.1.1
Rev: doc/builtin/hash:1.1.1.1
Rev: doc/builtin/indices:1.1.1.1
Rev: doc/builtin/intp:1.1.1.1
Rev: doc/builtin/kill:1.1.1.1
Rev: doc/builtin/localtime:1.1.1.1
Rev: doc/builtin/lower_case:1.1.1.1
Rev: doc/builtin/m_delete:1.1.1.1
Rev: doc/builtin/mappingp:1.1.1.1
Rev: doc/builtin/mkmapping:1.1.1.1
Rev: doc/builtin/multisetp:1.1.1.1
Rev: doc/builtin/next_object:1.1.1.1
Rev: doc/builtin/object_program:1.1.1.1
Rev: doc/builtin/objectp:1.1.1.1
Rev: doc/builtin/programp:1.1.1.1
Rev: doc/builtin/query_host_name:1.1.1.1
Rev: doc/builtin/query_num_arg:1.1.1.1
Rev: doc/builtin/random:1.1.1.1
Rev: doc/builtin/random_seed:1.1.1.1
Rev: doc/builtin/replace:1.1.1.1
Rev: doc/builtin/reverse:1.1.1.1
Rev: doc/builtin/rows:1.1.1.1
Rev: doc/builtin/rusage:1.1.1.1
Rev: doc/builtin/search:1.1.1.1
Rev: doc/builtin/signal:1.1.1.1
Rev: doc/builtin/signame:1.1.1.1
Rev: doc/builtin/signum:1.1.1.1
Rev: doc/builtin/sizeof:1.1.1.1
Rev: doc/builtin/sleep:1.1.1.1
Rev: doc/builtin/sort:1.1.1.1
Rev: doc/builtin/stringp:1.1.1.1
Rev: doc/builtin/this_object:1.1.1.1
Rev: doc/builtin/throw:1.1.1.1
Rev: doc/builtin/time:1.1.1.1
Rev: doc/builtin/trace:1.1.1.1
Rev: doc/builtin/ualarm:1.1.1.1
Rev: doc/builtin/upper_case:1.1.1.1
Rev: doc/builtin/values:1.1.1.1
Rev: doc/builtin/zero_type:1.1.1.1
Rev: doc/index.bmml:1.1.1.1
Rev: doc/manual/example1:1.1.1.1
Rev: doc/manual/example2:1.1.1.1
Rev: doc/manual/example3:1.1.1.1
Rev: doc/manual/tutorial:1.1.1.1
Rev: doc/operators/and:1.1.1.1
Rev: doc/operators/complement:1.1.1.1
Rev: doc/operators/divide:1.1.1.1
Rev: doc/operators/index:1.1.1.1
Rev: doc/operators/is_equal:1.1.1.1
Rev: doc/operators/is_greater_or_equal:1.1.1.1
Rev: doc/operators/is_greater_than:1.1.1.1
Rev: doc/operators/is_lesser_or_equal:1.1.1.1
Rev: doc/operators/is_lesser_than:1.1.1.1
Rev: doc/operators/logical_and:1.1.1.1
Rev: doc/operators/logical_or:1.1.1.1
Rev: doc/operators/minus:1.1.1.1
Rev: doc/operators/modulo:1.1.1.1
Rev: doc/operators/mult:1.1.1.1
Rev: doc/operators/not:1.1.1.1
Rev: doc/operators/not_equal:1.1.1.1
Rev: doc/operators/operators:1.1.1.1
Rev: doc/operators/or:1.1.1.1
Rev: doc/operators/plus:1.1.1.1
Rev: doc/operators/range:1.1.1.1
Rev: doc/operators/shift_left:1.1.1.1
Rev: doc/operators/shift_right:1.1.1.1
Rev: doc/operators/xor:1.1.1.1
Rev: doc/pike/all.bmml:1.1.1.1
Rev: doc/pike/cast:1.1.1.1
Rev: doc/pike/catch:1.1.1.1
Rev: doc/pike/class:1.1.1.1
Rev: doc/pike/command_line_options:1.1.1.1
Rev: doc/pike/control_structures/break:1.1.1.1
Rev: doc/pike/control_structures/catch:1.1.1.1
Rev: doc/pike/control_structures/continue:1.1.1.1
Rev: doc/pike/control_structures/do-while:1.1.1.1
Rev: doc/pike/control_structures/for:1.1.1.1
Rev: doc/pike/control_structures/foreach:1.1.1.1
Rev: doc/pike/control_structures/if-else:1.1.1.1
Rev: doc/pike/control_structures/return:1.1.1.1
Rev: doc/pike/control_structures/switch:1.1.1.1
Rev: doc/pike/control_structures/while:1.1.1.1
Rev: doc/pike/efuns.bmml:1.1.1.1
Rev: doc/pike/functions:1.1.1.1
Rev: doc/pike/gauge:1.1.1.1
Rev: doc/pike/hilfe:1.1.1.1
Rev: doc/pike/how_to_make_modules:1.1.1.1
Rev: doc/pike/inherit:1.1.1.1
Rev: doc/pike/lambda:1.1.1.1
Rev: doc/pike/modifier:1.1.1.1
Rev: doc/pike/preprocessor:1.1.1.1
Rev: doc/pike/reserved.bmml:1.1.1.1
Rev: doc/pike/sscanf:1.1.1.1
Rev: doc/pike/typeof:1.1.1.1
Rev: doc/pike/variables:1.1.1.1
Rev: doc/simulated/PI:1.1.1.1
Rev: doc/simulated/add_efun:1.1.1.1
Rev: doc/simulated/aggregage_list:1.1.1.1
Rev: doc/simulated/all_efuns:1.1.1.1
Rev: doc/simulated/capitalize:1.1.1.1
Rev: doc/simulated/describe_backtrace:1.1.1.1
Rev: doc/simulated/exec:1.1.1.1
Rev: doc/simulated/explode:1.1.1.1
Rev: doc/simulated/file_size:1.1.1.1
Rev: doc/simulated/filter:1.1.1.1
Rev: doc/simulated/filter_array:1.1.1.1
Rev: doc/simulated/get_function:1.1.1.1
Rev: doc/simulated/getenv:1.1.1.1
Rev: doc/simulated/implode:1.1.1.1
Rev: doc/simulated/l_sizeof:1.1.1.1
Rev: doc/simulated/listp:1.1.1.1
Rev: doc/simulated/m_indices:1.1.1.1
Rev: doc/simulated/m_sizeof:1.1.1.1
Rev: doc/simulated/m_values:1.1.1.1
Rev: doc/simulated/map:1.1.1.1
Rev: doc/simulated/map_array:1.1.1.1
Rev: doc/simulated/master:1.1.1.1
Rev: doc/simulated/member_array:1.1.1.1
Rev: doc/simulated/mklist:1.1.1.1
Rev: doc/simulated/mkmultiset:1.1.1.1
Rev: doc/simulated/perror:1.1.1.1
Rev: doc/simulated/popen:1.1.1.1
Rev: doc/simulated/previous_object:1.1.1.1
Rev: doc/simulated/putenv:1.1.1.1
Rev: doc/simulated/read_bytes:1.1.1.1
Rev: doc/simulated/regexp:1.1.1.1
Rev: doc/simulated/search_array:1.1.1.1
Rev: doc/simulated/sort_array:1.1.1.1
Rev: doc/simulated/spawn:1.1.1.1
Rev: doc/simulated/strlen:1.1.1.1
Rev: doc/simulated/strstr:1.1.1.1
Rev: doc/simulated/sum:1.1.1.1
Rev: doc/simulated/sum_arrays:1.1.1.1
Rev: doc/simulated/system:1.1.1.1
Rev: doc/simulated/this_function:1.1.1.1
Rev: doc/simulated/version:1.1.1.1
Rev: doc/simulated/write:1.1.1.1
Rev: doc/simulated/write_file:1.1.1.1
Rev: doc/types/array:1.1.1.1
Rev: doc/types/float:1.1.1.1
Rev: doc/types/function:1.1.1.1
Rev: doc/types/int:1.1.1.1
Rev: doc/types/mapping:1.1.1.1
Rev: doc/types/mixed:1.1.1.1
Rev: doc/types/multiset:1.1.1.1
Rev: doc/types/object:1.1.1.1
Rev: doc/types/program:1.1.1.1
Rev: doc/types/string:1.1.1.1
Rev: lib/include/array.h:1.1.1.1
Rev: lib/include/array.pre.pike:1.1.1.1
Rev: lib/include/process.h:1.1.1.1
Rev: lib/include/process.pre.pike:1.1.1.1
Rev: lib/include/simulate.h:1.1.1.1
Rev: lib/include/simulate.pre.pike:1.1.1.1
Rev: lib/include/stdio.h:1.1.1.1
Rev: lib/include/stdio.pre.pike:1.1.1.1
Rev: lib/master.pike:1.1.1.1
Rev: src/.cvsignore:1.1.1.1
Rev: src/BUGS:1.1.1.1
Rev: src/COPYING:1.1.1.1
Rev: src/COPYRIGHT:1.1.1.1
Rev: src/ChangeLog:1.1.1.1
Rev: src/DISCLAIMER:1.1.1.1
Rev: src/Makefile.src:1.1.1.1
Rev: src/README:1.1.1.1
Rev: src/alloca.c:1.1.1.1
Rev: src/array.c:1.1.1.1
Rev: src/array.h:1.1.1.1
Rev: src/backend.c:1.1.1.1
Rev: src/backend.h:1.1.1.1
Rev: src/build_modlist_h:1.1.1.1
Rev: src/builtin_functions.c:1.1.1.1
Rev: src/builtin_functions.h:1.1.1.1
Rev: src/callback.c:1.1.1.1
Rev: src/callback.h:1.1.1.1
Rev: src/compilation.h:1.1.1.1
Rev: src/config.cache:1.1.1.1
Rev: src/config.h:1.1.1.1
Rev: src/config.log:1.1.1.1
Rev: src/configure.in:1.1.1.1
Rev: src/constants.c:1.1.1.1
Rev: src/constants.h:1.1.1.1
Rev: src/docode.c:1.1.1.1
Rev: src/docode.h:1.1.1.1
Rev: src/dynamic_buffer.c:1.1.1.1
Rev: src/dynamic_buffer.h:1.1.1.1
Rev: src/efun.h:1.1.1.1
Rev: src/error.c:1.1.1.1
Rev: src/error.h:1.1.1.1
Rev: src/fd_control.c:1.1.1.1
Rev: src/fd_control.h:1.1.1.1
Rev: src/fsort.c:1.1.1.1
Rev: src/fsort.h:1.1.1.1
Rev: src/gc.c:1.1.1.1
Rev: src/gc.h:1.1.1.1
Rev: src/global.h:1.1.1.1
Rev: src/hashtable.c:1.1.1.1
Rev: src/hashtable.h:1.1.1.1
Rev: src/install-sh:1.1.1.1
Rev: src/interpret.c:1.1.1.1
Rev: src/interpret.h:1.1.1.1
Rev: src/language.y:1.1.1.1
Rev: src/las.c:1.1.1.1
Rev: src/las.h:1.1.1.1
Rev: src/lex.c:1.1.1.1
Rev: src/lex.h:1.1.1.1
Rev: src/machine.h.in:1.1.1.1
Rev: src/macros.h:1.1.1.1
Rev: src/main.c:1.1.1.1
Rev: src/main.h:1.1.1.1
Rev: src/mapping.c:1.1.1.1
Rev: src/mapping.h:1.1.1.1
Rev: src/memory.c:1.1.1.1
Rev: src/memory.h:1.1.1.1
Rev: src/module.c:1.1.1.1
Rev: src/module.h:1.1.1.1
Rev: src/modules/.cvsignore:1.1.1.1
Rev: src/modules/Makefile.src:1.1.1.1
Rev: src/modules/call_out/.cvsignore:1.1.1.1
Rev: src/modules/call_out/Makefile.src:1.1.1.1
Rev: src/modules/call_out/call_out.c:1.1.1.1
Rev: src/modules/call_out/configure.in:1.1.1.1
Rev: src/modules/call_out/doc/call_out:1.1.1.1
Rev: src/modules/call_out/doc/call_out_info:1.1.1.1
Rev: src/modules/call_out/doc/find_call_out:1.1.1.1
Rev: src/modules/call_out/doc/remove_call_out:1.1.1.1
Rev: src/modules/configure.in:1.1.1.1
Rev: src/modules/files/.cvsignore:1.1.1.1
Rev: src/modules/files/Makefile.src:1.1.1.1
Rev: src/modules/files/configure.in:1.1.1.1
Rev: src/modules/files/datagram.c:1.1.1.1
Rev: src/modules/files/doc/cd:1.1.1.1
Rev: src/modules/files/doc/errno:1.1.1.1
Rev: src/modules/files/doc/exece:1.1.1.1
Rev: src/modules/files/doc/file:1.1.1.1
Rev: src/modules/files/doc/file_stat:1.1.1.1
Rev: src/modules/files/doc/fork:1.1.1.1
Rev: src/modules/files/doc/get_dir:1.1.1.1
Rev: src/modules/files/doc/getcwd:1.1.1.1
Rev: src/modules/files/doc/mkdir:1.1.1.1
Rev: src/modules/files/doc/mv:1.1.1.1
Rev: src/modules/files/doc/port:1.1.1.1
Rev: src/modules/files/doc/rm:1.1.1.1
Rev: src/modules/files/doc/strerror:1.1.1.1
Rev: src/modules/files/doc/werror:1.1.1.1
Rev: src/modules/files/efuns.c:1.1.1.1
Rev: src/modules/files/file.c:1.1.1.1
Rev: src/modules/files/file.h:1.1.1.1
Rev: src/modules/files/file_machine.h.in:1.1.1.1
Rev: src/modules/files/socket.c:1.1.1.1
Rev: src/modules/gdbmmod/.cvsignore:1.1.1.1
Rev: src/modules/gdbmmod/Makefile.src:1.1.1.1
Rev: src/modules/gdbmmod/configure.in:1.1.1.1
Rev: src/modules/gdbmmod/doc/gdbm:1.1.1.1
Rev: src/modules/gdbmmod/gdbm_machine.h.in:1.1.1.1
Rev: src/modules/gdbmmod/gdbmmod.c:1.1.1.1
Rev: src/modules/gmpmod/.cvsignore:1.1.1.1
Rev: src/modules/gmpmod/Makefile.src:1.1.1.1
Rev: src/modules/gmpmod/configure.in:1.1.1.1
Rev: src/modules/gmpmod/doc/mpz:1.1.1.1
Rev: src/modules/gmpmod/gmp_machine.h.in:1.1.1.1
Rev: src/modules/gmpmod/mpz_glue.c:1.1.1.1
Rev: src/modules/image/Makefile.in:1.1.1.1
Rev: src/modules/image/Makefile.src:1.1.1.1
Rev: src/modules/image/configure:1.1.1.1
Rev: src/modules/image/configure.in:1.1.1.1
Rev: src/modules/image/dependencies:1.1.1.1
Rev: src/modules/image/doc.txt:1.1.1.1
Rev: src/modules/image/doc/image.html:1.1.1.1
Rev: src/modules/image/font.c:1.1.1.1
Rev: src/modules/image/image.c:1.1.1.1
Rev: src/modules/image/image.h:1.1.1.1
Rev: src/modules/image/lzw.c:1.1.1.1
Rev: src/modules/image/lzw.h:1.1.1.1
Rev: src/modules/image/quant.c:1.1.1.1
Rev: src/modules/image/togif.c:1.1.1.1
Rev: src/modules/math/.cvsignore:1.1.1.1
Rev: src/modules/math/Makefile.src:1.1.1.1
Rev: src/modules/math/configure.in:1.1.1.1
Rev: src/modules/math/doc/acos:1.1.1.1
Rev: src/modules/math/doc/asin:1.1.1.1
Rev: src/modules/math/doc/atan:1.1.1.1
Rev: src/modules/math/doc/ceil:1.1.1.1
Rev: src/modules/math/doc/cos:1.1.1.1
Rev: src/modules/math/doc/exp:1.1.1.1
Rev: src/modules/math/doc/floor:1.1.1.1
Rev: src/modules/math/doc/log:1.1.1.1
Rev: src/modules/math/doc/pow:1.1.1.1
Rev: src/modules/math/doc/sin:1.1.1.1
Rev: src/modules/math/doc/sqrt:1.1.1.1
Rev: src/modules/math/doc/tan:1.1.1.1
Rev: src/modules/math/math.c:1.1.1.1
Rev: src/modules/module_dir_marker:1.1.1.1
Rev: src/modules/pipe/Makefile.in:1.1.1.1
Rev: src/modules/pipe/Makefile.src:1.1.1.1
Rev: src/modules/pipe/config.h:1.1.1.1
Rev: src/modules/pipe/configure:1.1.1.1
Rev: src/modules/pipe/configure.in:1.1.1.1
Rev: src/modules/pipe/dependencies:1.1.1.1
Rev: src/modules/pipe/pipe.c:1.1.1.1
Rev: src/modules/readlinemod/.cvsignore:1.1.1.1
Rev: src/modules/readlinemod/Makefile.src:1.1.1.1
Rev: src/modules/readlinemod/configure.in:1.1.1.1
Rev: src/modules/readlinemod/doc/readline:1.1.1.1
Rev: src/modules/readlinemod/readline_machine.h.in:1.1.1.1
Rev: src/modules/readlinemod/readlinemod.c:1.1.1.1
Rev: src/modules/regexp/.cvsignore:1.1.1.1
Rev: src/modules/regexp/Makefile.src:1.1.1.1
Rev: src/modules/regexp/configure.in:1.1.1.1
Rev: src/modules/regexp/doc/regexp:1.1.1.1
Rev: src/modules/regexp/glue.c:1.1.1.1
Rev: src/modules/regexp/regexp.c:1.1.1.1
Rev: src/modules/regexp/regexp.h:1.1.1.1
Rev: src/modules/spider/Makefile.in:1.1.1.1
Rev: src/modules/spider/Makefile.src:1.1.1.1
Rev: src/modules/spider/configure:1.1.1.1
Rev: src/modules/spider/configure.in:1.1.1.1
Rev: src/modules/spider/defs.h:1.1.1.1
Rev: src/modules/spider/dependencies:1.1.1.1
Rev: src/modules/spider/discdate.c:1.1.1.1
Rev: src/modules/spider/encode_decode.c:1.1.1.1
Rev: src/modules/spider/http_parse.c:1.1.1.1
Rev: src/modules/spider/lock.c:1.1.1.1
Rev: src/modules/spider/lock.h:1.1.1.1
Rev: src/modules/spider/sdebug.c:1.1.1.1
Rev: src/modules/spider/shared_mem_mapping.c:1.1.1.1
Rev: src/modules/spider/sharedmem.c:1.1.1.1
Rev: src/modules/spider/sharedmem.h:1.1.1.1
Rev: src/modules/spider/spider.c:1.1.1.1
Rev: src/modules/spider/spider.h.in:1.1.1.1
Rev: src/modules/spider/stardate.c:1.1.1.1
Rev: src/modules/spider/streamed_parser.c:1.1.1.1
Rev: src/modules/spider/streamed_parser.h:1.1.1.1
Rev: src/modules/spider/tree.c:1.1.1.1
Rev: src/modules/sprintf/.cvsignore:1.1.1.1
Rev: src/modules/sprintf/Makefile.src:1.1.1.1
Rev: src/modules/sprintf/configure.in:1.1.1.1
Rev: src/modules/sprintf/doc/sprintf:1.1.1.1
Rev: src/modules/sprintf/sprintf.c:1.1.1.1
Rev: src/multiset.c:1.1.1.1
Rev: src/multiset.h:1.1.1.1
Rev: src/object.c:1.1.1.1
Rev: src/object.h:1.1.1.1
Rev: src/opcodes.c:1.1.1.1
Rev: src/opcodes.h:1.1.1.1
Rev: src/operators.c:1.1.1.1
Rev: src/operators.h:1.1.1.1
Rev: src/otable.h:1.1.1.1
Rev: src/peep.c:1.1.1.1
Rev: src/peep.h:1.1.1.1
Rev: src/peep.in:1.1.1.1
Rev: src/pike_types.c:1.1.1.1
Rev: src/pike_types.h:1.1.1.1
Rev: src/port.c:1.1.1.1
Rev: src/port.h:1.1.1.1
Rev: src/program.c:1.1.1.1
Rev: src/program.h:1.1.1.1
Rev: src/run_autoconfig:1.1.1.1
Rev: src/rusage.c:1.1.1.1
Rev: src/rusage.h:1.1.1.1
Rev: src/signal_handler.c:1.1.1.1
Rev: src/signal_handler.h:1.1.1.1
Rev: src/stamp-h:1.1.1.1
Rev: src/stralloc.c:1.1.1.1
Rev: src/stralloc.h:1.1.1.1
Rev: src/stuff.c:1.1.1.1
Rev: src/stuff.h:1.1.1.1
Rev: src/svalue.c:1.1.1.1
Rev: src/svalue.h:1.1.1.1
Rev: src/test/.cvsignore:1.1.1.1
Rev: src/test/create_testsuite:1.1.1.1
Rev: src/test/test_pike.pike:1.1.1.1
Rev: src/time_stuff.h:1.1.1.1
Rev: src/todo:1.1.1.1
Rev: src/types.h:1.1.1.1
Rev: src/ualarm.c:1.1.1.1

1:   /*\ - ||| This file a part of uLPC, and is copyright by Fredrik Hubinette - ||| uLPC is distributed as GPL (General Public License) + ||| 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 <math.h>   #include "global.h"   #include "interpret.h"   #include "svalue.h" - #include "list.h" + #include "multiset.h"   #include "mapping.h"   #include "array.h"   #include "stralloc.h"
16:   #include "language.h"   #include "memory.h"   #include "error.h" + #include "docode.h" + #include "constants.h" + #include "peep.h" + #include "lex.h" + #include "program.h" + #include "object.h"    - #define COMPARISON(ID,EXPR) \ - void ID() \ + #define COMPARISON(ID,NAME,EXPR) \ + void ID(INT32 args) \   { \ -  int i=EXPR; \ +  int i; \ +  if(args > 2) \ +  pop_n_elems(args-2); \ +  else if(args < 2) \ +  error("Too few arguments to %s\n",NAME); \ +  i=EXPR; \    pop_n_elems(2); \ -  sp->type=T_INT; \ -  sp->u.integer=i; \ -  sp++; \ +  push_int(i); \   }    - COMPARISON(f_eq, is_eq(sp-2,sp-1)) - COMPARISON(f_ne,!is_eq(sp-2,sp-1)) - COMPARISON(f_lt, is_lt(sp-2,sp-1)) - COMPARISON(f_le,!is_gt(sp-2,sp-1)) - COMPARISON(f_gt, is_gt(sp-2,sp-1)) - COMPARISON(f_ge,!is_lt(sp-2,sp-1)) + COMPARISON(f_eq,"`==", is_eq(sp-2,sp-1)) + COMPARISON(f_ne,"`!=",!is_eq(sp-2,sp-1)) + COMPARISON(f_lt,"`<" , is_lt(sp-2,sp-1)) + COMPARISON(f_le,"`<=",!is_gt(sp-2,sp-1)) + COMPARISON(f_gt,"`>" , is_gt(sp-2,sp-1)) + COMPARISON(f_ge,"`>=",!is_lt(sp-2,sp-1))    - void f_sum(INT32 args) +  + #define CALL_OPERATOR(OP, args) \ +  if(!sp[-args].u.object->prog) \ +  error("Operator %s called in destructed object.\n",lfun_names[OP]); \ +  if(sp[-args].u.object->prog->lfuns[OP] == -1) \ +  error("No operator %s in object.\n",lfun_names[OP]); \ +  apply_lfun(sp[-args].u.object, OP, args-1); \ +  free_svalue(sp-2); \ +  sp[-2]=sp[-1]; \ +  sp--; +  +  + void f_add(INT32 args)   {    INT32 e,size;    TYPE_FIELD types;
50:    switch(sp[-args].type)    {    case T_OBJECT: +  CALL_OPERATOR(LFUN_ADD,args); +  return; +     case T_PROGRAM:    case T_FUNCTION:    error("Bad argument 1 to summation\n");
60:       case BIT_STRING:    { -  struct lpc_string *r; +  struct pike_string *r;    char *buf;    -  if(args==1) return; +  switch(args) +  { +  case 1: return; +  default:    size=0; -  +     for(e=-args;e<0;e++) size+=sp[e].u.string->len;    -  if(args==2) -  { -  r=add_shared_strings(sp[-2].u.string,sp[-1].u.string); -  }else{ +     r=begin_shared_string(size);    buf=r->str;    for(e=-args;e<0;e++)    { -  + #if 1 +  int q; +  for(q=0;q<sp[e].u.string->len;q++) +  buf[q]=sp[e].u.string->str[q]; + #else    MEMCPY(buf,sp[e].u.string->str,sp[e].u.string->len); -  + #endif    buf+=sp[e].u.string->len;    }    r=end_shared_string(r);    } -  for(e=-args;e<0;e++) -  { -  free_string(sp[e].u.string); -  } +  +  for(e=-args;e<0;e++) free_string(sp[e].u.string);    sp-=args;    push_string(r);    break;
94:    case BIT_STRING | BIT_FLOAT:    case BIT_STRING | BIT_FLOAT | BIT_INT:    { -  struct lpc_string *r; +  struct pike_string *r;    char *buf,*str;    size=0;    for(e=-args;e<0;e++)
161:    break;    }    +  case BIT_FLOAT | BIT_INT: +  { +  FLOAT_TYPE sum; +  sum=0.0; +  for(e=-args; e<0; e++) +  { +  if(sp[e].type==T_FLOAT) +  { +  sum+=sp[e].u.float_number; +  }else{ +  sum+=(FLOAT_TYPE)sp[e].u.integer; +  } +  } +  sp-=args-1; +  sp[-1].type=T_FLOAT; +  sp[-1].u.float_number=sum; +  break; +  } +     case BIT_ARRAY:    {    struct array *a;
180:    break;    }    -  case BIT_LIST: +  case BIT_MULTISET:    { -  struct list *l; +  struct multiset *l;    -  l = add_lists(sp - args, args); +  l = add_multisets(sp - args, args);    pop_n_elems(args); -  push_list(l); +  push_multiset(l);    break;    }    }   }    - void f_add() { f_sum(2); } + static int generate_sum(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),0); +  return 1;    - void f_subtract() +  case 2: +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_ADD); +  return 1; +  +  default: +  return 0; +  } + } +  + static node *optimize_binary(node *n)   { -  if (sp[-2].type != sp[-1].type ) +  node **first_arg, **second_arg, *ret; +  if(count_args(CDR(n))==2) +  { +  first_arg=my_get_arg(&CDR(n), 0); +  second_arg=my_get_arg(&CDR(n), 1); +  + #ifdef DEBUG +  if(!first_arg || !second_arg) +  fatal("Couldn't find argument!\n"); + #endif +  +  if((*second_arg)->type == (*first_arg)->type && +  compile_type_to_runtime_type((*second_arg)->type) != T_MIXED) +  { +  if((*first_arg)->token == F_APPLY && +  CAR(*first_arg)->token == F_CONSTANT && +  is_eq(& CAR(*first_arg)->u.sval, & CAR(n)->u.sval)) +  { +  ret=mknode(F_APPLY, +  CAR(n), +  mknode(F_ARG_LIST, +  CDR(*first_arg), +  *second_arg)); +  CAR(n)=0; +  CDR(*first_arg)=0; +  *second_arg=0; +  +  return ret; +  } +  +  if((*second_arg)->token == F_APPLY && +  CAR(*second_arg)->token == F_CONSTANT && +  is_eq(& CAR(*second_arg)->u.sval, & CAR(n)->u.sval)) +  { +  ret=mknode(F_APPLY, +  CAR(n), +  mknode(F_ARG_LIST, +  *first_arg, +  CDR(*second_arg))); +  CAR(n)=0; +  *first_arg=0; +  CDR(*second_arg)=0; +  +  return ret; +  } +  } +  } +  return 0; + } +  +  + static int generate_comparison(node *n) + { +  if(count_args(CDR(n))==2) +  { +  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); +  else if(CAR(n)->u.sval.u.efun->function == f_ne) +  emit2(F_NE); +  else if(CAR(n)->u.sval.u.efun->function == f_lt) +  emit2(F_LT); +  else if(CAR(n)->u.sval.u.efun->function == f_le) +  emit2(F_LE); +  else if(CAR(n)->u.sval.u.efun->function == f_gt) +  emit2(F_GT); +  else if(CAR(n)->u.sval.u.efun->function == f_ge) +  emit2(F_GE); +  else +  fatal("Couldn't generate comparison!\n"); +  return 1; +  } +  return 0; + } +  + static int float_promote() + { +  if(sp[-2].type==T_INT) +  { +  sp[-2].u.float_number=(FLOAT_TYPE)sp[-2].u.integer; +  sp[-2].type=T_FLOAT; +  } +  +  if(sp[-1].type==T_INT) +  { +  sp[-1].u.float_number=(FLOAT_TYPE)sp[-1].u.integer; +  sp[-1].type=T_FLOAT; +  } +  +  return sp[-2].type == sp[-1].type; + } +  + void o_subtract() + { +  if (sp[-2].type != sp[-1].type && +  !float_promote() && +  sp[-2].type != T_OBJECT)    error("Subtract on different types.\n");    -  switch(sp[-1].type) +  switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_SUBTRACT,2); +  break; +     case T_ARRAY:    {    struct array *a;
222:    return;    }    -  case T_LIST: +  case T_MULTISET:    { -  struct list *l; -  l=merge_lists(sp[-2].u.list, sp[-1].u.list, OP_SUB); +  struct multiset *l; +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, OP_SUB);    pop_n_elems(2); -  push_list(l); +  push_multiset(l);    return;    }   
243:       case T_STRING:    { -  struct lpc_string *s,*ret; -  sp--; +  struct pike_string *s,*ret;    s=make_shared_string(""); -  ret=string_replace(sp[-1].u.string,sp[0].u.string,s); +  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(sp[0].u.string); +     free_string(s); -  sp[-1].u.string=ret; +  sp[-2].u.string=ret; +  sp--;    return;    }   
259:    }   }    - void f_and() + void f_minus(INT32 args)   { -  if(sp[-1].type != sp[-2].type) +  switch(args) +  { +  case 0: error("Too few arguments to `-\n"); +  case 1: o_negate(); break; +  case 2: o_subtract(); break; +  default: error("Too many arguments to `-\n"); +  } + } +  + static int generate_minus(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_NEGATE); +  return 1; +  +  case 2: +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_SUBTRACT); +  return 1; +  } +  return 0; + } +  + void o_and() + { +  if(sp[-1].type != sp[-2].type && +  sp[-2].type != T_OBJECT)    error("Bitwise and on different types.\n");       switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_AND,2); +  break; +     case T_INT:    sp--;    sp[-1].u.integer &= sp[0].u.integer;
280:    return;    }    -  case T_LIST: +  case T_MULTISET:    { -  struct list *l; -  l=merge_lists(sp[-2].u.list, sp[-1].u.list, OP_AND); +  struct multiset *l; +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, OP_AND);    pop_n_elems(2); -  push_list(l); +  push_multiset(l);    return;    }   
302:    }   }    - void f_or() + void f_and(INT32 args)   { -  if(sp[-1].type != sp[-2].type) +  switch(args) +  { +  case 0: error("Too few arguments to `&\n"); +  case 1: return; +  case 2: o_and(); return; +  default: +  if(sp[-args].type == T_OBJECT) +  { +  CALL_OPERATOR(LFUN_AND, args); +  }else{ +  while(--args > 0) o_and(); +  } +  } + } +  + static int generate_and(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),0); +  return 1; +  +  case 2: +  do_docode(CDR(n),0); +  emit2(F_AND); +  return 1; +  +  default: +  return 0; +  } + } +  + void o_or() + { +  if(sp[-1].type != sp[-2].type && +  sp[-2].type != T_OBJECT)    error("Bitwise or on different types.\n");       switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_OR,2); +  break; +     case T_INT:    sp--;    sp[-1].u.integer |= sp[0].u.integer;
323:    return;    }    -  case T_LIST: +  case T_MULTISET:    { -  struct list *l; -  l=merge_lists(sp[-2].u.list, sp[-1].u.list, OP_OR); +  struct multiset *l; +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, OP_OR);    pop_n_elems(2); -  push_list(l); +  push_multiset(l);    return;    }   
346:    }   }    - void f_xor() + void f_or(INT32 args)   { -  if(sp[-1].type != sp[-2].type) +  switch(args) +  { +  case 0: error("Too few arguments to `|\n"); +  case 1: return; +  case 2: o_or(); return; +  default: +  if(sp[-args].type==T_OBJECT) +  { +  CALL_OPERATOR(LFUN_OR, args); +  } else { +  while(--args > 0) o_or(); +  } +  } + } +  + static int generate_or(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),0); +  return 1; +  +  case 2: +  do_docode(CDR(n),0); +  emit2(F_OR); +  return 1; +  +  default: +  return 0; +  } + } +  +  + void o_xor() + { +  if(sp[-1].type != sp[-2].type && +  sp[-2].type != T_OBJECT)    error("Bitwise xor on different types.\n");       switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_XOR,2); +  break; +     case T_INT:    sp--;    sp[-1].u.integer ^= sp[0].u.integer;
367:    return;    }    -  case T_LIST: +  case T_MULTISET:    { -  struct list *l; -  l=merge_lists(sp[-2].u.list, sp[-1].u.list, OP_XOR); +  struct multiset *l; +  l=merge_multisets(sp[-2].u.multiset, sp[-1].u.multiset, OP_XOR);    pop_n_elems(2); -  push_list(l); +  push_multiset(l);    return;    }   
389:    }   }    - void f_lsh() + void f_xor(INT32 args)   { -  if(sp[-2].type != T_INT) error("Bad argument 1 to <<\n"); +  switch(args) +  { +  case 0: error("Too few arguments to `^\n"); +  case 1: return; +  case 2: o_xor(); return; +  default: +  if(sp[-args].type==T_OBJECT) +  { +  CALL_OPERATOR(LFUN_XOR, args); +  } else { +  while(--args > 0) o_xor(); +  } +  } + } +  + static int generate_xor(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),0); +  return 1; +  +  case 2: +  do_docode(CDR(n),0); +  emit2(F_XOR); +  return 1; +  +  default: +  return 0; +  } + } +  + void o_lsh() + { +  if(sp[-2].type != T_INT) +  { +  if(sp[-2].type == T_OBJECT) +  { +  CALL_OPERATOR(LFUN_LSH,2); +  return; +  } +  +  error("Bad argument 1 to <<\n"); +  }    if(sp[-1].type != T_INT) error("Bad argument 2 to <<\n");    sp--; -  sp[-1].u.integer <<= sp[0].u.integer; +  sp[-1].u.integer = sp[-1].u.integer << sp->u.integer;   }    - void f_rsh() + void f_lsh(INT32 args)   { -  if(sp[-2].type != T_INT) error("Bad argument 1 to >>\n"); +  if(args != 2) +  error("Bad number of args to `<<\n"); +  o_lsh(); + } +  + static int generate_lsh(node *n) + { +  if(count_args(CDR(n))==2) +  { +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_LSH); +  return 1; +  } +  return 0; + } +  + void o_rsh() + { +  if(sp[-2].type != T_INT) +  { +  if(sp[-2].type == T_OBJECT) +  { +  CALL_OPERATOR(LFUN_RSH,2); +  return; +  } +  error("Bad argument 1 to >>\n"); +  }    if(sp[-1].type != T_INT) error("Bad argument 2 to >>\n");    sp--; -  sp[-1].u.integer >>= sp[0].u.integer; +  sp[-1].u.integer = sp[-1].u.integer >> sp->u.integer;   }    - void f_multiply() + void f_rsh(INT32 args)   { -  switch(sp[-2].type) +  if(args != 2) +  error("Bad number of args to `>>\n"); +  o_rsh(); + } +  + static int generate_rsh(node *n)   { -  case T_ARRAY: -  if(sp[-1].type!=T_STRING) +  if(count_args(CDR(n))==2)    { -  error("Bad argument 2 to multiply.\n"); -  }else{ -  struct lpc_string *ret; +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_RSH); +  return 1; +  } +  return 0; + } +  +  + #define TWO_TYPES(X,Y) (((X)<<8)|(Y)) + void o_multiply() + { +  switch(TWO_TYPES(sp[-2].type,sp[-1].type)) +  { +  case TWO_TYPES(T_ARRAY,T_STRING): +  { +  struct pike_string *ret; +  ret=implode(sp[-2].u.array,sp[-1].u.string); +  free_string(sp[-1].u.string); +  free_array(sp[-2].u.array); +  sp[-2].type=T_STRING; +  sp[-2].u.string=ret;    sp--; -  ret=implode(sp[-1].u.array,sp[0].u.string); -  free_string(sp[0].u.string); -  free_array(sp[-1].u.array); -  sp[-1].type=T_STRING; -  sp[-1].u.string=ret; +     return;    }    -  case T_FLOAT: -  if(sp[-1].type!=T_FLOAT) error("Bad argument 2 to multiply.\n"); +  case TWO_TYPES(T_FLOAT,T_FLOAT):    sp--;    sp[-1].u.float_number *= sp[0].u.float_number;    return;    -  case T_INT: -  if(sp[-1].type!=T_INT) error("Bad argument 2 to multiply.\n"); +  case TWO_TYPES(T_FLOAT,T_INT):    sp--; -  +  sp[-1].u.float_number *= (FLOAT_TYPE)sp[0].u.integer; +  return; +  +  case TWO_TYPES(T_INT,T_FLOAT): +  sp--; +  sp[-1].u.float_number= +  (FLOAT_TYPE) sp[-1].u.integer * (FLOAT_TYPE)sp[0].u.float_number; +  sp[-1].type=T_FLOAT; +  return; +  +  case TWO_TYPES(T_INT,T_INT): +  sp--;    sp[-1].u.integer *= sp[0].u.integer;    return;       default: -  error("Bad argument 1 to multiply.\n"); +  if(sp[-2].type == T_OBJECT) +  { +  CALL_OPERATOR(LFUN_MULTIPLY,2); +  return;    } -  +  +  error("Bad arguments to multiply.\n");    } -  + }    - void f_divide() + void f_multiply(INT32 args)   { -  if(sp[-2].type!=sp[-1].type) +  switch(args) +  { +  case 0: error("Too few arguments to `*\n"); +  case 1: return; +  case 2: o_multiply(); return; +  default: +  if(sp[-args].type==T_OBJECT) +  { +  CALL_OPERATOR(LFUN_MULTIPLY, args); +  } else { +  while(--args > 0) o_multiply(); +  } +  } + } +  + static int generate_multiply(node *n) + { +  switch(count_args(CDR(n))) +  { +  case 1: +  do_docode(CDR(n),0); +  return 1; +  +  case 2: +  do_docode(CDR(n),0); +  emit2(F_MULTIPLY); +  return 1; +  +  default: +  return 0; +  } + } +  + void o_divide() + { +  if(sp[-2].type!=sp[-1].type && +  !float_promote() && +  sp[-2].type != T_OBJECT)    error("Division on different types.\n");       switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_DIVIDE,2); +  break; +     case T_STRING:    {    struct array *ret; -  sp--; -  ret=explode(sp[-1].u.string,sp[0].u.string); +  ret=explode(sp[-2].u.string,sp[-1].u.string); +  free_string(sp[-2].u.string);    free_string(sp[-1].u.string); -  free_string(sp[0].u.string); -  sp[-1].type=T_ARRAY; -  sp[-1].u.array=ret; +  sp[-2].type=T_ARRAY; +  sp[-2].u.array=ret; +  sp--;    return;    }   
479:    }   }    - void f_mod() + void f_divide(INT32 args)   { -  if(sp[-2].type != sp[-1].type) +  if(args != 2) +  error("Bad number of args to `/\n"); +  o_divide(); + } +  + static int generate_divide(node *n) + { +  if(count_args(CDR(n))==2) +  { +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_DIVIDE); +  return 1; +  } +  return 0; + } +  + void o_mod() + { +  if(sp[-2].type != sp[-1].type && +  !float_promote() && +  sp[-2].type != T_OBJECT)    error("Modulo on different types.\n");    -  switch(sp[-1].type) +  switch(sp[-2].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_MOD,2); +  break; +     case T_FLOAT:    {    FLOAT_TYPE foo;
508:    }   }    - void f_not() + void f_mod(INT32 args)   { -  if(sp[-1].type==T_INT) +  if(args != 2) +  error("Bad number of args to `%%\n"); +  o_mod(); + } +  + static int generate_mod(node *n)   { -  +  if(count_args(CDR(n))==2) +  { +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_MOD); +  return 1; +  } +  return 0; + } +  + void o_not() + { +  switch(sp[-1].type) +  { +  case T_INT:    sp[-1].u.integer = !sp[-1].u.integer; -  +  break; +  +  case T_FUNCTION: +  case T_OBJECT: +  if(IS_ZERO(sp-1)) +  { +  pop_stack(); +  push_int(1);    }else{    pop_stack(); -  sp->type=T_INT; -  sp->u.integer=0; -  sp++; +  push_int(0);    } -  +  break; +  +  default: +  free_svalue(sp-1); +  sp[-1].type=T_INT; +  sp[-1].u.integer=0;    } -  + }    - void f_compl() + void f_not(INT32 args)   { -  if (sp[-1].type != T_INT) error("Bad argument to ~\n"); +  if(args != 1) error("Bad number of args to `!\n"); +  o_not(); + } +  + static int generate_not(node *n) + { +  if(count_args(CDR(n))==1) +  { +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_NOT); +  return 1; +  } +  return 0; + } +  + void o_compl() + { +  switch(sp[-1].type) +  { +  case T_OBJECT: +  CALL_OPERATOR(LFUN_COMPL,1); +  break; +  +  case T_INT:    sp[-1].u.integer = ~ sp[-1].u.integer; -  +  break; +  +  case T_FLOAT: +  sp[-1].u.float_number = -1.0 - sp[-1].u.float_number; +  break; +  +  default: +  error("Bad argument to ~\n");    } -  + }    - void f_negate() + void f_compl(INT32 args)   { -  +  if(args != 1) error("Bad number of args to `~\n"); +  o_compl(); + } +  + static int generate_compl(node *n) + { +  if(count_args(CDR(n))==1) +  { +  do_docode(CDR(n),DO_NOT_COPY); +  emit2(F_COMPL); +  return 1; +  } +  return 0; + } +  + void o_negate() + {    switch(sp[-1].type)    { -  +  case T_OBJECT: +  CALL_OPERATOR(LFUN_SUBTRACT,1); +  break; +     case T_FLOAT:    sp[-1].u.float_number=-sp[-1].u.float_number;    return;
544:    }   }    -  - void f_range() + void o_range()   {    INT32 from,to;    if(sp[-2].type != T_INT)
564:    {    case T_STRING:    { -  struct lpc_string *s; +  struct pike_string *s;    if(to>=sp[-1].u.string->len-1)    {    if(from==0) return;
599:    error("[ .. ] can only be done on strings and arrays.\n");    }   } +  + void f_sizeof(INT32 args) + { +  INT32 tmp; +  if(args<1) +  error("Too few arguments to sizeof()\n"); +  +  tmp=pike_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); +  add_efun2("`!=",f_ne,"function(mixed,mixed:int)",OPT_TRY_OPTIMIZE,0,generate_comparison); +  add_efun2("`!",f_not,"function(mixed:int)",OPT_TRY_OPTIMIZE,0,generate_not); +  + #define CMP_TYPE "function(object,mixed:int)|function(mixed,object:int)|function(int|float,int|float:int)|function(string,string:int)" +  add_efun2("`<", f_lt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison); +  add_efun2("`<=",f_le,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison); +  add_efun2("`>", f_gt,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison); +  add_efun2("`>=",f_ge,CMP_TYPE,OPT_TRY_OPTIMIZE,0,generate_comparison); +  +  add_efun2("`+",f_add,"function(object,mixed...:mixed)|function(int...:int)|!function(int...:mixed)&function(int|float...:float)|!function(int|float...:mixed)&function(string|int|float...:string)|function(array...:array)|function(mapping...:mapping)|function(multiset...:multiset)",OPT_TRY_OPTIMIZE,optimize_binary,generate_sum); +  +  add_efun2("`-",f_minus,"function(object,mixed...:mixed)|function(int:int)|function(float:float)|function(array,array:array)|function(mapping,mapping:mapping)|function(multiset,multiset:multiset)|function(float|int,float:float)|function(float,int:float)|function(int,int:int)|function(string,string:string)",OPT_TRY_OPTIMIZE,0,generate_minus); +  + #define LOG_TYPE "function(object,mixed...:mixed)|function(int...:int)|function(mapping...:mapping)|function(multiset...:multiset)|function(array...:array)" +  +  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(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_multiply,"function(object,mixed...:mixed)|function(int...:int)|!function(int...:mixed)&function(float|int...:float)|function(string*,string:string)",OPT_TRY_OPTIMIZE,optimize_binary,generate_multiply); +  +  add_efun2("`/",f_divide,"function(object,mixed:mixed)|function(int,int:int)|function(float|int,float:float)|function(float,int:float)|function(string,string:string*)",OPT_TRY_OPTIMIZE,0,generate_divide); +  +  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|multiset|array|mapping|object:int)",0,0,generate_sizeof); + }