From 1a21618bee43e92e97441b6d532ca7ba934cf8e6 Mon Sep 17 00:00:00 2001 From: cosmonaut Date: Tue, 7 Sep 2021 12:46:47 -0700 Subject: [PATCH] more type validation --- generic.w | 17 ++++++++++------- src/codegen.c | 2 +- src/validation.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/generic.w b/generic.w index 127490d..1af13f6 100644 --- a/generic.w +++ b/generic.w @@ -14,6 +14,15 @@ struct MemoryBlock start: MemoryAddress; capacity: uint; + static Init(capacity: uint): MemoryBlock + { + return MemoryBlock + { + capacity: capacity, + start: @malloc(capacity * @sizeof()) + }; + } + AddressOf(index: uint): MemoryAddress { return start + (index * @sizeof()); @@ -43,7 +52,7 @@ struct Array { return Array { - memoryBlock: MemoryBlock { capacity: capacity, start: @malloc(capacity * @sizeof()) } + memoryBlock: MemoryBlock.Init(capacity) }; } @@ -58,12 +67,6 @@ struct Array } } -interface Iterable -{ - HasNext(): bool; - Next(): T; -} - struct Program { static Main(): int { array: Array = Array.Init(4); diff --git a/src/codegen.c b/src/codegen.c index 12683d1..652eaa3 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1395,7 +1395,7 @@ static LLVMValueRef CompileFunctionCallExpression( &isStatic ); - //free(typeTag); + free(typeTag); } else { diff --git a/src/validation.c b/src/validation.c index 05a3b7b..a795575 100644 --- a/src/validation.c +++ b/src/validation.c @@ -432,6 +432,41 @@ void ConvertCustomsToGenerics(Node *node) switch (node->syntaxKind) { + case Type: + { + Node *type = node->type.typeNode; + if (type->syntaxKind == CustomTypeNode) + { + char *target = type->customType.name; + Node *typeLookup = LookupType(node, target); + if (typeLookup != NULL && + typeLookup->syntaxKind == GenericDeclaration) + { + node->typeTag->type = Generic; + free(node->declaration.type); + node->declaration.type = + MakeGenericTypeNode(node->typeTag->value.genericType); + } + } + else if (type->syntaxKind == ConcreteGenericTypeNode) + { + for (int32_t i = 0; i < node->typeTag->value.concreteGenericType.genericArgumentCount; i += 1) + { + if (node->typeTag->value.concreteGenericType.genericArguments[i]->type == Custom) + { + char *target = node->typeTag->value.concreteGenericType.genericArguments[i]->value.customType; + Node *typeLookup = LookupType(node, target); + if (typeLookup != NULL && + typeLookup->syntaxKind == GenericDeclaration) + { + node->typeTag->value.concreteGenericType.genericArguments[i]->type = Generic; + } + } + } + } + break; + } + case Declaration: { Node *id = node->declaration.identifier;