FIRTH%TARTAN@CMU-CS-C.ARPA (03/29/84)
The way one is supposed to call a routine from within Dbx is call routine ( arg1, ... ) Unfortunately, there are several problems. First, such an attempt crashes. This is due to a bug in "runtime.c", routine "callproc". The last statement reads cont(); which invokes routine "cont" in "process.c" with a junk actual parameter. It may be fixed to cont(0); and the call then works. However, the called routine behaves oddly with regard to breakpoints. Any breakpoint of the form "stop in FUNC" will be ignored; any of the form "stop at LINE" will be obeyed. We are still trying to find out why - stay tuned. Finally, the call performs a "compatibility" check on formal and actual arguments. There are a lot of things that can go wrong here, most of which concern the types attached to literals by dbx. The simplest and perhaps most dangerous solution is to bypass the type checking: In "runtime.c", routine "pushargs" change argc = evalargs(proc, arglist); to argc = unsafe_evalargs(proc, arglist); Add a new routine private Integer unsafe_evalargs(proc, arglist) Symbol proc; Node arglist; { Node p; Integer count; count = 0; for (p = arglist; p != nil; p = p->value.arg[1]) { eval(p->value.arg[0]); ++count; } return count; } This simply pushes as many args as you provide, as plain values. If you are adhering to the Vax convention that all args are exactly one longword in size, then this should work. It should also work most of the time for non-standard actions such as passing Double parameters by immediate value, provided the called routine knows exactly what to expect. Please feel free to mail enquiries direct. Robert Firth -------