diff --git a/krakenGrammer.kgm b/krakenGrammer.kgm index 85406ee..da9c8c5 100644 --- a/krakenGrammer.kgm +++ b/krakenGrammer.kgm @@ -61,7 +61,7 @@ for_loop = "for" WS "\(" WS statement WS boolean_expression WS ";" WS statement return_statement = "return" | "return" WS boolean_expression ; -code_block = "{" WS statement_list WS "}" ; +code_block = "{" WS statement_list WS "}" | "{" WS "}" ; statement_list = statement_list WS statement | statement ; statement = if_statement | while_loop | for_loop | return_statement WS ";" | boolean_expression WS ";" | assignment_statement WS ";" | declaration_statement WS ";" | code_block | if_comp | simple_passthrough ; diff --git a/src/CGenerator.cpp b/src/CGenerator.cpp index 44472b3..29cb6ff 100644 --- a/src/CGenerator.cpp +++ b/src/CGenerator.cpp @@ -180,18 +180,32 @@ std::string CGenerator::generate(NodeTree* from, NodeTree* enc return output; } case code_block: + { output += "{\n"; - tabLevel++; + std::string destructorString = ""; + tabLevel++; for (int i = 0; i < children.size(); i++) { //std::cout << "Line " << i << std::endl; std::string line = generate(children[i], enclosingObject); //std::cout << line << std::endl; output += line; - } - tabLevel--; + if (children[i]->getChildren().size() && children[i]->getChildren()[0]->getDataRef()->type == declaration_statement) { + NodeTree *identifier = children[i]->getChildren()[0]->getChildren()[0]; + NodeTree *typeDefinition = identifier->getDataRef()->valueType->typeDefinition; + if (!typeDefinition) + continue; + if (typeDefinition->getDataRef()->scope.find("destruct") == typeDefinition->getDataRef()->scope.end()) + continue; + destructorString += tabs() + CifyName(typeDefinition->getDataRef()->symbol.getName()) + + "__" + "destruct" + "(&" + generate(identifier, enclosingObject) + ");\n";//Call the destructor + } + } + output += destructorString; + tabLevel--; output += tabs() + "}"; return output; - case expression: + } + case expression: output += " " + data.symbol.getName() + ", "; case boolean_expression: output += " " + data.symbol.getName() + " "; diff --git a/tests/destructorTest.expected_results b/tests/destructorTest.expected_results new file mode 100644 index 0000000..b96d8a0 --- /dev/null +++ b/tests/destructorTest.expected_results @@ -0,0 +1 @@ +Hello Destructors! diff --git a/tests/destructorTest.krak b/tests/destructorTest.krak new file mode 100644 index 0000000..21a2619 --- /dev/null +++ b/tests/destructorTest.krak @@ -0,0 +1,28 @@ +import io; + +typedef DestructorPrint { + char* myStr; + DestructorPrint* construct(char* str) { + myStr = str; + return this; + } + void destruct() { + println(myStr); + } +}; + +typedef NoDistruction { + int a; + void dummyFunc() {} +}; + +void indirPrint() { + DestructorPrint testObj.construct("Hello Destructors!"); + NoDistruction dummy; +} + +int main() { + indirPrint(); + return 0; +} + diff --git a/tests/emptyBracesFunction.expected_results b/tests/emptyBracesFunction.expected_results new file mode 100644 index 0000000..1621dff --- /dev/null +++ b/tests/emptyBracesFunction.expected_results @@ -0,0 +1 @@ +It was nothing diff --git a/tests/emptyBracesFunction.krak b/tests/emptyBracesFunction.krak new file mode 100644 index 0000000..0fbe029 --- /dev/null +++ b/tests/emptyBracesFunction.krak @@ -0,0 +1,9 @@ +import io; + +void nothing() {} + +int main() { + nothing(); + println("It was nothing"); + return 0; +}