about summary refs log tree commit diff
path: root/src/bootstrap
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-05 12:42:48 +0200
committerBaitinq <[email protected]>2025-07-05 12:42:48 +0200
commit6ba146ff763c0beac32cafc47c271bb0c2c3a74f (patch)
tree6726fa186d6f70e5ecfc3af2331911a5199ab94a /src/bootstrap
parentBootstrap: Codegen: start working on function calls (diff)
downloadpry-lang-6ba146ff763c0beac32cafc47c271bb0c2c3a74f.tar.gz
pry-lang-6ba146ff763c0beac32cafc47c271bb0c2c3a74f.tar.bz2
pry-lang-6ba146ff763c0beac32cafc47c271bb0c2c3a74f.zip
Boostrap: Support adding variables to environment
Diffstat (limited to 'src/bootstrap')
-rw-r--r--src/bootstrap/codegen.pry55
-rw-r--r--src/bootstrap/parser.pry2
2 files changed, 48 insertions, 9 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index d02baa5..fefc17d 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -35,13 +35,38 @@ let environment_drop_scope = (e: *Environment) => void {
 	return;
 };
 
-/* TODO: */
-let environment_add_variale = (e: *Environment, name: *i8, variable: *Variable) => void {
+let environment_get_variable = (e: *Environment, name: *i8) => *Variable {
+	let i = (*e).scope_stack_len;
+	let variable = cast(*Variable, null);
+
+	while i > 0 {
+		i = i - 1;
+		let scope = *(((*e).scope_stack + cast(**Scope, i)));
+		let v = cast(*Variable, hashmap_get((*scope).variables, name));
+		if v != cast(*Variable, null) {
+			if variable == cast(*Variable, null) {
+				variable = v;
+			};
+			let stack_level = cast(*i64, arena_alloc((*e).arena, sizeof(i64)));
+			(*stack_level) = i;
+			(*variable).stack_level = stack_level;
+		};
+	};
+
+	return variable;
+};
+
+let environment_add_variable = (e: *Environment, name: *i8, variable: *Variable) => void {
+	let top_scope = *(((*e).scope_stack + cast(**Scope, (*e).scope_stack_len - 1)));
+	hashmap_put((*top_scope).variables, name, cast(*void, variable));
+
 	return;
 };
 
-/* TODO: */
-let environment_set_variale = (e: *Environment, name: *i8, varbiable: *Variable) => void {
+let environment_set_variable = (e: *Environment, name: *i8, variable: *Variable) => void {
+	let existing = environment_get_variable(e, name);
+	(*existing) = (*variable);
+
 	return;
 };
 
@@ -264,7 +289,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		let last_function_retur_type = (*c).current_function_retur_type;
 		(*c).current_function_retur_type = function_definition.retur_type;
 
-		/* TODO: Defer */
+		/* TODO: Defer. For now we do at the end */
 
 		let d = cast(*NODE_TYPE_FUNCTION_TYPE_DATA, arena_alloc((*c).arena, sizeof(NODE_TYPE_FUNCTION_TYPE_DATA)));
 		(*d).parameters = param_types;
@@ -308,6 +333,12 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		v.stack_level = cast(*i64, null);
 		v.node = expression;
 		v.node_type = node_type;
+
+		/* TODO: Move to defer */
+		(*c).current_function = last_function;
+		environment_drop_scope((*c).environment);
+		
+
 		return codegen_create_variable(c, v);
 	};
 	
@@ -351,7 +382,11 @@ let codegen_generate_assignment_statement = (c: *codegen, stmt: *NODE_ASSIGNMENT
 		let variable = codegen_generate_expression_value(c, prhs, identifier);
 		assert(variable != cast(*Variable, null));
 
-		/* TODO IMPORTANT: Add variable to variables */
+		let env = (*(*c).environment);
+		/* TODO: Support assignments at non-global level */
+		assert(env.scope_stack_len == 1);
+
+		environment_add_variable((*c).environment, identifier, variable);
 
 		return 0;
 	};
@@ -380,12 +415,16 @@ let codegen_generate_return_statement = (c: *codegen, stmt: *NODE_RETURN_STATEME
 
 	LLVMBuildRet((*c).builder, (*val).value);
 
-	printf("BYE!\n");
-
 	return 0;
 };
 
 let codegen_generate_function_call_statement = (c: *codegen, stmt: *NODE_FUNCTION_CALL_STATEMENT_DATA) => i64 {
+	let expression = (*(*stmt).expression);
+	assert(expression.type == NODE_PRIMARY_EXPRESSION_IDENTIFIER); /* TODO: Function definition support */
+
+	let ident = (*cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, expression.data));
+	let function = environment_get_variable((*c).environment, ident.name);
+
 	printf("LELELEL\n");
 	assert(false);
 
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 2413471..6ad7a39 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -642,7 +642,7 @@ let parse_function_call_statement = (p: *parser) => *Node {
 	};
 
 	let expression_data = cast(*NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA, arena_alloc((*p).arena, sizeof(NODE_PRIMARY_EXPRESSION_IDENTIFIER_DATA)));
-	(*expression_data).name = cast(*i8, ident.data);
+	(*expression_data).name = cast(*i8, (*ident).data);
 	let expression = cast(*Node, arena_alloc((*p).arena, sizeof(Node)));
 	(*expression).type = NODE_PRIMARY_EXPRESSION_IDENTIFIER;
 	(*expression).data = cast(*void, expression_data);