diff --git a/Nub.Lang/Nub.Lang/Backend/Custom/SymbolTable.cs b/Nub.Lang/Nub.Lang/Backend/Custom/SymbolTable.cs index 00a9ed3..73f8750 100644 --- a/Nub.Lang/Nub.Lang/Backend/Custom/SymbolTable.cs +++ b/Nub.Lang/Nub.Lang/Backend/Custom/SymbolTable.cs @@ -78,17 +78,46 @@ public class SymbolTable variables.Add(new LocalVariable(parameter.Name, parameter.Type, offset)); } - foreach (var statement in localFuncDefinition.Body.Statements) + ResolveBlockVariables(localFuncDefinition.Body, variables, offset); + + return variables; + } + + private static int ResolveBlockVariables(BlockNode block, List variables, int offset) + { + foreach (var statement in block.Statements) { - if (statement is VariableAssignmentNode variableAssignment) + switch (statement) { - offset += 8; - variables.Add(new LocalVariable(variableAssignment.Name, variableAssignment.Value.Type, offset)); + case IfNode ifStatement: + { + offset += ResolveBlockVariables(ifStatement.Body, variables, offset); + if (ifStatement.Else.HasValue) + { + ifStatement.Else.Value.Match + ( + elseIfStatement => offset += ResolveBlockVariables(elseIfStatement.Body, variables, offset), + elseStatement => offset += ResolveBlockVariables(elseStatement, variables, offset) + ); + } + break; + } + case WhileNode whileStatement: + { + offset += ResolveBlockVariables(whileStatement.Body, variables, offset); + break; + } + case VariableAssignmentNode variableAssignment: + { + offset += 8; + variables.Add(new LocalVariable(variableAssignment.Name, variableAssignment.Value.Type, offset)); + break; + } } } - return variables; - } + return offset; + } public Func ResolveFunc(string name, List parameterTypes) { diff --git a/input/program.nub b/input/program.nub index 18343e0..a851190 100644 --- a/input/program.nub +++ b/input/program.nub @@ -1,53 +1,21 @@ import "core"; func main() { - let x = new Test - { - some_struct = new Test - { - some_struct = 0, - some_int = 420, - some_string = "blaze it" - }, - some_int = 69, - some_string = "nice" - }; - - println(x.some_int); - println(x.some_string); - - println(x.some_struct.some_int); - println(x.some_struct.some_string); - - let x = new Array(23); - - x[23] = "test"; - - println(x[23]); - println(arr_size(x)); -} - -struct Test { - let some_struct: Test; - let some_string: String; - let some_int: int64; -} - -func example() { - let some_string = "test"; - println(some_string); - - let some_array = new Array(2); - some_array[1] = 123; - some_array[2] = 124; - let i = 1; - - println(some_array[1]); - println(some_array[2]); - - while i <= arr_size(some_array) { - println(some_array[i]); + while true { + let x = new Human + { + name = "test", + age = i + }; + + println(x.age); + i = i + 1; } +} + +struct Human { + let name: String; + let age: int64; } \ No newline at end of file diff --git a/output/profile.sh b/output/profile.sh new file mode 100644 index 0000000..3f3bccf --- /dev/null +++ b/output/profile.sh @@ -0,0 +1,3 @@ +#!/bin/sh +./build.sh +valgrind -s ./out