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: + #include "global.h" + #include "types.h" + #include "language.h" + #include "stralloc.h" + #include "dynamic_buffer.h" + #include "program.h" + #include "las.h" + #include "docode.h" + #include "main.h" + #include "error.h" + #include "lex.h"    -  + struct p_instr_s + { +  short opcode; +  short line; +  struct pike_string *file; +  INT32 arg; + }; +  + typedef struct p_instr_s p_instr; +  + dynamic_buffer instrbuf; +  + static int hasarg(int opcode) + { +  switch(opcode) +  { +  case F_NUMBER: +  case F_NEG_NUMBER: +  case F_CALL_LFUN: +  case F_CALL_LFUN_AND_POP: +  case F_SSCANF: +  case F_POP_N_ELEMS: +  +  case F_SIZEOF_LOCAL: +  +  case F_ASSIGN_GLOBAL: +  case F_ASSIGN_GLOBAL_AND_POP: +  case F_ASSIGN_LOCAL: +  case F_ASSIGN_LOCAL_AND_POP: +  case F_GLOBAL_LVALUE: +  case F_LOCAL_LVALUE: +  case F_CLEAR_LOCAL: +  case F_LOCAL: +  case F_GLOBAL: +  +  case F_INC_LOCAL: +  case F_DEC_LOCAL: +  case F_POST_INC_LOCAL: +  case F_POST_DEC_LOCAL: +  case F_INC_LOCAL_AND_POP: +  case F_DEC_LOCAL_AND_POP: +  +  case F_LFUN: +  case F_STRING: +  case F_STRING_INDEX: +  case F_LOCAL_INDEX: +  case F_POS_INT_INDEX: +  case F_NEG_INT_INDEX: +  case F_CONSTANT: +  case F_SWITCH: +  case F_APPLY: +  case F_CATCH: +  +  case F_BRANCH: +  case F_BRANCH_WHEN_ZERO: +  case F_BRANCH_WHEN_NON_ZERO: +  +  case F_BRANCH_WHEN_EQ: +  case F_BRANCH_WHEN_NE: +  case F_BRANCH_WHEN_LT: +  case F_BRANCH_WHEN_LE: +  case F_BRANCH_WHEN_GT: +  case F_BRANCH_WHEN_GE: +  +  case F_FOREACH: +  case F_INC_LOOP: +  case F_DEC_LOOP: +  case F_INC_NEQ_LOOP: +  case F_DEC_NEQ_LOOP: +  +  case F_LAND: +  case F_LOR: +  +  case F_ALIGN: +  case F_POINTER: +  case F_LABEL: +  return 1; +  +  default: +  return 0; +  } + } +  + void init_bytecode() + { +  low_init_buf(&instrbuf); + } +  + void exit_bytecode() + { +  INT32 e,length; +  p_instr *c; +  +  c=(p_instr *)instrbuf.s.str; +  length=instrbuf.s.len / sizeof(p_instr); +  +  for(e=0;e<length;e++) free_string(c->file); +  +  toss_buffer(&instrbuf); + } +  + int insert_opcode(unsigned int f, +  INT32 b, +  INT32 current_line, +  struct pike_string *current_file) + { +  p_instr *p; +  + #ifdef DEBUG +  if(!hasarg(f) && b) +  fatal("hasarg() is wrong!\n"); + #endif +  +  p=(p_instr *)low_make_buf_space(sizeof(p_instr), &instrbuf); +  +  + #ifdef DEBUG +  if(!instrbuf.s.len) +  fatal("Low make buf space failed!!!!!!\n"); + #endif +  +  p->opcode=f; +  p->line=current_line; +  copy_shared_string(p->file, current_file); +  p->arg=b; +  +  return p - (p_instr *)instrbuf.s.str; + } +  + int insert_opcode2(int f,int current_line, struct pike_string *current_file) + { + #ifdef DEBUG +  if(hasarg(f)) +  fatal("hasarg() is wrong!\n"); + #endif +  return insert_opcode(f,0,current_line, current_file); + } +  + void update_arg(int instr,INT32 arg) + { +  p_instr *p; + #ifdef DEBUG +  if(instr > (long)instrbuf.s.len / (long)sizeof(p_instr) || instr < 0) +  fatal("update_arg outside known space.\n"); + #endif +  p=(p_instr *)instrbuf.s.str; +  p[instr].arg=arg; + } +  +  + /**** Bytecode Generator *****/ +  + void ins_f_byte(unsigned int b) + { +  if(store_linenumbers && b<F_MAX_OPCODE) +  ADD_COMPILED(b); +  +  b-=F_OFFSET; +  if(b>255) +  { +  switch(b >> 8) +  { +  case 1: ins_f_byte(F_ADD_256); break; +  case 2: ins_f_byte(F_ADD_512); break; +  case 3: ins_f_byte(F_ADD_768); break; +  case 4: ins_f_byte(F_ADD_1024); break; +  default: +  ins_f_byte(F_ADD_256X); +  ins_byte(b/256,A_PROGRAM); +  } +  b&=255; +  } +  ins_byte((unsigned char)b,A_PROGRAM); + } +  + static void ins_f_byte_with_arg(unsigned int a,unsigned INT32 b) + { +  switch(b >> 8) +  { +  case 0 : break; +  case 1 : ins_f_byte(F_PREFIX_256); break; +  case 2 : ins_f_byte(F_PREFIX_512); break; +  case 3 : ins_f_byte(F_PREFIX_768); break; +  case 4 : ins_f_byte(F_PREFIX_1024); break; +  default: +  if( b < 256*256) +  { +  ins_f_byte(F_PREFIX_CHARX256); +  ins_byte(b>>8, A_PROGRAM); +  }else if(b < 256*256*256) { +  ins_f_byte(F_PREFIX_WORDX256); +  ins_byte(b >> 16, A_PROGRAM); +  ins_byte(b >> 8, A_PROGRAM); +  }else{ +  ins_f_byte(F_PREFIX_24BITX256); +  ins_byte(b >> 24, A_PROGRAM); +  ins_byte(b >> 16, A_PROGRAM); +  ins_byte(b >> 8, A_PROGRAM); +  } +  } +  ins_f_byte(a); +  ins_byte(b, A_PROGRAM); + } +  + void assemble() + { +  INT32 e,d,length,max_label,tmp; +  INT32 *labels, *jumps, *point; +  p_instr *c; +  +  c=(p_instr *)instrbuf.s.str; +  length=instrbuf.s.len / sizeof(p_instr); +  +  max_label=0; +  for(e=0;e<length;e++,c++) +  if(c->opcode == F_LABEL) +  if(c->arg > max_label) +  max_label = c->arg; +  +  +  labels=(INT32 *)xalloc(sizeof(INT32) * (max_label+1)); +  jumps=(INT32 *)xalloc(sizeof(INT32) * (max_label+1)); +  point=(INT32 *)xalloc(sizeof(INT32) * (max_label+1)); +  +  for(e=0;e<=max_label;e++) point[e]=labels[e]=jumps[e]=-1; +  +  c=(p_instr *)instrbuf.s.str; +  for(e=0;e<length;e++) +  { + #ifdef DEBUG +  if(a_flag > 2 && store_linenumbers) +  { +  if(hasarg(c->opcode)) +  fprintf(stderr,"===%3d %4x %s(%d)\n",c->line,PC,get_token_name(c->opcode),c->arg); +  else +  fprintf(stderr,"===%3d %4x %s\n",c->line,PC,get_token_name(c->opcode)); +  } + #endif +  +  if(store_linenumbers) +  store_linenumber(c->line, c->file); +  +  switch(c->opcode) +  { +  case F_ALIGN: +  while(PC % c->arg) ins_byte(0, A_PROGRAM); +  break; +  +  case F_LABEL: + #ifdef DEBUG +  if(c->arg > max_label || c->arg < 0) +  fatal("max_label calculation failed!\n"); +  +  if(labels[c->arg] != -1) +  fatal("Duplicate label!\n"); + #endif +  labels[c->arg]=PC; +  +  for(d=1;e+d<length;d++) +  { +  switch(c[d].opcode) +  { +  case F_LABEL: continue; +  case F_BRANCH: point[c->arg]=c[d].arg; +  } +  break; +  } +  break; +  +  case F_BRANCH_WHEN_EQ: +  case F_BRANCH_WHEN_NE: +  case F_BRANCH_WHEN_LT: +  case F_BRANCH_WHEN_LE: +  case F_BRANCH_WHEN_GT: +  case F_BRANCH_WHEN_GE: +  case F_BRANCH_WHEN_ZERO: +  case F_BRANCH_WHEN_NON_ZERO: +  case F_BRANCH: +  case F_INC_LOOP: +  case F_DEC_LOOP: +  case F_INC_NEQ_LOOP: +  case F_DEC_NEQ_LOOP: +  case F_LAND: +  case F_LOR: +  case F_CATCH: +  case F_FOREACH: +  ins_f_byte(c->opcode); +  +  case F_POINTER: + #ifdef DEBUG +  if(c->arg > max_label || c->arg < 0) fatal("Jump to unknown label?\n"); + #endif +  tmp=PC; +  ins_int(jumps[c->arg],A_PROGRAM); +  jumps[c->arg]=tmp; +  break; +  +  case F_APPLY: +  ins_f_byte(c->arg + F_MAX_OPCODE); +  break; +  +  default: +  if(hasarg(c->opcode)) +  ins_f_byte_with_arg(c->opcode, c->arg); +  else +  ins_f_byte(c->opcode); +  break; +  } +  +  c++; +  } +  +  for(e=0;e<=max_label;e++) +  { +  int tmp2; +  tmp2=e; +  while(point[tmp2]!=-1) tmp2=point[tmp2]; +  tmp2=labels[tmp2]; +  +  while(jumps[e]!=-1) +  { + #ifdef DEBUG +  if(labels[e]==-1) +  fatal("Hyperspace error: unknown jump point.\n"); + #endif +  tmp=read_int(jumps[e]); +  upd_int(jumps[e], tmp2 - jumps[e]); +  jumps[e]=tmp; +  } +  } +  +  free((char *)labels); +  free((char *)jumps); +  free((char *)point); +  +  exit_bytecode(); + } +  + /**** Peephole optimizer ****/ +  + static int fifo_len, eye,len; + static p_instr *instructions; +  + #ifdef DEBUG + static void debug() + { +  p_instr *p; +  +  if(fifo_len > (long)instrbuf.s.len / (long)sizeof(p_instr)) +  fatal("Fifo too long.\n"); +  +  if(eye < 0) +  fatal("Popped beyond start of code.\n"); +  +  if(instrbuf.s.len) +  { +  p=(p_instr *)low_make_buf_space(0, &instrbuf); +  if(!p[-1].file) +  fatal("No file name on last instruction!\n"); +  } + } + #else + #define debug() + #endif +  +  + static p_instr *instr(int offset) + { +  p_instr *p; +  +  debug(); +  +  if(offset >= 0) +  { +  if(offset < fifo_len) +  { +  p=(p_instr *)low_make_buf_space(0, &instrbuf); +  p-=fifo_len; +  p+=offset; +  return p; +  }else{ +  offset-=fifo_len; +  offset+=eye; +  if(offset >= len) return 0; +  return instructions+offset; +  } +  }else{ +  fatal("Can't handle negative offsets in peephole optimizer!\n"); +  } + } +  + static int opcode(int offset) + { +  p_instr *a; +  a=instr(offset); +  if(a) return a->opcode; +  return -1; + } +  + static int argument(int offset) + { +  p_instr *a; +  a=instr(offset); +  if(a) return a->arg; +  return -1; + } +  + static void advance() + { +  if(fifo_len) +  { +  fifo_len--; +  }else{ +  p_instr *p; +  if(p=instr(0)) +  insert_opcode(p->opcode, p->arg, p->line, p->file); +  eye++; +  } +  debug(); + } +  + static void pop_n_opcodes(int n) + { +  while(n>0) +  { +  if(fifo_len) +  { +  p_instr *p; +  + #ifdef DEBUG +  if(instrbuf.s.len <= 0) +  fatal("Popping out of opcodes.\n"); + #endif +  low_make_buf_space(-sizeof(p_instr), &instrbuf); +  p=(p_instr *)low_make_buf_space(0, &instrbuf); +  +  free_string(p->file); +  fifo_len--; +  }else{ +  eye++; +  } +  n--; +  } + } +  + #define insert(X,Y) insert_opcode((X),(Y),current_line, current_file),dofix() + #define insert2(X) insert_opcode2((X),current_line, current_file),dofix() +  + static void dofix() + { +  p_instr *p,tmp; +  int e; +  +  if(fifo_len) +  { +  p=(p_instr *)low_make_buf_space(0, &instrbuf); +  tmp=p[-1]; +  for(e=0;e<fifo_len;e++) +  p[-1-e]=p[-2-e]; +  p[-1-e]=tmp; +  } + } +  +  + void asm_opt() + { + #ifdef DEBUG +  if(a_flag > 3) +  { +  p_instr *c; +  INT32 e,length; +  c=(p_instr *)instrbuf.s.str; +  length=instrbuf.s.len / sizeof(p_instr); +  +  fprintf(stderr,"Optimization begins: \n"); +  for(e=0;e<length;e++,c++) +  { +  if(hasarg(c->opcode)) +  fprintf(stderr,"---%3d: %s(%d)\n",c->line,get_token_name(c->opcode),c->arg); +  else +  fprintf(stderr,"---%3d: %s\n",c->line,get_token_name(c->opcode)); +  } +  } + #endif +  + #include "peep_engine.c" +  +  + #ifdef DEBUG +  if(a_flag > 4) +  { +  p_instr *c; +  INT32 e,length; +  c=(p_instr *)instrbuf.s.str; +  length=instrbuf.s.len / sizeof(p_instr); +  +  fprintf(stderr,"Optimization begins: \n"); +  for(e=0;e<length;e++,c++) +  { +  if(hasarg(c->opcode)) +  fprintf(stderr,">>>%3d: %s(%d)\n",c->line,get_token_name(c->opcode),c->arg); +  else +  fprintf(stderr,">>>%3d: %s\n",c->line,get_token_name(c->opcode)); +  } +  } + #endif + } +    Newline at end of file added.