Groonga 3.0.9 Source Code Document
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
etc.c
Go to the documentation of this file.
1 /*
2 ** etc.c -
3 **
4 ** See Copyright Notice in mruby.h
5 */
6 
7 #include "mruby.h"
8 #include "mruby/string.h"
9 #include "error.h"
10 #include "mruby/numeric.h"
11 #include "mruby/data.h"
12 #include "mruby/class.h"
13 
14 struct RData*
15 mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
16 {
17  struct RData *data;
18 
19  data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
20  data->data = ptr;
21  data->type = (mrb_data_type*) type;
22 
23  return data;
24 }
25 
26 void
28 {
29  if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
30  mrb_check_type(mrb, obj, MRB_TT_DATA);
31  }
32  if (DATA_TYPE(obj) != type) {
33  const mrb_data_type *t2 = DATA_TYPE(obj);
34 
35  if (t2) {
36  mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)",
38  }
39  else {
40  struct RClass *c = mrb_class(mrb, obj);
41 
42  mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)",
43  mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name));
44  }
45  }
46 }
47 
48 void *
50 {
51  if (mrb_special_const_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) {
52  return NULL;
53  }
54  if (DATA_TYPE(obj) != type) {
55  return NULL;
56  }
57  return DATA_PTR(obj);
58 }
59 
60 void *
62 {
63  mrb_data_check_type(mrb, obj, type);
64  return DATA_PTR(obj);
65 }
66 
69 {
70  mrb_value *argv;
71  int argc;
72 
73  mrb_get_args(mrb, "*", &argv, &argc);
74  if (argc < 1) {
75  return mrb_nil_value();
76  }
77  else
78  {
79  return argv[0];
80  }
81 }
82 
83 /* ------------------------------------------------ */
84 /*
85  * Calls func(obj, arg, recursive), where recursive is non-zero if the
86  * current method is called recursively on obj
87  */
88 
90 mrb_exec_recursive(mrb_state *mrb, mrb_value (*func) (mrb_state *, mrb_value, mrb_value, int), mrb_value obj, void *arg)
91 {
92  return func(mrb, obj, *(mrb_value*)arg, 0);
93 }
94 
95 mrb_sym
97 {
98  mrb_value tmp;
99  mrb_sym id;
100 
101  switch (mrb_type(name)) {
102  default:
103  tmp = mrb_check_string_type(mrb, name);
104  if (mrb_nil_p(tmp)) {
105  tmp = mrb_inspect(mrb, name);
106  mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp);
107  }
108  name = tmp;
109  /* fall through */
110  case MRB_TT_STRING:
111  name = mrb_str_intern(mrb, name);
112  /* fall through */
113  case MRB_TT_SYMBOL:
114  return mrb_symbol(name);
115  }
116  return id;
117 }
118 
119 /*
120  * call-seq:
121  * proc { |...| block } -> a_proc
122  *
123  * Equivalent to <code>Proc.new</code>.
124  */
125 
126 mrb_value
128 {
129  return mrb_nil_value();
130 }
131 
132 static mrb_int
133 float_id(mrb_float f)
134 {
135  const char *p = (const char*)&f;
136  int len = sizeof(f);
137  mrb_int id = 0;
138 
139  while (len--) {
140  id = id*65599 + *p;
141  p++;
142  }
143  id = id + (id>>5);
144 
145  return id;
146 }
147 
148 mrb_int
150 {
151  mrb_int tt = mrb_type(obj);
152 
153 #define MakeID2(p,t) (((intptr_t)(p))^(t))
154 #define MakeID(p) MakeID2(p,tt)
155 
156  switch (tt) {
157  case MRB_TT_FREE:
158  case MRB_TT_UNDEF:
159  return MakeID(0); /* not define */
160  case MRB_TT_FALSE:
161  if (mrb_nil_p(obj))
162  return MakeID(1);
163  return MakeID(0);
164  case MRB_TT_TRUE:
165  return MakeID(1);
166  case MRB_TT_SYMBOL:
167  return MakeID(mrb_symbol(obj));
168  case MRB_TT_FIXNUM:
169  return MakeID2(float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
170  case MRB_TT_FLOAT:
171  return MakeID(float_id(mrb_float(obj)));
172  case MRB_TT_STRING:
173  case MRB_TT_OBJECT:
174  case MRB_TT_CLASS:
175  case MRB_TT_MODULE:
176  case MRB_TT_ICLASS:
177  case MRB_TT_SCLASS:
178  case MRB_TT_PROC:
179  case MRB_TT_ARRAY:
180  case MRB_TT_HASH:
181  case MRB_TT_RANGE:
182  case MRB_TT_EXCEPTION:
183  case MRB_TT_FILE:
184  case MRB_TT_DATA:
185  default:
186  return MakeID(mrb_ptr(obj));
187  }
188 }
189 
190 #ifdef MRB_WORD_BOXING
191 mrb_value
192 mrb_float_value(mrb_state *mrb, mrb_float f)
193 {
194  mrb_value v;
195 
196  v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
197  v.value.fp->f = f;
198  return v;
199 }
200 
201 mrb_value
202 mrb_cptr_value(mrb_state *mrb, void *p)
203 {
204  mrb_value v;
205 
206  v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
207  v.value.vp->p = p;
208  return v;
209 }
210 #endif /* MRB_WORD_BOXING */
211