6 static void rvm_reg_array_oncopy(rarray_t *array)
11 for (index = 0; index < r_array_length(array); index++) {
12 r = (rvmreg_t *)r_array_slot(array, index);
18 static void rvm_reg_array_oncleanup(rarray_t *array)
23 for (index = 0; index < r_array_length(array); index++) {
24 r = (rvmreg_t *)r_array_slot(array, index);
30 static void rvm_reg_carray_oncopy(rcarray_t *array)
34 ruint len = r_carray_length(array);
37 for (index = 0; index < len; index++) {
38 r = (rvmreg_t *)r_carray_slot(array, index);
44 static void rvm_reg_carray_oncleanup(rcarray_t *array)
48 ruint len = r_carray_length(array);
51 for (index = 0; index < len; index++) {
52 r = (rvmreg_t *)r_carray_slot(array, index);
59 * Recursively go over array data to unref any GC managed
60 * objects. We need this because when GC is destroying arrays,
61 * array's oncleanup might try to destroy the data, that should really
62 * be destroyed by the GC. To avoid any attempts the same data
63 * to be destroyed twice we remove the references of all GC managed
64 * data from the arrays and leave the destruction of such data to
67 void rvm_reg_array_unref_gcdata(robject_t *obj)
73 if (obj->type == R_OBJECT_ARRAY) {
74 rarray_t *array = (rarray_t*)obj;
75 if ((size = r_array_length(array)) > 0) {
77 * set the size to 0, to prevent circular references to come back here
79 r_array_setlength(array, 0);
80 for (i = 0; i < size; i++) {
81 r = (rvmreg_t*) r_array_slot(array, i);
82 if (rvm_reg_tstflag(r, RVM_INFOBIT_ROBJECT)) {
83 robject_t *p = RVM_REG_GETP(r);
84 if (!r_list_empty(&p->lnk)) {
86 * if this entry is robject_t that is on GC
87 * list, it can be RVM_REG_CLEARed. It will be
88 * cleaned up by the GC.
90 rvm_reg_array_unref_gcdata(p);
99 r_array_setlength(array, size);
101 } else if (obj->type == R_OBJECT_CARRAY || obj->type == R_OBJECT_HARRAY) {
102 rcarray_t *array = (rcarray_t*)obj;
103 if (obj->type == R_OBJECT_HARRAY)
104 array = ((rharray_t*)obj)->members;
105 if ((size = r_carray_length(array)) > 0) {
107 * set the size to 0, to prevent circular references to come back here
109 array->alloc_size = 0;
110 for (i = 0; i < size; i++) {
111 r = (rvmreg_t*) r_carray_slot(array, i);
112 if (rvm_reg_tstflag(r, RVM_INFOBIT_ROBJECT)) {
113 robject_t *p = RVM_REG_GETP(r);
114 if (!r_list_empty(&p->lnk)) {
116 * if this entry is robject_t that is on GC
117 * list, it can be RVM_REG_CLEARed. It will be
118 * cleaned up by the GC.
120 rvm_reg_array_unref_gcdata(p);
129 array->alloc_size = size;
136 rarray_t *r_array_create_rvmreg()
138 rarray_t *array = r_array_create(sizeof(rvmreg_t));
140 array->oncopy = rvm_reg_array_oncopy;
141 array->oncleanup = rvm_reg_array_oncleanup;
147 rcarray_t *r_carray_create_rvmreg()
149 rcarray_t *array = r_carray_create(sizeof(rvmreg_t));
151 array->oncopy = rvm_reg_carray_oncopy;
152 array->oncleanup = rvm_reg_carray_oncleanup;
158 rharray_t *r_harray_create_rvmreg()
160 rharray_t *harray = r_harray_create(sizeof(rvmreg_t));
162 harray->members->oncopy = rvm_reg_carray_oncopy;
163 harray->members->oncleanup = rvm_reg_carray_oncleanup;
169 rvmreg_t rvm_reg_create_string_ansi(const rchar *s)
172 r_memset(&r, 0, sizeof(r));
173 RVM_REG_SETP(&r, r_string_create_from_ansistr(s));
174 RVM_REG_SETTYPE(&r, RVM_DTYPE_STRING);
175 RVM_REG_SETFLAG(&r, RVM_INFOBIT_ROBJECT);
180 rvmreg_t rvm_reg_create_string(const rstr_t *s)
183 r_memset(&r, 0, sizeof(r));
184 RVM_REG_SETP(&r, r_string_create_from_rstr(s));
185 RVM_REG_SETTYPE(&r, RVM_DTYPE_STRING);
186 RVM_REG_SETFLAG(&r, RVM_INFOBIT_ROBJECT);
191 rvmreg_t rvm_reg_create_array()
194 r_memset(&r, 0, sizeof(r));
195 rvm_reg_setarray(&r, (robject_t*)r_carray_create_rvmreg());
200 rvmreg_t rvm_reg_create_harray()
203 r_memset(&r, 0, sizeof(r));
204 rvm_reg_setharray(&r, (robject_t*)r_harray_create_rvmreg());
209 void rvm_reg_setstring(rvmreg_t *r, rstring_t *ptr)
211 RVM_REG_SETP(r, ptr);
212 RVM_REG_SETTYPE(r, RVM_DTYPE_STRING);
213 RVM_REG_SETFLAG(r, RVM_INFOBIT_ROBJECT);
217 void rvm_reg_setpair(rvmreg_t *r, ruint p1, ruint p2)
220 RVM_REG_SETPAIR(r, p1, p2);
221 RVM_REG_SETTYPE(r, RVM_DTYPE_PAIR);
222 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
226 void rvm_reg_setstrptr(rvmreg_t *r, rchar *s, ruint size)
228 RVM_REG_SETSTR(r, s, size);
229 RVM_REG_SETTYPE(r, RVM_DTYPE_STRPTR);
230 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
234 void rvm_reg_setarray(rvmreg_t *r, robject_t *ptr)
236 RVM_REG_SETP(r, ptr);
237 RVM_REG_SETTYPE(r, RVM_DTYPE_ARRAY);
238 RVM_REG_SETFLAG(r, RVM_INFOBIT_ROBJECT);
242 void rvm_reg_setjsobject(rvmreg_t *r, robject_t *ptr)
244 RVM_REG_SETP(r, ptr);
245 RVM_REG_SETTYPE(r, RVM_DTYPE_JSOBJECT);
246 RVM_REG_SETFLAG(r, RVM_INFOBIT_ROBJECT);
250 void rvm_reg_setharray(rvmreg_t *r, robject_t *ptr)
252 RVM_REG_SETP(r, ptr);
253 RVM_REG_SETTYPE(r, RVM_DTYPE_HARRAY);
254 RVM_REG_SETFLAG(r, RVM_INFOBIT_ROBJECT);
257 rvmreg_t rvm_reg_create_pair(ruint p1, ruint p2)
260 r_memset(&r, 0, sizeof(r));
261 rvm_reg_setpair(&r, p1, p2);
266 rvmreg_t rvm_reg_create_strptr(rchar *s, ruint size)
269 r_memset(&r, 0, sizeof(r));
270 rvm_reg_setstrptr(&r, s, size);
275 rvmreg_t rvm_reg_create_double(rdouble d)
278 r_memset(&r, 0, sizeof(r));
280 RVM_REG_SETTYPE(&r, RVM_DTYPE_DOUBLE);
285 rvmreg_t rvm_reg_create_long(rlong l)
288 r_memset(&r, 0, sizeof(r));
289 rvm_reg_setlong(&r, l);
294 void rvm_reg_cleanup(rvmreg_t *reg)
296 if (rvm_reg_tstflag(reg, RVM_INFOBIT_ROBJECT)) {
297 r_object_destroy((robject_t*)RVM_REG_GETP(reg));
303 void rvm_reg_init(rvmreg_t *reg)
309 rvmreg_t *rvm_reg_copy(rvmreg_t *dst, const rvmreg_t *src)
313 if (rvm_reg_tstflag(dst, RVM_INFOBIT_ROBJECT))
314 dst->v.p = r_object_v_copy(dst->v.p);
319 void rvm_reg_settype(rvmreg_t *r, ruint type)
321 RVM_REG_SETTYPE(r, type);
325 ruint rvm_reg_gettype(const rvmreg_t *r)
327 rulong type = RVM_REG_GETTYPE(r);
332 rboolean rvm_reg_tstflag(const rvmreg_t *r, ruint16 flag)
334 return RVM_REG_TSTFLAG(r, flag);
338 void rvm_reg_setflag(rvmreg_t *r, ruint16 flag)
340 RVM_REG_SETFLAG(r, flag);
344 void rvm_reg_clrflag(rvmreg_t *r, ruint16 flag)
346 RVM_REG_CLRFLAG(r, flag);
350 void rvm_reg_setundef(rvmreg_t *r)
353 RVM_REG_SETTYPE(r, RVM_DTYPE_UNDEF);
357 void rvm_reg_setunsigned(rvmreg_t *r, rword u)
360 RVM_REG_SETTYPE(r, RVM_DTYPE_UNSIGNED);
361 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
365 void rvm_reg_setlong(rvmreg_t *r, rlong l)
368 RVM_REG_SETTYPE(r, RVM_DTYPE_LONG);
369 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
373 void rvm_reg_setboolean(rvmreg_t *r, ruint b)
375 RVM_REG_SETU(r, b ? 1 : 0);
376 RVM_REG_SETTYPE(r, RVM_DTYPE_BOOLEAN);
377 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
381 void rvm_reg_setdouble(rvmreg_t *r, rdouble d)
384 RVM_REG_SETTYPE(r, RVM_DTYPE_DOUBLE);
385 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
389 void rvm_reg_setpointer(rvmreg_t *r, rpointer p)
392 RVM_REG_SETTYPE(r, RVM_DTYPE_POINTER);
393 RVM_REG_CLRFLAG(r, RVM_INFOBIT_ROBJECT);
397 int rvm_reg_str2num(rvmreg_t *dst, const rvmreg_t *src)
403 l = r_strtol(R_STRING2PTR(RVM_REG_GETP(src)), &lptr, 10);
407 rvm_reg_setlong(dst, l);
410 d = r_strtod(R_STRING2PTR(RVM_REG_GETP(src)), &dptr);
413 rvm_reg_setdouble(dst, d);
418 int rvm_reg_str2long(rvmreg_t *dst, const rvmreg_t *src)
423 d = r_strtod(R_STRING2PTR(RVM_REG_GETP(src)), &dptr);
426 rvm_reg_setlong(dst, (long)d);
431 int rvm_reg_str2double(rvmreg_t *dst, const rvmreg_t *src)
436 d = r_strtod(R_STRING2PTR(RVM_REG_GETP(src)), &dptr);
439 rvm_reg_setdouble(dst, d);
444 rint rvm_reg_int(const rvmreg_t *src)
447 return (int)RVM_REG_GETL(src);
451 rlong rvm_reg_long(const rvmreg_t *src)
454 return (rlong)RVM_REG_GETL(src);
458 ruchar rvm_reg_boolean(const rvmreg_t *src)
461 return (ruchar)(RVM_REG_GETL(src) ? 1 : 0);
465 rdouble rvm_reg_double(const rvmreg_t *src)
468 return (rdouble)RVM_REG_GETL(src);
472 rpointer rvm_reg_pointer(const rvmreg_t *src)
475 return (rpointer)RVM_REG_GETP(src);
479 rstring_t *rvm_reg_string(const rvmreg_t *src)
481 R_ASSERT(src && rvm_reg_gettype(src) == RVM_DTYPE_STRING);
482 return (rstring_t*)RVM_REG_GETP(src);
486 rjs_object_t *rvm_reg_jsobject(const rvmreg_t *src)
488 R_ASSERT(src && rvm_reg_gettype(src) == RVM_DTYPE_JSOBJECT);
489 return (rjs_object_t*)RVM_REG_GETP(src);