101 lines
2.9 KiB
C
101 lines
2.9 KiB
C
#include <mie/ctx.h>
|
|
#include <mie/dialect/builtin.h>
|
|
#include <mie/dialect/dialect.h>
|
|
#include <mie/macros.h>
|
|
|
|
struct builtin_dialect {
|
|
struct mie_dialect d_base;
|
|
struct mie_string_cache *ctx_strings;
|
|
struct mie_int_cache *ctx_ints;
|
|
struct mie_float_cache *ctx_floats;
|
|
struct mie_index_cache *ctx_indices;
|
|
};
|
|
|
|
static enum mie_status init(struct mie_dialect *d)
|
|
{
|
|
struct builtin_dialect *dialect = (struct builtin_dialect *)d;
|
|
dialect->ctx_strings = mie_string_cache_create();
|
|
dialect->ctx_ints = mie_int_cache_create();
|
|
dialect->ctx_floats = mie_float_cache_create();
|
|
dialect->ctx_indices = mie_index_cache_create();
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
static enum mie_status cleanup(struct mie_dialect *d)
|
|
{
|
|
struct builtin_dialect *dialect = (struct builtin_dialect *)d;
|
|
mie_string_cache_destroy(dialect->ctx_strings);
|
|
mie_int_cache_destroy(dialect->ctx_ints);
|
|
mie_float_cache_destroy(dialect->ctx_floats);
|
|
mie_index_cache_destroy(dialect->ctx_indices);
|
|
return MIE_SUCCESS;
|
|
}
|
|
|
|
struct mie_attribute *mie_ctx_get_int(
|
|
struct mie_ctx *ctx, long long val, size_t nr_bits)
|
|
{
|
|
struct builtin_dialect *dialect
|
|
= (struct builtin_dialect *)mie_ctx_get_dialect(ctx, "builtin");
|
|
if (!dialect) {
|
|
return NULL;
|
|
}
|
|
|
|
return (struct mie_attribute *)mie_int_cache_get(
|
|
dialect->ctx_ints, ctx, val, nr_bits);
|
|
}
|
|
|
|
struct mie_attribute *mie_ctx_get_float(
|
|
struct mie_ctx *ctx, double val, size_t nr_bits)
|
|
{
|
|
struct builtin_dialect *dialect
|
|
= (struct builtin_dialect *)mie_ctx_get_dialect(ctx, "builtin");
|
|
if (!dialect) {
|
|
return NULL;
|
|
}
|
|
|
|
return (struct mie_attribute *)mie_float_cache_get(
|
|
dialect->ctx_floats, ctx, val, nr_bits);
|
|
}
|
|
|
|
struct mie_attribute *mie_ctx_get_string(struct mie_ctx *ctx, const char *s)
|
|
{
|
|
struct builtin_dialect *dialect
|
|
= (struct builtin_dialect *)mie_ctx_get_dialect(ctx, "builtin");
|
|
if (!dialect) {
|
|
return NULL;
|
|
}
|
|
|
|
return (struct mie_attribute *)mie_string_cache_get(
|
|
dialect->ctx_strings, ctx, s);
|
|
}
|
|
|
|
struct mie_attribute *mie_ctx_get_index(struct mie_ctx *ctx, size_t val)
|
|
{
|
|
struct builtin_dialect *dialect
|
|
= (struct builtin_dialect *)mie_ctx_get_dialect(ctx, "builtin");
|
|
if (!dialect) {
|
|
return NULL;
|
|
}
|
|
|
|
return (struct mie_attribute *)mie_index_cache_get(
|
|
dialect->ctx_indices, ctx, val);
|
|
}
|
|
|
|
MIE_DIALECT_BEGIN(mie_builtin, struct builtin_dialect, "builtin")
|
|
MIE_DIALECT_INIT(init);
|
|
MIE_DIALECT_CLEANUP(cleanup);
|
|
MIE_DIALECT_ADD_TRAIT(mie_builtin_isolated_from_above);
|
|
MIE_DIALECT_ADD_TRAIT(mie_builtin_symbol_table);
|
|
MIE_DIALECT_ADD_TYPE(mie_builtin_int);
|
|
MIE_DIALECT_ADD_TYPE(mie_builtin_float);
|
|
MIE_DIALECT_ADD_TYPE(mie_builtin_index);
|
|
MIE_DIALECT_ADD_TYPE(mie_builtin_string);
|
|
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_int);
|
|
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_float);
|
|
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_type);
|
|
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_string);
|
|
MIE_DIALECT_ADD_INTERFACE(mie_builtin_symbol);
|
|
MIE_DIALECT_ADD_ATTRIBUTE(mie_builtin_array);
|
|
MIE_DIALECT_ADD_OP(mie_builtin_module);
|
|
MIE_DIALECT_END()
|