11#ifndef ARK_VM_HELPERS_HPP
12#define ARK_VM_HELPERS_HPP
21 using namespace internal;
30 std::vector<Value> tmp(a->
constList().size() - 1);
31 for (std::size_t i = 1, end = a->
constList().size(); i < end; ++i)
33 return Value(std::move(tmp));
37 if (a->
string().size() < 2)
41 b.
stringRef().erase(b.stringRef().begin());
81 { container, index });
83 const auto num =
static_cast<long>(index.
number());
87 const auto i =
static_cast<std::size_t
>(num < 0 ? static_cast<long>(container.
list().size()) + num : num);
88 if (i < container.
list().size())
89 return container.
list()[i];
93 fmt::format(
"{} out of range {} (length {})", num, container.
toString(vm), container.
list().size()));
97 const auto i =
static_cast<std::size_t
>(num < 0 ? static_cast<long>(container.
string().size()) + num : num);
98 if (i < container.
string().size())
99 return Value(std::string(1, container.
string()[i]));
103 fmt::format(
"{} out of range \"{}\" (length {})", num, container.
string(), container.
string().size()));
110 { container, index });
125 long idx_y =
static_cast<long>(y->
number());
126 idx_y = idx_y < 0 ? static_cast<long>(list.
list().size()) + idx_y : idx_y;
127 if (std::cmp_greater_equal(idx_y, list.
list().size()) || idx_y < 0)
130 fmt::format(
"@@ index ({}) out of range (list size: {})", idx_y, list.
list().size()));
132 const bool is_list = list.
list()[
static_cast<std::size_t
>(idx_y)].valueType() ==
ValueType::List;
133 const std::size_t size =
135 ? list.
list()[
static_cast<std::size_t
>(idx_y)].list().size()
136 : list.
list()[
static_cast<std::size_t
>(idx_y)].stringRef().size();
138 long idx_x =
static_cast<long>(x->
number());
139 idx_x = idx_x < 0 ? static_cast<long>(size) + idx_x : idx_x;
140 if (std::cmp_greater_equal(idx_x, size) || idx_x < 0)
143 fmt::format(
"@@ index (x: {}) out of range (inner indexable size: {})", idx_x, size));
146 return list.
list()[
static_cast<std::size_t
>(idx_y)].list()[
static_cast<std::size_t
>(idx_x)];
148 return Value(std::string(1, list.
list()[
static_cast<std::size_t
>(idx_y)].stringRef()[
static_cast<std::size_t
>(idx_x)]));
162 Ark::VM::throwVMError(ErrorKind::DivisionByZero, fmt::format(
"Can not compute expression (/ {} {})", a, b));
Host the declaration of all the ArkScript builtins.
The ArkScript virtual machine.
Default value type handled by the virtual machine.
The ArkScript virtual machine, executing ArkScript bytecode.
static void throwVMError(internal::ErrorKind kind, const std::string &message)
Throw a VM error message.
const String_t & string() const
const List_t & constList() const
ValueType valueType() const noexcept
std::string toString(VM &vm, bool show_as_code=false) const noexcept
double doMath(double a, double b, const Instruction op)
Value at(Value &container, Value &index, VM &vm)
std::string mathInstToStr(const Instruction op)
Value atAt(const Value *x, const Value *y, Value &list)
Instruction
The different bytecodes are stored here.
A contract is a list of typed arguments that a function can follow.
A type definition within a contract.