Tidy up Kym library
This commit is contained in:
parent
f20e220e35
commit
c36bf5b76c
|
@ -15,35 +15,50 @@ export namespace kym {
|
|||
};
|
||||
|
||||
struct value {
|
||||
value_type type;
|
||||
value_type type{value_type::nil};
|
||||
|
||||
union {
|
||||
bool boolean;
|
||||
value() = default;
|
||||
|
||||
coral::i64 integer;
|
||||
value(bool boolean) {
|
||||
this->data[1] = 0xff * boolean;
|
||||
this->type = value_type::boolean;
|
||||
}
|
||||
|
||||
coral::f64 scalar;
|
||||
value(coral::i64 integer) {
|
||||
(*reinterpret_cast<coral::u64 *>(this->data)) =
|
||||
(*reinterpret_cast<coral::u64 *>(&integer));
|
||||
|
||||
coral::vector2 vector2;
|
||||
this->type = value_type::integer;
|
||||
}
|
||||
|
||||
coral::vector3 vector3;
|
||||
value(coral::f64 scalar) {
|
||||
(*reinterpret_cast<coral::u64 *>(this->data)) =
|
||||
(*reinterpret_cast<coral::u64 *>(&scalar));
|
||||
|
||||
void * object;
|
||||
} as;
|
||||
this->type = value_type::scalar;
|
||||
}
|
||||
|
||||
coral::optional<coral::u16> as_u16() const {
|
||||
if ((this->type == value_type::integer) &&
|
||||
(this->as.integer >= 0) && (this->as.integer <= coral::u16_max)) {
|
||||
value(coral::vector2 vector2) {
|
||||
(*reinterpret_cast<coral::u64 *>(this->data)) =
|
||||
(*reinterpret_cast<coral::u64 *>(&vector2));
|
||||
|
||||
return static_cast<coral::u16>(this->as.integer);
|
||||
}
|
||||
this->type = value_type::vector2;
|
||||
}
|
||||
|
||||
value(coral::vector3 const & vector3) {
|
||||
coral::copy(this->data, coral::as_bytes(&vector3));
|
||||
|
||||
this->type = value_type::vector3;
|
||||
}
|
||||
|
||||
coral::optional<coral::i64> as_integer() const {
|
||||
if (this->type == value_type::integer)
|
||||
return (*reinterpret_cast<coral::i64 const *>(&this->data));
|
||||
|
||||
return {};
|
||||
}
|
||||
};
|
||||
|
||||
value nil = {
|
||||
.type = value_type::nil,
|
||||
.as = {.object = nullptr},
|
||||
private:
|
||||
coral::u8 data[12]{0};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -57,7 +57,7 @@ struct bytecode {
|
|||
}
|
||||
|
||||
kym::value execute(kym::vm & vm, coral::slice<kym::value const> const & arguments) {
|
||||
return kym::nil;
|
||||
return {};
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -66,7 +66,7 @@ struct bytecode {
|
|||
|
||||
export namespace kym {
|
||||
value default_call(vm & owning_vm, void * userdata, coral::slice<value const> const & arguments) {
|
||||
return nil;
|
||||
return {};
|
||||
}
|
||||
|
||||
coral::expected<coral::usize, coral::io_error> default_stringify(vm & owning_vm, void * userdata, coral::writer & output) {
|
||||
|
@ -103,7 +103,7 @@ export namespace kym {
|
|||
}
|
||||
|
||||
value get_field(coral::slice<char const> const & field_name) {
|
||||
return nil;
|
||||
return {};
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -139,14 +139,14 @@ export namespace kym {
|
|||
value compile(coral::slice<char const> const & source) {
|
||||
bytecode * source_bytecode = new (*this->allocator) bytecode{allocator};
|
||||
|
||||
if (source_bytecode == nullptr) return nil;
|
||||
if (source_bytecode == nullptr) return {};
|
||||
|
||||
if (!source_bytecode->compile(tokenizer{source}, [&](coral::slice<char const> error_message) {
|
||||
this->log(error_message);
|
||||
})) {
|
||||
this->allocator->deallocate(source_bytecode);
|
||||
|
||||
return nil;
|
||||
return {};
|
||||
}
|
||||
|
||||
return this->new_object([this, source_bytecode](bound_object & object) {
|
||||
|
@ -165,7 +165,7 @@ export namespace kym {
|
|||
}
|
||||
|
||||
value new_object(coral::callable<void(bound_object &)> const & then) {
|
||||
return nil;
|
||||
return {};
|
||||
}
|
||||
|
||||
void with_object(value object_value, coral::callable<void(bound_object &)> const & then) {
|
||||
|
|
|
@ -38,13 +38,22 @@ extern "C" int main(int argc, char const * const * argv) {
|
|||
}
|
||||
|
||||
vm.with_object(vm.compile(coral::slice{script_source.begin(), script_source.end()}.as_chars()), [&](kym::bound_object & script) {
|
||||
vm.with_object(script.call({}), [&](kym::bound_object & config) {
|
||||
coral::u16 const width{config.get_field("width").as_u16().value_or(0)};
|
||||
vm.with_object(script.call({}), [&](kym::bound_object config) {
|
||||
constexpr auto as_u16 = [](coral::i64 value) -> coral::optional<coral::i16> {
|
||||
if ((value >= 0) && (value <= coral::u16_max))
|
||||
return static_cast<coral::u16>(value);
|
||||
|
||||
return {};
|
||||
};
|
||||
|
||||
coral::u16 const width{config.get_field("width").
|
||||
as_integer().map(as_u16).value_or(0)};
|
||||
|
||||
if (width == 0) return system.log(app::log_level::error,
|
||||
"failed to decode `width` property of config");
|
||||
|
||||
coral::u16 const height{config.get_field("height").as_u16().value_or(0)};
|
||||
coral::u16 const height{config.get_field("height").
|
||||
as_integer().map(as_u16).value_or(0)};
|
||||
|
||||
if (height == 0) return system.log(app::log_level::error,
|
||||
"failed to decode `height` property of config");
|
||||
|
|
Loading…
Reference in New Issue