     var derived;            // name of the class being defined
     var base;               // name of its base class
     var isExact;            // true iff the class is exactly traced
+    var extraBases;         // array of base classes beyond 'base' (usually []).
     var filename;           // file where we found the definition of 'derived'
     var lineno;             // line where we found the definition of 'derived'
     var baseref = null;     // reference to the LineInfo for the base class

            classcount++;
            if (cls.destructor) destructors++;
            if (cls.isExact) exacts++;
            var d = " " + (cls.destructor ? "D" : " ") + (cls.isExact ? "E" : " ") + (cls.defcount > 1 ? "M" : " ") + (cls.external ? "X" : " ") + "  ";
            print(d + padTo50(spaces(indent) + cls.derived) + " " + cls.filename + ":" + cls.lineno);
            if (cls.defcount > 1) {
                var locs = cls.otherlines;
                for ( var l=0 ; l < locs.length ; l++ )
                    print("   #    " + padTo50("") + locs[l].filename + ":" + locs[l].lineno);
            }
            if (cls.external) {
                var locs = cls.exolines;
                for ( var l=0 ; l < locs.length ; l++ )
                    print("    @   " + padTo50("") + locs[l].filename + ":" + locs[l].lineno);
            }
        }
        cls.subrefs.sort(function (a,b) { return strcmp(a.derived, b.derived); })

    var classes = {};   // Map of classes processed or in queue to their LineInfo

    queue.push(rootclass);
    classes[rootclass] = new LineInfo(rootclass, "", false, [], "(internal)", 0); // synthetic

    while (queue.length > 0) {
        var cls = queue.shift();
        for ( var l=0 ; l < lines.length ; l++ ) {
            var ln = lines[l];
            var baseNames = [ln.base];
            baseNames = baseNames.concat(ln.extraBases);
            for ( var b=0; b < baseNames.length ; b++ ) {
                var baseName = baseNames[b];
                if (classes.hasOwnProperty(baseName)) {
                    if (!classes.hasOwnProperty(ln.derived)) {
                        var basecls = classes[baseName];
                        ln.baseref = basecls;
                        basecls.subrefs.push(ln);
                        classes[ln.derived] = ln;
                        ln.defcount = 1;
                        queue.push(ln.derived);
                    }
                    else {
                        // Flag it as used, but it's not canonical because
                        // it's not in the classes table.
                        ln.defcount = 1;
                    }
                }
            }
        }
