Ticket #549: unionvalrem.patch
File unionvalrem.patch, 14.0 KB (added by jessevdam, 12 years ago) |
---|
-
include/parrot/call.h
### Eclipse Workspace Patch 1.0 #P parrot
70 70 INTVAL slurp_n; /* number of :flat/:slurpy args/params to match */ 71 71 } call_state_item; 72 72 73 typedef union UnionCallStateVal { 74 struct _ptrs { //or two pointers, both are defines 75 DPOINTER * _struct_val; 76 PMC * _pmc_val; 77 } _ptrs; 78 struct _i { 79 INTVAL _int_val; // or 2 intvals 80 INTVAL _int_val2; 81 } _i; 82 FLOATVAL _num_val; // or one float 83 struct parrot_string_t * _string_val; // or a pointer to a string 84 } UnionCallStateVal; 85 86 #define UVal_ptr(u) (u)._ptrs._struct_val 87 #define UVal_pmc(u) (u)._ptrs._pmc_val 88 #define UVal_int(u) (u)._i._int_val 89 #define UVal_int2(u) (u)._i._int_val2 90 #define UVal_num(u) (u)._num_val 91 #define UVal_str(u) (u)._string_val 92 73 93 typedef struct call_state { 74 94 call_state_item src; 75 95 call_state_item dest; 76 Union Val val;96 UnionCallStateVal val; 77 97 int n_actual_args; /* arguments incl. flatten */ 78 98 int optionals; /* sum of optionals */ 79 99 int params; /* sum of params */ -
src/call/pcc.c
1665 1665 * RT #54860 and others 1666 1666 * Save current value while setting the optional 1667 1667 */ 1668 const Union Val old_value = st->val;1668 const UnionCallStateVal old_value = st->val; 1669 1669 1670 1670 while (dest->sig & PARROT_ARG_OPTIONAL) { 1671 1671 null_val(st->dest.sig, st); -
include/parrot/pobj.h
15 15 16 16 #include "parrot/config.h" 17 17 18 typedef union UnionVal {19 struct _b { /* One Buffer structure */20 void * _bufstart;21 size_t _buflen;22 } _b;23 struct _ptrs { /* or two pointers, both are defines */24 DPOINTER * _struct_val;25 PMC * _pmc_val;26 } _ptrs;27 struct _i {28 INTVAL _int_val; /* or 2 intvals */29 INTVAL _int_val2;30 } _i;31 FLOATVAL _num_val; /* or one float */32 struct parrot_string_t * _string_val; /* or a pointer to a string */33 } UnionVal;34 35 #define UVal_ptr(u) (u)._ptrs._struct_val36 #define UVal_pmc(u) (u)._ptrs._pmc_val37 #define UVal_int(u) (u)._i._int_val38 #define UVal_int2(u) (u)._i._int_val239 #define UVal_num(u) (u)._num_val40 #define UVal_str(u) (u)._string_val41 42 18 /* Parrot Object - base class for all others */ 43 19 typedef struct pobj_t { 44 UnionVal u; 20 void * _bufstart; 21 size_t _buflen; 45 22 Parrot_UInt flags; 46 23 } pobj_t; 47 24 48 /* plain Buffer is the smallest Parrot Obj */ 49 typedef struct Buffer { 50 UnionVal cache; 51 Parrot_UInt flags; 52 } Buffer; 53 54 typedef Buffer PObj; 25 typedef pobj_t PObj; 26 typedef pobj_t Buffer; 55 27 56 #define PObj_bufstart(pmc) (pmc)-> cache._b._bufstart57 #define PObj_buflen(pmc) (pmc)-> cache._b._buflen28 #define PObj_bufstart(pmc) (pmc)->_bufstart 29 #define PObj_buflen(pmc) (pmc)->_buflen 58 30 59 31 /* See src/gc/alloc_resources.c. the basic idea is that buffer memory is 60 32 set up as follows: … … 84 56 v v v v 85 57 86 58 */ 87 typedef struct Buffer_alloc_unit {88 INTVAL ref_count;89 UnionVal buffer[1]; /* Guarantee it's suitably aligned */90 } Buffer_alloc_unit;91 59 92 60 /* Given a pointer to the buffer, find the ref_count and the actual start of 93 61 the allocated space. Setting ref_count is clunky because we avoid lvalue … … 112 80 } parrot_string_representation_t; 113 81 114 82 struct parrot_string_t { 115 UnionVal cache; 83 void * _bufstart; 84 size_t _buflen; 116 85 Parrot_UInt flags; 117 86 char *strstart; 118 87 UINTVAL bufused; … … 126 95 127 96 /* note that cache and flags are isomorphic with Buffer and PObj */ 128 97 struct PMC { 129 UnionVal cache; 98 void * _bufstart; 99 size_t _buflen; 130 100 Parrot_UInt flags; 131 101 VTABLE *vtable; 132 102 DPOINTER *data; -
src/jit_debug_xcoff.c
118 118 fprintf(stabs, ".stabx \"STRING:t%d=*%d\"" 119 119 ",0," C_DECL ",0\n", i, i+1); 120 120 ++i; 121 fprintf(stabs, ".stab x \"Parrot_String:T%d=s%d"122 "bufstart: 14,%d,%d;"123 "buflen: 6,%d,%d;" /* XXX type */124 "flags: 12,%d,%d;"125 "bufused: 12,%d,%d;"126 "strstart: 15,%d,%d;" /* fake a char* */121 fprintf(stabs, ".stabs \"Parrot_String:T(0,%d)=s%d" 122 "bufstart:(0,14),%d,%d;" 123 "buflen:(0,6),%d,%d;" 124 "flags:(0,12),%d,%d;" 125 "bufused:(0,12),%d,%d;" 126 "strstart:(0,15),%d,%d;" 127 127 ";\"" 128 ", 0," C_DECL ",0\n", i++, BYTE_SIZE(STRING),129 BIT_OFFSET(STRING, cache._b._bufstart), BIT_SIZE(void*),130 BIT_OFFSET(STRING, cache._b._buflen), BIT_SIZE(size_t),128 "," N_LSYM ",0,0,0\n", i++, BYTE_SIZE(STRING), 129 BIT_OFFSET(STRING, _bufstart), BIT_SIZE(void*), 130 BIT_OFFSET(STRING, _buflen), BIT_SIZE(size_t), 131 131 BIT_OFFSET(STRING, flags), BIT_SIZE(UINTVAL), 132 132 BIT_OFFSET(STRING, bufused), BIT_SIZE(UINTVAL), 133 133 BIT_OFFSET(STRING, strstart), BIT_SIZE(void*)); 134 134 135 fprintf(stabs, ".stab x \"PMCType:T%d=e", i++);135 fprintf(stabs, ".stabs \"PMCType:T(0,%d)=e", i++); 136 136 for (j = 0; j < interp->n_vtable_max; ++j) { 137 137 if (interp->vtables[j] && interp->vtables[j]->whoami) { 138 STRING* name = interp->vtables[j]->whoami; 139 fwrite(name->strstart, name->strlen, 1, stabs); 138 STRING *name = interp->vtables[j]->whoami; 139 size_t items = fwrite(name->strstart, name->strlen, 1, stabs); 140 if (!items) 141 fprintf(stderr, "Error writing stabs!\n"); 140 142 fprintf(stabs, ":%d,", j); 141 143 } 142 144 } 143 fprintf(stabs, ";\",0," C_DECL ",0\n");144 145 145 /* PMC type */ 146 fprintf(stabs, ".stabx \"PMC:T%d=s%d", i, BYTE_SIZE(PMC)); 147 fprintf(stabs, "cache:%d,%d,%d;", 148 i + 1, BIT_OFFSET(PMC, cache), BIT_SIZE(UnionVal)); 149 fprintf(stabs, "flags:%d,%d,%d;", 150 i + 1, BIT_OFFSET(PMC, flags), BIT_SIZE(Parrot_UInt)); 151 fprintf(stabs, "vtable:*%d,%d,%d;", 152 i + 3, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*)); 153 fprintf(stabs, "data:14,%d,%d;", 154 BIT_OFFSET(PMC, data), BIT_SIZE(void*)); 155 fprintf(stabs, "pmc_ext:*%d,%d,%d;", 156 i, BIT_OFFSET(PMC, pmc_ext), BIT_SIZE(void*)); 157 fprintf(stabs, ";\""); 158 fprintf(stabs, ",0," C_DECL ",0\n"); 146 fprintf(stabs, ";\"," N_LSYM ",0,0,0\n"); 159 147 160 fprintf(stabs, ".stabx \"cache:%d,%d,%d;" 161 "flags:12,%d,%d;" 162 ";\"" 163 ",0," C_DECL ",0\n", 164 i + 2, BIT_SIZE(UnionVal), BIT_SIZE(Parrot_UInt)); 165 fprintf(stabs, ".stabx \"UnionVal:T%d=u%d" 166 "int_val:12,%d,%d;" 167 "pmc_val:*%d,%d,%d;" 168 ";\"" 169 ",0," C_DECL ",0\n", i + 2, BYTE_SIZE(UnionVal), 170 BIT_OFFSET(UnionVal, int_val), BIT_SIZE(INTVAL), 171 i, BIT_OFFSET(UnionVal, pmc_val), BIT_SIZE(void*)); 172 fprintf(stabs, ".stabx \"VTABLE:T%d=s%d" 173 "base_type:%d,%d,%d;" 174 ";\"" 175 ",0," C_DECL ",0\n", i + 3, BYTE_SIZE(UnionVal), 176 i - 1, BIT_OFFSET(VTABLE, base_type), BIT_SIZE(INTVAL)); 177 i += 4; 148 fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d" 149 "bufstart:(0,14),%d,%d;" 150 "buflen:(0,6),%d,%d;" 151 "flags:(0,12),%d,%d;" 152 "vtable:*(0,%d),%d,%d;" 153 "data:(0,14),%d,%d;" 154 "pmc_ext:*(0,%d),%d,%d;" 155 ";\"" 156 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(PMC), 157 BIT_OFFSET(PMC, _bufstart), BIT_SIZE(void*), 158 BIT_OFFSET(PMC, _buflen), BIT_SIZE(size_t), 159 BIT_OFFSET(PMC, flags), BIT_SIZE(UINTVAL), 160 i + 1, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*), 161 BIT_OFFSET(PMC, data), BIT_SIZE(void*), 162 i + 2, BIT_OFFSET(PMC, pmc_ext), BIT_SIZE(void*)); 163 164 i++; 165 166 //some one can add some field to this one 167 fprintf(stabs, ".stabs \"VTABLE:T(0,%d)=s%d" 168 "base_type:(0,12),%d,%d;" 169 ";\"" 170 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(_vtable), 171 BIT_OFFSET(VTABLE, base_type), BIT_SIZE(INTVAL)); 172 173 i++; 174 175 fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d" 176 "_metadata:*(0,%d),%d,%d;" 177 "_next_for_GC:*(0,%d),%d,%d;" 178 ";\"" 179 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(PMC), 180 i - 2, BIT_OFFSET(PMC_EXT, _metadata), BIT_SIZE(void*), 181 i - 2, BIT_OFFSET(PMC_EXT, _next_for_GC), BIT_SIZE(void*)); 182 183 i++; 178 184 179 185 } 180 186 -
include/parrot/hash.h
28 28 29 29 /* 30 30 * hash_entry is currently unused in the hash structure 31 */31 32 32 typedef struct _hash_entry { 33 33 HashEntryType type; 34 34 UnionVal val; 35 35 } HashEntry; 36 */ 36 37 37 38 /* A BucketIndex is an index into the pool of available buckets. */ 38 39 typedef UINTVAL BucketIndex; -
src/jit_debug.c
106 106 static void 107 107 write_types(FILE *stabs, PARROT_INTERP) 108 108 { 109 //It would be create if this function would be auto generated :) 109 110 int i, j; 110 111 /* borrowed from mono */ 111 112 static BaseTypes base_types[] = { … … 152 153 ++i; 153 154 fprintf(stabs, ".stabs \"Parrot_String:T(0,%d)=s%d" 154 155 "bufstart:(0,14),%d,%d;" 155 "buflen:(0,6),%d,%d;" /* XXX type */156 "buflen:(0,6),%d,%d;" 156 157 "flags:(0,12),%d,%d;" 157 158 "bufused:(0,12),%d,%d;" 158 "strstart:(0,15),%d,%d;" /* fake a char* */159 "strstart:(0,15),%d,%d;" 159 160 ";\"" 160 161 "," N_LSYM ",0,0,0\n", i++, BYTE_SIZE(STRING), 161 BIT_OFFSET(STRING, cache._b._bufstart), BIT_SIZE(void*),162 BIT_OFFSET(STRING, cache._b._buflen), BIT_SIZE(size_t),162 BIT_OFFSET(STRING, _bufstart), BIT_SIZE(void*), 163 BIT_OFFSET(STRING, _buflen), BIT_SIZE(size_t), 163 164 BIT_OFFSET(STRING, flags), BIT_SIZE(UINTVAL), 164 165 BIT_OFFSET(STRING, bufused), BIT_SIZE(UINTVAL), 165 166 BIT_OFFSET(STRING, strstart), BIT_SIZE(void*)); … … 177 178 178 179 fprintf(stabs, ";\"," N_LSYM ",0,0,0\n"); 179 180 180 /* PMC type */ 181 fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d", i, BYTE_SIZE(PMC)); 182 fprintf(stabs, "cache:(0,%d),%d,%d;", 183 i + 1, BIT_OFFSET(PMC, cache), BIT_SIZE(UnionVal)); 184 fprintf(stabs, "flags:(0,%d),%d,%d;", 185 i + 1, BIT_OFFSET(PMC, flags), BIT_SIZE(Parrot_UInt)); 186 fprintf(stabs, "vtable:*(0,%d),%d,%d;", 187 i + 3, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*)); 188 fprintf(stabs, "data:(0,14),%d,%d;", 189 BIT_OFFSET(PMC, data), BIT_SIZE(void*)); 190 fprintf(stabs, "pmc_ext:*(0,%d),%d,%d;", 191 i, BIT_OFFSET(PMC, pmc_ext), BIT_SIZE(void*)); 192 fprintf(stabs, ";\""); 193 fprintf(stabs, "," N_LSYM ",0,0,0\n"); 194 195 fprintf(stabs, ".stabs \"UnionVal:T(0,%d)=u%d" 196 "int_val:(0,12),%d,%d;" 197 "pmc_val:*(0,%d),%d,%d;" 181 fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d" 182 "bufstart:(0,14),%d,%d;" 183 "buflen:(0,6),%d,%d;" 184 "flags:(0,12),%d,%d;" 185 "vtable:*(0,%d),%d,%d;" 186 "data:(0,14),%d,%d;" 187 "pmc_ext:*(0,%d),%d,%d;" 198 188 ";\"" 199 "," N_LSYM ",0,0,0\n", i + 2, BYTE_SIZE(UnionVal), 200 BIT_OFFSET(UnionVal, _i._int_val), BIT_SIZE(INTVAL), 201 i, BIT_OFFSET(UnionVal, _ptrs._pmc_val), BIT_SIZE(void*)); 189 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(PMC), 190 BIT_OFFSET(PMC, _bufstart), BIT_SIZE(void*), 191 BIT_OFFSET(PMC, _buflen), BIT_SIZE(size_t), 192 BIT_OFFSET(PMC, flags), BIT_SIZE(UINTVAL), 193 i + 1, BIT_OFFSET(PMC, vtable), BIT_SIZE(void*), 194 BIT_OFFSET(PMC, data), BIT_SIZE(void*), 195 i + 2, BIT_OFFSET(PMC, pmc_ext), BIT_SIZE(void*)); 196 197 i++; 198 199 //some one can add some field to this one 202 200 fprintf(stabs, ".stabs \"VTABLE:T(0,%d)=s%d" 203 "base_type:(0,%d),%d,%d;" 201 "base_type:(0,12),%d,%d;" 202 ";\"" 203 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(_vtable), 204 BIT_OFFSET(VTABLE, base_type), BIT_SIZE(INTVAL)); 205 206 i++; 207 208 fprintf(stabs, ".stabs \"PMC:T(0,%d)=s%d" 209 "_metadata:*(0,%d),%d,%d;" 210 "_next_for_GC:*(0,%d),%d,%d;" 204 211 ";\"" 205 "," N_LSYM ",0,0,0\n", i + 3, BYTE_SIZE(UnionVal),206 i - 1, BIT_OFFSET(VTABLE, base_type), BIT_SIZE(INTVAL));207 i += 4;212 "," N_LSYM ",0,0,0\n", i, BYTE_SIZE(PMC), 213 i - 2, BIT_OFFSET(PMC_EXT, _metadata), BIT_SIZE(void*), 214 i - 2, BIT_OFFSET(PMC_EXT, _next_for_GC), BIT_SIZE(void*)); 208 215 216 i++; 209 217 } 210 218 211 219 /*