GCC Code Coverage Report


Directory: src/
File: script_lib/compiler.cpp
Date: 2024-12-30 15:39:09
Exec Total Coverage
Lines: 39 41 95.1%
Functions: 1 1 100.0%
Branches: 28 52 53.8%

Line Branch Exec Source
1 #include "script.h"
2 #include "tokens.h"
3 #include <cstring>
4 #include <functional>
5 #include <map>
6
7 namespace script
8 {
9 3 std::string compile(const std::vector<std::string>& source,
10 std::vector<char>& data)
11 {
12
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
3 if (source.empty())
13 return "Empty source";
14
15 // text conversion byte code, version 1
16
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 std::vector<char> header{'t', 'c', 'b', 'c', 1};
17
18 3 std::vector<char> payload;
19
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 payload.reserve(1024);
20
21 command cmd;
22 3 std::string operand;
23
24 3 auto line_index = 0;
25
26
2/2
✓ Branch 5 taken 15 times.
✓ Branch 6 taken 2 times.
17 for (const auto& line : source)
27 {
28 15 line_index++;
29
30
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
15 if (line.empty())
31 2 continue;
32
33
1/2
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
15 parse(line, cmd, operand);
34
35
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 13 times.
15 if (cmd == command::COMMENT)
36 2 continue;
37
38
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 12 times.
13 if (cmd == command::INVALID)
39
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 return std::string{"Invalid command at line "} +
40
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
3 std::to_string(line_index);
41
42 12 language_token t;
43
2/4
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
12 if (!get_from_ID(cmd, t))
44 return "Unknown command.";
45
46
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 payload.push_back(t.byte_code);
47
48
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
12 if (t.has_operand)
49 {
50 4 auto idx = payload.size();
51
52 // limit: only char long strings
53 4 const auto size = static_cast<unsigned int>(operand.size());
54 4 const auto data_size = sizeof(unsigned int);
55
56
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 payload.resize(idx + data_size);
57
58 4 memcpy(payload.data() + idx, &size, data_size);
59
60 4 idx = payload.size();
61
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 payload.resize(idx + size);
62
63 4 memcpy(payload.data() + idx, operand.data(), size);
64 }
65
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 }
66
67 // hash
68
69
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 auto hash_argument = payload;
70
1/2
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 hash_argument.insert(hash_argument.end(), secret_key.begin(),
71 secret_key.end());
72
73 vector_hash hasher;
74 2 const auto hash_value = hasher(hash_argument);
75
76 // merge
77
78
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 data = header;
79
80
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 data.resize(data.size() + sizeof(size_t));
81 2 memcpy(data.data() + header.size(), &hash_value, sizeof(size_t));
82
83
1/2
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 data.insert(data.end(), payload.begin(), payload.end());
84
85
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 return "";
86 3 }
87 } // namespace script
88