forked from solstice/solstice
Codegen for structs
This commit is contained in:
@@ -986,13 +986,59 @@ ResultType(GroundProgram, charptr) generateInlineGroundNode(SolsNode* node, Sols
|
|||||||
return Success(GroundProgram, charptr, groundParseFile(node->as.inlineGround));
|
return Success(GroundProgram, charptr, groundParseFile(node->as.inlineGround));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResultType(GroundProgram, charptr) generateStructNode(SolsNode* node, SolsScope* scope) {
|
||||||
|
SolsType type = ({
|
||||||
|
ResultType(SolsType, charptr) type = createSolsType(STT_TEMPLATE);
|
||||||
|
if (type.error) {
|
||||||
|
return Error(GroundProgram, charptr, type.as.error);
|
||||||
|
}
|
||||||
|
type.as.success;
|
||||||
|
});
|
||||||
|
GroundProgram constants = groundCreateProgram();
|
||||||
|
GroundProgram structDef = groundCreateProgram();
|
||||||
|
GroundInstruction structDefInst = groundCreateInstruction(STRUCT);
|
||||||
|
groundAddReferenceToInstruction(&structDefInst, groundCreateReference(TYPEREF, node->as.idName));
|
||||||
|
groundAddInstructionToProgram(&structDef, structDefInst);
|
||||||
|
for (size_t i = 0; i < node->children.count; i++) {
|
||||||
|
// Add to type for type system
|
||||||
|
SolsNode* child = &node->children.at[i];
|
||||||
|
ResultType(SolsType, charptr) childType = getNodeType(&child->children.at[1], scope);
|
||||||
|
if (childType.error) {
|
||||||
|
return Error(GroundProgram, charptr, childType.as.error);
|
||||||
|
}
|
||||||
|
addChildToSolsType(&type, childType.as.success, child->children.at[0].as.idName);
|
||||||
|
|
||||||
|
// Generate constant initial value
|
||||||
|
ResultType(GroundProgram, charptr) childCode = generateCode(&child->children.at[1], scope);
|
||||||
|
if (childCode.error) {
|
||||||
|
return Error(GroundProgram, charptr, childCode.as.error);
|
||||||
|
}
|
||||||
|
for (size_t j = 0; j < childCode.as.success.size; j++) {
|
||||||
|
groundAddInstructionToProgram(&constants, childCode.as.success.instructions[j]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to struct
|
||||||
|
GroundInstruction structInst = groundCreateInstruction(SET);
|
||||||
|
groundAddReferenceToInstruction(&structInst, groundCreateReference(DIRREF, child->children.at[0].as.idName));
|
||||||
|
groundAddReferenceToInstruction(&structInst, child->children.at[1].accessArg);
|
||||||
|
groundAddInstructionToProgram(&structDef, structInst);
|
||||||
|
}
|
||||||
|
groundAddInstructionToProgram(&structDef, groundCreateInstruction(ENDSTRUCT));
|
||||||
|
|
||||||
|
// Combine into one program
|
||||||
|
for (size_t i = 0; i < structDef.size; i++) {
|
||||||
|
groundAddInstructionToProgram(&constants, structDef.instructions[i]);
|
||||||
|
}
|
||||||
|
return Success(GroundProgram, charptr, constants);
|
||||||
|
}
|
||||||
|
|
||||||
ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope) {
|
ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope) {
|
||||||
|
|
||||||
GroundProgram program = groundCreateProgram();
|
GroundProgram program = groundCreateProgram();
|
||||||
|
|
||||||
SolsScope backupScope = {NULL, 0};
|
SolsScope backupScope = {NULL, 0};
|
||||||
|
|
||||||
if (node->type != SNT_IF && node->type != SNT_WHILE && node->type != SNT_LAMBDA && node->type != SNT_DEF) {
|
if (node->type != SNT_IF && node->type != SNT_WHILE && node->type != SNT_LAMBDA && node->type != SNT_DEF && node->type != SNT_STRUCT) {
|
||||||
if (node->type == SNT_CODE_BLOCK) {
|
if (node->type == SNT_CODE_BLOCK) {
|
||||||
backupScope = *scope;
|
backupScope = *scope;
|
||||||
SolsScope newScope = copySolsScope(scope);
|
SolsScope newScope = copySolsScope(scope);
|
||||||
@@ -1039,6 +1085,7 @@ ResultType(GroundProgram, charptr) generateCode(SolsNode* node, SolsScope* scope
|
|||||||
case SNT_RETURN: generate(Return);
|
case SNT_RETURN: generate(Return);
|
||||||
case SNT_USE: generate(Use);
|
case SNT_USE: generate(Use);
|
||||||
case SNT_GROUND: generate(InlineGround);
|
case SNT_GROUND: generate(InlineGround);
|
||||||
|
case SNT_STRUCT: generate(Struct);
|
||||||
}
|
}
|
||||||
return Success(GroundProgram, charptr, program);
|
return Success(GroundProgram, charptr, program);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user