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

dedicate-project / beast / 49939c40-5d31-48c2-8363-71719028ff1b

pending completion
49939c40-5d31-48c2-8363-71719028ff1b

Pull #9

circleci

fairlight1337
Made the right-click menu on the frontend a bit nicer
Pull Request #9: Adding pipeline applications

1399 of 1399 new or added lines in 23 files covered. (100.0%)

2922 of 3244 relevant lines covered (90.07%)

15773.93 hits per line

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

99.46
/src/program.cpp
1
#include <beast/program.hpp>
2

3
// Standard
4
#include <cstring>
5
#include <stdexcept>
6

7
namespace beast {
8

9
Program::Program(uint32_t space) : data_(space, 0x00), grows_dynamically_{false} {}
1,907✔
10

11
Program::Program(std::vector<unsigned char> data)
5,941✔
12
    : data_{std::move(data)}, grows_dynamically_{false} {}
5,941✔
13

14
size_t Program::getSize() const noexcept { return data_.size(); }
1,177,680✔
15

16
int32_t Program::getData4(int32_t offset) {
113,105✔
17
  if ((offset + 4) > getSize()) {
113,105✔
18
    throw std::underflow_error("Unable to retrieve data (not enough data left).");
9✔
19
  }
20

21
  int32_t buffer = 0x0;
113,096✔
22
  std::memcpy(&buffer, &data_[offset], 4);
113,096✔
23
  return buffer;
113,096✔
24
}
25

26
int16_t Program::getData2(int32_t offset) {
169✔
27
  if ((offset + 2) > getSize()) {
169✔
28
    throw std::underflow_error("Unable to retrieve data (not enough data left).");
1✔
29
  }
30

31
  int16_t buffer = 0x0;
168✔
32
  std::memcpy(&buffer, &data_[offset], 2);
168✔
33
  return buffer;
168✔
34
}
35

36
int8_t Program::getData1(int32_t offset) {
215,415✔
37
  if ((offset + 1) > getSize()) {
215,415✔
38
    throw std::underflow_error("Unable to retrieve data (not enough data left).");
8✔
39
  }
40

41
  int8_t buffer = 0x0;
215,407✔
42
  std::memcpy(&buffer, &data_[offset], 1);
215,407✔
43
  return buffer;
215,407✔
44
}
45

46
uint32_t Program::getPointer() const noexcept { return pointer_; }
249,819✔
47

48
void Program::insertProgram(const Program& other) {
247,961✔
49
  const size_t to_fit = other.getSize();
247,961✔
50
  if (!canFit(static_cast<uint32_t>(to_fit))) {
247,961✔
51
    throw std::overflow_error("Unable to fit other program into program.");
1✔
52
  }
53
  for (uint32_t idx = 0; idx < to_fit; ++idx) {
2,904,880✔
54
    data_[pointer_ + idx] = other.getData()[idx];
2,656,920✔
55
  }
56
  pointer_ += static_cast<uint32_t>(to_fit);
247,960✔
57
}
247,960✔
58

59
const std::vector<unsigned char>& Program::getData() const noexcept { return data_; }
2,657,780✔
60

61
std::vector<unsigned char> Program::extractData() noexcept { return std::move(data_); }
10✔
62

63
void Program::noop() { appendCode1(OpCode::NoOp); }
3,322✔
64

65
void Program::declareVariable(int32_t variable_index, VariableType variable_type) {
3,355✔
66
  appendCode1(OpCode::DeclareVariable);
3,355✔
67
  appendData4(variable_index);
3,355✔
68
  appendData1(static_cast<int8_t>(variable_type));
3,355✔
69
}
3,355✔
70

71
void Program::setVariable(int32_t variable_index, int32_t content, bool follow_links) {
3,422✔
72
  appendCode1(OpCode::SetVariable);
3,422✔
73
  appendData4(variable_index);
3,422✔
74
  appendFlag1(follow_links);
3,422✔
75
  appendData4(content);
3,422✔
76
}
3,422✔
77

78
void Program::undeclareVariable(int32_t variable_index) {
3,284✔
79
  appendCode1(OpCode::UndeclareVariable);
3,284✔
80
  appendData4(variable_index);
3,284✔
81
}
3,284✔
82

83
void Program::addConstantToVariable(int32_t variable_index, int32_t constant, bool follow_links) {
3,293✔
84
  appendCode1(OpCode::AddConstantToVariable);
3,293✔
85
  appendData4(variable_index);
3,293✔
86
  appendFlag1(follow_links);
3,293✔
87
  appendData4(constant);
3,293✔
88
}
3,293✔
89

90
void Program::addVariableToVariable(int32_t source_variable_index, bool follow_source_links,
3,278✔
91
                                    int32_t destination_variable_index,
92
                                    bool follow_destination_links) {
93
  appendCode1(OpCode::AddVariableToVariable);
3,278✔
94
  appendData4(source_variable_index);
3,278✔
95
  appendFlag1(follow_source_links);
3,278✔
96
  appendData4(destination_variable_index);
3,278✔
97
  appendFlag1(follow_destination_links);
3,278✔
98
}
3,278✔
99

100
void Program::subtractConstantFromVariable(int32_t variable_index, int32_t constant,
3,213✔
101
                                           bool follow_links) {
102
  appendCode1(OpCode::SubtractConstantFromVariable);
3,213✔
103
  appendData4(variable_index);
3,213✔
104
  appendFlag1(follow_links);
3,213✔
105
  appendData4(constant);
3,213✔
106
}
3,213✔
107

108
void Program::subtractVariableFromVariable(int32_t source_variable_index, bool follow_source_links,
3,275✔
109
                                           int32_t destination_variable_index,
110
                                           bool follow_destination_links) {
111
  appendCode1(OpCode::SubtractVariableFromVariable);
3,275✔
112
  appendData4(source_variable_index);
3,275✔
113
  appendFlag1(follow_source_links);
3,275✔
114
  appendData4(destination_variable_index);
3,275✔
115
  appendFlag1(follow_destination_links);
3,275✔
116
}
3,275✔
117

118
void Program::relativeJumpToVariableAddressIfVariableGreaterThanZero(
3,227✔
119
    int32_t variable_index, bool follow_links, int32_t relative_jump_address_variable_index,
120
    bool follow_addr_links) {
121
  appendCode1(OpCode::RelativeJumpToVariableAddressIfVariableGt0);
3,227✔
122
  appendData4(variable_index);
3,227✔
123
  appendFlag1(follow_links);
3,227✔
124
  appendData4(relative_jump_address_variable_index);
3,227✔
125
  appendFlag1(follow_addr_links);
3,227✔
126
}
3,227✔
127

128
void Program::relativeJumpToVariableAddressIfVariableLessThanZero(
3,220✔
129
    int32_t variable_index, bool follow_links, int32_t relative_jump_address_variable_index,
130
    bool follow_addr_links) {
131
  appendCode1(OpCode::RelativeJumpToVariableAddressIfVariableLt0);
3,220✔
132
  appendData4(variable_index);
3,220✔
133
  appendFlag1(follow_links);
3,220✔
134
  appendData4(relative_jump_address_variable_index);
3,220✔
135
  appendFlag1(follow_addr_links);
3,220✔
136
}
3,220✔
137

138
void Program::relativeJumpToVariableAddressIfVariableEqualsZero(
3,299✔
139
    int32_t variable_index, bool follow_links, int32_t relative_jump_address_variable_index,
140
    bool follow_addr_links) {
141
  appendCode1(OpCode::RelativeJumpToVariableAddressIfVariableEq0);
3,299✔
142
  appendData4(variable_index);
3,299✔
143
  appendFlag1(follow_links);
3,299✔
144
  appendData4(relative_jump_address_variable_index);
3,299✔
145
  appendFlag1(follow_addr_links);
3,299✔
146
}
3,299✔
147

148
void Program::absoluteJumpToVariableAddressIfVariableGreaterThanZero(
3,188✔
149
    int32_t variable_index, bool follow_links, int32_t absolute_jump_address_variable_index,
150
    bool follow_addr_links) {
151
  appendCode1(OpCode::AbsoluteJumpToVariableAddressIfVariableGt0);
3,188✔
152
  appendData4(variable_index);
3,188✔
153
  appendFlag1(follow_links);
3,188✔
154
  appendData4(absolute_jump_address_variable_index);
3,188✔
155
  appendFlag1(follow_addr_links);
3,188✔
156
}
3,188✔
157

158
void Program::absoluteJumpToVariableAddressIfVariableLessThanZero(
3,289✔
159
    int32_t variable_index, bool follow_links, int32_t absolute_jump_address_variable_index,
160
    bool follow_addr_links) {
161
  appendCode1(OpCode::AbsoluteJumpToVariableAddressIfVariableLt0);
3,289✔
162
  appendData4(variable_index);
3,289✔
163
  appendFlag1(follow_links);
3,289✔
164
  appendData4(absolute_jump_address_variable_index);
3,289✔
165
  appendFlag1(follow_addr_links);
3,289✔
166
}
3,289✔
167

168
void Program::absoluteJumpToVariableAddressIfVariableEqualsZero(
3,354✔
169
    int32_t variable_index, bool follow_links, int32_t absolute_jump_address_variable_index,
170
    bool follow_addr_links) {
171
  appendCode1(OpCode::AbsoluteJumpToVariableAddressIfVariableEq0);
3,354✔
172
  appendData4(variable_index);
3,354✔
173
  appendFlag1(follow_links);
3,354✔
174
  appendData4(absolute_jump_address_variable_index);
3,354✔
175
  appendFlag1(follow_addr_links);
3,354✔
176
}
3,354✔
177

178
void Program::relativeJumpToAddressIfVariableGreaterThanZero(int32_t variable_index,
3,175✔
179
                                                             bool follow_links,
180
                                                             int32_t relative_jump_address) {
181
  appendCode1(OpCode::RelativeJumpIfVariableGt0);
3,175✔
182
  appendData4(variable_index);
3,175✔
183
  appendFlag1(follow_links);
3,175✔
184
  appendData4(relative_jump_address);
3,175✔
185
}
3,175✔
186

187
void Program::relativeJumpToAddressIfVariableLessThanZero(int32_t variable_index, bool follow_links,
3,200✔
188
                                                          int32_t relative_jump_address) {
189
  appendCode1(OpCode::RelativeJumpIfVariableLt0);
3,200✔
190
  appendData4(variable_index);
3,200✔
191
  appendFlag1(follow_links);
3,200✔
192
  appendData4(relative_jump_address);
3,200✔
193
}
3,200✔
194

195
void Program::relativeJumpToAddressIfVariableEqualsZero(int32_t variable_index, bool follow_links,
3,169✔
196
                                                        int32_t relative_jump_address) {
197
  appendCode1(OpCode::RelativeJumpIfVariableEq0);
3,169✔
198
  appendData4(variable_index);
3,169✔
199
  appendFlag1(follow_links);
3,169✔
200
  appendData4(relative_jump_address);
3,169✔
201
}
3,169✔
202

203
void Program::absoluteJumpToAddressIfVariableGreaterThanZero(int32_t variable_index,
3,270✔
204
                                                             bool follow_links,
205
                                                             int32_t absolute_jump_address) {
206
  appendCode1(OpCode::AbsoluteJumpIfVariableGt0);
3,270✔
207
  appendData4(variable_index);
3,270✔
208
  appendFlag1(follow_links);
3,270✔
209
  appendData4(absolute_jump_address);
3,270✔
210
}
3,270✔
211

212
void Program::absoluteJumpToAddressIfVariableLessThanZero(int32_t variable_index, bool follow_links,
3,306✔
213
                                                          int32_t absolute_jump_address) {
214
  appendCode1(OpCode::AbsoluteJumpIfVariableLt0);
3,306✔
215
  appendData4(variable_index);
3,306✔
216
  appendFlag1(follow_links);
3,306✔
217
  appendData4(absolute_jump_address);
3,306✔
218
}
3,306✔
219

220
void Program::absoluteJumpToAddressIfVariableEqualsZero(int32_t variable_index, bool follow_links,
3,264✔
221
                                                        int32_t absolute_jump_address) {
222
  appendCode1(OpCode::AbsoluteJumpIfVariableEq0);
3,264✔
223
  appendData4(variable_index);
3,264✔
224
  appendFlag1(follow_links);
3,264✔
225
  appendData4(absolute_jump_address);
3,264✔
226
}
3,264✔
227

228
void Program::loadMemorySizeIntoVariable(int32_t variable_index, bool follow_links) {
3,313✔
229
  appendCode1(OpCode::LoadMemorySizeIntoVariable);
3,313✔
230
  appendData4(variable_index);
3,313✔
231
  appendFlag1(follow_links);
3,313✔
232
}
3,313✔
233

234
void Program::checkIfVariableIsInput(int32_t source_variable_index, bool follow_source_links,
3,241✔
235
                                     int32_t destination_variable_index,
236
                                     bool follow_destination_links) {
237
  appendCode1(OpCode::CheckIfVariableIsInput);
3,241✔
238
  appendData4(source_variable_index);
3,241✔
239
  appendFlag1(follow_source_links);
3,241✔
240
  appendData4(destination_variable_index);
3,241✔
241
  appendFlag1(follow_destination_links);
3,241✔
242
}
3,241✔
243

244
void Program::checkIfVariableIsOutput(int32_t source_variable_index, bool follow_source_links,
3,291✔
245
                                      int32_t destination_variable_index,
246
                                      bool follow_destination_links) {
247
  appendCode1(OpCode::CheckIfVariableIsOutput);
3,291✔
248
  appendData4(source_variable_index);
3,291✔
249
  appendFlag1(follow_source_links);
3,291✔
250
  appendData4(destination_variable_index);
3,291✔
251
  appendFlag1(follow_destination_links);
3,291✔
252
}
3,291✔
253

254
void Program::loadInputCountIntoVariable(int32_t variable_index, bool follow_links) {
3,165✔
255
  appendCode1(OpCode::LoadInputCountIntoVariable);
3,165✔
256
  appendData4(variable_index);
3,165✔
257
  appendFlag1(follow_links);
3,165✔
258
}
3,165✔
259

260
void Program::loadOutputCountIntoVariable(int32_t variable_index, bool follow_links) {
3,244✔
261
  appendCode1(OpCode::LoadOutputCountIntoVariable);
3,244✔
262
  appendData4(variable_index);
3,244✔
263
  appendFlag1(follow_links);
3,244✔
264
}
3,244✔
265

266
void Program::loadCurrentAddressIntoVariable(int32_t variable_index, bool follow_links) {
3,247✔
267
  appendCode1(OpCode::LoadCurrentAddressIntoVariable);
3,247✔
268
  appendData4(variable_index);
3,247✔
269
  appendFlag1(follow_links);
3,247✔
270
}
3,247✔
271

272
void Program::printVariable(int32_t variable_index, bool follow_links, bool as_char) {
3,244✔
273
  appendCode1(OpCode::PrintVariable);
3,244✔
274
  appendData4(variable_index);
3,244✔
275
  appendFlag1(follow_links);
3,244✔
276
  appendFlag1(as_char);
3,244✔
277
}
3,244✔
278

279
void Program::setStringTableEntry(int32_t string_table_index, const std::string& string) {
3,283✔
280
  if (!canFit(static_cast<uint32_t>(3 + string.size()))) {
3,283✔
281
    throw std::overflow_error("Unable to fit instruction into program.");
1✔
282
  }
283

284
  appendCode1(OpCode::SetStringTableEntry);
3,282✔
285
  appendData4(string_table_index);
3,282✔
286
  appendData2(static_cast<int16_t>(string.size()));
3,282✔
287
  for (char character : string) {
153,343✔
288
    appendData1(character);
150,061✔
289
  }
290
}
3,282✔
291

292
void Program::printStringFromStringTable(int32_t string_table_index) {
3,218✔
293
  appendCode1(OpCode::PrintStringFromStringTable);
3,218✔
294
  appendData4(string_table_index);
3,218✔
295
}
3,218✔
296

297
void Program::loadStringTableLimitIntoVariable(int32_t variable_index, bool follow_links) {
3,228✔
298
  appendCode1(OpCode::LoadStringTableLimitIntoVariable);
3,228✔
299
  appendData4(variable_index);
3,228✔
300
  appendFlag1(follow_links);
3,228✔
301
}
3,228✔
302

303
void Program::terminate(int8_t return_code) {
3,276✔
304
  appendCode1(OpCode::Terminate);
3,276✔
305
  appendData1(return_code);
3,276✔
306
}
3,276✔
307

308
void Program::copyVariable(int32_t source_variable_index, bool follow_source_links,
3,206✔
309
                           int32_t destination_variable_index, bool follow_destination_links) {
310
  appendCode1(OpCode::CopyVariable);
3,206✔
311
  appendData4(source_variable_index);
3,206✔
312
  appendFlag1(follow_source_links);
3,206✔
313
  appendData4(destination_variable_index);
3,206✔
314
  appendFlag1(follow_destination_links);
3,206✔
315
}
3,206✔
316

317
void Program::checkIfInputWasSet(int32_t variable_index, bool follow_links,
3,251✔
318
                                 int32_t destination_variable_index,
319
                                 bool follow_destination_links) {
320
  appendCode1(OpCode::CheckIfInputWasSet);
3,251✔
321
  appendData4(variable_index);
3,251✔
322
  appendFlag1(follow_links);
3,251✔
323
  appendData4(destination_variable_index);
3,251✔
324
  appendFlag1(follow_destination_links);
3,251✔
325
}
3,251✔
326

327
void Program::loadStringTableItemLengthLimitIntoVariable(int32_t variable_index,
3,331✔
328
                                                         bool follow_links) {
329
  appendCode1(OpCode::LoadStringTableItemLengthLimitIntoVariable);
3,331✔
330
  appendData4(variable_index);
3,331✔
331
  appendFlag1(follow_links);
3,331✔
332
}
3,331✔
333

334
void Program::loadRandomValueIntoVariable(int32_t variable_index, bool follow_links) {
3,278✔
335
  appendCode1(OpCode::LoadRandomValueIntoVariable);
3,278✔
336
  appendData4(variable_index);
3,278✔
337
  appendFlag1(follow_links);
3,278✔
338
}
3,278✔
339

340
void Program::unconditionalJumpToAbsoluteAddress(int32_t addr) {
3,283✔
341
  appendCode1(OpCode::UnconditionalJumpToAbsoluteAddress);
3,283✔
342
  appendData4(addr);
3,283✔
343
}
3,283✔
344

345
void Program::unconditionalJumpToAbsoluteVariableAddress(int32_t variable_index,
3,336✔
346
                                                         bool follow_links) {
347
  appendCode1(OpCode::UnconditionalJumpToAbsoluteVariableAddress);
3,336✔
348
  appendData4(variable_index);
3,336✔
349
  appendFlag1(follow_links);
3,336✔
350
}
3,336✔
351

352
void Program::unconditionalJumpToRelativeAddress(int32_t addr) {
3,215✔
353
  appendCode1(OpCode::UnconditionalJumpToRelativeAddress);
3,215✔
354
  appendData4(addr);
3,215✔
355
}
3,215✔
356

357
void Program::unconditionalJumpToRelativeVariableAddress(int32_t variable_index,
3,335✔
358
                                                         bool follow_links) {
359
  appendCode1(OpCode::UnconditionalJumpToRelativeVariableAddress);
3,335✔
360
  appendData4(variable_index);
3,335✔
361
  appendFlag1(follow_links);
3,335✔
362
}
3,335✔
363

364
void Program::loadStringItemLengthIntoVariable(int32_t string_table_index, int32_t variable_index,
3,315✔
365
                                               bool follow_links) {
366
  appendCode1(OpCode::LoadStringItemLengthIntoVariable);
3,315✔
367
  appendData4(string_table_index);
3,315✔
368
  appendData4(variable_index);
3,315✔
369
  appendFlag1(follow_links);
3,315✔
370
}
3,315✔
371

372
void Program::loadStringItemIntoVariables(int32_t string_table_index, int32_t start_variable_index,
3,217✔
373
                                          bool follow_links) {
374
  appendCode1(OpCode::LoadStringItemIntoVariables);
3,217✔
375
  appendData4(string_table_index);
3,217✔
376
  appendData4(start_variable_index);
3,217✔
377
  appendFlag1(follow_links);
3,217✔
378
}
3,217✔
379

380
void Program::performSystemCall(int8_t major_code, int8_t minor_code, int32_t variable_index,
3,240✔
381
                                bool follow_links) {
382
  appendCode1(OpCode::PerformSystemCall);
3,240✔
383
  appendData1(major_code);
3,240✔
384
  appendData1(minor_code);
3,240✔
385
  appendData4(variable_index);
3,240✔
386
  appendFlag1(follow_links);
3,240✔
387
}
3,240✔
388

389
void Program::bitShiftVariableLeft(int32_t variable_index, bool follow_links, int8_t places) {
3,262✔
390
  appendCode1(OpCode::BitShiftVariableLeft);
3,262✔
391
  appendData4(variable_index);
3,262✔
392
  appendFlag1(follow_links);
3,262✔
393
  appendData1(places);
3,262✔
394
}
3,262✔
395

396
void Program::bitShiftVariableRight(int32_t variable_index, bool follow_links, int8_t places) {
3,278✔
397
  appendCode1(OpCode::BitShiftVariableRight);
3,278✔
398
  appendData4(variable_index);
3,278✔
399
  appendFlag1(follow_links);
3,278✔
400
  appendData1(places);
3,278✔
401
}
3,278✔
402

403
void Program::bitWiseInvertVariable(int32_t variable_index, bool follow_links) {
3,301✔
404
  appendCode1(OpCode::BitWiseInvertVariable);
3,301✔
405
  appendData4(variable_index);
3,301✔
406
  appendFlag1(follow_links);
3,301✔
407
}
3,301✔
408

409
void Program::bitWiseAndTwoVariables(int32_t variable_index_a, bool follow_links_a,
3,242✔
410
                                     int32_t variable_index_b, bool follow_links_b) {
411
  appendCode1(OpCode::BitWiseAndTwoVariables);
3,242✔
412
  appendData4(variable_index_a);
3,242✔
413
  appendFlag1(follow_links_a);
3,242✔
414
  appendData4(variable_index_b);
3,242✔
415
  appendFlag1(follow_links_b);
3,242✔
416
}
3,242✔
417

418
void Program::bitWiseOrTwoVariables(int32_t variable_index_a, bool follow_links_a,
3,262✔
419
                                    int32_t variable_index_b, bool follow_links_b) {
420
  appendCode1(OpCode::BitWiseOrTwoVariables);
3,262✔
421
  appendData4(variable_index_a);
3,262✔
422
  appendFlag1(follow_links_a);
3,262✔
423
  appendData4(variable_index_b);
3,262✔
424
  appendFlag1(follow_links_b);
3,262✔
425
}
3,262✔
426

427
void Program::bitWiseXorTwoVariables(int32_t variable_index_a, bool follow_links_a,
3,293✔
428
                                     int32_t variable_index_b, bool follow_links_b) {
429
  appendCode1(OpCode::BitWiseXorTwoVariables);
3,293✔
430
  appendData4(variable_index_a);
3,293✔
431
  appendFlag1(follow_links_a);
3,293✔
432
  appendData4(variable_index_b);
3,293✔
433
  appendFlag1(follow_links_b);
3,293✔
434
}
3,293✔
435

436
void Program::moduloVariableByConstant(int32_t variable_index, bool follow_links,
3,180✔
437
                                       int32_t modulo_constant) {
438
  appendCode1(OpCode::ModuloVariableByConstant);
3,180✔
439
  appendData4(variable_index);
3,180✔
440
  appendFlag1(follow_links);
3,180✔
441
  appendData4(modulo_constant);
3,180✔
442
}
3,180✔
443

444
void Program::moduloVariableByVariable(int32_t variable_index, bool follow_links,
3,255✔
445
                                       int32_t modulo_variable_index, bool modulo_follow_links) {
446
  appendCode1(OpCode::ModuloVariableByVariable);
3,255✔
447
  appendData4(variable_index);
3,255✔
448
  appendFlag1(follow_links);
3,255✔
449
  appendData4(modulo_variable_index);
3,255✔
450
  appendFlag1(modulo_follow_links);
3,255✔
451
}
3,255✔
452

453
void Program::rotateVariableLeft(int32_t variable_index, bool follow_links, int8_t places) {
3,171✔
454
  appendCode1(OpCode::RotateVariableLeft);
3,171✔
455
  appendData4(variable_index);
3,171✔
456
  appendFlag1(follow_links);
3,171✔
457
  appendData1(places);
3,171✔
458
}
3,171✔
459

460
void Program::rotateVariableRight(int32_t variable_index, bool follow_links, int8_t places) {
3,170✔
461
  appendCode1(OpCode::RotateVariableRight);
3,170✔
462
  appendData4(variable_index);
3,170✔
463
  appendFlag1(follow_links);
3,170✔
464
  appendData1(places);
3,170✔
465
}
3,170✔
466

467
void Program::pushVariableOnStack(int32_t stack_variable_index, bool follow_links_stack,
3,321✔
468
                                  int32_t variable_index, bool follow_links) {
469
  appendCode1(OpCode::PushVariableOnStack);
3,321✔
470
  appendData4(stack_variable_index);
3,321✔
471
  appendFlag1(follow_links_stack);
3,321✔
472
  appendData4(variable_index);
3,321✔
473
  appendFlag1(follow_links);
3,321✔
474
}
3,321✔
475

476
void Program::pushConstantOnStack(int32_t stack_variable_index, bool follow_links_stack,
3,197✔
477
                                  int32_t constant) {
478
  appendCode1(OpCode::PushConstantOnStack);
3,197✔
479
  appendData4(stack_variable_index);
3,197✔
480
  appendFlag1(follow_links_stack);
3,197✔
481
  appendData4(constant);
3,197✔
482
}
3,197✔
483

484
void Program::popVariableFromStack(int32_t stack_variable_index, bool follow_links_stack,
3,266✔
485
                                   int32_t variable_index, bool follow_links) {
486
  appendCode1(OpCode::PopVariableFromStack);
3,266✔
487
  appendData4(stack_variable_index);
3,266✔
488
  appendFlag1(follow_links_stack);
3,266✔
489
  appendData4(variable_index);
3,266✔
490
  appendFlag1(follow_links);
3,266✔
491
}
3,266✔
492

493
void Program::popTopItemFromStack(int32_t stack_variable_index, bool follow_links_stack) {
3,203✔
494
  appendCode1(OpCode::PopTopItemFromStack);
3,203✔
495
  appendData4(stack_variable_index);
3,203✔
496
  appendFlag1(follow_links_stack);
3,203✔
497
}
3,203✔
498

499
void Program::checkIfStackIsEmpty(int32_t stack_variable_index, bool follow_links_stack,
3,142✔
500
                                  int32_t variable_index, bool follow_links) {
501
  appendCode1(OpCode::CheckIfStackIsEmpty);
3,142✔
502
  appendData4(stack_variable_index);
3,142✔
503
  appendFlag1(follow_links_stack);
3,142✔
504
  appendData4(variable_index);
3,142✔
505
  appendFlag1(follow_links);
3,142✔
506
}
3,142✔
507

508
void Program::swapVariables(int32_t variable_index_a, bool follow_links_a, int32_t variable_index_b,
3,256✔
509
                            bool follow_links_b) {
510
  appendCode1(OpCode::SwapVariables);
3,256✔
511
  appendData4(variable_index_a);
3,256✔
512
  appendFlag1(follow_links_a);
3,256✔
513
  appendData4(variable_index_b);
3,256✔
514
  appendFlag1(follow_links_b);
3,256✔
515
}
3,256✔
516

517
void Program::setVariableStringTableEntry(int32_t variable_index, bool follow_links,
3,271✔
518
                                          const std::string& string) {
519
  appendCode1(OpCode::SetVariableStringTableEntry);
3,271✔
520
  appendData4(variable_index);
3,271✔
521
  appendFlag1(follow_links);
3,271✔
522

523
  appendData2(static_cast<int16_t>(string.size()));
3,271✔
524
  for (char character : string) {
153,132✔
525
    appendData1(character);
149,861✔
526
  }
527
}
3,271✔
528

529
void Program::printVariableStringFromStringTable(int32_t variable_index, bool follow_links) {
3,262✔
530
  appendCode1(OpCode::PrintVariableStringFromStringTable);
3,262✔
531
  appendData4(variable_index);
3,262✔
532
  appendFlag1(follow_links);
3,262✔
533
}
3,262✔
534

535
void Program::loadVariableStringItemLengthIntoVariable(int32_t string_item_variable_index,
3,261✔
536
                                                       bool follow_links_string_item,
537
                                                       int32_t variable_index, bool follow_links) {
538
  appendCode1(OpCode::LoadVariableStringItemLengthIntoVariable);
3,261✔
539
  appendData4(string_item_variable_index);
3,261✔
540
  appendFlag1(follow_links_string_item);
3,261✔
541
  appendData4(variable_index);
3,261✔
542
  appendFlag1(follow_links);
3,261✔
543
}
3,261✔
544

545
void Program::loadVariableStringItemIntoVariables(int32_t string_item_variable_index,
3,250✔
546
                                                  bool follow_links_string_item,
547
                                                  int32_t variable_index, bool follow_links) {
548
  appendCode1(OpCode::LoadVariableStringItemIntoVariables);
3,250✔
549
  appendData4(string_item_variable_index);
3,250✔
550
  appendFlag1(follow_links_string_item);
3,250✔
551
  appendData4(variable_index);
3,250✔
552
  appendFlag1(follow_links);
3,250✔
553
}
3,250✔
554

555
void Program::terminateWithVariableReturnCode(int32_t variable_index, bool follow_links) {
3,207✔
556
  appendCode1(OpCode::TerminateWithVariableReturnCode);
3,207✔
557
  appendData4(variable_index);
3,207✔
558
  appendFlag1(follow_links);
3,207✔
559
}
3,207✔
560

561
void Program::variableBitShiftVariableLeft(int32_t variable_index, bool follow_links,
3,217✔
562
                                           int32_t places_variable_index,
563
                                           bool follow_links_places) {
564
  appendCode1(OpCode::VariableBitShiftVariableLeft);
3,217✔
565
  appendData4(variable_index);
3,217✔
566
  appendFlag1(follow_links);
3,217✔
567
  appendData4(places_variable_index);
3,217✔
568
  appendFlag1(follow_links_places);
3,217✔
569
}
3,217✔
570

571
void Program::variableBitShiftVariableRight(int32_t variable_index, bool follow_links,
3,111✔
572
                                            int32_t places_variable_index,
573
                                            bool follow_links_places) {
574
  appendCode1(OpCode::VariableBitShiftVariableRight);
3,111✔
575
  appendData4(variable_index);
3,111✔
576
  appendFlag1(follow_links);
3,111✔
577
  appendData4(places_variable_index);
3,111✔
578
  appendFlag1(follow_links_places);
3,111✔
579
}
3,111✔
580

581
void Program::variableRotateVariableLeft(int32_t variable_index, bool follow_links,
3,262✔
582
                                         int32_t places_variable_index, bool follow_links_places) {
583
  appendCode1(OpCode::VariableRotateVariableLeft);
3,262✔
584
  appendData4(variable_index);
3,262✔
585
  appendFlag1(follow_links);
3,262✔
586
  appendData4(places_variable_index);
3,262✔
587
  appendFlag1(follow_links_places);
3,262✔
588
}
3,262✔
589

590
void Program::variableRotateVariableRight(int32_t variable_index, bool follow_links,
3,319✔
591
                                          int32_t places_variable_index, bool follow_links_places) {
592
  appendCode1(OpCode::VariableRotateVariableRight);
3,319✔
593
  appendData4(variable_index);
3,319✔
594
  appendFlag1(follow_links);
3,319✔
595
  appendData4(places_variable_index);
3,319✔
596
  appendFlag1(follow_links_places);
3,319✔
597
}
3,319✔
598

599
void Program::compareIfVariableGtConstant(int32_t variable_index, bool follow_links,
3,238✔
600
                                          int32_t constant, int32_t target_variable_index,
601
                                          bool target_follow_links) {
602
  appendCode1(OpCode::CompareIfVariableGtConstant);
3,238✔
603
  appendData4(variable_index);
3,238✔
604
  appendFlag1(follow_links);
3,238✔
605
  appendData4(constant);
3,238✔
606
  appendData4(target_variable_index);
3,238✔
607
  appendFlag1(target_follow_links);
3,238✔
608
}
3,238✔
609

610
void Program::compareIfVariableLtConstant(int32_t variable_index, bool follow_links,
3,293✔
611
                                          int32_t constant, int32_t target_variable_index,
612
                                          bool target_follow_links) {
613
  appendCode1(OpCode::CompareIfVariableLtConstant);
3,293✔
614
  appendData4(variable_index);
3,293✔
615
  appendFlag1(follow_links);
3,293✔
616
  appendData4(constant);
3,293✔
617
  appendData4(target_variable_index);
3,293✔
618
  appendFlag1(target_follow_links);
3,293✔
619
}
3,293✔
620

621
void Program::compareIfVariableEqConstant(int32_t variable_index, bool follow_links,
3,215✔
622
                                          int32_t constant, int32_t target_variable_index,
623
                                          bool target_follow_links) {
624
  appendCode1(OpCode::CompareIfVariableEqConstant);
3,215✔
625
  appendData4(variable_index);
3,215✔
626
  appendFlag1(follow_links);
3,215✔
627
  appendData4(constant);
3,215✔
628
  appendData4(target_variable_index);
3,215✔
629
  appendFlag1(target_follow_links);
3,215✔
630
}
3,215✔
631

632
void Program::compareIfVariableGtVariable(int32_t variable_index_a, bool follow_links_a,
3,260✔
633
                                          int32_t variable_index_b, bool follow_links_b,
634
                                          int32_t target_variable_index, bool target_follow_links) {
635
  appendCode1(OpCode::CompareIfVariableGtVariable);
3,260✔
636
  appendData4(variable_index_a);
3,260✔
637
  appendFlag1(follow_links_a);
3,260✔
638
  appendData4(variable_index_b);
3,260✔
639
  appendFlag1(follow_links_b);
3,260✔
640
  appendData4(target_variable_index);
3,260✔
641
  appendFlag1(target_follow_links);
3,260✔
642
}
3,260✔
643

644
void Program::compareIfVariableLtVariable(int32_t variable_index_a, bool follow_links_a,
3,204✔
645
                                          int32_t variable_index_b, bool follow_links_b,
646
                                          int32_t target_variable_index, bool target_follow_links) {
647
  appendCode1(OpCode::CompareIfVariableLtVariable);
3,204✔
648
  appendData4(variable_index_a);
3,204✔
649
  appendFlag1(follow_links_a);
3,204✔
650
  appendData4(variable_index_b);
3,204✔
651
  appendFlag1(follow_links_b);
3,204✔
652
  appendData4(target_variable_index);
3,204✔
653
  appendFlag1(target_follow_links);
3,204✔
654
}
3,204✔
655

656
void Program::compareIfVariableEqVariable(int32_t variable_index_a, bool follow_links_a,
3,196✔
657
                                          int32_t variable_index_b, bool follow_links_b,
658
                                          int32_t target_variable_index, bool target_follow_links) {
659
  appendCode1(OpCode::CompareIfVariableEqVariable);
3,196✔
660
  appendData4(variable_index_a);
3,196✔
661
  appendFlag1(follow_links_a);
3,196✔
662
  appendData4(variable_index_b);
3,196✔
663
  appendFlag1(follow_links_b);
3,196✔
664
  appendData4(target_variable_index);
3,196✔
665
  appendFlag1(target_follow_links);
3,196✔
666
}
3,196✔
667

668
void Program::getMaxOfVariableAndConstant(int32_t variable_index, bool follow_links,
3,160✔
669
                                          int32_t constant, int32_t target_variable_index,
670
                                          bool target_follow_links) {
671
  appendCode1(OpCode::GetMaxOfVariableAndConstant);
3,160✔
672
  appendData4(variable_index);
3,160✔
673
  appendFlag1(follow_links);
3,160✔
674
  appendData4(constant);
3,160✔
675
  appendData4(target_variable_index);
3,160✔
676
  appendFlag1(target_follow_links);
3,160✔
677
}
3,160✔
678

679
void Program::getMinOfVariableAndConstant(int32_t variable_index, bool follow_links,
3,241✔
680
                                          int32_t constant, int32_t target_variable_index,
681
                                          bool target_follow_links) {
682
  appendCode1(OpCode::GetMinOfVariableAndConstant);
3,241✔
683
  appendData4(variable_index);
3,241✔
684
  appendFlag1(follow_links);
3,241✔
685
  appendData4(constant);
3,241✔
686
  appendData4(target_variable_index);
3,241✔
687
  appendFlag1(target_follow_links);
3,241✔
688
}
3,241✔
689

690
void Program::getMaxOfVariableAndVariable(int32_t variable_index_a, bool follow_links_a,
3,251✔
691
                                          int32_t variable_index_b, bool follow_links_b,
692
                                          int32_t target_variable_index, bool target_follow_links) {
693
  appendCode1(OpCode::GetMaxOfVariableAndVariable);
3,251✔
694
  appendData4(variable_index_a);
3,251✔
695
  appendFlag1(follow_links_a);
3,251✔
696
  appendData4(variable_index_b);
3,251✔
697
  appendFlag1(follow_links_b);
3,251✔
698
  appendData4(target_variable_index);
3,251✔
699
  appendFlag1(target_follow_links);
3,251✔
700
}
3,251✔
701

702
void Program::getMinOfVariableAndVariable(int32_t variable_index_a, bool follow_links_a,
3,271✔
703
                                          int32_t variable_index_b, bool follow_links_b,
704
                                          int32_t target_variable_index, bool target_follow_links) {
705
  appendCode1(OpCode::GetMinOfVariableAndVariable);
3,271✔
706
  appendData4(variable_index_a);
3,271✔
707
  appendFlag1(follow_links_a);
3,271✔
708
  appendData4(variable_index_b);
3,271✔
709
  appendFlag1(follow_links_b);
3,271✔
710
  appendData4(target_variable_index);
3,271✔
711
  appendFlag1(target_follow_links);
3,271✔
712
}
3,271✔
713

714
bool Program::canFit(uint32_t bytes) {
1,630,000✔
715
  if (grows_dynamically_) {
1,630,000✔
716
    ensureSize(pointer_ + bytes);
1,381,180✔
717
  }
718
  return bytes <= data_.size() - pointer_;
1,630,000✔
719
}
720

721
void Program::appendData4(int32_t data) {
435,304✔
722
  if (!canFit(4)) {
435,304✔
723
    throw std::overflow_error("Unable to fit data into program.");
×
724
  }
725

726
  std::memcpy(&data_[pointer_], &data, 4);
435,304✔
727
  pointer_ += 4;
435,304✔
728
}
435,304✔
729

730
void Program::appendData2(int16_t data) {
6,553✔
731
  if (!canFit(2)) {
6,553✔
732
    throw std::overflow_error("Unable to fit data into program.");
×
733
  }
734

735
  std::memcpy(&data_[pointer_], &data, 2);
6,553✔
736
  pointer_ += 2;
6,553✔
737
}
6,553✔
738

739
void Program::appendData1(int8_t data) {
936,904✔
740
  if (!canFit(1)) {
936,904✔
741
    throw std::overflow_error("Unable to fit data into program.");
×
742
  }
743

744
  std::memcpy(&data_[pointer_], &data, 1);
936,904✔
745
  pointer_ += 1;
936,904✔
746
}
936,904✔
747

748
void Program::appendFlag1(bool flag) { appendData1(flag ? 0x1 : 0x0); }
360,543✔
749

750
void Program::appendCode1(OpCode opcode) { appendData1(static_cast<int8_t>(opcode)); }
250,447✔
751

752
void Program::ensureSize(uint32_t size) noexcept {
1,381,180✔
753
  if (data_.size() < size) {
1,381,180✔
754
    data_.resize(size);
1,233,880✔
755
  }
756
}
1,381,180✔
757

758
} // namespace beast
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc