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

nickg / nvc / 15981422681

30 Jun 2025 07:02PM UTC coverage: 92.251% (+0.01%) from 92.237%
15981422681

push

github

nickg
Fix unused function warning in debug build without capstone

70480 of 76400 relevant lines covered (92.25%)

570831.76 hits per line

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

98.19
/src/vlog/vlog-node.c
1
//
2
//  Copyright (C) 2022-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 "util.h"
19
#include "vlog/vlog-node.h"
20
#include "vlog/vlog-number.h"
21
#include "object.h"
22

23
#include <string.h>
24
#include <inttypes.h>
25
#include <stdlib.h>
26

27
static const imask_t has_map[V_LAST_NODE_KIND] = {
28
   // V_MODULE
29
   (I_IDENT | I_PORTS | I_STMTS | I_DECLS | I_IDENT2),
30

31
   // V_PORT_DECL
32
   (I_IDENT | I_SUBKIND | I_IDENT2 | I_REF | I_RANGES | I_TYPE | I_VALUE),
33

34
   // V_REF
35
   (I_IDENT | I_REF),
36

37
   // V_ALWAYS
38
   (I_IDENT | I_SUBKIND | I_STMTS),
39

40
   // V_TIMING
41
   (I_VALUE | I_STMTS),
42

43
   // V_NBASSIGN
44
   (I_TARGET | I_VALUE | I_DELAY),
45

46
   // V_EVENT
47
   (I_SUBKIND | I_VALUE),
48

49
   // V_INITIAL
50
   (I_IDENT | I_STMTS),
51

52
   // V_BLOCK
53
   (I_IDENT | I_DECLS | I_STMTS),
54

55
   // V_SYS_TCALL
56
   (I_IDENT | I_PARAMS),
57

58
   // V_STRING
59
   (I_NUMBER),
60

61
   // V_NUMBER
62
   (I_NUMBER),
63

64
   // V_NET_DECL
65
   (I_IDENT | I_SUBKIND | I_TYPE | I_RANGES | I_VALUE),
66

67
   // V_ASSIGN
68
   (I_TARGET | I_VALUE | I_IDENT | I_DELAY),
69

70
   // V_DIMENSION
71
   (I_SUBKIND | I_LEFT | I_RIGHT),
72

73
   // V_IF
74
   (I_CONDS),
75

76
   // V_COND
77
   (I_VALUE | I_STMTS),
78

79
   // V_VAR_DECL
80
   (I_IDENT | I_TYPE | I_RANGES | I_VALUE),
81

82
   // V_DELAY_CONTROL
83
   (I_VALUE),
84

85
   // V_BINARY
86
   (I_LEFT | I_RIGHT | I_SUBKIND),
87

88
   // V_BASSIGN
89
   (I_TARGET | I_VALUE | I_SUBKIND | I_DELAY),
90

91
   // V_UNARY
92
   (I_VALUE | I_SUBKIND),
93

94
   // V_GATE_INST
95
   (I_SUBKIND | I_PARAMS | I_IDENT | I_REF | I_TARGET),
96

97
   // V_STRENGTH
98
   (I_SUBKIND),
99

100
   // V_MOD_INST
101
   (I_IDENT | I_PARAMS),
102

103
   // V_BIT_SELECT
104
   (I_IDENT | I_REF | I_PARAMS),
105

106
   // V_SYS_FCALL
107
   (I_IDENT | I_PARAMS),
108

109
   // V_FOREVER
110
   (I_STMTS),
111

112
   // V_SPECIFY
113
   (I_DECLS),
114

115
   // V_PRIMITIVE
116
   (I_IDENT | I_IDENT2 | I_PORTS | I_DECLS | I_STMTS),
117

118
   // V_UDP_TABLE
119
   (I_IDENT | I_PARAMS | I_SUBKIND | I_STMTS),
120

121
   // V_UDP_ENTRY
122
   (I_PARAMS),
123

124
   // V_DATA_TYPE
125
   (I_SUBKIND | I_RANGES),
126

127
   // V_TYPE_DECL
128
   (I_IDENT | I_TYPE),
129

130
   // V_ENUM_DECL
131
   (I_IDENT | I_TYPE | I_RANGES | I_DECLS),
132

133
   // V_ENUM_NAME
134
   (I_IDENT | I_TYPE),
135

136
   // V_UNION_DECL
137
   (I_IDENT | I_DECLS),
138

139
   // V_STRUCT_DECL
140
   (I_IDENT | I_DECLS),
141

142
   // V_EVENT_CONTROL
143
   (I_PARAMS),
144

145
   // V_EMPTY
146
   (0),
147

148
   // V_REPEAT
149
   (I_VALUE | I_STMTS),
150

151
   // V_WHILE
152
   (I_VALUE | I_STMTS),
153

154
   // V_DO_WHILE
155
   (I_VALUE | I_STMTS),
156

157
   // V_TASK_DECL
158
   (I_IDENT | I_STMTS | I_DECLS | I_PORTS),
159

160
   // V_FUNC_DECL
161
   (I_IDENT | I_STMTS | I_DECLS | I_TYPE | I_PORTS),
162

163
   // V_WAIT
164
   (I_VALUE | I_STMTS),
165

166
   // V_PARAM_DECL
167
   (I_IDENT | I_VALUE | I_TYPE),
168

169
   // V_COND_EXPR
170
   (I_VALUE | I_LEFT | I_RIGHT),
171

172
   // V_REAL
173
   (I_DVAL),
174

175
   // V_CONCAT
176
   (I_PARAMS | I_VALUE),
177

178
   // V_FOR_LOOP
179
   (I_LEFT | I_VALUE | I_RIGHT | I_STMTS),
180

181
   // V_FOR_INIT
182
   (I_DECLS | I_STMTS),
183

184
   // V_FOR_STEP
185
   (I_STMTS),
186

187
   // V_PREFIX
188
   (I_TARGET | I_SUBKIND),
189

190
   // V_POSTFIX
191
   (I_TARGET | I_SUBKIND),
192

193
   // V_LOCALPARAM
194
   (I_IDENT | I_VALUE | I_TYPE),
195

196
   // V_CASE
197
   (I_SUBKIND | I_VALUE | I_STMTS),
198

199
   // V_CASE_ITEM
200
   (I_PARAMS | I_STMTS),
201

202
   // V_INST_LIST
203
   (I_PARAMS | I_STMTS | I_IDENT),
204

205
   // V_PARAM_ASSIGN
206
   (I_IDENT | I_VALUE),
207

208
   // V_INST_BODY
209
   (I_IDENT | I_IDENT2 | I_PORTS | I_STMTS | I_DECLS),
210

211
   // V_PORT_CONN
212
   (I_IDENT | I_VALUE),
213

214
   // V_PART_SELECT
215
   (I_SUBKIND | I_VALUE | I_LEFT | I_RIGHT),
216

217
   // V_IF_GENERATE
218
   (I_CONDS),
219

220
   // V_EVENT_TRIGGER
221
   (I_IDENT),
222

223
   // V_USER_FCALL
224
   (I_IDENT | I_REF | I_PARAMS),
225

226
   // V_UDP_LEVEL
227
   (I_SUBKIND | I_IVAL),
228

229
   // V_UDP_EDGE
230
   (I_SUBKIND | I_LEFT | I_RIGHT),
231

232
   // V_SPECPARAM
233
   (I_IDENT | I_VALUE),
234

235
   // V_FORK
236
   (I_IDENT | I_DECLS | I_STMTS),
237
};
238

239
static const char *kind_text_map[V_LAST_NODE_KIND] = {
240
   "V_MODULE",        "V_PORT_DECL",   "V_REF",           "V_ALWAYS",
241
   "V_TIMING",        "V_NBASSIGN",    "V_EVENT",         "V_INITIAL",
242
   "V_BLOCK",         "V_SYS_TCALL",   "V_STRING",        "V_NUMBER",
243
   "V_NET_DECL",      "V_ASSIGN",      "V_DIMENSION",     "V_IF",
244
   "V_COND",          "V_VAR_DECL",    "V_DELAY_CONTROL", "V_BINARY",
245
   "V_BASSIGN",       "V_UNARY",       "V_GATE_INST",     "V_STRENGTH",
246
   "V_MOD_INST",      "V_BIT_SELECT",  "V_SYS_FCALL",     "V_FOREVER",
247
   "V_SPECIFY",       "V_PRIMITIVE",   "V_UDP_TABLE",     "V_UDP_ENTRY",
248
   "V_DATA_TYPE",     "V_TYPE_DECL",   "V_ENUM_DECL",     "V_ENUM_NAME",
249
   "V_UNION_DECL",    "V_STRUCT_DECL", "V_EVENT_CONTROL", "V_EMPTY",
250
   "V_REPEAT",        "V_WHILE",       "V_DO_WHILE",      "V_TASK_DECL",
251
   "V_FUNC_DECL",     "V_WAIT",        "V_PARAM_DECL",    "V_COND_EXPR",
252
   "V_REAL",          "V_CONCAT",      "V_FOR_LOOP",      "V_FOR_INIT",
253
   "V_FOR_STEP",      "V_PREFIX",      "V_POSTFIX",       "V_LOCALPARAM",
254
   "V_CASE",          "V_CASE_ITEM",   "V_INST_LIST",     "V_PARAM_ASSIGN",
255
   "V_INST_BODY",     "V_PORT_CONN",   "V_PART_SELECT",   "V_IF_GENERATE",
256
   "V_EVENT_TRIGGER", "V_USER_FCALL",  "V_UDP_LEVEL",     "V_UDP_EDGE",
257
   "V_SPECPARAM",     "V_FORK",
258
};
259

260
static const change_allowed_t change_allowed[] = {
261
   { -1, -1 }
262
};
263

264
object_class_t vlog_object = {
265
   .name           = "vlog",
266
   .change_allowed = change_allowed,
267
   .has_map        = has_map,
268
   .kind_text_map  = kind_text_map,
269
   .tag            = OBJECT_TAG_VLOG,
270
   .last_kind      = V_LAST_NODE_KIND,
271
   .has_loc        = true,
272
   .gc_roots       = { V_MODULE, V_PRIMITIVE },
273
   .gc_num_roots   = 2
274
};
275

276
struct _vlog_node {
277
   object_t object;
278
};
279

280
static inline vlog_node_t vlog_array_nth(item_t *item, unsigned n)
9,857✔
281
{
282
   object_t *o = obj_array_nth(item->obj_array, n);
9,857✔
283
   return container_of(o, struct _vlog_node, object);
9,857✔
284
}
285

286
static inline void vlog_array_add(item_t *item, vlog_node_t v)
7,155✔
287
{
288
   obj_array_add(&(item->obj_array), &(v->object));
7,155✔
289
}
7,155✔
290

291
vlog_node_t vlog_new(vlog_kind_t kind)
10,984✔
292
{
293
   object_t *o = object_new(NULL, &vlog_object, kind);
10,984✔
294
   return container_of(o, struct _vlog_node, object);
10,984✔
295
}
296

297
vlog_kind_t vlog_kind(vlog_node_t v)
69,568✔
298
{
299
   return v->object.kind;
69,568✔
300
}
301

302
const char *vlog_kind_str(vlog_kind_t kind)
×
303
{
304
   return kind_text_map[kind];
×
305
}
306

307
ident_t vlog_ident(vlog_node_t v)
7,074✔
308
{
309
   item_t *item = lookup_item(&vlog_object, v, I_IDENT);
7,074✔
310
   assert(item->ident != NULL);
7,074✔
311
   return item->ident;
7,074✔
312
}
313

314
void vlog_set_ident(vlog_node_t v, ident_t i)
4,748✔
315
{
316
   lookup_item(&vlog_object, v, I_IDENT)->ident = i;
4,748✔
317
}
4,748✔
318

319
bool vlog_has_ident(vlog_node_t v)
19✔
320
{
321
   return lookup_item(&vlog_object, v, I_IDENT)->ident != NULL;
19✔
322
}
323

324
ident_t vlog_ident2(vlog_node_t v)
482✔
325
{
326
   item_t *item = lookup_item(&vlog_object, v, I_IDENT2);
482✔
327
   assert(item->ident != NULL);
482✔
328
   return item->ident;
482✔
329
}
330

331
void vlog_set_ident2(vlog_node_t v, ident_t i)
566✔
332
{
333
   lookup_item(&vlog_object, v, I_IDENT2)->ident = i;
566✔
334
}
566✔
335

336
const loc_t *vlog_loc(vlog_node_t v)
9,841✔
337
{
338
   assert(v != NULL);
9,841✔
339
   return &(v->object.loc);
9,841✔
340
}
341

342
void vlog_set_loc(vlog_node_t v, const loc_t *loc)
11,739✔
343
{
344
   assert(v != NULL);
11,739✔
345
   assert(loc != NULL);
11,739✔
346
   v->object.loc = *loc;
11,739✔
347
}
11,739✔
348

349
vlog_node_t vlog_ref(vlog_node_t v)
6,209✔
350
{
351
   item_t *item = lookup_item(&vlog_object, v, I_REF);
6,209✔
352
   assert(item->object != NULL);
6,209✔
353
   return container_of(item->object, struct _vlog_node, object);
6,209✔
354
}
355

356
bool vlog_has_ref(vlog_node_t v)
5,497✔
357
{
358
   return lookup_item(&vlog_object, v, I_REF)->object != NULL;
5,497✔
359
}
360

361
void vlog_set_ref(vlog_node_t v, vlog_node_t d)
2,137✔
362
{
363
   lookup_item(&vlog_object, v, I_REF)->object = &(d->object);
2,137✔
364
   object_write_barrier(&(v->object), &(d->object));
2,137✔
365
}
2,137✔
366

367
unsigned vlog_stmts(vlog_node_t v)
1,643✔
368
{
369
   item_t *item = lookup_item(&vlog_object, v, I_STMTS);
1,643✔
370
   return obj_array_count(item->obj_array);
1,643✔
371
}
372

373
vlog_node_t vlog_stmt(vlog_node_t v, unsigned n)
3,459✔
374
{
375
   item_t *item = lookup_item(&vlog_object, v, I_STMTS);
3,459✔
376
   return vlog_array_nth(item, n);
3,459✔
377
}
378

379
void vlog_add_stmt(vlog_node_t v, vlog_node_t s)
3,053✔
380
{
381
   assert(s != NULL);
3,053✔
382
   vlog_array_add(lookup_item(&vlog_object, v, I_STMTS), s);
3,053✔
383
   object_write_barrier(&(v->object), &(s->object));
3,053✔
384
}
3,053✔
385

386
unsigned vlog_ports(vlog_node_t v)
541✔
387
{
388
   item_t *item = lookup_item(&vlog_object, v, I_PORTS);
541✔
389
   return obj_array_count(item->obj_array);
541✔
390
}
391

392
vlog_node_t vlog_port(vlog_node_t v, unsigned n)
621✔
393
{
394
   item_t *item = lookup_item(&vlog_object, v, I_PORTS);
621✔
395
   return vlog_array_nth(item, n);
621✔
396
}
397

398
void vlog_add_port(vlog_node_t v, vlog_node_t p)
381✔
399
{
400
   assert(p != NULL);
381✔
401
   assert(p->object.kind == V_REF || p->object.kind == V_PORT_DECL);
381✔
402
   vlog_array_add(lookup_item(&vlog_object, v, I_PORTS), p);
381✔
403
   object_write_barrier(&(v->object), &(p->object));
381✔
404
}
381✔
405

406
unsigned vlog_params(vlog_node_t v)
1,997✔
407
{
408
   item_t *item = lookup_item(&vlog_object, v, I_PARAMS);
1,997✔
409
   return obj_array_count(item->obj_array);
1,997✔
410
}
411

412
vlog_node_t vlog_param(vlog_node_t v, unsigned n)
2,679✔
413
{
414
   item_t *item = lookup_item(&vlog_object, v, I_PARAMS);
2,679✔
415
   return vlog_array_nth(item, n);
2,679✔
416
}
417

418
void vlog_add_param(vlog_node_t v, vlog_node_t p)
1,909✔
419
{
420
   assert(p != NULL);
1,909✔
421
   vlog_array_add(lookup_item(&vlog_object, v, I_PARAMS), p);
1,909✔
422
   object_write_barrier(&(v->object), &(p->object));
1,909✔
423
}
1,909✔
424

425
unsigned vlog_ranges(vlog_node_t v)
2,135✔
426
{
427
   item_t *item = lookup_item(&vlog_object, v, I_RANGES);
2,135✔
428
   return obj_array_count(item->obj_array);
2,135✔
429
}
430

431
vlog_node_t vlog_range(vlog_node_t v, unsigned n)
652✔
432
{
433
   item_t *item = lookup_item(&vlog_object, v, I_RANGES);
652✔
434
   return vlog_array_nth(item, n);
652✔
435
}
436

437
void vlog_add_range(vlog_node_t v, vlog_node_t r)
122✔
438
{
439
   assert(r != NULL);
122✔
440
   assert(r->object.kind == V_DIMENSION);
122✔
441
   vlog_array_add(lookup_item(&vlog_object, v, I_RANGES), r);
122✔
442
   object_write_barrier(&(v->object), &(r->object));
122✔
443
}
122✔
444

445
unsigned vlog_decls(vlog_node_t v)
535✔
446
{
447
   item_t *item = lookup_item(&vlog_object, v, I_DECLS);
535✔
448
   return obj_array_count(item->obj_array);
535✔
449
}
450

451
vlog_node_t vlog_decl(vlog_node_t v, unsigned n)
2,180✔
452
{
453
   item_t *item = lookup_item(&vlog_object, v, I_DECLS);
2,180✔
454
   return vlog_array_nth(item, n);
2,180✔
455
}
456

457
void vlog_add_decl(vlog_node_t v, vlog_node_t d)
1,415✔
458
{
459
   assert(d != NULL);
1,415✔
460
   vlog_array_add(lookup_item(&vlog_object, v, I_DECLS), d);
1,415✔
461
   object_write_barrier(&(v->object), &(d->object));
1,415✔
462
}
1,415✔
463

464
unsigned vlog_conds(vlog_node_t v)
212✔
465
{
466
   item_t *item = lookup_item(&vlog_object, v, I_CONDS);
212✔
467
   return obj_array_count(item->obj_array);
212✔
468
}
469

470
vlog_node_t vlog_cond(vlog_node_t v, unsigned n)
266✔
471
{
472
   item_t *item = lookup_item(&vlog_object, v, I_CONDS);
266✔
473
   return vlog_array_nth(item, n);
266✔
474
}
475

476
void vlog_add_cond(vlog_node_t v, vlog_node_t c)
275✔
477
{
478
   assert(c != NULL && c->object.kind == V_COND);
275✔
479
   vlog_array_add(lookup_item(&vlog_object, v, I_CONDS), c);
275✔
480
   object_write_barrier(&(v->object), &(c->object));
275✔
481
}
275✔
482

483
unsigned vlog_subkind(vlog_node_t v)
2,737✔
484
{
485
   return lookup_item(&vlog_object, v, I_SUBKIND)->ival;
2,737✔
486
}
487

488
void vlog_set_subkind(vlog_node_t v, unsigned sub)
2,595✔
489
{
490
   lookup_item(&vlog_object, v, I_SUBKIND)->ival = sub;
2,595✔
491
}
2,595✔
492

493
vlog_node_t vlog_value(vlog_node_t v)
2,228✔
494
{
495
   item_t *item = lookup_item(&vlog_object, v, I_VALUE);
2,228✔
496
   assert(item->object != NULL);
2,228✔
497
   return container_of(item->object, struct _vlog_node, object);
2,228✔
498
}
499

500
bool vlog_has_value(vlog_node_t v)
502✔
501
{
502
   return lookup_item(&vlog_object, v, I_VALUE)->object != NULL;
502✔
503
}
504

505
void vlog_set_value(vlog_node_t v, vlog_node_t e)
1,773✔
506
{
507
   lookup_item(&vlog_object, v, I_VALUE)->object = &(e->object);
1,773✔
508
   object_write_barrier(&(v->object), &(e->object));
1,773✔
509
}
1,773✔
510

511
vlog_node_t vlog_target(vlog_node_t v)
1,306✔
512
{
513
   item_t *item = lookup_item(&vlog_object, v, I_TARGET);
1,306✔
514
   assert(item->object != NULL);
1,306✔
515
   return container_of(item->object, struct _vlog_node, object);
1,306✔
516
}
517

518
void vlog_set_target(vlog_node_t v, vlog_node_t e)
648✔
519
{
520
   lookup_item(&vlog_object, v, I_TARGET)->object = &(e->object);
648✔
521
   object_write_barrier(&(v->object), &(e->object));
648✔
522
}
648✔
523

524
vlog_node_t vlog_delay(vlog_node_t v)
50✔
525
{
526
   item_t *item = lookup_item(&vlog_object, v, I_DELAY);
50✔
527
   assert(item->object != NULL);
50✔
528
   return container_of(item->object, struct _vlog_node, object);
50✔
529
}
530

531
bool vlog_has_delay(vlog_node_t v)
509✔
532
{
533
   return lookup_item(&vlog_object, v, I_DELAY)->object != NULL;
509✔
534
}
535

536
void vlog_set_delay(vlog_node_t v, vlog_node_t d)
50✔
537
{
538
   lookup_item(&vlog_object, v, I_DELAY)->object = &(d->object);
50✔
539
   object_write_barrier(&(v->object), &(d->object));
50✔
540
}
50✔
541

542
vlog_node_t vlog_type(vlog_node_t v)
2,244✔
543
{
544
   item_t *item = lookup_item(&vlog_object, v, I_TYPE);
2,244✔
545
   assert(item->object != NULL);
2,244✔
546
   return container_of(item->object, struct _vlog_node, object);
2,244✔
547
}
548

549
bool vlog_has_type(vlog_node_t v)
×
550
{
551
   return lookup_item(&vlog_object, v, I_TYPE)->object != NULL;
×
552
}
553

554
void vlog_set_type(vlog_node_t v, vlog_node_t t)
823✔
555
{
556
   lookup_item(&vlog_object, v, I_TYPE)->object = &(t->object);
823✔
557
   object_write_barrier(&(v->object), &(t->object));
823✔
558
}
823✔
559

560
number_t vlog_number(vlog_node_t v)
2,912✔
561
{
562
   return lookup_item(&vlog_object, v, I_NUMBER)->number;
2,912✔
563
}
564

565
void vlog_set_number(vlog_node_t v, number_t n)
1,875✔
566
{
567
   lookup_item(&vlog_object, v, I_NUMBER)->number = n;
1,875✔
568
}
1,875✔
569

570
vlog_node_t vlog_left(vlog_node_t v)
1,230✔
571
{
572
   item_t *item = lookup_item(&vlog_object, v, I_LEFT);
1,230✔
573
   assert(item->object != NULL);
1,230✔
574
   return container_of(item->object, struct _vlog_node, object);
1,230✔
575
}
576

577
void vlog_set_left(vlog_node_t v, vlog_node_t e)
609✔
578
{
579
   lookup_item(&vlog_object, v, I_LEFT)->object = &(e->object);
609✔
580
   object_write_barrier(&(v->object), &(e->object));
609✔
581
}
609✔
582

583
vlog_node_t vlog_right(vlog_node_t v)
1,218✔
584
{
585
   item_t *item = lookup_item(&vlog_object, v, I_RIGHT);
1,218✔
586
   assert(item->object != NULL);
1,218✔
587
   return container_of(item->object, struct _vlog_node, object);
1,218✔
588
}
589

590
void vlog_set_right(vlog_node_t v, vlog_node_t e)
609✔
591
{
592
   lookup_item(&vlog_object, v, I_RIGHT)->object = &(e->object);
609✔
593
   object_write_barrier(&(v->object), &(e->object));
609✔
594
}
609✔
595

596
double vlog_dval(vlog_node_t v)
1✔
597
{
598
   return lookup_item(&vlog_object, v, I_DVAL)->dval;
1✔
599
}
600

601
void vlog_set_dval(vlog_node_t v, double d)
23✔
602
{
603
   lookup_item(&vlog_object, v, I_DVAL)->dval = d;
23✔
604
}
23✔
605

606
int64_t vlog_ival(vlog_node_t v)
760✔
607
{
608
   return lookup_item(&vlog_object, v, I_IVAL)->ival;
760✔
609
}
610

611
void vlog_set_ival(vlog_node_t v, int64_t i)
569✔
612
{
613
   lookup_item(&vlog_object, v, I_IVAL)->ival = i;
569✔
614
}
569✔
615

616
void vlog_visit(vlog_node_t v, vlog_visit_fn_t fn, void *context)
272✔
617
{
618
   vlog_visit_only(v, fn, context, V_LAST_NODE_KIND);
272✔
619
}
272✔
620

621
void vlog_visit_only(vlog_node_t v, vlog_visit_fn_t fn, void *context,
272✔
622
                     vlog_kind_t kind)
623
{
624
   assert(v != NULL);
272✔
625

626
   object_visit_ctx_t ctx = {
272✔
627
      .count      = 0,
628
      .postorder  = (object_visit_fn_t)fn,
629
      .preorder   = NULL,
630
      .context    = context,
631
      .kind       = kind,
632
      .tag        = OBJECT_TAG_VLOG,
633
      .generation = object_next_generation(),
272✔
634
      .deep       = false
635
   };
636

637
   object_visit(&(v->object), &ctx);
272✔
638
}
272✔
639

640
vlog_node_t vlog_rewrite(vlog_node_t v, vlog_rewrite_fn_t fn, void *context)
490✔
641
{
642
   object_arena_t *arena = object_arena(&(v->object));
490✔
643
   if (arena_frozen(arena))
490✔
644
      return v;
645

646
   object_rewrite_ctx_t ctx = {
490✔
647
      .generation = object_next_generation(),
490✔
648
      .context    = context,
649
      .arena      = arena,
650
   };
651

652
   ctx.post_fn[OBJECT_TAG_VLOG] = (object_rewrite_post_fn_t)fn;
490✔
653

654
   object_t *result = object_rewrite(&(v->object), &ctx);
490✔
655
   free(ctx.cache);
490✔
656
   return container_of(result, struct _vlog_node, object);
490✔
657
}
658

659
vlog_node_t vlog_copy(vlog_node_t v, vlog_copy_pred_t pred, void *ctx)
154✔
660
{
661
   object_copy_ctx_t *copy LOCAL = xcalloc_flex(sizeof(object_copy_ctx_t),
154✔
662
                                                1, sizeof(object_t *));
663
   copy->generation   = object_next_generation();
154✔
664
   copy->pred_context = ctx;
154✔
665
   copy->nroots       = 1;
154✔
666
   copy->roots[0]     = &(v->object);
154✔
667

668
   copy->should_copy[OBJECT_TAG_VLOG] = (object_copy_pred_t)pred;
154✔
669

670
   object_copy(copy);
154✔
671

672
   return container_of(copy->roots[0], struct _vlog_node, object);
154✔
673
}
674

675
object_t *vlog_to_object(vlog_node_t v)
1,485✔
676
{
677
   return &(v->object);
1,485✔
678
}
679

680
vlog_node_t vlog_from_object(object_t *obj)
5,925✔
681
{
682
   if (obj != NULL && obj->tag == OBJECT_TAG_VLOG)
5,925✔
683
      return container_of(obj, struct _vlog_node, object);
684
   else
685
      return NULL;
5,516✔
686
}
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