DIRECTORY
Alloc: TYPE USING [Base, Handle, Notifier, AddNotify, DropNotify, Bounds, Failure, Top],
Basics: TYPE USING [BytePair, bytesPerWord, RawBytes],
BcdDefs: TYPE USING [SGRecord, VersionStamp, FTNull, PageSize],
ComData: TYPE USING [catchBytes, codeByteOffsetList, codeOffsetList, compilerVersion, codeSeg, defBodyLimit, fgTable, fixupLoc, globalFrameSize, importCtx, interface, jumpIndirectList, mainCtx, moduleCtx, mtRoot, mtRootSize, nBodies, nInnerBodies, objectBytes, objectVersion, ownSymbols, source, symSeg, typeAtomRecord],
CompilerUtil: TYPE USING [Address],
ConvertUnsafe: TYPE USING [SubString, AppendSubStringToRefText],
FileParms: TYPE USING [Name],
Fixup: TYPE USING [JIHandle, PCHandle],
IO: TYPE USING [GetIndex, PutChar, SetIndex, STREAM, UnsafePutBlock],
Literals: TYPE USING [Base, STNull],
LiteralOps: TYPE USING [CopyLiteral, ForgetEntries, StringValue, TextType],
OSMiscOps: TYPE USING [FreePages, FreeWords, Words],
PackageSymbols: TYPE USING [ConstRecord, OuterPackRecord, InnerPackRecord, IPIndex, IPNull, JIData],
PrincOps: TYPE USING [BytePC],
PrincOpsUtils: TYPE USING [LongCopy],
RCMap: TYPE USING [Base],
RCMapOps: TYPE USING [RCMT, Acquire, Create, Destroy, GetSpan],
Rope: TYPE USING [Flatten, Length, Text],
RTBcd: TYPE USING [RefLitItem, RefLitList, RTHeader, StampIndex, StampList,TypeItem, TypeList, UTInfo, AnyStamp],
Symbols: TYPE USING [Base, HashVector, Name, Type, MDIndex, BodyInfo, BTIndex, CBTIndex, nullName, MDNull, OwnMdi, BTNull, RootBti, lL],
SymbolSegment: TYPE USING [Base, FGHeader, FGTEntry, ExtRecord, ExtIndex, STHeader, WordOffset, VersionID, ltType, htType, ssType, seType, ctxType, mdType, bodyType, extType, constType],
SymbolOps: TYPE USING [EnumerateBodies, HashBlock, NameForSe, SiblingBti, SonBti, SubStringForName],
SymLiteralOps: TYPE USING [RefLitItem, DescribeRefLits, DescribeTypes, EnumerateRefLits, EnumerateTypes, TypeIndex, UTypeId],
Table: TYPE USING [IPointer, Selector],
Tree: TYPE USING [Base, Index, Link, Map, Scan, Null, treeType],
TreeOps: TYPE USING [FreeTree, UpdateLeaves],
TypeStrings: TYPE USING [Create],
UnsafeStorage: TYPE USING [GetSystemUZone],
XSymbolSegment: TYPE SymbolSegment USING [ExtRecord],
XTree: TYPE Tree USING [Index, Link, Node],
XTreeOps: TYPE USING [ForEachSon, LinkToX];
ObjectOut:
PROGRAM
IMPORTS Alloc, ConvertUnsafe, IO, PrincOpsUtils, OSMiscOps, LiteralOps, RCMapOps, Rope, SymbolOps, SymLiteralOps, TreeOps, TypeStrings, dataPtr: ComData, UnsafeStorage, XTreeOps
EXPORTS CompilerUtil = {
StreamIndex: TYPE = INT; -- FileStream.FileByteIndex
Address: TYPE = CompilerUtil.Address;
stream: IO.STREAM ← NIL;
zone: UNCOUNTED ZONE = UnsafeStorage.GetSystemUZone[];
PageSize: CARDINAL = BcdDefs.PageSize;
BytesPerWord: CARDINAL = Basics.bytesPerWord;
BytesPerPage: CARDINAL = PageSize*BytesPerWord;
NextFilePage:
PUBLIC
PROC
RETURNS[
CARDINAL] = {
fill: ARRAY [0..8) OF WORD ← ALL[0];
r: INTEGER = (stream.GetIndex[] MOD BytesPerPage)/BytesPerWord;
m: INTEGER;
IF r # 0
THEN
FOR n:
INTEGER ← PageSize-r, n-m
WHILE n > 0
DO
m ← MIN[n, fill.LENGTH];
WriteObjectWords[LOOPHOLE[(fill.BASE).LONG], m];
ENDLOOP;
RETURN[stream.GetIndex[]/BytesPerPage + 1]};
WriteObjectWord:
PROC[w:
WORD] = {
pair: Basics.BytePair = LOOPHOLE[w];
stream.PutChar[VAL[pair.high]]; stream.PutChar[VAL[pair.low]]};
WriteObjectWords:
PROC[addr: Address, n:
CARDINAL] = {
stream.UnsafePutBlock[[base: addr, startIndex: 0, count: n*BytesPerWord]]};
RewriteObjectWords:
PROC[index: StreamIndex, addr: Address, n:
CARDINAL] = {
saveIndex: StreamIndex = stream.GetIndex[];
stream.SetIndex[index];
stream.UnsafePutBlock[[addr, 0, n*BytesPerWord]];
stream.SetIndex[saveIndex]};
WriteTableBlock:
PROC[p: Table.IPointer, size:
CARDINAL] = {
WriteObjectWords[LOOPHOLE[p], size]};