forked from cosmonaut/wraith-lang
add custom types and local allocation
parent
48d049b6c9
commit
e3fd821d8f
13
ast.c
13
ast.c
|
@ -53,6 +53,18 @@ Node* MakeTypeNode(
|
|||
return node;
|
||||
}
|
||||
|
||||
Node* MakeCustomTypeNode(
|
||||
Node *identifierNode
|
||||
) {
|
||||
Node* node = (Node*) malloc(sizeof(Node));
|
||||
node->syntaxKind = Type;
|
||||
node->type = CustomType;
|
||||
node->childCount = 1;
|
||||
node->children = (Node**) malloc(sizeof(Node*));
|
||||
node->children[0] = identifierNode;
|
||||
return node;
|
||||
}
|
||||
|
||||
Node* MakeIdentifierNode(
|
||||
const char *id
|
||||
) {
|
||||
|
@ -288,6 +300,7 @@ static const char* PrimitiveTypeToString(PrimitiveType type)
|
|||
case UInt: return "UInt";
|
||||
case Bool: return "Bool";
|
||||
case Void: return "Void";
|
||||
case CustomType: return "CustomType";
|
||||
}
|
||||
|
||||
return "Unknown";
|
||||
|
|
6
ast.h
6
ast.h
|
@ -48,7 +48,8 @@ typedef enum
|
|||
UInt,
|
||||
Float,
|
||||
Double,
|
||||
String
|
||||
String,
|
||||
CustomType
|
||||
} PrimitiveType;
|
||||
|
||||
typedef union
|
||||
|
@ -81,6 +82,9 @@ const char* SyntaxKindString(SyntaxKind syntaxKind);
|
|||
Node* MakeTypeNode(
|
||||
PrimitiveType type
|
||||
);
|
||||
Node* MakeCustomTypeNode(
|
||||
Node *identifierNode
|
||||
);
|
||||
Node* MakeIdentifierNode(
|
||||
const char *id
|
||||
);
|
||||
|
|
58
compiler.c
58
compiler.c
|
@ -228,6 +228,38 @@ static LLVMValueRef FindVariableByName(LLVMBuilderRef builder, LLVMValueRef wStr
|
|||
return searchResult;
|
||||
}
|
||||
|
||||
typedef struct CustomTypeMap
|
||||
{
|
||||
LLVMTypeRef type;
|
||||
char *name;
|
||||
} CustomTypeMap;
|
||||
|
||||
CustomTypeMap *customTypes;
|
||||
uint32_t customTypeCount;
|
||||
|
||||
static void RegisterCustomType(LLVMTypeRef type, char *name)
|
||||
{
|
||||
customTypes = realloc(customTypes, sizeof(CustomType) * (customTypeCount + 1));
|
||||
customTypes[customTypeCount].type = type;
|
||||
customTypes[customTypeCount].name = strdup(name);
|
||||
customTypeCount += 1;
|
||||
}
|
||||
|
||||
static LLVMTypeRef LookupCustomType(char *name)
|
||||
{
|
||||
uint32_t i;
|
||||
|
||||
for (i = 0; i < customTypeCount; i += 1)
|
||||
{
|
||||
if (strcmp(customTypes[i].name, name) == 0)
|
||||
{
|
||||
return customTypes[i].type;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static LLVMTypeRef WraithTypeToLLVMType(PrimitiveType type)
|
||||
{
|
||||
switch (type)
|
||||
|
@ -344,6 +376,23 @@ static void CompileAssignment(LLVMValueRef wStructValue, LLVMBuilderRef builder,
|
|||
MarkStructFieldForWrite(wStructValue, identifier);
|
||||
}
|
||||
|
||||
static void CompileFunctionVariableDeclaration(LLVMBuilderRef builder, Node *variableDeclaration)
|
||||
{
|
||||
char *variableName = variableDeclaration->children[1]->value.string;
|
||||
LLVMValueRef variable;
|
||||
if (variableDeclaration->children[0]->type == CustomType)
|
||||
{
|
||||
char *customTypeName = variableDeclaration->children[0]->children[0]->value.string;
|
||||
variable = LLVMBuildAlloca(builder, LookupCustomType(customTypeName), variableName);
|
||||
}
|
||||
else
|
||||
{
|
||||
variable = LLVMBuildAlloca(builder, WraithTypeToLLVMType(variableDeclaration->children[0]->type), variableName);
|
||||
}
|
||||
|
||||
AddNamedVariable(variableName, variable);
|
||||
}
|
||||
|
||||
static uint8_t CompileStatement(LLVMValueRef wStructValue, LLVMBuilderRef builder, LLVMValueRef function, Node *statement)
|
||||
{
|
||||
switch (statement->syntaxKind)
|
||||
|
@ -352,6 +401,10 @@ static uint8_t CompileStatement(LLVMValueRef wStructValue, LLVMBuilderRef builde
|
|||
CompileAssignment(wStructValue, builder, function, statement);
|
||||
return 0;
|
||||
|
||||
case Declaration:
|
||||
CompileFunctionVariableDeclaration(builder, statement);
|
||||
return 0;
|
||||
|
||||
case Return:
|
||||
CompileReturn(wStructValue, builder, function, statement);
|
||||
return 1;
|
||||
|
@ -470,6 +523,8 @@ static void CompileStruct(LLVMModuleRef module, LLVMContextRef context, Node *no
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
RegisterCustomType(wStruct, node->children[0]->value.string);
|
||||
}
|
||||
|
||||
static void Compile(LLVMModuleRef module, LLVMContextRef context, Node *node)
|
||||
|
@ -503,6 +558,9 @@ int main(int argc, char *argv[])
|
|||
structFieldMaps = NULL;
|
||||
structFieldMapCount = 0;
|
||||
|
||||
customTypes = NULL;
|
||||
customTypeCount = 0;
|
||||
|
||||
stack = CreateStack();
|
||||
|
||||
FILE *fp = fopen(argv[1], "r");
|
||||
|
|
12
stack.c
12
stack.c
|
@ -4,7 +4,7 @@
|
|||
|
||||
Stack* CreateStack()
|
||||
{
|
||||
uint32_t i;
|
||||
int32_t i;
|
||||
Stack *stack = (Stack*) malloc(sizeof(Stack));
|
||||
stack->stackCapacity = 4;
|
||||
stack->stackFrames = (StackFrame*) malloc(sizeof(StackFrame) * stack->stackCapacity);
|
||||
|
@ -15,6 +15,8 @@ Stack* CreateStack()
|
|||
stack->stackFrames[i].nodeCount = 0;
|
||||
}
|
||||
stack->stackIndex = 0;
|
||||
|
||||
PushStackFrame(stack);
|
||||
return stack;
|
||||
}
|
||||
|
||||
|
@ -26,8 +28,9 @@ void PushStackFrame(Stack *stack)
|
|||
{
|
||||
stack->stackCapacity += 1;
|
||||
stack->stackFrames = (StackFrame*) realloc(stack->stackFrames, sizeof(StackFrame) * stack->stackCapacity);
|
||||
|
||||
stack->stackFrames[stack->stackIndex].nodes = NULL;
|
||||
stack->stackFrames[stack->stackIndex].nodeCapacity = 0;
|
||||
stack->stackFrames[stack->stackIndex].nodeCount = 0;
|
||||
}
|
||||
|
||||
stack->stackFrames[stack->stackIndex].nodeCount = 0;
|
||||
|
@ -52,6 +55,11 @@ void AddNode(Stack *stack, Node *statementNode)
|
|||
|
||||
Node** GetNodes(Stack *stack, uint32_t *pCount)
|
||||
{
|
||||
if (stack->stackIndex < 0) {
|
||||
*pCount= 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*pCount = stack->stackFrames[stack->stackIndex].nodeCount;
|
||||
return stack->stackFrames[stack->stackIndex].nodes;
|
||||
}
|
||||
|
|
4
stack.h
4
stack.h
|
@ -13,8 +13,8 @@ typedef struct StackFrame
|
|||
typedef struct Stack
|
||||
{
|
||||
StackFrame *stackFrames;
|
||||
uint32_t stackCapacity;
|
||||
uint32_t stackIndex;
|
||||
int32_t stackCapacity;
|
||||
int32_t stackIndex;
|
||||
} Stack;
|
||||
|
||||
Stack* CreateStack();
|
||||
|
|
Loading…
Reference in New Issue