• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nickg / nvc / 22254670368

21 Feb 2026 08:57AM UTC coverage: 92.569% (-0.03%) from 92.601%
22254670368

push

github

nickg
Fix misleading message when protected method call is ambiguous

6 of 9 new or added lines in 1 file covered. (66.67%)

505 existing lines in 7 files now uncovered.

76900 of 83073 relevant lines covered (92.57%)

435372.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

99.26
/src/tree.c
1
//
2
//  Copyright (C) 2011-2025  Nick Gasson
3
//
4
//  This program is free software: you can redistribute it and/or modify
5
//  it under the terms of the GNU General Public License as published by
6
//  the Free Software Foundation, either version 3 of the License, or
7
//  (at your option) any later version.
8
//
9
//  This program is distributed in the hope that it will be useful,
10
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
11
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
//  GNU General Public License for more details.
13
//
14
//  You should have received a copy of the GNU General Public License
15
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
//
17

18
#include "tree.h"
19
#include "util.h"
20
#include "object.h"
21
#include "common.h"
22

23
#include <assert.h>
24
#include <stdlib.h>
25
#include <string.h>
26
#include <ctype.h>
27

28
static const imask_t has_map[T_LAST_TREE_KIND] = {
29
   // T_ENTITY
30
   (I_IDENT | I_PORTS | I_GENERICS | I_CONTEXT | I_DECLS | I_STMTS | I_PRAGMAS),
31

32
   // T_ARCH
33
   (I_IDENT | I_IDENT2 | I_DECLS | I_STMTS | I_CONTEXT | I_PRIMARY | I_PRAGMAS),
34

35
   // T_PORT_DECL
36
   (I_IDENT | I_VALUE | I_TYPE | I_SUBKIND | I_CLASS | I_FLAGS),
37

38
   // T_FCALL
39
   (I_IDENT | I_PARAMS | I_TYPE | I_REF | I_FLAGS),
40

41
   // T_LITERAL
42
   (I_SUBKIND | I_TYPE | I_IVAL | I_DVAL | I_IDENT | I_REF),
43

44
   // T_SIGNAL_DECL
45
   (I_IDENT | I_VALUE | I_TYPE | I_FLAGS),
46

47
   // T_VAR_DECL
48
   (I_IDENT | I_VALUE | I_TYPE | I_FLAGS),
49

50
   // T_PROCESS
51
   (I_IDENT | I_DECLS | I_STMTS | I_TRIGGERS | I_FLAGS),
52

53
   // T_REF
54
   (I_IDENT | I_TYPE | I_REF | I_FLAGS),
55

56
   // T_WAIT
57
   (I_IDENT | I_VALUE | I_DELAY | I_TRIGGERS | I_FLAGS),
58

59
   // T_TYPE_DECL
60
   (I_IDENT | I_TYPE),
61

62
   // T_VAR_ASSIGN
63
   (I_IDENT | I_VALUE | I_TARGET),
64

65
   // T_PACKAGE
66
   (I_IDENT | I_DECLS | I_CONTEXT | I_GENERICS | I_GENMAPS | I_PRAGMAS),
67

68
   // T_SIGNAL_ASSIGN
69
   (I_IDENT | I_TARGET | I_WAVES | I_REJECT),
70

71
   // T_QUALIFIED
72
   (I_IDENT | I_VALUE | I_TYPE),
73

74
   // T_ENUM_LIT
75
   (I_IDENT | I_TYPE | I_POS),
76

77
   // T_CONST_DECL
78
   (I_IDENT | I_VALUE | I_TYPE | I_FLAGS),
79

80
   // T_FUNC_DECL
81
   (I_IDENT | I_PORTS | I_TYPE | I_FLAGS | I_IDENT2 | I_SUBKIND | I_GENERICS),
82

83
   // T_ELAB
84
   (I_IDENT | I_DECLS | I_STMTS | I_CONTEXT),
85

86
   // T_AGGREGATE
87
   (I_TYPE | I_ASSOCS | I_FLAGS),
88

89
   // T_ASSERT
90
   (I_IDENT | I_VALUE | I_SEVERITY | I_MESSAGE),
91

92
   // T_ATTR_REF
93
   (I_NAME | I_VALUE | I_IDENT | I_PARAMS | I_TYPE | I_SUBKIND),
94

95
   // T_ARRAY_REF
96
   (I_VALUE | I_PARAMS | I_TYPE | I_FLAGS),
97

98
   // T_ARRAY_SLICE
99
   (I_VALUE | I_TYPE | I_RANGES),
100

101
   // T_INSTANCE
102
   (I_IDENT | I_IDENT2 | I_PARAMS | I_GENMAPS | I_REF | I_CLASS | I_SPEC),
103

104
   // T_IF
105
   (I_IDENT | I_CONDS),
106

107
   // T_NULL
108
   (I_IDENT),
109

110
   // T_PACK_BODY
111
   (I_IDENT | I_DECLS | I_CONTEXT | I_PRIMARY | I_PRAGMAS),
112

113
   // T_FUNC_BODY
114
   (I_IDENT | I_DECLS | I_STMTS | I_PORTS | I_TYPE | I_FLAGS | I_GENERICS
115
    | I_IDENT2 | I_SUBKIND),
116

117
   // T_RETURN
118
   (I_IDENT | I_TYPE | I_VALUE),
119

120
   // T_COND_ASSIGN
121
   (I_IDENT | I_TARGET | I_CONDS | I_GUARD),
122

123
   // T_WHILE
124
   (I_IDENT | I_VALUE | I_STMTS),
125

126
   // T_WAVEFORM
127
   (I_VALUE | I_DELAY),
128

129
   // T_ALIAS
130
   (I_IDENT | I_VALUE | I_TYPE | I_FLAGS),
131

132
   // T_FOR
133
   (I_IDENT | I_STMTS | I_RANGES | I_DECLS),
134

135
   // T_ATTR_DECL
136
   (I_IDENT | I_TYPE),
137

138
   // T_ATTR_SPEC
139
   (I_IDENT | I_VALUE | I_IDENT2 | I_CLASS | I_REF | I_TYPE | I_SUBKIND),
140

141
   // T_PROC_DECL
142
   (I_IDENT | I_PORTS | I_TYPE | I_FLAGS | I_IDENT2 | I_SUBKIND | I_GENERICS),
143

144
   // T_PROC_BODY
145
   (I_IDENT | I_DECLS | I_STMTS | I_PORTS | I_TYPE | I_FLAGS | I_GENERICS
146
    | I_IDENT2 | I_SUBKIND),
147

148
   // T_EXIT
149
   (I_IDENT | I_VALUE | I_IDENT2),
150

151
   // T_PCALL
152
   (I_IDENT | I_IDENT2 | I_PARAMS | I_REF),
153

154
   // T_CASE
155
   (I_IDENT | I_VALUE | I_STMTS),
156

157
   // T_BLOCK
158
   (I_IDENT | I_DECLS | I_STMTS | I_PORTS | I_GENERICS | I_PARAMS | I_GENMAPS),
159

160
   // T_COND_STMT
161
   (I_IDENT | I_VALUE | I_DECLS | I_STMTS),
162

163
   // T_TYPE_CONV
164
   (I_VALUE | I_TYPE | I_FLAGS),
165

166
   // T_SELECT
167
   (I_IDENT | I_VALUE | I_STMTS | I_GUARD),
168

169
   // T_COMPONENT
170
   (I_IDENT | I_PORTS | I_GENERICS),
171

172
   // T_IF_GENERATE
173
   (I_IDENT | I_CONDS),
174

175
   // T_FOR_GENERATE
176
   (I_IDENT | I_DECLS | I_STMTS | I_RANGES),
177

178
   // T_FILE_DECL
179
   (I_IDENT | I_VALUE | I_TYPE | I_FILE_MODE),
180

181
   // T_OPEN
182
   (I_TYPE),
183

184
   // T_FIELD_DECL
185
   (I_IDENT | I_TYPE | I_POS),
186

187
   // T_RECORD_REF
188
   (I_IDENT | I_VALUE | I_TYPE | I_REF),
189

190
   // T_ALL
191
   (I_VALUE | I_TYPE),
192

193
   // T_NEW
194
   (I_VALUE | I_TYPE),
195

196
   // T_UNIT_DECL
197
   (I_IDENT | I_VALUE | I_TYPE),
198

199
   // T_NEXT
200
   (I_IDENT | I_VALUE | I_IDENT2),
201

202
   // T_PARAM
203
   (I_VALUE | I_POS | I_SUBKIND | I_NAME),
204

205
   // T_ASSOC
206
   (I_VALUE | I_POS | I_NAME | I_RANGES | I_SUBKIND),
207

208
   // T_USE
209
   (I_IDENT | I_IDENT2 | I_REF),
210

211
   // T_HIER
212
   (I_IDENT | I_SUBKIND | I_IDENT2 | I_REF),
213

214
   // T_SPEC
215
   (I_IDENT | I_IDENT2 | I_VALUE | I_REF | I_DECLS),
216

217
   // T_BINDING
218
   (I_PARAMS | I_GENMAPS | I_IDENT | I_IDENT2 | I_CLASS | I_REF),
219

220
   // T_LIBRARY
221
   (I_IDENT | I_IDENT2),
222

223
   // T_DESIGN_UNIT
224
   (I_CONTEXT),
225

226
   // T_CONFIGURATION
227
   (I_IDENT | I_IDENT2 | I_DECLS | I_PRIMARY | I_PRAGMAS),
228

229
   // T_PROT_BODY
230
   (I_IDENT | I_TYPE | I_DECLS | I_PRIMARY),
231

232
   // T_CONTEXT
233
   (I_CONTEXT | I_IDENT | I_PRAGMAS),
234

235
   // T_CONTEXT_REF
236
   (I_IDENT | I_REF),
237

238
   // T_CONSTRAINT
239
   (I_SUBKIND | I_RANGES | I_REF),
240

241
   // T_BLOCK_CONFIG
242
   (I_DECLS | I_IDENT | I_VALUE | I_RANGES | I_REF),
243

244
   // T_PROT_FCALL
245
   (I_IDENT | I_PARAMS | I_TYPE | I_REF | I_FLAGS | I_NAME),
246

247
   // T_PROT_PCALL
248
   (I_IDENT | I_IDENT2 | I_PARAMS | I_REF | I_NAME),
249

250
   // T_RANGE
251
   (I_SUBKIND | I_VALUE | I_LEFT | I_RIGHT | I_TYPE),
252

253
   // T_IMPLICIT_SIGNAL
254
   (I_IDENT | I_TYPE | I_SUBKIND | I_VALUE | I_FLAGS),
255

256
   // T_DISCONNECT
257
   (I_IDENT | I_REF | I_TYPE | I_DELAY),
258

259
   // T_GROUP_TEMPLATE
260
   (I_IDENT),
261

262
   // T_GROUP
263
   (I_IDENT | I_REF),
264

265
   // T_SUBTYPE_DECL
266
   (I_IDENT | I_TYPE),
267

268
   // T_CONV_FUNC
269
   (I_IDENT | I_REF | I_VALUE | I_TYPE),
270

271
   // T_CONCURRENT
272
   (I_IDENT | I_STMTS | I_FLAGS),
273

274
   // T_SEQUENCE
275
   (I_IDENT | I_STMTS | I_DECLS),
276

277
   // T_PACK_INST
278
   (I_IDENT | I_REF | I_DECLS | I_CONTEXT | I_GENERICS | I_GENMAPS | I_PRAGMAS),
279

280
   // T_GENERIC_DECL
281
   (I_IDENT | I_VALUE | I_TYPE | I_CLASS | I_SUBKIND | I_FLAGS | I_PORTS),
282

283
   // T_TYPE_REF
284
   (I_IDENT | I_TYPE),
285

286
   // T_BOX
287
   (I_IDENT | I_TYPE | I_REF),
288

289
   // T_PARAM_DECL
290
   (I_IDENT | I_VALUE | I_TYPE | I_SUBKIND | I_CLASS | I_FLAGS),
291

292
   // T_EXTERNAL_NAME
293
   (I_PARTS | I_CLASS | I_TYPE | I_REF),
294

295
   // T_FORCE
296
   (I_IDENT | I_TARGET | I_VALUE | I_SUBKIND),
297

298
   // T_RELEASE
299
   (I_IDENT | I_TARGET | I_SUBKIND),
300

301
   // T_PROT_REF
302
   (I_IDENT | I_VALUE | I_TYPE | I_REF),
303

304
   // T_MATCH_CASE
305
   (I_IDENT | I_VALUE | I_STMTS),
306

307
   // T_FUNC_INST
308
   (I_IDENT | I_DECLS | I_STMTS | I_PORTS | I_TYPE | I_FLAGS | I_GENERICS
309
    | I_IDENT2 | I_SUBKIND | I_GENMAPS | I_REF),
310

311
   // T_PROC_INST
312
   (I_IDENT | I_DECLS | I_STMTS | I_PORTS | I_TYPE | I_FLAGS | I_GENERICS
313
    | I_IDENT2 | I_SUBKIND | I_GENMAPS | I_REF),
314

315
   // T_ELEM_CONSTRAINT
316
   (I_IDENT | I_REF | I_TYPE),
317

318
   // T_STRING
319
   (I_CHARS | I_TYPE),
320

321
   // T_PATH_ELT
322
   (I_SUBKIND | I_IDENT | I_VALUE),
323

324
   // T_PRAGMA
325
   (I_SUBKIND),
326

327
   // T_CASE_GENERATE
328
   (I_IDENT | I_VALUE | I_STMTS),
329

330
   // T_ALTERNATIVE
331
   (I_IDENT | I_CHOICES | I_STMTS | I_DECLS),
332

333
   // T_PSL_DECL
334
   (I_IDENT | I_FOREIGN),
335

336
   // T_VERILOG
337
   (I_IDENT | I_FOREIGN),
338

339
   // T_VIEW_DECL
340
   (I_IDENT | I_TYPE),
341

342
   // T_PACKAGE_MAP
343
   (I_IDENT | I_SUBKIND | I_GENMAPS | I_REF),
344

345
   // T_COND_EXPR
346
   (I_VALUE | I_RESULT),
347

348
   // T_COND_VALUE
349
   (I_CONDS | I_TYPE),
350

351
   // T_COND_RETURN
352
   (I_IDENT | I_VALUE),
353

354
   // T_VIEW_ELEMENT
355
   (I_IDENT | I_REF | I_SUBKIND | I_TYPE | I_VALUE),
356

357
   // T_MATCH_SELECT
358
   (I_IDENT | I_VALUE | I_STMTS | I_GUARD),
359

360
   // T_PROT_DECL
361
   (I_IDENT | I_DECLS | I_TYPE),
362

363
   // T_DUMMY_DRIVER
364
   (I_TARGET | I_IDENT),
365

366
   // T_GUARD
367
   (I_REF | I_SPEC | I_TYPE),
368

369
   // T_INERTIAL
370
   (I_VALUE | I_TYPE),
371

372
   // T_ELEM_RESOLUTION
373
   (I_ASSOCS),
374

375
   // T_LOOP
376
   (I_IDENT | I_STMTS),
377

378
   // T_REPORT
379
   (I_IDENT | I_SEVERITY | I_MESSAGE),
380

381
   // T_PSL_DIRECT
382
   (I_IDENT | I_FOREIGN),
383

384
   // T_PSL_FCALL
385
   (I_FOREIGN | I_TYPE),
386

387
   // T_PSL_UNION
388
   (I_FOREIGN | I_TYPE),
389

390
   // T_CHOICE
391
   (I_NAME | I_RANGES),
392
};
393

394
static const char *kind_text_map[T_LAST_TREE_KIND] = {
395
   "T_ENTITY",          "T_ARCH",            "T_PORT_DECL",
396
   "T_FCALL",           "T_LITERAL",         "T_SIGNAL_DECL",
397
   "T_VAR_DECL",        "T_PROCESS",         "T_REF",
398
   "T_WAIT",            "T_TYPE_DECL",       "T_VAR_ASSIGN",
399
   "T_PACKAGE",         "T_SIGNAL_ASSIGN",   "T_QUALIFIED",
400
   "T_ENUM_LIT",        "T_CONST_DECL",      "T_FUNC_DECL",
401
   "T_ELAB",            "T_AGGREGATE",       "T_ASSERT",
402
   "T_ATTR_REF",        "T_ARRAY_REF",       "T_ARRAY_SLICE",
403
   "T_INSTANCE",        "T_IF",              "T_NULL",
404
   "T_PACK_BODY",       "T_FUNC_BODY",       "T_RETURN",
405
   "T_COND_ASSIGN",     "T_WHILE",           "T_WAVEFORM",
406
   "T_ALIAS",           "T_FOR",             "T_ATTR_DECL",
407
   "T_ATTR_SPEC",       "T_PROC_DECL",       "T_PROC_BODY",
408
   "T_EXIT",            "T_PCALL",           "T_CASE",
409
   "T_BLOCK",           "T_COND_STMT",       "T_TYPE_CONV",
410
   "T_SELECT",          "T_COMPONENT",       "T_IF_GENERATE",
411
   "T_FOR_GENERATE",    "T_FILE_DECL",       "T_OPEN",
412
   "T_FIELD_DECL",      "T_RECORD_REF",      "T_ALL",
413
   "T_NEW",             "T_UNIT_DECL",       "T_NEXT",
414
   "T_PARAM",           "T_ASSOC",           "T_USE",
415
   "T_HIER",            "T_SPEC",            "T_BINDING",
416
   "T_LIBRARY",         "T_DESIGN_UNIT",     "T_CONFIGURATION",
417
   "T_PROT_BODY",       "T_CONTEXT",         "T_CONTEXT_REF",
418
   "T_CONSTRAINT",      "T_BLOCK_CONFIG",    "T_PROT_FCALL",
419
   "T_PROT_PCALL",      "T_RANGE",           "T_IMPLICIT_SIGNAL",
420
   "T_DISCONNECT",      "T_GROUP_TEMPLATE",  "T_GROUP",
421
   "T_SUBTYPE_DECL",    "T_CONV_FUNC",       "T_CONCURRENT",
422
   "T_SEQUENCE",        "T_PACK_INST",       "T_GENERIC_DECL",
423
   "T_TYPE_REF",        "T_BOX",             "T_PARAM_DECL",
424
   "T_EXTERNAL_NAME",   "T_FORCE",           "T_RELEASE",
425
   "T_PROT_REF",        "T_MATCH_CASE",      "T_FUNC_INST",
426
   "T_PROC_INST",       "T_ELEM_CONSTRAINT", "T_STRING",
427
   "T_PATH_ELT",        "T_PRAGMA",          "T_CASE_GENERATE",
428
   "T_ALTERNATIVE",     "T_PSL_DECL",        "T_VERILOG",
429
   "T_VIEW_DECL",       "T_PACKAGE_MAP",     "T_COND_EXPR",
430
   "T_COND_VALUE",      "T_COND_RETURN",     "T_VIEW_ELEMENT",
431
   "T_MATCH_SELECT",    "T_PROT_DECL",       "T_DUMMY_DRIVER",
432
   "T_GUARD",           "T_INERTIAL",        "T_ELEM_RESOLUTION",
433
   "T_LOOP",            "T_REPORT",          "T_PSL_DIRECT",
434
   "T_PSL_FCALL",       "T_PSL_UNION",       "T_CHOICE",
435
};
436

437
static const change_allowed_t change_allowed[] = {
438
   { T_DESIGN_UNIT, T_ENTITY        },
439
   { T_DESIGN_UNIT, T_PACKAGE       },
440
   { T_DESIGN_UNIT, T_PACK_BODY     },
441
   { T_DESIGN_UNIT, T_ARCH          },
442
   { T_DESIGN_UNIT, T_CONFIGURATION },
443
   { T_DESIGN_UNIT, T_CONTEXT       },
444
   { T_DESIGN_UNIT, T_PACK_INST     },
445
   { T_FUNC_DECL,   T_FUNC_BODY     },
446
   { T_PROC_DECL,   T_PROC_BODY     },
447
   { -1,            -1              }
448
};
449

450
struct _tree {
451
   object_t object;
452
};
453

454
struct _type {
455
   object_t object;
456
};
457

458
struct _psl_node {
459
   object_t object;
460
};
461

462
struct _vlog_node {
463
   object_t object;
464
};
465

466
object_class_t tree_object = {
467
   .name           = "tree",
468
   .change_allowed = change_allowed,
469
   .has_map        = has_map,
470
   .kind_text_map  = kind_text_map,
471
   .tag            = OBJECT_TAG_TREE,
472
   .last_kind      = T_LAST_TREE_KIND,
473
   .has_loc        = true,
474
   .gc_roots       = { T_ARCH, T_ENTITY, T_PACKAGE, T_ELAB, T_PACK_BODY,
475
                       T_CONTEXT, T_CONFIGURATION, T_DESIGN_UNIT,
476
                       T_PACK_INST },
477
   .gc_num_roots   = 9
478
};
479

480
typedef struct {
481
   tree_deps_fn_t fn;
482
   void          *context;
483
} tree_deps_args_t;
484

485
#ifdef DEBUG
486
static tree_kind_t expr_kinds[] = {
487
   T_FCALL,     T_LITERAL,       T_REF,        T_QUALIFIED,
488
   T_AGGREGATE, T_ATTR_REF,      T_ARRAY_REF,  T_ARRAY_SLICE,
489
   T_TYPE_CONV, T_OPEN,          T_RECORD_REF, T_ALL,
490
   T_NEW,       T_PROT_FCALL,    T_CONV_FUNC,  T_TYPE_REF,
491
   T_BOX,       T_EXTERNAL_NAME, T_PROT_REF,   T_STRING,
492
};
493

494
static tree_kind_t decl_kinds[] = {
495
   T_PORT_DECL,      T_SIGNAL_DECL,    T_VAR_DECL,        T_TYPE_DECL,
496
   T_CONST_DECL,     T_FUNC_DECL,      T_FUNC_BODY,       T_ALIAS,
497
   T_ATTR_DECL,      T_ATTR_SPEC,      T_PROC_DECL,       T_PROC_BODY,
498
   T_COMPONENT,      T_FILE_DECL,      T_FIELD_DECL,      T_UNIT_DECL,
499
   T_HIER,           T_SPEC,           T_BINDING,         T_USE,
500
   T_PROT_BODY,      T_BLOCK_CONFIG,   T_IMPLICIT_SIGNAL, T_DISCONNECT,
501
   T_GROUP_TEMPLATE, T_GROUP,          T_SUBTYPE_DECL,    T_PACKAGE,
502
   T_PACK_BODY,      T_PACK_INST,      T_GENERIC_DECL,    T_PARAM_DECL,
503
   T_PROC_INST,      T_FUNC_INST,      T_PSL_DECL,        T_VIEW_DECL,
504
   T_PROT_DECL,      T_VERILOG,
505
};
506

507
static void tree_assert_kind(tree_t t, const tree_kind_t *list, size_t len,
478,996✔
508
                             const char *what)
509
{
510
   for (size_t i = 0; i < len; i++) {
5,315,357✔
511
      if (t->object.kind == list[i])
5,315,357✔
512
         return;
478,996✔
513
   }
514

515
   fatal_trace("tree kind %s is not %s", tree_kind_str(t->object.kind), what);
516
}
517
#else
518
#define tree_assert_kind(t, list, len, what)
519
#endif
520

521
static inline void tree_assert_expr(tree_t t)
220,692✔
522
{
523
   tree_assert_kind(t, expr_kinds, ARRAY_LEN(expr_kinds), "an expression");
220,692✔
524
}
220,692✔
525

526
static inline void tree_assert_decl(tree_t t)
258,304✔
527
{
528
   tree_assert_kind(t, decl_kinds, ARRAY_LEN(decl_kinds), "a declaration");
258,304✔
529
}
258,304✔
530

531
static inline tree_t tree_array_nth(item_t *item, unsigned n)
33,290,200✔
532
{
533
   object_t *o = obj_array_nth(item->obj_array, n);
33,290,200✔
534
   return container_of(o, struct _tree, object);
33,290,200✔
535
}
536

537
static inline void tree_array_add(item_t *item, tree_t t)
1,199,389✔
538
{
539
   obj_array_add(&(item->obj_array), &(t->object));
1,199,389✔
540
}
1,199,389✔
541

542
static inline void tree_copy_array(tree_t t, tree_t from, imask_t mask)
29,307✔
543
{
544
   item_t *dst = lookup_item(&tree_object, t, mask);
29,307✔
545
   const item_t *src = lookup_item(&tree_object, from, mask);
29,307✔
546
   if (src->obj_array == NULL)
29,307✔
547
      return;
548

549
   obj_array_copy(&(dst->obj_array), src->obj_array);
11,764✔
550

551
   for (int i = 0; i < src->obj_array->count; i++)
54,793✔
552
      object_write_barrier(&(t->object), src->obj_array->items[i]);
43,029✔
553
}
554

555
tree_t tree_new(tree_kind_t kind)
1,870,089✔
556
{
557
   object_t *o = object_new(NULL, &tree_object, kind);
1,870,089✔
558
   return container_of(o, struct _tree, object);
1,870,089✔
559
}
560

561
const loc_t *tree_loc(tree_t t)
2,451,254✔
562
{
563
   assert(t != NULL);
2,451,254✔
564
   return &t->object.loc;
2,451,254✔
565
}
566

567
void tree_set_loc(tree_t t, const loc_t *loc)
1,921,293✔
568
{
569
   assert(t != NULL);
1,921,293✔
570
   assert(loc != NULL);
1,921,293✔
571

572
   t->object.loc = *loc;
1,921,293✔
573
}
1,921,293✔
574

575
ident_t tree_ident(tree_t t)
30,462,642✔
576
{
577
   item_t *item = lookup_item(&tree_object, t, I_IDENT);
30,462,642✔
578
   assert(item->ident != NULL);
30,462,642✔
579
   return item->ident;
30,462,642✔
580
}
581

582
bool tree_has_ident(tree_t t)
11,354✔
583
{
584
   return lookup_item(&tree_object, t, I_IDENT)->ident != NULL;
11,354✔
585
}
586

587
void tree_set_ident(tree_t t, ident_t i)
1,274,211✔
588
{
589
   lookup_item(&tree_object, t, I_IDENT)->ident = i;
1,274,211✔
590
}
1,274,211✔
591

592
ident_t tree_ident2(tree_t t)
766,612✔
593
{
594
   item_t *item = lookup_item(&tree_object, t, I_IDENT2);
766,612✔
595
   assert(item->ident != NULL);
766,612✔
596
   return item->ident;
766,612✔
597
}
598

599
void tree_set_ident2(tree_t t, ident_t i)
136,062✔
600
{
601
   lookup_item(&tree_object, t, I_IDENT2)->ident = i;
136,062✔
602
}
136,062✔
603

604
bool tree_has_ident2(tree_t t)
78,975✔
605
{
606
   return lookup_item(&tree_object, t, I_IDENT2)->ident != NULL;
78,975✔
607
}
608

609
tree_kind_t tree_kind(tree_t t)
129,159,134✔
610
{
611
   assert(t != NULL);
129,159,134✔
612
   return t->object.kind;
129,159,134✔
613
}
614

615
void tree_change_kind(tree_t t, tree_kind_t kind)
23,252✔
616
{
617
   object_change_kind(&tree_object, &(t->object), kind);
23,252✔
618
}
23,252✔
619

620
unsigned tree_ports(tree_t t)
4,138,726✔
621
{
622
   item_t *item = lookup_item(&tree_object, t, I_PORTS);
4,138,726✔
623
   return obj_array_count(item->obj_array);
4,138,726✔
624
}
625

626
tree_t tree_port(tree_t t, unsigned n)
5,807,847✔
627
{
628
   item_t *item = lookup_item(&tree_object, t, I_PORTS);
5,807,847✔
629
   return tree_array_nth(item, n);
5,807,847✔
630
}
631

632
void tree_add_port(tree_t t, tree_t d)
120,136✔
633
{
634
   tree_assert_decl(d);
120,136✔
635
   tree_array_add(lookup_item(&tree_object, t, I_PORTS), d);
120,136✔
636
   object_write_barrier(&(t->object), &(d->object));
120,136✔
637
}
120,136✔
638

639
void tree_copy_ports(tree_t t, tree_t from)
5,606✔
640
{
641
   tree_copy_array(t, from, I_PORTS);
5,606✔
642
}
5,606✔
643

644
unsigned tree_subkind(tree_t t)
31,809,269✔
645
{
646
   item_t *item = lookup_item(&tree_object, t, I_SUBKIND);
31,809,269✔
647
   return item->ival;
31,809,269✔
648
}
649

650
void tree_set_subkind(tree_t t, unsigned sub)
746,126✔
651
{
652
   lookup_item(&tree_object, t, I_SUBKIND)->ival = sub;
746,126✔
653
}
746,126✔
654

655
unsigned tree_generics(tree_t t)
227,692✔
656
{
657
   item_t *item = lookup_item(&tree_object, t, I_GENERICS);
227,692✔
658
   return obj_array_count(item->obj_array);
227,692✔
659
}
660

661
tree_t tree_generic(tree_t t, unsigned n)
57,650✔
662
{
663
   item_t *item = lookup_item(&tree_object, t, I_GENERICS);
57,650✔
664
   return tree_array_nth(item, n);
57,650✔
665
}
666

667
void tree_add_generic(tree_t t, tree_t d)
11,073✔
668
{
669
   assert(d->object.kind == T_GENERIC_DECL);
11,073✔
670
   tree_array_add(lookup_item(&tree_object, t, I_GENERICS), d);
11,073✔
671
   object_write_barrier(&(t->object), &(d->object));
11,073✔
672
}
11,073✔
673

674
void tree_copy_generics(tree_t t, tree_t from)
419✔
675
{
676
   tree_copy_array(t, from, I_GENERICS);
419✔
677
}
419✔
678

679
type_t tree_type(tree_t t)
35,125,987✔
680
{
681
   item_t *item = lookup_item(&tree_object, t, I_TYPE);
35,125,987✔
682
   assert(item->object != NULL);
35,125,987✔
683
   return container_of(item->object, struct _type, object);
35,125,987✔
684
}
685

686
void tree_set_type(tree_t t, type_t ty)
1,290,869✔
687
{
688
   object_t *obj = ty ? &(ty->object) : NULL;
1,290,869✔
689
   lookup_item(&tree_object, t, I_TYPE)->object = obj;
1,290,869✔
690
   object_write_barrier(&(t->object), obj);
1,290,869✔
691
}
1,290,869✔
692

693
bool tree_has_type(tree_t t)
5,199,814✔
694
{
695
   return lookup_item(&tree_object, t, I_TYPE)->object != NULL;
5,199,814✔
696
}
697

698
unsigned tree_params(tree_t t)
14,769,245✔
699
{
700
   item_t *item = lookup_item(&tree_object, t, I_PARAMS);
14,769,245✔
701
   return obj_array_count(item->obj_array);
14,769,245✔
702
}
703

704
tree_t tree_param(tree_t t, unsigned n)
15,058,381✔
705
{
706
   item_t *item = lookup_item(&tree_object, t, I_PARAMS);
15,058,381✔
707
   return tree_array_nth(item, n);
15,058,381✔
708
}
709

710
void tree_add_param(tree_t t, tree_t e)
232,756✔
711
{
712
   assert(e->object.kind == T_PARAM);
232,756✔
713
   tree_array_add(lookup_item(&tree_object, t, I_PARAMS), e);
232,756✔
714
   object_write_barrier(&(t->object), &(e->object));
232,756✔
715
}
232,756✔
716

717
void tree_copy_params(tree_t t, tree_t from)
337✔
718
{
719
   tree_copy_array(t, from, I_PARAMS);
337✔
720
}
337✔
721

722
unsigned tree_genmaps(tree_t t)
59,213✔
723
{
724
   item_t *item = lookup_item(&tree_object, t, I_GENMAPS);
59,213✔
725
   return obj_array_count(item->obj_array);
59,213✔
726
}
727

728
tree_t tree_genmap(tree_t t, unsigned n)
47,893✔
729
{
730
   item_t *item = lookup_item(&tree_object, t, I_GENMAPS);
47,893✔
731
   return tree_array_nth(item, n);
47,893✔
732
}
733

734
void tree_add_genmap(tree_t t, tree_t e)
12,490✔
735
{
736
   tree_array_add(lookup_item(&tree_object, t, I_GENMAPS), e);
12,490✔
737
}
12,490✔
738

739
void tree_trim_genmaps(tree_t t, unsigned n)
5✔
740
{
741
   item_t *item = lookup_item(&tree_object, t, I_GENMAPS);
5✔
742
   assert(n < obj_array_count(item->obj_array));
5✔
743
   assert(n > 0);
5✔
744
   item->obj_array->count = n;
5✔
745
}
5✔
746

747
int64_t tree_ival(tree_t t)
3,015,966✔
748
{
749
   return lookup_item(&tree_object, t, I_IVAL)->ival;
3,015,966✔
750
}
751

752
void tree_set_ival(tree_t t, int64_t i)
124,116✔
753
{
754
   lookup_item(&tree_object, t, I_IVAL)->ival = i;
124,116✔
755
}
124,116✔
756

757
double tree_dval(tree_t t)
271,153✔
758
{
759
   return lookup_item(&tree_object, t, I_DVAL)->dval;
271,153✔
760
}
761

762
void tree_set_dval(tree_t t, double d)
23,694✔
763
{
764
   lookup_item(&tree_object, t, I_DVAL)->dval = d;
23,694✔
765
}
23,694✔
766

767
tree_flags_t tree_flags(tree_t t)
18,157,856✔
768
{
769
   return lookup_item(&tree_object, t, I_FLAGS)->ival;
18,157,856✔
770
}
771

772
void tree_set_flag(tree_t t, tree_flags_t mask)
168,457✔
773
{
774
   lookup_item(&tree_object, t, I_FLAGS)->ival |= mask;
168,457✔
775
}
168,457✔
776

777
void tree_clear_flag(tree_t t, tree_flags_t mask)
673✔
778
{
779
   lookup_item(&tree_object, t, I_FLAGS)->ival &= ~mask;
673✔
780
}
673✔
781

782
tree_t tree_primary(tree_t t)
65,529✔
783
{
784
   item_t *item = lookup_item(&tree_object, t, I_PRIMARY);
65,529✔
785
   assert(item->object != NULL);
65,529✔
786
   return container_of(item->object, struct _tree, object);
65,529✔
787
}
788

789
bool tree_has_primary(tree_t t)
6,244✔
790
{
791
   return lookup_item(&tree_object, t, I_PRIMARY)->object != NULL;
6,244✔
792
}
793

794
void tree_set_primary(tree_t t, tree_t unit)
6,445✔
795
{
796
   lookup_item(&tree_object, t, I_PRIMARY)->object = &(unit->object);
6,445✔
797
   object_write_barrier(&(t->object), &(unit->object));
6,445✔
798
}
6,445✔
799

800
psl_node_t tree_psl(tree_t t)
1,432✔
801
{
802
   item_t *item = lookup_item(&tree_object, t, I_FOREIGN);
1,432✔
803
   assert(item->object != NULL);
1,432✔
804
   return container_of(item->object, struct _psl_node, object);
1,432✔
805
}
806

807
void tree_set_psl(tree_t t, psl_node_t p)
583✔
808
{
809
   assert(p != NULL);
583✔
810
   lookup_item(&tree_object, t, I_FOREIGN)->object = &(p->object);
583✔
811
   object_write_barrier(&(t->object), &(p->object));
583✔
812
}
583✔
813

UNCOV
814
bool tree_has_psl(tree_t t)
×
815
{
816
   return lookup_item(&tree_object, t, I_FOREIGN)->object != NULL;
×
817
}
818

819
vlog_node_t tree_vlog(tree_t t)
2,627✔
820
{
821
   item_t *item = lookup_item(&tree_object, t, I_FOREIGN);
2,627✔
822
   assert(item->object != NULL);
2,627✔
823
   return container_of(item->object, struct _vlog_node, object);
2,627✔
824
}
825

826
void tree_set_vlog(tree_t t, vlog_node_t v)
2,961✔
827
{
828
   assert(v != NULL);
2,961✔
829
   lookup_item(&tree_object, t, I_FOREIGN)->object = &(v->object);
2,961✔
830
   object_write_barrier(&(t->object), &(v->object));
2,961✔
831
}
2,961✔
832

833
unsigned tree_chars(tree_t t)
135,639✔
834
{
835
   item_t *item = lookup_item(&tree_object, t, I_CHARS);
135,639✔
836
   return obj_array_count(item->obj_array);
135,639✔
837
}
838

839
tree_t tree_char(tree_t t, unsigned n)
1,034,657✔
840
{
841
   item_t *item = lookup_item(&tree_object, t, I_CHARS);
1,034,657✔
842
   return tree_array_nth(item, n);
1,034,657✔
843
}
844

845
void tree_add_char(tree_t t, tree_t ref)
369,003✔
846
{
847
   tree_array_add(lookup_item(&tree_object, t, I_CHARS), ref);
369,003✔
848
   object_write_barrier(&(t->object), &(ref->object));
369,003✔
849
}
369,003✔
850

851
unsigned tree_parts(tree_t t)
859✔
852
{
853
   item_t *item = lookup_item(&tree_object, t, I_PARTS);
859✔
854
   return obj_array_count(item->obj_array);
859✔
855
}
856

857
tree_t tree_part(tree_t t, unsigned n)
2,272✔
858
{
859
   item_t *item = lookup_item(&tree_object, t, I_PARTS);
2,272✔
860
   return tree_array_nth(item, n);
2,272✔
861
}
862

863
void tree_add_part(tree_t t, tree_t ref)
653✔
864
{
865
   tree_array_add(lookup_item(&tree_object, t, I_PARTS), ref);
653✔
866
   object_write_barrier(&(t->object), &(ref->object));
653✔
867
}
653✔
868

869
bool tree_has_value(tree_t t)
3,283,374✔
870
{
871
   return lookup_item(&tree_object, t, I_VALUE)->object != NULL;
3,283,374✔
872
}
873

874
tree_t tree_value(tree_t t)
17,300,241✔
875
{
876
   item_t *item = lookup_item(&tree_object, t, I_VALUE);
17,300,241✔
877
   assert(item->object != NULL);
17,300,241✔
878
   return container_of(item->object, struct _tree, object);
17,300,241✔
879
}
880

881
void tree_set_value(tree_t t, tree_t v)
706,223✔
882
{
883
   object_t *obj = v ? &(v->object) : NULL;
706,223✔
884
   lookup_item(&tree_object, t, I_VALUE)->object = obj;
706,223✔
885
   object_write_barrier(&(t->object), obj);
706,223✔
886
}
706,223✔
887

888
bool tree_has_result(tree_t t)
380✔
889
{
890
   return lookup_item(&tree_object, t, I_RESULT)->object != NULL;
380✔
891
}
892

893
tree_t tree_result(tree_t t)
374✔
894
{
895
   item_t *item = lookup_item(&tree_object, t, I_RESULT);
374✔
896
   assert(item->object != NULL);
374✔
897
   return container_of(item->object, struct _tree, object);
374✔
898
}
899

900
void tree_set_result(tree_t t, tree_t v)
224✔
901
{
902
   object_t *obj = v ? &(v->object) : NULL;
224✔
903
   lookup_item(&tree_object, t, I_RESULT)->object = obj;
224✔
904
   object_write_barrier(&(t->object), obj);
224✔
905
}
224✔
906

907
unsigned tree_decls(tree_t t)
142,135✔
908
{
909
   item_t *item = lookup_item(&tree_object, t, I_DECLS);
142,135✔
910
   return obj_array_count(item->obj_array);
142,135✔
911
}
912

913
tree_t tree_decl(tree_t t, unsigned n)
8,019,021✔
914
{
915
   item_t *item = lookup_item(&tree_object, t, I_DECLS);
8,019,021✔
916
   return tree_array_nth(item, n);
8,019,021✔
917
}
918

919
void tree_add_decl(tree_t t, tree_t d)
138,168✔
920
{
921
   tree_assert_decl(d);
138,168✔
922
   tree_array_add(lookup_item(&tree_object, t, I_DECLS), d);
138,168✔
923
   object_write_barrier(&(t->object), &(d->object));
138,168✔
924
}
138,168✔
925

926
void tree_copy_decls(tree_t t, tree_t from)
11,425✔
927
{
928
   tree_copy_array(t, from, I_DECLS);
11,425✔
929
}
11,425✔
930

931
unsigned tree_stmts(tree_t t)
135,542✔
932
{
933
   item_t *item = lookup_item(&tree_object, t, I_STMTS);
135,542✔
934
   return obj_array_count(item->obj_array);
135,542✔
935
}
936

937
tree_t tree_stmt(tree_t t, unsigned n)
204,564✔
938
{
939
   item_t *item = lookup_item(&tree_object, t, I_STMTS);
204,564✔
940
   return tree_array_nth(item, n);
204,564✔
941
}
942

943
void tree_add_stmt(tree_t t, tree_t s)
138,363✔
944
{
945
   assert(s != NULL);
138,363✔
946
   tree_array_add(lookup_item(&tree_object, t, I_STMTS), s);
138,363✔
947
   object_write_barrier(&(t->object), &(s->object));
138,363✔
948
}
138,363✔
949

950
void tree_copy_stmts(tree_t t, tree_t from)
11,520✔
951
{
952
   tree_copy_array(t, from, I_STMTS);
11,520✔
953
}
11,520✔
954

955
unsigned tree_waveforms(tree_t t)
37,000✔
956
{
957
   item_t *item = lookup_item(&tree_object, t, I_WAVES);
37,000✔
958
   return obj_array_count(item->obj_array);
37,000✔
959
}
960

961
tree_t tree_waveform(tree_t t, unsigned n)
37,795✔
962
{
963
   item_t *item = lookup_item(&tree_object, t, I_WAVES);
37,795✔
964
   return tree_array_nth(item, n);
37,795✔
965
}
966

967
void tree_add_waveform(tree_t t, tree_t w)
8,285✔
968
{
969
   assert(w->object.kind == T_WAVEFORM);
8,285✔
970
   tree_array_add(lookup_item(&tree_object, t, I_WAVES), w);
8,285✔
971
   object_write_barrier(&(t->object), &(w->object));
8,285✔
972
}
8,285✔
973

974
unsigned tree_conds(tree_t t)
37,984✔
975
{
976
   item_t *item = lookup_item(&tree_object, t, I_CONDS);
37,984✔
977
   return obj_array_count(item->obj_array);
37,984✔
978
}
979

980
tree_t tree_cond(tree_t t, unsigned n)
53,132✔
981
{
982
   item_t *item = lookup_item(&tree_object, t, I_CONDS);
53,132✔
983
   return tree_array_nth(item, n);
53,132✔
984
}
985

986
void tree_add_cond(tree_t t, tree_t c)
16,107✔
987
{
988
   assert(c->object.kind == T_COND_STMT || c->object.kind == T_COND_EXPR);
16,107✔
989
   tree_array_add(lookup_item(&tree_object, t, I_CONDS), c);
16,107✔
990
   object_write_barrier(&(t->object), &(c->object));
16,107✔
991
}
16,107✔
992

993
bool tree_has_delay(tree_t t)
72,658✔
994
{
995
   return lookup_item(&tree_object, t, I_DELAY)->object != NULL;
72,658✔
996
}
997

998
tree_t tree_delay(tree_t t)
19,832✔
999
{
1000
   item_t *item = lookup_item(&tree_object, t, I_DELAY);
19,832✔
1001
   assert(item->object != NULL);
19,832✔
1002
   return container_of(item->object, struct _tree, object);
19,832✔
1003
}
1004

1005
void tree_set_delay(tree_t t, tree_t d)
6,482✔
1006
{
1007
   tree_assert_expr(d);
6,482✔
1008
   lookup_item(&tree_object, t, I_DELAY)->object = &(d->object);
6,482✔
1009
   object_write_barrier(&(t->object), &(d->object));
6,482✔
1010
}
6,482✔
1011

1012
unsigned tree_triggers(tree_t t)
58,657✔
1013
{
1014
   item_t *item = lookup_item(&tree_object, t, I_TRIGGERS);
58,657✔
1015
   return obj_array_count(item->obj_array);
58,657✔
1016
}
1017

1018
tree_t tree_trigger(tree_t t, unsigned n)
8,314✔
1019
{
1020
   item_t *item = lookup_item(&tree_object, t, I_TRIGGERS);
8,314✔
1021
   return tree_array_nth(item, n);
8,314✔
1022
}
1023

1024
void tree_add_trigger(tree_t t, tree_t s)
4,419✔
1025
{
1026
   tree_assert_expr(s);
4,419✔
1027
   tree_array_add(lookup_item(&tree_object, t, I_TRIGGERS), s);
4,419✔
1028
   object_write_barrier(&(t->object), &(s->object));
4,419✔
1029
}
4,419✔
1030

1031
tree_t tree_target(tree_t t)
106,616✔
1032
{
1033
   item_t *item = lookup_item(&tree_object, t, I_TARGET);
106,616✔
1034
   assert(item->object != NULL);
106,616✔
1035
   return container_of(item->object, struct _tree, object);
106,616✔
1036
}
1037

1038
void tree_set_target(tree_t t, tree_t lhs)
29,497✔
1039
{
1040
   lookup_item(&tree_object, t, I_TARGET)->object = &(lhs->object);
29,497✔
1041
   object_write_barrier(&(t->object), &(lhs->object));
29,497✔
1042
}
29,497✔
1043

1044
tree_t tree_ref(tree_t t)
19,863,753✔
1045
{
1046
   item_t *item = lookup_item(&tree_object, t, I_REF);
19,863,753✔
1047
   assert(item->object != NULL);
19,863,753✔
1048
   return container_of(item->object, struct _tree, object);
19,863,753✔
1049
}
1050

1051
bool tree_has_ref(tree_t t)
15,880,377✔
1052
{
1053
   return lookup_item(&tree_object, t, I_REF)->object != NULL;
15,880,377✔
1054
}
1055

1056
void tree_set_ref(tree_t t, tree_t decl)
1,162,994✔
1057
{
1058
   object_t *obj = decl ? &(decl->object) : NULL;
1,162,994✔
1059
   lookup_item(&tree_object, t, I_REF)->object = obj;
1,162,994✔
1060
   object_write_barrier(&(t->object), obj);
1,162,994✔
1061
}
1,162,994✔
1062

1063
tree_t tree_spec(tree_t t)
2,717✔
1064
{
1065
   item_t *item = lookup_item(&tree_object, t, I_SPEC);
2,717✔
1066
   assert(item->object != NULL);
2,717✔
1067
   return container_of(item->object, struct _tree, object);
2,717✔
1068
}
1069

1070
bool tree_has_spec(tree_t t)
16,809✔
1071
{
1072
   return lookup_item(&tree_object, t, I_SPEC)->object != NULL;
16,809✔
1073
}
1074

1075
void tree_set_spec(tree_t t, tree_t s)
327✔
1076
{
1077
   assert(s != NULL);
327✔
1078
   lookup_item(&tree_object, t, I_SPEC)->object = &(s->object);
327✔
1079
   object_write_barrier(&(t->object), &(s->object));
327✔
1080
}
327✔
1081

1082
unsigned tree_contexts(tree_t t)
29,776✔
1083
{
1084
   item_t *item = lookup_item(&tree_object, t, I_CONTEXT);
29,776✔
1085
   return obj_array_count(item->obj_array);
29,776✔
1086
}
1087

1088
tree_t tree_context(tree_t t, unsigned n)
99,567✔
1089
{
1090
   item_t *item = lookup_item(&tree_object, t, I_CONTEXT);
99,567✔
1091
   return tree_array_nth(item, n);
99,567✔
1092
}
1093

1094
void tree_add_context(tree_t t, tree_t ctx)
43,728✔
1095
{
1096
   assert(ctx->object.kind == T_USE || ctx->object.kind == T_LIBRARY
43,728✔
1097
          || ctx->object.kind == T_CONTEXT_REF);
1098
   tree_array_add(lookup_item(&tree_object, t, I_CONTEXT), ctx);
43,728✔
1099
   object_write_barrier(&(t->object), &(ctx->object));
43,728✔
1100
}
43,728✔
1101

1102
unsigned tree_pragmas(tree_t t)
410✔
1103
{
1104
   item_t *item = lookup_item(&tree_object, t, I_PRAGMAS);
410✔
1105
   return obj_array_count(item->obj_array);
410✔
1106
}
1107

1108
tree_t tree_pragma(tree_t t, unsigned n)
51✔
1109
{
1110
   item_t *item = lookup_item(&tree_object, t, I_PRAGMAS);
51✔
1111
   return tree_array_nth(item, n);
51✔
1112
}
1113

1114
void tree_add_pragma(tree_t t, tree_t p)
59✔
1115
{
1116
   assert(p->object.kind == T_PRAGMA);
59✔
1117
   tree_array_add(lookup_item(&tree_object, t, I_PRAGMAS), p);
59✔
1118
   object_write_barrier(&(t->object), &(p->object));
59✔
1119
}
59✔
1120

1121
unsigned tree_assocs(tree_t t)
203,531✔
1122
{
1123
   item_t *item = lookup_item(&tree_object, t, I_ASSOCS);
203,531✔
1124
   return obj_array_count(item->obj_array);
203,531✔
1125
}
1126

1127
tree_t tree_assoc(tree_t t, unsigned n)
1,113,973✔
1128
{
1129
   item_t *item = lookup_item(&tree_object, t, I_ASSOCS);
1,113,973✔
1130
   return tree_array_nth(item, n);
1,113,973✔
1131
}
1132

1133
void tree_add_assoc(tree_t t, tree_t a)
48,612✔
1134
{
1135
   assert(a->object.kind == T_ASSOC);
48,612✔
1136
   tree_array_add(lookup_item(&tree_object, t, I_ASSOCS), a);
48,612✔
1137
   object_write_barrier(&(t->object), &(a->object));
48,612✔
1138
}
48,612✔
1139

1140
unsigned tree_choices(tree_t t)
12,461✔
1141
{
1142
   item_t *item = lookup_item(&tree_object, t, I_CHOICES);
12,461✔
1143
   return obj_array_count(item->obj_array);
12,461✔
1144
}
1145

1146
tree_t tree_choice(tree_t t, unsigned n)
13,370✔
1147
{
1148
   item_t *item = lookup_item(&tree_object, t, I_CHOICES);
13,370✔
1149
   return tree_array_nth(item, n);
13,370✔
1150
}
1151

1152
void tree_add_choice(tree_t t, tree_t c)
3,990✔
1153
{
1154
   assert(c->object.kind == T_CHOICE);
3,990✔
1155
   tree_array_add(lookup_item(&tree_object, t, I_CHOICES), c);
3,990✔
1156
   object_write_barrier(&(t->object), &(c->object));
3,990✔
1157
}
3,990✔
1158

1159
tree_t tree_severity(tree_t t)
9,514✔
1160
{
1161
   item_t *item = lookup_item(&tree_object, t, I_SEVERITY);
9,514✔
1162
   assert(item->object != NULL);
9,514✔
1163
   return container_of(item->object, struct _tree, object);
9,514✔
1164
}
1165

1166
void tree_set_severity(tree_t t, tree_t s)
6,192✔
1167
{
1168
   tree_assert_expr(s);
6,192✔
1169
   lookup_item(&tree_object, t, I_SEVERITY)->object = &(s->object);
6,192✔
1170
   object_write_barrier(&(t->object), &(s->object));
6,192✔
1171
}
6,192✔
1172

1173
bool tree_has_severity(tree_t t)
36,314✔
1174
{
1175
   return lookup_item(&tree_object, t, I_SEVERITY)->object != NULL;
36,314✔
1176
}
1177

1178
tree_t tree_message(tree_t t)
14,067✔
1179
{
1180
   item_t *item = lookup_item(&tree_object, t, I_MESSAGE);
14,067✔
1181
   assert(item->object != NULL);
14,067✔
1182
   return container_of(item->object, struct _tree, object);
14,067✔
1183
}
1184

1185
bool tree_has_message(tree_t t)
49,028✔
1186
{
1187
   return lookup_item(&tree_object, t, I_MESSAGE)->object != NULL;
49,028✔
1188
}
1189

1190
void tree_set_message(tree_t t, tree_t m)
8,384✔
1191
{
1192
   tree_assert_expr(m);
8,384✔
1193
   lookup_item(&tree_object, t, I_MESSAGE)->object = &(m->object);
8,384✔
1194
   object_write_barrier(&(t->object), &(m->object));
8,384✔
1195
}
8,384✔
1196

1197
void tree_add_range(tree_t t, tree_t r)
51,547✔
1198
{
1199
   tree_array_add(lookup_item(&tree_object, t, I_RANGES), r);
51,547✔
1200
   object_write_barrier(&(t->object), &(r->object));
51,547✔
1201
}
51,547✔
1202

1203
tree_t tree_range(tree_t t, unsigned n)
1,731,713✔
1204
{
1205
   item_t *item = lookup_item(&tree_object, t, I_RANGES);
1,731,713✔
1206
   return tree_array_nth(item, n);
1,731,713✔
1207
}
1208

1209
unsigned tree_ranges(tree_t t)
1,679,685✔
1210
{
1211
   item_t *item = lookup_item(&tree_object, t, I_RANGES);
1,679,685✔
1212
   return obj_array_count(item->obj_array);
1,679,685✔
1213
}
1214

1215
unsigned tree_pos(tree_t t)
3,852,548✔
1216
{
1217
   return lookup_item(&tree_object, t, I_POS)->ival;
3,852,548✔
1218
}
1219

1220
void tree_set_pos(tree_t t, unsigned pos)
270,784✔
1221
{
1222
   lookup_item(&tree_object, t, I_POS)->ival = pos;
270,784✔
1223
}
270,784✔
1224

1225
tree_t tree_left(tree_t t)
2,610,299✔
1226
{
1227
   item_t *item = lookup_item(&tree_object, t, I_LEFT);
2,610,299✔
1228
   assert(item->object != NULL);
2,610,299✔
1229
   return container_of(item->object, struct _tree, object);
2,610,299✔
1230
}
1231

1232
void tree_set_left(tree_t t, tree_t left)
58,430✔
1233
{
1234
   tree_assert_expr(left);
58,430✔
1235
   lookup_item(&tree_object, t, I_LEFT)->object = &(left->object);
58,430✔
1236
   object_write_barrier(&(t->object), &(left->object));
58,430✔
1237
}
58,430✔
1238

1239
tree_t tree_right(tree_t t)
2,138,610✔
1240
{
1241
   item_t *item = lookup_item(&tree_object, t, I_RIGHT);
2,138,610✔
1242
   assert(item->object != NULL);
2,138,610✔
1243
   return container_of(item->object, struct _tree, object);
2,138,610✔
1244
}
1245

1246
void tree_set_right(tree_t t, tree_t right)
58,428✔
1247
{
1248
   tree_assert_expr(right);
58,428✔
1249
   lookup_item(&tree_object, t, I_RIGHT)->object = &(right->object);
58,428✔
1250
   object_write_barrier(&(t->object), &(right->object));
58,428✔
1251
}
58,428✔
1252

1253
class_t tree_class(tree_t t)
933,800✔
1254
{
1255
   return lookup_item(&tree_object, t, I_CLASS)->ival;
933,800✔
1256
}
1257

1258
void tree_set_class(tree_t t, class_t c)
123,612✔
1259
{
1260
   lookup_item(&tree_object, t, I_CLASS)->ival = c;
123,612✔
1261
}
123,612✔
1262

1263
tree_t tree_reject(tree_t t)
2,213✔
1264
{
1265
   item_t *item = lookup_item(&tree_object, t, I_REJECT);
2,213✔
1266
   assert(item->object != NULL);
2,213✔
1267
   return container_of(item->object, struct _tree, object);
2,213✔
1268
}
1269

1270
void tree_set_reject(tree_t t, tree_t r)
713✔
1271
{
1272
   tree_assert_expr(r);
713✔
1273
   lookup_item(&tree_object, t, I_REJECT)->object = &(r->object);
713✔
1274
   object_write_barrier(&(t->object), &(r->object));
713✔
1275
}
713✔
1276

1277
bool tree_has_reject(tree_t t)
25,431✔
1278
{
1279
   return lookup_item(&tree_object, t, I_REJECT)->object != NULL;
25,431✔
1280
}
1281

1282
tree_t tree_guard(tree_t t)
29✔
1283
{
1284
   item_t *item = lookup_item(&tree_object, t, I_GUARD);
29✔
1285
   assert(item->object != NULL);
29✔
1286
   return container_of(item->object, struct _tree, object);
29✔
1287
}
1288

1289
void tree_set_guard(tree_t t, tree_t g)
22✔
1290
{
1291
   assert(g->object.kind == T_GUARD);
22✔
1292
   lookup_item(&tree_object, t, I_GUARD)->object = &(g->object);
22✔
1293
   object_write_barrier(&(t->object), &(g->object));
22✔
1294
}
22✔
1295

1296
bool tree_has_guard(tree_t t)
4,535✔
1297
{
1298
   return lookup_item(&tree_object, t, I_GUARD)->object != NULL;
4,535✔
1299
}
1300

1301
tree_t tree_name(tree_t t)
522,639✔
1302
{
1303
   item_t *item = lookup_item(&tree_object, t, I_NAME);
522,639✔
1304
   assert(item->object != NULL);
522,639✔
1305
   return container_of(item->object, struct _tree, object);
522,639✔
1306
}
1307

1308
void tree_set_name(tree_t t, tree_t n)
77,644✔
1309
{
1310
   tree_assert_expr(n);
77,644✔
1311
   lookup_item(&tree_object, t, I_NAME)->object = &(n->object);
77,644✔
1312
   object_write_barrier(&(t->object), &(n->object));
77,644✔
1313
}
77,644✔
1314

1315
bool tree_has_name(tree_t t)
17,997✔
1316
{
1317
   return lookup_item(&tree_object, t, I_NAME)->object != NULL;
17,997✔
1318
}
1319

1320
tree_t tree_file_mode(tree_t t)
1,131✔
1321
{
1322
   item_t *item = lookup_item(&tree_object, t, I_FILE_MODE);
1,131✔
1323
   return container_of(item->object, struct _tree, object);
1,131✔
1324
}
1325

1326
void tree_set_file_mode(tree_t t, tree_t m)
53✔
1327
{
1328
   lookup_item(&tree_object, t, I_FILE_MODE)->object = &(m->object);
53✔
1329
   object_write_barrier(&(t->object), &(m->object));
53✔
1330
}
53✔
1331

1332
unsigned tree_visit(tree_t t, tree_visit_fn_t fn, void *context)
8,201✔
1333
{
1334
   return tree_visit_only(t, fn, context, T_LAST_TREE_KIND);
8,201✔
1335
}
1336

1337
unsigned tree_visit_only(tree_t t, tree_visit_fn_t fn,
9,397✔
1338
                         void *context, tree_kind_t kind)
1339
{
1340
   assert(t != NULL);
9,397✔
1341

1342
   object_visit_ctx_t ctx = {
9,397✔
1343
      .count      = 0,
1344
      .postorder  = (object_visit_fn_t)fn,
1345
      .preorder   = NULL,
1346
      .context    = context,
1347
      .kind       = kind,
1348
      .tag        = OBJECT_TAG_TREE,
1349
      .generation = object_next_generation(),
9,397✔
1350
      .deep       = false
1351
   };
1352

1353
   object_visit(&(t->object), &ctx);
9,397✔
1354

1355
   return ctx.count;
9,397✔
1356
}
1357

1358
tree_t tree_rewrite(tree_t t, tree_rewrite_pre_fn_t pre_fn,
29,970✔
1359
                    tree_rewrite_post_fn_t tree_post_fn,
1360
                    type_rewrite_post_fn_t type_post_fn,
1361
                    void *context)
1362
{
1363
   object_arena_t *arena = object_arena(&(t->object));
29,970✔
1364
   if (arena_frozen(arena))
29,970✔
1365
      return t;
1366

1367
   object_rewrite_ctx_t ctx = {
29,970✔
1368
      .generation = object_next_generation(),
29,970✔
1369
      .context    = context,
1370
      .arena      = arena,
1371
   };
1372

1373
   ctx.pre_fn[OBJECT_TAG_TREE] = (object_rewrite_pre_fn_t)pre_fn;
29,970✔
1374

1375
   ctx.post_fn[OBJECT_TAG_TREE] = (object_rewrite_post_fn_t)tree_post_fn;
29,970✔
1376
   ctx.post_fn[OBJECT_TAG_TYPE] = (object_rewrite_post_fn_t)type_post_fn;
29,970✔
1377

1378
   object_t *result = object_rewrite(&(t->object), &ctx);
29,970✔
1379
   free(ctx.cache);
29,966✔
1380
   return container_of(result, struct _tree, object);
29,966✔
1381
}
1382

1383
object_copy_ctx_t *tree_copy_begin(tree_t *roots, unsigned nroots,
5,888✔
1384
                                   tree_copy_pred_t tree_pred,
1385
                                   type_copy_pred_t type_pred,
1386
                                   void *pred_context,
1387
                                   tree_copy_fn_t tree_callback,
1388
                                   type_copy_fn_t type_callback,
1389
                                   void *callback_context)
1390
{
1391
   object_copy_ctx_t *ctx = xcalloc_flex(sizeof(object_copy_ctx_t),
5,888✔
1392
                                         nroots, sizeof(object_t *));
1393

1394
   ctx->generation       = object_next_generation();
5,888✔
1395
   ctx->pred_context     = pred_context;
5,888✔
1396
   ctx->callback_context = callback_context;
5,888✔
1397
   ctx->nroots           = nroots;
5,888✔
1398

1399
   for (unsigned i = 0; i < nroots; i++)
17,662✔
1400
      ctx->roots[i] = &(roots[i]->object);
11,774✔
1401

1402
   ctx->should_copy[OBJECT_TAG_TREE] = (object_copy_pred_t)tree_pred;
5,888✔
1403
   ctx->should_copy[OBJECT_TAG_TYPE] = (object_copy_pred_t)type_pred;
5,888✔
1404

1405
   ctx->callback[OBJECT_TAG_TREE] = (object_copy_fn_t)tree_callback;
5,888✔
1406
   ctx->callback[OBJECT_TAG_TYPE] = (object_copy_fn_t)type_callback;
5,888✔
1407

1408
   object_copy_begin(ctx);
5,888✔
1409

1410
   return ctx;
5,888✔
1411
}
1412

1413
void tree_copy_finish(tree_t *roots, unsigned nroots, object_copy_ctx_t *ctx)
5,888✔
1414
{
1415
   object_copy_finish(ctx);
5,888✔
1416

1417
   for (unsigned i = 0; i < nroots; i++)
17,662✔
1418
      roots[i] = container_of(ctx->roots[i], struct _tree, object);
11,774✔
1419

1420
   free(ctx);
5,888✔
1421
}
5,888✔
1422

1423
void tree_copy_mark(tree_t t, object_copy_ctx_t *ctx)
13,386✔
1424
{
1425
   object_copy_mark_root(&(t->object), ctx);
13,386✔
1426
}
13,386✔
1427

1428
const char *tree_kind_str(tree_kind_t t)
189✔
1429
{
1430
   return kind_text_map[t];
189✔
1431
}
1432

UNCOV
1433
object_arena_t *tree_arena(tree_t t)
×
1434
{
1435
   return object_arena(&(t->object));
×
1436
}
1437

1438
bool tree_frozen(tree_t t)
61,852✔
1439
{
1440
   return arena_frozen(object_arena(&(t->object)));
61,852✔
1441
}
1442

1443
tree_t tree_container(tree_t t)
19,714✔
1444
{
1445
   object_t *o = arena_root(object_arena(&(t->object)));
19,714✔
1446
   assert(o->tag == OBJECT_TAG_TREE);
19,714✔
1447
   return container_of(o, struct _tree, object);
19,714✔
1448
}
1449

1450
static void tree_deps_cb(object_t *obj, void *ctx)
57,563✔
1451
{
1452
   tree_deps_args_t *args = ctx;
57,563✔
1453
   tree_t t = tree_from_object(obj);
57,563✔
1454
   if (t != NULL)
57,563✔
1455
      (*args->fn)(t, args->context);
57,563✔
1456
}
57,563✔
1457

1458
void tree_walk_deps(tree_t t, tree_deps_fn_t fn, void *ctx)
32,893✔
1459
{
1460
   tree_deps_args_t args = { fn, ctx };
32,893✔
1461
   arena_walk_deps(object_arena(&(t->object)), tree_deps_cb, &args);
32,893✔
1462
}
32,893✔
1463

1464
object_t *tree_to_object(tree_t t)
900,046✔
1465
{
1466
   return t ? &(t->object) : NULL;
900,046✔
1467
}
1468

1469
tree_t tree_from_object(object_t *obj)
250,610✔
1470
{
1471
   if (obj != NULL && obj->tag == OBJECT_TAG_TREE)
250,610✔
1472
      return container_of(obj, struct _tree, object);
1473
   else
1474
      return NULL;
3,570✔
1475
}
1476

1477
tree_global_flags_t tree_global_flags(tree_t t)
53,818✔
1478
{
1479
   return arena_flags(object_arena(&(t->object)));
53,818✔
1480
}
1481

1482
void tree_set_global_flags(tree_t t, tree_global_flags_t flags)
7,233✔
1483
{
1484
   arena_set_flags(object_arena(&(t->object)), flags);
7,233✔
1485
}
7,233✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc