diff options
Diffstat (limited to 'src/runner')
-rw-r--r-- | src/runner/runner.c | 176 | ||||
-rw-r--r-- | src/runner/runner.h | 8 |
2 files changed, 167 insertions, 17 deletions
diff --git a/src/runner/runner.c b/src/runner/runner.c index 984c7d6..e6dc2b8 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -338,13 +338,13 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, *(f128 *)ret = *(f128 *)left->metadata + *(f128 *)right->metadata; break; case AST_TREE_TOKEN_OPERATOR_POINTER: - if (typeIsEqual(right->type, &AST_TREE_I64_TYPE)) { + if (typeIsEqual(right->type, &AST_TREE_I64_TYPE, scope)) { *(u8 **)ret = *(u8 **)left->metadata + *(i64 *)right->metadata * getSizeOfType((AstTreeSingleChild *)left->type->metadata); break; - } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE)) { + } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE, scope)) { *(u8 **)ret = *(u8 **)left->metadata + *(u64 *)right->metadata * @@ -405,13 +405,13 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, *(f128 *)ret = *(f128 *)left->metadata - *(f128 *)right->metadata; break; case AST_TREE_TOKEN_OPERATOR_POINTER: - if (typeIsEqual(right->type, &AST_TREE_I64_TYPE)) { + if (typeIsEqual(right->type, &AST_TREE_I64_TYPE, scope)) { *(u8 **)ret = *(u8 **)left->metadata - *(i64 *)right->metadata * getSizeOfType((AstTreeSingleChild *)left->type->metadata); break; - } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE)) { + } else if (typeIsEqual(right->type, &AST_TREE_U64_TYPE, scope)) { *(u8 **)ret = *(u8 **)left->metadata - *(u64 *)right->metadata * @@ -627,7 +627,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, *(AstTreeBool *)left->metadata == *(AstTreeBool *)right->metadata; break; case AST_TREE_TOKEN_TYPE_TYPE: - *(AstTreeBool *)ret->metadata = typeIsEqual(left, right); + *(AstTreeBool *)ret->metadata = typeIsEqual(left, right, scope); break; default: printLog("%s", AST_TREE_TOKEN_STRINGS[left->token]); @@ -699,7 +699,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, *(AstTreeBool *)left->metadata == *(AstTreeBool *)right->metadata; break; case AST_TREE_TOKEN_TYPE_TYPE: - *(AstTreeBool *)ret->metadata = !typeIsEqual(left, right); + *(AstTreeBool *)ret->metadata = !typeIsEqual(left, right, scope); break; default: UNREACHABLE; @@ -1247,7 +1247,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, } AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments, - size_t arguments_size) { + size_t arguments_size, AstTreeScope *scope) { AstTreeCFunction *metadata = tree->metadata; AstTreeCLibrary *lib = metadata->library->metadata; char *name = u8ArrayToCString(metadata->name); @@ -1269,7 +1269,7 @@ AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments, for (size_t i = 0; i < arguments_size; ++i) { AstTreeTypeFunctionArgument arg = funcType->arguments[i]; args[i] = toFFIType(arg.type); - if (!typeIsEqual(arg.type, arguments[i]->type)) { + if (!typeIsEqual(arg.type, arguments[i]->type, scope)) { printLog("%s %s", AST_TREE_TOKEN_STRINGS[arg.type->token], AST_TREE_TOKEN_STRINGS[arguments[i]->type->token]); UNREACHABLE; @@ -1291,7 +1291,7 @@ AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments, } deleteFFIType(retType); - if (typeIsEqual(funcType->returnType, &AST_TREE_VOID_TYPE)) { + if (typeIsEqual(funcType->returnType, &AST_TREE_VOID_TYPE, scope)) { return &AST_TREE_VOID_TYPE; } else { const size_t size = getSizeOfType(funcType->returnType); @@ -1405,7 +1405,7 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, return args[i]; } } - result = runAstTreeCFunction(function, args, args_size); + result = runAstTreeCFunction(function, args, args_size, scope); for (size_t i = 0; i < args_size; ++i) { astTreeDelete(args[i]); } @@ -1894,13 +1894,9 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) { size_t size; AstTreeRawValue *rawValue; if (value->type->token == AST_TREE_TOKEN_TYPE_ARRAY) { - struct Array { - void *data; - size_t size; - }; - size = sizeof(struct Array); + size = sizeof(ArrayValueStruct); rawValue = a404m_malloc(size); - struct Array *array = (struct Array *)rawValue; + ArrayValueStruct *array = (ArrayValueStruct *)rawValue; AstTreeBracket *bracket = value->type->metadata; @@ -2115,6 +2111,154 @@ AstTree *toRawValue(AstTree *value, AstTreeScope *scope) { return NULL; } +AstTree *fromRawValue(AstTree *value) { + if (value->token != AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED && + value->token != AST_TREE_TOKEN_RAW_VALUE) { + return NULL; + } + switch (value->type->token) { + case AST_TREE_TOKEN_TYPE_ARRAY: { + AstTreeBracket *arrayType = value->type->metadata; + AstTree *itemType = arrayType->operand; + size_t itemTypeSize = getSizeOfType(itemType); + + AstTreeObject *resultObject = a404m_malloc(sizeof(*resultObject)); + + ArrayValueStruct *arrayValue = value->metadata; + resultObject->items_size = arrayValue->size; + + resultObject->items = + a404m_malloc(resultObject->items_size * sizeof(*resultObject->items)); + + for (size_t i = 0; i < arrayValue->size; ++i) { + AstTree *raw = newAstTree(AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED, + (u8 *)arrayValue->data + i * itemTypeSize, + copyAstTree(itemType), NULL, NULL); + AstTree *v = fromRawValue(raw); + if (v != NULL) { + astTreeDelete(v); + raw = v; + } + resultObject->items[i].value = raw; + } + + return newAstTree(AST_TREE_TOKEN_VALUE_OBJECT, resultObject, + copyAstTree(value->type), value->str_begin, + value->str_end); + } + 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: + case AST_TREE_TOKEN_TYPE_F16: + case AST_TREE_TOKEN_TYPE_F32: + case AST_TREE_TOKEN_TYPE_F64: + case AST_TREE_TOKEN_TYPE_F128: + case AST_TREE_TOKEN_TYPE_CODE: + case AST_TREE_TOKEN_TYPE_NAMESPACE: + case AST_TREE_TOKEN_TYPE_SHAPE_SHIFTER: + case AST_TREE_TOKEN_TYPE_C_LIBRARY: + case AST_TREE_TOKEN_TYPE_C_FUNCTION: + case AST_TREE_TOKEN_TYPE_BOOL: + case AST_TREE_TOKEN_TYPE_FUNCTION: + case AST_TREE_TOKEN_TYPE_TYPE: + case AST_TREE_TOKEN_TYPE_ANY_TYPE: + case AST_TREE_TOKEN_TYPE_VOID: + case AST_TREE_TOKEN_FUNCTION: + case AST_TREE_TOKEN_BUILTIN_CAST: + case AST_TREE_TOKEN_BUILTIN_TYPE_OF: + case AST_TREE_TOKEN_BUILTIN_SIZE_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_C_LIBRARY: + case AST_TREE_TOKEN_BUILTIN_C_FUNCTION: + 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_VALUE_VOID: + case AST_TREE_TOKEN_FUNCTION_CALL: + case AST_TREE_TOKEN_VARIABLE: + case AST_TREE_TOKEN_VARIABLE_DEFINE: + case AST_TREE_TOKEN_VALUE_NULL: + case AST_TREE_TOKEN_VALUE_UNDEFINED: + case AST_TREE_TOKEN_VALUE_NAMESPACE: + case AST_TREE_TOKEN_VALUE_SHAPE_SHIFTER: + case AST_TREE_TOKEN_VALUE_C_LIBRARY: + case AST_TREE_TOKEN_VALUE_C_FUNCTION: + case AST_TREE_TOKEN_VALUE_INT: + case AST_TREE_TOKEN_VALUE_FLOAT: + case AST_TREE_TOKEN_VALUE_BOOL: + case AST_TREE_TOKEN_VALUE_OBJECT: + case AST_TREE_TOKEN_RAW_VALUE: + case AST_TREE_TOKEN_RAW_VALUE_NOT_OWNED: + 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_ARRAY_ACCESS: + case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ASSIGN: + case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS_ADDRESS: + 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_SCOPE: + return NULL; + case AST_TREE_TOKEN_NONE: + } + UNREACHABLE; +} + AstTree *castTo(AstTree *tree, AstTree *to) { switch (tree->type->token) { case AST_TREE_TOKEN_TYPE_VOID: { diff --git a/src/runner/runner.h b/src/runner/runner.h index 314f6b5..3175ece 100644 --- a/src/runner/runner.h +++ b/src/runner/runner.h @@ -3,6 +3,11 @@ #include "compiler/ast-tree.h" #include <ffi.h> +typedef struct ArrayValueStruct { + void *data; + size_t size; +} ArrayValueStruct; + void runnerVariableSetValue(AstTreeVariable *variable, AstTree *value, AstTreeScope *scope); void runnerVariableSetValueWihtoutConstCheck(AstTreeVariable *variable, @@ -20,7 +25,7 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, AstTree **arguments); AstTree *runAstTreeCFunction(AstTree *tree, AstTree **arguments, - size_t arguments_size); + size_t arguments_size, AstTreeScope *scope); AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet, bool isLeft, bool isComptime, u32 *breakCount, @@ -33,6 +38,7 @@ AstTree *getForVariable(AstTree *expr, AstTreeScope *scope, bool *shouldRet, bool discontinue(bool shouldRet, u32 breakCount); AstTree *toRawValue(AstTree *value, AstTreeScope *scope); +AstTree *fromRawValue(AstTree *value); AstTree *castTo(AstTree *value, AstTree *to); |