void _VMMethod_set_holder_all(void* _self, pVMClass value) { pVMMethod self = (pVMMethod)_self; // Make sure all nested invokables have the same holder for(size_t i = 0; i < SEND(self, get_number_of_indexable_fields); i++) { pVMObject o = SEND(self, get_indexable_field, i); if(SUPPORTS(o, VMInvokable)) TSEND(VMInvokable, o, set_holder, value); } }
static bool supps(memptr value, memptr symbol) { bool s = false; Type value_type = type(value); switch (value_type) { case TYPE_CONS: s = (SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(8) || SUPPORTS(9) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_INTEGER: s = (SUPPORTS(0) || SUPPORTS(1) || SUPPORTS(2) || SUPPORTS(3) || SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_NATIVE_FUNCTION: s = (SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_NIL_TRUE: s = (SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(15) || SUPPORTS(16) || SUPPORTS(17) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_STRING: s = (SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(8) || SUPPORTS(9) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_USER_FUNCTION: s = (SUPPORTS(4) || SUPPORTS(5) || SUPPORTS(6) || SUPPORTS(7) || SUPPORTS(10) || SUPPORTS(11) || SUPPORTS(18) || SUPPORTS(19)); break; case TYPE_OBJECT: s = (object_lookup(value, symbol) != NOT_FOUND) || supps(object_lookup(value, core_symbol), symbol); break; default: s = false; break; } return s; }