-- JaMLiteral.mesa
-- Written by: John Warnock, January, 1979
-- Last changed by Doug Wyatt, March 29, 1980 7:12 PM
DIRECTORY
JaMLiteralDefs: FROM "JaMLiteralDefs",
JaMMasterDefs: FROM "JaMMasterDefs" USING [
Object, Stack],
JaMStackDefs: FROM "JaMStackDefs" USING [
Push],
JaMVMDefs: FROM "JaMVMDefs" USING [
AllocateCharsVM, PutCharsVM],
StreamDefs: FROM "StreamDefs" USING [
StreamHandle];
JaMLiteral: PROGRAM
IMPORTS JaMStackDefs, JaMVMDefs
EXPORTS JaMLiteralDefs =
BEGIN OPEN JaMMasterDefs;
-- The following routines implement a set of literal building routines.
-- The resulting constructed literal is pushed on the operand stack.
IntegerLit: PUBLIC PROCEDURE [i:INTEGER,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,IntegerType[i]],s];
END;
LongIntegerLit: PUBLIC PROCEDURE [l:LONG INTEGER,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,LongIntegerType[l]],s];
END;
RealLit: PUBLIC PROCEDURE [r:REAL,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,RealType[r]],s];
END;
BooleanLit: PUBLIC PROCEDURE [b:BOOLEAN,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,BooleanType[BooleanVal:b]],s];
END;
StringLit: PUBLIC PROCEDURE [string:STRING,s:Stack] =
BEGIN
st:StringType Object ← MakeStringObject[string];
st.litflag ← lit;
JaMStackDefs.Push[st,s];
END;
UserLit: PUBLIC PROCEDURE [type:INTEGER,address:LONG POINTER,s:Stack] =
BEGIN
us:UserType Object ←[lit,UserType[type,address]];
JaMStackDefs.Push[us,s];
END;
MakeStringObject: PUBLIC PROCEDURE [string:STRING]
RETURNS [ob:StringType Object] =
BEGIN
ob← [nolit,StringType[,,]];
[ob.Address,ob.Offset]←JaMVMDefs.AllocateCharsVM[string.length];
ob.Length←string.length;
JaMVMDefs.PutCharsVM[ob.Address,ob.Offset,
@string.text,0,string.length];
END;
StreamLit: PUBLIC PROCEDURE[stream:StreamDefs.StreamHandle,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,StreamType[stream]],s];
END;
END.