some memory management

This commit is contained in:
FelixBrendel
2019-01-28 13:39:10 +01:00
parent a297f59946
commit 29bd534525
15 changed files with 430 additions and 395 deletions
+23 -32
View File
@@ -1,11 +1,3 @@
// forward decls -- start
void load_built_ins_into_environment(Environment*);
Lisp_Object* eval_expr(Lisp_Object*, Environment*);
void parse_argument_list(Lisp_Object*, Function*);
int list_length(Lisp_Object*);
// forward decls -- end
namespace Parser {
#define inject_scl(_ret) \
@@ -113,7 +105,7 @@ namespace Parser {
double number;
char* str_number = read_atom(text, index_in_text);
sscanf(str_number, "%lf", &number);
Lisp_Object* ret = create_lisp_object_number(number);
Lisp_Object* ret = Memory::create_lisp_object_number(number);
inject_scl(ret);
return ret;
}
@@ -123,7 +115,7 @@ namespace Parser {
++(*index_in_text);
++parser_col;
char* str_keyword = read_atom(text, index_in_text);
Lisp_Object* ret = create_lisp_object_keyword(str_keyword);
Lisp_Object* ret = Memory::create_lisp_object_keyword(str_keyword);
inject_scl(ret);
return ret;
}
@@ -131,7 +123,7 @@ namespace Parser {
Lisp_Object* parse_symbol(char* text, int* index_in_text) {
// we are now at the first char of the symbol
char* str_symbol = read_atom(text, index_in_text);
Lisp_Object* ret = create_lisp_object_symbol(str_symbol);
Lisp_Object* ret = Memory::create_lisp_object_symbol(str_symbol);
inject_scl(ret);
return ret;
}
@@ -146,7 +138,7 @@ namespace Parser {
if (text[*index_in_text] == '"') {
char* str = new(char);
*str = '\0';
Lisp_Object* ret = create_lisp_object_string(str, 0);
Lisp_Object* ret = Memory::create_lisp_object_string(str, 0);
inject_scl(ret);
// plus one because we want to go after the quotes
@@ -187,7 +179,7 @@ namespace Parser {
*index_in_text += string_length +1; // plus one because we want to
// go after the quotes
Lisp_Object* ret = create_lisp_object_string(string, string_length);
Lisp_Object* ret = Memory::create_lisp_object_string(string, string_length);
inject_scl(ret);
return ret;
}
@@ -246,17 +238,17 @@ namespace Parser {
}
if (quoteType == '\'')
return create_lisp_object_pair(
create_lisp_object_symbol("quote"),
create_lisp_object_pair(result, create_lisp_object_nil()));
return Memory::create_lisp_object_pair(
Memory::create_lisp_object_symbol("quote"),
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
else if (quoteType == '`')
return create_lisp_object_pair(
create_lisp_object_symbol("quasiquote"),
create_lisp_object_pair(result, create_lisp_object_nil()));
return Memory::create_lisp_object_pair(
Memory::create_lisp_object_symbol("quasiquote"),
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
// it has to be an unquote
return create_lisp_object_pair(
create_lisp_object_symbol("unquote"),
create_lisp_object_pair(result, create_lisp_object_nil()));
return Memory::create_lisp_object_pair(
Memory::create_lisp_object_symbol("unquote"),
Memory::create_lisp_object_pair(result, Memory::create_lisp_object_nil()));
}
@@ -271,11 +263,11 @@ namespace Parser {
if (text[(*index_in_text)] == ')') {
++(*index_in_text);
++parser_col;
return create_lisp_object_nil();
return Memory::create_lisp_object_nil();
}
// okay there is something
Lisp_Object* head = new(Lisp_Object);
Lisp_Object* head = Memory::create_lisp_object();
head->type = Lisp_Object_Type::Pair;
head->value.pair = new(Pair);
Lisp_Object* expression = head;
@@ -303,7 +295,7 @@ namespace Parser {
if (text[(*index_in_text)] == ')') {
head->value.pair->rest = create_lisp_object_nil();
head->value.pair->rest = Memory::create_lisp_object_nil();
++parser_col;
++(*index_in_text);
break;
@@ -325,7 +317,7 @@ namespace Parser {
++(*index_in_text);
break;
} else {
head->value.pair->rest = create_lisp_object_pair(nullptr, nullptr);
head->value.pair->rest = Memory::create_lisp_object_pair(nullptr, nullptr);
head = head->value.pair->rest;
}
}
@@ -387,17 +379,17 @@ namespace Parser {
// we are now in the function body, just wrap it in an
// implicit prog
function->body = create_lisp_object_pair(
create_lisp_object_symbol("prog"),
function->body = Memory::create_lisp_object_pair(
Memory::create_lisp_object_symbol("prog"),
arguments);
Lisp_Object* macro = new(Lisp_Object);
Lisp_Object* macro = Memory::create_lisp_object();
macro->type = Lisp_Object_Type::Function;
macro->value.function = function;
define_symbol(symbol_for_macro, macro, environment_for_macros);
// print_environment(environment_for_macros);
return create_lisp_object_nil();
return Memory::create_lisp_object_nil();
} else if (string_equal("delete-syntax", expression->value.pair->first->value.symbol->identifier)) {
/* --- deleting an existing macro --- */
@@ -453,7 +445,7 @@ namespace Parser {
Lisp_Object* result;
eat_until_code(text, &index_in_text);
if (text[(index_in_text)] == '\0')
return create_lisp_object_nil();
return Memory::create_lisp_object_nil();
if (text[index_in_text] == '(' ||
text[index_in_text] == '\'' ||
text[index_in_text] == '`' ||
@@ -536,5 +528,4 @@ namespace Parser {
}
#undef inject_scl
}