summaryrefslogtreecommitdiff
path: root/src/runner
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-20 17:47:28 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-20 17:47:28 +0330
commit69310fa04d9370841c7b4f30c7278fb138b7b2e2 (patch)
tree34c153ca254ff9a3687d461a13d84aa35e358235 /src/runner
parent624a73ae10eb3aaa535eb41c023c59919df28c99 (diff)
added named paramters
Diffstat (limited to 'src/runner')
-rw-r--r--src/runner/runner.c66
-rw-r--r--src/runner/runner.h2
2 files changed, 62 insertions, 6 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 36c84e5..576ada5 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -172,7 +172,7 @@ bool runAstTree(AstTreeRoot *root) {
return false;
}
-AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments,
+AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments,
size_t arguments_size,
RunnerVariablePages *_pages) {
AstTreeFunction *function = tree->metadata;
@@ -193,11 +193,67 @@ AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments,
bool shouldRet = false;
+ bool initedArguments[function->arguments.size];
+ size_t initedArguments_size = function->arguments.size;
+
+ for (size_t i = 0; i < initedArguments_size; ++i) {
+ initedArguments[i] = false;
+ }
+
for (size_t i = 0; i < arguments_size; ++i) {
- AstTreeVariable *variable = function->arguments.data[i];
- AstTree *value = runExpression(arguments[i], &pages, &shouldRet);
- runnerVariablePush(pages.data[pages.size - 1], variable);
- runnerVariableSetValue(&pages, variable, value);
+ AstTreeFunctionCallParam param = arguments[i];
+ if (param.nameBegin != param.nameEnd) {
+ const size_t param_name_size = param.nameEnd - param.nameBegin;
+ for (size_t j = 0; j < function->arguments.size; ++j) {
+ AstTreeVariable *arg = function->arguments.data[j];
+ if ((size_t)(arg->name_end - arg->name_begin) == param_name_size &&
+ strncmp(arg->name_begin, param.nameBegin, param_name_size) == 0) {
+ initedArguments[j] = true;
+
+ AstTree *value = runExpression(param.value, &pages, &shouldRet);
+ runnerVariablePush(pages.data[pages.size - 1], arg);
+ runnerVariableSetValue(&pages, arg, value);
+ goto END_OF_NAMED_FOR;
+ }
+ }
+ printError(param.value->str_begin, param.value->str_end,
+ "Argument not found");
+ UNREACHABLE;
+ }
+ END_OF_NAMED_FOR:
+ }
+
+ for (size_t i = 0; i < arguments_size; ++i) {
+ AstTreeFunctionCallParam param = arguments[i];
+ if (param.nameBegin == param.nameEnd) {
+ for (size_t j = 0; j < function->arguments.size; ++j) {
+ AstTreeVariable *arg = function->arguments.data[j];
+ if (!initedArguments[j]) {
+ initedArguments[j] = true;
+
+ AstTree *value = runExpression(param.value, &pages, &shouldRet);
+ runnerVariablePush(pages.data[pages.size - 1], arg);
+ runnerVariableSetValue(&pages, arg, value);
+ goto END_OF_UNNAMED_FOR;
+ }
+ }
+ printError(param.value->str_begin, param.value->str_end,
+ "Too many arguments");
+ UNREACHABLE;
+ }
+ END_OF_UNNAMED_FOR:
+ }
+
+ for (size_t i = 0; i < function->arguments.size; ++i) {
+ AstTreeVariable *arg = function->arguments.data[i];
+ if (!initedArguments[i]) {
+ if (arg->value == NULL) {
+ printError(arg->name_begin, arg->name_end,
+ "Argument is not initialized");
+ } else {
+ runnerVariablePush(pages.data[pages.size - 1], arg);
+ }
+ }
}
shouldRet = false;
diff --git a/src/runner/runner.h b/src/runner/runner.h
index 060821c..fd64d1e 100644
--- a/src/runner/runner.h
+++ b/src/runner/runner.h
@@ -31,7 +31,7 @@ void destroyRootPages(RunnerVariablePages pages);
bool runAstTree(AstTreeRoot *root);
-AstTree *runAstTreeFunction(AstTree *tree, AstTree **arguments,
+AstTree *runAstTreeFunction(AstTree *tree, AstTreeFunctionCallParam *arguments,
size_t arguments_size, RunnerVariablePages *pages);
AstTree *runExpression(AstTree *expr, RunnerVariablePages *pages,