Removed array.forEach, tweaked error messages
This commit is contained in:
@@ -90,70 +90,6 @@ static void attr_arrayPopBack(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
Toy_pushStack(&vm->stack, element);
|
||||
}
|
||||
|
||||
static void attr_arrayForEach(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
//URGENT: replace with for-loop
|
||||
(void)self;
|
||||
|
||||
Toy_Value compound = Toy_popStack(&vm->stack);
|
||||
Toy_Value callback = Toy_popStack(&vm->stack);
|
||||
|
||||
if (TOY_VALUE_IS_FUNCTION(callback) != true) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Expected function, found '%s'", Toy_getValueTypeAsCString(callback.type));
|
||||
Toy_error(buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
Toy_Array* array = TOY_VALUE_AS_ARRAY(compound);
|
||||
Toy_Function* fn = TOY_VALUE_AS_FUNCTION(callback);
|
||||
|
||||
//this emulates 'processInvoke' a bit, but not entirely
|
||||
Toy_VM subVM;
|
||||
Toy_inheritVM(vm, &subVM);
|
||||
|
||||
switch(fn->type) {
|
||||
case TOY_FUNCTION_CUSTOM: {
|
||||
//push and run for each element
|
||||
for (unsigned int iterator = 0; iterator < array->count; iterator++) {
|
||||
//bind to the subVM (more expensive than I'd like)
|
||||
Toy_bindVM(&subVM, fn->bytecode.code, fn->bytecode.parentScope);
|
||||
|
||||
//get parameter name as a string
|
||||
unsigned int paramAddr = ((unsigned int*)(subVM.code + subVM.paramAddr))[0];
|
||||
Toy_ValueType paramType = (Toy_ValueType)(((unsigned int*)(subVM.code + subVM.paramAddr))[1]);
|
||||
const char* cstr = ((char*)(subVM.code + subVM.dataAddr)) + paramAddr;
|
||||
Toy_String* name = Toy_toStringLength(&subVM.memoryBucket, cstr, strlen(cstr));
|
||||
|
||||
Toy_declareScope(subVM.scope, Toy_copyString(name), paramType, Toy_copyValue(&subVM.memoryBucket, array->data[iterator]), true);
|
||||
Toy_freeString(name);
|
||||
|
||||
Toy_runVM(&subVM);
|
||||
|
||||
Toy_resetVM(&subVM, false, true);
|
||||
subVM.scope = NULL; //BUGFIX: need to clear the scope when iterating
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case TOY_FUNCTION_NATIVE: {
|
||||
//this uses a subVM for the native function, which is a slight difference than 'processInoke'
|
||||
for (unsigned int iterator = 0; iterator < array->count; iterator++) {
|
||||
Toy_pushStack(&subVM.stack, Toy_copyValue(&subVM.memoryBucket, array->data[iterator]));
|
||||
|
||||
fn->native.callback(&subVM, &fn->native); //NOTE: try not to leave anything on the stack afterwards
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
Toy_error("Can't call an unknown function type in 'forEach'");
|
||||
break;
|
||||
}
|
||||
|
||||
//cleanup
|
||||
Toy_freeVM(&subVM);
|
||||
}
|
||||
|
||||
static void attr_arraySort(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)vm;
|
||||
(void)self;
|
||||
@@ -173,10 +109,6 @@ Toy_Value Toy_private_handleArrayAttributes(Toy_VM* vm, Toy_Value compound, Toy_
|
||||
Toy_Function* fn = Toy_createFunctionFromCallback(&vm->memoryBucket, attr_arrayPopBack);
|
||||
return TOY_VALUE_FROM_FUNCTION(fn);
|
||||
}
|
||||
else if (MATCH_VALUE_AND_CSTRING(attribute, "forEach")) {
|
||||
Toy_Function* fn = Toy_createFunctionFromCallback(&vm->memoryBucket, attr_arrayForEach);
|
||||
return TOY_VALUE_FROM_FUNCTION(fn);
|
||||
}
|
||||
else if (MATCH_VALUE_AND_CSTRING(attribute, "sort")) {
|
||||
Toy_Function* fn = Toy_createFunctionFromCallback(&vm->memoryBucket, attr_arraySort);
|
||||
return TOY_VALUE_FROM_FUNCTION(fn);
|
||||
@@ -238,13 +170,6 @@ static void attr_tableRemove(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
Toy_removeTable(&table, key);
|
||||
}
|
||||
|
||||
static void attr_tableForEach(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)vm;
|
||||
(void)self;
|
||||
|
||||
//URGENT: replace with for-loop
|
||||
}
|
||||
|
||||
Toy_Value Toy_private_handleTableAttributes(Toy_VM* vm, Toy_Value compound, Toy_Value attribute) {
|
||||
if (MATCH_VALUE_AND_CSTRING(attribute, "length")) {
|
||||
return TOY_VALUE_FROM_INTEGER(TOY_VALUE_AS_ARRAY(compound)->count);
|
||||
@@ -261,10 +186,6 @@ Toy_Value Toy_private_handleTableAttributes(Toy_VM* vm, Toy_Value compound, Toy_
|
||||
Toy_Function* fn = Toy_createFunctionFromCallback(&vm->memoryBucket, attr_tableRemove);
|
||||
return TOY_VALUE_FROM_FUNCTION(fn);
|
||||
}
|
||||
else if (MATCH_VALUE_AND_CSTRING(attribute, "forEach")) {
|
||||
Toy_Function* fn = Toy_createFunctionFromCallback(&vm->memoryBucket, attr_tableForEach);
|
||||
return TOY_VALUE_FROM_FUNCTION(fn);
|
||||
}
|
||||
else {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Unknown attribute '%s' of type '%s'", TOY_VALUE_AS_STRING(attribute)->leaf.data, Toy_getValueTypeAsCString(compound.type));
|
||||
|
||||
Reference in New Issue
Block a user