Compare commits
12 Commits
gc
...
8c9acafc93
| Author | SHA1 | Date | |
|---|---|---|---|
| 8c9acafc93 | |||
| 37593abe40 | |||
| 0065fe5e65 | |||
| de0ad13785 | |||
| 3d0e4776fc | |||
| 3fc7f46680 | |||
| cf57c4a29a | |||
| 59b03d0a94 | |||
| ffcbab9d94 | |||
| 8847643c2e | |||
| 0b7b49d03d | |||
| 512d68000f |
@@ -1,8 +0,0 @@
|
|||||||
#ifndef LIBABACUS_REFCOUNT_INTERNAL_H
|
|
||||||
#define LIBABACUS_REFCOUNT_INTERNAL_H
|
|
||||||
|
|
||||||
#include "refcount.h"
|
|
||||||
|
|
||||||
void libab_ref_count_changed(libab_ref_count* count);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -187,5 +187,19 @@ void* libab_unwrap_param(libab_ref_vec* vec, size_t index);
|
|||||||
* @param buffer_size the size of the to buffer.
|
* @param buffer_size the size of the to buffer.
|
||||||
*/
|
*/
|
||||||
void libab_sanitize(char* to, const char* from, size_t buffer_size);
|
void libab_sanitize(char* to, const char* from, size_t buffer_size);
|
||||||
|
/**
|
||||||
|
* Creates a new instance of libabacus allocated on the heap.
|
||||||
|
* @param into the pointer into which to store the newly allocated libab instance.
|
||||||
|
* @param parse_function the function used to parse numbers.
|
||||||
|
* @param free_function the function used to free parsed numbers.
|
||||||
|
*/
|
||||||
|
libab_result libab_create_instance(libab** into,
|
||||||
|
void* (*parse_function)(const char*),
|
||||||
|
void (*free_function)(void*));
|
||||||
|
/**
|
||||||
|
* Destroys the given libabacus instance allocated on the stack.
|
||||||
|
* @param into the reference to destroy.
|
||||||
|
*/
|
||||||
|
void libab_destroy_instance(libab* into);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -15,6 +15,9 @@ void libab_behavior_init_tree(libab_behavior* behavior, libab_tree* tree) {
|
|||||||
void libab_behavior_copy(libab_behavior* behavior, libab_behavior* into) {
|
void libab_behavior_copy(libab_behavior* behavior, libab_behavior* into) {
|
||||||
into->variant = behavior->variant;
|
into->variant = behavior->variant;
|
||||||
into->data_u = behavior->data_u;
|
into->data_u = behavior->data_u;
|
||||||
|
if(into->variant == BIMPL_TREE) {
|
||||||
|
into->data_u.tree->int_value++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void libab_behavior_free(libab_behavior* behavior) {
|
void libab_behavior_free(libab_behavior* behavior) {
|
||||||
|
|||||||
1
src/gc.c
1
src/gc.c
@@ -3,7 +3,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include "refcount_internal.h"
|
|
||||||
|
|
||||||
void libab_gc_list_init(libab_gc_list* list) {
|
void libab_gc_list_init(libab_gc_list* list) {
|
||||||
memset(&list->head_sentinel, 0, sizeof(list->head_sentinel));
|
memset(&list->head_sentinel, 0, sizeof(list->head_sentinel));
|
||||||
|
|||||||
@@ -71,13 +71,11 @@ FUNCTION(xor) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION(atan) {
|
FUNCTION(atan) {
|
||||||
printf("atan called\n");
|
|
||||||
double* val = libab_unwrap_param(params, 0);
|
double* val = libab_unwrap_param(params, 0);
|
||||||
return create_double_value(ab, atan(*val), into);
|
return create_double_value(ab, atan(*val), into);
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNCTION(atan2) {
|
FUNCTION(atan2) {
|
||||||
printf("atan2 called\n");
|
|
||||||
double* left = libab_unwrap_param(params, 0);
|
double* left = libab_unwrap_param(params, 0);
|
||||||
double* right = libab_unwrap_param(params, 1);
|
double* right = libab_unwrap_param(params, 1);
|
||||||
return create_double_value(ab, atan2(*left, *right), into);
|
return create_double_value(ab, atan2(*left, *right), into);
|
||||||
@@ -115,7 +113,6 @@ FUNCTION(print_unit) {
|
|||||||
libab_result result = LIBAB_SUCCESS; \
|
libab_result result = LIBAB_SUCCESS; \
|
||||||
double right; \
|
double right; \
|
||||||
double left; \
|
double left; \
|
||||||
printf(#name " called\n"); \
|
|
||||||
left = *((double*)libab_unwrap_param(params, 0)); \
|
left = *((double*)libab_unwrap_param(params, 0)); \
|
||||||
right = *((double*)libab_unwrap_param(params, 1)); \
|
right = *((double*)libab_unwrap_param(params, 1)); \
|
||||||
create_double_value(ab, expression, into); \
|
create_double_value(ab, expression, into); \
|
||||||
@@ -176,6 +173,7 @@ libab_result register_functions(libab* ab) {
|
|||||||
libab_ref_free(&trig_type);
|
libab_ref_free(&trig_type);
|
||||||
libab_ref_free(&atan2_type);
|
libab_ref_free(&atan2_type);
|
||||||
libab_ref_free(&difficult_type);
|
libab_ref_free(&difficult_type);
|
||||||
|
libab_ref_free(&equals_num_type);
|
||||||
libab_ref_free(&print_num_type);
|
libab_ref_free(&print_num_type);
|
||||||
libab_ref_free(&print_unit_type);
|
libab_ref_free(&print_unit_type);
|
||||||
libab_ref_free(&print_bool_type);
|
libab_ref_free(&print_bool_type);
|
||||||
@@ -216,7 +214,6 @@ libab_result loop(libab* ab, int interaction_count, libab_ref* scope) {
|
|||||||
int main() {
|
int main() {
|
||||||
libab_result result;
|
libab_result result;
|
||||||
libab_ref scope;
|
libab_ref scope;
|
||||||
libab_ref test;
|
|
||||||
libab ab;
|
libab ab;
|
||||||
|
|
||||||
if (libab_init(&ab, impl_parse, impl_free) != LIBAB_SUCCESS) {
|
if (libab_init(&ab, impl_parse, impl_free) != LIBAB_SUCCESS) {
|
||||||
@@ -230,8 +227,6 @@ int main() {
|
|||||||
}
|
}
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
loop(&ab, INTERACTIONS, &scope);
|
loop(&ab, INTERACTIONS, &scope);
|
||||||
libab_table_search_value(libab_ref_get(&scope), "test", &test);
|
|
||||||
printf("%p\n", libab_ref_get(&test));
|
|
||||||
libab_ref_free(&scope);
|
libab_ref_free(&scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -623,7 +623,6 @@ libab_result _interpreter_copy_type_offset(libab_ref* type,
|
|||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
libab_parsetype* new_type;
|
libab_parsetype* new_type;
|
||||||
libab_parsetype* copy_of = libab_ref_get(type);
|
libab_parsetype* copy_of = libab_ref_get(type);
|
||||||
size_t index = 0;
|
|
||||||
if((new_type = malloc(sizeof(*new_type)))) {
|
if((new_type = malloc(sizeof(*new_type)))) {
|
||||||
new_type->variant = copy_of->variant;
|
new_type->variant = copy_of->variant;
|
||||||
new_type->data_u = copy_of->data_u;
|
new_type->data_u = copy_of->data_u;
|
||||||
@@ -632,9 +631,9 @@ libab_result _interpreter_copy_type_offset(libab_ref* type,
|
|||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
libab_ref child_type_ref;
|
libab_ref child_type_ref;
|
||||||
|
|
||||||
for(; index < copy_of->children.size - 1 - offset &&
|
for(; offset < copy_of->children.size &&
|
||||||
result == LIBAB_SUCCESS; index++) {
|
result == LIBAB_SUCCESS; offset++) {
|
||||||
libab_ref_vec_index(©_of->children, offset + index, &child_type_ref);
|
libab_ref_vec_index(©_of->children, offset, &child_type_ref);
|
||||||
result = libab_ref_vec_insert(&new_type->children, &child_type_ref);
|
result = libab_ref_vec_insert(&new_type->children, &child_type_ref);
|
||||||
libab_ref_free(&child_type_ref);
|
libab_ref_free(&child_type_ref);
|
||||||
}
|
}
|
||||||
@@ -676,7 +675,7 @@ libab_result _interpreter_partially_apply(struct interpreter_state* state,
|
|||||||
result = _interpreter_copy_function_with_params(state->ab, &value->data, params, scope, &new_function);
|
result = _interpreter_copy_function_with_params(state->ab, &value->data, params, scope, &new_function);
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
libab_ref_free(&new_type);
|
libab_ref_free(&new_type);
|
||||||
result = _interpreter_copy_type_offset(&value->type, 0, &new_type);
|
result = _interpreter_copy_type_offset(&value->type, params->size, &new_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
|||||||
@@ -1056,9 +1056,8 @@ libab_result _parse_expression(struct parser_state* state,
|
|||||||
while (result == LIBAB_SUCCESS && op_stack.tail &&
|
while (result == LIBAB_SUCCESS && op_stack.tail &&
|
||||||
_parser_match_is_op(op_stack.tail->data)) {
|
_parser_match_is_op(op_stack.tail->data)) {
|
||||||
libab_lexer_match* other_token = op_stack.tail->data;
|
libab_lexer_match* other_token = op_stack.tail->data;
|
||||||
if(other_token->type == TOKEN_OP_INFIX) {
|
if(other_token->type == TOKEN_OP_INFIX || other_token->type == TOKEN_OP_RESERVED) {
|
||||||
_parser_find_operator_infix(state, op_stack.tail->data,
|
_parser_find_operator_infix(state, other_token, &other_operator);
|
||||||
&other_operator);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (other_token->type == TOKEN_OP_PREFIX ||
|
if (other_token->type == TOKEN_OP_PREFIX ||
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
#include "refcount_internal.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
void libab_ref_count_changed(libab_ref_count* count) {
|
|
||||||
if (count->strong == 0) {
|
|
||||||
count->strong--;
|
|
||||||
if (count->free_func) {
|
|
||||||
count->free_func(count->data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (count->weak == 0) {
|
|
||||||
if(count->prev) count->prev->next = count->next;
|
|
||||||
if(count->next) count->next->prev = count->prev;
|
|
||||||
free(count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
35
src/util.c
35
src/util.c
@@ -291,8 +291,12 @@ libab_result libab_create_value_raw(libab* ab, libab_ref* into,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _gc_visit_function_children(void* function, libab_visitor_function_ptr visitor, void* data) {
|
void _gc_visit_function_children(void* function, libab_visitor_function_ptr visitor, void* data) {
|
||||||
|
size_t index = 0;
|
||||||
libab_function* func = function;
|
libab_function* func = function;
|
||||||
libab_gc_visit(&func->scope, visitor, data);
|
libab_gc_visit(&func->scope, visitor, data);
|
||||||
|
for(; index < func->params.size; index++) {
|
||||||
|
libab_gc_visit(&func->params.data[index], visitor, data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
libab_result libab_create_function_internal(libab* ab, libab_ref* into,
|
libab_result libab_create_function_internal(libab* ab, libab_ref* into,
|
||||||
@@ -385,6 +389,15 @@ libab_result libab_create_function_behavior(libab* ab, libab_ref* into,
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void _gc_visit_function_list_children(void* list, libab_visitor_function_ptr visitor, void* data) {
|
||||||
|
size_t index = 0;
|
||||||
|
libab_function_list* func_list = list;
|
||||||
|
for(; index < func_list->functions.size; index++) {
|
||||||
|
libab_gc_visit(&func_list->functions.data[index], visitor, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
libab_result libab_create_function_list(libab* ab, libab_ref* into, libab_ref* type) {
|
libab_result libab_create_function_list(libab* ab, libab_ref* into, libab_ref* type) {
|
||||||
libab_function_list* list;
|
libab_function_list* list;
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
@@ -408,7 +421,7 @@ libab_result libab_create_function_list(libab* ab, libab_ref* into, libab_ref* t
|
|||||||
libab_ref_null(into);
|
libab_ref_null(into);
|
||||||
free(list);
|
free(list);
|
||||||
} else {
|
} else {
|
||||||
libab_gc_add(into, _gc_visit_function_children, &ab->containers);
|
libab_gc_add(into, _gc_visit_function_list_children, &ab->containers);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@@ -477,3 +490,23 @@ void libab_sanitize(char* to, const char* from, size_t buffer_size) {
|
|||||||
}
|
}
|
||||||
to[index] = '\0';
|
to[index] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libab_result libab_create_instance(libab** into,
|
||||||
|
void* (*parse_function)(const char*),
|
||||||
|
void (*free_function)(void*)) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
if((*into = malloc(sizeof(**into)))) {
|
||||||
|
result = libab_init(*into, parse_function, free_function);
|
||||||
|
if(result != LIBAB_SUCCESS) {
|
||||||
|
free(*into);
|
||||||
|
*into = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = LIBAB_MALLOC;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
void libab_destroy_instance(libab* into) {
|
||||||
|
libab_free(into);
|
||||||
|
free(into);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user