Bug Summary

File:src/syme.c
Warning:line 556, column 40
The result of left shift is undefined because the right operand is negative

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name syme.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/home/kfp/aldor/aldor/aldor/src -fcoverage-compilation-dir=/home/kfp/aldor/aldor/aldor/src -resource-dir /usr/local/lib/clang/18 -D PACKAGE_NAME="aldor" -D PACKAGE_TARNAME="aldor" -D PACKAGE_VERSION="1.4.0" -D PACKAGE_STRING="aldor 1.4.0" -D PACKAGE_BUGREPORT="aldor@xinutec.org" -D PACKAGE_URL="" -D PACKAGE="aldor" -D VERSION="1.4.0" -D YYTEXT_POINTER=1 -D HAVE_STDIO_H=1 -D HAVE_STDLIB_H=1 -D HAVE_STRING_H=1 -D HAVE_INTTYPES_H=1 -D HAVE_STDINT_H=1 -D HAVE_STRINGS_H=1 -D HAVE_SYS_STAT_H=1 -D HAVE_SYS_TYPES_H=1 -D HAVE_UNISTD_H=1 -D STDC_HEADERS=1 -D HAVE_LIBREADLINE=1 -D HAVE_READLINE_READLINE_H=1 -D HAVE_READLINE_HISTORY=1 -D HAVE_READLINE_HISTORY_H=1 -D USE_GLOOP_SHELL=1 -D GENERATOR_COROUTINES=0 -D HAVE_DLFCN_H=1 -D LT_OBJDIR=".libs/" -I . -D VCSVERSION="2c53e759f1e00e345f8b172e7139debda72fda13" -internal-isystem /usr/local/lib/clang/18/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -O0 -Wno-empty-body -Wno-enum-compare -Wno-missing-field-initializers -Wno-unused -Wno-unused-parameter -Wno-error=format -Wno-error=type-limits -Wno-error=strict-aliasing -Wno-sign-compare -Wno-error=shift-negative-value -Wno-error=clobbered -std=c99 -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2026-01-15-223856-845667-1 -x c syme.c
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
31Bool symeDebug = false((int) 0);
32Bool symeFillDebug = false((int) 0);
33Bool symeHasDebug = false((int) 0);
34Bool symeLibDebug = false((int) 0);
35extern 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
49localstatic Syme symeAlloc (SymeTag);
50localstatic Syme symeAllocCopy (Syme);
51localstatic void symeNeed (Syme, UByte);
52
53localstatic SymeList symeLocalTwins (Syme);
54
55localstatic TForm symeFillType (Syme);
56localstatic void symeFillFrLibrary (Syme);
57localstatic void symeFillFrExporter (Syme, TForm);
58
59localstatic Bool symeListCheckFindSyme (SymeList, Syme);
60localstatic void symeListCheckJoinSymes (Syme, Syme);
61localstatic Bool abIsFullyInstantiated (Sefo);
62localstatic int symeCheckHas (SymeCContext, Sefo, Sefo);
63localstatic void symeCheckHasMemo (Sefo, Sefo, SatMask);
64localstatic int symeCheckHasResult (Sefo, Sefo, Bool *);
65localstatic Bool symeCheckIdentifier (AbSyn, Syme);
66
67extern void tiTfSefo (Stab, TForm);
68extern TForm tiGetTForm (Stab, AbSyn);
69extern TForm abGetCategory (AbSyn);
70
71/******************************************************************************
72 *
73 * :: Syme field operations.
74 *
75 *****************************************************************************/
76
77localstatic Syme
78symeAlloc(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
95localstatic Syme
96symeAllocCopy(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
107localstatic void
108symeNeed(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
134UByte
135symeIndex(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
146void
147symeSetFieldTrigger(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
153AInt
154symeGetFieldFn(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
169AInt
170symeSetFieldFn(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
189AInt symeSetFieldVal;
190
191/******************************************************************************
192 *
193 * :: Basic operations.
194 *
195 *****************************************************************************/
196
197Syme
198symeNew(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
214Syme
215symeNewLib(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
230Syme
231symeCopy(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
246void
247symeFree(Syme syme)
248{
249 stoFree((Pointer) syme);
250}
251
252Bool
253symeEq(Syme syme1, Syme syme2)
254{
255 return syme1 == syme2;
256}
257
258Bool
259symeEqualWithAnnotation(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 */
279Hash
280symeHashFn(Syme syme)
281{
282 return symeHash(syme)((syme)->hash);
283}
284
285
286/******************************************************************************
287 *
288 * :: Field accessors.
289 *
290 *****************************************************************************/
291
292TForm
293symeType(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
323TForm
324symeExporter(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
330Syme
331symeExportingSyme(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
345SymeList
346symeExtendee(Syme syme)
347{
348 return (SymeList) symeGetFieldFn(syme, SYFI_Extendee);
349}
350
351Doc
352symeComment(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
365Syme
366symeOriginal(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
377SefoList
378symeCondition(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
385Syme
386symeExtension(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
398Syme
399symeExtensionFirst(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
405Syme
406symeExtensionFull(Syme syme)
407{
408 Syme ext = symeExtensionFirst(syme);
409 if (ext == NULL((void*)0)) {
410 return syme;
411 }
412 return symeExtensionFull(ext);
413}
414
415localstatic SymeList
416symeLocalTwins(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
421SymeList
422symeTwins(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
453StabLevel
454symeDefLevel(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
462SymeList
463symeInlined(Syme syme)
464{
465 return (SymeList) symeGetFieldFn(syme, SYFI_Inlined);
466}
467
468Lib
469symeConstLib(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
485Bool
486symeTop(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
493Hash
494symeNameCode(Syme syme)
495{
496 return strHash(symeString(syme)((((syme)->id))->str));
497}
498
499Hash
500symeTypeCode(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
529Hash
530gen0SymeTypeCode(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
541void
542symeAddHash(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
555AInt
556symeGetFieldX(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))
; }
1
Assuming the condition is false
2
Assuming field 'kind' is not equal to SYME_Trigger
3
'?' condition is false
4
The result of left shift is undefined because the right operand is negative
557
558void
559symeSetConstNum(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
564void
565symeSetConstFlag(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}
569void
570symeClrConstFlag(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
575void
576symeSetConstInfo(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
587TForm
588symeSetType(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
594StabLevel
595symeSetDefLevel(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
601void
602symeSetLib(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
617Lib
618symeSetConstLib(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
631void
632symeAddExtendee(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
637void
638symeListSetExtension(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
644Syme
645symeAddCondition(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
667SymeList
668symeListAddCondition(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
681void
682symeAddTwin(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
695extern SImpl symeMergeImpl(Syme, SImpl);
696
697void
698symeTransferImplInfo(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
713void
714symeSetCondition(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 *****************************************************************************/
725Bool
726symeIsJavaImport(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
737Bool
738symeIsJavaApply(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
748Bool
749symeIsJavaConstructor(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
759String
760symeJavaApplyName(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
776ErrorSet
777symeIsJavaExport(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
824SImpl
825symeMergeImpl(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
924void
925symeImplAddConst(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
948void
949symeImplAddInherit(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
983Syme
984symeNewLabel(Symbol id, TForm tf, StabLevel slev)
985{
986 return symeNew(SYME_Label, id, tf, slev);
987}
988
989Syme
990symeNewParam(Symbol id, TForm tf, StabLevel slev)
991{
992 return symeNew(SYME_Param, id, tf, slev);
993}
994
995Syme
996symeNewLexVar(Symbol id, TForm tf, StabLevel slev)
997{
998 return symeNew(SYME_LexVar, id, tf, slev);
999}
1000
1001Syme
1002symeNewLexConst(Symbol id, TForm tf, StabLevel slev)
1003{
1004 return symeNew(SYME_LexConst, id, tf, slev);
1005}
1006
1007Syme
1008symeNewExport(Symbol id, TForm tf, StabLevel slev)
1009{
1010 return symeNew(SYME_Export, id, tf, slev);
1011}
1012
1013Syme
1014symeNewExtend(Symbol id, TForm tf, StabLevel slev)
1015{
1016 return symeNew(SYME_Extend, id, tf, slev);
1017}
1018
1019Syme
1020symeNewFluid(Symbol id, TForm tf, StabLevel slev)
1021{
1022 return symeNew(SYME_Fluid, id, tf, slev);
1023}
1024
1025Syme
1026symeNewImport(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
1033Syme
1034symeNewLibrary(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
1041Syme
1042symeNewArchive(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
1049Syme
1050symeNewBuiltin(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
1058Syme
1059symeNewForeign(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
1066Syme
1067symeNewTemp(Symbol id, TForm type, StabLevel level)
1068{
1069 Syme syme = symeNew(SYME_Temp, id, type, level);
1070
1071 return syme;
1072}
1073
1074Syme
1075symeClone(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
1088localstatic TForm
1089symeFillType(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
1125localstatic void
1126symeFillFrLibrary(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
1141localstatic void
1142symeFillFrExporter(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
1177SymeList
1178symeListCheckAddConditions(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
1197SymeList
1198symeListCheckWithCondition(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
1222SymeList
1223symeListCheckCondition(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
1242localstatic Bool
1243symeListCheckFindSyme(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
1269localstatic void
1270symeListCheckJoinSymes(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 */
1288Bool
1289symeCheckCondition(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
1336localstatic Bool
1337abIsFullyInstantiated(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 */
1362localstatic int
1363symeCheckHas(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
1401typedef struct _SymeSatTblVal {
1402 Sefo sefo;
1403 Bool success;
1404 TForm pend;
1405} SymeSatTblVal;
1406
1407typedef struct _SymeSatTblEnt {
1408 int sz;
1409 SymeSatTblVal argv[NARY10];
1410} SymeSatTblEnt;
1411
1412Table symeHasTestCache;
1413
1414localstatic void
1415symeCheckHasMemo(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
1475localstatic int
1476symeCheckHasResult(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 */
1508AbSyn symeLazyCheckData;
1509
1510SymeList
1511symeListMakeLazyConditions(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
1522Bool
1523symeUseIdentifier(AbSyn ab, Syme syme)
1524{
1525 return symeCheckIdentifier(ab, syme);
1526}
1527
1528localstatic Bool
1529symeCheckIdentifier(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
1577localstatic 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)
1580static String ssxName = "";
1581
1582SExpr
1583sefoListToSExpr(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
1594SExpr
1595symeSExprAList(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
1675localstatic String
1676symeSExprDocumentation(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
1709SExpr
1710symeToSExpr(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
1736SExpr
1737symeListToSExpr(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
1758int
1759symeListWrSExpr(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
1779SymeList
1780symeListSubListById(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
1792void
1793gen0SetFoamKind(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
1799void
1800symeShowFully(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
1853SImpl
1854symeXSImpl(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
1865void
1866symeXSetExtension(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
1878struct 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
1902struct 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
1930SymeList
1931symeListFindNamed(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}