# HG changeset patch # User Paul Boddie # Date 1488733699 -3600 # Node ID 42adb63cda0e8be69114cfe8cbd0736f49b9cac7 # Parent 9168bc57af3d1aa2ca0b9fef6b59caacb4f5ccaa Consolidated usage of basic attribute availability tests. diff -r 9168bc57af3d -r 42adb63cda0e templates/native/introspection.c --- a/templates/native/introspection.c Sat Mar 04 23:48:19 2017 +0100 +++ b/templates/native/introspection.c Sun Mar 05 18:08:19 2017 +0100 @@ -57,18 +57,13 @@ return out; } -static int __issubclass(__ref obj, __attr cls) -{ - return (__HASATTR(obj, __TYPEPOS(cls.value), __TYPECODE(cls.value))); -} - __attr __fn_native_introspection_isinstance(__attr __args[]) { __attr * const obj = &__args[1]; __attr * const cls = &__args[2]; /* cls must be a class. */ - if (__is_instance(obj->value) && __issubclass(__get_class(obj->value), *cls)) + if (__is_instance_subclass(obj->value, *cls)) return __builtins___boolean_True; else return __builtins___boolean_False; @@ -80,7 +75,7 @@ __attr * const cls = &__args[2]; /* obj and cls must be classes. */ - if (__issubclass(obj->value, *cls)) + if (__is_subclass(obj->value, *cls)) return __builtins___boolean_True; else return __builtins___boolean_False; diff -r 9168bc57af3d -r 42adb63cda0e templates/ops.c --- a/templates/ops.c Sat Mar 04 23:48:19 2017 +0100 +++ b/templates/ops.c Sun Mar 05 18:08:19 2017 +0100 @@ -23,6 +23,18 @@ #include "progconsts.h" #include "progtypes.h" +/* Basic structure tests. */ + +static inline int __WITHIN(__ref obj, int pos) +{ + return pos < obj->table->size; +} + +static inline int __HASATTR(__ref obj, int pos, int code) +{ + return __WITHIN(obj, pos) && (obj->table->attrs[pos] == code); +} + /* Direct access and manipulation of static objects. */ __attr __load_static_ignore(__ref obj) @@ -83,6 +95,16 @@ return obj->pos == __INSTANCEPOS; } +int __is_subclass(__ref obj, __attr cls) +{ + return __HASATTR(obj, __TYPEPOS(cls.value), __TYPECODE(cls.value)); +} + +int __is_instance_subclass(__ref obj, __attr cls) +{ + return __is_instance(obj) && __HASATTR(__get_class(obj), __TYPEPOS(cls.value), __TYPECODE(cls.value)); +} + int __is_type_instance(__ref obj) { return __HASATTR(__get_class(obj), __TYPE_CLASS_POS, __TYPE_CLASS_CODE); @@ -317,18 +339,6 @@ return __unbound_method; } -/* Basic structure tests. */ - -int __WITHIN(__ref obj, int pos) -{ - return pos < obj->table->size; -} - -int __HASATTR(__ref obj, int pos, int code) -{ - return __WITHIN(obj, pos) && (obj->table->attrs[pos] == code); -} - /* Parameter position operations. */ int __HASPARAM(const __ptable *ptable, int ppos, int pcode) diff -r 9168bc57af3d -r 42adb63cda0e templates/ops.h --- a/templates/ops.h Sat Mar 04 23:48:19 2017 +0100 +++ b/templates/ops.h Sun Mar 05 18:08:19 2017 +0100 @@ -49,6 +49,8 @@ /* Introspection. */ int __is_instance(__ref obj); +int __is_subclass(__ref obj, __attr cls); +int __is_instance_subclass(__ref obj, __attr cls); int __is_type_instance(__ref obj); __ref __get_class(__ref obj); __attr __get_class_attr(__ref obj); @@ -109,11 +111,6 @@ __attr (*__get_function(__ref context, __attr target))(__attr[]); __attr (*__check_and_get_function(__ref context, __attr target))(__attr[]); -/* Basic structure tests. */ - -int __WITHIN(__ref obj, int pos); -int __HASATTR(__ref obj, int pos, int code); - /* Parameter position operations. */ int __HASPARAM(const __ptable *ptable, int ppos, int pcode);