GCC Code Coverage Report


Directory: ./
File: openvdb_ax/openvdb_ax/ast/Parse.cc
Date: 2022-07-25 17:40:05
Exec Total Coverage
Lines: 22 24 91.7%
Functions: 3 4 75.0%
Branches: 15 38 39.5%

Line Branch Exec Source
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
4 #include "Parse.h"
5 #include "../Exceptions.h"
6
7 // if OPENVDB_AX_REGENERATE_GRAMMAR is defined, we've re-generated the
8 // grammar - include path should be set up to pull in from the temp dir
9 // @note We need to include this to get access to axlloc. Should look to
10 // re-work this so we don't have to (would require a reentrant parser)
11 #ifdef OPENVDB_AX_REGENERATE_GRAMMAR
12 #include "axparser.h"
13 #else
14 #include "../grammar/generated/axparser.h"
15 #endif
16
17 #include <mutex>
18 #include <string>
19 #include <memory>
20
21 namespace {
22 // Declare this at file scope to ensure thread-safe initialization.
23 std::mutex sInitMutex;
24 }
25
26 openvdb::ax::Logger* axlog = nullptr;
27 using YY_BUFFER_STATE = struct yy_buffer_state*;
28 extern int axparse(openvdb::ax::ast::Tree**);
29 extern YY_BUFFER_STATE ax_scan_string(const char * str);
30 extern void ax_delete_buffer(YY_BUFFER_STATE buffer);
31 505 extern void axerror (openvdb::ax::ast::Tree**, char const *s) {
32 //@todo: add check for memory exhaustion
33
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 505 times.
505 assert(axlog);
34
2/4
✓ Branch 1 taken 505 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 505 times.
✗ Branch 5 not taken.
505 axlog->error(/*starts with 'syntax error, '*/s + 14,
35 {axlloc.first_line, axlloc.first_column});
36 505 }
37
38 openvdb::ax::ast::Tree::ConstPtr
39 3380 openvdb::ax::ast::parse(const char* code,
40 openvdb::ax::Logger& logger)
41 {
42 std::lock_guard<std::mutex> lock(sInitMutex);
43 3380 axlog = &logger; // for lexer errs
44
1/2
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
3380 logger.setSourceCode(code);
45
46 const size_t err = logger.errors();
47
48 // reset all locations
49 3380 axlloc.first_line = axlloc.last_line = 1;
50 3380 axlloc.first_column = axlloc.last_column = 1;
51
52
1/2
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
3380 YY_BUFFER_STATE buffer = ax_scan_string(code);
53
54 3380 openvdb::ax::ast::Tree* tree(nullptr);
55
1/2
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
3380 axparse(&tree);
56 3380 axlog = nullptr;
57
58
1/2
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
3380 openvdb::ax::ast::Tree::ConstPtr ptr(const_cast<const openvdb::ax::ast::Tree*>(tree));
59
60
1/2
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
3380 ax_delete_buffer(buffer);
61
62
2/2
✓ Branch 0 taken 517 times.
✓ Branch 1 taken 2863 times.
3380 if (logger.errors() > err) ptr.reset();
63
64
2/6
✓ Branch 1 taken 3380 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3380 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
6760 logger.setSourceTree(ptr);
65 3380 return ptr;
66 }
67
68
69 openvdb::ax::ast::Tree::Ptr
70 581 openvdb::ax::ast::parse(const char* code)
71 {
72 openvdb::ax::Logger logger(
73 [](const std::string& error) {
74 OPENVDB_THROW(openvdb::AXSyntaxError, error);
75
2/6
✓ Branch 3 taken 581 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 581 times.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
1743 });
76
77
1/2
✓ Branch 1 taken 581 times.
✗ Branch 2 not taken.
581 openvdb::ax::ast::Tree::ConstPtr constTree = openvdb::ax::ast::parse(code, logger);
78
79 1162 return std::const_pointer_cast<openvdb::ax::ast::Tree>(constTree);
80 }
81
82