about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-07-15 00:12:28 +0200
committerBaitinq <[email protected]>2025-07-15 00:14:09 +0200
commit97f738867bde8ae29b1cdc5fd4fdac8a99e158de (patch)
tree7869f91ddb9ebd266234270e3ca1ea5addc02bce
parentBoostrap: Fix building with stage1 (diff)
downloadpry-lang-97f738867bde8ae29b1cdc5fd4fdac8a99e158de.tar.gz
pry-lang-97f738867bde8ae29b1cdc5fd4fdac8a99e158de.tar.bz2
pry-lang-97f738867bde8ae29b1cdc5fd4fdac8a99e158de.zip
Boostrap: Add todos
-rw-r--r--src/bootstrap/codegen.pry6
-rw-r--r--src/bootstrap/parser.pry2
2 files changed, 6 insertions, 2 deletions
diff --git a/src/bootstrap/codegen.pry b/src/bootstrap/codegen.pry
index 77f1430..5f47efb 100644
--- a/src/bootstrap/codegen.pry
+++ b/src/bootstrap/codegen.pry
@@ -58,6 +58,7 @@ let environment_get_variable = (e: *Environment, name: *i8) => *Variable {
 };
 
 let environment_add_variable = (e: *Environment, name: *i8, variable: *Variable) => void {
+        /* TODO: Dont allow shadowing if value != value or type != type (across things) */
 	let top_scope = *(((*e).scope_stack + cast(**Scope, (*e).scope_stack_len - 1)));
 	hashmap_put((*top_scope).variables, name, cast(*void, variable));
 
@@ -402,7 +403,7 @@ let codegen_get_struct_field = (c: *codegen, node: *Node, name: *i8) => *StructF
 		let simple_type = *cast(*NODE_TYPE_SIMPLE_TYPE_DATA, (*pt_type).data);
 		let v = environment_get_variable((*c).environment, simple_type.name);
 		assert(v != cast(*Variable, null));
-		typ = (*v).node_type;
+		typ = (*v).node_type; /* TODO: we shouldnt be able to get fields of pointers, we have to dref first */
 	};
 	if (*ptr_typ).type == NODE_TYPE_SIMPLE_TYPE {
 		let simple_type = *cast(*NODE_TYPE_SIMPLE_TYPE_DATA, (*ptr_typ).data);
@@ -912,7 +913,7 @@ let codegen_generate_expression_value = (c: *codegen, expression: *Node, name: *
 		let val = codegen_generate_expression_value(c, exp.expression, "");
 		assert(val != cast(*Variable, null));
 		let v = Variable{};
-		v.value = (*val).value;
+		v.value = (*val).value; /* TODO: Do real casting */
 		v.type = cast(LLVMTypeRef, null);
 		v.stack_level = cast(*i64, null);
 		v.node = expression;
@@ -1062,6 +1063,7 @@ let codegen_generate_assignment_statement = (c: *codegen, stmt: *NODE_ASSIGNMENT
 			assert(v != cast(*Variable, null));
 			ptr = (*v).value;
 			typ = (*v).node_type;
+			/* TODO: Do this in more places! (everywhere get_llvm_type or get_variable?)  Also check types in return and cmp */
 			assert(compare_types(c, typ, (*variable).node_type, (*stmt).is_dereference));
 		};
 
diff --git a/src/bootstrap/parser.pry b/src/bootstrap/parser.pry
index 47b1918..0b448d0 100644
--- a/src/bootstrap/parser.pry
+++ b/src/bootstrap/parser.pry
@@ -436,6 +436,7 @@ let parser_parse_type = (p: *parser) => *Node {
 	let to = parser_consume_token(p);
 	assert(to != cast(*token, null));
 
+	/* TODO: we should only accept specific type identifiers */
 	if (*to).type == TOKEN_IDENTIFIER {
 		let d = cast(*NODE_TYPE_SIMPLE_TYPE_DATA, arena_alloc((*p).arena, sizeof(NODE_TYPE_SIMPLE_TYPE_DATA)));
 		(*d).name = cast(*i8, (*to).data);
@@ -1318,6 +1319,7 @@ let parse_function_call_statement = (p: *parser) => *Node {
 
 /* Statement    ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | CastStatement | SizeOfStatement | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement | "break" | "continue") SEMICOLON */
 let parser_parse_statement = (p: *parser) => *Node {
+	/* TODO: Can we not deal with cast / sizeof in parser? */
 	let fn_call = parser_accept_parse(p, parser_parse_cast_statement);
 	if fn_call != cast(*Node, null) {
 		if parser_accept_token(p, TOKEN_SEMICOLON) == cast(*token, null) {