-- Copyright (C) 1982, 1984 by Xerox Corporation. All rights reserved.
-- LupineRuntime.mesa, HGM, 21-Jan-84 21:47:57
-- Cedar 5, HGM, 21-Jan-84 20:43:43
-- File [Ivy]<Nelson>Lupine>LupineRuntime.mesa.
-- Last edited by BZM on 11-May-82 16:17:07.
-- This interface is used at runtime for marshaling and other common functions.
DIRECTORY
Environment USING [charsPerWord],
Inline USING [LongCOPY, HighHalf, LowHalf],
MesaRPC USING [Zones],
MesaRPCLupine USING [DataLength, maxDataLength, --PktLength,-- RPCPkt, StubPkt];
LupineRuntime: DEFINITIONS IMPORTS Inline =
BEGIN OPEN RpcPrivate: MesaRPCLupine;
-- Lupine's no-nonsense errors.
TranslationError: ERROR;
BindingError: ERROR;
RuntimeError: ERROR;
-- These procedures map into ERRORs (for now).
MarshalingError: PROCEDURE;
MarshalingExprError: PROCEDURE RETURNS [never: UNSPECIFIED];
-- These procedures map into RpcRuntime ERRORs.
UnmarshalingError: PROCEDURE;
UnmarshalingExprError: PROCEDURE RETURNS [never: UNSPECIFIED];
DispatchingError: PROCEDURE RETURNS [never: UNSPECIFIED];
defaultZones: MesaRPC.Zones;
-- Parameter protocol headers.
NilHeader: TYPE = BOOLEAN ← NULL;
RopeHeader: TYPE = CARDINAL ← NULL;
ListHeader, SequenceHeader: TYPE = LONG CARDINAL ← NULL;
StringHeader: TYPE = MACHINE DEPENDENT RECORD [
header(0): SELECT OVERLAID * FROM
Lengths => [maxLength(0), length(1): CARDINAL ← NULL],
All => [all(0): LONG CARDINAL],
ENDCASE] ← [Lengths[]];
-- Parameter marshaling routines.
StubPktDoubleWord: PROC [pkt: RpcPrivate.StubPkt, index: RpcPrivate.DataLength]
RETURNS [ --ptrToDoubleWord:-- POINTER TO LONG UNSPECIFIED] = INLINE {
RETURN[@pkt.data[index]]};
RpcPktDoubleWord: PROC [pkt: RpcPrivate.RPCPkt, index: RpcPrivate.DataLength]
RETURNS [ --ptrToDoubleWord:-- LONG POINTER TO LONG UNSPECIFIED] = INLINE {
RETURN[@pkt.data[index]]};
SHORT: PROCEDURE [long: LONG CARDINAL] RETURNS [CARDINAL] = INLINE
BEGIN
RETURN[
--IF long IN [0..LAST[CARDINAL]]
IF Inline.HighHalf[long] = 0 THEN Inline.LowHalf[long]
ELSE UnmarshalingExprError[]];
END;
Words: TYPE = --LONG-- CARDINAL ← NULL;
WordsForChars: PROCEDURE [chars: CARDINAL] RETURNS [ --words:-- Words] = INLINE
BEGIN
RETURN[(chars + Environment.charsPerWord - 1)/Environment.charsPerWord];
END;
CheckPktLength: PROCEDURE [
pkt: RpcPrivate.RPCPkt, lastPkt: BOOLEAN ← TRUE,
pktLength: RpcPrivate.DataLength] = INLINE
BEGIN
-- IF RpcPrivate.PktLength[pkt: pkt] # [lastPkt: lastPkt, pktLength: pktLength]
-- THEN UnmarshalingError;
END;
FinishThisPkt, StartNextPkt: PROCEDURE [
pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength]
RETURNS [zeroPktLength: RpcPrivate.DataLength];
CopyToPkt: PROCEDURE [
pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength,
dataAdr: LONG POINTER, dataLength: Words, alwaysOnePkt: BOOLEAN ← FALSE]
RETURNS [ --newPktLength:-- RpcPrivate.DataLength] = INLINE
BEGIN
IF alwaysOnePkt OR pktLength + dataLength <= RpcPrivate.maxDataLength THEN
BEGIN
Inline.LongCOPY[
to: @pkt.data[pktLength], from: dataAdr, nwords: dataLength];
RETURN[pktLength + dataLength];
END
ELSE RETURN[CopyToMultiplePkts[pkt, pktLength, dataAdr, dataLength]];
END;
CopyFromPkt: PROCEDURE [
pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength,
dataAdr: LONG POINTER, dataLength: Words, alwaysOnePkt: BOOLEAN ← FALSE]
RETURNS [ --newPktLength:-- RpcPrivate.DataLength] = INLINE
BEGIN
IF alwaysOnePkt OR pktLength + dataLength <= RpcPrivate.maxDataLength THEN
BEGIN
Inline.LongCOPY[
to: dataAdr, from: @pkt.data[pktLength], nwords: dataLength];
RETURN[pktLength + dataLength];
END
ELSE RETURN[CopyFromMultiplePkts[pkt, pktLength, dataAdr, dataLength]];
END;
CopyToMultiplePkts, CopyFromMultiplePkts: PRIVATE PROCEDURE [
pkt: RpcPrivate.RPCPkt, pktLength: RpcPrivate.DataLength,
dataAdr: LONG POINTER, dataLength: Words]
RETURNS [ --newPktLength:-- RpcPrivate.DataLength];
END. -- LupineRuntime.