forked from ground/ground
Destructor
This commit is contained in:
@@ -148,6 +148,33 @@ GroundVariable* findVariable(GroundVariable* head, const char *id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void deleteVariable(GroundVariable** head, GroundVariable *item) {
|
void deleteVariable(GroundVariable** head, GroundVariable *item) {
|
||||||
|
if (strcmp(item->id, "self") == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (item->value.type == CUSTOM) {
|
||||||
|
GroundObjectField* destructor = findField(*item->value.data.customVal, "destructor");
|
||||||
|
if (destructor != NULL) {
|
||||||
|
if (destructor->value.type == FUNCTION) {
|
||||||
|
GroundScope scope = {
|
||||||
|
.labels = NULL,
|
||||||
|
.variables = malloc(sizeof(GroundVariable*)),
|
||||||
|
.isMainScope = false
|
||||||
|
};
|
||||||
|
if (scope.variables == NULL) {
|
||||||
|
runtimeError(FIXME, "Failed to allocate memory for scope variables", NULL, -1);
|
||||||
|
}
|
||||||
|
*scope.variables = NULL;
|
||||||
|
addVariable(scope.variables, "self", item->value);
|
||||||
|
GroundInstruction instruction = createGroundInstruction(CALLMETHOD);
|
||||||
|
addArgToInstruction(&instruction, createRefGroundArg(DIRREF, "self"));
|
||||||
|
addArgToInstruction(&instruction, createRefGroundArg(FNREF, "destructor"));
|
||||||
|
addArgToInstruction(&instruction, createRefGroundArg(DIRREF, ""));
|
||||||
|
interpretGroundInstruction(instruction, &scope);
|
||||||
|
} else {
|
||||||
|
runtimeError(ARG_TYPE_MISMATCH, "Custom type destructor must be a function", NULL, -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
HASH_DEL(*head, item);
|
HASH_DEL(*head, item);
|
||||||
free(item);
|
free(item);
|
||||||
}
|
}
|
||||||
@@ -1922,6 +1949,13 @@ GroundValue interpretGroundInstruction(GroundInstruction inst, GroundScope* scop
|
|||||||
if (returnValue.type != function->returnType) {
|
if (returnValue.type != function->returnType) {
|
||||||
runtimeError(RETURN_TYPE_MISMATCH, "Unexpected return value type from function", in, currentInstruction);
|
runtimeError(RETURN_TYPE_MISMATCH, "Unexpected return value type from function", in, currentInstruction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GroundVariable* var, *tmp;
|
||||||
|
|
||||||
|
HASH_ITER(hh, *newScope.variables, var, tmp) {
|
||||||
|
deleteVariable(newScope.variables, var);
|
||||||
|
}
|
||||||
|
|
||||||
addVariable(scope->variables, in->args.args[in->args.length - 1].value.refName, returnValue);
|
addVariable(scope->variables, in->args.args[in->args.length - 1].value.refName, returnValue);
|
||||||
currentInstruction = currentCurrentInstruction;
|
currentInstruction = currentCurrentInstruction;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user