asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
536 of 648, 0 excluded
82.7%
Functions:
100 of 108, 0 excluded
92.6%
Branches:
923 of 1999, 0 excluded
46.2%

math_functions.cpp
Line Branch Exec Source
1 #include "asar.h"
2 #include "assembleblock.h"
3 #include "math_ast.h"
4 #include "platform/file-helpers.h"
5 #include "macro.h"
6 #include <cinttypes>
7
8 namespace {
9 struct cachedfile {
10 string filename;
11 virtual_file_handle filehandle;
12 size_t filesize;
13 bool used;
14 };
15
16 #define numcachedfiles 16
17
18 cachedfile cachedfiles[numcachedfiles];
19 int cachedfileindex = 0;
20
21 // Opens a file, trying to open it from cache first
22
23 60 cachedfile * opencachedfile(string fname, bool should_error)
24 {
25 60 cachedfile * cachedfilehandle = nullptr;
26
27
1/3
✓ Branch 2 → 3 taken 60 times.
✗ Branch 2 → 46 not taken.
✗ Branch 2 → 92 not taken.
60 const char* current_file = get_current_file_name();
28
29 // RPG Hacker: Only using a combined path here because that should
30 // hopefully result in a unique string for every file, whereas
31 // fname could be a relative path, which isn't guaranteed to be unique.
32 // Note that this does not affect how we open the file - this is
33 // handled by the filesystem and uses our include paths etc.
34
3/7
✓ Branch 4 → 5 taken 30 times.
✗ Branch 4 → 43 not taken.
✓ Branch 6 → 7 taken 60 times.
✗ Branch 6 → 41 not taken.
✗ Branch 6 → 88 not taken.
✓ Branch 9 → 10 taken 30 times.
✗ Branch 9 → 86 not taken.
60 string combinedname = filesystem->create_absolute_path(dir(current_file), fname);
35
36
4/4
✓ Branch 17 → 9 taken 192 times.
✓ Branch 17 → 18 taken 10 times.
✓ Branch 28 → 13 taken 192 times.
✓ Branch 28 → 29 taken 10 times.
404 for (int i = 0; i < numcachedfiles; i++)
37 {
38
12/12
✓ Branch 9 → 10 taken 38 times.
✓ Branch 9 → 13 taken 154 times.
✓ Branch 11 → 12 taken 20 times.
✓ Branch 11 → 13 taken 18 times.
✓ Branch 14 → 15 taken 20 times.
✓ Branch 14 → 16 taken 364 times.
✓ Branch 16 → 17 taken 38 times.
✓ Branch 16 → 22 taken 154 times.
✓ Branch 20 → 21 taken 20 times.
✓ Branch 20 → 22 taken 18 times.
✓ Branch 23 → 24 taken 20 times.
✓ Branch 23 → 27 taken 172 times.
384 if (cachedfiles[i].used && cachedfiles[i].filename == combinedname)
39 {
40 40 cachedfilehandle = &cachedfiles[i];
41 40 break;
42 }
43 }
44
45
4/4
✓ Branch 18 → 19 taken 10 times.
✓ Branch 18 → 23 taken 20 times.
✓ Branch 29 → 30 taken 10 times.
✓ Branch 29 → 49 taken 20 times.
60 if (cachedfilehandle == nullptr)
46 {
47
3/6
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 22 taken 10 times.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 10 times.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 46 taken 10 times.
20 if (cachedfiles[cachedfileindex].used)
48 {
49 filesystem->close_file(cachedfiles[cachedfileindex].filehandle);
50 cachedfiles[cachedfileindex].filehandle = INVALID_VIRTUAL_FILE_HANDLE;
51 cachedfiles[cachedfileindex].used = false;
52 }
53
54 20 cachedfilehandle = &cachedfiles[cachedfileindex];
55 }
56
57
2/4
✓ Branch 23 → 24 taken 30 times.
✗ Branch 23 → 32 not taken.
✓ Branch 49 → 50 taken 30 times.
✗ Branch 49 → 75 not taken.
60 if (cachedfilehandle != nullptr)
58 {
59
5/6
✓ Branch 24 → 25 taken 10 times.
✓ Branch 24 → 32 taken 20 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 30 times.
✓ Branch 53 → 54 taken 10 times.
✓ Branch 53 → 75 taken 20 times.
60 if (!cachedfilehandle->used)
60 {
61
2/4
✓ Branch 26 → 27 taken 10 times.
✗ Branch 26 → 44 not taken.
✓ Branch 56 → 57 taken 10 times.
✗ Branch 56 → 90 not taken.
20 cachedfilehandle->filehandle = filesystem->open_file(fname, current_file);
62
4/4
✓ Branch 27 → 28 taken 5 times.
✓ Branch 27 → 32 taken 5 times.
✓ Branch 61 → 62 taken 5 times.
✓ Branch 61 → 75 taken 5 times.
20 if (cachedfilehandle->filehandle != INVALID_VIRTUAL_FILE_HANDLE)
63 {
64 10 cachedfilehandle->used = true;
65
2/4
✓ Branch 28 → 29 taken 5 times.
✗ Branch 28 → 44 not taken.
✓ Branch 66 → 67 taken 5 times.
✗ Branch 66 → 90 not taken.
10 cachedfilehandle->filename = combinedname;
66
2/4
✓ Branch 29 → 30 taken 5 times.
✗ Branch 29 → 44 not taken.
✓ Branch 70 → 71 taken 5 times.
✗ Branch 70 → 90 not taken.
10 cachedfilehandle->filesize = filesystem->get_file_size(cachedfilehandle->filehandle);
67 10 cachedfileindex++;
68 // randomdude999: when we run out of cached files, just start overwriting ones from the start
69
2/4
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 5 times.
✗ Branch 73 → 74 not taken.
✓ Branch 73 → 75 taken 5 times.
10 if (cachedfileindex >= numcachedfiles) cachedfileindex = 0;
70 }
71 }
72 }
73
74
8/12
✓ Branch 32 → 33 taken 30 times.
✗ Branch 32 → 34 not taken.
✓ Branch 33 → 34 taken 5 times.
✓ Branch 33 → 38 taken 25 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 38 taken 5 times.
✓ Branch 75 → 76 taken 30 times.
✗ Branch 75 → 79 not taken.
✓ Branch 78 → 79 taken 5 times.
✓ Branch 78 → 83 taken 25 times.
✗ Branch 79 → 80 not taken.
✓ Branch 79 → 83 taken 5 times.
60 if ((cachedfilehandle == nullptr || cachedfilehandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) && should_error)
75 {
76 throw_vfile_error(2, asar_get_last_io_error(), fname.data());
77 }
78
79 60 return cachedfilehandle;
80 60 }
81 // closecachedfiles is declared at the end of the file outside namespace{}
82
83
84
85 782 void assert_argc(const std::vector<math_val>& args, int expected_args) {
86
4/4
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 8 taken 388 times.
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 10 taken 390 times.
782 if((int)args.size() != expected_args) {
87 4 throw_err_block(2, err_argument_count, expected_args, (int)args.size());
88 }
89 778 }
90
91 // these templates could be implemented in a fully generic way too (without
92 // specializing per argument count), but that looks a little too cryptic to me.
93 template<math_val (*F)()>
94 22 math_val fixed_arity(const std::vector<math_val>& args) {
95 22 assert_argc(args, 0);
96 22 return F();
97 }
98 template<math_val (*F)(math_val)>
99 550 math_val fixed_arity(const std::vector<math_val>& args) {
100 550 assert_argc(args, 1);
101
48/88
math_val (anonymous namespace)::fixed_arity<&(math_val (anonymous namespace)::fn_snes_pc<&(pctosnes(int))>(math_val))>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 21 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 21 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 21 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 21 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(math_val (anonymous namespace)::fn_snes_pc<&(snestopc(int))>(math_val))>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 29 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 29 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 29 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 29 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_datasize>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 5 times.
✓ Branch 5 → 10 taken 1 time.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 5 times.
✓ Branch 9 → 14 taken 1 time.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_filesize>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_isdefined>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 4 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_filestatus>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_objectsize>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 14 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 14 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 14 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 14 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_not>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 8 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 8 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 8 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 8 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_bank>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 14 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_sizeof>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 182 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 179 times.
✓ Branch 5 → 10 taken 3 times.
✓ Branch 7 → 8 taken 182 times.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 179 times.
✓ Branch 9 → 14 taken 3 times.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_strlen>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 10 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 16 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 14 not taken.
826 return F(args[0]);
102 }
103 template<math_val (*F)(math_val,math_val)>
104 40 math_val fixed_arity(const std::vector<math_val>& args) {
105 40 assert_argc(args, 2);
106
33/72
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_max>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 4 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_min>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 4 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_char>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 4 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✓ Branch 7 → 13 taken 2 times.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 4 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 2 times.
✓ Branch 14 → 21 taken 2 times.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_round>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::fixed_arity<&(math_val (anonymous namespace)::fn_str_eq<&strcasecmp>(math_val, math_val))>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 18 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::fixed_arity<&(math_val (anonymous namespace)::fn_str_eq<&strcmp>(math_val, math_val))>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 6 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 6 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::fixed_arity<&(math_val (anonymous namespace)::fn_str_eq<&stricmp>(math_val, math_val))>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 13 not taken.
66 return F(args[0], args[1]);
107 }
108 template<math_val (*F)(math_val,math_val,math_val)>
109 22 math_val fixed_arity(const std::vector<math_val>& args) {
110 22 assert_argc(args, 3);
111
24/48
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_safediv>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 24 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 21 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 38 not taken.
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 18 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 16 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 34 not taken.
✓ Branch 17 → 18 taken 2 times.
✗ Branch 17 → 30 not taken.
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 28 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_clamp>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 24 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 21 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 38 not taken.
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 18 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 16 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 34 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 30 not taken.
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 28 not taken.
math_val (anonymous namespace)::fixed_arity<&(anonymous namespace)::fn_select>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 24 not taken.
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 21 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 38 not taken.
✓ Branch 8 → 9 taken 6 times.
✗ Branch 8 → 18 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 16 not taken.
✓ Branch 12 → 13 taken 6 times.
✗ Branch 12 → 34 not taken.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 30 not taken.
✓ Branch 19 → 20 taken 6 times.
✗ Branch 19 → 28 not taken.
33 return F(args[0], args[1], args[2]);
112 }
113
114 template<double (*F)(double)>
115 18 math_val fn_unary_real(const std::vector<math_val>& args) {
116
8/30
math_val (anonymous namespace)::fn_unary_real<&cos>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&log>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&sin>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 4 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&tan>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&acos>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&asin>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&atan>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&log2>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&sqrt>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 12 taken 2 times.
✓ Branch 2 → 15 taken 2 times.
math_val (anonymous namespace)::fn_unary_real<&log10>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
18 assert_argc(args, 1);
117 14 double val = F(args[0].get_double());
118
4/40
math_val (anonymous namespace)::fn_unary_real<&cos>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&log>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 12 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&sin>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&tan>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&acos>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&asin>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&atan>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&log2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&sqrt>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 12 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 15 not taken.
math_val (anonymous namespace)::fn_unary_real<&log10>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 12 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 15 not taken.
4 if (val != val) throw_err_block(2, err_nan);
119 20 return val;
120 };
121
122 template<double (*F)(double)>
123 10 math_val fn_rounding(const std::vector<math_val>& args) {
124 10 assert_argc(args, 1);
125 10 double val = F(args[0].get_double());
126 // TODO where should we check this? math_val(double) constructor maybe?
127 if (val != val) throw_err_block(2, err_nan);
128
4/8
math_val (anonymous namespace)::fn_rounding<&ceil>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 15 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 19 not taken.
math_val (anonymous namespace)::fn_rounding<&floor>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 15 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 19 not taken.
10 return math_val(val).get_integer();
129 };
130
131 template<math_binop_type OP>
132 32 math_val math_binop_function(const std::vector<math_val>& args) {
133 32 assert_argc(args, 2);
134
30/66
math_val (anonymous namespace)::math_binop_function<(math_binop_type)13>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::math_binop_function<(math_binop_type)14>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::math_binop_function<(math_binop_type)15>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::math_binop_function<(math_binop_type)16>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::math_binop_function<(math_binop_type)17>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 4 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 21 not taken.
math_val (anonymous namespace)::math_binop_function<(math_binop_type)18>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 15 not taken.
✓ Branch 7 → 8 taken 4 times.
✗ Branch 7 → 13 not taken.
✗ Branch 7 → 27 not taken.
✓ Branch 12 → 13 taken 2 times.
✗ Branch 12 → 23 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 21 not taken.
48 return evaluate_binop(args[0], args[1], OP);
135 }
136
137 template<bool (*F)(bool, bool)>
138 30 math_val math_bool_binop_function(const std::vector<math_val>& args) {
139 30 assert_argc(args, 2);
140 90 return (int64_t)F(args[0].get_bool(), args[1].get_bool());
141 }
142
143
3/4
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 5 taken 4 times.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 5 not taken.
6 bool fn_and(bool a, bool b) { return a && b; }
144
4/4
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 4 taken 2 times.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 2 times.
6 bool fn_or(bool a, bool b) { return a || b; }
145
3/4
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 4 taken 4 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 2 times.
6 bool fn_nand(bool a, bool b) { return !(a && b); }
146
4/4
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 5 taken 2 times.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 2 times.
6 bool fn_nor(bool a, bool b) { return !(a || b); }
147 6 bool fn_xor(bool a, bool b) { return a ^ b; }
148
149 12 math_val fn_select(math_val cond, math_val a, math_val b) {
150
2/2
✓ Branch 3 → 4 taken 10 times.
✓ Branch 3 → 5 taken 2 times.
12 return cond.get_bool() ? a : b;
151 }
152
153 template<int (*F)(int)>
154 100 math_val fn_snes_pc(math_val arg) {
155 200 return (int64_t)F(arg.get_integer());
156 }
157
158 template<int& variable>
159 22 math_val fn_pc_realbase() {
160 22 return (int64_t)variable;
161 }
162 24 int haslabel_always() {
163 24 return 3;
164 }
165 template<int& variable>
166 12 int getlen_pc_realbase(const std::vector<owned_node>& args, bool could_be_bank_ex) {
167 // todo : should this use freespaceid even with base active???
168 12 return getlenforlabel(variable, freespaceid, true);
169 }
170
171 4 math_val fn_bank(math_val arg) {
172 4 return (arg.get_integer() >> 16);
173 }
174 12 int getlen_bank(const std::vector<owned_node>& args, bool could_be_bank_ex) {
175 12 return 1;
176 }
177
178 4 math_val fn_safediv(math_val a, math_val b, math_val default_) {
179
2/2
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 2 times.
4 if(b.get_double() == 0.0) return default_;
180
5/11
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 18 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 15 not taken.
✗ Branch 6 → 23 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 13 not taken.
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 19 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 17 not taken.
3 return evaluate_binop(a, b, math_binop_type::div);
181 }
182
183 16 math_val fn_not(math_val arg) {
184 16 return (int64_t)!arg.get_bool();
185 }
186
187 template<int (*F)(const char*, const char*)>
188 18 math_val fn_str_eq(math_val va, math_val vb) {
189 18 const string& a = va.get_str();
190 18 const string& b = vb.get_str();
191 27 bool result = F(a.data(), b.data()) == 0;
192 36 return (int64_t)result;
193 }
194
195 8 math_val fn_char(math_val str_, math_val ind_) {
196 8 const string& s = str_.get_str();
197 8 int64_t ind = ind_.get_integer();
198
11/11
✓ Branch 4 → 5 taken 6 times.
✓ Branch 4 → 7 taken 1 time.
✓ Branch 4 → 8 taken 1 time.
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 2 times.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 2 times.
✓ Branch 9 → 10 taken 2 times.
✓ Branch 9 → 14 taken 2 times.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 16 taken 2 times.
8 if(ind < 0 || ind >= s.length())
199 4 throw_err_block(2, err_oob, (int)ind, s.length());
200 4 return (int64_t)(unsigned char)s[ind];
201 }
202 2 math_val fn_strlen(math_val val) {
203 2 return (int64_t)val.get_str().length();
204 }
205
206 template<int count>
207 28 math_val fn_read(const std::vector<math_val>& args) {
208
28/48
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 11 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 11 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 10 times.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 10 times.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 13 taken 10 times.
✓ Branch 10 → 11 taken 1 time.
✓ Branch 10 → 16 taken 10 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 1 time.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 1 time.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 1 time.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 1 time.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 1 time.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 1 time.
28 if(args.size() < 1 || args.size() > 2) {
209 // TODO expected amount should be string to show the range
210
2/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 61 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 88 not taken.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 61 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 88 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 61 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 88 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 61 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 88 not taken.
2 throw_err_block(2, err_argument_count, 2, (int)args.size());
211 }
212
8/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 10 times.
✗ Branch 14 → 61 not taken.
✓ Branch 19 → 20 taken 10 times.
✗ Branch 19 → 88 not taken.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 61 not taken.
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 88 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 61 not taken.
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 88 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 61 not taken.
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 88 not taken.
26 int64_t target = args[0].get_integer();
213 26 int addr = snestopc(target);
214
215
10/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 28 taken 8 times.
✓ Branch 23 → 24 taken 2 times.
✓ Branch 23 → 36 taken 8 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 28 taken 1 time.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 36 taken 1 time.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 28 taken 1 time.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 36 taken 1 time.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 28 taken 1 time.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 36 taken 1 time.
26 if(args.size() == 2) {
216
2/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 61 not taken.
✓ Branch 27 → 28 taken 2 times.
✗ Branch 27 → 88 not taken.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 61 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 88 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 61 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 88 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 61 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 88 not taken.
4 math_val default_val = args[1];
217
4/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 22 taken 1 time.
✓ Branch 28 → 29 taken 1 time.
✓ Branch 28 → 30 taken 1 time.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
4 if(addr < 0) return default_val;
218
2/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 24 not taken.
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 32 not taken.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
2 if(addr + count > romlen_r) return default_val;
219 } else {
220
8/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 35 taken 8 times.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 46 taken 8 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 35 taken 1 time.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 46 taken 1 time.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 35 taken 1 time.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 46 taken 1 time.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 35 taken 1 time.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 46 taken 1 time.
22 if (addr < 0)
221 throw_err_block(2, err_snes_address_doesnt_map_to_rom, (hex((unsigned int)target, 6) + " in read function").data());
222
10/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 35 → 36 taken 1 time.
✓ Branch 35 → 42 taken 7 times.
✓ Branch 46 → 47 taken 1 time.
✓ Branch 46 → 56 taken 7 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 42 taken 1 time.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 56 taken 1 time.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 42 taken 1 time.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 56 taken 1 time.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 42 taken 1 time.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 56 taken 1 time.
22 else if (addr + count > romlen_r)
223
6/48
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 59 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 57 not taken.
✓ Branch 39 → 40 taken 1 time.
✗ Branch 39 → 55 not taken.
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 84 not taken.
✓ Branch 50 → 51 taken 1 time.
✗ Branch 50 → 82 not taken.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 80 not taken.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 59 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 57 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 55 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 84 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 82 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 80 not taken.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 59 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 57 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 55 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 84 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 82 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 80 not taken.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 59 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 57 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 55 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 84 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 82 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 80 not taken.
7 throw_err_block(2, err_snes_address_out_of_bounds, (hex(target, 6) + " in read function").data());
224 }
225
226 20 int64_t value = 0;
227
16/16
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 44 → 43 taken 7 times.
✓ Branch 44 → 45 taken 7 times.
✓ Branch 67 → 58 taken 7 times.
✓ Branch 67 → 68 taken 7 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 44 → 43 taken 2 times.
✓ Branch 44 → 45 taken 1 time.
✓ Branch 67 → 58 taken 2 times.
✓ Branch 67 → 68 taken 1 time.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 44 → 43 taken 3 times.
✓ Branch 44 → 45 taken 1 time.
✓ Branch 67 → 58 taken 3 times.
✓ Branch 67 → 68 taken 1 time.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 44 → 43 taken 4 times.
✓ Branch 44 → 45 taken 1 time.
✓ Branch 67 → 58 taken 4 times.
✓ Branch 67 → 68 taken 1 time.
52 for(int i = 0; i < count; i++)
228 {
229
4/8
math_val (anonymous namespace)::fn_read<1>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 7 times.
math_val (anonymous namespace)::fn_read<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 2 times.
math_val (anonymous namespace)::fn_read<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 3 times.
math_val (anonymous namespace)::fn_read<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 4 times.
32 value |= romdata_r[addr+i] << (8 * i);
230 }
231 20 return value;
232 }
233 template<int count>
234 44 math_val fn_canread(const std::vector<math_val>& args) {
235 44 int64_t length = count;
236 int64_t addr;
237 if(count == 0) {
238 8 assert_argc(args, 2);
239 8 length = args[0].get_integer();
240 8 addr = args[1].get_integer();
241 } else {
242 36 assert_argc(args, 1);
243 36 addr = args[0].get_integer();
244 }
245 44 int addr_pc = snestopc(addr);
246
14/40
math_val (anonymous namespace)::fn_canread<0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 3 times.
✓ Branch 10 → 12 taken 1 time.
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 13 taken 1 time.
✓ Branch 14 → 15 taken 3 times.
✓ Branch 14 → 16 taken 1 time.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 15 → 17 taken 1 time.
math_val (anonymous namespace)::fn_canread<1>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 7 → 8 taken 18 times.
✗ Branch 7 → 9 not taken.
✓ Branch 8 → 9 taken 9 times.
✓ Branch 8 → 10 taken 9 times.
✓ Branch 9 → 10 taken 18 times.
✗ Branch 9 → 11 not taken.
✓ Branch 10 → 11 taken 9 times.
✓ Branch 10 → 12 taken 9 times.
math_val (anonymous namespace)::fn_canread<2>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
math_val (anonymous namespace)::fn_canread<3>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
math_val (anonymous namespace)::fn_canread<4>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
44 if (addr_pc < 0 || addr_pc + length > romlen_r) return (int64_t)0;
247 20 else return (int64_t)1;
248 }
249
250 template<unsigned int count>
251 32 math_val fn_readfile(const std::vector<math_val>& args) {
252
24/48
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 11 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 11 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 11 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 11 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 11 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 11 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 2 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 2 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 2 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 2 times.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 1 time.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 1 time.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 2 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 2 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 2 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 2 times.
32 if(args.size() < 2 || args.size() > 3) {
253 // TODO expected amount should be string to show the range
254 throw_err_block(2, err_argument_count, 3, (int)args.size());
255 }
256
16/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 11 times.
✗ Branch 14 → 66 not taken.
✓ Branch 15 → 16 taken 11 times.
✗ Branch 15 → 66 not taken.
✓ Branch 20 → 21 taken 11 times.
✗ Branch 20 → 103 not taken.
✓ Branch 21 → 22 taken 11 times.
✗ Branch 21 → 103 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 66 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 66 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 103 not taken.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 103 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 66 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 66 not taken.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 103 not taken.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 103 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 66 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 66 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 103 not taken.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 103 not taken.
32 string fname = args[0].get_str();
257
8/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 17 → 18 taken 11 times.
✗ Branch 17 → 64 not taken.
✓ Branch 25 → 26 taken 11 times.
✗ Branch 25 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 17 → 18 taken 2 times.
✗ Branch 17 → 64 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 64 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 17 → 18 taken 2 times.
✗ Branch 17 → 64 not taken.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 101 not taken.
32 int64_t offset = args[1].get_integer();
258 32 bool should_error = args.size() == 2;
259
16/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 11 times.
✗ Branch 19 → 60 not taken.
✓ Branch 20 → 21 taken 11 times.
✗ Branch 20 → 58 not taken.
✓ Branch 29 → 30 taken 11 times.
✗ Branch 29 → 95 not taken.
✓ Branch 30 → 31 taken 11 times.
✗ Branch 30 → 93 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 60 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 58 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 95 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 93 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 60 not taken.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 58 not taken.
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 95 not taken.
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 93 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 60 not taken.
✓ Branch 20 → 21 taken 2 times.
✗ Branch 20 → 58 not taken.
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 95 not taken.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 93 not taken.
32 cachedfile * fhandle = opencachedfile(fname, should_error);
260
261
14/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 22 → 23 taken 4 times.
✓ Branch 22 → 36 taken 7 times.
✓ Branch 33 → 34 taken 4 times.
✓ Branch 33 → 53 taken 7 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 22 → 23 taken 1 time.
✓ Branch 22 → 36 taken 1 time.
✓ Branch 33 → 34 taken 1 time.
✓ Branch 33 → 53 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 36 taken 1 time.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 53 taken 1 time.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 22 → 23 taken 1 time.
✓ Branch 22 → 36 taken 1 time.
✓ Branch 33 → 34 taken 1 time.
✓ Branch 33 → 53 taken 1 time.
32 if(!should_error) {
262
6/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 24 → 25 taken 4 times.
✗ Branch 24 → 64 not taken.
✓ Branch 37 → 38 taken 4 times.
✗ Branch 37 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 64 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 64 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 64 not taken.
✓ Branch 37 → 38 taken 1 time.
✗ Branch 37 → 101 not taken.
12 math_val default_val = args[2];
263
14/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 25 → 26 taken 4 times.
✗ Branch 25 → 27 not taken.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 28 taken 3 times.
✓ Branch 38 → 39 taken 4 times.
✗ Branch 38 → 42 not taken.
✓ Branch 41 → 42 taken 1 time.
✓ Branch 41 → 43 taken 3 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 27 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 1 time.
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 42 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 28 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 42 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 43 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 27 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 1 time.
✓ Branch 38 → 39 taken 1 time.
✗ Branch 38 → 42 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 1 time.
12 if(fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) return default_val;
264
6/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 3 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 3 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 1 time.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 45 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 1 time.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 1 time.
10 if(offset < 0) return default_val;
265
8/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 30 → 31 taken 1 time.
✓ Branch 30 → 32 taken 2 times.
✓ Branch 47 → 48 taken 1 time.
✓ Branch 47 → 49 taken 2 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 1 time.
✗ Branch 47 → 48 not taken.
✓ Branch 47 → 49 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 32 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 49 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 30 → 31 taken 1 time.
✗ Branch 30 → 32 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 49 not taken.
10 if((size_t)offset + count > fhandle->filesize) return default_val;
266 6 } else {
267
16/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 36 → 37 taken 7 times.
✗ Branch 36 → 38 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 41 taken 7 times.
✓ Branch 53 → 54 taken 7 times.
✗ Branch 53 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 60 taken 7 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 38 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 41 taken 1 time.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 60 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 38 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 41 taken 1 time.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 60 taken 1 time.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 38 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 41 taken 1 time.
✓ Branch 53 → 54 taken 1 time.
✗ Branch 53 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 60 taken 1 time.
20 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE)
268 throw_vfile_error(2, asar_get_last_io_error(), fname.data());
269
20/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 41 → 42 taken 6 times.
✓ Branch 41 → 43 taken 1 time.
✓ Branch 42 → 43 taken 1 time.
✓ Branch 42 → 49 taken 5 times.
✓ Branch 60 → 61 taken 6 times.
✓ Branch 60 → 64 taken 1 time.
✓ Branch 63 → 64 taken 1 time.
✓ Branch 63 → 72 taken 5 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 43 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 49 taken 1 time.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 64 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 72 taken 1 time.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 43 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 49 taken 1 time.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 64 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 72 taken 1 time.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 41 → 42 taken 1 time.
✗ Branch 41 → 43 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 49 taken 1 time.
✓ Branch 60 → 61 taken 1 time.
✗ Branch 60 → 64 not taken.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 72 taken 1 time.
20 if (offset < 0 || (size_t)offset + count > fhandle->filesize)
270
4/32
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 44 → 45 taken 2 times.
✗ Branch 44 → 63 not taken.
✓ Branch 46 → 47 taken 2 times.
✗ Branch 46 → 61 not taken.
✓ Branch 66 → 67 taken 2 times.
✗ Branch 66 → 99 not taken.
✓ Branch 69 → 70 taken 2 times.
✗ Branch 69 → 97 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 63 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 61 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 99 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 97 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 63 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 61 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 99 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 97 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 63 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 61 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 99 not taken.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 97 not taken.
8 throw_err_block(2, err_file_offset_out_of_bounds, dec(offset).data(), fname.data());
271 }
272
273 22 unsigned char data[4] = { 0, 0, 0, 0 };
274
8/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 49 → 50 taken 7 times.
✗ Branch 49 → 64 not taken.
✓ Branch 76 → 77 taken 7 times.
✗ Branch 76 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 49 → 50 taken 2 times.
✗ Branch 49 → 64 not taken.
✓ Branch 76 → 77 taken 2 times.
✗ Branch 76 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 64 not taken.
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 101 not taken.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 49 → 50 taken 1 time.
✗ Branch 49 → 64 not taken.
✓ Branch 76 → 77 taken 1 time.
✗ Branch 76 → 101 not taken.
22 filesystem->read_file(fhandle->filehandle, data, offset, count);
275
276 22 int64_t value = 0;
277
16/16
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 52 → 51 taken 7 times.
✓ Branch 52 → 53 taken 7 times.
✓ Branch 85 → 79 taken 7 times.
✓ Branch 85 → 86 taken 7 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 52 → 51 taken 4 times.
✓ Branch 52 → 53 taken 2 times.
✓ Branch 85 → 79 taken 4 times.
✓ Branch 85 → 86 taken 2 times.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 52 → 51 taken 3 times.
✓ Branch 52 → 53 taken 1 time.
✓ Branch 85 → 79 taken 3 times.
✓ Branch 85 → 86 taken 1 time.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 52 → 51 taken 4 times.
✓ Branch 52 → 53 taken 1 time.
✓ Branch 85 → 79 taken 4 times.
✓ Branch 85 → 86 taken 1 time.
58 for(size_t i = 0; i < count; i++)
278 {
279
4/8
math_val (anonymous namespace)::fn_readfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 7 times.
math_val (anonymous namespace)::fn_readfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 4 times.
math_val (anonymous namespace)::fn_readfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 3 times.
math_val (anonymous namespace)::fn_readfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 4 times.
36 value |= data[i] << (8 * i);
280 }
281
282 22 return value;
283 32 }
284
285 template<unsigned int count>
286 14 math_val fn_canreadfile(const std::vector<math_val>& args) {
287 14 string fname;
288 14 int64_t length = count;
289 int64_t offset;
290 if(count == 0) {
291
2/4
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 29 not taken.
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 43 not taken.
4 assert_argc(args, 3);
292
4/8
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 29 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 29 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 43 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 43 not taken.
4 fname = args[0].get_str();
293
2/4
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 29 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 43 not taken.
4 offset = args[1].get_integer();
294
2/4
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 29 not taken.
✓ Branch 18 → 19 taken 2 times.
✗ Branch 18 → 43 not taken.
4 length = args[2].get_integer();
295 } else {
296
6/16
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 26 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 26 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 26 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 26 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 38 not taken.
10 assert_argc(args, 2);
297
12/32
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 26 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 38 not taken.
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 26 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 38 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 26 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 26 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 38 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 26 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 38 not taken.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 38 not taken.
10 fname = args[0].get_str();
298
6/16
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 26 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 26 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 26 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 38 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 26 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 38 not taken.
10 offset = args[1].get_integer();
299 }
300
301
16/40
math_val (anonymous namespace)::fn_canreadfile<0u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 28 not taken.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 26 not taken.
✓ Branch 21 → 22 taken 2 times.
✗ Branch 21 → 41 not taken.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 39 not taken.
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 25 not taken.
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 23 not taken.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 36 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 34 not taken.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 25 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 23 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 36 not taken.
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 34 not taken.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 25 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 23 not taken.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 36 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 34 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 25 not taken.
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 23 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 36 not taken.
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 34 not taken.
14 cachedfile * fhandle = opencachedfile(fname, false);
302
18/40
math_val (anonymous namespace)::fn_canreadfile<0u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 2 times.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 29 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 2 times.
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 15 not taken.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 16 taken 2 times.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 24 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 25 taken 2 times.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 15 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 1 time.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 24 not taken.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 1 time.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 25 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 15 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 1 time.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 24 not taken.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 1 time.
14 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) return (int64_t)0;
303
18/40
math_val (anonymous namespace)::fn_canreadfile<0u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 19 → 20 taken 2 times.
✗ Branch 19 → 21 not taken.
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 22 taken 1 time.
✓ Branch 30 → 31 taken 2 times.
✗ Branch 30 → 34 not taken.
✓ Branch 33 → 34 taken 1 time.
✓ Branch 33 → 35 taken 1 time.
math_val (anonymous namespace)::fn_canreadfile<1u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 2 times.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 29 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 2 times.
math_val (anonymous namespace)::fn_canreadfile<2u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 1 time.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 29 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 1 time.
math_val (anonymous namespace)::fn_canreadfile<3u>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 29 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
math_val (anonymous namespace)::fn_canreadfile<4u>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 18 not taken.
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 19 not taken.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 29 not taken.
✓ Branch 28 → 29 taken 1 time.
✗ Branch 28 → 30 not taken.
12 if (offset < 0 || offset + length > (int64_t)fhandle->filesize) return (int64_t)0;
304 8 return (int64_t)1;
305 14 }
306
307 10 math_val fn_min(math_val a, math_val b) {
308
5/11
✓ Branch 2 → 3 taken 5 times.
✗ Branch 2 → 21 not taken.
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 10 times.
✗ Branch 4 → 16 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 24 not taken.
✓ Branch 7 → 8 taken 5 times.
✗ Branch 7 → 22 not taken.
10 math_val cond = evaluate_binop(a, b, math_binop_type::comp_lt);
309
8/12
✓ Branch 7 → 8 taken 5 times.
✗ Branch 7 → 22 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 3 times.
✓ Branch 11 → 12 taken 5 times.
✗ Branch 11 → 22 not taken.
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 30 not taken.
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 15 taken 3 times.
✓ Branch 17 → 18 taken 5 times.
✗ Branch 17 → 30 not taken.
20 return cond.get_bool() ? a : b;
310 10 }
311 10 math_val fn_max(math_val a, math_val b) {
312
5/11
✓ Branch 2 → 3 taken 5 times.
✗ Branch 2 → 21 not taken.
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 10 times.
✗ Branch 4 → 16 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 24 not taken.
✓ Branch 7 → 8 taken 5 times.
✗ Branch 7 → 22 not taken.
10 math_val cond = evaluate_binop(a, b, math_binop_type::comp_gt);
313
8/12
✓ Branch 7 → 8 taken 5 times.
✗ Branch 7 → 22 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 10 taken 3 times.
✓ Branch 11 → 12 taken 5 times.
✗ Branch 11 → 22 not taken.
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 30 not taken.
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 15 taken 3 times.
✓ Branch 17 → 18 taken 5 times.
✗ Branch 17 → 30 not taken.
20 return cond.get_bool() ? a : b;
314 10 }
315 6 math_val fn_clamp(math_val val, math_val lo, math_val hi) {
316 // compute temp = min(hi, val)
317
5/11
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 21 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 18 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 16 not taken.
✗ Branch 4 → 32 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 28 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 26 not taken.
6 math_val temp = fn_min(hi, val);
318
6/12
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 27 not taken.
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 24 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 22 not taken.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 40 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 36 not taken.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 34 not taken.
15 return fn_max(lo, temp);
319 6 }
320
321 6 math_val fn_round(math_val val, math_val precision) {
322 // i used to hate the float->str->float approach, but the
323 // alternatives do end up quite messy if implemented properly
324
4/13
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 10 not taken.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 10 not taken.
✗ Branch 3 → 11 not taken.
✗ Branch 3 → 15 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 10 not taken.
✗ Branch 4 → 11 not taken.
✗ Branch 4 → 15 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 15 not taken.
6 string as_str = ftostrvar(val.get_double(), precision.get_integer());
325
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 3 times.
6 double res = std::atof(as_str);
326 12 return res;
327 6 }
328 10 math_val fn_isdefined(math_val defname) {
329 10 return (int64_t)defines.exists(defname.get_str());
330 }
331
332 2 math_val fn_filesize(math_val fname) {
333
3/7
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 21 not taken.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 21 not taken.
✗ Branch 3 → 29 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 29 not taken.
2 string name = fname.get_str();
334
4/8
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 18 not taken.
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 16 not taken.
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 25 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 23 not taken.
2 cachedfile * fhandle = opencachedfile(name, false);
335
4/8
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 12 taken 1 time.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 1 time.
2 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE)
336 throw_vfile_error(2, asar_get_last_io_error(), name.data());
337 4 return (int64_t)fhandle->filesize;
338 2 }
339
340 12 math_val fn_filestatus(math_val fname) {
341
4/10
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 16 not taken.
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 16 not taken.
✗ Branch 3 → 21 not taken.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 14 not taken.
✗ Branch 4 → 21 not taken.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 19 not taken.
12 cachedfile * fhandle = opencachedfile(fname.get_str(), false);
342
6/8
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 8 not taken.
✓ Branch 7 → 8 taken 3 times.
✓ Branch 7 → 12 taken 3 times.
✓ Branch 8 → 9 taken 6 times.
✗ Branch 8 → 12 not taken.
✓ Branch 11 → 12 taken 3 times.
✓ Branch 11 → 17 taken 3 times.
12 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) {
343
2/4
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 11 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 16 not taken.
6 if (filesystem->get_last_error() == vfe_doesnt_exist)
344 6 return (int64_t)1;
345 else return (int64_t)2;
346 }
347 6 return (int64_t)0;
348 }
349
350 364 math_val fn_sizeof(math_val val) {
351
3/7
✓ Branch 2 → 3 taken 182 times.
✗ Branch 2 → 38 not taken.
✓ Branch 3 → 4 taken 364 times.
✗ Branch 3 → 38 not taken.
✗ Branch 3 → 46 not taken.
✓ Branch 4 → 5 taken 182 times.
✗ Branch 4 → 46 not taken.
364 string symbol = val.get_identifier();
352 // TODO: do we have a better spot where to parse this...?
353
4/4
✓ Branch 5 → 6 taken 176 times.
✓ Branch 5 → 15 taken 6 times.
✓ Branch 6 → 7 taken 176 times.
✓ Branch 6 → 18 taken 6 times.
364 if(symbol == "..."){
354
7/9
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 10 taken 175 times.
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 176 times.
✗ Branch 7 → 36 not taken.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 13 taken 175 times.
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 44 not taken.
352 if(!inmacro) throw_err_block(2, err_vararg_sizeof_nomacro);
355
6/8
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 14 taken 173 times.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 36 not taken.
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 17 taken 173 times.
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 44 not taken.
350 if(numvarargs == -1) throw_err_block(2, err_macro_not_varadic, "sizeof(...)");
356 346 return (int64_t)numvarargs;
357 }
358
10/18
✓ Branch 15 → 16 taken 5 times.
✓ Branch 15 → 20 taken 1 time.
✓ Branch 17 → 18 taken 5 times.
✗ Branch 17 → 36 not taken.
✓ Branch 18 → 19 taken 5 times.
✓ Branch 18 → 20 taken 5 times.
✓ Branch 18 → 24 taken 1 time.
✓ Branch 21 → 22 taken 5 times.
✓ Branch 21 → 26 taken 6 times.
✗ Branch 21 → 44 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 5 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 36 not taken.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 30 taken 6 times.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 44 not taken.
12 if(pass && !structs.exists(symbol)) throw_err_block(2, err_struct_not_found, symbol.data());
359
4/8
✓ Branch 27 → 28 taken 6 times.
✗ Branch 27 → 36 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 6 times.
✓ Branch 32 → 33 taken 6 times.
✗ Branch 32 → 44 not taken.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 35 taken 6 times.
12 else if(!structs.exists(symbol)) return (int64_t)0;
360
2/4
✓ Branch 31 → 32 taken 6 times.
✗ Branch 31 → 36 not taken.
✓ Branch 37 → 38 taken 6 times.
✗ Branch 37 → 44 not taken.
12 return (int64_t)structs.find(symbol).struct_size;
361 364 }
362
363 28 math_val fn_objectsize(math_val val) {
364
3/7
✓ Branch 2 → 3 taken 14 times.
✗ Branch 2 → 27 not taken.
✓ Branch 3 → 4 taken 28 times.
✗ Branch 3 → 27 not taken.
✗ Branch 3 → 33 not taken.
✓ Branch 4 → 5 taken 14 times.
✗ Branch 4 → 33 not taken.
28 string symbol = val.get_identifier();
365
10/19
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 9 taken 2 times.
✓ Branch 5 → 6 taken 12 times.
✓ Branch 5 → 11 taken 2 times.
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 25 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 12 times.
✓ Branch 8 → 9 taken 12 times.
✗ Branch 8 → 31 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 12 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 15 taken 14 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 17 taken 14 times.
✗ Branch 12 → 25 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 31 not taken.
28 if(pass && !structs.exists(symbol)) throw_err_block(2, err_struct_not_found, symbol.data());
366
4/8
✓ Branch 16 → 17 taken 14 times.
✗ Branch 16 → 25 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 14 times.
✓ Branch 19 → 20 taken 14 times.
✗ Branch 19 → 31 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 14 times.
28 else if(!structs.exists(symbol)) return (int64_t)0;
367
2/4
✓ Branch 20 → 21 taken 14 times.
✗ Branch 20 → 25 not taken.
✓ Branch 24 → 25 taken 14 times.
✗ Branch 24 → 31 not taken.
28 return (int64_t)structs.find(symbol).object_size;
368 28 }
369
370 12 math_val fn_datasize(math_val val) {
371
5/7
✓ Branch 2 → 3 taken 5 times.
✓ Branch 2 → 35 taken 1 time.
✓ Branch 3 → 4 taken 10 times.
✗ Branch 3 → 35 not taken.
✓ Branch 3 → 44 taken 1 time.
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 44 not taken.
12 string name = val.get_identifier();
372 int label;
373
8/19
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 5 times.
✗ Branch 5 → 11 not taken.
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 33 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 5 times.
✓ Branch 8 → 9 taken 5 times.
✗ Branch 8 → 42 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 5 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 15 taken 5 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 17 taken 5 times.
✗ Branch 12 → 33 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 42 not taken.
10 if(pass && !labels.exists(name)) throw_err_block(2, err_label_not_found, name.data());
374
4/8
✓ Branch 16 → 17 taken 5 times.
✗ Branch 16 → 33 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 5 times.
✓ Branch 19 → 20 taken 5 times.
✗ Branch 19 → 42 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 5 times.
10 else if(!labels.exists(name)) return (int64_t)0;
375
2/4
✓ Branch 20 → 21 taken 5 times.
✗ Branch 20 → 33 not taken.
✓ Branch 24 → 25 taken 5 times.
✗ Branch 24 → 42 not taken.
10 snes_label label_data = labels.find(name);
376
377 10 label = label_data.id;
378 10 snes_label selected_label;
379 10 selected_label.id = 0xFFFFFF;
380 10 selected_label.pos = 0xFFFFFF;
381 10 labels.each([&selected_label, label](const char *key, snes_label current_label){
382
6/8
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 5 taken 11 times.
✓ Branch 3 → 4 taken 4 times.
✗ Branch 3 → 5 not taken.
✓ Branch 4 → 5 taken 4 times.
✓ Branch 4 → 12 taken 11 times.
✓ Branch 8 → 9 taken 4 times.
✗ Branch 8 → 12 not taken.
30 if(label < current_label.id && current_label.id < selected_label.id){
383 8 selected_label = current_label;
384 }
385 30 });
386
6/8
✓ Branch 23 → 24 taken 2 times.
✓ Branch 23 → 26 taken 3 times.
✓ Branch 25 → 26 taken 2 times.
✗ Branch 25 → 33 not taken.
✓ Branch 31 → 32 taken 2 times.
✓ Branch 31 → 34 taken 3 times.
✓ Branch 33 → 34 taken 2 times.
✗ Branch 33 → 42 not taken.
10 if(selected_label.id == 0xFFFFFF) throw_warning(2, warn_datasize_last_label, name.data());
387
6/8
✓ Branch 26 → 27 taken 2 times.
✓ Branch 26 → 29 taken 3 times.
✓ Branch 28 → 29 taken 2 times.
✗ Branch 28 → 33 not taken.
✓ Branch 34 → 35 taken 2 times.
✓ Branch 34 → 37 taken 3 times.
✓ Branch 36 → 37 taken 2 times.
✗ Branch 36 → 42 not taken.
10 if(selected_label.pos-label_data.pos > 0xFFFF) throw_warning(2, warn_datasize_exceeds_size, name.data());
388 10 return (int64_t)(selected_label.pos-label_data.pos);
389 10 }
390
391 template<string (*inner)(math_val, int), int defaultprec = 0>
392 45 math_val fn_fmt_num(const std::vector<math_val>& args) {
393
24/48
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 7 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 7 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 7 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 7 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 7 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 7 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 5 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 5 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 5 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 4 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 4 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 5 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 4 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 7 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 5 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 7 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 5 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 7 times.
45 if(args.size() < 1 || args.size() > 2) {
394 throw_err_block(2, err_argument_count, 3, (int)args.size());
395 }
396
8/16
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 7 times.
✗ Branch 14 → 42 not taken.
✓ Branch 20 → 21 taken 7 times.
✗ Branch 20 → 57 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 5 times.
✗ Branch 14 → 42 not taken.
✓ Branch 20 → 21 taken 5 times.
✗ Branch 20 → 57 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 4 times.
✗ Branch 14 → 42 not taken.
✓ Branch 20 → 21 taken 5 times.
✗ Branch 20 → 57 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 14 → 15 taken 5 times.
✗ Branch 14 → 42 not taken.
✓ Branch 20 → 21 taken 7 times.
✗ Branch 20 → 57 not taken.
45 math_val num = args[0];
397
23/32
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 20 taken 6 times.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 40 not taken.
✓ Branch 23 → 24 taken 1 time.
✓ Branch 23 → 29 taken 6 times.
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 55 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 4 times.
✓ Branch 16 → 20 taken 1 time.
✓ Branch 18 → 19 taken 4 times.
✗ Branch 18 → 40 not taken.
✓ Branch 23 → 24 taken 4 times.
✓ Branch 23 → 29 taken 1 time.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 55 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 4 times.
✗ Branch 16 → 20 not taken.
✓ Branch 18 → 19 taken 4 times.
✗ Branch 18 → 40 not taken.
✓ Branch 23 → 24 taken 4 times.
✓ Branch 23 → 29 taken 1 time.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 55 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 16 → 17 taken 4 times.
✓ Branch 16 → 20 taken 1 time.
✓ Branch 18 → 19 taken 4 times.
✗ Branch 18 → 40 not taken.
✓ Branch 23 → 24 taken 4 times.
✓ Branch 23 → 29 taken 3 times.
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 55 not taken.
45 int64_t prec = args.size() == 2 ? args[1].get_integer() : defaultprec;
398
8/16
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 7 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 7 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 5 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 4 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 5 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 7 times.
45 if (prec < 0) prec = 0;
399
8/16
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 7 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 7 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 5 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 4 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 5 times.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 5 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 7 times.
45 if (prec > 64) prec = 64;
400
12/24
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_double, 5>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 27 → 28 taken 7 times.
✗ Branch 27 → 34 not taken.
✓ Branch 36 → 37 taken 7 times.
✗ Branch 36 → 51 not taken.
✓ Branch 38 → 39 taken 7 times.
✗ Branch 38 → 47 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_bin, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 27 → 28 taken 5 times.
✗ Branch 27 → 34 not taken.
✓ Branch 36 → 37 taken 5 times.
✗ Branch 36 → 51 not taken.
✓ Branch 38 → 39 taken 5 times.
✗ Branch 38 → 47 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_dec, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 27 → 28 taken 4 times.
✗ Branch 27 → 34 not taken.
✓ Branch 36 → 37 taken 5 times.
✗ Branch 36 → 51 not taken.
✓ Branch 38 → 39 taken 5 times.
✗ Branch 38 → 47 not taken.
math_val (anonymous namespace)::fn_fmt_num<&(anonymous namespace)::fmt_hex, 0>(std::vector<math_val, std::allocator<math_val> > const&):
✓ Branch 27 → 28 taken 5 times.
✗ Branch 27 → 34 not taken.
✓ Branch 36 → 37 taken 7 times.
✗ Branch 36 → 51 not taken.
✓ Branch 38 → 39 taken 7 times.
✗ Branch 38 → 47 not taken.
183 return inner(num, prec);
401 24 }
402
403 10 string fmt_bin(math_val value, int precision) {
404
1/3
✓ Branch 2 → 3 taken 10 times.
✗ Branch 2 → 22 not taken.
✗ Branch 2 → 34 not taken.
10 int64_t num = value.get_integer();
405 5 char buffer[65];
406 10 string out;
407
4/4
✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 8 taken 4 times.
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 9 taken 4 times.
10 if (num < 0) {
408
2/4
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 20 not taken.
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 32 not taken.
2 out += '-';
409 2 num = -num;
410 // decrement precision because we've output one char already
411 2 precision -= 1;
412
2/4
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 8 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 9 not taken.
2 if (precision<0) precision = 0;
413 }
414
4/4
✓ Branch 10 → 9 taken 320 times.
✓ Branch 10 → 11 taken 5 times.
✓ Branch 18 → 10 taken 320 times.
✓ Branch 18 → 19 taken 5 times.
650 for (int j = 0; j < 64; j++) {
415
2/4
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 320 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 320 times.
640 buffer[63 - j] = '0' + ((num & (1ull << j)) >> j);
416 }
417 10 buffer[64] = 0;
418 10 int startidx = 0;
419
8/8
✓ Branch 13 → 14 taken 288 times.
✓ Branch 13 → 15 taken 4 times.
✓ Branch 14 → 12 taken 287 times.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 21 → 22 taken 288 times.
✓ Branch 21 → 26 taken 4 times.
✓ Branch 25 → 20 taken 287 times.
✓ Branch 25 → 26 taken 1 time.
584 while (startidx < 64 - precision && buffer[startidx] == '0') startidx++;
420
2/4
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 5 times.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 5 times.
10 if (startidx == 64) startidx--; // always want to print at least one digit
421
2/4
✓ Branch 17 → 18 taken 5 times.
✗ Branch 17 → 20 not taken.
✓ Branch 29 → 30 taken 5 times.
✗ Branch 29 → 32 not taken.
10 out += (buffer + startidx);
422 10 return out;
423 }
424
425 9 string fmt_dec(math_val value, int precision) {
426
1/4
✓ Branch 2 → 3 taken 9 times.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 8 not taken.
✗ Branch 2 → 10 not taken.
9 int64_t num = value.get_integer();
427 5 char buffer[66];
428
2/4
✓ Branch 3 → 4 taken 4 times.
✗ Branch 3 → 8 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 5 times.
9 snprintf(buffer, 66, "%0*" PRId64, precision, num);
429
2/6
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 7 not taken.
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 10 not taken.
18 return string(buffer);
430 }
431
432 12 string fmt_hex(math_val value, int precision) {
433
1/4
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 7 not taken.
✗ Branch 2 → 8 not taken.
✗ Branch 2 → 10 not taken.
12 int64_t num = value.get_integer();
434 7 char buffer[66];
435
2/4
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 8 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 7 times.
12 snprintf(buffer, 66, "%0*" PRIX64, precision, num);
436
2/6
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 7 not taken.
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 7 times.
✗ Branch 6 → 10 not taken.
24 return string(buffer);
437 }
438
439 14 string fmt_double(math_val value, int precision) {
440 14 return ftostrvar(value.get_double(), precision);
441 }
442
443 } // namespace
444
445 581 void closecachedfiles()
446 {
447
4/4
✓ Branch 10 → 3 taken 4144 times.
✓ Branch 10 → 11 taken 259 times.
✓ Branch 26 → 3 taken 5152 times.
✓ Branch 26 → 27 taken 322 times.
9877 for (int i = 0; i < numcachedfiles; i++)
448 {
449
5/6
✓ Branch 3 → 4 taken 5 times.
✓ Branch 3 → 9 taken 4139 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 5152 times.
✓ Branch 6 → 7 taken 5 times.
✓ Branch 6 → 25 taken 5147 times.
9296 if (cachedfiles[i].used)
450 {
451
4/8
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 5 times.
✗ Branch 5 → 8 not taken.
✓ Branch 10 → 11 taken 5 times.
✗ Branch 10 → 21 not taken.
✓ Branch 11 → 12 taken 5 times.
✗ Branch 11 → 21 not taken.
10 if (cachedfiles[i].filehandle != INVALID_VIRTUAL_FILE_HANDLE && filesystem)
452 {
453 10 filesystem->close_file(cachedfiles[i].filehandle);
454 10 cachedfiles[i].filehandle = INVALID_VIRTUAL_FILE_HANDLE;
455 }
456
457 10 cachedfiles[i].used = false;
458 }
459 }
460
461 581 cachedfileindex = 0;
462 581 }
463
464 const std::unordered_map<string, math_builtin_function> builtin_functions = {
465 { "sqrt", fn_unary_real<sqrt> },
466 { "sin", fn_unary_real<sin> },
467 { "cos", fn_unary_real<cos> },
468 { "tan", fn_unary_real<tan> },
469 { "asin", fn_unary_real<asin> },
470 { "acos", fn_unary_real<acos> },
471 { "atan", fn_unary_real<atan> },
472 { "arcsin", fn_unary_real<asin> },
473 { "arccos", fn_unary_real<acos> },
474 { "arctan", fn_unary_real<atan> },
475 { "log", fn_unary_real<log> },
476 { "log10", fn_unary_real<log10> },
477 { "log2", fn_unary_real<log2> },
478
479 { "ceil", fn_rounding<ceil> },
480 { "floor", fn_rounding<floor> },
481
482 { "read1", fn_read<1> }, //This handles the safe and unsafe variant
483 { "read2", fn_read<2> },
484 { "read3", fn_read<3> },
485 { "read4", fn_read<4> },
486 { "canread", fn_canread<0> },
487 { "canread1", fn_canread<1> },
488 { "canread2", fn_canread<2> },
489 { "canread3", fn_canread<3> },
490 { "canread4", fn_canread<4> },
491
492 { "readfile1", fn_readfile<1> },
493 { "readfile2", fn_readfile<2> },
494 { "readfile3", fn_readfile<3> },
495 { "readfile4", fn_readfile<4> },
496 { "canreadfile", fn_canreadfile<0> },
497 { "canreadfile1", fn_canreadfile<1> },
498 { "canreadfile2", fn_canreadfile<2> },
499 { "canreadfile3", fn_canreadfile<3> },
500 { "canreadfile4", fn_canreadfile<4> },
501
502 { "filesize", fixed_arity<fn_filesize> },
503 { "getfilestatus", fixed_arity<fn_filestatus> },
504
505 { "defined", fixed_arity<fn_isdefined> },
506
507 { "snestopc", fixed_arity<fn_snes_pc<snestopc>> },
508 { "pctosnes", fixed_arity<fn_snes_pc<pctosnes>> },
509 { "realbase", { fixed_arity<fn_pc_realbase<realsnespos>>, haslabel_always, getlen_pc_realbase<realsnespos> } },
510 { "pc", { fixed_arity<fn_pc_realbase<snespos>>, haslabel_always, getlen_pc_realbase<snespos> } },
511
512 { "max", fixed_arity<fn_max> },
513 { "min", fixed_arity<fn_min> },
514 { "clamp", fixed_arity<fn_clamp> },
515
516 { "safediv", fixed_arity<fn_safediv> },
517
518 { "select", fixed_arity<fn_select> },
519 { "bank", { fixed_arity<fn_bank>, getlen_bank } },
520 { "not", fixed_arity<fn_not> },
521 { "equal", math_binop_function<math_binop_type::comp_eq> },
522 { "notequal", math_binop_function<math_binop_type::comp_ne> },
523 { "less", math_binop_function<math_binop_type::comp_lt> },
524 { "lessequal", math_binop_function<math_binop_type::comp_le> },
525 { "greater", math_binop_function<math_binop_type::comp_gt> },
526 { "greaterequal", math_binop_function<math_binop_type::comp_ge> },
527
528 { "and", math_bool_binop_function<fn_and> },
529 { "or", math_bool_binop_function<fn_or> },
530 { "nand", math_bool_binop_function<fn_nand> },
531 { "nor", math_bool_binop_function<fn_nor> },
532 { "xor", math_bool_binop_function<fn_xor> },
533
534 { "round", fixed_arity<fn_round> },
535
536 { "sizeof", fixed_arity<fn_sizeof> },
537 { "objectsize", fixed_arity<fn_objectsize> },
538 { "datasize", { fixed_arity<fn_datasize>, haslabel_always } },
539
540 { "stringsequal", fixed_arity<fn_str_eq<strcmp>> },
541 { "stringsequalnocase", fixed_arity<fn_str_eq<stricmp>> },
542 { "char", fixed_arity<fn_char> },
543 { "stringlength", fixed_arity<fn_strlen> },
544
545 { "bin", fn_fmt_num<fmt_bin> },
546 { "dec", fn_fmt_num<fmt_dec> },
547 { "hex", fn_fmt_num<fmt_hex> },
548 { "double", fn_fmt_num<fmt_double, 5> },
549
10/15
✓ Branch 4 → 5 taken 7 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 9 taken 10 times.
✓ Branch 7 → 8 taken 7 times.
✓ Branch 7 → 11 taken 5 times.
✗ Branch 7 → 15 not taken.
✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 12 taken 5 times.
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 38 not taken.
✓ Branch 26 → 27 taken 21 times.
✗ Branch 26 → 36 not taken.
✓ Branch 37 → 38 taken 24 times.
✗ Branch 37 → 49 not taken.
370 };
550