#include #include #include #include "mlp_priv.h" mlp_array *mlp_array_alloc(mlp_runtime* rt, mlp_type type, int size, void *handle){ mlp_array *a = MLP_MALLOC(mlp_array) ; a->runtime = rt ; a->type = type ; a->size = size ; a->handle = handle ; a->stringy = NULL ; return a ; } mlp_type mlp_array_get_type(const mlp_array *arr){ return arr->type ; } int mlp_array_get_size(const mlp_array *arr){ return arr->size ; } void *mlp_array_get_handle(const mlp_array *arr){ return arr->handle ; } mlp_runtime *mlp_array_get_runtime(const mlp_array *arr){ return arr->runtime ; } const char *mlp_array_to_string(mlp_array *arr){ if (arr->stringy != NULL){ return arr->stringy ; } const char *lang = mlp_language_get_name(mlp_runtime_get_language(mlp_array_get_runtime(arr))) ; int len = strlen(lang) + 64 ; arr->stringy = (char *)malloc(len * sizeof(char)) ; if (arr->handle != NULL){ snprintf(arr->stringy, len-1, "%s, %d, %d, %p", lang, arr->type, arr->size, arr->handle) ; } else { snprintf(arr->stringy, len-1, "%s, %d, %d, NULL", lang, arr->type, arr->size) ; } return arr->stringy ; } mlp_value *mlp_array_new(mlp_context *ctx, mlp_runtime* rt, mlp_type type, int size){ mlp_context_clear_error(ctx) ; const mlp_interface *iface = mlp_language_get_iface(mlp_runtime_get_language(rt)) ; mlp_value *ret = iface->array_new(ctx, rt, type, size) ; if (mlp_context_has_error(ctx)){ return NULL ; } return ret ; } mlp_value *mlp_array_get_element(mlp_context *ctx, mlp_array *arr, int idx){ mlp_context_clear_error(ctx) ; const mlp_interface *iface = mlp_language_get_iface(mlp_runtime_get_language(mlp_array_get_runtime(arr))) ; mlp_value *ret = iface->array_get_element(ctx, arr, idx) ; if (mlp_context_has_error(ctx)){ return NULL ; } return ret ; } void mlp_array_set_element(mlp_context *ctx, mlp_array *arr, int idx, mlp_value *e){ mlp_context_clear_error(ctx) ; const mlp_interface *iface = mlp_language_get_iface(mlp_runtime_get_language(mlp_array_get_runtime(arr))) ; iface->array_set_element(ctx, arr, idx, e) ; } void mlp_array_delete(mlp_context *ctx, mlp_array *arr){ mlp_debug(2, "-> Array delete: %s", mlp_array_to_string(arr)) ; mlp_context_clear_error(ctx) ; const mlp_interface *iface = mlp_language_get_iface(arr->runtime->language) ; iface->array_delete(ctx, arr) ; if (arr->stringy != NULL){ free(arr->stringy) ; } free(arr) ; mlp_debug(2, "<- Array delete") ; }