Support __bool__

This commit is contained in:
K. Lange 2023-02-12 13:38:28 +09:00
parent 417a334fc0
commit 8711f8cae7
3 changed files with 13 additions and 0 deletions

View File

@ -239,6 +239,7 @@ typedef struct KrkClass {
KrkObj * _setattr;
KrkObj * _format;
KrkObj * _new;
KrkObj * _bool;
size_t cacheIndex;
} KrkClass;

View File

@ -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) \

View File

@ -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);