1 2 //metadoc Message copyright Steve Dekorte 2002 3 //metadoc Message license BSD revised 4 5 #ifndef IOMESSAGE_DEFINED 6 #define IOMESSAGE_DEFINED 1 7 8 #include "IoVMApi.h" 9 #include "Common.h" 10 #include "List.h" 11 #include "UArray.h" 12 #include "IoTag.h" 13 #include "IoObject_struct.h" 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 #define MESSAGE_STOP_STATUS_NORMAL 0 20 #define MESSAGE_STOP_STATUS_BREAK 1 21 #define MESSAGE_STOP_STATUS_CONTINUE 2 22 #define MESSAGE_STOP_STATUS_RETURN 4 23 #define MESSAGE_STOP_STATUS_EOL 8 24 25 #define ISMESSAGE(self) IoObject_hasCloneFunc_(self, (IoTagCloneFunc *)IoMessage_rawClone) 26 27 #if !defined(IoSymbol_DEFINED) 28 #define IoSymbol_DEFINED 29 typedef IoObject IoSymbol; 30 #endif 31 32 typedef IoObject IoMessage; 33 34 #define IOMESSAGE_HASPREV 35 36 typedef struct 37 { 38 IoSymbol *name; 39 List *args; 40 #ifdef IOMESSAGE_HASPREV 41 IoMessage *previous; // unused for now 42 #endif 43 IoMessage *next; 44 IoObject *cachedResult; 45 46 // debugging info 47 //int charNumber; 48 int lineNumber; 49 IoSymbol *label; 50 } IoMessageData; 51 52 #define IOMESSAGEDATA(self) ((IoMessageData *)IoObject_dataPointer(self)) 53 54 // basics 55 56 IOVM_API IoMessage *IoMessage_proto(void *state); 57 IOVM_API IoMessage *IoMessage_rawClone(IoMessage *m); 58 IOVM_API IoMessage *IoMessage_new(void *state); 59 IOVM_API void IoMessage_copy_(IoMessage *self, IoMessage *other); 60 IOVM_API IoMessage *IoMessage_deepCopyOf_(IoMessage *m); 61 IOVM_API IoMessage *IoMessage_newWithName_(void *state, IoSymbol *symbol); 62 IOVM_API IoMessage *IoMessage_newWithName_label_(void *state, IoSymbol *symbol, IoSymbol *label); 63 IOVM_API IoMessage *IoMessage_newWithName_returnsValue_(void *state, IoSymbol *symbol, IoObject *v); 64 IOVM_API IoMessage *IoMessage_newWithName_andCachedArg_(void *state, IoSymbol *symbol, IoObject *v); 65 66 IOVM_API void IoMessage_mark(IoMessage *self); 67 IOVM_API void IoMessage_free(IoMessage *self); 68 69 IOVM_API IoSymbol *IoMessage_rawLabel(IoMessage *self); 70 IOVM_API int IoMessage_rawLineNumber(IoMessage *self); 71 IOVM_API int IoMessage_rawCharNumber(IoMessage *self); 72 IOVM_API void IoMessage_label_(IoMessage *self, IoSymbol *ioSymbol); // sets label for children too 73 IOVM_API void IoMessage_rawSetLineNumber_(IoMessage *self, int n); 74 IOVM_API void IoMessage_rawSetCharNumber_(IoMessage *self, int n); 75 IOVM_API void IoMessage_rawCopySourceLocation(IoMessage *self, IoMessage *other); 76 IOVM_API List *IoMessage_rawArgList(IoMessage *self); 77 IOVM_API unsigned char IoMessage_needsEvaluation(IoMessage *self); 78 79 IOVM_API void IoMessage_addCachedArg_(IoMessage *self, IoObject *v); 80 IOVM_API void IoMessage_setCachedArg_to_(IoMessage *self, int n, IoObject *v); 81 IOVM_API void IoMessage_setCachedArg_toInt_(IoMessage *self, int n, int anInt); 82 IOVM_API void IoMessage_rawSetCachedResult_(IoMessage *self, IoObject *v); 83 IOVM_API void IoMessage_rawSetName_(IoMessage *self, IoObject *v); 84 IOVM_API void IoMessage_rawSetLabel_(IoMessage *self, IoObject *v); 85 86 87 IOVM_API IO_METHOD(IoMessage, lineNumber); 88 IOVM_API IO_METHOD(IoMessage, characterNumber); 89 IOVM_API IO_METHOD(IoMessage, label); 90 91 // perform 92 93 IOVM_API IO_METHOD(IoMessage, doInContext); 94 IOVM_API IoObject *IoMessage_locals_performOn_(IoMessage *self, IoObject *locals, IoObject *target); 95 96 // args 97 98 //IOVM_API IoObject *IoMessage_locals_valueArgAt_(IoMessage *self, IoObject *locals, int n); 99 IOVM_API IoObject *IoMessage_locals_valueOrEvalArgAt_(IoMessage *self, IoObject *locals, int n); 100 IOVM_API void IoMessage_assertArgCount_receiver_(IoMessage *self, int n, IoObject *receiver); 101 IOVM_API int IoMessage_argCount(IoMessage *self); 102 103 IOVM_API void IoMessage_locals_numberArgAt_errorForType_( 104 IoMessage *self, 105 IoObject *locals, 106 int n, 107 const char *typeName); 108 109 IOVM_API IoObject *IoMessage_locals_numberArgAt_(IoMessage *self, IoObject *locals, int n); 110 IOVM_API int IoMessage_locals_intArgAt_(IoMessage *self, IoObject *locals, int n); 111 IOVM_API int IoMessage_locals_boolArgAt_(IoMessage *self, IoObject *locals, int n); 112 IOVM_API long IoMessage_locals_longArgAt_(IoMessage *self, IoObject *locals, int n); 113 IOVM_API size_t IoMessage_locals_sizetArgAt_(IoMessage *self, IoObject *locals, int n); 114 IOVM_API double IoMessage_locals_doubleArgAt_(IoMessage *self, IoObject *locals, int n); 115 IOVM_API float IoMessage_locals_floatArgAt_(IoMessage *self, IoObject *locals, int n); 116 117 IOVM_API IoObject *IoMessage_locals_symbolArgAt_(IoMessage *self, IoObject *locals, int n); 118 IOVM_API IoObject *IoMessage_locals_seqArgAt_(IoMessage *self, IoObject *locals, int n); 119 IOVM_API IoObject *IoMessage_locals_mutableSeqArgAt_(IoMessage *self, IoObject *locals, int n); 120 IOVM_API char *IoMessage_locals_cStringArgAt_(IoMessage *self, IoObject *locals, int n); 121 IOVM_API IoObject *IoMessage_locals_valueAsStringArgAt_(IoMessage *self, IoObject *locals, int n); 122 123 IOVM_API IoObject *IoMessage_locals_blockArgAt_(IoMessage *self, IoObject *locals, int n); 124 IOVM_API IoObject *IoMessage_locals_dateArgAt_(IoMessage *self, IoObject *locals, int n); 125 IOVM_API IoObject *IoMessage_locals_mapArgAt_(IoMessage *self, IoObject *locals, int n); 126 IOVM_API IoObject *IoMessage_locals_messageArgAt_(IoMessage *self, IoObject *locals, int n); 127 IOVM_API IoObject *IoMessage_locals_listArgAt_(IoMessage *self, IoObject *locals, int n); 128 129 // printing 130 131 IOVM_API void IoMessage_print(IoMessage *self); 132 IOVM_API void IoMessage_printWithReturn(IoMessage *self); 133 IOVM_API UArray *IoMessage_description(IoMessage *self); 134 IOVM_API UArray *IoMessage_descriptionJustSelfAndArgs(IoMessage *self); /* caller must io_free returned */ 135 IOVM_API void IoMessage_appendDescriptionTo_follow_(IoMessage *self, UArray *ba, int follow); 136 IOVM_API IO_METHOD(IoMessage, asString); 137 138 // primitive methods 139 140 IOVM_API IO_METHOD(IoMessage, clone); 141 IOVM_API IO_METHOD(IoMessage, protoName); 142 IOVM_API IO_METHOD(IoMessage, protoSetName); 143 IOVM_API IO_METHOD(IoMessage, descriptionString); 144 145 // next 146 147 IOVM_API IO_METHOD(IoMessage, next); 148 IOVM_API IoMessage *IoMessage_rawNext(IoMessage *self); 149 150 IOVM_API IO_METHOD(IoMessage, setNext); 151 IOVM_API void IoMessage_rawSetNext_(IoMessage *self, IoMessage *m); 152 153 IOVM_API IO_METHOD(IoMessage, isEOL); 154 IOVM_API int IoMessage_rawIsEOL(IoMessage *self); 155 156 IOVM_API IO_METHOD(IoMessage, nextIgnoreEOLs); 157 IOVM_API IoMessage *IoMessage_rawNextIgnoreEOLs(IoMessage *self); 158 IOVM_API IO_METHOD(IoMessage, last); 159 IOVM_API IoMessage *IoMessage_rawLast(IoMessage *self); 160 IOVM_API IO_METHOD(IoMessage, lastBeforeEOL); 161 IOVM_API IoMessage *IoMessage_rawLastBeforeEOL(IoMessage *self); 162 163 // previous 164 165 IOVM_API IO_METHOD(IoMessage, previous); 166 IOVM_API IoMessage *IoMessage_rawPrevious(IoMessage *self); 167 168 IOVM_API IO_METHOD(IoMessage, setPrevious); 169 IOVM_API void IoMessage_rawSetPrevious(IoMessage *self, IoMessage *m); 170 171 IOVM_API IO_METHOD(IoMessage, argAt); 172 IOVM_API IO_METHOD(IoMessage, arguments); 173 IOVM_API IO_METHOD(IoMessage, setArguments); 174 IOVM_API IO_METHOD(IoMessage, appendArg); 175 IOVM_API IO_METHOD(IoMessage, appendCachedArg); 176 IOVM_API IO_METHOD(IoMessage, argCount_); 177 IOVM_API IO_METHOD(IoMessage, cachedResult); 178 IOVM_API IO_METHOD(IoMessage, setCachedResult); 179 IOVM_API IO_METHOD(IoMessage, removeCachedResult); 180 IOVM_API IO_METHOD(IoMessage, hasCachedResult); 181 182 IOVM_API IO_METHOD(IoMessage, setLineNumber); 183 IOVM_API IO_METHOD(IoMessage, setCharacterNumber); 184 IOVM_API IO_METHOD(IoMessage, setLabel); 185 186 IOVM_API IO_METHOD(IoMessage, fromString); 187 IOVM_API IO_METHOD(IoMessage, argsEvaluatedIn); 188 IOVM_API IO_METHOD(IoMessage, evaluatedArgs); 189 IOVM_API IO_METHOD(IoMessage, profilerTime); 190 191 IOVM_API void IoMessage_foreachArgs(IoMessage *self, 192 IoObject *object, 193 IoSymbol **indexSlotName, 194 IoSymbol **valueSlotName, 195 IoMessage **doMessage); 196 197 IOVM_API IoMessage *IoMessage_asMessageWithEvaluatedArgs(IoMessage *self, IoObject *locals, IoMessage *m); 198 199 // ------------------------------ 200 201 #include "IoMessage_inline.h" 202 #include "IoMessage_parser.h" 203 204 //IoSymbol *IoMessage_name(IoMessage *self); 205 206 #define IoMessage_name(self) (((IoMessageData *)IoObject_dataPointer(self))->name) 207 #define IoMessage_rawCachedResult(self) (((IoMessageData *)IoObject_dataPointer(self))->cachedResult) 208 209 IOVM_API void IoMessage_addArg_(IoMessage *self, IoMessage *m); 210 IOVM_API IoMessage *IoMessage_rawArgAt_(IoMessage *self, int n); 211 IOVM_API List *IoMessage_rawArgs(IoMessage *self); 212 213 IOVM_API UArray *IoMessage_asMinimalStackEntryDescription(IoMessage *self); 214 215 #ifdef __cplusplus 216 } 217 #endif 218 #endif 219