Merge branch 'master' of https://chookspace.com/ground/ground
This commit is contained in:
@@ -769,6 +769,33 @@ GroundValue interpretGroundInstruction(GroundInstruction inst, GroundScope* scop
|
|||||||
if (in->args.args[i].type == VALREF) {
|
if (in->args.args[i].type == VALREF) {
|
||||||
GroundVariable* variable = findVariable(*scope->variables, in->args.args[i].value.refName);
|
GroundVariable* variable = findVariable(*scope->variables, in->args.args[i].value.refName);
|
||||||
if (variable) {
|
if (variable) {
|
||||||
|
// If there is a duplicator, call it (except when returning and getting fields)
|
||||||
|
if (variable->value.type == CUSTOM && in->type != RETURN && in->type != GETFIELD) {
|
||||||
|
GroundObject* obj = variable->value.data.customVal;
|
||||||
|
GroundObjectField* duplicator = findField(*obj, "duplicator");
|
||||||
|
if (duplicator != NULL) {
|
||||||
|
if (duplicator->value.type != FUNCTION) {
|
||||||
|
runtimeError(ARG_TYPE_MISMATCH, "duplicator is not a function", in, currentInstruction);
|
||||||
|
}
|
||||||
|
GroundInstruction gi = createGroundInstruction(CALLMETHOD);
|
||||||
|
addArgToInstruction(&gi, createRefGroundArg(DIRREF, in->args.args[i].value.refName));
|
||||||
|
addArgToInstruction(&gi, createRefGroundArg(FNREF, "duplicator"));
|
||||||
|
addArgToInstruction(&gi, createValueGroundArg(variable->value));
|
||||||
|
addArgToInstruction(&gi, createRefGroundArg(DIRREF, "__ground_tmp_duplicate"));
|
||||||
|
GroundValue gv = interpretGroundInstruction(gi, scope);
|
||||||
|
if (gv.type == ERROR) {
|
||||||
|
return gv;
|
||||||
|
}
|
||||||
|
GroundVariable* tmp = findVariable(*scope->variables, "__ground_tmp_duplicate");
|
||||||
|
if (tmp == NULL) {
|
||||||
|
runtimeError(FIXME, "Couldn't find temporary variable (this should never happen)", in, currentInstruction);
|
||||||
|
}
|
||||||
|
in->args.args[i].value.value = copyGroundValue(&tmp->value);
|
||||||
|
in->args.args[i].type = VALUE;
|
||||||
|
deleteVariable(scope->variables, tmp);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
free(in->args.args[i].value.refName); // Free the strdup'd refName
|
free(in->args.args[i].value.refName); // Free the strdup'd refName
|
||||||
in->args.args[i].value.value = copyGroundValue(&variable->value);
|
in->args.args[i].value.value = copyGroundValue(&variable->value);
|
||||||
in->args.args[i].type = VALUE;
|
in->args.args[i].type = VALUE;
|
||||||
|
|||||||
Reference in New Issue
Block a user