Пример #1
0
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;
}