16 #define RSTRUCT_ARY(st) mrb_ary_ptr(st)
17 #define RSTRUCT_LEN(st) RSTRUCT_ARY(st)->len
18 #define RSTRUCT_PTR(st) RSTRUCT_ARY(st)->ptr
30 struct RClass* sclass = struct_class(mrb);
37 if (kclass == 0 || kclass == sclass)
38 return mrb_nil_value();
39 c = mrb_obj_value(kclass);
70 "struct size differs (%S required %S given)",
109 return mrb_struct_s_members_m(mrb, mrb_obj_value(
mrb_obj_class(mrb, obj)));
115 mrb_value members, slot, *ptr, *ptr_members;
121 slot = mrb_symbol_value(
id);
123 for (i=0; i<len; i++) {
129 return mrb_nil_value();
149 #define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
150 #define N_REF_FUNC numberof(ref_func)
175 memcpy(buf, name, len);
190 mrb_value members, slot, *ptr, *ptr_members;
200 for (i=0; i<len; i++) {
201 slot = ptr_members[
i];
208 return mrb_nil_value();
217 return mrb_struct_set(mrb, obj, val);
220 #define is_notop_id(id) (id)//((id)>tLAST_TOKEN)
221 #define is_local_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_LOCAL)
228 #define is_const_id(id) (is_notop_id(id))//&&((id)&ID_SCOPE_MASK)==ID_CONST)
251 mrb_name_error(mrb,
id,
"identifier %S needs to be constant", name);
254 mrb_warn(mrb,
"redefining constant Struct::%S", name);
260 nstr = mrb_obj_value(c);
269 for (i=0; i< len; i++) {
291 if (!name) nm = mrb_nil_value();
296 while ((mem = va_arg(ar,
char*)) != 0) {
297 mrb_sym slot = mrb_intern(mrb, mem);
302 return make_struct(mrb, nm, ary, struct_class(mrb));
351 name = mrb_nil_value();
352 rest = mrb_nil_value();
358 if (argc > 0) name = argv[0];
359 if (argc > 1) rest = argv[1];
364 name = mrb_nil_value();
372 name = mrb_nil_value();
383 st = make_struct(mrb, name, rest, struct_class(mrb));
396 members = struct_ivar_get(mrb, mrb_obj_value(klass),
mrb_intern2(mrb,
"__members__", 11));
412 n = num_members(mrb, klass);
417 for (i = 0; i < argc; i++) {
420 for (i = argc; i < n; i++) {
433 return mrb_struct_initialize_withArg(mrb, argc, argv,
self);
454 return mrb_str_cat2(mrb, str,
":...>");
461 for (i=0; i<len; i++) {
466 mrb_str_cat2(mrb, str,
", ");
469 mrb_str_cat2(mrb, str,
" ");
471 slot = ptr_members[
i];
483 mrb_str_cat2(mrb, str,
"=");
486 mrb_str_cat2(mrb, str,
">");
501 return inspect_struct(mrb, s, 0);
525 for (i = 0; i < len; i++) {
541 for (i=0; i<len; i++) {
547 return mrb_nil_value();
583 return mrb_struct_aref_id(mrb, s,
mrb_symbol(idx));
590 "offset %S too small for struct(size:%S)",
591 mrb_fixnum_value(i), mrb_fixnum_value(
RSTRUCT_LEN(s)));
594 "offset %S too large for struct(size:%S)",
595 mrb_fixnum_value(i), mrb_fixnum_value(
RSTRUCT_LEN(s)));
618 "struct size differs (%S required %S given)",
619 mrb_fixnum_value(len), mrb_fixnum_value(
RSTRUCT_LEN(s)));
623 for (i=0; i<len; i++) {
672 "offset %S too small for struct(size:%S)",
673 mrb_fixnum_value(i), mrb_fixnum_value(
RSTRUCT_LEN(s)));
677 "offset %S too large for struct(size:%S)",
678 mrb_fixnum_value(i), mrb_fixnum_value(
RSTRUCT_LEN(s)));
718 mrb_bug(mrb,
"inconsistent struct");
726 for (i=0; i<len; i++) {
734 return mrb_bool_value(equal_p);
762 mrb_bug(mrb,
"inconsistent struct");
770 for (i=0; i<len; i++) {
771 if (!
mrb_eql(mrb, ptr[i], ptr2[i])) {
778 return mrb_bool_value(eql_p);