diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-16 12:12:52 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-04-16 12:12:52 +0330 |
commit | 070a3687529954280cf26f294432037a03d1542e (patch) | |
tree | 6e614cd51cb44ecfa61d3dbf18a2f004e1db10b3 /src/runner | |
parent | 5d9a1ab17baa4e6f1b0543d92e849c06a56ccf59 (diff) |
add .length to arrays
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 83 |
1 files changed, 54 insertions, 29 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 9490d91..f6e7e88 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -1167,44 +1167,69 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, case AST_TREE_TOKEN_OPERATOR_ACCESS: { AstTreeAccess *metadata = expr->metadata; AstTree *tree = runExpression(metadata->object, scope, shouldRet, true); - if (tree->type->token != AST_TREE_TOKEN_KEYWORD_STRUCT && - tree->token != AST_TREE_TOKEN_VARIABLE) { + if (tree->token != AST_TREE_TOKEN_VARIABLE) { UNREACHABLE; } AstTreeVariable *variable = tree->metadata; astTreeDelete(tree); - if (variable->value->token == AST_TREE_TOKEN_VALUE_UNDEFINED) { - AstTreeStruct *struc = variable->type->metadata; - AstTreeObject *newMetadata = a404m_malloc(sizeof(*newMetadata)); + if (variable->type->token == AST_TREE_TOKEN_TYPE_ARRAY) { + AstTreeBracket *array_metadata = variable->type->metadata; + if (metadata->member.index != 0) { + UNREACHABLE; + } else if (variable->value->token == AST_TREE_TOKEN_VALUE_UNDEFINED) { + if (array_metadata->parameters.size == 0) { + UNREACHABLE; + } else { + AstTree *sizeTree = runExpression(array_metadata->parameters.data[0], + scope, shouldRet, false); + if (sizeTree->token != AST_TREE_TOKEN_VALUE_INT) { + UNREACHABLE; + } else { + return sizeTree; + } + } + } else if (variable->value->token == AST_TREE_TOKEN_VALUE_OBJECT) { + AstTreeObject *object = variable->value->metadata; + AstTreeInt *res_metadata = a404m_malloc(sizeof(*res_metadata)); + *res_metadata = object->variables.size; + return newAstTree(AST_TREE_TOKEN_VALUE_INT, res_metadata, + &AST_TREE_U64_TYPE, NULL, NULL); + } + } else if (variable->type->token == AST_TREE_TOKEN_KEYWORD_STRUCT) { + if (variable->value->token == AST_TREE_TOKEN_VALUE_UNDEFINED) { + AstTreeStruct *struc = variable->type->metadata; + AstTreeObject *newMetadata = a404m_malloc(sizeof(*newMetadata)); - newMetadata->variables = - copyAstTreeVariables(struc->variables, NULL, NULL, 0); + newMetadata->variables = + copyAstTreeVariables(struc->variables, NULL, NULL, 0); - for (size_t i = 0; i < newMetadata->variables.size; ++i) { - AstTreeVariable *member = newMetadata->variables.data[i]; - if (!member->isConst) { - runnerVariableSetValue(member, - newAstTree(AST_TREE_TOKEN_VALUE_UNDEFINED, - NULL, copyAstTree(member->type), - variable->value->str_begin, - variable->value->str_end)); + for (size_t i = 0; i < newMetadata->variables.size; ++i) { + AstTreeVariable *member = newMetadata->variables.data[i]; + if (!member->isConst) { + runnerVariableSetValue(member, + newAstTree(AST_TREE_TOKEN_VALUE_UNDEFINED, + NULL, copyAstTree(member->type), + variable->value->str_begin, + variable->value->str_end)); + } } - } - runnerVariableSetValue(variable, newAstTree(AST_TREE_TOKEN_VALUE_OBJECT, - newMetadata, - copyAstTree(variable->type), - variable->value->str_begin, - variable->value->str_end)); - } - AstTreeObject *object = variable->value->metadata; - AstTreeVariable *var = object->variables.data[metadata->member.index]; - if (isLeft) { - return newAstTree(AST_TREE_TOKEN_VARIABLE, var, copyAstTree(var->type), - var->name_begin, var->name_end); - } else { - return copyAstTree(var->value); + runnerVariableSetValue(variable, newAstTree(AST_TREE_TOKEN_VALUE_OBJECT, + newMetadata, + copyAstTree(variable->type), + variable->value->str_begin, + variable->value->str_end)); + } + AstTreeObject *object = variable->value->metadata; + AstTreeVariable *var = object->variables.data[metadata->member.index]; + if (isLeft) { + return newAstTree(AST_TREE_TOKEN_VARIABLE, var, copyAstTree(var->type), + var->name_begin, var->name_end); + } else { + return copyAstTree(var->value); + } } + UNREACHABLE; } case AST_TREE_TOKEN_KEYWORD_STRUCT: { expr = copyAstTree(expr); |