1.1 --- a/templates/native.c Thu Nov 24 00:58:36 2016 +0100
1.2 +++ b/templates/native.c Thu Nov 24 18:55:10 2016 +0100
1.3 @@ -13,7 +13,7 @@
1.4
1.5 /* Utility functions. */
1.6
1.7 -inline __attr __new_int(int i)
1.8 +static __attr __new_int(int i)
1.9 {
1.10 /* Create a new integer and mutate the __data__ attribute. */
1.11 __attr attr = __new(&__InstanceTable___builtins___int_int, &__builtins___int_int, sizeof(__obj___builtins___int_int));
1.12 @@ -21,7 +21,7 @@
1.13 return attr;
1.14 }
1.15
1.16 -inline __attr __new_str(char *s)
1.17 +static __attr __new_str(char *s)
1.18 {
1.19 /* Create a new string and mutate the __data__ attribute. */
1.20 __attr attr = __new(&__InstanceTable___builtins___str_string, &__builtins___str_string, sizeof(__obj___builtins___str_string));
1.21 @@ -512,12 +512,30 @@
1.22 return __builtins___none_None;
1.23 }
1.24
1.25 +static int __issubclass(__ref obj, __attr cls)
1.26 +{
1.27 + return (__HASATTR(obj, __TYPEPOS(cls.value), __TYPECODE(cls.value)));
1.28 +}
1.29 +
1.30 __attr __fn_native__isinstance(__attr __args[])
1.31 {
1.32 __attr * const obj = &__args[1];
1.33 __attr * const cls = &__args[2];
1.34
1.35 - if (__is_instance(obj->value) && __HASATTR(__get_class(obj->value), __TYPEPOS(cls->value), __TYPECODE(cls->value)))
1.36 + /* cls must be a class. */
1.37 + if (__is_instance(obj->value) && __issubclass(__get_class(obj->value), *cls))
1.38 + return __builtins___boolean_True;
1.39 + else
1.40 + return __builtins___boolean_False;
1.41 +}
1.42 +
1.43 +__attr __fn_native__issubclass(__attr __args[])
1.44 +{
1.45 + __attr * const obj = &__args[1];
1.46 + __attr * const cls = &__args[2];
1.47 +
1.48 + /* obj and cls must be classes. */
1.49 + if (__issubclass(obj->value, *cls))
1.50 return __builtins___boolean_True;
1.51 else
1.52 return __builtins___boolean_False;