diff --git a/ijvm.c b/ijvm.c index 4827882..5ee6aa2 100644 --- a/ijvm.c +++ b/ijvm.c @@ -361,7 +361,8 @@ main (int argc, char *argv[]) fprintf (stderr, "Usage: ijvm [OPTION] FILENAME [PARAMETERS ...]\n\n"); fprintf (stderr, "Where OPTION is\n\n"); fprintf (stderr, " -s Silent mode. No snapshot is produced.\n"); - fprintf (stderr, " -f SPEC-FILE The IJVM specification file to use.\n\n"); + fprintf (stderr, " -f SPEC-FILE The IJVM specification file to use.\n"); + fprintf (stderr, " -l LEN Stack output length. Default 20.\n\n"); fprintf (stderr, "If you pass `-' as the filename the simulator will read the bytecode\nfile from stdin.\n\n"); fprintf (stderr, "You must specify as many arguments as your main method requires, except\n"); fprintf (stderr, "one; the simulator will pass the initial object reference for you.\n"); @@ -375,6 +376,24 @@ main (int argc, char *argv[]) argc = argc - 1; } + int stacksize = 20; + if (strcmp (argv[1], "-l") == 0) { + argv = argv + 1; + argc = argc - 1; + if (argc < 2 || !*argv[1]) { + fprintf (stderr, "No argument to -l given.\n"); + exit (-1); + } + char *c; + stacksize = strtol(argv[1], &c, 0); + if (c == NULL) { + fprintf (stderr, "Non-numeric argument to -l given.\n"); + exit (-1); + } + argv = argv + 1; + argc = argc - 1; + } + if (strcmp (argv[1], "-") == 0) file = stdin; else @@ -394,19 +413,18 @@ main (int argc, char *argv[]) } /* This is the interpreter main loop. It essentially excecutes - * ijvm_execute_opcode until the program terminates (which is when - * an ireturn from main is encountered). In each step, the - * instruction, its arguments and the top 8 elements on the stack - * are printed. */ + * ijvm_execute_opcode until the program terminates (which is when an ireturn + * from main is encountered). In each step, the instruction, its arguments + * and the top stacksize elements on the stack are printed. */ if (verbose) - ijvm_print_stack (i->stack + i->sp, MIN (i->sp - i->initial_sp, 8), TRUE); + ijvm_print_stack (i->stack + i->sp, MIN (i->sp - i->initial_sp, stacksize), TRUE); while (ijvm_active (i)) { if (verbose) ijvm_print_snapshot (i->method + i->pc); ijvm_execute_opcode (i); if (verbose) - ijvm_print_stack (i->stack + i->sp, MIN (i->sp - i->initial_sp, 8), FALSE); + ijvm_print_stack (i->stack + i->sp, MIN (i->sp - i->initial_sp, stacksize), FALSE); } ijvm_print_result (i);