Support __bool__
This commit is contained in:
parent
417a334fc0
commit
8711f8cae7
@ -239,6 +239,7 @@ typedef struct KrkClass {
|
||||
KrkObj * _setattr;
|
||||
KrkObj * _format;
|
||||
KrkObj * _new;
|
||||
KrkObj * _bool;
|
||||
|
||||
size_t cacheIndex;
|
||||
} KrkClass;
|
||||
|
@ -17,6 +17,7 @@ CACHED_METHOD(DESCGET, "__get__", _descget)
|
||||
CACHED_METHOD(DESCSET, "__set__", _descset)
|
||||
CACHED_METHOD(CLASSGETITEM, "__class_getitem__", _classgetitem)
|
||||
CACHED_METHOD(HASH, "__hash__", _hash)
|
||||
CACHED_METHOD(BOOL, "__bool__", _bool)
|
||||
|
||||
#define BINOPTRIO(name) \
|
||||
CACHED_METHOD(name, "__" #name "__", _ ## name) \
|
||||
|
11
src/vm.c
11
src/vm.c
@ -869,6 +869,17 @@ int krk_isFalsey(KrkValue value) {
|
||||
}
|
||||
KrkClass * type = krk_getType(value);
|
||||
|
||||
if (type->_bool) {
|
||||
krk_push(value);
|
||||
KrkValue result = krk_callDirect(type->_bool,1);
|
||||
if (krk_currentThread.flags & KRK_THREAD_HAS_EXCEPTION) return 1;
|
||||
if (!IS_BOOLEAN(result)) {
|
||||
krk_runtimeError(vm.exceptions->typeError, "__bool__ should return bool, not %T", result);
|
||||
return 1;
|
||||
}
|
||||
return !AS_INTEGER(result);
|
||||
}
|
||||
|
||||
/* If it has a length, and that length is 0, it's Falsey */
|
||||
if (type->_len) {
|
||||
krk_push(value);
|
||||
|
Loading…
x
Reference in New Issue
Block a user