Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/releases/release-110.37/READMES/110.29-README
ViewVC logotype

Annotation of /sml/releases/release-110.37/READMES/110.29-README

Parent Directory Parent Directory | Revision Log Revision Log


Revision 687 - (view) (download)
Original Path: sml/trunk/READMES/110.29-README

1 : blume 687
2 :     S M L / N J
3 :    
4 :     1 1 0 . 2 9 N E W S
5 :    
6 :     July 18, 2000
7 :    
8 :     WARNING
9 :    
10 :     This version is intended for compiler hackers.
11 :     We are in the midst of substantial structural changes,
12 :     and this is a snapshot.
13 :    
14 :     http://cm.bell-labs.com/cm/cs/what/smlnj/index.html
15 :    
16 :     ------------------------------------------------------------------------
17 :     Summary:
18 :    
19 :     * Improvements to MLRISC, many of them unrelated to SML/NJ.
20 :    
21 :     * CM:
22 :     - implicit anchors are no longer supported; all anchored paths must
23 :     now start with a dollar symbol $
24 :     - generally improved internal pathname handling; rationalized
25 :     pathname encoding (and reporting)
26 :     - support for anchor environments ("bind"-parameter for "cm" class)
27 :     - autoloading of libraries made lazier; this results in smaller
28 :     initial heap images when many libraries are pre-registered;
29 :     + $smlnj/compiler.cm now pre-registered
30 :     + $smlnj/cm/minimal.cm gone
31 :     + $smlnj/cm.cm (= $smlnj/cm/full.cm) pre-registered
32 :     - CM.sources as a generalization of CM.makedepend (which has been dropped)
33 :     - slight changes to TOOLS API
34 :     - "setup"-parameter for "sml" class
35 :     - "subdir"- and "witness"-parameters for "noweb" class
36 :     - "sigoptions"- and "smloptions"-parameters for "mlyacc" class
37 :     - Many enhancements to the CM manual; all of the above is documented.
38 :    
39 :     * support for back-tracing (with help from a new instrumentation pass
40 :     to be used during debug sessions)
41 :     - see "details" below
42 :    
43 :     * fixed some bugs in installation scripts
44 :    
45 :     ======================================================================
46 :     Details of changes (mostly directly snipped from the HISTORY file)
47 :    
48 :     ======================================================================
49 :     MLRISC:
50 :     ======================================================================
51 :    
52 :     Fermin has found a few assembly problems with constant expressions
53 :     generated in LabelExp. Mostly, the problems involve extra parentheses,
54 :     which choke on dumb assemblers.
55 :    
56 :     --
57 :    
58 :     Various bug fixes and new features for C--, Moby and MLRISC optimizations.
59 :     None of these affect SML/NJ.
60 :    
61 :     1. Register Allocation
62 :    
63 :     a. A new ra spilling module (ra/ra-spill-with-renaming) is implemented.
64 :     This module tries to remove local (i.e. basic block level) redundancies
65 :     during spilling.
66 :    
67 :     b. A new framework for performing region based register allocation.
68 :     Not yet entirely functional.
69 :    
70 :     2. X86
71 :    
72 :     a. DefUse for POP was missing the stack pointer [found by Lal]
73 :     b. Reload for CALL was incorrect in X86Spill [found by John]
74 :     c. Various fixes in X86Spill so that it can be used correctly for
75 :     the new spilling module.
76 :    
77 :     3. SSA/IR
78 :    
79 :     a. New module ir/dj-dataflow.sml implements elimination based
80 :     data flow analysis.
81 :    
82 :     4. MLRiscGen
83 :    
84 :     a. Fix for gc type annotation
85 :    
86 :     5. MDGen
87 :    
88 :     Various fixes for machine description -> ml code translation. For ssa
89 :     only.
90 :    
91 :     --
92 :    
93 :     1. Alpha
94 :    
95 :     Slight cleanup. Removed the instruction SGNXL
96 :    
97 :     2. X86
98 :    
99 :     Added the following instructions to the instruction set:
100 :    
101 :     ROLx, RORx,
102 :     BTx, BTSx, BTLx, BTRx,
103 :     XCHGx, and variants with the LOCK prefix
104 :    
105 :     3. Register Allocation
106 :    
107 :     The module ra-rewrite-with-renaming has been improved.
108 :    
109 :     These have no effect on SML/NJ.
110 :    
111 :     --
112 :    
113 :     Fixed a bug in freezing phase of the register allocator.
114 :    
115 :     --
116 :    
117 :     None of these things should affect normal SML/NJ operations
118 :    
119 :     1. Peephole improvements provided by Fermin (c--)
120 :     2. New annotation DEFUSE for adding extra dependence (moby)
121 :     3. New X86 LOCK instructions (moby)
122 :     4. New machine description language for reservation tables (scheduling)
123 :     5. Fixes to various optimization/analysis modules (branch chaining, dominator
124 :     trees etc.)
125 :     6. I've changed the CM files so that they can work with versions
126 :     110.0.6, 110.25 and 110.28
127 :    
128 :     --
129 :    
130 :     x86 Peephole fix by Fermin. Affects c-- and moby only.
131 :    
132 :     --
133 :    
134 :     1. x86 peephole improvement sp += k; sp -= k => nop [from John]
135 :     2. fix to x86 RET bug [found by Dan Grossman]
136 :     3. sparc assembly bug fix for ticc instructions [found by Fermin]
137 :    
138 :     Affects c-- and moby only
139 :    
140 :     ======================================================================
141 :     CM
142 :     ======================================================================
143 :    
144 :     Added function CM.sources as a generalized version of the earlier
145 :     CM.makedepend. This entails the following additional changes:
146 :    
147 :     - CM.makedepend has been dropped.
148 :     - TOOLS signature and API have been changed.
149 :    
150 :     --
151 :    
152 :     Preparation for fading out support for "implicitly anchored path
153 :     names". I went through all sources and used the explicit (and
154 :     relatively new) $-notation.
155 :    
156 :     Modified the anchoring scheme for some things such as "smlnj",
157 :     "MLRISC", "cm", etc. to take advantage of the fact that explicit
158 :     anchors are more expressive: anchor name and first arc do not have to
159 :     coincide. This entails the following user-visible change:
160 :    
161 :     You have to write $smlnj/foo/bar instead of smlnj/foo/bar. In
162 :     particular, when you fire up sml with a command-line argument, say,
163 :     e.g.:
164 :    
165 :     sml '$smlnj/cmb.cm'
166 :    
167 :     At the ML toplevel prompt:
168 :    
169 :     CM.autoload "$smlnj/cmb.cm";
170 :    
171 :     --
172 :    
173 :     * Made library pickles lazier in order to reduce the initial space
174 :     penalty for autoloading a library. As a result, it is now possible to
175 :     have $smlnj/compiler.cm pre-registered. This should take care of the
176 :     many complaints or inquiries about missing structure Compiler. This
177 :     required changes to CM's internal data structures and small tweaks to
178 :     some algorithms.
179 :    
180 :     * No more distinction between a "minimal" CM and a "full" CM. Now,
181 :     there is only one CM (i.e., the "full" version: $smlnj/cm.cm aka
182 :     $smlnj/cm/full.cm), and it is always available at the interactive top
183 :     level. ($smlnj/cm/minimal.cm is gone.)
184 :    
185 :     * "makeml" now also pre-registers $smlnj/cmb.cm (aka
186 :     $smlnj/cmb/current.cm). In other words, after you bootstrap a new sml
187 :     for the first time, you will not have to autoload $smlnj/cmb.cm again
188 :     afterwards. (The first time around you will still have to do it,
189 :     though.)
190 :    
191 :     --
192 :    
193 :     * Implemented an "anchor environment" mechanism. Also re-implemented
194 :     CM's internal "SrcPath" module from scratch. The new one should be
195 :     more robust in certain boundary cases. In any case, it is a lot
196 :     cleaner than its predecessor (IMHO).
197 :    
198 :     Visible changes:
199 :    
200 :     ** 0. Implicit path anchors (without the leading $-symbol) are no
201 :     longer recognized at all. This means that such path names are not
202 :     illegal either. For example, the name basis.cm simply refers to a
203 :     local file called "basis.cm" (i.e, the name is an ordinary path
204 :     relative to .cm-files directory). Or, to put it differently, only
205 :     names that start with $ are anchored paths.
206 :    
207 :     ** 1. The $<singlearc> abbreviation for $/<singlearc> has finally
208 :     vanished.
209 :    
210 :     ** 2. The "cm" class now accepts an option "bind". The option's value
211 :     is a sub-option list of precisely two items -- one labeled "anchor"
212 :     and the other one labeled "value". As you might expect, "anchor" is
213 :     used to specify an anchor name to be bound, and "value" specifies what
214 :     the anchor is being bound to.
215 :    
216 :     The value must be a directory name and can be given in either standard
217 :     syntax (including the possibility that it is itself an anchored path)
218 :     or native syntax.
219 :    
220 :     Examples:
221 :    
222 :     foo.cm (bind:(anchor:bar value:$mystuff/bar))
223 :     lib.cm (bind:(anchor:a value:"H:\\x\\y\\z")) (* only works under windows *)
224 :    
225 :     and so on.
226 :    
227 :     The meaning of this is that the .cm-file will be processed with an
228 :     augmented anchor environment where the given anchor(s) is/are bound to
229 :     the given values(s).
230 :    
231 :     The rationale for having this feature is this: Suppose you are trying
232 :     to use two different (already stable) libraries a.cm and b.cm (that
233 :     you perhaps didn't write yourself). Further, suppose each of these
234 :     two libraries internally uses its own auxiliary library $lib/aux.cm.
235 :     Normally you would now have a problem because the anchor "lib" can not
236 :     be bound to more than one value globally. Therefore, the project that
237 :     uses both a.cm and b.cm must locally redirect the anchor to some other
238 :     place:
239 :    
240 :     a.cm (bind:(anchor:lib value:/usr/lib/smlnj/a-stuff))
241 :     b.cm (bind:(anchor:lib value:/usr/lib/smlnj/b-stuff))
242 :    
243 :     This hard-wires $lib/aux.cm to /usr/lib/smlnj/a-stuff/aux.cm or
244 :     /usr/lib/smlnj/b-stuff/aux.cm, respectively.
245 :    
246 :     Hard-wiring path names is a bit inflexible (and CM will verbosely warn
247 :     you when you do so at the time of CM.stabilize). Therefore, you can
248 :     also use an anchored path as the value:
249 :    
250 :     a.cm (bind:(anchor:lib value:$a-lib))
251 :     b.cm (bind:(anchor:lib value:$b-lib))
252 :    
253 :     Now you can globally configure (using the usual CM.Anchor.anchor or
254 :     pathconfig machinery) bindings for "a-lib" and "b-lib". Since "lib"
255 :     itself is always locally bound, setting it globally is no longer
256 :     meaningful or necessary (but it does not hurt either). In fact, "lib"
257 :     can still be used as a global anchor for separate purposes.
258 :     For example, one can even locally define "lib" in terms of a global
259 :     "lib":
260 :    
261 :     a.cm (bind:(anchor:lib value:$lib/a))
262 :     b.cm (bind:(anchor:lib value:$lib/b))
263 :    
264 :     ** 3: The encoding of path names has changed. This affects the way
265 :     path names are shown in CM's progress report and also the internal
266 :     protocol encoding used for parallel make.
267 :    
268 :     The encoding now uses one or more ':'-separated segments. Each
269 :     segments corresponds to a file that has been specified relative to the
270 :     file given by its preceding segment. The first segment is either
271 :     relative to the CWD, absolute, or anchored. Each segment itself is
272 :     basically a Unix pathname; all segments but the first are relative.
273 :    
274 :     Example:
275 :    
276 :     $foo/bar/baz.cm:a/b/c.sml
277 :    
278 :     This path denotes the file bar/a/b/c.sml relative to the directory
279 :     denoted by anchor "foo". Notice that the encoding also includes
280 :     baz.cm which is the .cm-file that listed a/b/c.sml. As usual, such
281 :     paths are resolved relative to the .cm-files directory, so baz.cm must
282 :     be ignored to get the "real" pathname.
283 :    
284 :     To make this fact more obvious, CM puts the names of such "virtual
285 :     arcs" into parentheses when they appear in progress reports. (No
286 :     parentheses will appear in the internal protocol encoding.) Thus,
287 :     what you really see is:
288 :    
289 :     $foo/bar/(baz.cm):a/b/c.sml
290 :    
291 :     I find this notation to be much more informative than before.
292 :    
293 :     Another new feature of the encoding is that special characters
294 :     including parentheses, colons, (back)slashes, and white space are
295 :     written as \ddd (where ddd is the decimal encoding of the character).
296 :    
297 :     --
298 :    
299 :     Setup-parameter to "sml" added; this can be used to run arbitrary ML
300 :     code before and after compiling a file (e.g., to set compiler flags)
301 :    
302 :     --
303 :    
304 :     * Implemented "subdir" and "witness" options for noweb tool.
305 :     This caused some slight internal changes in CM's tool implementation.
306 :     * Fixed bug in "tool plugin" mechanism. This is essentially cleaning
307 :     some remaining issues from earlier path anchor changes.
308 :     --
309 :    
310 :     * Class "mlyacc" now takes separate arguments to pass options to
311 :     generated .sml- and .sig-files independently.
312 :    
313 :     ======================================================================
314 :     back-tracing
315 :     ======================================================================
316 :    
317 :     Added a backtrace facility to aid programmers in debugging their
318 :     programs. This involves the following changes:
319 :    
320 :     1. Module system/smlnj/init/core.sml (structure _Core) now has hooks for
321 :     keeping track of the current call stack. When programs are compiled
322 :     in a special mode, the compiler will insert calls to these hooks
323 :     into the user program.
324 :     "Hook" means that it is possible for different implementations of
325 :     back-tracing to register themselves (at different times).
326 :    
327 :     2. compiler/MiscUtil/profile/btrace.sml implements the annotation phase
328 :     as an Absyn.dec->Absyn.dec rewrite. Normally this phase is turned off.
329 :     It can be turned on using this call:
330 :     SMLofNJ.Internals.BTrace.mode (SOME true);
331 :     Turning it off again:
332 :     SMLofNJ.Internals.BTrace.mode (SOME false);
333 :     Querying the current status:
334 :     SMLofNJ.Internals.BTrace.mode NONE;
335 :     Annotated programs are about twice as big as normal ones, and they
336 :     run a factor of 2 to 4 slower with a dummy back-trace plugin (one
337 :     where all hooks do nothing). The slowdown with a plugin that is
338 :     actually useful (such as the one supplied by default) is even greater,
339 :     but in the case of the default plugin it is still only an constant
340 :     factor (amortized).
341 :    
342 :     3. system/Basis/Implementation/NJ/internals.{sig,sml} have been augmented
343 :     with a sub-structure BTrace for controlling back-tracing. In particular,
344 :     the above-mentioned function "mode" controls whether the annotation
345 :     phase is invoked by the compiler. Another important function is
346 :     "trigger": when called it aborts the current execution and causes
347 :     the top-level loop to print a full back-trace.
348 :    
349 :     4. compiler/MiscUtil/profile/btimp.sml is the current default plugin
350 :     for back-tracing. It keeps track of the dynamic call stack and in
351 :     addition to that it keeps a partial history at each "level" of that
352 :     stack. For example, if a tail-calls b, b tail-calls c, and c tail-calls
353 :     d and b (at separate times, dynamically), then the report will show:
354 :    
355 :     GOTO d
356 :     /c
357 :     GOTO \b
358 :     CALL a
359 :    
360 :     This shows that there was an initial non-tail call of a, then a
361 :     tail-call to b or c, looping behavior in a cluster of functions that
362 :     consist of b and c, and then a goto from that cluster (i.e., either from
363 :     b or from c) to d.
364 :    
365 :     Note that (depending on the user program) the amount of information
366 :     that the back-trace module has to keep track of at each level is bounded
367 :     by a constant. Thus, the whole implementation has the same asymptotical
368 :     complexity as the original program (both in space and in time).
369 :    
370 :     5. compiler/TopLevel/interact/evalloop.sml has been modified to
371 :     handle the special exception SMLofNJ.Internals.BTrace.BTrace
372 :     which is raised by the "trigger" function mentioned above.
373 :    
374 :     Notes on usage:
375 :    
376 :     - Annotated code works well together with unannotated code:
377 :     Unannotated calls simply do not show up at all in the backtrace.
378 :    
379 :     - Back-tracing can be confused by callcc and capture.
380 :    
381 :     - While it is possible to compile the compiler with back-trace
382 :     annotations turned on (I did it to get some confidence in
383 :     correctness), you must make absolutely sure that core.sml and
384 :     btimp.sml are compiled WITHOUT annotation! (core.sml cannot actually
385 :     be compiled with annotation because there is no core access yet, but
386 :     if you compile btimp.sml with annotation, then the system will go into
387 :     an infinite recursion and crash.) Since CM currently does not know
388 :     about BTrace, the only way to turn annotations on and off for
389 :     different modules of the compiler is to interrupt CMB.make, change the
390 :     settings, and re-invoke it. Of course, this is awkward and clumsy.
391 :     (Actually, you can now also use CM's new "setup" parameter for to this
392 :     end.)
393 :    
394 :     Sample sessions:
395 :    
396 :     Standard ML of New Jersey v110.28.1 [FLINT v1.5], June 5, 2000
397 :     - SMLofNJ.Internals.BTrace.mode (SOME true);
398 :     [autoloading]
399 :     [autoloading done]
400 :     val it = false : bool
401 :     - structure X = struct
402 :     - fun main n = let
403 :     - fun a (x, 0) = d x
404 :     - | a (x, n) = b (x, n - 1)
405 :     - and b (x, n) = c (x, n)
406 :     - and c (x, n) = a (x, n)
407 :     - and d x = e (x, 3)
408 :     - and e (x, 0) = f x
409 :     - | e (x, n) = e (x, n - 1)
410 :     - and f 0 = SMLofNJ.Internals.BTrace.trigger ()
411 :     - | f n = n * g (n - 1)
412 :     - and g n = a (n, 3)
413 :     - in
414 :     - f n
415 :     - end
416 :     - end;
417 :     structure X : sig val main : int -> int end
418 :     - X.main 3;
419 :     *** BACK-TRACE ***
420 :     GOTO stdIn:4.2-13.20: X.main[2].f
421 :     GOTO-( stdIn:4.2-13.20: X.main[2].e
422 :     GOTO stdIn:4.2-13.20: X.main[2].d
423 :     / stdIn:4.2-13.20: X.main[2].a
424 :     | stdIn:4.2-13.20: X.main[2].b
425 :     GOTO-\ stdIn:4.2-13.20: X.main[2].c
426 :     CALL stdIn:4.2-13.20: X.main[2].g
427 :     GOTO stdIn:4.2-13.20: X.main[2].f
428 :     GOTO-( stdIn:4.2-13.20: X.main[2].e
429 :     GOTO stdIn:4.2-13.20: X.main[2].d
430 :     / stdIn:4.2-13.20: X.main[2].a
431 :     | stdIn:4.2-13.20: X.main[2].b
432 :     GOTO-\ stdIn:4.2-13.20: X.main[2].c
433 :     CALL stdIn:4.2-13.20: X.main[2].g
434 :     GOTO stdIn:4.2-13.20: X.main[2].f
435 :     GOTO-( stdIn:4.2-13.20: X.main[2].e
436 :     GOTO stdIn:4.2-13.20: X.main[2].d
437 :     / stdIn:4.2-13.20: X.main[2].a
438 :     | stdIn:4.2-13.20: X.main[2].b
439 :     GOTO-\ stdIn:4.2-13.20: X.main[2].c
440 :     CALL stdIn:4.2-13.20: X.main[2].g
441 :     GOTO stdIn:4.2-13.20: X.main[2].f
442 :     CALL stdIn:2.15-17.4: X.main[2]
443 :     -
444 :    
445 :     Here is another example, using my modified Tiger compiler:
446 :    
447 :     Standard ML of New Jersey v110.28.1 [FLINT v1.5], June 5, 2000
448 :     - SMLofNJ.Internals.BTrace.mode (SOME true);
449 :     [autoloading]
450 :     [autoloading done]
451 :     val it = false : bool
452 :     - CM.make "sources.cm";
453 :     [autoloading]
454 :     ...
455 :     [autoloading done]
456 :     [scanning sources.cm]
457 :     [parsing (sources.cm):parse.sml]
458 :     [creating directory CM/SKEL ...]
459 :     [parsing (sources.cm):tiger.lex.sml]
460 :     ...
461 :     [wrote CM/sparc-unix/semant.sml]
462 :     [compiling (sources.cm):main.sml]
463 :     [wrote CM/sparc-unix/main.sml]
464 :     [New bindings added.]
465 :     val it = true : bool
466 :     - Main.compile ("../testcases/merge.tig", "foo.out");
467 :     *** BACK-TRACE ***
468 :     CALL lib/semant.sml:99.2-396.21: SemantFun[2].transExp.trvar
469 :     CALL lib/semant.sml:99.2-396.21: SemantFun[2].transExp.trexp
470 :     CALL lib/semant.sml:289.3-295.22: SemantFun[2].transExp.trexp.check[2]
471 :     GOTO lib/semant.sml:289.3-295.22: SemantFun[2].transExp.trexp.check[2]
472 :     CALL lib/semant.sml:99.2-396.21: SemantFun[2].transExp.trexp
473 :     CALL lib/semant.sml:99.2-396.21: SemantFun[2].transExp.trexp
474 :     CALL lib/semant.sml:488.3-505.6: SemantFun[2].transDec.trdec[2].transBody[2]
475 :     / lib/semant.sml:411.65-543.8: SemantFun[2].transDec
476 :     CALL-\ lib/semant.sml:413.2-540.9: SemantFun[2].transDec.trdec[2]
477 :     CALL lib/semant.sml:99.2-396.21: SemantFun[2].transExp.trexp
478 :     CALL lib/semant.sml:8.52-558.4: SemantFun[2].transProg[2]
479 :     CALL main.sml:1.18-118.4: Main.compile[2]
480 :     -
481 :    
482 :     --
483 :    
484 :     If you are running BTrace-instrumented code and
485 :     there is an uncaught exception (regardless of whether or not it was
486 :     raised in instrumented code), the top-level evalloop will print
487 :     the back-trace.
488 :    
489 :     Features:
490 :    
491 :     - Instrumented and uninstrumented code work together seemlessly.
492 :     (Of course, uninstrumented code is never mentioned in actual
493 :     back-traces.)
494 :    
495 :     - Asymptotic time- and space-complexity of instrumented code is
496 :     equal to that of uninstrumented code. (This means that
497 :     tail-recursion is preserved by the instrumentation phase.)
498 :    
499 :     - Modules whose code has been instrumented in different sessions
500 :     work together without problem.
501 :    
502 :     - There is no penalty whatsoever on uninstrumented code.
503 :    
504 :     - There is no penalty on "raise" expressions, even in
505 :     instrumented code.
506 :    
507 :     A potential bug (or perhaps it is a feature, too):
508 :    
509 :     A back-trace reaches no further than the outermost instrumented
510 :     non-trivial "raise". Here, a "trivial" raise is one that is the
511 :     sole RHS of a "handle" rule. Thus, back-traces reach trough
512 :    
513 :     <exp> handle e => raise e
514 :    
515 :     and even
516 :    
517 :     <exp> handle Foo => raise Bar
518 :    
519 :     and, of course, through
520 :    
521 :     <exp> handle Foo => ...
522 :    
523 :     if the exception was not Foo.
524 :    
525 :     Back-traces always reach right through any un-instrumented code
526 :     including any of its "handle" expressions, trivial or not.
527 :    
528 :     To try this out, do the following:
529 :    
530 :     - Erase all existing binfiles for your program.
531 :     (You may keep binfiles for those modules where you think you
532 :     definitely don't need back-tracing.)
533 :     - Turn on back-trace instrumentation:
534 :     SMLofNJ.Internals.BTrace.mode (SOME true);
535 :     - Recompile your program. (I.e., run "CM.make" or "use".)
536 :     - You may now turn instrumentation off again (if you want):
537 :     SMLofNJ.Internals.BTrace.mode (SOME false);
538 :     - Run your program as usual. If it raises an exception that
539 :     reaches the interactive toplevel, then a back-trace will
540 :     automatically be printed. After that, the toplevel loop
541 :     will print the exception history as usual.
542 :    
543 :     --
544 :    
545 :     * BTrace module now also reports call sites. (However, for loop clusters
546 :     it only shows from where the cluster was entered.) There are associated
547 :     modifications to core.sml, internals.{sig,sml}, btrace.sml, and btimp.sml.
548 :    
549 :     --
550 :    
551 :     * SMLofNJ.Internals.BTrace.trigger: when called, raises an
552 :     internal exception which explicitly carries the full back-trace history,
553 :     so it is unaffected by any intervening handle-raise pairs ("trivial"
554 :     or not). The interactive loop will print that history once it arrives
555 :     at top level.
556 :     Short of having all exceptions implicitly carry the full history, the
557 :     recommended way of using this facility is:
558 :     - compile your program with instrumentation "on"
559 :     - run it, when it raises an exception, look at the history
560 :     - if the history is "cut off" because of some handler, go and modify
561 :     your program so that it explicitly calls BTrace.trigger
562 :     - recompile (still instrumented), and rerun; look at the full history

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0