aboutsummaryrefslogtreecommitdiff
path: root/src/runner
diff options
context:
space:
mode:
Diffstat (limited to 'src/runner')
-rw-r--r--src/runner/runner.c190
-rw-r--r--src/runner/runner.h5
2 files changed, 149 insertions, 46 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c
index dcfda79..949d9fb 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -1364,17 +1364,19 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
AstTreeFunction *fun = function->metadata;
for (size_t i = 0; i < args_size; ++i) {
- AstTreeVariable *function_arg = fun->arguments.data[i];
AstTreeFunctionCallParam param = metadata->parameters.data[i];
- args[i] =
- getForVariable(param.value, scope, shouldRet, false, isComptime,
- breakCount, shouldContinue, function_arg->isLazy);
- if (discontinue(*shouldRet, *breakCount)) {
- astTreeDelete(function);
- for (size_t j = 0; j < i; ++j) {
- astTreeDelete(args[i]);
+ if (fun->isMacro) {
+ args[i] = copyAstTree(param.value);
+ } else {
+ args[i] = runExpression(param.value, scope, shouldRet, false,
+ isComptime, breakCount, shouldContinue);
+ if (discontinue(*shouldRet, *breakCount)) {
+ astTreeDelete(function);
+ for (size_t j = 0; j < i; ++j) {
+ astTreeDelete(args[i]);
+ }
+ return args[i];
}
- return args[i];
}
}
result = runAstTreeFunction(function, args, args_size, scope, isComptime);
@@ -1383,9 +1385,8 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
for (size_t i = 0; i < args_size; ++i) {
AstTreeFunctionCallParam param = metadata->parameters.data[i];
if (function->token != AST_TREE_TOKEN_BUILTIN_TYPE_OF) {
- args[i] =
- getForVariable(param.value, scope, shouldRet, false, isComptime,
- breakCount, shouldContinue, false);
+ args[i] = runExpression(param.value, scope, shouldRet, false,
+ isComptime, breakCount, shouldContinue);
if (discontinue(*shouldRet, *breakCount)) {
astTreeDelete(function);
for (size_t j = 0; j < i; ++j) {
@@ -1406,8 +1407,8 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
} else if (function->token == AST_TREE_TOKEN_VALUE_C_FUNCTION) {
for (size_t i = 0; i < args_size; ++i) {
AstTreeFunctionCallParam param = metadata->parameters.data[i];
- args[i] = getForVariable(param.value, scope, shouldRet, false,
- isComptime, breakCount, shouldContinue, false);
+ args[i] = runExpression(param.value, scope, shouldRet, false,
+ isComptime, breakCount, shouldContinue);
if (discontinue(*shouldRet, *breakCount)) {
astTreeDelete(function);
for (size_t j = 0; j < i; ++j) {
@@ -1503,15 +1504,10 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
}
case AST_TREE_TOKEN_VARIABLE_DEFINE: {
AstTreeVariable *variable = expr->metadata;
- AstTree *value;
- if (variable->isLazy) {
- value = copyAstTree(variable->initValue);
- } else {
- value = runExpression(variable->initValue, scope, shouldRet, false,
- isComptime, breakCount, shouldContinue);
- if (discontinue(*shouldRet, *breakCount)) {
- return value;
- }
+ AstTree *value = runExpression(variable->initValue, scope, shouldRet, false,
+ isComptime, breakCount, shouldContinue);
+ if (discontinue(*shouldRet, *breakCount)) {
+ return value;
}
runnerVariableSetValue(variable, value, scope);
return &AST_TREE_VOID_VALUE;
@@ -1729,12 +1725,6 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
case AST_TREE_TOKEN_VARIABLE: {
AstTreeVariable *variable = expr->metadata;
- if (variable->isLazy) {
- AstTree *value = runExpression(variable->value, scope, shouldRet, false,
- isComptime, breakCount, shouldContinue);
- runnerVariableSetValue(variable, value, scope);
- }
-
if (variable->value->token == AST_TREE_TOKEN_RAW_VALUE) {
if (isLeft) {
return newAstTree(AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED,
@@ -1756,7 +1746,12 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
if (variable->value == NULL) {
UNREACHABLE;
}
- return copyAstTree(variable->value);
+ if (canBeRaw(variable->type)) {
+ return runExpression(variable->value, scope, shouldRet, isLeft,
+ isComptime, breakCount, shouldContinue);
+ } else {
+ return copyAstTree(variable->value);
+ }
}
}
case AST_TREE_TOKEN_OPERATOR_ACCESS: {
@@ -1887,17 +1882,6 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
UNREACHABLE;
}
-AstTree *getForVariable(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
- bool isLeft, bool isComptime, u32 *breakCount,
- bool *shouldContinue, bool isLazy) {
- if (isLazy) {
- return copyAstTree(expr);
- } else {
- return runExpression(expr, scope, shouldRet, isLeft, isComptime, breakCount,
- shouldContinue);
- }
-}
-
bool discontinue(bool shouldRet, u32 breakCount) {
return shouldRet || breakCount > 0;
}
@@ -2128,7 +2112,127 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) {
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ASSIGN:
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ADDRESS:
case AST_TREE_TOKEN_SCOPE:
+ case AST_TREE_TOKEN_TYPE_ANY_TYPE:
+ case AST_TREE_TOKEN_BUILTIN_SIZE_OF:
+ case AST_TREE_TOKEN_BUILTIN_C_LIBRARY:
+ case AST_TREE_TOKEN_BUILTIN_C_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_C_LIBRARY:
+ case AST_TREE_TOKEN_TYPE_C_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_MACRO:
+ return NULL;
case AST_TREE_TOKEN_NONE:
+ }
+ UNREACHABLE;
+}
+
+bool canBeRaw(AstTree *type) {
+ switch (type->token) {
+ case AST_TREE_TOKEN_TYPE_ARRAY:
+ case AST_TREE_TOKEN_TYPE_TYPE:
+ case AST_TREE_TOKEN_TYPE_VOID:
+ case AST_TREE_TOKEN_TYPE_I8:
+ case AST_TREE_TOKEN_TYPE_U8:
+ case AST_TREE_TOKEN_TYPE_I16:
+ case AST_TREE_TOKEN_TYPE_U16:
+ case AST_TREE_TOKEN_TYPE_I32:
+ case AST_TREE_TOKEN_TYPE_U32:
+ case AST_TREE_TOKEN_TYPE_I64:
+ case AST_TREE_TOKEN_TYPE_U64:
+#ifdef FLOAT_16_SUPPORT
+ case AST_TREE_TOKEN_TYPE_F16:
+#endif
+ case AST_TREE_TOKEN_TYPE_F32:
+ case AST_TREE_TOKEN_TYPE_F64:
+ case AST_TREE_TOKEN_TYPE_F128:
+ case AST_TREE_TOKEN_TYPE_BOOL:
+ return true;
+ case AST_TREE_TOKEN_VALUE_VOID:
+ case AST_TREE_TOKEN_VALUE_NULL:
+ case AST_TREE_TOKEN_VALUE_UNDEFINED:
+ case AST_TREE_TOKEN_VALUE_BOOL:
+ case AST_TREE_TOKEN_VALUE_INT:
+ case AST_TREE_TOKEN_VALUE_FLOAT:
+ case AST_TREE_TOKEN_VALUE_OBJECT:
+ case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED:
+ case AST_TREE_TOKEN_VALUE_C_LIBRARY:
+ case AST_TREE_TOKEN_VALUE_C_FUNCTION:
+ case AST_TREE_TOKEN_VALUE_SHAPE_SHIFTER:
+ case AST_TREE_TOKEN_VALUE_MACRO:
+ case AST_TREE_TOKEN_VALUE_NAMESPACE:
+ case AST_TREE_TOKEN_TYPE_FUNCTION:
+ case AST_TREE_TOKEN_TYPE_CODE:
+ case AST_TREE_TOKEN_TYPE_NAMESPACE:
+ case AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER:
+ case AST_TREE_TOKEN_FUNCTION:
+ case AST_TREE_TOKEN_BUILTIN_CAST:
+ case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
+ case AST_TREE_TOKEN_BUILTIN_IMPORT:
+ case AST_TREE_TOKEN_BUILTIN_IS_COMPTIME:
+ case AST_TREE_TOKEN_BUILTIN_STACK_ALLOC:
+ case AST_TREE_TOKEN_BUILTIN_HEAP_ALLOC:
+ case AST_TREE_TOKEN_BUILTIN_NEG:
+ case AST_TREE_TOKEN_BUILTIN_ADD:
+ case AST_TREE_TOKEN_BUILTIN_SUB:
+ case AST_TREE_TOKEN_BUILTIN_MUL:
+ case AST_TREE_TOKEN_BUILTIN_DIV:
+ case AST_TREE_TOKEN_BUILTIN_MOD:
+ case AST_TREE_TOKEN_BUILTIN_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_NOT_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_GREATER:
+ case AST_TREE_TOKEN_BUILTIN_SMALLER:
+ case AST_TREE_TOKEN_BUILTIN_GREATER_OR_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_SMALLER_OR_EQUAL:
+ case AST_TREE_TOKEN_BUILTIN_PUTC:
+ case AST_TREE_TOKEN_BUILTIN_BITWISE_NOT:
+ case AST_TREE_TOKEN_BUILTIN_BITWISE_AND:
+ case AST_TREE_TOKEN_BUILTIN_BITWISE_XOR:
+ case AST_TREE_TOKEN_BUILTIN_BITWISE_OR:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
+ case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
+ case AST_TREE_TOKEN_BUILTIN_INSERT:
+ case AST_TREE_TOKEN_KEYWORD_RETURN:
+ case AST_TREE_TOKEN_KEYWORD_BREAK:
+ case AST_TREE_TOKEN_KEYWORD_CONTINUE:
+ case AST_TREE_TOKEN_KEYWORD_IF:
+ case AST_TREE_TOKEN_KEYWORD_WHILE:
+ case AST_TREE_TOKEN_KEYWORD_COMPTIME:
+ case AST_TREE_TOKEN_KEYWORD_STRUCT:
+ case AST_TREE_TOKEN_FUNCTION_CALL:
+ case AST_TREE_TOKEN_VARIABLE:
+ case AST_TREE_TOKEN_VARIABLE_DEFINE:
+ case AST_TREE_TOKEN_RAW_VALUE:
+ case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT:
+ case AST_TREE_TOKEN_OPERATOR_ASSIGN:
+ case AST_TREE_TOKEN_OPERATOR_PLUS:
+ case AST_TREE_TOKEN_OPERATOR_MINUS:
+ case AST_TREE_TOKEN_OPERATOR_SUM:
+ case AST_TREE_TOKEN_OPERATOR_SUB:
+ case AST_TREE_TOKEN_OPERATOR_MULTIPLY:
+ case AST_TREE_TOKEN_OPERATOR_DIVIDE:
+ case AST_TREE_TOKEN_OPERATOR_MODULO:
+ case AST_TREE_TOKEN_OPERATOR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_NOT_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_GREATER:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER:
+ case AST_TREE_TOKEN_OPERATOR_GREATER_OR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_SMALLER_OR_EQUAL:
+ case AST_TREE_TOKEN_OPERATOR_POINTER:
+ case AST_TREE_TOKEN_OPERATOR_ADDRESS:
+ case AST_TREE_TOKEN_OPERATOR_DEREFERENCE:
+ case AST_TREE_TOKEN_OPERATOR_ACCESS:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_NOT:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_AND:
+ case AST_TREE_TOKEN_OPERATOR_LOGICAL_OR:
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_NOT:
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_AND:
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_XOR:
+ case AST_TREE_TOKEN_OPERATOR_BITWISE_OR:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_LEFT:
+ case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ASSIGN:
+ case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ADDRESS:
+ case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_TYPE_ANY_TYPE:
case AST_TREE_TOKEN_BUILTIN_SIZE_OF:
case AST_TREE_TOKEN_BUILTIN_C_LIBRARY:
@@ -2136,8 +2240,10 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) {
case AST_TREE_TOKEN_TYPE_C_LIBRARY:
case AST_TREE_TOKEN_TYPE_C_FUNCTION:
case AST_TREE_TOKEN_TYPE_MACRO:
+ return false;
+ case AST_TREE_TOKEN_NONE:
}
- return NULL;
+ UNREACHABLE;
}
AstTree *fromRawValue(AstTree *value) {
diff --git a/src/runner/runner.h b/src/runner/runner.h
index 3175ece..815cb0a 100644
--- a/src/runner/runner.h
+++ b/src/runner/runner.h
@@ -31,13 +31,10 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
bool isLeft, bool isComptime, u32 *breakCount,
bool *shouldContinue);
-AstTree *getForVariable(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
- bool isLeft, bool isComptime, u32 *breakCount,
- bool *shouldContinue, bool isLazy);
-
bool discontinue(bool shouldRet, u32 breakCount);
AstTree *toRawValue(AstTree *value, AstTreeScope *scope);
+bool canBeRaw(AstTree *type);
AstTree *fromRawValue(AstTree *value);
AstTree *castTo(AstTree *value, AstTree *to);