aboutsummaryrefslogtreecommitdiffstats
path: root/mps/code/protocol.c
diff options
context:
space:
mode:
authorNick Barnes2001-10-31 14:40:56 +0000
committerNick Barnes2001-10-31 14:40:56 +0000
commit7acfca905d76140f4cc0b09c9a12de237de364cd (patch)
tree3ed8babfa3a73d30f29e08ca5d5adcda4ca4e826 /mps/code/protocol.c
parentb7ce4893f9902d57cd67ac9a92fa6c3d5a8fc833 (diff)
downloademacs-7acfca905d76140f4cc0b09c9a12de237de364cd.tar.gz
emacs-7acfca905d76140f4cc0b09c9a12de237de364cd.zip
Branch imports for masters.
Copied from Perforce Change: 23678 ServerID: perforce.ravenbrook.com
Diffstat (limited to 'mps/code/protocol.c')
-rw-r--r--mps/code/protocol.c125
1 files changed, 125 insertions, 0 deletions
diff --git a/mps/code/protocol.c b/mps/code/protocol.c
new file mode 100644
index 00000000000..8faec02f188
--- /dev/null
+++ b/mps/code/protocol.c
@@ -0,0 +1,125 @@
1/* impl.c.pool: PROTOCOL IMPLEMENTATION
2 *
3 * $HopeName: MMsrc!protocol.c(trunk.2) $
4 * Copyright (C) 1998 Harlequin Limited. All rights reserved.
5 *
6 * DESIGN
7 *
8 * .design: See design.mps.protocol
9 */
10
11#include "mpm.h"
12
13
14SRCID(protocol, "$HopeName: MMsrc!protocol.c(trunk.2) $");
15
16
17/* ProtocolClassCheck -- check a protocol class */
18
19Bool ProtocolClassCheck(ProtocolClass class)
20{
21 CHECKS(ProtocolClass, class);
22 CHECKS(ProtocolClass, class->superclass);
23 CHECKL(FUNCHECK(class->coerceInst));
24 CHECKL(FUNCHECK(class->coerceClass));
25 return TRUE;
26}
27
28
29/* ProtocolInstCheck -- check a protocol instance */
30
31Bool ProtocolInstCheck(ProtocolInst inst)
32{
33 CHECKS(ProtocolInst, inst);
34 CHECKL(ProtocolClassCheck(inst->class));
35 return TRUE;
36}
37
38
39/* ProtocolIsSubclass -- a predicate for testing subclass relationships
40 *
41 * A protocol class is always a subclass of itself. This is implemented
42 * via the coerceClass method provided by each class.
43 */
44Bool ProtocolIsSubclass(ProtocolClass sub, ProtocolClass super)
45{
46 ProtocolClass coerced;
47
48 AVERT(ProtocolClass, sub);
49 AVERT(ProtocolClass, super);
50
51 if (sub->coerceClass(&coerced, sub, super)) {
52 AVERT(ProtocolClass, coerced);
53 return TRUE;
54 } else {
55 return FALSE;
56 }
57}
58
59
60/* ProtocolCoerceClass -- the default method for coerceClass
61 *
62 * This default method must be inherited by any subclass
63 * which does not perform a multiple inheritance.
64 */
65static Bool ProtocolCoerceClass(ProtocolClass *coerceResult,
66 ProtocolClass proClass,
67 ProtocolClass super)
68{
69 ProtocolClass p = proClass;
70 ProtocolClass root = ProtocolClassGet();
71
72 AVERT(ProtocolClass, proClass);
73 AVERT(ProtocolClass, super);
74 AVERT(ProtocolClass, root);
75
76 while (p != super) {
77 AVERT(ProtocolClass, p);
78 if (p == root)
79 return FALSE;
80 p = p->superclass;
81 }
82 *coerceResult = proClass;
83 return TRUE;
84}
85
86
87/* ProtocolCoerceInst -- the default method for coerceInst
88 *
89 * This default method must be inherited by any subclass
90 * which does not perform a multiple inheritance.
91 */
92static Bool ProtocolCoerceInst(ProtocolInst *coerceResult,
93 ProtocolInst proInst,
94 ProtocolClass super)
95{
96 ProtocolClass p = proInst->class;
97 ProtocolClass root = ProtocolClassGet();
98
99 AVERT(ProtocolInst, proInst);
100 AVERT(ProtocolClass, super);
101 AVERT(ProtocolClass, root);
102
103 while (p != super) {
104 AVERT(ProtocolClass, p);
105 if (p == root)
106 return FALSE;
107 p = p->superclass;
108 }
109 *coerceResult = proInst;
110 return TRUE;
111}
112
113
114/* The class definition for the root of the hierarchy */
115
116DEFINE_CLASS(ProtocolClass, theClass)
117{
118 theClass->sig = ProtocolClassSig;
119 theClass->superclass = theClass;
120 theClass->coerceInst = ProtocolCoerceInst;
121 theClass->coerceClass = ProtocolCoerceClass;
122}
123
124
125