Lichen

templates/native/introspection.c

750:44ea0968a550
2017-03-20 Paul Boddie Added the context identity to the AttrResult string representation.
     1 /* Native functions for introspection operations.     2      3 Copyright (C) 2016, 2017 Paul Boddie <paul@boddie.org.uk>     4      5 This program is free software; you can redistribute it and/or modify it under     6 the terms of the GNU General Public License as published by the Free Software     7 Foundation; either version 3 of the License, or (at your option) any later     8 version.     9     10 This program is distributed in the hope that it will be useful, but WITHOUT    11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS    12 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more    13 details.    14     15 You should have received a copy of the GNU General Public License along with    16 this program.  If not, see <http://www.gnu.org/licenses/>.    17 */    18     19 #include "types.h"    20 #include "exceptions.h"    21 #include "ops.h"    22 #include "progconsts.h"    23 #include "progops.h"    24 #include "progtypes.h"    25 #include "main.h"    26     27 /* Introspection. */    28     29 __attr __fn_native_introspection_object_getattr(__attr __args[])    30 {    31     __attr * const obj = &__args[1];    32     __attr * const name = &__args[2];    33     __attr * const _default = &__args[3];    34     /* name.__data__ interpreted as string */    35     __attr key = __load_via_object(name->value, __key__);    36     __attr out;    37     38     if ((key.code == 0) && (key.pos == 0))    39         return *_default;    40     41     /* Attempt to get the attribute from the object. */    42     43     out = __check_and_load_via_object_null(obj->value, key.pos, key.code);    44     if (out.value == 0)    45     {    46         /* Inspect the object's class if this failed. */    47     48         out = __check_and_load_via_class__(obj->value, key.pos, key.code);    49         if (out.value == 0)    50             return *_default;    51     52         /* Update the context to the object if it is a method. */    53     54         return __update_context(obj->value, out);    55     }    56     57     return out;    58 }    59     60 __attr __fn_native_introspection_isinstance(__attr __args[])    61 {    62     __attr * const obj = &__args[1];    63     __attr * const cls = &__args[2];    64     65     /* cls must be a class. */    66     if (__is_instance_subclass(obj->value, *cls))    67         return __builtins___boolean_True;    68     else    69         return __builtins___boolean_False;    70 }    71     72 __attr __fn_native_introspection_issubclass(__attr __args[])    73 {    74     __attr * const obj = &__args[1];    75     __attr * const cls = &__args[2];    76     77     /* obj and cls must be classes. */    78     if (__is_subclass(obj->value, *cls))    79         return __builtins___boolean_True;    80     else    81         return __builtins___boolean_False;    82 }    83     84 /* Module initialisation. */    85     86 void __main_native_introspection()    87 {    88 }