1 /* Runtime types. 2 3 Copyright (C) 2015-2019, 2021 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 #ifndef __TYPES_H__ 20 #define __TYPES_H__ 21 22 /* Define code and position types, populated by enum values defined for each 23 program specifically. */ 24 25 #include <stdint.h> 26 #include <stdlib.h> 27 28 /* Include the special instance position value. The pos member of __obj refers 29 to the special type attribute for classes, indicating which position holds 30 the attribute describing the class type. For instances, it is set to the same 31 attribute position as __class__ and is defined in the following file. */ 32 33 #include "instancepos.h" 34 35 typedef uint16_t __code; 36 typedef uint16_t __pos; 37 typedef uint16_t __pcode; 38 typedef uint16_t __ppos; 39 40 /* Attribute tables are lists of codes confirming the presence of attributes. */ 41 42 typedef struct __table 43 { 44 const __pos size; 45 const size_t obj_size; /* size for value instance copying */ 46 const __code attrs[]; 47 } __table; 48 49 /* Parameter tables are lists of codes confirming the presence of parameters, as 50 well as the positions of those parameters in the list for a given function. 51 */ 52 53 typedef struct __param 54 { 55 __code code; 56 __pos pos; 57 } __param; 58 59 typedef struct __ptable 60 { 61 const __ppos min, max, size; 62 const __param params[]; 63 } __ptable; 64 65 /* Attributes are values referring to objects or encoding other information. 66 Objects are collections of attributes. 67 Object references are references to tables and collections of attributes. 68 Attribute references are references to single attributes. */ 69 70 typedef struct __obj __obj; 71 typedef struct __fragment __fragment; 72 typedef union __attr __attr; 73 typedef __obj * __ref; 74 75 /* Introduce an integer type that is interoperable with the size type. */ 76 77 typedef ssize_t __int; 78 typedef size_t __uint; 79 80 /* Introduce a floating point type. */ 81 82 typedef _Float64 __float; 83 84 /* Introduce value stack section and descriptor. */ 85 86 typedef struct __section __section; 87 typedef struct __stackdesc __stackdesc; 88 89 /* Attribute value interpretations. */ 90 91 typedef union __attr 92 { 93 /* General attribute members. */ 94 95 __ref value; /* attribute value */ 96 uintptr_t rawvalue; /* raw attribute value used to test tagging */ 97 98 /* Special case attribute members. */ 99 100 const __ptable * ptable; /* parameter table */ 101 struct { 102 __pcode code; /* parameter table code for key */ 103 __ppos pos; /* parameter table position for key */ 104 }; 105 __attr (*fn)(); /* callable details */ 106 char * strvalue; /* string value */ 107 __fragment * seqvalue; /* sequence data */ 108 void * datavalue; /* object-specific data */ 109 __int sizevalue; /* object-specific size */ 110 111 /* Value stack parameter member. */ 112 113 __stackdesc *stackdesc; /* reference to value stack descriptor */ 114 115 } __attr; 116 117 typedef struct __obj 118 { 119 const __table * table; /* attribute table */ 120 __ppos pos; /* position of attribute indicating class */ 121 __attr attrs[]; /* attributes */ 122 123 /* Specialisations of this type may add other members. 124 See generator.py for type generation, progops.h for definitions, and 125 the generated progtypes.h for the final details. */ 126 127 } __obj; 128 129 #define __INSTANCE_SIZE(REF) ((REF)->table->obj_size) 130 131 /* Fragments are simple collections of attributes employed by sequence types. 132 They provide the basis of lists and tuples. */ 133 134 typedef struct __fragment 135 { 136 __int size, capacity; 137 __attr attrs[]; 138 } __fragment; 139 140 #define __FRAGMENT_SIZE(NUMBER) ((NUMBER) * sizeof(__attr) + 2 * sizeof(__int)) 141 142 /* Sections are used to provide the value stack. */ 143 144 typedef struct __section 145 { 146 char *base, *level, *limit; 147 __section *previous; 148 } __section; 149 150 /* The value stack descriptor references the current value stack section. */ 151 152 typedef struct __stackdesc 153 { 154 __section *current; 155 } __stackdesc; 156 157 /* Attribute interpretation. */ 158 159 #define __NUM_TAG_BITS 2 160 #define __TAG_MUTABLE 0b10UL 161 #define __TAG_MASK 0b11UL 162 163 #define __COPYABLE(ATTR) (__VALUE(ATTR)->table->obj_size != 0) 164 #define __MUTABLE(ATTR) ((ATTR).rawvalue & __TAG_MUTABLE) 165 #define __TO_IMMUTABLE(ATTR) ((__attr) {.rawvalue=(ATTR).rawvalue & (~__TAG_MUTABLE)}) 166 #define __TO_MUTABLE(ATTR) ((__attr) {.rawvalue=(ATTR).rawvalue | __TAG_MUTABLE}) 167 #define __MUTABLEVALUE(REF) ((__attr) {.rawvalue=(uintptr_t) REF | __TAG_MUTABLE}) 168 #define __RAWVALUE(VALUE) ((__attr) {.rawvalue=VALUE}) 169 170 /* Attribute value setting. */ 171 172 #define __ATTRVALUE(VALUE) ((__attr) {.value=(__ref) VALUE}) 173 #define __NULL __ATTRVALUE(0) 174 #define __SETNULL(ATTR) ((ATTR).value = 0) 175 176 /* Value limits. */ 177 178 #define __MAXINT ((((__uint) 1) << ((sizeof(__int) * 8) - 1)) - 1) 179 #define __MININT (-(((__uint) 1) << ((sizeof(__int) * 8) - 1))) 180 181 /* Argument lists. */ 182 183 #define __ARGS(...) ((__attr[]) {__VA_ARGS__}) 184 #define __KWARGS(...) ((__param[]) {__VA_ARGS__}) 185 186 /* Attribute codes and positions for attribute names. */ 187 188 #define __ATTRCODE(ATTRNAME) __code_##ATTRNAME 189 #define __ATTRPOS(ATTRNAME) __pos_##ATTRNAME 190 #define __PARAMCODE(PARAMNAME) __pcode_##PARAMNAME 191 #define __PARAMPOS(PARAMNAME) __ppos_##PARAMNAME 192 193 #endif /* __TYPES_H__ */