| File: | src/syme.c |
| Warning: | line 556, column 40 The result of left shift is undefined because the right operand is negative |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /***************************************************************************** | |||
| 2 | * | |||
| 3 | * syme.c: Symbol meanings. | |||
| 4 | * | |||
| 5 | * Copyright (c) 1990-2007 Aldor Software Organization Ltd (Aldor.org). | |||
| 6 | * | |||
| 7 | ****************************************************************************/ | |||
| 8 | ||||
| 9 | #include "axlobs.h" | |||
| 10 | #include "debug.h" | |||
| 11 | #include "fint.h" | |||
| 12 | #include "fluid.h" | |||
| 13 | #include "format.h" | |||
| 14 | #include "simpl.h" | |||
| 15 | #include "spesym.h" | |||
| 16 | #include "stab.h" | |||
| 17 | #include "store.h" | |||
| 18 | #include "ti_top.h" | |||
| 19 | #include "util.h" | |||
| 20 | #include "sefo.h" | |||
| 21 | #include "lib.h" | |||
| 22 | #include "tfsat.h" | |||
| 23 | #include "ablogic.h" | |||
| 24 | #include "abpretty.h" | |||
| 25 | #include "doc.h" | |||
| 26 | #include "comsg.h" | |||
| 27 | #include "strops.h" | |||
| 28 | #include "table.h" | |||
| 29 | #include "sexpr.h" | |||
| 30 | ||||
| 31 | Bool symeDebug = false((int) 0); | |||
| 32 | Bool symeFillDebug = false((int) 0); | |||
| 33 | Bool symeHasDebug = false((int) 0); | |||
| 34 | Bool symeLibDebug = false((int) 0); | |||
| 35 | extern Bool tfHashDebug; | |||
| 36 | ||||
| 37 | #define symeDEBUGif (!symeDebug) { } else afprintf DEBUG_IF(syme)if (!symeDebug) { } else afprintf | |||
| 38 | #define symeFillDEBUGif (!symeFillDebug) { } else afprintf DEBUG_IF(symeFill)if (!symeFillDebug) { } else afprintf | |||
| 39 | #define symeHasDEBUGif (!symeHasDebug) { } else afprintf DEBUG_IF(symeHas)if (!symeHasDebug) { } else afprintf | |||
| 40 | #define symeLibDEBUGif (!symeLibDebug) { } else afprintf DEBUG_IF(symeLib)if (!symeLibDebug) { } else afprintf | |||
| 41 | #define tfHashDEBUGif (!tfHashDebug) { } else afprintf DEBUG_IF(tfHash)if (!tfHashDebug) { } else afprintf | |||
| 42 | ||||
| 43 | /****************************************************************************** | |||
| 44 | * | |||
| 45 | * :: Local function declarations | |||
| 46 | * | |||
| 47 | *****************************************************************************/ | |||
| 48 | ||||
| 49 | localstatic Syme symeAlloc (SymeTag); | |||
| 50 | localstatic Syme symeAllocCopy (Syme); | |||
| 51 | localstatic void symeNeed (Syme, UByte); | |||
| 52 | ||||
| 53 | localstatic SymeList symeLocalTwins (Syme); | |||
| 54 | ||||
| 55 | localstatic TForm symeFillType (Syme); | |||
| 56 | localstatic void symeFillFrLibrary (Syme); | |||
| 57 | localstatic void symeFillFrExporter (Syme, TForm); | |||
| 58 | ||||
| 59 | localstatic Bool symeListCheckFindSyme (SymeList, Syme); | |||
| 60 | localstatic void symeListCheckJoinSymes (Syme, Syme); | |||
| 61 | localstatic Bool abIsFullyInstantiated (Sefo); | |||
| 62 | localstatic int symeCheckHas (SymeCContext, Sefo, Sefo); | |||
| 63 | localstatic void symeCheckHasMemo (Sefo, Sefo, SatMask); | |||
| 64 | localstatic int symeCheckHasResult (Sefo, Sefo, Bool *); | |||
| 65 | localstatic Bool symeCheckIdentifier (AbSyn, Syme); | |||
| 66 | ||||
| 67 | extern void tiTfSefo (Stab, TForm); | |||
| 68 | extern TForm tiGetTForm (Stab, AbSyn); | |||
| 69 | extern TForm abGetCategory (AbSyn); | |||
| 70 | ||||
| 71 | /****************************************************************************** | |||
| 72 | * | |||
| 73 | * :: Syme field operations. | |||
| 74 | * | |||
| 75 | *****************************************************************************/ | |||
| 76 | ||||
| 77 | localstatic Syme | |||
| 78 | symeAlloc(SymeTag kind) | |||
| 79 | { | |||
| 80 | Syme syme = (Syme) stoAlloc((unsigned) OB_Syme(14 + 7), sizeof(*syme)); | |||
| 81 | ||||
| 82 | syme->fieldc = 0; | |||
| 83 | syme->kind = kind; | |||
| 84 | syme->bits = 0; | |||
| 85 | ||||
| 86 | syme->locmask = 0; | |||
| 87 | syme->hasmask = 0; | |||
| 88 | syme->full = NULL((void*)0); | |||
| 89 | syme->fieldv = NULL((void*)0); | |||
| 90 | syme->lib = NULL((void*)0); | |||
| 91 | ||||
| 92 | return syme; | |||
| 93 | } | |||
| 94 | ||||
| 95 | localstatic Syme | |||
| 96 | symeAllocCopy(Syme osyme) | |||
| 97 | { | |||
| 98 | Syme syme = symeAlloc(symeKind(osyme)((((osyme)->kind == SYME_Trigger ? libGetAllSymes((osyme)-> lib) : ((void*)0)), (osyme))->kind)); | |||
| 99 | ||||
| 100 | symeBits(syme)((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) = symeBits(osyme)((((osyme)->kind == SYME_Trigger ? libGetAllSymes((osyme)-> lib) : ((void*)0)), (osyme))->bits) & SYME_COPY_BITS0x33FF; | |||
| 101 | symeHasMask(syme)((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) = symeHasMask(osyme)((((osyme)->kind == SYME_Trigger ? libGetAllSymes((osyme)-> lib) : ((void*)0)), (osyme))->hasmask); | |||
| 102 | symeFull(syme)((syme)->full) = osyme; | |||
| 103 | ||||
| 104 | return syme; | |||
| 105 | } | |||
| 106 | ||||
| 107 | localstatic void | |||
| 108 | symeNeed(Syme syme, UByte nfieldc) | |||
| 109 | { | |||
| 110 | UByte i, ofieldc = symeLocalFieldc(syme)((syme)->fieldc); | |||
| 111 | AInt *fieldv; | |||
| 112 | ULong size; | |||
| 113 | ||||
| 114 | /* Check the field counts. */ | |||
| 115 | if (nfieldc <= ofieldc) | |||
| 116 | return; | |||
| 117 | ||||
| 118 | /* Allocate the new space. */ | |||
| 119 | size = nfieldc * sizeof(AInt); | |||
| 120 | if (symeLocalFieldv(syme)((syme)->fieldv)) | |||
| 121 | fieldv = (AInt *) stoResize(symeLocalFieldv(syme)((syme)->fieldv), size); | |||
| 122 | else | |||
| 123 | fieldv = (AInt *) stoAlloc((unsigned) OB_Other0, size); | |||
| 124 | ||||
| 125 | /* Initialize the new space. */ | |||
| 126 | for (i = ofieldc; i < nfieldc; i += 1) | |||
| 127 | fieldv[i] = 0; | |||
| 128 | ||||
| 129 | /* Update the syme. */ | |||
| 130 | symeLocalFieldc(syme)((syme)->fieldc) = nfieldc; | |||
| 131 | symeLocalFieldv(syme)((syme)->fieldv) = fieldv; | |||
| 132 | } | |||
| 133 | ||||
| 134 | UByte | |||
| 135 | symeIndex(Syme syme, SymeField field) | |||
| 136 | { | |||
| 137 | SymeField f; | |||
| 138 | UByte i; | |||
| 139 | ||||
| 140 | for (i = 0, f = SYME_FIELD_START; f < field; f += 1) | |||
| 141 | if (symeHasLocal(syme, f)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (f )))) i += 1; | |||
| 142 | ||||
| 143 | return i; | |||
| 144 | } | |||
| 145 | ||||
| 146 | void | |||
| 147 | symeSetFieldTrigger(Syme syme, SymeField field) | |||
| 148 | { | |||
| 149 | symeSetTrigger(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) |= (0x4000)); | |||
| 150 | symeSetFieldFn(syme, field, symeFieldDefault(field)(symeFieldInfo[field].def)); | |||
| 151 | } | |||
| 152 | ||||
| 153 | AInt | |||
| 154 | symeGetFieldFn(Syme syme, SymeField field) | |||
| 155 | { | |||
| 156 | while (!symeHasLocal(syme, field)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (field )))) { | |||
| 157 | syme = symeFull(syme)((syme)->full); | |||
| 158 | if (syme == NULL((void*)0)) return symeFieldDefault(field)(symeFieldInfo[field].def); | |||
| 159 | } | |||
| 160 | ||||
| 161 | if (symeHasTrigger(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x4000)) && symeTriggerField(field)((field) == SYFI_Origin || (field) == SYFI_Twins || (field) == SYFI_Inlined)) { | |||
| 162 | symeClrTrigger(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) &= ~(0x4000)); | |||
| 163 | libGetAllSymes(symeLib(syme)((syme)->lib)); | |||
| 164 | } | |||
| 165 | ||||
| 166 | return symeGetLocal(syme, field)((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (field ))) ? ((syme)->fieldv)[symeIndex(syme,field)] : (symeFieldInfo [field].def)); | |||
| 167 | } | |||
| 168 | ||||
| 169 | AInt | |||
| 170 | symeSetFieldFn(Syme syme, SymeField field, AInt value) | |||
| 171 | { | |||
| 172 | UByte fieldc, nfieldc, index, i; | |||
| 173 | AInt *fieldv; | |||
| 174 | ||||
| 175 | fieldc = symeIndex(syme, SYME_FIELD_LIMIT); | |||
| 176 | index = symeIndex(syme, field); | |||
| 177 | ||||
| 178 | nfieldc = fieldc + 1; | |||
| 179 | symeNeed(syme, nfieldc); | |||
| 180 | symeSetLocalBit(syme, field)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) |= (1 << (field ))); | |||
| 181 | symeSetFieldBit(syme, field)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) |= (1 << (field ))); | |||
| 182 | ||||
| 183 | fieldv = symeLocalFieldv(syme)((syme)->fieldv); | |||
| 184 | for (i = fieldc; i > index; i -= 1) | |||
| 185 | fieldv[i] = fieldv[i-1]; | |||
| 186 | return fieldv[i] = value; | |||
| 187 | } | |||
| 188 | ||||
| 189 | AInt symeSetFieldVal; | |||
| 190 | ||||
| 191 | /****************************************************************************** | |||
| 192 | * | |||
| 193 | * :: Basic operations. | |||
| 194 | * | |||
| 195 | *****************************************************************************/ | |||
| 196 | ||||
| 197 | Syme | |||
| 198 | symeNew(SymeTag kind, Symbol id, TForm type, StabLevel level) | |||
| 199 | { | |||
| 200 | Syme syme = symeAlloc(kind); | |||
| 201 | ||||
| 202 | symeSetId(syme, id)(((syme)->id) = (id)); | |||
| 203 | symeSetLib(syme, NULL((void*)0)); | |||
| 204 | symeSetHash(syme, (Hash) 0)(((syme)->hash) = ((Hash) 0)); | |||
| 205 | symeSetType(syme, type); | |||
| 206 | symeSetDefLevel(syme, level); | |||
| 207 | ||||
| 208 | if (fintMode == FINT_LOOP2) | |||
| 209 | symeSetIntStepNo(syme, intStepNo)(symeSetFieldVal = ((AInt) (intStepNo)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_IntStepNo))) ? ( ((syme)->fieldv)[symeIndex(syme,SYFI_IntStepNo)] = (symeSetFieldVal )) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_IntStepNo].def) ? symeSetFieldVal : symeSetFieldFn(syme ,SYFI_IntStepNo,symeSetFieldVal)); | |||
| 210 | ||||
| 211 | return syme; | |||
| 212 | } | |||
| 213 | ||||
| 214 | Syme | |||
| 215 | symeNewLib(SymeTag kind, Symbol id, TForm type, Lib lib) | |||
| 216 | { | |||
| 217 | Syme syme = symeAlloc(kind); | |||
| 218 | ||||
| 219 | symeSetId(syme, id)(((syme)->id) = (id)); | |||
| 220 | symeSetLib(syme, lib); | |||
| 221 | symeSetHash(syme, (Hash) 0)(((syme)->hash) = ((Hash) 0)); | |||
| 222 | syme->type = type; | |||
| 223 | ||||
| 224 | if (kind != SYME_Trigger) | |||
| 225 | symeSetLibLevel(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) |= (0x2000)); | |||
| 226 | ||||
| 227 | return syme; | |||
| 228 | } | |||
| 229 | ||||
| 230 | Syme | |||
| 231 | symeCopy(Syme osyme) | |||
| 232 | { | |||
| 233 | Syme syme = symeAllocCopy(osyme); | |||
| 234 | ||||
| 235 | symeSetId(syme, symeId(osyme))(((syme)->id) = (((osyme)->id))); | |||
| 236 | symeSetLib(syme, symeLib(osyme)((osyme)->lib)); | |||
| 237 | symeSetHash(syme, symeHash(osyme))(((syme)->hash) = (((osyme)->hash))); | |||
| 238 | syme->type = osyme->type; | |||
| 239 | ||||
| 240 | if (fintMode == FINT_LOOP2) | |||
| 241 | symeSetIntStepNo(syme, intStepNo)(symeSetFieldVal = ((AInt) (intStepNo)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_IntStepNo))) ? ( ((syme)->fieldv)[symeIndex(syme,SYFI_IntStepNo)] = (symeSetFieldVal )) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_IntStepNo].def) ? symeSetFieldVal : symeSetFieldFn(syme ,SYFI_IntStepNo,symeSetFieldVal)); | |||
| 242 | ||||
| 243 | return syme; | |||
| 244 | } | |||
| 245 | ||||
| 246 | void | |||
| 247 | symeFree(Syme syme) | |||
| 248 | { | |||
| 249 | stoFree((Pointer) syme); | |||
| 250 | } | |||
| 251 | ||||
| 252 | Bool | |||
| 253 | symeEq(Syme syme1, Syme syme2) | |||
| 254 | { | |||
| 255 | return syme1 == syme2; | |||
| 256 | } | |||
| 257 | ||||
| 258 | Bool | |||
| 259 | symeEqualWithAnnotation(Syme syme1, Syme syme2) | |||
| 260 | { | |||
| 261 | if (syme1 == syme2) { | |||
| 262 | return true1; | |||
| 263 | } | |||
| 264 | if (symeKind(syme1)((((syme1)->kind == SYME_Trigger ? libGetAllSymes((syme1)-> lib) : ((void*)0)), (syme1))->kind) != symeKind(syme2)((((syme2)->kind == SYME_Trigger ? libGetAllSymes((syme2)-> lib) : ((void*)0)), (syme2))->kind)) { | |||
| 265 | return false((int) 0); | |||
| 266 | } | |||
| 267 | ||||
| 268 | if (symeDefLevel(syme1) != symeDefLevel(syme2)) { | |||
| 269 | return false((int) 0); | |||
| 270 | } | |||
| 271 | ||||
| 272 | return symeEqual(syme1, syme2); | |||
| 273 | } | |||
| 274 | ||||
| 275 | ||||
| 276 | /* | |||
| 277 | * symeHash is a macro and we sometimes need a function. | |||
| 278 | */ | |||
| 279 | Hash | |||
| 280 | symeHashFn(Syme syme) | |||
| 281 | { | |||
| 282 | return symeHash(syme)((syme)->hash); | |||
| 283 | } | |||
| 284 | ||||
| 285 | ||||
| 286 | /****************************************************************************** | |||
| 287 | * | |||
| 288 | * :: Field accessors. | |||
| 289 | * | |||
| 290 | *****************************************************************************/ | |||
| 291 | ||||
| 292 | TForm | |||
| 293 | symeType(Syme syme) | |||
| 294 | { | |||
| 295 | Syme ext; | |||
| 296 | TForm tf; | |||
| 297 | ||||
| 298 | /* Use the type of the extension if present. */ | |||
| 299 | ext = symeExtensionFirst(syme); | |||
| 300 | if (ext) return symeType(ext); | |||
| 301 | ||||
| 302 | /* Trigger symes from other libraries. */ | |||
| 303 | symeTrigger(syme)(((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme)); | |||
| 304 | ||||
| 305 | /* Fill types on lazy symbol meanings. */ | |||
| 306 | if (symeIsLazy(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0001))) | |||
| 307 | return symeFillType(syme); | |||
| 308 | ||||
| 309 | /* Follow forward types if present. */ | |||
| 310 | tf = syme->type; | |||
| 311 | ||||
| 312 | /* BDS: tfIsForward(tf) dereferences tf. Consequently, it will seg | |||
| 313 | fault if tf is null. If everything works properly, we should | |||
| 314 | never reach this point without tf pointing to something valid. */ | |||
| 315 | assert(tf != NULL)do { if (!(tf != ((void*)0))) _do_assert(("tf != NULL"),"syme.c" ,315); } while (0); | |||
| 316 | ||||
| 317 | if (tfIsForward(tf)(((tf)->tag) == TF_Forward)) | |||
| 318 | tf = symeSetType(syme, tfFollowOnly(tf)); | |||
| 319 | ||||
| 320 | return tf; | |||
| 321 | } | |||
| 322 | ||||
| 323 | TForm | |||
| 324 | symeExporter(Syme syme) | |||
| 325 | { | |||
| 326 | assert(symeIsImport(syme))do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind) == SYME_Import ))) _do_assert(("symeIsImport(syme)"),"syme.c",326); } while ( 0); | |||
| 327 | return (TForm) symeGetField(symeExportingSyme(syme), SYFI_Exporter)(SYFI_Exporter < (8 * sizeof(int)) && !(((((symeExportingSyme (syme))->kind == SYME_Trigger ? libGetAllSymes((symeExportingSyme (syme))->lib) : ((void*)0)), (symeExportingSyme(syme)))-> hasmask) & (1 << (SYFI_Exporter))) ? (symeFieldInfo [SYFI_Exporter].def) : (((((symeExportingSyme(syme))->kind == SYME_Trigger ? libGetAllSymes((symeExportingSyme(syme))-> lib) : ((void*)0)), (symeExportingSyme(syme)))->locmask) & (1 << (SYFI_Exporter))) ? ((((((symeExportingSyme(syme ))->kind == SYME_Trigger ? libGetAllSymes((symeExportingSyme (syme))->lib) : ((void*)0)), (symeExportingSyme(syme)))-> locmask) & (1 << (SYFI_Exporter))) ? ((symeExportingSyme (syme))->fieldv)[symeIndex(symeExportingSyme(syme),SYFI_Exporter )] : (symeFieldInfo[SYFI_Exporter].def)) : symeGetFieldFn(symeExportingSyme (syme),SYFI_Exporter)); | |||
| 328 | } | |||
| 329 | ||||
| 330 | Syme | |||
| 331 | symeExportingSyme(Syme syme) | |||
| 332 | { | |||
| 333 | Syme ext; | |||
| 334 | ||||
| 335 | assert(symeIsImport(syme))do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind) == SYME_Import ))) _do_assert(("symeIsImport(syme)"),"syme.c",335); } while ( 0); | |||
| 336 | ||||
| 337 | /* Use the exporter of the extension if present. */ | |||
| 338 | ext = symeExtension(syme); | |||
| 339 | if (ext && symeIsImport(ext)(((((ext)->kind == SYME_Trigger ? libGetAllSymes((ext)-> lib) : ((void*)0)), (ext))->kind) == SYME_Import)) | |||
| 340 | return symeExportingSyme(ext); | |||
| 341 | ||||
| 342 | return syme; | |||
| 343 | } | |||
| 344 | ||||
| 345 | SymeList | |||
| 346 | symeExtendee(Syme syme) | |||
| 347 | { | |||
| 348 | return (SymeList) symeGetFieldFn(syme, SYFI_Extendee); | |||
| 349 | } | |||
| 350 | ||||
| 351 | Doc | |||
| 352 | symeComment(Syme syme) | |||
| 353 | { | |||
| 354 | Doc doc; | |||
| 355 | ||||
| 356 | assert(symeIsExport(syme))do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind) == SYME_Export ))) _do_assert(("symeIsExport(syme)"),"syme.c",356); } while ( 0); | |||
| 357 | ||||
| 358 | /* Use docNone if the comment is not present. */ | |||
| 359 | doc = (Doc) symeGetFieldFn(syme, SYFI_Comment); | |||
| 360 | if (doc == NULL((void*)0)) doc = docNone; | |||
| 361 | ||||
| 362 | return doc; | |||
| 363 | } | |||
| 364 | ||||
| 365 | Syme | |||
| 366 | symeOriginal(Syme syme) | |||
| 367 | { | |||
| 368 | /* Use symeFull(syme) unless an explicit value is present. */ | |||
| 369 | while (!symeHasLocal(syme, SYFI_Original)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Original )))) { | |||
| 370 | if (!symeFull(syme)((syme)->full)) return syme; | |||
| 371 | syme = symeFull(syme)((syme)->full); | |||
| 372 | } | |||
| 373 | ||||
| 374 | return (Syme) symeGetField(syme, SYFI_Original)(SYFI_Original < (8 * sizeof(int)) && !(((((syme)-> kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void *)0)), (syme))->hasmask) & (1 << (SYFI_Original) )) ? (symeFieldInfo[SYFI_Original].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_Original))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Original))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_Original )] : (symeFieldInfo[SYFI_Original].def)) : symeGetFieldFn(syme ,SYFI_Original)); | |||
| 375 | } | |||
| 376 | ||||
| 377 | SefoList | |||
| 378 | symeCondition(Syme syme) | |||
| 379 | { | |||
| 380 | /* Ignore the conditions if needed for syme equality tests. */ | |||
| 381 | if (symePopConds(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0400))) return listNil(Sefo)((SefoList) 0); | |||
| 382 | return (SefoList) symeGetField(syme, SYFI_Condition)(SYFI_Condition < (8 * sizeof(int)) && !(((((syme) ->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ( (void*)0)), (syme))->hasmask) & (1 << (SYFI_Condition ))) ? (symeFieldInfo[SYFI_Condition].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_Condition))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Condition))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_Condition )] : (symeFieldInfo[SYFI_Condition].def)) : symeGetFieldFn(syme ,SYFI_Condition)); | |||
| 383 | } | |||
| 384 | ||||
| 385 | Syme | |||
| 386 | symeExtension(Syme syme) | |||
| 387 | { | |||
| 388 | Syme ext = symeExtensionFirst(syme); | |||
| 389 | /* | |||
| 390 | * Note: There may be an issue here, need to investigate | |||
| 391 | if (ext && ((Syme) symeExtensionFirst(ext)) != NULL) { | |||
| 392 | afprintf(dbOut, "More extensions for %pSyme\n", syme); | |||
| 393 | } | |||
| 394 | */ | |||
| 395 | return ext; | |||
| 396 | } | |||
| 397 | ||||
| 398 | Syme | |||
| 399 | symeExtensionFirst(Syme syme) | |||
| 400 | { | |||
| 401 | Syme ext = (Syme) symeGetField(syme, SYFI_Extension)(SYFI_Extension < (8 * sizeof(int)) && !(((((syme) ->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ( (void*)0)), (syme))->hasmask) & (1 << (SYFI_Extension ))) ? (symeFieldInfo[SYFI_Extension].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_Extension))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Extension))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_Extension )] : (symeFieldInfo[SYFI_Extension].def)) : symeGetFieldFn(syme ,SYFI_Extension)); | |||
| 402 | return ext; | |||
| 403 | } | |||
| 404 | ||||
| 405 | Syme | |||
| 406 | symeExtensionFull(Syme syme) | |||
| 407 | { | |||
| 408 | Syme ext = symeExtensionFirst(syme); | |||
| 409 | if (ext == NULL((void*)0)) { | |||
| 410 | return syme; | |||
| 411 | } | |||
| 412 | return symeExtensionFull(ext); | |||
| 413 | } | |||
| 414 | ||||
| 415 | localstatic SymeList | |||
| 416 | symeLocalTwins(Syme syme) | |||
| 417 | { | |||
| 418 | return (SymeList) symeGetLocal(syme, SYFI_Twins)((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Twins ))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_Twins)] : (symeFieldInfo [SYFI_Twins].def)); | |||
| 419 | } | |||
| 420 | ||||
| 421 | SymeList | |||
| 422 | symeTwins(Syme syme) | |||
| 423 | { | |||
| 424 | static SymeList symes0 = listNil(Syme)((SymeList) 0); | |||
| 425 | SymeList symes; | |||
| 426 | ||||
| 427 | if (symes0 == listNil(Syme)((SymeList) 0)) | |||
| 428 | symes0 = listCons(Syme)(Syme_listPointer->Cons)((Syme) NULL((void*)0), symes0); | |||
| 429 | ||||
| 430 | if (symeHasTrigger(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x4000)) && symeHasLocal(syme, SYFI_Twins)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Twins )))) { | |||
| 431 | symeClrTrigger(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) &= ~(0x4000)); | |||
| 432 | libGetAllSymes(symeLib(syme)((syme)->lib)); | |||
| 433 | } | |||
| 434 | ||||
| 435 | /* Use symeFull(syme) as an implicit twin if present. */ | |||
| 436 | symes = symeLocalTwins(syme); | |||
| 437 | if (symeFullTwin(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0800))) { | |||
| 438 | Syme osyme = symeFull(syme)((syme)->full); | |||
| 439 | ||||
| 440 | if (symes == listNil(Syme)((SymeList) 0)) { | |||
| 441 | setcar(symes0, osyme)((symes0)->first = (osyme)); | |||
| 442 | symes = symes0; | |||
| 443 | } | |||
| 444 | else if (!listMemq(Syme)(Syme_listPointer->Memq)(symes, osyme)) { | |||
| 445 | symes = listCons(Syme)(Syme_listPointer->Cons)(osyme, symes); | |||
| 446 | symeSetTwins(syme, symes)(symeSetFieldVal = ((AInt) (symes)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_Twins))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_Twins)] = (symeSetFieldVal)) : !((syme) ->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Twins ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Twins,symeSetFieldVal )); | |||
| 447 | } | |||
| 448 | } | |||
| 449 | ||||
| 450 | return symes; | |||
| 451 | } | |||
| 452 | ||||
| 453 | StabLevel | |||
| 454 | symeDefLevel(Syme syme) | |||
| 455 | { | |||
| 456 | if (symeLibLevel(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x2000)) && symeLib(syme)((syme)->lib)) | |||
| 457 | return car(symeLib(syme)->stab)((((syme)->lib)->stab)->first); | |||
| 458 | ||||
| 459 | return (StabLevel) symeGetField(syme, SYFI_DefLevel)(SYFI_DefLevel < (8 * sizeof(int)) && !(((((syme)-> kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void *)0)), (syme))->hasmask) & (1 << (SYFI_DefLevel) )) ? (symeFieldInfo[SYFI_DefLevel].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_DefLevel))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_DefLevel))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_DefLevel )] : (symeFieldInfo[SYFI_DefLevel].def)) : symeGetFieldFn(syme ,SYFI_DefLevel)); | |||
| 460 | } | |||
| 461 | ||||
| 462 | SymeList | |||
| 463 | symeInlined(Syme syme) | |||
| 464 | { | |||
| 465 | return (SymeList) symeGetFieldFn(syme, SYFI_Inlined); | |||
| 466 | } | |||
| 467 | ||||
| 468 | Lib | |||
| 469 | symeConstLib(Syme syme) | |||
| 470 | { | |||
| 471 | if (symeSameLibs(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x1000))) | |||
| 472 | return symeLib(syme)((syme)->lib); | |||
| 473 | ||||
| 474 | return (Lib) symeGetField(syme, SYFI_ConstLib)(SYFI_ConstLib < (8 * sizeof(int)) && !(((((syme)-> kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void *)0)), (syme))->hasmask) & (1 << (SYFI_ConstLib) )) ? (symeFieldInfo[SYFI_ConstLib].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ConstLib))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstLib))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstLib )] : (symeFieldInfo[SYFI_ConstLib].def)) : symeGetFieldFn(syme ,SYFI_ConstLib)); | |||
| 475 | } | |||
| 476 | ||||
| 477 | /* Derived field accessors. */ | |||
| 478 | ||||
| 479 | #define symeHashArg(h, hi){ h ^= (h << 8); h += (hi) + 200041; h &= 0x3FFFFFFF ; } { \ | |||
| 480 | h ^= (h << 8); \ | |||
| 481 | h += (hi) + 200041; \ | |||
| 482 | h &= 0x3FFFFFFF; \ | |||
| 483 | } | |||
| 484 | ||||
| 485 | Bool | |||
| 486 | symeTop(Syme syme) | |||
| 487 | { | |||
| 488 | return (symeIsExport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Export) || symeIsExtend(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Extend)) && | |||
| 489 | symeOriginal(syme) == syme && | |||
| 490 | listMemq(StabLevel)(StabLevel_listPointer->Memq)(stabFile(), symeDefLevel(syme)); | |||
| 491 | } | |||
| 492 | ||||
| 493 | Hash | |||
| 494 | symeNameCode(Syme syme) | |||
| 495 | { | |||
| 496 | return strHash(symeString(syme)((((syme)->id))->str)); | |||
| 497 | } | |||
| 498 | ||||
| 499 | Hash | |||
| 500 | symeTypeCode(Syme syme) | |||
| 501 | { | |||
| 502 | Hash h = 0; | |||
| 503 | ||||
| 504 | h = symeHash(syme)((syme)->hash); | |||
| 505 | if (h) return h; | |||
| 506 | tfHashDEBUGif (!tfHashDebug) { } else afprintf(dbOut, "Hash: %s %pSyme %pTForm\n", | |||
| 507 | symeString(syme)((((syme)->id))->str), syme, symeType(syme)); | |||
| 508 | if (symeIsExport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Export) || symeIsParam(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) || symeIsSelf(syme)(((syme)->id) == ssymSelf)) { | |||
| 509 | h = tfHash(symeType(syme)); | |||
| 510 | symeHashArg(h, (Hash) symeKind(syme)){ h ^= (h << 8); h += ((Hash) ((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> kind)) + 200041; h &= 0x3FFFFFFF; }; | |||
| 511 | symeHashArg(h, symeDefLevel(syme)->hash){ h ^= (h << 8); h += (symeDefLevel(syme)->hash) + 200041 ; h &= 0x3FFFFFFF; }; | |||
| 512 | } | |||
| 513 | ||||
| 514 | else if (symeIsImport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Import)) { | |||
| 515 | h = tfHash(symeType(syme)); | |||
| 516 | symeHashArg(h, tfHash(symeExporter(syme))){ h ^= (h << 8); h += (tfHash(symeExporter(syme))) + 200041 ; h &= 0x3FFFFFFF; }; | |||
| 517 | } | |||
| 518 | ||||
| 519 | else { | |||
| 520 | h = tfHash(symeType(syme)); | |||
| 521 | symeHashArg(h, symeDefLevel(syme)->hash){ h ^= (h << 8); h += (symeDefLevel(syme)->hash) + 200041 ; h &= 0x3FFFFFFF; }; | |||
| 522 | } | |||
| 523 | ||||
| 524 | tfHashDEBUGif (!tfHashDebug) { } else afprintf(dbOut, "Hash: %s %pSyme = %d\n", | |||
| 525 | symeString(syme)((((syme)->id))->str), syme, h); | |||
| 526 | return symeSetHash(syme, h)(((syme)->hash) = (h)); | |||
| 527 | } | |||
| 528 | ||||
| 529 | Hash | |||
| 530 | gen0SymeTypeCode(Syme syme) | |||
| 531 | { | |||
| 532 | if (symeExtension(syme)) | |||
| 533 | return gen0SymeTypeCode(symeExtension(syme)); | |||
| 534 | else if (symeIsLazy(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0001)) && symeIsImport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Import)) | |||
| 535 | return symeHash(syme)((syme)->hash); | |||
| 536 | else | |||
| 537 | return tfHash(symeType(symeOriginal(syme))); | |||
| 538 | } | |||
| 539 | ||||
| 540 | ||||
| 541 | void | |||
| 542 | symeAddHash(Syme syme, Hash code) | |||
| 543 | { | |||
| 544 | Hash h = symeTypeCode(syme); | |||
| 545 | symeHashArg(h, code){ h ^= (h << 8); h += (code) + 200041; h &= 0x3FFFFFFF ; }; | |||
| 546 | symeSetHash(syme, h)(((syme)->hash) = (h)); | |||
| 547 | symeSetLib(syme, NULL((void*)0)); | |||
| 548 | } | |||
| 549 | ||||
| 550 | /* | |||
| 551 | * These functions are intended to be used from with a debugger since | |||
| 552 | * we can't use the equivalent macros. | |||
| 553 | */ | |||
| 554 | ||||
| 555 | AInt | |||
| 556 | symeGetFieldX(Syme s, AInt f) { return symeGetField(s, f)(f < (8 * sizeof(int)) && !(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->hasmask ) & (1 << (f))) ? (symeFieldInfo[f].def) : (((((s)-> kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*) 0)), (s))->locmask) & (1 << (f))) ? ((((((s)-> kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*) 0)), (s))->locmask) & (1 << (f))) ? ((s)->fieldv )[symeIndex(s,f)] : (symeFieldInfo[f].def)) : symeGetFieldFn( s,f)); } | |||
| ||||
| ||||
| 557 | ||||
| 558 | void | |||
| 559 | symeSetConstNum(Syme syme, AInt n) | |||
| 560 | { | |||
| 561 | symeSetConstInfo(syme, (symeConstInfo(syme)((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !(( (((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(syme ,SYFI_ConstInfo))) & 0xFFFF0000) | n); | |||
| 562 | } | |||
| 563 | ||||
| 564 | void | |||
| 565 | symeSetConstFlag(Syme syme, AInt n) | |||
| 566 | { | |||
| 567 | symeSetConstInfo(syme, symeConstInfo(syme)((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !(( (((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(syme ,SYFI_ConstInfo))) | (1<< (n+16))); | |||
| 568 | } | |||
| 569 | void | |||
| 570 | symeClrConstFlag(Syme syme, AInt n) | |||
| 571 | { | |||
| 572 | symeSetConstInfo(syme, symeConstInfo(syme)((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !(( (((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(syme ,SYFI_ConstInfo))) & ~(1<< (n+16))); | |||
| 573 | } | |||
| 574 | ||||
| 575 | void | |||
| 576 | symeSetConstInfo(Syme syme, AInt info) | |||
| 577 | { | |||
| 578 | symeSetField(syme, SYFI_ConstInfo, info)(symeSetFieldVal = ((AInt) (info)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_ConstInfo))) ? (((syme)-> fieldv)[symeIndex(syme,SYFI_ConstInfo)] = (symeSetFieldVal)) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_ConstInfo].def) ? symeSetFieldVal : symeSetFieldFn(syme ,SYFI_ConstInfo,symeSetFieldVal)); | |||
| 579 | } | |||
| 580 | ||||
| 581 | /****************************************************************************** | |||
| 582 | * | |||
| 583 | * :: Field modifiers. | |||
| 584 | * | |||
| 585 | *****************************************************************************/ | |||
| 586 | ||||
| 587 | TForm | |||
| 588 | symeSetType(Syme syme, TForm tf) | |||
| 589 | { | |||
| 590 | symeClrLazy(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) &= ~(0x0001)); | |||
| 591 | return syme->type = tf; | |||
| 592 | } | |||
| 593 | ||||
| 594 | StabLevel | |||
| 595 | symeSetDefLevel(Syme syme, StabLevel slev) | |||
| 596 | { | |||
| 597 | symeClrLibLevel(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) &= ~(0x2000)); | |||
| 598 | return (StabLevel) symeSetField(syme, SYFI_DefLevel, slev)(symeSetFieldVal = ((AInt) (slev)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_DefLevel))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_DefLevel)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_DefLevel ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_DefLevel, symeSetFieldVal)); | |||
| 599 | } | |||
| 600 | ||||
| 601 | void | |||
| 602 | symeSetLib(Syme syme, Lib lib) | |||
| 603 | { | |||
| 604 | Lib clib = NULL((void*)0); | |||
| 605 | ||||
| 606 | if (syme->kind != SYME_Trigger | |||
| 607 | && syme->lib != NULL((void*)0) | |||
| 608 | && symeSameLibs(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x1000))) | |||
| 609 | clib = symeConstLib(syme); | |||
| 610 | ||||
| 611 | syme->lib = lib; | |||
| 612 | ||||
| 613 | if (clib) | |||
| 614 | symeSetConstLib(syme, clib); | |||
| 615 | } | |||
| 616 | ||||
| 617 | Lib | |||
| 618 | symeSetConstLib(Syme syme, Lib lib) | |||
| 619 | { | |||
| 620 | if (lib == symeLib(syme)((syme)->lib)) { | |||
| 621 | symeSetSameLibs(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) |= (0x1000)); | |||
| 622 | return lib; | |||
| 623 | } | |||
| 624 | ||||
| 625 | symeClrSameLibs(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) &= ~(0x1000)); | |||
| 626 | return (Lib) symeSetField(syme, SYFI_ConstLib, lib)(symeSetFieldVal = ((AInt) (lib)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_ConstLib))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_ConstLib)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_ConstLib ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_ConstLib, symeSetFieldVal)); | |||
| 627 | } | |||
| 628 | ||||
| 629 | /* Derived field modifiers. */ | |||
| 630 | ||||
| 631 | void | |||
| 632 | symeAddExtendee(Syme syme, Syme extendee) | |||
| 633 | { | |||
| 634 | symeSetExtendee(syme, listCons(Syme)(extendee, symeExtendee(syme)))(symeSetFieldVal = ((AInt) ((Syme_listPointer->Cons)(extendee , symeExtendee(syme)))), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask ) & (1 << (SYFI_Extendee))) ? (((syme)->fieldv)[ symeIndex(syme,SYFI_Extendee)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Extendee ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Extendee, symeSetFieldVal)); | |||
| 635 | } | |||
| 636 | ||||
| 637 | void | |||
| 638 | symeListSetExtension(SymeList symes, Syme syme) | |||
| 639 | { | |||
| 640 | for (; symes; symes = cdr(symes)((symes)->rest)) | |||
| 641 | symeSetExtension(car(symes), syme)symeXSetExtension(((symes)->first), (AInt) syme); | |||
| 642 | } | |||
| 643 | ||||
| 644 | Syme | |||
| 645 | symeAddCondition(Syme syme, Sefo cond, Bool pos) | |||
| 646 | { | |||
| 647 | SefoList l = symeCondition(syme); | |||
| 648 | ||||
| 649 | assert(tiTopFns()->tiCanSefo(cond))do { if (!(tiTopFns()->tiCanSefo(cond))) _do_assert(("tiTopFns()->tiCanSefo(cond)" ),"syme.c",649); } while (0); | |||
| 650 | ||||
| 651 | if (abTag(cond)((cond)->abHdr.tag) == AB_Test) | |||
| 652 | cond = cond->abTest.cond; | |||
| 653 | ||||
| 654 | if (abTag(cond)((cond)->abHdr.tag) == AB_And) { | |||
| 655 | Length i = abArgc(cond)((cond)->abHdr.argc); | |||
| 656 | while (i > 0) { | |||
| 657 | symeAddCondition(syme, abArgv(cond)((cond)->abGen.data.argv)[--i], pos); | |||
| 658 | } | |||
| 659 | } | |||
| 660 | else { | |||
| 661 | l = listCons(Sefo)(Sefo_listPointer->Cons)(cond, l); | |||
| 662 | symeSetCondition(syme, l); | |||
| 663 | } | |||
| 664 | return syme; | |||
| 665 | } | |||
| 666 | ||||
| 667 | SymeList | |||
| 668 | symeListAddCondition(SymeList symes0, Sefo cond, Bool pos) | |||
| 669 | { | |||
| 670 | SymeList symes, nsymes = listNil(Syme)((SymeList) 0); | |||
| 671 | ||||
| 672 | for (symes = symes0; symes; symes = cdr(symes)((symes)->rest)) { | |||
| 673 | Syme nsyme = symeCopy(car(symes)((symes)->first)); | |||
| 674 | symeAddCondition(nsyme, cond, pos); | |||
| 675 | nsymes = listCons(Syme)(Syme_listPointer->Cons)(nsyme, nsymes); | |||
| 676 | } | |||
| 677 | ||||
| 678 | return listNReverse(Syme)(Syme_listPointer->NReverse)(nsymes); | |||
| 679 | } | |||
| 680 | ||||
| 681 | void | |||
| 682 | symeAddTwin(Syme final, Syme twin) | |||
| 683 | { | |||
| 684 | if (twin == final) | |||
| 685 | return; | |||
| 686 | ||||
| 687 | if (twin == symeFull(final)((final)->full)) | |||
| 688 | symeSetFullTwin(final)(((((final)->kind == SYME_Trigger ? libGetAllSymes((final) ->lib) : ((void*)0)), (final))->bits) |= (0x0800)); | |||
| 689 | else { | |||
| 690 | SymeList symes = symeLocalTwins(final); | |||
| 691 | symeSetTwins(final, listCons(Syme)(twin, symes))(symeSetFieldVal = ((AInt) ((Syme_listPointer->Cons)(twin, symes))), (((((final)->kind == SYME_Trigger ? libGetAllSymes ((final)->lib) : ((void*)0)), (final))->locmask) & ( 1 << (SYFI_Twins))) ? (((final)->fieldv)[symeIndex(final ,SYFI_Twins)] = (symeSetFieldVal)) : !((final)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Twins].def) ? symeSetFieldVal : symeSetFieldFn(final,SYFI_Twins,symeSetFieldVal)); | |||
| 692 | } | |||
| 693 | } | |||
| 694 | ||||
| 695 | extern SImpl symeMergeImpl(Syme, SImpl); | |||
| 696 | ||||
| 697 | void | |||
| 698 | symeTransferImplInfo(Syme to, Syme from) | |||
| 699 | { | |||
| 700 | symeSetHashNum(to, symeHashNum(from))(symeSetFieldVal = ((AInt) (((int) (SYFI_HashNum < (8 * sizeof (int)) && !(((((from)->kind == SYME_Trigger ? libGetAllSymes ((from)->lib) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_HashNum))) ? (symeFieldInfo[SYFI_HashNum].def ) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from )->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_HashNum))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes ((from)->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_HashNum))) ? ((from)->fieldv)[symeIndex(from ,SYFI_HashNum)] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn (from,SYFI_HashNum))))), (((((to)->kind == SYME_Trigger ? libGetAllSymes ((to)->lib) : ((void*)0)), (to))->locmask) & (1 << (SYFI_HashNum))) ? (((to)->fieldv)[symeIndex(to,SYFI_HashNum )] = (symeSetFieldVal)) : !((to)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_HashNum].def) ? symeSetFieldVal : symeSetFieldFn (to,SYFI_HashNum,symeSetFieldVal)); | |||
| 701 | symeSetDefnNum(to, symeDefnNum(from))(symeSetFieldVal = ((AInt) (((int) (SYFI_DefnNum < (8 * sizeof (int)) && !(((((from)->kind == SYME_Trigger ? libGetAllSymes ((from)->lib) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_DefnNum))) ? (symeFieldInfo[SYFI_DefnNum].def ) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from )->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_DefnNum))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes ((from)->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_DefnNum))) ? ((from)->fieldv)[symeIndex(from ,SYFI_DefnNum)] : (symeFieldInfo[SYFI_DefnNum].def)) : symeGetFieldFn (from,SYFI_DefnNum))))), (((((to)->kind == SYME_Trigger ? libGetAllSymes ((to)->lib) : ((void*)0)), (to))->locmask) & (1 << (SYFI_DefnNum))) ? (((to)->fieldv)[symeIndex(to,SYFI_DefnNum )] = (symeSetFieldVal)) : !((to)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_DefnNum].def) ? symeSetFieldVal : symeSetFieldFn (to,SYFI_DefnNum,symeSetFieldVal)); | |||
| 702 | /* If no const info, then why bother? */ | |||
| 703 | symeSetConstInfo(to, symeConstInfo(from)((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !(( (((from)->kind == SYME_Trigger ? libGetAllSymes((from)-> lib) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib) : ((void*)0 )), (from))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes((from )->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_ConstInfo))) ? ((from)->fieldv)[symeIndex(from,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(from ,SYFI_ConstInfo)))); | |||
| 704 | symeSetConstLib(to, symeConstLib(from)); | |||
| 705 | symeSetSrcPos(to, symeSrcPos(from))(symeSetFieldVal = ((AInt) (((SrcPos) (SYFI_SrcPos < (8 * sizeof (int)) && !(((((from)->kind == SYME_Trigger ? libGetAllSymes ((from)->lib) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_SrcPos))) ? (symeFieldInfo[SYFI_SrcPos].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)-> lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_SrcPos ))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes(( from)->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_SrcPos))) ? ((from)->fieldv)[symeIndex(from,SYFI_SrcPos )] : (symeFieldInfo[SYFI_SrcPos].def)) : symeGetFieldFn(from, SYFI_SrcPos))))), (((((to)->kind == SYME_Trigger ? libGetAllSymes ((to)->lib) : ((void*)0)), (to))->locmask) & (1 << (SYFI_SrcPos))) ? (((to)->fieldv)[symeIndex(to,SYFI_SrcPos )] = (symeSetFieldVal)) : !((to)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_SrcPos].def) ? symeSetFieldVal : symeSetFieldFn (to,SYFI_SrcPos,symeSetFieldVal)); | |||
| 706 | symeDEBUGif (!symeDebug) { } else afprintf(dbOut, "Transfer: %d %d %d [%pSyme --> %pSyme]\n", | |||
| 707 | symeHashNum(from)((int) (SYFI_HashNum < (8 * sizeof(int)) && !((((( from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib ) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_HashNum ))) ? (symeFieldInfo[SYFI_HashNum].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib) : ((void*)0 )), (from))->locmask) & (1 << (SYFI_HashNum))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes((from) ->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_HashNum))) ? ((from)->fieldv)[symeIndex(from,SYFI_HashNum )] : (symeFieldInfo[SYFI_HashNum].def)) : symeGetFieldFn(from ,SYFI_HashNum))), symeDefnNum(from)((int) (SYFI_DefnNum < (8 * sizeof(int)) && !((((( from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib ) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_DefnNum ))) ? (symeFieldInfo[SYFI_DefnNum].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib) : ((void*)0 )), (from))->locmask) & (1 << (SYFI_DefnNum))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes((from) ->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_DefnNum))) ? ((from)->fieldv)[symeIndex(from,SYFI_DefnNum )] : (symeFieldInfo[SYFI_DefnNum].def)) : symeGetFieldFn(from ,SYFI_DefnNum))), | |||
| 708 | symeConstNum(from)(((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !( ((((from)->kind == SYME_Trigger ? libGetAllSymes((from)-> lib) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib) : ((void*)0 )), (from))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((from)->kind == SYME_Trigger ? libGetAllSymes((from )->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_ConstInfo))) ? ((from)->fieldv)[symeIndex(from,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(from ,SYFI_ConstInfo))) & 0xFFFF), from, to); | |||
| 709 | ||||
| 710 | symeMergeImpl(to, symeImpl(from)((SImpl) (SYFI_SImpl < (8 * sizeof(int)) && !((((( from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib ) : ((void*)0)), (from))->hasmask) & (1 << (SYFI_SImpl ))) ? (symeFieldInfo[SYFI_SImpl].def) : (((((from)->kind == SYME_Trigger ? libGetAllSymes((from)->lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_SImpl))) ? (((( ((from)->kind == SYME_Trigger ? libGetAllSymes((from)-> lib) : ((void*)0)), (from))->locmask) & (1 << (SYFI_SImpl ))) ? ((from)->fieldv)[symeIndex(from,SYFI_SImpl)] : (symeFieldInfo [SYFI_SImpl].def)) : symeGetFieldFn(from,SYFI_SImpl)))); | |||
| 711 | } | |||
| 712 | ||||
| 713 | void | |||
| 714 | symeSetCondition(Syme syme, SefoList sefoList) | |||
| 715 | { | |||
| 716 | symeSetField(syme, SYFI_Condition, sefoList)(symeSetFieldVal = ((AInt) (sefoList)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Condition))) ? ( ((syme)->fieldv)[symeIndex(syme,SYFI_Condition)] = (symeSetFieldVal )) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_Condition].def) ? symeSetFieldVal : symeSetFieldFn(syme ,SYFI_Condition,symeSetFieldVal)); | |||
| 717 | } | |||
| 718 | ||||
| 719 | ||||
| 720 | /****************************************************************************** | |||
| 721 | * | |||
| 722 | * :: Java stuff | |||
| 723 | * | |||
| 724 | *****************************************************************************/ | |||
| 725 | Bool | |||
| 726 | symeIsJavaImport(Syme syme) | |||
| 727 | { | |||
| 728 | TForm tf; | |||
| 729 | ||||
| 730 | if (!symeIsImport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Import)) | |||
| 731 | return false((int) 0); | |||
| 732 | ||||
| 733 | tf = symeExporter(syme); | |||
| 734 | return tfIsJavaImport(tf); | |||
| 735 | } | |||
| 736 | ||||
| 737 | Bool | |||
| 738 | symeIsJavaApply(Syme syme) | |||
| 739 | { | |||
| 740 | if (symeId(syme)((syme)->id) != ssymApply) | |||
| 741 | return false((int) 0); | |||
| 742 | if (!symeIsJavaImport(syme)) | |||
| 743 | return false((int) 0); | |||
| 744 | /* And the first argument is '%' */ | |||
| 745 | return true1; | |||
| 746 | } | |||
| 747 | ||||
| 748 | Bool | |||
| 749 | symeIsJavaConstructor(Syme syme) | |||
| 750 | { | |||
| 751 | if (symeId(syme)((syme)->id) != ssymTheNew) | |||
| 752 | return false((int) 0); | |||
| 753 | if (!symeIsJavaImport(syme)) | |||
| 754 | return false((int) 0); | |||
| 755 | /* And that it returns '%' */ | |||
| 756 | return true1; | |||
| 757 | } | |||
| 758 | ||||
| 759 | String | |||
| 760 | symeJavaApplyName(Syme syme) | |||
| 761 | { | |||
| 762 | TForm enumArg, tf; | |||
| 763 | tf = symeType(syme); | |||
| 764 | tfFollow(tf)((tf) = tfFollowFn(tf)); | |||
| 765 | ||||
| 766 | assert(tfIsMap(tf))do { if (!((((tf)->tag) == TF_Map))) _do_assert(("tfIsMap(tf)" ),"syme.c",766); } while (0); | |||
| 767 | ||||
| 768 | enumArg = tfMapArgN(tf, 1); | |||
| 769 | tfFollow(enumArg)((enumArg) = tfFollowFn(enumArg)); | |||
| 770 | if (!tfIsEnum(enumArg)(((enumArg)->tag) == TF_Enumerate)) | |||
| 771 | return "apply"; | |||
| 772 | ||||
| 773 | return symString(tfEnumId(enumArg, 0))((tfEnumId(enumArg, 0))->str); | |||
| 774 | } | |||
| 775 | ||||
| 776 | ErrorSet | |||
| 777 | symeIsJavaExport(Syme syme) | |||
| 778 | { | |||
| 779 | TForm tf = symeType(syme); | |||
| 780 | ErrorSet errors = errorSetNew(); | |||
| 781 | ||||
| 782 | if (!tfIsMap(tf)(((tf)->tag) == TF_Map)) { | |||
| 783 | errorSetAdd(errors, "expected a map"); | |||
| 784 | return errors; | |||
| 785 | } | |||
| 786 | ||||
| 787 | if (symeId(syme)((syme)->id) == ssymApply) { | |||
| 788 | TForm inner; | |||
| 789 | errorSetCheck(errors, | |||
| 790 | tfMapArgc(tf) > 0 && tfIsSelf(tfMapArgN(tf, 0))(((((tfMapArgN(tf, 0))->tag) == TF_General) && ((( (tfMapArgN(tf, 0))->__absyn))->abHdr.tag) == AB_Id) && (((tfMapArgN(tf, 0))->__absyn)->abId.sym) == (ssymSelf )), | |||
| 791 | "apply must have % as first argument"); | |||
| 792 | errorSetCheck(errors, | |||
| 793 | tfMapArgc(tf) == 2 && tfIsEnum(tfMapArgN(tf, 1))(((tfMapArgN(tf, 1))->tag) == TF_Enumerate), | |||
| 794 | "apply must have enumeration as second and final argument"); | |||
| 795 | inner = tfMapRet(tf)tfFollowArg(tf, 1); | |||
| 796 | tfFollow(inner)((inner) = tfFollowFn(inner)); | |||
| 797 | if (errorSetCheck(errors, | |||
| 798 | tfIsMap(inner)(((inner)->tag) == TF_Map), "apply must return a map")) { | |||
| 799 | tfJavaCheckArgs(errors, listNil(StabLevel)((StabLevelList) 0), 0, tfMapArg(inner)tfFollowArg(inner, 0)); | |||
| 800 | tfJavaCheckArgs(errors, listNil(StabLevel)((StabLevelList) 0), 0, tfMapRet(inner)tfFollowArg(inner, 1)); | |||
| 801 | } | |||
| 802 | } | |||
| 803 | if (symeId(syme)((syme)->id) == ssymTheNew) { | |||
| 804 | TForm retTf = tfIgnoreExceptions(tfMapRetN(tf, 0)); | |||
| 805 | errorSetCheck(errors, tfMapRetc(tf) == 1 && tfIsSelf(retTf)(((((retTf)->tag) == TF_General) && ((((retTf)-> __absyn))->abHdr.tag) == AB_Id) && (((retTf)->__absyn )->abId.sym) == (ssymSelf)), | |||
| 806 | "new must return %"); | |||
| 807 | tfJavaCheckArgs(errors, listNil(StabLevel)((StabLevelList) 0), 0, tfMapArg(tf)tfFollowArg(tf, 0)); | |||
| 808 | } | |||
| 809 | return errors; | |||
| 810 | } | |||
| 811 | ||||
| 812 | /****************************************************************************** | |||
| 813 | * | |||
| 814 | * :: Implementation handling. | |||
| 815 | * | |||
| 816 | *****************************************************************************/ | |||
| 817 | ||||
| 818 | /* | |||
| 819 | * Eventually, this will be a rehash of the `conditional' code | |||
| 820 | * with a few twists (like it's ok to give up if things get | |||
| 821 | * overly nasty. | |||
| 822 | */ | |||
| 823 | ||||
| 824 | SImpl | |||
| 825 | symeMergeImpl(Syme syme, SImpl impl) | |||
| 826 | { | |||
| 827 | SImpl oimpl = symeImpl(syme)((SImpl) (SYFI_SImpl < (8 * sizeof(int)) && !((((( syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib ) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_SImpl ))) ? (symeFieldInfo[SYFI_SImpl].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SImpl))) ? (((( ((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SImpl ))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_SImpl)] : (symeFieldInfo [SYFI_SImpl].def)) : symeGetFieldFn(syme,SYFI_SImpl))); | |||
| 828 | SImpl newImpl = NULL((void*)0); | |||
| 829 | ||||
| 830 | if (oimpl == NULL((void*)0) && impl == NULL((void*)0)) | |||
| 831 | return impl; | |||
| 832 | ||||
| 833 | if (DEBUG(syme)symeDebug) { | |||
| 834 | fprintf(dbOut, "(Merging:\n"); | |||
| 835 | implPrintDb(oimpl); | |||
| 836 | implPrintDb(impl); | |||
| 837 | } | |||
| 838 | /* No existing implementation */ | |||
| 839 | if (oimpl == NULL((void*)0)) | |||
| 840 | newImpl = impl; | |||
| 841 | /* New implementation doesn't exist */ | |||
| 842 | else if (impl == NULL((void*)0)) { | |||
| 843 | /* might prefer to kill impl here */ | |||
| 844 | newImpl = oimpl; | |||
| 845 | } | |||
| 846 | /* Definition is a local */ | |||
| 847 | else if (implIsLocal(oimpl)((oimpl)->implGen.hdr.tag == SIMPL_Local)) { | |||
| 848 | newImpl = oimpl; | |||
| 849 | } | |||
| 850 | /* Definition is a condition */ | |||
| 851 | else if (implIsCond(oimpl)((oimpl)->implGen.hdr.tag == SIMPL_Cond)) { | |||
| 852 | /* This isn't right */ | |||
| 853 | /* Should attempt to merge sensibly */ | |||
| 854 | newImpl = implNewBranch(oimpl->implCond.cond, oimpl, impl); | |||
| 855 | } | |||
| 856 | /* Inherited */ | |||
| 857 | else if (implIsInherit(oimpl)((oimpl)->implGen.hdr.tag == SIMPL_Inherit)) { | |||
| 858 | if (implIsLocal(impl)((impl)->implGen.hdr.tag == SIMPL_Local)) | |||
| 859 | newImpl = impl; | |||
| 860 | else if (implIsDefault(impl)((impl)->implGen.hdr.tag == SIMPL_Default)) | |||
| 861 | newImpl = impl; | |||
| 862 | else if (implIsCond(impl)((impl)->implGen.hdr.tag == SIMPL_Cond)) { | |||
| 863 | newImpl = implNewBranch(impl->implCond.cond, | |||
| 864 | impl->implCond.impl, | |||
| 865 | oimpl); | |||
| 866 | } | |||
| 867 | else if (implIsInherit(impl)((impl)->implGen.hdr.tag == SIMPL_Inherit)) { | |||
| 868 | newImpl = impl; | |||
| 869 | } | |||
| 870 | else if (implHasDefault(impl)((impl)->implGen.hdr.flags & 1)) { | |||
| 871 | newImpl = impl; | |||
| 872 | } | |||
| 873 | else if (implIsBranch(impl)((impl)->implGen.hdr.tag == SIMPL_Branch)) { | |||
| 874 | /* Probably wrong but keeps things running */ | |||
| 875 | newImpl = impl; | |||
| 876 | } | |||
| 877 | else | |||
| 878 | bug("%s: Unhandled Merge #1", "symeMergeImpl"); | |||
| 879 | } | |||
| 880 | /* Branch condition */ | |||
| 881 | else if (implIsBranch(oimpl)((oimpl)->implGen.hdr.tag == SIMPL_Branch)) { | |||
| 882 | /* Probably just plain wrong */ | |||
| 883 | /* Should be some implies test, since one condition will imply | |||
| 884 | * or be equal to the other. | |||
| 885 | */ | |||
| 886 | newImpl = oimpl; | |||
| 887 | } | |||
| 888 | else if (implIsDefault(oimpl)((oimpl)->implGen.hdr.tag == SIMPL_Default)) { | |||
| 889 | if (implIsDefault(impl)((impl)->implGen.hdr.tag == SIMPL_Default)) | |||
| 890 | newImpl = impl; | |||
| 891 | else if (implIsLocal(impl)((impl)->implGen.hdr.tag == SIMPL_Local)) | |||
| 892 | newImpl = impl; | |||
| 893 | else if (implIsCond(impl)((impl)->implGen.hdr.tag == SIMPL_Cond)) { | |||
| 894 | newImpl = implNewBranch(impl->implCond.cond, | |||
| 895 | impl->implCond.impl, | |||
| 896 | oimpl); | |||
| 897 | } | |||
| 898 | else if (implIsInherit(impl)((impl)->implGen.hdr.tag == SIMPL_Inherit)) { | |||
| 899 | newImpl = impl; | |||
| 900 | } | |||
| 901 | else if (implIsBranch(impl)((impl)->implGen.hdr.tag == SIMPL_Branch)) { | |||
| 902 | /* Probably wrong but keeps things running */ | |||
| 903 | newImpl = impl; | |||
| 904 | } | |||
| 905 | else | |||
| 906 | bug("%s: Unhandled Merge #2", "symeMergeImpl"); | |||
| 907 | } | |||
| 908 | else { | |||
| 909 | bug("%s: Unexpected merge", "symeMergeImpl"); | |||
| 910 | } | |||
| 911 | ||||
| 912 | if (!newImpl) | |||
| 913 | bug("%s: Unhandled Merge #3", "symeMergeImpl"); | |||
| 914 | ||||
| 915 | if (DEBUG(syme)symeDebug) { | |||
| 916 | implPrintDb(newImpl); fprintf(dbOut, ")\n"); | |||
| 917 | } | |||
| 918 | if (newImpl != oimpl) | |||
| 919 | symeSetImpl(syme, newImpl)(symeSetFieldVal = ((AInt) (newImpl)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SImpl))) ? (((syme )->fieldv)[symeIndex(syme,SYFI_SImpl)] = (symeSetFieldVal) ) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_SImpl].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_SImpl ,symeSetFieldVal)); | |||
| 920 | return impl; | |||
| 921 | } | |||
| 922 | ||||
| 923 | ||||
| 924 | void | |||
| 925 | symeImplAddConst(Syme syme, AbLogic condition, int defn) | |||
| 926 | { | |||
| 927 | SImpl impl; | |||
| 928 | ||||
| 929 | if (DEBUG(syme)symeDebug) { | |||
| 930 | fprintf(dbOut, "(Adding implementation (%d) for: %s\n", | |||
| 931 | defn, symeString(syme)((((syme)->id))->str)); | |||
| 932 | tfPrintDb(symeType(syme)); | |||
| 933 | ablogPrint(dbOut, condition); | |||
| 934 | } | |||
| 935 | ||||
| 936 | impl = implNewLocal(symeHasDefault(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0080)), defn); | |||
| 937 | ||||
| 938 | if (!ablogIsTrue(condition)) | |||
| 939 | impl = implNewCond(ablogCopy(condition), impl); | |||
| 940 | ||||
| 941 | symeMergeImpl(syme, impl); | |||
| 942 | ||||
| 943 | implFree(impl); | |||
| 944 | ||||
| 945 | symeDEBUGif (!symeDebug) { } else afprintf(dbOut, ")\n"); | |||
| 946 | } | |||
| 947 | ||||
| 948 | void | |||
| 949 | symeImplAddInherit(Syme syme, TForm tf, Syme parent) | |||
| 950 | { | |||
| 951 | SImpl impl; | |||
| 952 | ||||
| 953 | if (symeHasDefault(parent)(((((parent)->kind == SYME_Trigger ? libGetAllSymes((parent )->lib) : ((void*)0)), (parent))->bits) & (0x0080))) { | |||
| 954 | impl = implNewDefault(parent); | |||
| 955 | symeMergeImpl(syme, impl); | |||
| 956 | return; | |||
| 957 | } | |||
| 958 | /* | |||
| 959 | * Simple checks to see if tf really does export something | |||
| 960 | * called syme | |||
| 961 | */ | |||
| 962 | if (tfIsNone(tf)((((tf)->tag) == TF_Multiple) && tfMultiArgc(tf) == 0)) return; | |||
| 963 | ||||
| 964 | if (DEBUG(syme)symeDebug) { | |||
| 965 | fprintf(dbOut, "(Adding inherited implementation for: %s", symeString(syme)((((syme)->id))->str)); | |||
| 966 | tfPrintDb(symeType(syme)); | |||
| 967 | tfPrintDb(tf); | |||
| 968 | } | |||
| 969 | impl = implNewInherit(tf); | |||
| 970 | ||||
| 971 | symeMergeImpl(syme, impl); | |||
| 972 | symeDEBUGif (!symeDebug) { } else afprintf(dbOut, ")\n"); | |||
| 973 | ||||
| 974 | } | |||
| 975 | ||||
| 976 | ||||
| 977 | /****************************************************************************** | |||
| 978 | * | |||
| 979 | * :: Constructors. | |||
| 980 | * | |||
| 981 | *****************************************************************************/ | |||
| 982 | ||||
| 983 | Syme | |||
| 984 | symeNewLabel(Symbol id, TForm tf, StabLevel slev) | |||
| 985 | { | |||
| 986 | return symeNew(SYME_Label, id, tf, slev); | |||
| 987 | } | |||
| 988 | ||||
| 989 | Syme | |||
| 990 | symeNewParam(Symbol id, TForm tf, StabLevel slev) | |||
| 991 | { | |||
| 992 | return symeNew(SYME_Param, id, tf, slev); | |||
| 993 | } | |||
| 994 | ||||
| 995 | Syme | |||
| 996 | symeNewLexVar(Symbol id, TForm tf, StabLevel slev) | |||
| 997 | { | |||
| 998 | return symeNew(SYME_LexVar, id, tf, slev); | |||
| 999 | } | |||
| 1000 | ||||
| 1001 | Syme | |||
| 1002 | symeNewLexConst(Symbol id, TForm tf, StabLevel slev) | |||
| 1003 | { | |||
| 1004 | return symeNew(SYME_LexConst, id, tf, slev); | |||
| 1005 | } | |||
| 1006 | ||||
| 1007 | Syme | |||
| 1008 | symeNewExport(Symbol id, TForm tf, StabLevel slev) | |||
| 1009 | { | |||
| 1010 | return symeNew(SYME_Export, id, tf, slev); | |||
| 1011 | } | |||
| 1012 | ||||
| 1013 | Syme | |||
| 1014 | symeNewExtend(Symbol id, TForm tf, StabLevel slev) | |||
| 1015 | { | |||
| 1016 | return symeNew(SYME_Extend, id, tf, slev); | |||
| 1017 | } | |||
| 1018 | ||||
| 1019 | Syme | |||
| 1020 | symeNewFluid(Symbol id, TForm tf, StabLevel slev) | |||
| 1021 | { | |||
| 1022 | return symeNew(SYME_Fluid, id, tf, slev); | |||
| 1023 | } | |||
| 1024 | ||||
| 1025 | Syme | |||
| 1026 | symeNewImport(Symbol id, TForm type, StabLevel level, TForm exporter) | |||
| 1027 | { | |||
| 1028 | Syme syme = symeNew(SYME_Import, id, type, level); | |||
| 1029 | symeSetExporter(syme, exporter)(symeSetFieldVal = ((AInt) (exporter)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_Exporter))) ? ( ((syme)->fieldv)[symeIndex(syme,SYFI_Exporter)] = (symeSetFieldVal )) : !((syme)->full) && symeSetFieldVal == (symeFieldInfo [SYFI_Exporter].def) ? symeSetFieldVal : symeSetFieldFn(syme, SYFI_Exporter,symeSetFieldVal)); | |||
| 1030 | return syme; | |||
| 1031 | } | |||
| 1032 | ||||
| 1033 | Syme | |||
| 1034 | symeNewLibrary(Symbol id, TForm type, StabLevel level, Lib lib) | |||
| 1035 | { | |||
| 1036 | Syme syme = symeNew(SYME_Library, id, type, level); | |||
| 1037 | symeSetLibrary(syme, lib)(symeSetFieldVal = ((AInt) (lib)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_Library))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_Library)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Library ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Library,symeSetFieldVal )); | |||
| 1038 | return syme; | |||
| 1039 | } | |||
| 1040 | ||||
| 1041 | Syme | |||
| 1042 | symeNewArchive(Symbol id, TForm type, StabLevel level, Archive ar) | |||
| 1043 | { | |||
| 1044 | Syme syme = symeNew(SYME_Archive, id, type, level); | |||
| 1045 | symeSetArchive(syme, ar)(symeSetFieldVal = ((AInt) (ar)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_Archive))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_Archive)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Archive ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Archive,symeSetFieldVal )); | |||
| 1046 | return syme; | |||
| 1047 | } | |||
| 1048 | ||||
| 1049 | Syme | |||
| 1050 | symeNewBuiltin(Symbol id, TForm type, StabLevel level, FoamBValTag bval) | |||
| 1051 | { | |||
| 1052 | Syme syme = symeNew(SYME_Builtin, id, type, level); | |||
| 1053 | symeSetBuiltin(syme, bval)(symeSetFieldVal = ((AInt) (bval)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_Builtin))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_Builtin)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Builtin ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Builtin,symeSetFieldVal )); | |||
| 1054 | if (bval == FOAM_BVAL_LIMIT) symeSetSpecial(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) |= (0x0002)); | |||
| 1055 | return syme; | |||
| 1056 | } | |||
| 1057 | ||||
| 1058 | Syme | |||
| 1059 | symeNewForeign(Symbol id, TForm type, StabLevel level, ForeignOrigin forg) | |||
| 1060 | { | |||
| 1061 | Syme syme = symeNew(SYME_Foreign, id, type, level); | |||
| 1062 | symeSetForeign(syme, forg)(symeSetFieldVal = ((AInt) (forg)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_Foreign))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_Foreign)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Foreign ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_Foreign,symeSetFieldVal )); | |||
| 1063 | return syme; | |||
| 1064 | } | |||
| 1065 | ||||
| 1066 | Syme | |||
| 1067 | symeNewTemp(Symbol id, TForm type, StabLevel level) | |||
| 1068 | { | |||
| 1069 | Syme syme = symeNew(SYME_Temp, id, type, level); | |||
| 1070 | ||||
| 1071 | return syme; | |||
| 1072 | } | |||
| 1073 | ||||
| 1074 | Syme | |||
| 1075 | symeClone(Syme syme) | |||
| 1076 | { | |||
| 1077 | Symbol id = symGen(); | |||
| 1078 | return symeNew(symeKind(syme)((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind), id, symeType(syme), symeDefLevel(syme)); | |||
| 1079 | } | |||
| 1080 | ||||
| 1081 | ||||
| 1082 | /***************************************************************************** | |||
| 1083 | * | |||
| 1084 | * :: symeFillType | |||
| 1085 | * | |||
| 1086 | ****************************************************************************/ | |||
| 1087 | ||||
| 1088 | localstatic TForm | |||
| 1089 | symeFillType(Syme syme) | |||
| 1090 | { | |||
| 1091 | assert(symeIsLazy(syme))do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->bits) & (0x0001 )))) _do_assert(("symeIsLazy(syme)"),"syme.c",1091); } while ( 0); | |||
| 1092 | assert(symeIsExport(syme) || symeIsImport(syme) ||do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind) == SYME_Export ) || (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->kind) == SYME_Import) || (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) || (((syme )->id) == ssymSelf))) _do_assert(("symeIsExport(syme) || symeIsImport(syme) || symeIsParam(syme) || symeIsSelf(syme)" ),"syme.c",1093); } while (0) | |||
| 1093 | symeIsParam(syme) || symeIsSelf(syme))do { if (!((((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind) == SYME_Export ) || (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->kind) == SYME_Import) || (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) || (((syme )->id) == ssymSelf))) _do_assert(("symeIsExport(syme) || symeIsImport(syme) || symeIsParam(syme) || symeIsSelf(syme)" ),"syme.c",1093); } while (0); | |||
| 1094 | ||||
| 1095 | symeFillDEBUGif (!symeFillDebug) { } else afprintf(dbOut, ">>[%s]\t name: %25s hash: %12ld lib: %s\n", | |||
| 1096 | symeTagToStr(symeKind(syme))(symeInfo[((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind)].str), | |||
| 1097 | symeString(syme)((((syme)->id))->str), | |||
| 1098 | symeTypeCode(syme), | |||
| 1099 | libToStringStatic(symeLib(syme))fnameUnparseStaticWithout((((syme)->lib))->name)); | |||
| 1100 | ||||
| 1101 | /* Lazy exports know which library they came from. */ | |||
| 1102 | if (symeIsExport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Export) || symeIsParam(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) || symeIsSelf(syme)(((syme)->id) == ssymSelf)) | |||
| 1103 | symeFillFrLibrary(syme); | |||
| 1104 | ||||
| 1105 | if (symeIsImport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Import)) { | |||
| 1106 | TForm exporter = symeExporter(syme); | |||
| 1107 | ||||
| 1108 | /* Certain lazy imports know where they came from. */ | |||
| 1109 | if (tfIsLazyExporter(exporter)(tfIsLibrary(exporter) || tfIsArchive(exporter) || (((((exporter )->tag) == TF_General) && ((((exporter)->__absyn ))->abHdr.tag) == AB_Id) && (((exporter)->__absyn )->abId.sym) == (ssymSelf)))) | |||
| 1110 | symeFillFrLibrary(syme); | |||
| 1111 | else | |||
| 1112 | symeFillFrExporter(syme, exporter); | |||
| 1113 | } | |||
| 1114 | ||||
| 1115 | symeFillDEBUGif (!symeFillDebug) { } else afprintf(dbOut, "<<[%s]\t name: %25s hash: %12ld lib: %s\n", | |||
| 1116 | symeTagToStr(symeKind(syme))(symeInfo[((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->kind)].str), | |||
| 1117 | symeString(syme)((((syme)->id))->str), | |||
| 1118 | symeTypeCode(syme), | |||
| 1119 | libToStringStatic(symeLib(syme))fnameUnparseStaticWithout((((syme)->lib))->name)); | |||
| 1120 | ||||
| 1121 | assert(!symeIsLazy(syme))do { if (!(!(((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->bits) & (0x0001 )))) _do_assert(("!symeIsLazy(syme)"),"syme.c",1121); } while (0); | |||
| 1122 | return symeType(syme); | |||
| 1123 | } | |||
| 1124 | ||||
| 1125 | localstatic void | |||
| 1126 | symeFillFrLibrary(Syme syme) | |||
| 1127 | { | |||
| 1128 | ULong num; | |||
| 1129 | TForm type; | |||
| 1130 | Lib lib = symeLib(syme)((syme)->lib); | |||
| 1131 | Symbol sym = symeId(syme)((syme)->id); | |||
| 1132 | Hash h = symeHash(syme)((syme)->hash); | |||
| 1133 | ||||
| 1134 | assert(lib && h)do { if (!(lib && h)) _do_assert(("lib && h") ,"syme.c",1134); } while (0); | |||
| 1135 | libGetAllSymes(lib); | |||
| 1136 | num = libSymeTypeNo(lib, sym, h); | |||
| 1137 | type = libGetSymeType(lib, num); | |||
| 1138 | symeSetType(syme, type); | |||
| 1139 | } | |||
| 1140 | ||||
| 1141 | localstatic void | |||
| 1142 | symeFillFrExporter(Syme isyme, TForm exporter) | |||
| 1143 | { | |||
| 1144 | Stab stab; | |||
| 1145 | SymeSet symeSet; | |||
| 1146 | SymeList symes; | |||
| 1147 | ||||
| 1148 | assert(symeLib(isyme))do { if (!(((isyme)->lib))) _do_assert(("symeLib(isyme)"), "syme.c",1148); } while (0); | |||
| 1149 | stab = symeLib(isyme)((isyme)->lib)->stab; | |||
| 1150 | ||||
| 1151 | tiTopFns()->tiTfSefo(stab, exporter); | |||
| 1152 | symeSet = tfGetDomImportSet(exporter); | |||
| 1153 | symes = symeSetSymesForSymbol(symeSet, symeId(isyme)((isyme)->id)); | |||
| 1154 | for (symes = tfGetDomImportsByName(exporter, symeId(isyme)((isyme)->id)); symes; symes = cdr(symes)((symes)->rest)) { | |||
| 1155 | Syme syme = car(symes)((symes)->first); | |||
| 1156 | assert(symeId(syme) == symeId(isyme))do { if (!(((syme)->id) == ((isyme)->id))) _do_assert(( "symeId(syme) == symeId(isyme)"),"syme.c",1156); } while (0); | |||
| 1157 | if (symeTypeCode(syme) == symeTypeCode(isyme)) { | |||
| 1158 | /* Lazy domain imports know where they came from. */ | |||
| 1159 | if (symeIsLazy(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0001))) symeFillFrLibrary(syme); | |||
| 1160 | symeSetType(isyme, symeType(syme)); | |||
| 1161 | symeSetOriginal(isyme, symeOriginal(syme))(symeSetFieldVal = ((AInt) (symeOriginal(syme))), (((((isyme) ->kind == SYME_Trigger ? libGetAllSymes((isyme)->lib) : ((void*)0)), (isyme))->locmask) & (1 << (SYFI_Original ))) ? (((isyme)->fieldv)[symeIndex(isyme,SYFI_Original)] = (symeSetFieldVal)) : !((isyme)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Original].def) ? symeSetFieldVal : symeSetFieldFn (isyme,SYFI_Original,symeSetFieldVal)); | |||
| 1162 | return; | |||
| 1163 | } | |||
| 1164 | } | |||
| 1165 | ||||
| 1166 | comsgFatal(NULL((void*)0), ALDOR_F_LibExportNotFound145, | |||
| 1167 | symeString(isyme)((((isyme)->id))->str), symeTypeCode(isyme), | |||
| 1168 | libToStringStatic(symeLib(isyme))fnameUnparseStaticWithout((((isyme)->lib))->name), tfPretty(exporter)); | |||
| 1169 | } | |||
| 1170 | ||||
| 1171 | /****************************************************************************** | |||
| 1172 | * | |||
| 1173 | * :: Syme conditions. | |||
| 1174 | * | |||
| 1175 | *****************************************************************************/ | |||
| 1176 | ||||
| 1177 | SymeList | |||
| 1178 | symeListCheckAddConditions(SymeList symes0) | |||
| 1179 | { | |||
| 1180 | SymeList symes, next, nsymes = listNil(Syme)((SymeList) 0); | |||
| 1181 | ||||
| 1182 | for (symes = symes0; symes; symes = listFreeCons(Syme)(Syme_listPointer->FreeCons)(symes)) { | |||
| 1183 | Syme syme = car(symes)((symes)->first); | |||
| 1184 | ||||
| 1185 | if (!symeCheckCondition(syme)) continue; | |||
| 1186 | ||||
| 1187 | if (!symeListCheckFindSyme(nsymes, syme)) { | |||
| 1188 | next = listCons(Syme)(Syme_listPointer->Cons)(syme, listNil(Syme)((SymeList) 0)); | |||
| 1189 | nsymes = listNConcat(Syme)(Syme_listPointer->NConcat)(nsymes, next); | |||
| 1190 | } | |||
| 1191 | } | |||
| 1192 | ||||
| 1193 | return nsymes; | |||
| 1194 | } | |||
| 1195 | ||||
| 1196 | ||||
| 1197 | SymeList | |||
| 1198 | symeListCheckWithCondition(SymeList symes0) | |||
| 1199 | { | |||
| 1200 | SymeList symes, next, nsymes = listNil(Syme)((SymeList) 0); | |||
| 1201 | ||||
| 1202 | for (symes = symes0; symes; symes = listFreeCons(Syme)(Syme_listPointer->FreeCons)(symes)) { | |||
| 1203 | Syme syme = car(symes)((symes)->first); | |||
| 1204 | ||||
| 1205 | if (symeIsSelfSelf(syme)(((syme)->id) == ssymSelfSelf)) continue; | |||
| 1206 | if (!symeCheckCondition(syme)) continue; | |||
| 1207 | ||||
| 1208 | /* Don't merge, as we may get garbage! | |||
| 1209 | * eg % == X | |||
| 1210 | * [remove next 3 if unsure]*/ | |||
| 1211 | if (1/*!symeListCheckFindSyme(nsymes, syme)*/) { | |||
| 1212 | next = listCons(Syme)(Syme_listPointer->Cons)(syme, listNil(Syme)((SymeList) 0)); | |||
| 1213 | nsymes = listNConcat(Syme)(Syme_listPointer->NConcat)(nsymes, next); | |||
| 1214 | } | |||
| 1215 | ||||
| 1216 | } | |||
| 1217 | ||||
| 1218 | return nsymes; | |||
| 1219 | } | |||
| 1220 | ||||
| 1221 | ||||
| 1222 | SymeList | |||
| 1223 | symeListCheckCondition(SymeList symes0) | |||
| 1224 | { | |||
| 1225 | SymeList symes, next, nsymes = listNil(Syme)((SymeList) 0); | |||
| 1226 | ||||
| 1227 | for (symes = symes0; symes; symes = listFreeCons(Syme)(Syme_listPointer->FreeCons)(symes)) { | |||
| 1228 | Syme syme = car(symes)((symes)->first); | |||
| 1229 | ||||
| 1230 | if (symeIsSelfSelf(syme)(((syme)->id) == ssymSelfSelf)) continue; | |||
| 1231 | if (!symeCheckCondition(syme)) continue; | |||
| 1232 | ||||
| 1233 | if (!symeListCheckFindSyme(nsymes, syme)) { | |||
| 1234 | next = listCons(Syme)(Syme_listPointer->Cons)(syme, listNil(Syme)((SymeList) 0)); | |||
| 1235 | nsymes = listNConcat(Syme)(Syme_listPointer->NConcat)(nsymes, next); | |||
| 1236 | } | |||
| 1237 | } | |||
| 1238 | ||||
| 1239 | return nsymes; | |||
| 1240 | } | |||
| 1241 | ||||
| 1242 | localstatic Bool | |||
| 1243 | symeListCheckFindSyme(SymeList symes, Syme syme2) | |||
| 1244 | { | |||
| 1245 | Bool merge = false((int) 0); | |||
| 1246 | ||||
| 1247 | for (; !merge && symes; symes = cdr(symes)((symes)->rest)) { | |||
| 1248 | Syme syme1 = car(symes)((symes)->first); | |||
| 1249 | ||||
| 1250 | if (!symeEqualModConditions(NULL((void*)0), syme1, syme2)) | |||
| 1251 | merge = false((int) 0); | |||
| 1252 | ||||
| 1253 | else if (!symeCondition(syme1) || !symeCondition(syme2)) | |||
| 1254 | merge = true1; | |||
| 1255 | ||||
| 1256 | else | |||
| 1257 | merge = sefoListEqualMod(NULL((void*)0), symeCondition(syme1), | |||
| 1258 | symeCondition(syme2)); | |||
| 1259 | ||||
| 1260 | if (merge) { | |||
| 1261 | symeListCheckJoinSymes(syme1, syme2); | |||
| 1262 | symeAddTwin(syme1, syme2); | |||
| 1263 | } | |||
| 1264 | } | |||
| 1265 | ||||
| 1266 | return merge; | |||
| 1267 | } | |||
| 1268 | ||||
| 1269 | localstatic void | |||
| 1270 | symeListCheckJoinSymes(Syme syme1, Syme syme2) | |||
| 1271 | { | |||
| 1272 | if (!symeCondition(syme1)) | |||
| 1273 | symeSetCondition(syme2, NULL((void*)0)); | |||
| 1274 | ||||
| 1275 | if (!symeCondition(syme2)) { | |||
| 1276 | symeSetCondition(syme1, NULL((void*)0)); | |||
| 1277 | } | |||
| 1278 | ||||
| 1279 | if (!symeHasDefault(syme1)(((((syme1)->kind == SYME_Trigger ? libGetAllSymes((syme1) ->lib) : ((void*)0)), (syme1))->bits) & (0x0080)) && symeHasDefault(syme2)(((((syme2)->kind == SYME_Trigger ? libGetAllSymes((syme2) ->lib) : ((void*)0)), (syme2))->bits) & (0x0080))) { | |||
| 1280 | symeSetDefault(syme1)(((((syme1)->kind == SYME_Trigger ? libGetAllSymes((syme1) ->lib) : ((void*)0)), (syme1))->bits) |= (0x0080)); | |||
| 1281 | symeTransferImplInfo(syme1, syme2); | |||
| 1282 | } | |||
| 1283 | } | |||
| 1284 | /* | |||
| 1285 | * False => Condition evaluates to false | |||
| 1286 | * True => Condition either pending or true | |||
| 1287 | */ | |||
| 1288 | Bool | |||
| 1289 | symeCheckCondition(Syme syme) | |||
| 1290 | { | |||
| 1291 | static int count; | |||
| 1292 | symeSetCondChecked(syme)(symeSetFieldVal = ((AInt) (((AInt) (SYFI_ExtraBits < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> hasmask) & (1 << (SYFI_ExtraBits))) ? (symeFieldInfo [SYFI_ExtraBits].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask ) & (1 << (SYFI_ExtraBits))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ExtraBits)] : (symeFieldInfo [SYFI_ExtraBits].def)) : symeGetFieldFn(syme,SYFI_ExtraBits)) ) | (0x0008))), (((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? (((syme)->fieldv)[symeIndex (syme,SYFI_ExtraBits)] = (symeSetFieldVal)) : !((syme)->full ) && symeSetFieldVal == (symeFieldInfo[SYFI_ExtraBits ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_ExtraBits ,symeSetFieldVal));; | |||
| 1293 | symeClrCheckCondIncomplete(syme)(symeSetFieldVal = ((AInt) (((AInt) (SYFI_ExtraBits < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> hasmask) & (1 << (SYFI_ExtraBits))) ? (symeFieldInfo [SYFI_ExtraBits].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask ) & (1 << (SYFI_ExtraBits))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ExtraBits)] : (symeFieldInfo [SYFI_ExtraBits].def)) : symeGetFieldFn(syme,SYFI_ExtraBits)) ) & ~(0x0004))), (((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? (((syme)->fieldv)[symeIndex (syme,SYFI_ExtraBits)] = (symeSetFieldVal)) : !((syme)->full ) && symeSetFieldVal == (symeFieldInfo[SYFI_ExtraBits ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_ExtraBits ,symeSetFieldVal));; | |||
| 1294 | ||||
| 1295 | while (symeCondition(syme)) { | |||
| 1296 | Sefo cond = car(symeCondition(syme))((symeCondition(syme))->first); | |||
| 1297 | Sefo dom, cat; | |||
| 1298 | int result; | |||
| 1299 | int serialThis = count++; | |||
| 1300 | /* If the condition can be checked now, check it. | |||
| 1301 | * Otherwise just leave it alone and accept the syme. | |||
| 1302 | */ | |||
| 1303 | if (abTag(cond)((cond)->abHdr.tag) != AB_Has) | |||
| 1304 | return true1; | |||
| 1305 | ||||
| 1306 | dom = cond->abHas.expr; | |||
| 1307 | cat = cond->abHas.property; | |||
| 1308 | symeHasDEBUGif (!symeHasDebug) { } else afprintf(dbOut, "(symeCheckCondition: %d %pSymeC...\n", serialThis, syme); | |||
| 1309 | result = symeCheckHas(symeConditionContext(syme)((SymeCContext) (SYFI_ConditionContext < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConditionContext))) ? (symeFieldInfo[SYFI_ConditionContext ].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConditionContext))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConditionContext ))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConditionContext )] : (symeFieldInfo[SYFI_ConditionContext].def)) : symeGetFieldFn (syme,SYFI_ConditionContext))), dom, cat); | |||
| 1310 | symeHasDEBUGif (!symeHasDebug) { } else afprintf(dbOut, " ... %d %d)\n", result, serialThis); | |||
| 1311 | ||||
| 1312 | if (result == 1) { | |||
| 1313 | symeSetCheckCondIncomplete(syme)(symeSetFieldVal = ((AInt) (((AInt) (SYFI_ExtraBits < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> hasmask) & (1 << (SYFI_ExtraBits))) ? (symeFieldInfo [SYFI_ExtraBits].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask ) & (1 << (SYFI_ExtraBits))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ExtraBits)] : (symeFieldInfo [SYFI_ExtraBits].def)) : symeGetFieldFn(syme,SYFI_ExtraBits)) ) | (0x0004))), (((((syme)->kind == SYME_Trigger ? libGetAllSymes ((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ExtraBits))) ? (((syme)->fieldv)[symeIndex (syme,SYFI_ExtraBits)] = (symeSetFieldVal)) : !((syme)->full ) && symeSetFieldVal == (symeFieldInfo[SYFI_ExtraBits ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_ExtraBits ,symeSetFieldVal));; | |||
| 1314 | } | |||
| 1315 | else if (result == 2) { | |||
| 1316 | /* This might be incorrect, as condition lists are | |||
| 1317 | shared across symeCopy */ | |||
| 1318 | symeSetCondition(syme, | |||
| 1319 | listFreeCons(Sefo)(Sefo_listPointer->FreeCons)(symeCondition(syme))); | |||
| 1320 | continue; | |||
| 1321 | } | |||
| 1322 | ||||
| 1323 | if (!abIsFullyInstantiated(dom)) { | |||
| 1324 | return true1; | |||
| 1325 | } | |||
| 1326 | if (abTForm(dom)((dom)->abHdr.seman ? (dom)->abHdr.seman->tform : 0) && tfEqual(abTForm(dom)((dom)->abHdr.seman ? (dom)->abHdr.seman->tform : 0), symeExporter(syme))) { | |||
| 1327 | return true1; | |||
| 1328 | } | |||
| 1329 | ||||
| 1330 | return false((int) 0); | |||
| 1331 | } | |||
| 1332 | ||||
| 1333 | return true1; | |||
| 1334 | } | |||
| 1335 | ||||
| 1336 | localstatic Bool | |||
| 1337 | abIsFullyInstantiated(Sefo ab) | |||
| 1338 | { | |||
| 1339 | Bool result = true1; | |||
| 1340 | ||||
| 1341 | if (abTag(ab)((ab)->abHdr.tag) == AB_Id) { | |||
| 1342 | Syme syme = abSyme(ab)((ab)->abHdr.seman ? (ab)->abHdr.seman->syme : 0); | |||
| 1343 | if (syme == NULL((void*)0) || symeIsParam(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) || | |||
| 1344 | symeIsLexConst(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_LexConst) || symeIsLexVar(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_LexVar)) | |||
| 1345 | result = false((int) 0); | |||
| 1346 | } | |||
| 1347 | ||||
| 1348 | else if (!abIsLeaf(ab)(((ab)->abHdr.tag) < AB_NODE_START)) { | |||
| 1349 | Length i; | |||
| 1350 | for (i = 0; result && i < abArgc(ab)((ab)->abHdr.argc); i += 1) | |||
| 1351 | result = abIsFullyInstantiated(abArgv(ab)((ab)->abGen.data.argv)[i]); | |||
| 1352 | } | |||
| 1353 | ||||
| 1354 | return result; | |||
| 1355 | } | |||
| 1356 | ||||
| 1357 | /* | |||
| 1358 | * 0 => Failed | |||
| 1359 | * 1 => SatPending | |||
| 1360 | * 2 => Success | |||
| 1361 | */ | |||
| 1362 | localstatic int | |||
| 1363 | symeCheckHas(SymeCContext conditionContext, Sefo dom, Sefo cat) | |||
| 1364 | { | |||
| 1365 | TForm tfdom, tfcat; | |||
| 1366 | SatMask result; | |||
| 1367 | int flg = 0; | |||
| 1368 | int cache; | |||
| 1369 | ||||
| 1370 | cache = symeCheckHasResult(dom, cat, &flg); | |||
| 1371 | if (cache == 1) | |||
| 1372 | return flg; | |||
| 1373 | ||||
| 1374 | tfdom = abGetCategory(dom); | |||
| 1375 | if (tiTopFns()->tiCanSefo(cat)) { | |||
| 1376 | tiTopFns()->tiSefo(stabFile(), cat); | |||
| 1377 | } | |||
| 1378 | tfcat = abTForm(cat)((cat)->abHdr.seman ? (cat)->abHdr.seman->tform : 0) ? abTForm(cat)((cat)->abHdr.seman ? (cat)->abHdr.seman->tform : 0) : tiTopFns()->tiGetTopLevelTForm(ablogTrue(), cat); | |||
| 1379 | ||||
| 1380 | /* D has C iff typeof(D) satisfies C. */ | |||
| 1381 | result = tfSat(tfSatBupMask(), tfdom, tfcat); | |||
| 1382 | ||||
| 1383 | #if 0 | |||
| 1384 | symeCheckHasMemo(dom, cat, result); | |||
| 1385 | #endif | |||
| 1386 | ||||
| 1387 | return tfSatPending(result) ? 1 : (tfSatSucceed(result) ? 2 : 0); | |||
| 1388 | } | |||
| 1389 | ||||
| 1390 | ||||
| 1391 | /* We use the following encoding for the hashtable: | |||
| 1392 | * symeHasCache is a table consisting of (S, SymeSatTblVal) | |||
| 1393 | * pairs. We have to treat pending comparisons specially, | |||
| 1394 | * as we can't rely on the return value --- it better to | |||
| 1395 | * wait until the type is fully instatiated. This also | |||
| 1396 | * assumes that the value given by tfSatGetPendingFail | |||
| 1397 | * must no longer be pending before the result of the | |||
| 1398 | * tfSat test changes. | |||
| 1399 | */ | |||
| 1400 | ||||
| 1401 | typedef struct _SymeSatTblVal { | |||
| 1402 | Sefo sefo; | |||
| 1403 | Bool success; | |||
| 1404 | TForm pend; | |||
| 1405 | } SymeSatTblVal; | |||
| 1406 | ||||
| 1407 | typedef struct _SymeSatTblEnt { | |||
| 1408 | int sz; | |||
| 1409 | SymeSatTblVal argv[NARY10]; | |||
| 1410 | } SymeSatTblEnt; | |||
| 1411 | ||||
| 1412 | Table symeHasTestCache; | |||
| 1413 | ||||
| 1414 | localstatic void | |||
| 1415 | symeCheckHasMemo(Sefo dom, Sefo cat, SatMask result) | |||
| 1416 | { | |||
| 1417 | SymeSatTblEnt *ent, *ent0; | |||
| 1418 | int idx; | |||
| 1419 | ||||
| 1420 | if (symeHasTestCache == NULL((void*)0)) | |||
| 1421 | symeHasTestCache = tblNew((TblHashFun) abHash, | |||
| 1422 | (TblEqFun) sefoEqual); | |||
| 1423 | ||||
| 1424 | ent0 = (SymeSatTblEnt*) tblElt(symeHasTestCache, (TblKey) dom, NULL((void*)0)); | |||
| 1425 | ent = ent0; | |||
| 1426 | if (ent == NULL((void*)0)) { | |||
| 1427 | ent = (SymeSatTblEnt *)stoAlloc(OB_Other0, | |||
| 1428 | fullsizeof(SymeSatTblEnt, 2,(sizeof(SymeSatTblEnt) + (2) * sizeof(SymeSatTblVal) - 10 * sizeof (SymeSatTblVal)) | |||
| 1429 | SymeSatTblVal)(sizeof(SymeSatTblEnt) + (2) * sizeof(SymeSatTblVal) - 10 * sizeof (SymeSatTblVal))); | |||
| 1430 | ent->sz = 2; | |||
| 1431 | ent->argv[1].sefo = NULL((void*)0); | |||
| 1432 | idx = 0; | |||
| 1433 | } | |||
| 1434 | else if (ent->argv[ent->sz-1].sefo != NULL((void*)0)) { | |||
| 1435 | ent = (SymeSatTblEnt *)stoAlloc(OB_Other0, | |||
| 1436 | fullsizeof(SymeSatTblEnt,(sizeof(SymeSatTblEnt) + ((ent0->sz + 2)) * sizeof(SymeSatTblVal ) - 10 * sizeof(SymeSatTblVal)) | |||
| 1437 | (ent0->sz + 2),(sizeof(SymeSatTblEnt) + ((ent0->sz + 2)) * sizeof(SymeSatTblVal ) - 10 * sizeof(SymeSatTblVal)) | |||
| 1438 | SymeSatTblVal)(sizeof(SymeSatTblEnt) + ((ent0->sz + 2)) * sizeof(SymeSatTblVal ) - 10 * sizeof(SymeSatTblVal))); | |||
| 1439 | ent->sz = ent0->sz + 2; | |||
| 1440 | for (idx = 0; idx < ent0->sz; idx++) { | |||
| 1441 | ent->argv[idx].sefo = ent0->argv[idx].sefo; | |||
| 1442 | ent->argv[idx].success = ent0->argv[idx].success; | |||
| 1443 | ent->argv[idx].pend = ent0->argv[idx].pend; | |||
| 1444 | } | |||
| 1445 | /* Set the 2 end chaps */ | |||
| 1446 | ent->argv[idx ].sefo = NULL((void*)0); | |||
| 1447 | ent->argv[idx+1].sefo = NULL((void*)0); | |||
| 1448 | } | |||
| 1449 | else { | |||
| 1450 | for (idx=0; ent->argv[idx].sefo != NULL((void*)0); idx++) /* nuffin */; | |||
| 1451 | } | |||
| 1452 | ||||
| 1453 | ent->argv[idx].sefo = cat; | |||
| 1454 | ent->argv[idx].success = tfSatSucceed(result); | |||
| 1455 | ent->argv[idx].pend = tfSatPending(result) ? tfSatGetPendingFail() : NULL((void*)0); | |||
| 1456 | ||||
| 1457 | if (ent != ent0) { | |||
| 1458 | tblSetElt(symeHasTestCache, (TblKey)dom, (TblElt) ent); | |||
| 1459 | if (ent0) stoFree(ent0); | |||
| 1460 | } | |||
| 1461 | } | |||
| 1462 | ||||
| 1463 | ||||
| 1464 | /* Result: | |||
| 1465 | * <undef> => no result | |||
| 1466 | * 0 => fail | |||
| 1467 | * 1 => Pending | |||
| 1468 | * 2 => Success | |||
| 1469 | * Return value: | |||
| 1470 | * 2 => pending value changed | |||
| 1471 | * 1 => found | |||
| 1472 | * 0 => not found | |||
| 1473 | */ | |||
| 1474 | ||||
| 1475 | localstatic int | |||
| 1476 | symeCheckHasResult(Sefo dom, Sefo cat, Bool *result) | |||
| 1477 | { | |||
| 1478 | SymeSatTblEnt *ent; | |||
| 1479 | int idx; | |||
| 1480 | ||||
| 1481 | if (symeHasTestCache == NULL((void*)0)) return 0; | |||
| 1482 | ||||
| 1483 | ent = (SymeSatTblEnt*) tblElt(symeHasTestCache, (TblKey) dom, NULL((void*)0)); | |||
| 1484 | ||||
| 1485 | if (ent == NULL((void*)0)) return 0; | |||
| 1486 | ||||
| 1487 | for (idx = 0; idx < ent->sz; idx++) { | |||
| 1488 | if (ent->argv[idx].sefo | |||
| 1489 | && sefoEqual(ent->argv[idx].sefo, cat)) | |||
| 1490 | break; | |||
| 1491 | } | |||
| 1492 | if (idx == ent->sz) return 0; | |||
| 1493 | ||||
| 1494 | *result = (ent->argv[idx].pend != NULL((void*)0)) ? 1 : (ent->argv[idx].success ? 2 : 0); | |||
| 1495 | ||||
| 1496 | if (ent->argv[idx].pend) { | |||
| 1497 | if (!tfIsPending(ent->argv[idx].pend)(((ent->argv[idx].pend)->state)==TF_State_Pending)) { | |||
| 1498 | ent->argv[idx].sefo = NULL((void*)0); | |||
| 1499 | return 2; | |||
| 1500 | } | |||
| 1501 | } | |||
| 1502 | return 1; | |||
| 1503 | } | |||
| 1504 | ||||
| 1505 | /* | |||
| 1506 | * Lazy conditionals | |||
| 1507 | */ | |||
| 1508 | AbSyn symeLazyCheckData; | |||
| 1509 | ||||
| 1510 | SymeList | |||
| 1511 | symeListMakeLazyConditions(SymeList symes) | |||
| 1512 | { | |||
| 1513 | SymeList tsymes; | |||
| 1514 | for (tsymes = symes; tsymes ; tsymes = cdr(tsymes)((tsymes)->rest)) { | |||
| 1515 | if (symeCondition(car(tsymes)((tsymes)->first))) | |||
| 1516 | symeSetCondIsLazy(car(tsymes))(((((((tsymes)->first))->kind == SYME_Trigger ? libGetAllSymes ((((tsymes)->first))->lib) : ((void*)0)), (((tsymes)-> first)))->bits) |= (0x8000)); | |||
| 1517 | } | |||
| 1518 | return symes; | |||
| 1519 | } | |||
| 1520 | ||||
| 1521 | ||||
| 1522 | Bool | |||
| 1523 | symeUseIdentifier(AbSyn ab, Syme syme) | |||
| 1524 | { | |||
| 1525 | return symeCheckIdentifier(ab, syme); | |||
| 1526 | } | |||
| 1527 | ||||
| 1528 | localstatic Bool | |||
| 1529 | symeCheckIdentifier(AbSyn ab, Syme syme) | |||
| 1530 | { | |||
| 1531 | Scope("SymeUseIdentifier")String scopeName = ("SymeUseIdentifier"); int fluidLevel0 = ( scopeLevel++, fluidLevel); | |||
| 1532 | AbSyn fluid(symeLazyCheckData)fluidSave_symeLazyCheckData = ( fluidStack = (fluidLevel==fluidLimit ) ? fluidGrow() : fluidStack, fluidStack[fluidLevel].scopeName = scopeName, fluidStack[fluidLevel].scopeLevel = scopeLevel, fluidStack[fluidLevel].pglobal = (Pointer) &(symeLazyCheckData ), fluidStack[fluidLevel].pstack = (Pointer) &fluidSave_symeLazyCheckData , fluidStack[fluidLevel].size = sizeof(symeLazyCheckData), fluidLevel ++, (symeLazyCheckData) ); | |||
| 1533 | SefoList conds, tmp; | |||
| 1534 | Bool ok = true1; | |||
| 1535 | ||||
| 1536 | symeLazyCheckData = ab; | |||
| 1537 | ||||
| 1538 | if (!symeCondIsLazy(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x8000))) | |||
| 1539 | Return(true){ fluidUnwind(fluidLevel0, ((int) 0)); return 1;; }; | |||
| 1540 | ||||
| 1541 | tmp = listCons(Sefo)(Sefo_listPointer->Cons)(ab, listNil(Sefo)((SefoList) 0)); | |||
| 1542 | ||||
| 1543 | ||||
| 1544 | /* First check conditions imposed by categories */ | |||
| 1545 | for (conds = symeCondition(syme); conds && ok ; conds = cdr(conds)((conds)->rest)) { | |||
| 1546 | AbSyn cond = car(conds)((conds)->first); | |||
| 1547 | AbSyn dom, cat; | |||
| 1548 | TForm tfdom, tfcat; | |||
| 1549 | SatMask result; | |||
| 1550 | ||||
| 1551 | car(tmp)((tmp)->first) = cond; | |||
| 1552 | if (ablogIsListKnown(tmp)) | |||
| 1553 | continue; | |||
| 1554 | ||||
| 1555 | assert(abTag(cond) == AB_Has)do { if (!(((cond)->abHdr.tag) == AB_Has)) _do_assert(("abTag(cond) == AB_Has" ),"syme.c",1555); } while (0); | |||
| 1556 | dom = cond->abHas.expr; | |||
| 1557 | cat = cond->abHas.property; | |||
| 1558 | ||||
| 1559 | tfdom = abGetCategory(dom); | |||
| 1560 | tfcat = abTForm(cat)((cat)->abHdr.seman ? (cat)->abHdr.seman->tform : 0) ? abTForm(cat)((cat)->abHdr.seman ? (cat)->abHdr.seman->tform : 0) : tiTopFns()->tiGetTopLevelTForm(ablogTrue(), cat); | |||
| 1561 | ||||
| 1562 | /* D has C iff typeof(D) satisfies C. */ | |||
| 1563 | result = tfSat(tfSatTdnInfoMask(), tfdom, tfcat); | |||
| 1564 | ||||
| 1565 | ok = tfSatPending(result) || tfSatSucceed(result); | |||
| 1566 | } | |||
| 1567 | ||||
| 1568 | Return(ok){ fluidUnwind(fluidLevel0, ((int) 0)); return ok;; }; | |||
| 1569 | } | |||
| 1570 | ||||
| 1571 | /***************************************************************************** | |||
| 1572 | * | |||
| 1573 | * :: Syme SExpr I/O | |||
| 1574 | * | |||
| 1575 | ****************************************************************************/ | |||
| 1576 | ||||
| 1577 | localstatic String symeSExprDocumentation (Syme, Bool); | |||
| 1578 | ||||
| 1579 | #define sxiACons(s,v,a)sxCons(sxCons(sxiFrSymbol(symProbe(s, 1 | 2)),v),a) sxCons(sxCons(sxiFrSymbol(symIntern(s)symProbe(s, 1 | 2)),v),a) | |||
| 1580 | static String ssxName = ""; | |||
| 1581 | ||||
| 1582 | SExpr | |||
| 1583 | sefoListToSExpr(SefoList sefos) | |||
| 1584 | { | |||
| 1585 | SExpr sx = sxNil; | |||
| 1586 | ||||
| 1587 | for (; sefos; sefos = cdr(sefos)((sefos)->rest)) | |||
| 1588 | sx = sxCons(abToSExpr(car(sefos)((sefos)->first)), sx); | |||
| 1589 | ||||
| 1590 | sx = sxNReverse(sx); | |||
| 1591 | return sx; | |||
| 1592 | } | |||
| 1593 | ||||
| 1594 | SExpr | |||
| 1595 | symeSExprAList(Syme syme) | |||
| 1596 | { | |||
| 1597 | SExpr sxi, al = sxNil; | |||
| 1598 | TForm type = symeType(syme); | |||
| 1599 | String str; | |||
| 1600 | /* 1. Documentation */ | |||
| 1601 | ||||
| 1602 | /* Should replace this with something that combines | |||
| 1603 | * the comments in a meaningful way | |||
| 1604 | */ | |||
| 1605 | ||||
| 1606 | str = symeSExprDocumentation(syme, false((int) 0)); | |||
| 1607 | if (str) { | |||
| 1608 | sxi = sxiFrString(str); | |||
| 1609 | strFree(str); | |||
| 1610 | al = sxiACons("documentation", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("documentation", 1 | 2)),sxi ),al); | |||
| 1611 | } | |||
| 1612 | #if 0 | |||
| 1613 | /* pre-1.1.11 method */ | |||
| 1614 | if (symeIsExport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Export)) dsyme = syme; | |||
| 1615 | else if (symeIsExtend(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Extend)) | |||
| 1616 | dsyme = car(listLastCons(Syme)(symeExtendee(syme)))(((Syme_listPointer->LastCons)(symeExtendee(syme)))->first ); | |||
| 1617 | else dsyme = NULL((void*)0); | |||
| 1618 | ||||
| 1619 | if (dsyme && symeIsExport(dsyme)(((((dsyme)->kind == SYME_Trigger ? libGetAllSymes((dsyme) ->lib) : ((void*)0)), (dsyme))->kind) == SYME_Export) | |||
| 1620 | && symeComment(dsyme) != docNone | |||
| 1621 | && (symeLib(dsyme)((dsyme)->lib) == NULL((void*)0) | |||
| 1622 | || strEqual(libToStringShort(symeLib(dsyme))(((((dsyme)->lib))->name)->partv[1]), ssxName)) | |||
| 1623 | ) { | |||
| 1624 | sxi = sxiFrString(docString(symeComment(dsyme))((symeComment(dsyme))->corpus)); | |||
| 1625 | al = sxiACons("documentation", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("documentation", 1 | 2)),sxi ),al); | |||
| 1626 | } | |||
| 1627 | #endif | |||
| 1628 | ||||
| 1629 | /* 2. Defaulted? */ | |||
| 1630 | if (symeHasDefault(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->bits) & (0x0080))) | |||
| 1631 | al = sxiACons("default", sxiFrInteger(1), al)sxCons(sxCons(sxiFrSymbol(symProbe("default", 1 | 2)),sxiFrInteger (1)),al); | |||
| 1632 | ||||
| 1633 | /* 3. Name hash code */ | |||
| 1634 | sxi = sxiFrInteger(symeNameCode(syme)); | |||
| 1635 | al = sxiACons("symeNameCode", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("symeNameCode", 1 | 2)),sxi ),al); | |||
| 1636 | ||||
| 1637 | /* 4. Type hash code */ | |||
| 1638 | sxi = sxiFrInteger(gen0SymeTypeCode(syme)); | |||
| 1639 | al = sxiACons("symeTypeCode", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("symeTypeCode", 1 | 2)),sxi ),al); | |||
| 1640 | ||||
| 1641 | if (tfIsAnyMap(type)((((type)->tag) == TF_Map) || (((type)->tag) == TF_PackedMap ))) | |||
| 1642 | type = tfMapRet(type)tfFollowArg(type, 1); | |||
| 1643 | ||||
| 1644 | /* 5. Category exports */ | |||
| 1645 | if (!symeIsSelfSelf(syme)(((syme)->id) == ssymSelfSelf) && !symeIsParam(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) && tfSatCat(type)) { | |||
| 1646 | sxi = symeListToSExpr(tfGetThdExports(type), false((int) 0)); | |||
| 1647 | al = sxiACons("catExports", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("catExports", 1 | 2)),sxi) ,al); | |||
| 1648 | } | |||
| 1649 | ||||
| 1650 | /* 6. Domain exports */ | |||
| 1651 | else if (!symeIsSelfSelf(syme)(((syme)->id) == ssymSelfSelf) && !symeIsParam(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Param) && tfSatDom(type)) { | |||
| 1652 | sxi = symeListToSExpr(tfGetCatExports(type), false((int) 0)); | |||
| 1653 | al = sxiACons("domExports", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("domExports", 1 | 2)),sxi) ,al); | |||
| 1654 | } | |||
| 1655 | ||||
| 1656 | /* 7. Condition */ | |||
| 1657 | else if (symeCondition(syme)) { | |||
| 1658 | sxi = sxCons(abInfo(AB_And)abInfoTable[(AB_And) - AB_START].sxsym, | |||
| 1659 | sefoListToSExpr(symeCondition(syme))); | |||
| 1660 | al = sxiACons("condition", sxi, al)sxCons(sxCons(sxiFrSymbol(symProbe("condition", 1 | 2)),sxi), al); | |||
| 1661 | } | |||
| 1662 | ||||
| 1663 | /* 8. Position */ | |||
| 1664 | if (symeSrcPos(syme)((SrcPos) (SYFI_SrcPos < (8 * sizeof(int)) && !((( ((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_SrcPos ))) ? (symeFieldInfo[SYFI_SrcPos].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SrcPos))) ? ((( (((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SrcPos ))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_SrcPos)] : (symeFieldInfo [SYFI_SrcPos].def)) : symeGetFieldFn(syme,SYFI_SrcPos))) != sposNone) { | |||
| 1665 | al = sxiACons("srcpos", sxiFrInteger(sposLine(symeSrcPos(syme))), al)sxCons(sxCons(sxiFrSymbol(symProbe("srcpos", 1 | 2)),sxiFrInteger (sposLine(((SrcPos) (SYFI_SrcPos < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_SrcPos))) ? (symeFieldInfo[SYFI_SrcPos].def) : (((((syme )->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SrcPos ))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes(( syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_SrcPos))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_SrcPos )] : (symeFieldInfo[SYFI_SrcPos].def)) : symeGetFieldFn(syme, SYFI_SrcPos)))))),al); | |||
| 1666 | } | |||
| 1667 | ||||
| 1668 | if (symeConstNum(syme)(((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !( ((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0 )), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme )->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(syme ,SYFI_ConstInfo))) & 0xFFFF) != -1) { | |||
| 1669 | al = sxiACons("constNum", sxiFrInteger(sposLine(symeConstNum(syme))), al)sxCons(sxCons(sxiFrSymbol(symProbe("constNum", 1 | 2)),sxiFrInteger (sposLine((((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme) ->lib) : ((void*)0)), (syme))->hasmask) & (1 << (SYFI_ConstInfo))) ? (symeFieldInfo[SYFI_ConstInfo].def) : ( ((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo ))) ? ((((((syme)->kind == SYME_Trigger ? libGetAllSymes(( syme)->lib) : ((void*)0)), (syme))->locmask) & (1 << (SYFI_ConstInfo))) ? ((syme)->fieldv)[symeIndex(syme,SYFI_ConstInfo )] : (symeFieldInfo[SYFI_ConstInfo].def)) : symeGetFieldFn(syme ,SYFI_ConstInfo))) & 0xFFFF)))),al); | |||
| 1670 | } | |||
| 1671 | ||||
| 1672 | return sxNReverse(al); | |||
| 1673 | } | |||
| 1674 | ||||
| 1675 | localstatic String | |||
| 1676 | symeSExprDocumentation(Syme syme, Bool localp) | |||
| 1677 | { | |||
| 1678 | if (symeIsExport(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Export)) { | |||
| 1679 | if (symeComment(syme) == docNone) | |||
| 1680 | return NULL((void*)0); | |||
| 1681 | if (!localp | |||
| 1682 | || symeLib(syme)((syme)->lib) == NULL((void*)0) | |||
| 1683 | || strEqual(libToStringShort(symeLib(syme))(((((syme)->lib))->name)->partv[1]), | |||
| 1684 | ssxName)) | |||
| 1685 | return strCopy(docString(symeComment(syme))((symeComment(syme))->corpus)); | |||
| 1686 | return NULL((void*)0); | |||
| 1687 | } | |||
| 1688 | else if (!symeIsExtend(syme)(((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)-> lib) : ((void*)0)), (syme))->kind) == SYME_Extend)) | |||
| 1689 | return NULL((void*)0); | |||
| 1690 | else { | |||
| 1691 | SymeList exts; | |||
| 1692 | String str = strCopy(""); | |||
| 1693 | exts = symeExtendee(syme); | |||
| 1694 | while (exts) { | |||
| 1695 | Syme orig = symeOriginal(car(exts)((exts)->first)); | |||
| 1696 | String ds = symeSExprDocumentation(orig, false((int) 0)); | |||
| 1697 | if (ds) { | |||
| 1698 | String ostr = str; | |||
| 1699 | str = strConcat(str, ds); | |||
| 1700 | strFree(ostr); | |||
| 1701 | strFree(ds); | |||
| 1702 | } | |||
| 1703 | exts = cdr(exts)((exts)->rest); | |||
| 1704 | } | |||
| 1705 | return str; | |||
| 1706 | } | |||
| 1707 | } | |||
| 1708 | ||||
| 1709 | SExpr | |||
| 1710 | symeToSExpr(Syme syme) | |||
| 1711 | { | |||
| 1712 | SExpr sx = sxNil; | |||
| 1713 | SExpr sxi; | |||
| 1714 | TForm type = symeType(syme); | |||
| 1715 | ||||
| 1716 | /* |Declare| */ | |||
| 1717 | sxi = abInfo(AB_Declare)abInfoTable[(AB_Declare) - AB_START].sxsym; | |||
| 1718 | sx = sxCons(sxi, sx); | |||
| 1719 | ||||
| 1720 | /* Symbol name */ | |||
| 1721 | sxi = sxiFrSymbol(symeId(syme)((syme)->id)); | |||
| 1722 | sx = sxCons(sxi, sx); | |||
| 1723 | ||||
| 1724 | /* Symbol type */ | |||
| 1725 | sxi = abToSExprElided(tfExpr(type)tfToAbSyn(type)); | |||
| 1726 | sx = sxCons(sxi, sx); | |||
| 1727 | ||||
| 1728 | /* Create an Alist for remaining data */ | |||
| 1729 | sxi = symeSExprAList(syme); | |||
| 1730 | sx = sxCons(sxi, sx); | |||
| 1731 | ||||
| 1732 | sx = sxNReverse(sx); | |||
| 1733 | return sx; | |||
| 1734 | } | |||
| 1735 | ||||
| 1736 | SExpr | |||
| 1737 | symeListToSExpr(SymeList symes, Bool top) | |||
| 1738 | { | |||
| 1739 | SExpr sx = sxNil; | |||
| 1740 | ||||
| 1741 | for (; symes; symes = cdr(symes)((symes)->rest)) { | |||
| 1742 | Syme syme = car(symes)((symes)->first); | |||
| 1743 | Bool this; | |||
| 1744 | ||||
| 1745 | this = symeTop(syme); | |||
| 1746 | if (!top) | |||
| 1747 | this = true1; | |||
| 1748 | if (DEBUG(symeLib)symeLibDebug) { | |||
| 1749 | this = true1; | |||
| 1750 | } | |||
| 1751 | if (this) sx = sxCons(symeToSExpr(syme), sx); | |||
| 1752 | } | |||
| 1753 | ||||
| 1754 | sx = sxNReverse(sx); | |||
| 1755 | return sx; | |||
| 1756 | } | |||
| 1757 | ||||
| 1758 | int | |||
| 1759 | symeListWrSExpr(FILE * file, String libName, SymeList symes, ULong sxioMode) | |||
| 1760 | { | |||
| 1761 | Scope("symeListWrSExpr")String scopeName = ("symeListWrSExpr"); int fluidLevel0 = (scopeLevel ++, fluidLevel); | |||
| 1762 | SExpr sx; | |||
| 1763 | int cc; | |||
| 1764 | String fluid(ssxName)fluidSave_ssxName = ( fluidStack = (fluidLevel==fluidLimit) ? fluidGrow() : fluidStack, fluidStack[fluidLevel].scopeName = scopeName, fluidStack[fluidLevel].scopeLevel = scopeLevel, fluidStack [fluidLevel].pglobal = (Pointer) &(ssxName), fluidStack[fluidLevel ].pstack = (Pointer) &fluidSave_ssxName, fluidStack[fluidLevel ].size = sizeof(ssxName), fluidLevel++, (ssxName) ); | |||
| 1765 | ssxName = libName; | |||
| 1766 | sx = symeListToSExpr(symes, true1); | |||
| 1767 | cc = sxiWrite(file, sx, sxioMode); | |||
| 1768 | sxiFree(sx); | |||
| 1769 | ||||
| 1770 | Return(cc){ fluidUnwind(fluidLevel0, ((int) 0)); return cc;; }; | |||
| 1771 | } | |||
| 1772 | ||||
| 1773 | /* | |||
| 1774 | * :: SymeList functions | |||
| 1775 | * | |||
| 1776 | * These might eventually be replaced by a table keyed by symbols | |||
| 1777 | */ | |||
| 1778 | ||||
| 1779 | SymeList | |||
| 1780 | symeListSubListById(SymeList symes, Symbol sym) | |||
| 1781 | { | |||
| 1782 | SymeList result = listNil(Syme)((SymeList) 0); | |||
| 1783 | while (symes != listNil(Syme)((SymeList) 0)) { | |||
| 1784 | if (symeId(car(symes))((((symes)->first))->id) == sym) | |||
| 1785 | result = listCons(Syme)(Syme_listPointer->Cons)(car(symes)((symes)->first), result); | |||
| 1786 | symes = cdr(symes)((symes)->rest); | |||
| 1787 | } | |||
| 1788 | return result; | |||
| 1789 | } | |||
| 1790 | ||||
| 1791 | ||||
| 1792 | void | |||
| 1793 | gen0SetFoamKind(Syme syme, FoamTag kind) | |||
| 1794 | { | |||
| 1795 | symeSetFoamKind(syme, kind)(symeSetFieldVal = ((AInt) (kind)), (((((syme)->kind == SYME_Trigger ? libGetAllSymes((syme)->lib) : ((void*)0)), (syme))-> locmask) & (1 << (SYFI_FoamKind))) ? (((syme)->fieldv )[symeIndex(syme,SYFI_FoamKind)] = (symeSetFieldVal)) : !((syme )->full) && symeSetFieldVal == (symeFieldInfo[SYFI_FoamKind ].def) ? symeSetFieldVal : symeSetFieldFn(syme,SYFI_FoamKind, symeSetFieldVal)); | |||
| 1796 | } | |||
| 1797 | ||||
| 1798 | ||||
| 1799 | void | |||
| 1800 | symeShowFully(Syme s) | |||
| 1801 | { | |||
| 1802 | symePrintDb(s); | |||
| 1803 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1804 | "lazy ...............", symeIsLazy(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0001)) ? "yes" : "no", | |||
| 1805 | "special ............", symeIsSpecial(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0002)) ? "yes" : "no"); | |||
| 1806 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1807 | "used ...............", symeUsed(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0040)) ? "yes" : "no", | |||
| 1808 | "deeply .............", symeUsedDeeply(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0004)) ? "yes" : "no"); | |||
| 1809 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1810 | "init ...............", symeImportInit(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0008)) ? "yes" : "no", | |||
| 1811 | "trigger ............", symeHasTrigger(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x4000)) ? "yes" : "no"); | |||
| 1812 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1813 | "unconditional ......", symeUnconditional(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0020)) ? "yes" : "no", | |||
| 1814 | "lazy cond ..........", symeCondIsLazy(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x8000)) ? "yes" : "no"); | |||
| 1815 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1816 | "inlinable ..........", symeInlinable(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0010)) ? "yes" : "no", | |||
| 1817 | "has defaults .......", symeHasDefault(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0080)) ? "yes" : "no"); | |||
| 1818 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1819 | "marked .............", symeMarkBit(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0100)) ? "yes" : "no", | |||
| 1820 | "const lib ..........", symeConstLib(s) ? "yes" : "no"); | |||
| 1821 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1822 | "top-level ..........", symeIsTop(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0200)) ? "yes" : "no", | |||
| 1823 | "pop-conds ..........", symePopConds(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0400)) ? "yes" : "no"); | |||
| 1824 | fprintf(dbOut, " %s %-3s %s %-3s\n", | |||
| 1825 | "full twins .........", symeFullTwin(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x0800)) ? "yes" : "no", | |||
| 1826 | "same libs ..........", symeSameLibs(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x1000)) ? "yes" : "no"); | |||
| 1827 | fprintf(dbOut, " %s %-5d %s %-5ld\n", | |||
| 1828 | "var index ..........", symeVarIndex(s)((UShort) ((((((s)->kind == SYME_Trigger ? libGetAllSymes( (s)->lib) : ((void*)0)), (s))->locmask) & (1 << (SYFI_VarIndex))) ? ((s)->fieldv)[symeIndex(s,SYFI_VarIndex )] : (symeFieldInfo[SYFI_VarIndex].def))), | |||
| 1829 | "const num ..........", symeConstNum(s)(((AInt) (SYFI_ConstInfo < (8 * sizeof(int)) && !( ((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->hasmask) & (1 << (SYFI_ConstInfo ))) ? (symeFieldInfo[SYFI_ConstInfo].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s ))->locmask) & (1 << (SYFI_ConstInfo))) ? (((((( s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ( (void*)0)), (s))->locmask) & (1 << (SYFI_ConstInfo ))) ? ((s)->fieldv)[symeIndex(s,SYFI_ConstInfo)] : (symeFieldInfo [SYFI_ConstInfo].def)) : symeGetFieldFn(s,SYFI_ConstInfo))) & 0xFFFF)); | |||
| 1830 | fprintf(dbOut, " %s %-9d %s %-9d\n", | |||
| 1831 | "defn num ...........", symeDefnNum(s)((int) (SYFI_DefnNum < (8 * sizeof(int)) && !((((( s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ( (void*)0)), (s))->hasmask) & (1 << (SYFI_DefnNum ))) ? (symeFieldInfo[SYFI_DefnNum].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s ))->locmask) & (1 << (SYFI_DefnNum))) ? ((((((s) ->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void *)0)), (s))->locmask) & (1 << (SYFI_DefnNum))) ? ((s)->fieldv)[symeIndex(s,SYFI_DefnNum)] : (symeFieldInfo [SYFI_DefnNum].def)) : symeGetFieldFn(s,SYFI_DefnNum))), | |||
| 1832 | "hash num ...........", symeHashNum(s)((int) (SYFI_HashNum < (8 * sizeof(int)) && !((((( s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ( (void*)0)), (s))->hasmask) & (1 << (SYFI_HashNum ))) ? (symeFieldInfo[SYFI_HashNum].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s ))->locmask) & (1 << (SYFI_HashNum))) ? ((((((s) ->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void *)0)), (s))->locmask) & (1 << (SYFI_HashNum))) ? ((s)->fieldv)[symeIndex(s,SYFI_HashNum)] : (symeFieldInfo [SYFI_HashNum].def)) : symeGetFieldFn(s,SYFI_HashNum)))); | |||
| 1833 | fprintf(dbOut, " %s %-5d %s %-5d\n", | |||
| 1834 | "lib level ..........", symeLibLevel(s)(((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->bits) & (0x2000)), | |||
| 1835 | "def level ..........", ((UShort)symeGetLocal(s, SYFI_DefLevel)((((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->locmask) & (1 << (SYFI_DefLevel ))) ? ((s)->fieldv)[symeIndex(s,SYFI_DefLevel)] : (symeFieldInfo [SYFI_DefLevel].def)))); | |||
| 1836 | fprintf(dbOut, " %s %-9lx %s %-9ld\n", | |||
| 1837 | "depths .............", (unsigned long) symeDepths(s)((AIntList) (SYFI_Depths < (8 * sizeof(int)) && !( ((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->hasmask) & (1 << (SYFI_Depths ))) ? (symeFieldInfo[SYFI_Depths].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask ) & (1 << (SYFI_Depths))) ? ((((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask ) & (1 << (SYFI_Depths))) ? ((s)->fieldv)[symeIndex (s,SYFI_Depths)] : (symeFieldInfo[SYFI_Depths].def)) : symeGetFieldFn (s,SYFI_Depths))), | |||
| 1838 | "use depth ..........", (long) symeUsedDepth(s)((UShort) ((((((s)->kind == SYME_Trigger ? libGetAllSymes( (s)->lib) : ((void*)0)), (s))->locmask) & (1 << (SYFI_UsedDepth))) ? ((s)->fieldv)[symeIndex(s,SYFI_UsedDepth )] : (symeFieldInfo[SYFI_UsedDepth].def)))); | |||
| 1839 | ||||
| 1840 | fprintf(dbOut, " %s %-9s %s %s\n", | |||
| 1841 | "foam kind ..........", (symeFoamKind(s)((FoamTag) (SYFI_FoamKind < (8 * sizeof(int)) && ! (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib ) : ((void*)0)), (s))->hasmask) & (1 << (SYFI_FoamKind ))) ? (symeFieldInfo[SYFI_FoamKind].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s ))->locmask) & (1 << (SYFI_FoamKind))) ? ((((((s )->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : (( void*)0)), (s))->locmask) & (1 << (SYFI_FoamKind ))) ? ((s)->fieldv)[symeIndex(s,SYFI_FoamKind)] : (symeFieldInfo [SYFI_FoamKind].def)) : symeGetFieldFn(s,SYFI_FoamKind))) < FOAM_LIMIT) ? | |||
| 1842 | foamInfo(symeFoamKind(s))(foamInfoTable [(int)(((FoamTag) (SYFI_FoamKind < (8 * sizeof (int)) && !(((((s)->kind == SYME_Trigger ? libGetAllSymes ((s)->lib) : ((void*)0)), (s))->hasmask) & (1 << (SYFI_FoamKind))) ? (symeFieldInfo[SYFI_FoamKind].def) : ((( ((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask) & (1 << (SYFI_FoamKind ))) ? ((((((s)->kind == SYME_Trigger ? libGetAllSymes((s)-> lib) : ((void*)0)), (s))->locmask) & (1 << (SYFI_FoamKind ))) ? ((s)->fieldv)[symeIndex(s,SYFI_FoamKind)] : (symeFieldInfo [SYFI_FoamKind].def)) : symeGetFieldFn(s,SYFI_FoamKind))))-(int )FOAM_START]).str : "(unset)", | |||
| 1843 | "extension ..........", symeExtension(s) ? "yes" : "no"); | |||
| 1844 | } | |||
| 1845 | ||||
| 1846 | ||||
| 1847 | /****************************************************************************** | |||
| 1848 | * | |||
| 1849 | * :: Debugging versions of the syme* getter macros. | |||
| 1850 | * | |||
| 1851 | *****************************************************************************/ | |||
| 1852 | ||||
| 1853 | SImpl | |||
| 1854 | symeXSImpl(Syme s) | |||
| 1855 | { | |||
| 1856 | return (SImpl)symeImpl(s)((SImpl) (SYFI_SImpl < (8 * sizeof(int)) && !((((( s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ( (void*)0)), (s))->hasmask) & (1 << (SYFI_SImpl)) ) ? (symeFieldInfo[SYFI_SImpl].def) : (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask ) & (1 << (SYFI_SImpl))) ? ((((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask ) & (1 << (SYFI_SImpl))) ? ((s)->fieldv)[symeIndex (s,SYFI_SImpl)] : (symeFieldInfo[SYFI_SImpl].def)) : symeGetFieldFn (s,SYFI_SImpl))); | |||
| 1857 | } | |||
| 1858 | ||||
| 1859 | /****************************************************************************** | |||
| 1860 | * | |||
| 1861 | * :: Debugging versions of the symeSet* macros. | |||
| 1862 | * | |||
| 1863 | *****************************************************************************/ | |||
| 1864 | ||||
| 1865 | void | |||
| 1866 | symeXSetExtension(Syme s, AInt v) | |||
| 1867 | { | |||
| 1868 | symeSetField(s, SYFI_Extension, v)(symeSetFieldVal = ((AInt) (v)), (((((s)->kind == SYME_Trigger ? libGetAllSymes((s)->lib) : ((void*)0)), (s))->locmask ) & (1 << (SYFI_Extension))) ? (((s)->fieldv)[symeIndex (s,SYFI_Extension)] = (symeSetFieldVal)) : !((s)->full) && symeSetFieldVal == (symeFieldInfo[SYFI_Extension].def) ? symeSetFieldVal : symeSetFieldFn(s,SYFI_Extension,symeSetFieldVal)); | |||
| 1869 | } | |||
| 1870 | ||||
| 1871 | ||||
| 1872 | /****************************************************************************** | |||
| 1873 | * | |||
| 1874 | * :: Table of information about syme tags | |||
| 1875 | * | |||
| 1876 | *****************************************************************************/ | |||
| 1877 | ||||
| 1878 | struct symeInfo symeInfo[] = { | |||
| 1879 | {SYME_Label, "SYME_Label", "label", ALDOR_S_Syme_Label372}, | |||
| 1880 | {SYME_Param, "SYME_Param", "parameter", ALDOR_S_Syme_Param373}, | |||
| 1881 | {SYME_LexVar, "SYME_LexVar", "lexical variable", ALDOR_S_Syme_LexVar374 }, | |||
| 1882 | {SYME_LexConst,"SYME_LexConst", "lexical constant", ALDOR_S_Syme_LexConst375}, | |||
| 1883 | {SYME_Import, "SYME_Import", "import", ALDOR_S_Syme_Import376}, | |||
| 1884 | {SYME_Export, "SYME_Export", "export", ALDOR_S_Syme_Export377}, | |||
| 1885 | {SYME_Extend, "SYME_Extend", "extend", ALDOR_S_Syme_Extend378}, | |||
| 1886 | {SYME_Library, "SYME_Library", "library", ALDOR_S_Syme_Library379}, | |||
| 1887 | {SYME_Archive, "SYME_Archive", "archive", ALDOR_S_Syme_Archive380}, | |||
| 1888 | {SYME_Builtin, "SYME_Builtin", "builtin", ALDOR_S_Syme_Builtin381}, | |||
| 1889 | {SYME_Foreign, "SYME_Foreign", "foreign", ALDOR_S_Syme_Foreign382}, | |||
| 1890 | {SYME_Fluid, "SYME_Fluid", "fluid variable", ALDOR_S_Syme_Fluid383}, | |||
| 1891 | {SYME_Trigger, "SYME_Trigger", "trigger", ALDOR_S_Syme_Trigger384}, | |||
| 1892 | {SYME_Temp, "SYME_Temp", "temp", ALDOR_S_Syme_Temp385}, | |||
| 1893 | {SYME_Has, "SYME_Has", "has", ALDOR_S_Syme_Temp385}, | |||
| 1894 | }; | |||
| 1895 | ||||
| 1896 | /****************************************************************************** | |||
| 1897 | * | |||
| 1898 | * :: Table of information about syme fields | |||
| 1899 | * | |||
| 1900 | *****************************************************************************/ | |||
| 1901 | ||||
| 1902 | struct symeFieldInfo symeFieldInfo[] = { | |||
| 1903 | { SYFI_Origin, "origin", (AInt) (Pointer) NULL((void*)0) }, | |||
| 1904 | { SYFI_Original, "original", (AInt) (Syme) NULL((void*)0) }, | |||
| 1905 | { SYFI_Extension, "extension", (AInt) (Syme) NULL((void*)0) }, | |||
| 1906 | { SYFI_Condition, "condition", (AInt) listNil(Sefo)((SefoList) 0) }, | |||
| 1907 | { SYFI_Twins, "twins", (AInt) listNil(Syme)((SymeList) 0) }, | |||
| 1908 | { SYFI_Depths, "depths", (AInt) listNil(AInt)((AIntList) 0) }, | |||
| 1909 | { SYFI_Mark, "mark", (AInt) (SefoMark) 0 }, | |||
| 1910 | { SYFI_DefLevel, "defLevel", (AInt) (StabLevel) NULL((void*)0) }, | |||
| 1911 | { SYFI_LibNum, "libNum", (AInt) SYME_NUMBER_UNASSIGNED(0x7FFF)}, | |||
| 1912 | { SYFI_VarIndex, "varIndex", (AInt) SYME_NUMBER_UNASSIGNED(0x7FFF)}, | |||
| 1913 | { SYFI_UsedDepth, "usedDepth", (AInt) SYME_DEPTH_UNUSED(0x7FFF) }, | |||
| 1914 | { SYFI_IntStepNo, "intStepNo", (AInt) (UShort) 0 }, | |||
| 1915 | { SYFI_FoamKind, "foamKind", (AInt) FOAM_LIMIT }, | |||
| 1916 | { SYFI_Closure, "closure", (AInt) (Foam) NULL((void*)0) }, | |||
| 1917 | { SYFI_Inlined, "inlined", (AInt) listNil(Syme)((SymeList) 0) }, | |||
| 1918 | { SYFI_DVMark, "dvMark", (AInt) (UShort) 0 }, | |||
| 1919 | { SYFI_SImpl, "impl", (AInt) (Pointer) 0 }, | |||
| 1920 | { SYFI_ConstLib, "constLib", (AInt) (Lib) NULL((void*)0) }, | |||
| 1921 | { SYFI_ConstInfo, "constInfo", (AInt) SYME_NUMBER_UNASSIGNED(0x7FFF)}, | |||
| 1922 | { SYFI_DefnNum, "defnNum", (AInt) (int) 0 }, | |||
| 1923 | { SYFI_HashNum, "hashNum", (AInt) (int) 0 }, | |||
| 1924 | { SYFI_ExtraBits, "extraBits", (AInt) (int) 0 }, | |||
| 1925 | { SYFI_ConditionContext,"conditionContext",(AInt) (AbSyn) NULL((void*)0) }, | |||
| 1926 | { SYFI_DefinitionConditions,"definedConditions",(AInt) listNil(AbSyn)((AbSynList) 0) }, | |||
| 1927 | { SYFI_SrcPos,"srcpos",(SrcPos) listNil(AbSyn)((AbSynList) 0) }, | |||
| 1928 | }; | |||
| 1929 | ||||
| 1930 | SymeList | |||
| 1931 | symeListFindNamed(SymeList symes, String name) | |||
| 1932 | { | |||
| 1933 | Symbol sym = symIntern(name)symProbe(name, 1 | 2); | |||
| 1934 | SymeList result = listNil(Syme)((SymeList) 0); | |||
| 1935 | while (symes) { | |||
| 1936 | if (symeId(car(symes))((((symes)->first))->id) == sym) | |||
| 1937 | result = listCons(Syme)(Syme_listPointer->Cons)(car(symes)((symes)->first), result); | |||
| 1938 | symes = cdr(symes)((symes)->rest); | |||
| 1939 | } | |||
| 1940 | return result; | |||
| 1941 | } |