Switch values to having their data refcounted separately.

This allows for values to be "cast" and have a different type, while
still referencing the same data.
This commit is contained in:
2018-05-14 17:41:41 -07:00
parent 3e8c814215
commit cf3136a237
5 changed files with 72 additions and 20 deletions

View File

@@ -1,17 +1,27 @@
#include "value.h"
#include "parsetype.h"
void libab_value_init(libab_value* value, void* data, libab_ref* type) {
value->data = data;
void libab_value_init_ref(libab_value* value, libab_ref* data, libab_ref* type) {
libab_ref_copy(data, &value->data);
libab_ref_copy(type, &value->type);
}
void libab_value_free(libab_value* value) {
void (*free_function)(void*);
libab_parsetype* value_type;
value_type = libab_ref_get(&value->type);
free_function = value_type->data_u.base->free_function;
libab_ref_free(&value->type);
if (free_function)
free_function(value->data);
libab_result libab_value_init_raw(libab_value* value, void* data, libab_ref* type) {
libab_result result = LIBAB_SUCCESS;
libab_ref tmp_ref;
result = libab_ref_new(&tmp_ref, data,
((libab_parsetype*) libab_ref_get(type))->data_u.base->free_function);
if(result == LIBAB_SUCCESS) {
libab_value_init_ref(value, &tmp_ref, type);
libab_ref_free(&tmp_ref);
}
return result;
}
void libab_value_free(libab_value* value) {
libab_ref_free(&value->data);
libab_ref_free(&value->type);
}