1.1 --- a/templates/native/introspection.c Sat Mar 04 23:48:19 2017 +0100
1.2 +++ b/templates/native/introspection.c Sun Mar 05 18:08:19 2017 +0100
1.3 @@ -57,18 +57,13 @@
1.4 return out;
1.5 }
1.6
1.7 -static int __issubclass(__ref obj, __attr cls)
1.8 -{
1.9 - return (__HASATTR(obj, __TYPEPOS(cls.value), __TYPECODE(cls.value)));
1.10 -}
1.11 -
1.12 __attr __fn_native_introspection_isinstance(__attr __args[])
1.13 {
1.14 __attr * const obj = &__args[1];
1.15 __attr * const cls = &__args[2];
1.16
1.17 /* cls must be a class. */
1.18 - if (__is_instance(obj->value) && __issubclass(__get_class(obj->value), *cls))
1.19 + if (__is_instance_subclass(obj->value, *cls))
1.20 return __builtins___boolean_True;
1.21 else
1.22 return __builtins___boolean_False;
1.23 @@ -80,7 +75,7 @@
1.24 __attr * const cls = &__args[2];
1.25
1.26 /* obj and cls must be classes. */
1.27 - if (__issubclass(obj->value, *cls))
1.28 + if (__is_subclass(obj->value, *cls))
1.29 return __builtins___boolean_True;
1.30 else
1.31 return __builtins___boolean_False;
2.1 --- a/templates/ops.c Sat Mar 04 23:48:19 2017 +0100
2.2 +++ b/templates/ops.c Sun Mar 05 18:08:19 2017 +0100
2.3 @@ -23,6 +23,18 @@
2.4 #include "progconsts.h"
2.5 #include "progtypes.h"
2.6
2.7 +/* Basic structure tests. */
2.8 +
2.9 +static inline int __WITHIN(__ref obj, int pos)
2.10 +{
2.11 + return pos < obj->table->size;
2.12 +}
2.13 +
2.14 +static inline int __HASATTR(__ref obj, int pos, int code)
2.15 +{
2.16 + return __WITHIN(obj, pos) && (obj->table->attrs[pos] == code);
2.17 +}
2.18 +
2.19 /* Direct access and manipulation of static objects. */
2.20
2.21 __attr __load_static_ignore(__ref obj)
2.22 @@ -83,6 +95,16 @@
2.23 return obj->pos == __INSTANCEPOS;
2.24 }
2.25
2.26 +int __is_subclass(__ref obj, __attr cls)
2.27 +{
2.28 + return __HASATTR(obj, __TYPEPOS(cls.value), __TYPECODE(cls.value));
2.29 +}
2.30 +
2.31 +int __is_instance_subclass(__ref obj, __attr cls)
2.32 +{
2.33 + return __is_instance(obj) && __HASATTR(__get_class(obj), __TYPEPOS(cls.value), __TYPECODE(cls.value));
2.34 +}
2.35 +
2.36 int __is_type_instance(__ref obj)
2.37 {
2.38 return __HASATTR(__get_class(obj), __TYPE_CLASS_POS, __TYPE_CLASS_CODE);
2.39 @@ -317,18 +339,6 @@
2.40 return __unbound_method;
2.41 }
2.42
2.43 -/* Basic structure tests. */
2.44 -
2.45 -int __WITHIN(__ref obj, int pos)
2.46 -{
2.47 - return pos < obj->table->size;
2.48 -}
2.49 -
2.50 -int __HASATTR(__ref obj, int pos, int code)
2.51 -{
2.52 - return __WITHIN(obj, pos) && (obj->table->attrs[pos] == code);
2.53 -}
2.54 -
2.55 /* Parameter position operations. */
2.56
2.57 int __HASPARAM(const __ptable *ptable, int ppos, int pcode)
3.1 --- a/templates/ops.h Sat Mar 04 23:48:19 2017 +0100
3.2 +++ b/templates/ops.h Sun Mar 05 18:08:19 2017 +0100
3.3 @@ -49,6 +49,8 @@
3.4 /* Introspection. */
3.5
3.6 int __is_instance(__ref obj);
3.7 +int __is_subclass(__ref obj, __attr cls);
3.8 +int __is_instance_subclass(__ref obj, __attr cls);
3.9 int __is_type_instance(__ref obj);
3.10 __ref __get_class(__ref obj);
3.11 __attr __get_class_attr(__ref obj);
3.12 @@ -109,11 +111,6 @@
3.13 __attr (*__get_function(__ref context, __attr target))(__attr[]);
3.14 __attr (*__check_and_get_function(__ref context, __attr target))(__attr[]);
3.15
3.16 -/* Basic structure tests. */
3.17 -
3.18 -int __WITHIN(__ref obj, int pos);
3.19 -int __HASATTR(__ref obj, int pos, int code);
3.20 -
3.21 /* Parameter position operations. */
3.22
3.23 int __HASPARAM(const __ptable *ptable, int ppos, int pcode);