From 0f50a82f0694bcf2902a772de63cc2b9a007c2f7 Mon Sep 17 00:00:00 2001 From: A404M Date: Thu, 24 Apr 2025 22:55:34 +0330 Subject: make stuff much optimized --- Makefile | 2 +- src/compiler/parser.c | 43 ++++++++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index ae30991..76a2d31 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ test-all: $(EXEC_FILE) test/big.felan test/big.felan: Makefile mkdir -p test echo "main :: () -> void {" > $@ - for((n = 0;n < 100000;n++)); do echo " print('1');" >> $@; done + for((n = 0;n < 1000000;n++)); do echo " print('1');" >> $@; done echo "};" >> $@ echo "print :: (value:u8) -> void {" >> $@ echo " putc value;" >> $@ diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 7265c60..4c67988 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -701,12 +701,11 @@ ParserNode *parser(LexerNodeArray lexed) { } bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent) { - size_t parsedNodes_size = 0; + size_t parsedNodes_capacity = 0; - ParserNodeArray *parsedNodes = a404m_malloc(sizeof(*parsedNodes)); - parsedNodes->data = - a404m_malloc(parsedNodes_size * sizeof(*parsedNodes->data)); - parsedNodes->size = 0; + ParserNode **parsedNodes_data = + a404m_malloc(parsedNodes_capacity * sizeof(*parsedNodes_data)); + size_t parsedNodes_size = 0; for (size_t orders_index = 0; orders_index < PARSER_ORDER_SIZE; ++orders_index) { @@ -734,34 +733,40 @@ bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent) { continue; } - for (size_t i = 0; i < parsedNodes->size; ++i) { - if (parsedNodes->data[i] == pNode) { + /* + for (size_t i = 0; i < parsedNodes_size; ++i) { + if (parsedNodes_data[i] == pNode) { goto CONTINUE; } } - if (parsedNodes->size == parsedNodes_size) { - parsedNodes_size += parsedNodes_size / 2 + 1; - parsedNodes->data = a404m_realloc( - parsedNodes->data, sizeof(*parsedNodes->data) * parsedNodes_size); + */ + if(parsedNodes_size != 0 && parsedNodes_data[parsedNodes_size-1] == pNode){ + continue; } - parsedNodes->data[parsedNodes->size] = pNode; - parsedNodes->size += 1; - CONTINUE: + + if (parsedNodes_size == parsedNodes_capacity) { + parsedNodes_capacity += parsedNodes_capacity / 2 + 1; + parsedNodes_data = a404m_realloc( + parsedNodes_data, sizeof(*parsedNodes_data) * parsedNodes_capacity); + } + parsedNodes_data[parsedNodes_size] = pNode; + parsedNodes_size += 1; } + ParserNodeArray *parsedNodes = a404m_malloc(sizeof(*parsedNodes)); parsedNodes->data = a404m_realloc( - parsedNodes->data, parsedNodes->size * sizeof(*parsedNodes->data)); + parsedNodes_data, parsedNodes_size * sizeof(*parsedNodes_data)); + parsedNodes->size = parsedNodes_size; parent->metadata = parsedNodes; return true; RETURN_ERROR: - for (size_t i = 0; i < parsedNodes->size; ++i) { - free(parsedNodes->data[i]); + for (size_t i = 0; i < parsedNodes_size; ++i) { + free(parsedNodes_data[i]); } - free(parsedNodes->data); - free(parsedNodes); + free(parsedNodes_data); return false; } -- cgit v1.2.3