RPA Toolkit
added long, double key support for the rmap_t.
[rpatk.git] / rvm / rvmreg.h
1 #ifndef _RVMREG_H_
2 #define _RVMREG_H_
3
4 //#include "rvmcpu.h"
5 #include "robject.h"
6 #include "rarray.h"
7 #include "rharray.h"
8 #include "rcarray.h"
9 #include "rmap.h"
10 #include "rstring.h"
11
12
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16
17 #define RVM_DTYPE_NONE 0
18 #define RVM_DTYPE_WORD RVM_DTYPE_NONE
19 #define RVM_DTYPE_UNSIGNED RVM_DTYPE_NONE
20 #define RVM_DTYPE_LONG 1
21 #define RVM_DTYPE_POINTER 2                     /* Generic pointer, it can point to any memory object */
22 #define RVM_DTYPE_BOOLEAN 3
23 #define RVM_DTYPE_DOUBLE 4
24 #define RVM_DTYPE_PAIR 5
25 #define RVM_DTYPE_UNDEF 6
26 #define RVM_DTYPE_STRPTR 7
27 #define RVM_DTYPE_STRING 8
28 #define RVM_DTYPE_ARRAY 9
29 #define RVM_DTYPE_HARRAY 10
30 #define RVM_DTYPE_NAN 11
31 #define RVM_DTYPE_JSOBJECT 12
32 #define RVM_DTYPE_FUNCTION 13
33 #define RVM_DTYPE_SWIID 14
34 #define RVM_DTYPE_USER 16
35 #define RVM_DTYPE_SIZE (1 << 5)
36 #define RVM_DTYPE_MASK (RVM_DTYPE_SIZE - 1)
37 #define RVM_DTYPE_MAX (RVM_DTYPE_MASK)
38 #define RVM_DTYPE_USERDEF(__n__) (RVM_DTYPE_USER + (__n__))
39
40 #define RVM_INFOBIT_ROBJECT (1 << 0)
41 #define RVM_INFOBIT_LAST (1 << 15)
42 #define RVM_INFOBIT_ALL (RVM_INFOBIT_ROBJECT | RVM_INFOBIT_LAST)
43
44
45 #define RVM_CPUREG_R_PTR(__cpu__, __r__) (&(__cpu__)->r[(__r__)])
46 #define RVM_CPUREG_PTR(__cpu__, __r__) RVM_CPUREG_R_PTR(__cpu__, __r__)
47 #define RVM_CPUREG_GET(__cpu__, __r__) *(RVM_CPUREG_PTR(__cpu__, __r__))
48 #define RVM_CPUREG_SET(__cpu__, __r__, __val__) do { *(RVM_CPUREG_PTR(__cpu__, __r__)) = (rvmreg_t)(__val__); } while (0)
49
50 #define RVM_REG_GETTYPE(__r__) (__r__)->type
51 #define RVM_REG_SETTYPE(__r__, __val__) do { (__r__)->type = (__val__); } while(0);
52 #define RVM_CPUREG_GETTYPE(__cpu__, __r__) RVM_REG_GETTYPE(RVM_CPUREG_PTR(__cpu__, __r__))
53 #define RVM_CPUREG_SETTYPE(__cpu__, __r__, __val__) RVM_REG_SETTYPE(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
54
55 #define RVM_REG_TSTFLAG(__r__, __flag__) ((__r__)->flags & (__flag__)) ? TRUE : FALSE
56 #define RVM_REG_SETFLAG(__r__, __flag__) do { (__r__)->flags |= (__flag__); } while (0)
57 #define RVM_REG_GETFLAGS(__r__) (__r__)->flags
58 #define RVM_REG_CLRFLAG(__r__, __flag__) do { (__r__)->flags &= ~(__flag__); } while (0)
59 #define RVM_REG_ASSIGNFLAGS(__r__, __flags__) do { (__r__)->flags = (__flags__); } while (0)
60 #define RVM_CPUREG_TSTFLAG(__cpu__, __r__, __flag__) RVM_REG_TSTFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
61 #define RVM_CPUREG_SETFLAG(__cpu__, __r__, __flag__) RVM_REG_SETFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
62 #define RVM_CPUREG_GETFLAGS(__cpu__, __r__) RVM_REG_GETFLAGS(RVM_CPUREG_PTR(__cpu__, __r__))
63 #define RVM_CPUREG_CLRFLAG(__cpu__, __r__, __flag__) RVM_REG_CLRFLAG(RVM_CPUREG_PTR(__cpu__, __r__), __flag__)
64 #define RVM_CPUREG_ASSIGNFLAGS(__cpu__, __r__, __flags__) RVM_REG_ASSIGNFLAGS(RVM_CPUREG_PTR(__cpu__, __r__), __flags__)
65
66
67 #define RVM_REG_GETU(__r__) (__r__)->v.w
68 #define RVM_REG_SETU(__r__, __val__) do { (__r__)->v.w = (rword)(__val__); } while (0)
69 #define RVM_CPUREG_GETU(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.w
70 #define RVM_CPUREG_SETU(__cpu__, __r__, __val__) RVM_REG_SETU(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
71
72 #define RVM_REG_GETL(__r__) (__r__)->v.l
73 #define RVM_REG_SETL(__r__, __val__) do { (__r__)->v.l = (rlong)(__val__); } while (0)
74 #define RVM_CPUREG_GETL(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.l
75 #define RVM_CPUREG_SETL(__cpu__, __r__, __val__) RVM_REG_SETL(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
76
77 #define RVM_REG_GETP(__r__) (__r__)->v.p
78 #define RVM_REG_SETP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
79 #define RVM_CPUREG_GETP(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.p
80 #define RVM_CPUREG_SETP(__cpu__, __r__, __val__) RVM_REG_SETP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
81
82 #define RVM_REG_GETD(__r__) (__r__)->v.d
83 #define RVM_REG_SETD(__r__, __val__) do { (__r__)->v.d = (rdouble)(__val__); } while (0)
84 #define RVM_CPUREG_GETD(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.d
85 #define RVM_CPUREG_SETD(__cpu__, __r__, __val__) RVM_REG_SETD(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
86
87 #define RVM_REG_GETU64(__r__) (__r__)->v.u64
88 #define RVM_REG_SETU64(__r__, __val__) do { (__r__)->v.u64 = (ruint64)(__val__); } while (0)
89 #define RVM_CPUREG_GETU64(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.u64
90 #define RVM_CPUREG_SETU64(__cpu__, __r__, __val__) RVM_REG_SETU64(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
91
92 #define RVM_REG_GETPAIR(__r__) (__r__)->v.pair
93 #define RVM_REG_SETPAIR(__r__, __val1__, __val2__) do { (__r__)->v.pair.p1 = (__val1__); (__r__)->v.pair.p2 = (__val2__);} while (0)
94 #define RVM_CPUREG_GETPAIR(__cpu__, __r__) RVM_CPUREG_PTR(__cpu__, __r__)->v.pair
95 #define RVM_CPUREG_SETPAIR(__cpu__, __r__, __val1__, __val2__) RVM_REG_SETPAIR(RVM_CPUREG_PTR(__cpu__, __r__), __val1__, __val2__)
96
97 #define RVM_REG_GETSTR(__r__) (__r__)->v.s
98 #define RVM_REG_SETSTR(__r__, __str__, __size__) do { (__r__)->v.s = (__str__); if ((__size__) == (ruint)-1) (__r__)->size = r_strlen(__str__); else (__r__)->size = (__size__);} while (0)
99 #define RVM_CPUREG_GETSTR(__cpu__, __r__) RVM_REG_GETSTR(RVM_CPUREG_PTR(__cpu__, __r__))
100 #define RVM_CPUREG_SETSTR(__cpu__, __r__, __str__, __size__) RVM_REG_SETSTR(RVM_CPUREG_PTR(__cpu__, __r__), __str__, __size__)
101
102
103 #define RVM_REG_GETIP(__r__) (rvm_asmins_t*)((__r__)->v.p)
104 #define RVM_REG_SETIP(__r__, __val__) do { (__r__)->v.p = (rpointer)(__val__); } while (0)
105 #define RVM_REG_INCIP(__r__, __val__) do {rvm_asmins_t *p = RVM_REG_GETIP(__r__); (__r__)->v.p = (rpointer)(p + (__val__)); } while (0)
106 #define RVM_CPUREG_GETIP(__cpu__, __r__) ((rvm_asmins_t*)RVM_CPUREG_PTR(__cpu__, __r__)->v.p)
107 #define RVM_CPUREG_SETIP(__cpu__, __r__, __val__) RVM_REG_SETIP(RVM_CPUREG_PTR(__cpu__, __r__), __val__)
108 #define RVM_CPUREG_INCIP(__cpu__, __r__, __val__) do {rvm_asmins_t *p = RVM_CPUREG_GETIP(__cpu__, __r__); (RVM_CPUREG_PTR(__cpu__, __r__))->v.p = (rpointer)(p + (__val__)); } while (0)
109
110 #define RVM_REG_GETSIZE(__r__) (__r__)->size
111 #define RVM_CPUREG_GETSIZE(__cpu__, __r__) RVM_REG_GETSIZE(RVM_CPUREG_PTR(__cpu__, __r__))
112
113 #define RVM_REG_CLEAR(__r__) do { (__r__)->v.w = 0UL; (__r__)->type = 0; (__r__)->flags = 0;  } while (0)
114 #define RVM_CPUREG_CLEAR(__cpu__, __r__) RVM_REG_CLEAR(RVM_CPUREG_PTR(__cpu__, __r__))
115
116
117
118 #define RVM_MIN_REGSIZE (sizeof(rword)/8)
119
120 typedef ruint16 rvmreg_type_t;
121 typedef ruint16 rvmreg_flags_t;
122
123 typedef struct rvmreg_s {
124         union {
125                 ruint64 u64;
126                 rword w;
127                 rlong l;
128                 rpointer p;
129                 rdouble d;
130                 rchar *s;
131                 rpair_t pair;
132                 ruint8 c[RVM_MIN_REGSIZE];
133         } v;
134         ruint32 size;
135         rvmreg_type_t type;
136         rvmreg_flags_t flags;
137 } rvmreg_t;
138
139 /* Create array with rvmreg elements */
140 rarray_t *r_array_create_rvmreg();
141 /* Create harray with rvmreg elements */
142 rharray_t *r_harray_create_rvmreg();
143 /* Create carray with rvmreg elements */
144 rcarray_t *r_carray_create_rvmreg();
145
146 rvmreg_t rvm_reg_create_string_ansi(const rchar *s);
147 rvmreg_t rvm_reg_create_string(const rstr_t *s);
148 rvmreg_t rvm_reg_create_array();
149 rvmreg_t rvm_reg_create_harray();
150 rvmreg_t rvm_reg_create_double(rdouble d);
151 rvmreg_t rvm_reg_create_long(rlong l);
152 rvmreg_t rvm_reg_create_pair(ruint p1, ruint p2);
153 rvmreg_t rvm_reg_create_strptr(rchar *s, ruint size);
154 void rvm_reg_init(rvmreg_t *reg);
155 void rvm_reg_cleanup(rvmreg_t *reg);
156 rvmreg_t *rvm_reg_copy(rvmreg_t *dst, const rvmreg_t *src);
157 void rvm_reg_array_unref_gcdata(robject_t *obj);
158 void rvm_reg_settype(rvmreg_t *r, ruint type);
159 ruint rvm_reg_gettype(const rvmreg_t *r);
160 rboolean rvm_reg_tstflag(const rvmreg_t *r, ruint16 flag);
161 void rvm_reg_setflag(rvmreg_t *r, ruint16 flag);
162 void rvm_reg_clrflag(rvmreg_t *r, ruint16 flag);
163 void rvm_reg_setundef(rvmreg_t *r);
164 void rvm_reg_setunsigned(rvmreg_t *r, rword u);
165 void rvm_reg_setboolean(rvmreg_t *r, ruint b);
166 void rvm_reg_setlong(rvmreg_t *r, rlong l);
167 void rvm_reg_setdouble(rvmreg_t *r, rdouble d);
168 void rvm_reg_setpointer(rvmreg_t *r, rpointer p);
169 void rvm_reg_setpair(rvmreg_t *r, ruint p1, ruint p2);
170 void rvm_reg_setstrptr(rvmreg_t *r, rchar *s, ruint size);
171 void rvm_reg_setstring(rvmreg_t *r, rstring_t *ptr);
172 void rvm_reg_setarray(rvmreg_t *r, robject_t *ptr);
173 void rvm_reg_setharray(rvmreg_t *r, robject_t *ptr);
174 void rvm_reg_setjsobject(rvmreg_t *r, robject_t *ptr);
175 int rvm_reg_str2num(rvmreg_t *dst, const rvmreg_t *src);
176 int rvm_reg_str2long(rvmreg_t *dst, const rvmreg_t *ssrc);
177 int rvm_reg_str2double(rvmreg_t *dst, const rvmreg_t *ssrc);
178
179 rint rvm_reg_int(const rvmreg_t *src);
180 rlong rvm_reg_long(const rvmreg_t *src);
181 ruchar rvm_reg_boolean(const rvmreg_t *src);
182 rdouble rvm_reg_double(const rvmreg_t *src);
183 rpointer rvm_reg_pointer(const rvmreg_t *src);
184 rstring_t *rvm_reg_string(const rvmreg_t *src);
185 rmap_t *rvm_reg_jsobject(const rvmreg_t *src);
186
187
188 #ifdef __cplusplus
189 }
190 #endif
191
192 #endif