DIRECTORY AMModel USING [CharIndex], AMModelPrivate USING [EPI, FGIndex, FGNull, NullPCOffset, PCOffset], BrandXSymbolDefs USING [ SymbolTableBase, BodyTableEntry, FineGrainTableEntry, rootBodyIndex, BodyIndex, nullBodyIndex], BrandYSymbolDefs USING [ SymbolTableBase, BodyTableEntry, FineGrainTableEntry, rootBodyIndex, BodyIndex, nullBodyIndex], RTSymbolDefs USING [SymbolTableBase]; AMModelPrivateImpl: PROGRAM EXPORTS AMModelPrivate = BEGIN OPEN AMModel, AMModelPrivate, bx: BrandXSymbolDefs, by: BrandYSymbolDefs, RTSymbolDefs; XBodyPtr: TYPE = LONG POINTER TO bx.BodyTableEntry; YBodyPtr: TYPE = LONG POINTER TO by.BodyTableEntry; EPIndex: TYPE = AMModelPrivate.EPI; FGCard: TYPE = CARDINAL; XFGPtr: TYPE = LONG POINTER TO bx.FineGrainTableEntry; YFGPtr: TYPE = LONG POINTER TO by.FineGrainTableEntry; fudge: INT _ 8; -- number of characters to assume beyond the last fgi in a procedure FGIToEPI: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [EPIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToEPIX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToEPIY[t.e, fgi]]; ENDCASE => ERROR; }; FGIToEPIX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [epi: EPIndex _ 0] = { IF fgi # FGNull THEN { bti: bx.BodyIndex = FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => epi _ ext.entryIndex; ENDCASE => RETURN; }; }; }; FGIToEPIY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [epi: EPIndex _ 0] = { IF fgi # FGNull THEN { bti: by.BodyIndex = FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => epi _ ext.entryIndex; ENDCASE => RETURN; }; }; }; EPIToFirstFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToFirstFGIX[t.e, epi, skipArgs]]; t: SymbolTableBase.y => RETURN[EPIToFirstFGIY[t.e, epi, skipArgs]]; ENDCASE => ERROR; }; EPIToFirstFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex, fudge: FALSE]; ENDCASE; IF skipArgs AND fgi # FGNull THEN { pc: PCOffset _ FGIToFirstPC[[x[stb]], fgi]; DO nfgi: FGIndex _ NextFGIX[stb, fgi, epi]; npc: PCOffset; IF nfgi = FGNull THEN RETURN [fgi]; npc _ FGIToFirstPCX[stb, nfgi]; IF npc # pc THEN RETURN [nfgi]; fgi _ nfgi; ENDLOOP; }; }; EPIToFirstFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex, fudge: FALSE]; ENDCASE; IF skipArgs AND fgi # FGNull THEN { pc: PCOffset _ FGIToFirstPC[[y[stb]], fgi]; DO nfgi: FGIndex _ NextFGIY[stb, fgi, epi]; npc: PCOffset; IF nfgi = FGNull THEN RETURN [fgi]; npc _ FGIToFirstPCY[stb, nfgi]; IF npc # pc THEN RETURN [nfgi]; fgi _ nfgi; ENDLOOP; }; }; EPIToLastFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToLastFGIX[t.e, epi]]; t: SymbolTableBase.y => RETURN[EPIToLastFGIY[t.e, epi]]; ENDCASE => ERROR; }; EPIToLastFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex + MAX[info.indexLength, 1] - 1, fudge: TRUE]; ENDCASE; }; EPIToLastFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => fgi _ [fgCard: info.startIndex + MAX[info.indexLength, 1] - 1, fudge: TRUE]; ENDCASE; }; EPIToFirstPC: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, skipArgs: BOOL] RETURNS [PCOffset] = { fgi: FGIndex _ EPIToFirstFGI[stb, epi, skipArgs]; IF fgi = FGNull THEN RETURN [NullPCOffset]; RETURN [FGIToFirstPC[stb, fgi]]; }; EPIToLastPC: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex] RETURNS [PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[EPIToLastPCX[t.e, epi]]; t: SymbolTableBase.y => RETURN[EPIToLastPCY[t.e, epi]]; ENDCASE => ERROR; }; EPIToLastPCX: PROC [stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti = bx.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => {pc _ info.bytes; pc _ pc - 1}; ENDCASE; }; EPIToLastPCY: PROC [stb: by.SymbolTableBase, epi: EPIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti = by.nullBodyIndex THEN RETURN; WITH info: stb.bb[bti].info SELECT FROM External => {pc _ info.bytes; pc _ pc - 1}; ENDCASE; }; CharIndexToFGI: PUBLIC PROC [stb: SymbolTableBase, ci: CharIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[CharIndexToFGIX[t.e, ci]]; t: SymbolTableBase.y => RETURN[CharIndexToFGIY[t.e, ci]]; ENDCASE => ERROR; }; CharIndexToFGIX: PROC [stb: bx.SymbolTableBase, ci: CharIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ bx.nullBodyIndex; bti _ CItoBTIX[stb, ci]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; nextCI: CharIndex _ thisCI; fgi.fgCard _ tfgi; WITH fp^ SELECT FROM normal => nextCI _ nextCI + deltaSource; step => IF which = source THEN { thisCI _ nextCI + delta; LOOP}; ENDCASE; IF nextCI > ci THEN RETURN; thisCI _ nextCI; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; CharIndexToFGIY: PROC [stb: by.SymbolTableBase, ci: CharIndex] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ by.nullBodyIndex; bti _ CItoBTIY[stb, ci]; IF bti # bx.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; nextCI: CharIndex _ thisCI; fgi.fgCard _ tfgi; WITH fp^ SELECT FROM normal => nextCI _ nextCI + deltaSource; step => IF which = source THEN { thisCI _ nextCI + delta; LOOP}; ENDCASE; IF nextCI > ci THEN RETURN; thisCI _ nextCI; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; PCToFGI: PUBLIC PROC [stb: SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[PCToFGIX[t.e, epi, pc]]; t: SymbolTableBase.y => RETURN[PCToFGIY[t.e, epi, pc]]; ENDCASE => ERROR; }; PCToFGIX: PROC [stb: bx.SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [fgi: FGIndex _ FGNull] = { bti: bx.BodyIndex _ EPItoBTIX[stb, epi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; rem: INT _ pc; IF pc >= info.bytes THEN RETURN [FGNull]; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; fgi.fgCard _ tfgi; IF rem = 0 THEN RETURN; WITH fp^ SELECT FROM normal => rem _ rem - deltaObject; step => IF which = object THEN rem _ rem - delta; ENDCASE; IF rem < 0 THEN RETURN; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; PCToFGIY: PROC [stb: by.SymbolTableBase, epi: EPIndex, pc: PCOffset] RETURNS [fgi: FGIndex _ FGNull] = { bti: by.BodyIndex _ EPItoBTIY[stb, epi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; rem: INT _ pc; IF pc >= info.bytes THEN RETURN [FGNull]; fgi _ [fgCard: firstFGI, fudge: FALSE]; FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; fgi.fgCard _ tfgi; IF rem = 0 THEN RETURN; WITH fp^ SELECT FROM normal => rem _ rem - deltaObject; step => IF which = object THEN rem _ rem - delta; ENDCASE; IF rem < 0 THEN RETURN; ENDLOOP; fgi.fudge _ TRUE; }; ENDCASE; }; }; NextFGI: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [FGIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[NextFGIX[t.e, fgi, epi]]; t: SymbolTableBase.y => RETURN[NextFGIY[t.e, fgi, epi]]; ENDCASE => ERROR; }; NextFGIX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [nfgi: FGIndex _ FGNull] = { bti: bx.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ EPItoBTIX[stb, epi]; IF bti # bx.nullBodyIndex THEN WITH info: stb.bb[bti].info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fudge OR fgi.fgCard NOT IN [firstFGI..lastFGI] THEN RETURN; IF fgi.fgCard = lastFGI THEN fgi.fudge _ TRUE ELSE fgi.fgCard _ fgi.fgCard + 1; nfgi _ fgi; }; ENDCASE; }; NextFGIY: PROC [stb: by.SymbolTableBase, fgi: FGIndex, epi: EPIndex] RETURNS [nfgi: FGIndex _ FGNull] = { bti: by.BodyIndex; IF fgi = FGNull THEN RETURN; bti _ EPItoBTIY[stb, epi]; IF bti # by.nullBodyIndex THEN WITH info: stb.bb[bti].info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fudge OR fgi.fgCard NOT IN [firstFGI..lastFGI] THEN RETURN; IF fgi.fgCard = lastFGI THEN fgi.fudge _ TRUE ELSE fgi.fgCard _ fgi.fgCard + 1; nfgi _ fgi; }; ENDCASE; }; FGIToFirstChar: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [CharIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToFirstCharX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToFirstCharY[t.e, fgi]]; ENDCASE => ERROR; }; FGIToFirstCharX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { stop: FGCard = IF fgi.fudge THEN fgi.fgCard + 1 ELSE fgi.fgCard; ci _ body.sourceIndex; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO IF tfgi >= stop THEN EXIT ELSE { fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => { IF which = object THEN LOOP; IF which # source THEN ERROR; ci _ ci + delta; }; ENDCASE; }; ENDLOOP; }; ENDCASE; }; }; FGIToFirstCharY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { stop: FGCard = IF fgi.fudge THEN fgi.fgCard + 1 ELSE fgi.fgCard; ci _ body.sourceIndex; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO IF tfgi >= stop THEN EXIT ELSE { fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => { IF which = object THEN LOOP; IF which # source THEN ERROR; ci _ ci + delta; }; ENDCASE; }; ENDLOOP; }; ENDCASE; }; }; FGIToLastChar: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [CharIndex] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToLastCharX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToLastCharY[t.e, fgi]]; ENDCASE => ERROR; }; FGIToLastCharX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; ci _ body.sourceIndex; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => IF which = source THEN ci _ ci + delta; ENDCASE; ENDLOOP; IF fgi.fudge THEN ci _ ci + fudge --XXX ELSE ci _ ci - 1; }; ENDCASE; }; }; FGIToLastCharY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [ci: CharIndex _ -1] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; ci _ body.sourceIndex; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => ci _ ci + deltaSource; step => IF which = source THEN ci _ ci + delta; ENDCASE; ENDLOOP; IF fgi.fudge THEN ci _ ci + fudge --XXX ELSE ci _ ci - 1; }; ENDCASE; }; }; FGIToFirstPC: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToFirstPCX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToFirstPCY[t.e, fgi]]; ENDCASE => ERROR; }; FGIToFirstPCX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { stop: FGCard = IF fgi.fudge THEN fgi.fgCard+1 ELSE fgi.fgCard; pc _ 0; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO IF tfgi >= stop THEN EXIT ELSE { fp: XFGPtr = @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => { IF which = source THEN LOOP; IF which # object THEN ERROR; pc _ pc + delta; }; ENDCASE; }; ENDLOOP; }; ENDCASE; }; }; FGIToFirstPCY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { stop: FGCard = IF fgi.fudge THEN fgi.fgCard+1 ELSE fgi.fgCard; pc _ 0; FOR tfgi: FGCard _ info.startIndex, tfgi + 1 DO IF tfgi >= stop THEN EXIT ELSE { fp: YFGPtr = @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => { IF which = source THEN LOOP; IF which # object THEN ERROR; pc _ pc + delta; }; ENDCASE; }; ENDLOOP; }; ENDCASE; }; }; FGIToLastPC: PUBLIC PROC [stb: SymbolTableBase, fgi: FGIndex] RETURNS [PCOffset] = { WITH stb SELECT FROM t: SymbolTableBase.x => RETURN[FGIToLastPCX[t.e, fgi]]; t: SymbolTableBase.y => RETURN[FGIToLastPCY[t.e, fgi]]; ENDCASE => ERROR; }; FGIToLastPCX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: bx.BodyIndex _ FGItoBTIX[stb, fgi]; IF bti # bx.nullBodyIndex THEN { body: XBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; IF fgi.fudge THEN {pc _ INT[info.bytes] - 1; RETURN}; pc _ 0; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: XFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => IF which = object THEN pc _ pc + delta; ENDCASE; ENDLOOP; pc _ pc - 1; }; ENDCASE; }; }; FGIToLastPCY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [pc: PCOffset _ NullPCOffset] = { bti: by.BodyIndex _ FGItoBTIY[stb, fgi]; IF bti # by.nullBodyIndex THEN { body: YBodyPtr _ @stb.bb[bti]; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; IF fgi.fudge THEN {pc _ INT[info.bytes] - 1; RETURN}; pc _ 0; FOR tfgi: FGCard IN [firstFGI..fgi.fgCard] DO fp: YFGPtr _ @stb.fgTable[tfgi]; WITH fp^ SELECT FROM normal => pc _ pc + deltaObject; step => IF which = object THEN pc _ pc + delta; ENDCASE; ENDLOOP; pc _ pc - 1; }; ENDCASE; }; }; EPItoBTIX: PROC[stb: bx.SymbolTableBase, epi: EPIndex] RETURNS [outerBti: bx.BodyIndex _ bx.nullBodyIndex] = { innerEPItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => IF epi = thisEPI THEN {outerBti _ bti; stop _ TRUE}; ENDCASE; }; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerEPItoBTI]; }; EPItoBTIY: PROC[stb: by.SymbolTableBase, epi: EPIndex] RETURNS [outerBti: by.BodyIndex _ by.nullBodyIndex] = { innerEPItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => IF epi = thisEPI THEN {outerBti _ bti; stop _ TRUE}; ENDCASE; }; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerEPItoBTI]; }; FGItoBTIX: PROC [stb: bx.SymbolTableBase, fgi: FGIndex] RETURNS [outerBti: bx.BodyIndex _ bx.nullBodyIndex] = { innerFGItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fgCard IN [firstFGI..lastFGI] THEN { outerBti _ bti; stop _ TRUE}; }; ENDCASE; }; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerFGItoBTI]; }; FGItoBTIY: PROC [stb: by.SymbolTableBase, fgi: FGIndex] RETURNS [outerBti: by.BodyIndex _ by.nullBodyIndex] = { innerFGItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; thisEPI: EPIndex _ 0; WITH ext: body^ SELECT FROM Callable => thisEPI _ ext.entryIndex; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; IF fgi.fgCard IN [firstFGI..lastFGI] THEN { outerBti _ bti; stop _ TRUE}; }; ENDCASE; }; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerFGItoBTI]; }; CItoBTIX: PROC [stb: bx.SymbolTableBase, ci: CharIndex] RETURNS [bestBTI: bx.BodyIndex _ bx.nullBodyIndex] = { bestCI: CharIndex _ 0; bti1: bx.BodyIndex _ bx.nullBodyIndex; fgi1: FGCard _ 0; ci1: CharIndex _ 0; bti2: bx.BodyIndex _ bx.nullBodyIndex; fgi2: FGCard _ 0; ci2: CharIndex _ 0; innerCItoBTI: PROC [bti: bx.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: XBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body lastCI: CharIndex _ thisCI; -- the first sourceIndex of the current statement FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: XFGPtr _ @stb.fgTable[tfgi]; IF (lastCI < ci2 OR bti2 = bx.nullBodyIndex) AND lastCI >= ci THEN { bti2 _ bti; fgi2 _ tfgi; ci2 _ lastCI; }; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; IF (lastCI >= ci1 OR bti1 = bx.nullBodyIndex) AND lastCI < ci THEN {bti1 _ bti; fgi1 _ tfgi; ci1 _ lastCI}; ENDLOOP; }; ENDCASE; }; [] _ stb.EnumerateBodies[bx.rootBodyIndex, innerCItoBTI]; bestBTI _ bti1; IF bti1 # bti2 THEN { IF ci = ci2 OR bti1 = bx.nullBodyIndex THEN bestBTI _ bti2; }; }; CItoBTIY: PROC [stb: by.SymbolTableBase, ci: CharIndex] RETURNS [bestBTI: by.BodyIndex _ by.nullBodyIndex] = { bestCI: CharIndex _ 0; bti1: by.BodyIndex _ by.nullBodyIndex; fgi1: FGCard _ 0; ci1: CharIndex _ 0; bti2: by.BodyIndex _ by.nullBodyIndex; fgi2: FGCard _ 0; ci2: CharIndex _ 0; innerCItoBTI: PROC [bti: by.BodyIndex] RETURNS [stop: BOOL _ FALSE] = { body: YBodyPtr _ @stb.bb[bti]; WITH ext: body^ SELECT FROM Callable => NULL; ENDCASE => RETURN; WITH info: body.info SELECT FROM External => { firstFGI: FGCard _ info.startIndex; lastFGI: FGCard _ firstFGI + MAX[info.indexLength, 1] - 1; thisCI: CharIndex _ body.sourceIndex; -- the first sourceIndex of this Callable body lastCI: CharIndex _ thisCI; -- the first sourceIndex of the current statement FOR tfgi: FGCard IN [firstFGI..lastFGI] DO fp: YFGPtr _ @stb.fgTable[tfgi]; IF (lastCI < ci2 OR bti2 = by.nullBodyIndex) AND lastCI >= ci THEN { bti2 _ bti; fgi2 _ tfgi; ci2 _ lastCI; }; WITH fp^ SELECT FROM normal => lastCI _ lastCI + deltaSource; step => IF which = source THEN lastCI _ lastCI + delta; ENDCASE; IF (lastCI >= ci1 OR bti1 = by.nullBodyIndex) AND lastCI < ci THEN {bti1 _ bti; fgi1 _ tfgi; ci1 _ lastCI}; ENDLOOP; }; ENDCASE; }; [] _ stb.EnumerateBodies[by.rootBodyIndex, innerCItoBTI]; bestBTI _ bti1; IF bti1 # bti2 THEN { IF ci = ci2 OR bti1 = by.nullBodyIndex THEN bestBTI _ bti2; }; }; END. ‚AMModelPrivateImpl.Mesa Russ Atkinson, May 7, 1984 10:06:07 pm PDT Paul Rovner, November 29, 1983 7:25 pm local type definitions kludge for the missing FGI procedures exported to AMModelPrivate returns first fine grain index for the given procedure (0 for start proc OR invalid fgi) returns first fine grain index for the given procedure (0 for start proc OR invalid fgi) returns first fine grain index for the given procedure (FGNull for invalid epi) returns first fine grain index for the given procedure (FGNull for invalid epi) returns last fine grain index for the given procedure (FGNull for invalid epi) returns last fine grain index for the given procedure (FGNull for invalid epi) returns offset of last byte in the procedure (may be padding byte) returns offset of last byte in the procedure (may be padding byte) returns the "best" fine grain index for the given character position (FGNull for invalid position) we try not to stop at a source step, because source steps usually come just before the pc step for the statement (sigh) returns the "best" fine grain index for the given character position (FGNull for invalid position) we try not to stop at a source step, because source steps usually come just before the pc step for the statement (sigh) returns the "best" fine grain index for the given pc offset in the given procedure (FGNull for invalid epi or invalid pc) returns the "best" fine grain index for the given pc offset in the given procedure (FGNull for invalid epi or invalid pc) takes a FGIndex & entry point, returns the next FGIndex returns FGNull if next fgi is in a different proc than entryPointIndex OR the given FGIndex or entry point was not valid takes a FGIndex & entry point, returns the next FGIndex returns FGNull if next fgi is in a different proc than entryPointIndex OR the given FGIndex or entry point was not valid takes a FGIndex, returns the first character position -1 for invalid fgi takes a FGIndex, returns the first character position -1 for invalid fgi takes a FGIndex, returns the last character position -1 for invalid fgi takes a FGIndex, returns the last character position -1 for invalid fgi takes a FGIndex, returns the first PC (NullPCOffset for invalid fgi) takes a FGIndex, returns the first PC (NullPCOffset for invalid fgi) returns offset of last byte in the fine grain entry (NullPCOffset for invalid fgi) returns offset of last byte in the fine grain entry (NullPCOffset for invalid fgi) implementation procedures takes a SymbolTableBase & entry point returns a Callable BTI for the entry point or nullBodyIndex if that can't be done takes a SymbolTableBase & entry point returns a Callable BTI for the entry point or nullBodyIndex if that can't be done takes a SymbolTableBase & FGIndex returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done takes a SymbolTableBase & FGIndex returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done takes a SymbolTableBase & character position returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done the start CharIndex of the smallest enclosing (of ci) Callable body, initialized to the start CharIndex of the module bti1, fgi1, and ci1 get the largest point where ci1 < ci. Note that ci1 is the character index after fgi1 has been applied. bti2, fgi2, and ci2 get the smallest point where ci2 >= ci. Note that ci2 is the character index before fgi2 has been applied. Compute (fgt2) the smallest fgt entry startIndex where ci2 >= ci Compute (fgt1) the largest fgt entry startIndex where ci1 < ci takes a SymbolTableBase & character position returns a Callable BTI containing the FGIndex or nullBodyIndex if that can't be done the start CharIndex of the smallest enclosing (of ci) Callable body, initialized to the start CharIndex of the module bti1, fgi1, and ci1 get the largest point where ci1 < ci. Note that ci1 is the character index after fgi1 has been applied. bti2, fgi2, and ci2 get the smallest point where ci2 >= ci. Note that ci2 is the character index before fgi2 has been applied. Compute (fgt2) the smallest fgt entry startIndex where ci2 >= ci Compute (fgt1) the largest fgt entry startIndex where ci1 < ci Ê@˜šœ™Jšœ*™*Jšœ&™&—J˜šÏk ˜ Jšœœ ˜Jšœœœ+˜Dšœœ˜Jšœ_˜_—šœœ˜Jšœ_˜_—Jšœ œ˜%J˜—šÏbœ˜Jšœ˜šœœ˜ JšœR˜RJ˜——šœ™J˜Jš œ œœœœ˜3Jš œ œœœœ˜3J˜Jšœ œœ˜#Jšœœœ˜J˜Jš œœœœœ˜6Jš œœœœœ˜6J˜Jšœ™JšœœÏcD˜TJ˜—šœ%™%J˜—šÏnœœœ&œ˜Pšœœ˜Jšœœ˜4Jšœœ˜4Jšœœ˜—Jšœ˜J˜—š  œœ)œ˜VJšœ6™6Jšœ!™!šœœ˜J˜(šœœ˜ Jšœ˜šœ œ˜J˜!Jšœœ˜—J˜—J˜—J˜J˜—š  œœ)œ˜VJšœ6™6Jšœ!™!šœœ˜J˜(šœœ˜ Jšœ˜šœ œ˜J˜!Jšœœ˜—J˜—J˜—J˜J˜—š  œœ˜Jšœ/œœ˜Jšœœ˜Jšœœ%˜CJšœœ%˜CJšœœ˜—šœ˜J˜——š œ˜Jšœ2œ˜7Jšœ˜#JšœO™OJ˜(Jšœœœ˜&šœœ˜'Jšœ3œ˜:Jšœ˜—šœ œœ˜#Jšœ+˜+š˜Jšœ(˜(Jšœ˜Jšœœœ˜#Jšœ˜Jšœ œœ˜J˜ Jšœ˜—Jšœ˜—J˜J˜—š œ˜Jšœ2œ˜7Jšœ˜#JšœO™OJ˜(Jšœœœ˜&šœœ˜'Jšœ3œ˜:Jšœ˜—šœ œœ˜#Jšœ+˜+š˜Jšœ(˜(Jšœ˜Jšœœœ˜#Jšœ˜Jšœ œœ˜J˜ Jšœ˜—Jšœ˜—J˜J˜—š  œœœ&œ˜Tšœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜—Jšœ˜J˜—š  œ˜Jšœ'œ˜KJšœ5™5Jšœ™J˜(Jšœœœ˜&šœœ˜'˜ Jšœ!œ"œ˜L—Jšœ˜—J˜J˜—š  œ˜Jšœ'œ˜KJšœ5™5Jšœ™J˜(Jšœœœ˜&šœœ˜'˜ Jšœ!œ"œ˜L—Jšœ˜—J˜J˜—š  œœ˜Jšœ/œœ˜KJšœ1˜1Jšœœœ˜+Jšœ˜ Jšœ˜J˜—š  œœœ&œ˜Tšœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜—Jšœ˜J˜—š  œ˜Jšœ'œ"˜QJšœB™BJ˜(Jšœœœ˜&šœœ˜'J˜+Jšœ˜—J˜J˜—š  œ˜Jšœ'œ"˜QJšœB™BJ˜(Jšœœœ˜&šœœ˜'J˜+Jšœ˜—J˜J˜—š œœœ'œ˜Wšœœ˜Jšœœ˜9Jšœœ˜9Jšœœ˜—šœ˜J˜——š œ˜Jšœ)œ˜LJšœD™DJšœ™J˜%J˜šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜%Jšœ œ˜'šœœ˜*J˜ J˜J˜JšœF™FJšœ0™0šœœ˜˜ J˜—˜šœœ˜Jšœ˜Jšœ˜——Jšœ˜—Jšœ œœ˜J˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œ˜Jšœ)œ˜LJšœD™DJšœ™J˜%J˜šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜%Jšœ œ˜'šœœ˜*J˜ J˜J˜JšœF™FJšœ0™0šœœ˜˜ J˜—˜šœœ˜Jšœ˜Jšœ˜——Jšœ˜—Jšœ œœ˜J˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œœ˜Jšœ3œ˜Hšœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜—šœ˜J˜——š œ˜Jšœ5œ˜YJšœR™RJšœ&™&J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:Jšœœ˜Jšœœœ ˜)Jšœ œ˜'šœœ˜*J˜ J˜Jšœ œœ˜šœœ˜J˜"Jšœœœ˜1Jšœ˜—Jšœ œœ˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œ˜Jšœ5œ˜YJšœR™RJšœ&™&J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:Jšœœ˜Jšœœœ ˜)Jšœ œ˜'šœœ˜*J˜ J˜Jšœ œœ˜šœœ˜J˜"Jšœœœ˜1Jšœ˜—Jšœ œœ˜Jšœ˜—Jšœ œ˜J˜—Jšœ˜—J˜—J˜J˜—š œœ˜Jšœ3œ˜Hšœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜—šœ˜J˜——š œ˜J˜5Jšœ˜$Jšœ7™7JšœF™FJšœ1™1J˜Jšœœœ˜J˜šœ˜šœœ˜'˜ J˜#Jšœœ˜:Jš œ œ œœœœ˜Bšœ˜Jšœ ˜Jšœ˜!—J˜ J˜—Jšœ˜——J˜J˜—š œ˜J˜5Jšœ˜$Jšœ7™7JšœF™FJšœ1™1J˜Jšœœœ˜J˜šœ˜šœœ˜'˜ J˜#Jšœœ˜:Jš œ œ œœœœ˜Bšœ˜Jšœ ˜Jšœ˜!—J˜ J˜—Jšœ˜——˜J˜——š œœœ&œ˜Xšœœ˜Jšœœ˜:Jšœœ˜:Jšœœ˜—šœ˜J˜——š œ˜Jšœ(œ˜HJšœ5™5Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ Jšœœ œœ ˜@J˜šœ*˜/šœœœœ˜ J˜ šœœ˜Jšœ ˜ šœ ˜ Jšœœœ˜Jšœœœ˜Jšœ˜J˜—Jšœ˜—J˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š œ˜Jšœ(œ˜HJšœ5™5Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ Jšœœ œœ ˜@J˜šœ*˜/šœœœœ˜ J˜ šœœ˜Jšœ ˜ šœ ˜ Jšœœœ˜Jšœœœ˜Jšœ˜J˜—Jšœ˜—J˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œœœ&œ˜Wšœœ˜Jšœœ˜9Jšœœ˜9Jšœœ˜—Jšœ˜J˜—š œ˜Jšœ(œ˜HJšœ4™4Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—šœ ˜ Jšœ˜Jšœ ˜—J˜—Jšœ˜—J˜—˜J˜——š œ˜Jšœ(œ˜HJšœ4™4Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœœ˜:J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—šœ ˜ Jšœ˜Jšœ ˜—J˜—Jšœ˜—J˜—˜J˜——š  œœœ&œ˜Ušœœ˜Jšœœ˜8Jšœœ˜8Jšœœ˜—šœ˜J˜——š  œ˜Jšœ(œ"˜QJšœD™DJ˜(šœœ˜ Jšœ˜šœœ˜ ˜ Jšœœ œœ ˜>J˜šœ*˜/šœœœœ˜ J˜ šœœ˜Jšœ ˜ šœ ˜ Jšœœœ˜Jšœœœ˜Jšœ˜J˜—Jšœ˜—J˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œ˜šœ(œ"˜QJšœD™D—J˜(šœœ˜ Jšœ˜šœœ˜ ˜ Jšœœ œœ ˜>J˜šœ*˜/šœœœœ˜ J˜ šœœ˜Jšœ ˜ šœ ˜ Jšœœœ˜Jšœœœ˜Jšœ˜J˜—Jšœ˜—J˜—Jšœ˜—J˜—Jšœ˜—J˜—J˜J˜—š  œœœ&œ˜Tšœœ˜Jšœœ˜7Jšœœ˜7Jšœœ˜—šœ˜J˜——š  œ˜Jšœ(œ"˜QJšœ3™3Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœ œœœ˜5J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—J˜ J˜—Jšœ˜—J˜—J˜J˜—š  œ˜Jšœ(œ"˜QJšœ3™3Jšœ™J˜(šœœ˜ Jšœ˜šœœ˜ ˜ J˜#Jšœ œœœ˜5J˜šœœ˜-J˜ šœœ˜J˜ Jšœœœ˜/Jšœ˜—Jšœ˜—J˜ J˜—Jšœ˜—J˜—J˜J˜—šœ™J˜—š  œœ'˜6Jšœ0˜7Jšœ%™%Jšœ*™*Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ Jšœœœ˜4—Jšœ˜—J˜—J˜:˜J˜——š  œœ'˜6Jšœ0˜7Jšœ%™%Jšœ*™*Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ Jšœœœ˜4—Jšœ˜—J˜—J˜:˜J˜——š  œ˜Jšœ'˜'Jšœ0˜7Jšœ!™!Jšœ-™-Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ J˜#Jšœœ˜:šœ œœ˜+Jšœ˜Jšœœ˜ —J˜—Jšœ˜—J˜—J˜:J˜J˜—š  œ˜Jšœ'˜'Jšœ0˜7Jšœ!™!Jšœ-™-Jšœ&™&š œœœœœ˜HJ˜J˜šœ œ˜J˜%Jšœœ˜—šœœ˜ ˜ J˜#Jšœœ˜:šœ œœ˜+Jšœ˜Jšœœ˜ —J˜—Jšœ˜—J˜—J˜:J˜J˜—š œ˜Jšœ(˜(šœ/˜6Jšœ,™,JšœT™T—šœ˜Jšœu™u—J˜Jšœ`žœ™|Jšœ&˜&Jšœ˜Jšœ˜J˜Jšœbžœ™Jšœ&˜&Jšœ˜Jšœ˜J˜š ž œœœœœ˜GJ˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UJšœŸ1˜Nšœœ˜*J˜ J™Jšœ@™@šœœœœ˜DJšœ&˜&Jšœ˜J˜—šœœ˜Jšœ(˜(Jšœœœ˜7Jšœ˜J˜—Jšœ>™>šœœœ ˜=Jšœ)˜-J˜—Jšœ˜—J˜—Jšœ˜—Jšœ˜J˜—Jšœ9˜9Jšœ˜šœ œ˜Jšœ œœ˜;J˜—Jšœ˜J˜—š œ˜Jšœ(˜(šœ/˜6Jšœ,™,JšœT™T—šœ˜Jšœu™u—J˜Jšœ`žœ™|Jšœ&˜&Jšœ˜Jšœ˜J˜Jšœbžœ™Jšœ&˜&Jšœ˜Jšœ˜J˜š ž œœœœœ˜GJ˜Jš œ œœ œœœ˜@šœœ˜ ˜ J˜#Jšœœ˜:Jšœ'Ÿ.˜UJšœŸ1˜Nšœœ˜*J˜ J™Jšœ@™@šœœœœ˜DJšœ&˜&Jšœ˜J˜—šœœ˜Jšœ(˜(Jšœœœ˜7Jšœ˜J˜—Jšœ>™>šœœœ ˜=Jšœ)˜-J˜—Jšœ˜—J˜—Jšœ˜—Jšœ˜—J™Jšœ9˜9Jšœ˜šœ œ˜Jšœ œœ˜;J˜—Jšœ˜J˜Jšœ˜J˜J˜——…—Q¶x