diff options
| author | Nick Barnes | 2001-10-31 14:40:56 +0000 |
|---|---|---|
| committer | Nick Barnes | 2001-10-31 14:40:56 +0000 |
| commit | 7acfca905d76140f4cc0b09c9a12de237de364cd (patch) | |
| tree | 3ed8babfa3a73d30f29e08ca5d5adcda4ca4e826 /mps/code/protocol.c | |
| parent | b7ce4893f9902d57cd67ac9a92fa6c3d5a8fc833 (diff) | |
| download | emacs-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.c | 125 |
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 | |||
| 14 | SRCID(protocol, "$HopeName: MMsrc!protocol.c(trunk.2) $"); | ||
| 15 | |||
| 16 | |||
| 17 | /* ProtocolClassCheck -- check a protocol class */ | ||
| 18 | |||
| 19 | Bool 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 | |||
| 31 | Bool 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 | */ | ||
| 44 | Bool 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 | */ | ||
| 65 | static 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 | */ | ||
| 92 | static 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 | |||
| 116 | DEFINE_CLASS(ProtocolClass, theClass) | ||
| 117 | { | ||
| 118 | theClass->sig = ProtocolClassSig; | ||
| 119 | theClass->superclass = theClass; | ||
| 120 | theClass->coerceInst = ProtocolCoerceInst; | ||
| 121 | theClass->coerceClass = ProtocolCoerceClass; | ||
| 122 | } | ||
| 123 | |||
| 124 | |||
| 125 | |||