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

dedicate-project / beast / 3ba971e4-2004-46a3-b2d0-8a6d687db0d1

pending completion
3ba971e4-2004-46a3-b2d0-8a6d687db0d1

Pull #9

circleci

fairlight1337
Repaired context menu popping up
Pull Request #9: Adding pipeline applications

1225 of 1225 new or added lines in 24 files covered. (100.0%)

2850 of 3071 relevant lines covered (92.8%)

12345.72 hits per line

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

99.45
/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,257✔
10

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

14
size_t Program::getSize() const noexcept { return data_.size(); }
783,580✔
15

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

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

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

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

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

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

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

48
void Program::insertProgram(const Program& other) {
234,431✔
49
  const size_t to_fit = other.getSize();
234,431✔
50
  if (!canFit(static_cast<uint32_t>(to_fit))) {
234,431✔
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,765,490✔
54
    data_[pointer_ + idx] = other.getData()[idx];
2,531,060✔
55
  }
56
  pointer_ += static_cast<uint32_t>(to_fit);
234,430✔
57
}
234,430✔
58

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

61
void Program::noop() { appendCode1(OpCode::NoOp); }
3,174✔
62

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

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

76
void Program::undeclareVariable(int32_t variable_index) {
3,126✔
77
  appendCode1(OpCode::UndeclareVariable);
3,126✔
78
  appendData4(variable_index);
3,126✔
79
}
3,126✔
80

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

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

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

106
void Program::subtractVariableFromVariable(int32_t source_variable_index, bool follow_source_links,
2,952✔
107
                                           int32_t destination_variable_index,
108
                                           bool follow_destination_links) {
109
  appendCode1(OpCode::SubtractVariableFromVariable);
2,952✔
110
  appendData4(source_variable_index);
2,952✔
111
  appendFlag1(follow_source_links);
2,952✔
112
  appendData4(destination_variable_index);
2,952✔
113
  appendFlag1(follow_destination_links);
2,952✔
114
}
2,952✔
115

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

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

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

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

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

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

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

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

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

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

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

218
void Program::absoluteJumpToAddressIfVariableEqualsZero(int32_t variable_index, bool follow_links,
2,968✔
219
                                                        int32_t absolute_jump_address) {
220
  appendCode1(OpCode::AbsoluteJumpIfVariableEq0);
2,968✔
221
  appendData4(variable_index);
2,968✔
222
  appendFlag1(follow_links);
2,968✔
223
  appendData4(absolute_jump_address);
2,968✔
224
}
2,968✔
225

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

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

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

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

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

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

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

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

282
  appendCode1(OpCode::SetStringTableEntry);
3,108✔
283
  appendData4(string_table_index);
3,108✔
284
  appendData2(static_cast<int16_t>(string.size()));
3,108✔
285
  for (char character : string) {
152,757✔
286
    appendData1(character);
149,649✔
287
  }
288
}
3,108✔
289

290
void Program::printStringFromStringTable(int32_t string_table_index) {
3,133✔
291
  appendCode1(OpCode::PrintStringFromStringTable);
3,133✔
292
  appendData4(string_table_index);
3,133✔
293
}
3,133✔
294

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

301
void Program::terminate(int8_t return_code) {
2,975✔
302
  appendCode1(OpCode::Terminate);
2,975✔
303
  appendData1(return_code);
2,975✔
304
}
2,975✔
305

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

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

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

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

338
void Program::unconditionalJumpToAbsoluteAddress(int32_t addr) {
3,198✔
339
  appendCode1(OpCode::UnconditionalJumpToAbsoluteAddress);
3,198✔
340
  appendData4(addr);
3,198✔
341
}
3,198✔
342

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

350
void Program::unconditionalJumpToRelativeAddress(int32_t addr) {
3,064✔
351
  appendCode1(OpCode::UnconditionalJumpToRelativeAddress);
3,064✔
352
  appendData4(addr);
3,064✔
353
}
3,064✔
354

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

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

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

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

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

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

401
void Program::bitWiseInvertVariable(int32_t variable_index, bool follow_links) {
2,974✔
402
  appendCode1(OpCode::BitWiseInvertVariable);
2,974✔
403
  appendData4(variable_index);
2,974✔
404
  appendFlag1(follow_links);
2,974✔
405
}
2,974✔
406

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

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

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

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

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

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

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

465
void Program::pushVariableOnStack(int32_t stack_variable_index, bool follow_links_stack,
2,908✔
466
                                  int32_t variable_index, bool follow_links) {
467
  appendCode1(OpCode::PushVariableOnStack);
2,908✔
468
  appendData4(stack_variable_index);
2,908✔
469
  appendFlag1(follow_links_stack);
2,908✔
470
  appendData4(variable_index);
2,908✔
471
  appendFlag1(follow_links);
2,908✔
472
}
2,908✔
473

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

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

491
void Program::popTopItemFromStack(int32_t stack_variable_index, bool follow_links_stack) {
2,994✔
492
  appendCode1(OpCode::PopTopItemFromStack);
2,994✔
493
  appendData4(stack_variable_index);
2,994✔
494
  appendFlag1(follow_links_stack);
2,994✔
495
}
2,994✔
496

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

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

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

521
  appendData2(static_cast<int16_t>(string.size()));
3,042✔
522
  for (char character : string) {
154,945✔
523
    appendData1(character);
151,903✔
524
  }
525
}
3,042✔
526

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

712
bool Program::canFit(uint32_t bytes) {
1,556,350✔
713
  if (grows_dynamically_) {
1,556,350✔
714
    ensureSize(pointer_ + bytes);
1,321,060✔
715
  }
716
  return bytes <= data_.size() - pointer_;
1,556,350✔
717
}
718

719
void Program::appendData4(int32_t data) {
410,691✔
720
  if (!canFit(4)) {
410,691✔
721
    throw std::overflow_error("Unable to fit data into program.");
×
722
  }
723

724
  std::memcpy(&data_[pointer_], &data, 4);
410,691✔
725
  pointer_ += 4;
410,691✔
726
}
410,691✔
727

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

733
  std::memcpy(&data_[pointer_], &data, 2);
6,150✔
734
  pointer_ += 2;
6,150✔
735
}
6,150✔
736

737
void Program::appendData1(int8_t data) {
901,972✔
738
  if (!canFit(1)) {
901,972✔
739
    throw std::overflow_error("Unable to fit data into program.");
×
740
  }
741

742
  std::memcpy(&data_[pointer_], &data, 1);
901,972✔
743
  pointer_ += 1;
901,972✔
744
}
901,972✔
745

746
void Program::appendFlag1(bool flag) { appendData1(flag ? 0x1 : 0x0); }
339,524✔
747

748
void Program::appendCode1(OpCode opcode) { appendData1(static_cast<int8_t>(opcode)); }
236,267✔
749

750
void Program::ensureSize(uint32_t size) noexcept {
1,321,060✔
751
  if (data_.size() < size) {
1,321,060✔
752
    data_.resize(size);
1,174,370✔
753
  }
754
}
1,321,060✔
755

756
} // 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