LiteralOps.mesa
Copyright Ó 1985, 1986, 1987, 1988, 1991 by Xerox Corporation. All rights reserved.
Satterthwaite, June 19, 1986 10:07:19 am PDT
Russ Atkinson (RRA) August 16, 1988 8:02:52 pm PDT
DIRECTORY
Alloc USING [Handle],
ConvertUnsafe USING [SubString],
Literals,
Symbols USING [Type, UNSPEC],
SymbolOps USING [DecodeCard, DecodeInt, DecodeReal, EncodeCard, EncodeInt, EncodeReal];
LiteralOps: DEFINITIONS IMPORTS SymbolOps = {
OPEN Literals;
Initialize: PROC [Alloc.Handle];
Finalize: PROC;
ClassError: ERROR;
raised when trying to force to a class
procedural interface for standard literals
CopyLiteral: PROC [LTId] RETURNS [LTIndex];
DescriptorValue: PROC [LTIndex] RETURNS [LitDescriptor];
FindDescriptor: PROC [bits: INT, ptr: WordSequencePtr] RETURNS [LTIndex];
IsShort: PROC [lti: LTIndex] RETURNS [BOOL];
Find: PROC [class: LitClass, val: Symbols.UNSPEC] RETURNS [LTIndex];
FindBits: PROC [val: CARD] RETURNS [LTIndex] = INLINE {
RETURN [Find[bits, SymbolOps.EncodeCard[val]]]};
FindCard: PROC [val: CARD] RETURNS [LTIndex] = INLINE {
RETURN [Find[unsigned, SymbolOps.EncodeCard[val]]]};
FindInt: PROC [val: INT] RETURNS [LTIndex] = INLINE {
RETURN [Find[signed, SymbolOps.EncodeInt[val]]]};
FindReal: PROC [val: REAL] RETURNS [LTIndex] = INLINE {
RETURN [Find[real, SymbolOps.EncodeReal[val]]]};
ForgetEntries: PROC RETURNS [ltBias: CARD, stBias: CARD];
Value: PROC [lti: LTIndex] RETURNS [class: LitClass, val: Symbols.UNSPEC];
ValueBits: PROC [lti: LTIndex] RETURNS [CARD] = INLINE {
RETURN [SymbolOps.DecodeCard[Value[lti].val]];
};
ValueCard: PROC [lti: LTIndex] RETURNS [CARD] = INLINE {
class: LitClass; val: Symbols.UNSPEC;
card: CARD;
[class, val] ¬ Value[lti];
card ¬ SymbolOps.DecodeCard[val];
SELECT class FROM
unsigned => RETURN [card];
signed, either => IF card <= CARD[LAST[INT]] THEN RETURN [card];
ENDCASE;
ERROR ClassError;
};
ValueInt: PROC [lti: LTIndex] RETURNS [INT] = INLINE {
class: LitClass; val: Symbols.UNSPEC;
int: INT;
[class, val] ¬ Value[lti];
int ¬ SymbolOps.DecodeInt[val];
SELECT class FROM
unsigned, either => IF int >= 0 THEN RETURN [int];
signed => RETURN [int];
ENDCASE;
ERROR ClassError;
};
ValueReal: PROC [lti: LTIndex] RETURNS [REAL] = INLINE {
class: LitClass; val: Symbols.UNSPEC;
real: REAL;
[class, val] ¬ Value[lti];
real ¬ SymbolOps.DecodeReal[val];
IF class # real THEN ERROR ClassError ELSE RETURN [real];
};
procedural interface for string literals
CopyStringLiteral: PROC [baseP: Literals.Finger, index: Literals.STIndex]
RETURNS [Literals.STIndex];
FindHeapString: PROC [STIndex, Symbols.Type] RETURNS [STIndex];
FindLocalString: PROC [STIndex] RETURNS [STIndex];
FindString: PROC [ConvertUnsafe.SubString] RETURNS [STIndex];
MasterString: PROC [sti: STIndex] RETURNS [MSTIndex];
ResetLocalStrings: PROC RETURNS [STIndex];
StringReference: PROC [STIndex];
StringValue: PROC [STIndex] RETURNS [LONG STRING];
TextType: PROC [STIndex] RETURNS [Symbols.Type];
}.