aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 05:01:30 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 05:01:30 +0330
commit3b5df1794867ccffc56ac5633af6c77a0b3952c8 (patch)
tree83810bba9ad9645946282c05b4bd6efd61f62d8b
parentc409b8aaf6b6f63bd68a3356e146ab80b2ec8c4b (diff)
some speed improvement
-rw-r--r--src/compiler/error_helper/error_helper.c2
-rw-r--r--src/compiler/parser/parser.c22
-rw-r--r--src/vm/runner/runner.c2
3 files changed, 19 insertions, 7 deletions
diff --git a/src/compiler/error_helper/error_helper.c b/src/compiler/error_helper/error_helper.c
index 2a9b209..42e3745 100644
--- a/src/compiler/error_helper/error_helper.c
+++ b/src/compiler/error_helper/error_helper.c
@@ -21,7 +21,7 @@ void printError(char const *error, SourceCode *sourceCode, char const *begin,
}
}
if (code == NULL) {
- fprintf(stderr, "Bad Error: the error is in no source code");
+ fprintf(stderr, "Bad Error: the error is in no source code\n");
return;
}
diff --git a/src/compiler/parser/parser.c b/src/compiler/parser/parser.c
index 2ffde16..fcee276 100644
--- a/src/compiler/parser/parser.c
+++ b/src/compiler/parser/parser.c
@@ -277,7 +277,7 @@ FREE:
}
ParsedNode *parser(SourceCode *code, size_t sourceIndex) {
- Nodes nodes = lexer(code,sourceIndex);
+ Nodes nodes = lexer(code, sourceIndex);
if (nodes.size == ERROR_SIZE) {
return NULL;
}
@@ -303,8 +303,7 @@ ParsedNode *_parser(Nodes lexedNodes, SourceCode *code) {
ParserScopeMetadata *parserScope(
Node *nodesBegin, Node *nodesEnd, ParsedNode *parent,
bool (*isAllowed)(ParsedToken token, bool isLast), SourceCode *code) {
- size_t nodes_size = 0;
- ParsedNode **nodes = a404m_malloc(nodes_size * sizeof(ParsedNode *));
+ ParsedNode **nodes = a404m_malloc(0);
size_t nodes_inserted = 0;
for (size_t order_index = 0; order_index < PARSE_ORDER_SIZE; ++order_index) {
@@ -320,12 +319,15 @@ ParserScopeMetadata *parserScope(
if (parsedNode == NULL) {
goto RETURN_ERROR;
}
+ size_t nodes_size =
+ a404m_malloc_usable_size(nodes) / sizeof(ParsedNode *);
if (nodes_size == nodes_inserted) {
nodes_size += nodes_size / 2 + 1;
nodes = a404m_realloc(nodes, nodes_size * sizeof(ParsedNode *));
}
nodes[nodes_inserted] = parsedNode;
++nodes_inserted;
+ break;
}
}
}
@@ -340,13 +342,23 @@ ParserScopeMetadata *parserScope(
}
ParsedNode **operands = a404m_malloc(nodes_inserted * sizeof(ParsedNode *));
- nodes_size = nodes_inserted;
+ size_t nodes_size = nodes_inserted;
nodes_inserted = 0;
+ ParsedNode *last = NULL;
+
+ for(size_t i = nodes_size-1;i != (typeof(i))-1;++i){
+ ParsedNode *currentNode = nodes[i];
+ if (currentNode->parent == parent) {
+ last = currentNode;
+ break;
+ }
+ }
+
for (size_t i = 0; i < nodes_size; ++i) {
ParsedNode *currentNode = nodes[i];
if (currentNode->parent == parent) {
- if (!isAllowed(currentNode->token, i + 1 == nodes_size)) {
+ if (!isAllowed(currentNode->token, currentNode == last)) {
printError("Token '%s' is not allowed here", code,
currentNode->strBegin, currentNode->strEnd,
PARSED_TOKEN_STRINGS[currentNode->token]);
diff --git a/src/vm/runner/runner.c b/src/vm/runner/runner.c
index 3dcab9b..9836ad0 100644
--- a/src/vm/runner/runner.c
+++ b/src/vm/runner/runner.c
@@ -178,5 +178,5 @@ void pushToStack(void *value, void ***restrict stack,
void print(void ***restrict stack, size_t *restrict stack_inserted) {
const SizedString *string = popFromStack(stack, stack_inserted);
- printf("%.*s", (int)string->size, string->str);
+ fwrite(string->str, string->size, 1, stdout);
}