summaryrefslogtreecommitdiffhomepage
path: root/src/variable.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/variable.c')
-rw-r--r--src/variable.c127
1 files changed, 57 insertions, 70 deletions
diff --git a/src/variable.c b/src/variable.c
index 048b63bca..90f0831da 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -4,14 +4,12 @@
** See Copyright Notice in mruby.h
*/
+#include <ctype.h>
#include "mruby.h"
#include "mruby/array.h"
#include "mruby/class.h"
#include "mruby/proc.h"
#include "mruby/string.h"
-#include "mruby/variable.h"
-#include "error.h"
-#include <ctype.h>
typedef int (iv_foreach_func)(mrb_state*,mrb_sym,mrb_value,void*);
@@ -48,11 +46,10 @@ iv_new(mrb_state *mrb)
iv_tbl *t;
t = mrb_malloc(mrb, sizeof(iv_tbl));
- if (t) {
- t->size = 0;
- t->rootseg = NULL;
- t->last_len = 0;
- }
+ t->size = 0;
+ t->rootseg = NULL;
+ t->last_len = 0;
+
return t;
}
@@ -118,7 +115,6 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
else {
t->rootseg = seg;
}
- return;
}
/*
@@ -293,8 +289,8 @@ iv_free(mrb_state *mrb, iv_tbl *t)
#define MRB_IVHASH_INIT_SIZE 8
#endif
-KHASH_DECLARE(iv, mrb_sym, mrb_value, 1)
-KHASH_DEFINE(iv, mrb_sym, mrb_value, 1, kh_int_hash_func, kh_int_hash_equal)
+KHASH_DECLARE(iv, mrb_sym, mrb_value, TRUE)
+KHASH_DEFINE(iv, mrb_sym, mrb_value, TRUE, kh_int_hash_func, kh_int_hash_equal)
typedef struct iv_tbl {
khash_t(iv) h;
@@ -312,7 +308,7 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
khash_t(iv) *h = &t->h;
khiter_t k;
- k = kh_put(iv, h, sym);
+ k = kh_put(iv, mrb, h, sym);
kh_value(h, k) = val;
}
@@ -322,7 +318,7 @@ iv_get(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
khash_t(iv) *h = &t->h;
khiter_t k;
- k = kh_get(iv, h, sym);
+ k = kh_get(iv, mrb, h, sym);
if (k != kh_end(h)) {
if (vp) *vp = kh_value(h, k);
return TRUE;
@@ -337,10 +333,10 @@ iv_del(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value *vp)
khiter_t k;
if (h) {
- k = kh_get(iv, h, sym);
+ k = kh_get(iv, mrb, h, sym);
if (k != kh_end(h)) {
mrb_value val = kh_value(h, k);
- kh_del(iv, h, k);
+ kh_del(iv, mrb, h, k);
if (vp) *vp = val;
return TRUE;
}
@@ -361,7 +357,7 @@ iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
n = (*func)(mrb, kh_key(h, k), kh_value(h, k), p);
if (n > 0) return FALSE;
if (n < 0) {
- kh_del(iv, h, k);
+ kh_del(iv, mrb, h, k);
}
}
}
@@ -372,10 +368,12 @@ iv_foreach(mrb_state *mrb, iv_tbl *t, iv_foreach_func *func, void *p)
static size_t
iv_size(mrb_state *mrb, iv_tbl *t)
{
- khash_t(iv) *h = &t->h;
+ khash_t(iv) *h;
- if (!h) return 0;
- return kh_size(h);
+ if (t && (h = &t->h)) {
+ return kh_size(h);
+ }
+ return 0;
}
static iv_tbl*
@@ -387,7 +385,7 @@ iv_copy(mrb_state *mrb, iv_tbl *t)
static void
iv_free(mrb_state *mrb, iv_tbl *t)
{
- kh_destroy(iv, &t->h);
+ kh_destroy(iv, mrb, &t->h);
}
#endif
@@ -563,20 +561,28 @@ inspect_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
{
mrb_value str = *(mrb_value*)p;
const char *s;
- size_t len;
+ mrb_int len;
+ mrb_value ins;
+ char *sp = RSTRING_PTR(str);
/* need not to show internal data */
- if (RSTRING_PTR(str)[0] == '-') { /* first element */
- RSTRING_PTR(str)[0] = '#';
- mrb_str_cat(mrb, str, " ", 1);
+ if (sp[0] == '-') { /* first element */
+ sp[0] = '#';
+ mrb_str_cat_lit(mrb, str, " ");
}
else {
- mrb_str_cat(mrb, str, ", ", 2);
+ mrb_str_cat_lit(mrb, str, ", ");
}
s = mrb_sym2name_len(mrb, sym, &len);
mrb_str_cat(mrb, str, s, len);
- mrb_str_cat(mrb, str, "=", 1);
- mrb_str_append(mrb, str, mrb_inspect(mrb, v));
+ mrb_str_cat_lit(mrb, str, "=");
+ if (mrb_type(v) == MRB_TT_OBJECT) {
+ ins = mrb_any_to_s(mrb, v);
+ }
+ else {
+ ins = mrb_inspect(mrb, v);
+ }
+ mrb_str_append(mrb, str, ins);
return 0;
}
@@ -590,13 +596,13 @@ mrb_obj_iv_inspect(mrb_state *mrb, struct RObject *obj)
const char *cn = mrb_obj_classname(mrb, mrb_obj_value(obj));
mrb_value str = mrb_str_buf_new(mrb, 30);
- mrb_str_buf_cat(mrb, str, "-<", 2);
- mrb_str_cat2(mrb, str, cn);
- mrb_str_cat(mrb, str, ":", 1);
+ mrb_str_cat_lit(mrb, str, "-<");
+ mrb_str_cat_cstr(mrb, str, cn);
+ mrb_str_cat_lit(mrb, str, ":");
mrb_str_concat(mrb, str, mrb_ptr_to_str(mrb, obj));
iv_foreach(mrb, t, inspect_i, &str);
- mrb_str_cat(mrb, str, ">", 1);
+ mrb_str_cat_lit(mrb, str, ">");
return str;
}
return mrb_any_to_s(mrb, mrb_obj_value(obj));
@@ -635,7 +641,7 @@ iv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
{
mrb_value ary;
const char* s;
- size_t len;
+ mrb_int len;
ary = *(mrb_value*)p;
s = mrb_sym2name_len(mrb, sym, &len);
@@ -679,7 +685,7 @@ cv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
{
mrb_value ary;
const char* s;
- size_t len;
+ mrb_int len;
ary = *(mrb_value*)p;
s = mrb_sym2name_len(mrb, sym, &len);
@@ -750,7 +756,7 @@ mrb_cv_get(mrb_state *mrb, mrb_value mod, mrb_sym sym)
}
void
-mrb_mod_cv_set(mrb_state *mrb, struct RClass * c, mrb_sym sym, mrb_value v)
+mrb_mod_cv_set(mrb_state *mrb, struct RClass *c, mrb_sym sym, mrb_value v)
{
struct RClass * cls = c;
@@ -817,24 +823,7 @@ mrb_vm_cv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
struct RClass *c = mrb->c->ci->proc->target_class;
if (!c) c = mrb->c->ci->target_class;
- while (c) {
- if (c->iv) {
- iv_tbl *t = c->iv;
-
- if (iv_get(mrb, t, sym, NULL)) {
- mrb_write_barrier(mrb, (struct RBasic*)c);
- iv_put(mrb, t, sym, v);
- return;
- }
- }
- c = c->super;
- }
- c = mrb->c->ci->target_class;
- if (!c->iv) {
- c->iv = iv_new(mrb);
- }
- mrb_write_barrier(mrb, (struct RBasic*)c);
- iv_put(mrb, c->iv, sym, v);
+ mrb_mod_cv_set(mrb, c, sym, v);
}
mrb_bool
@@ -868,7 +857,7 @@ const_get(mrb_state *mrb, struct RClass *base, mrb_sym sym)
mrb_value v;
iv_tbl *t;
mrb_bool retry = 0;
- mrb_sym cm;
+ mrb_value name;
L_RETRY:
while (c) {
@@ -884,19 +873,8 @@ L_RETRY:
retry = 1;
goto L_RETRY;
}
- c = base;
- cm = mrb_intern2(mrb, "const_missing", 13);
- while (c) {
- if (mrb_respond_to(mrb, mrb_obj_value(c), cm)) {
- mrb_value name = mrb_symbol_value(sym);
- return mrb_funcall_argv(mrb, mrb_obj_value(c), cm, 1, &name);
- }
- c = c->super;
- }
- mrb_name_error(mrb, sym, "uninitialized constant %S",
- mrb_sym2str(mrb, sym));
- /* not reached */
- return mrb_nil_value();
+ name = mrb_symbol_value(sym);
+ return mrb_funcall_argv(mrb, mrb_obj_value(base), mrb_intern_lit(mrb, "const_missing"), 1, &name);
}
mrb_value
@@ -971,11 +949,11 @@ const_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
{
mrb_value ary;
const char* s;
- size_t len;
+ mrb_int len;
ary = *(mrb_value*)p;
s = mrb_sym2name_len(mrb, sym, &len);
- if (len > 1 && ISUPPER(s[0])) {
+ if (len >= 1 && ISUPPER(s[0])) {
mrb_ary_push(mrb, ary, mrb_symbol_value(sym));
}
return 0;
@@ -1032,6 +1010,15 @@ mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value v)
iv_put(mrb, t, sym, v);
}
+void
+mrb_gv_remove(mrb_state *mrb, mrb_sym sym)
+{
+ if (!mrb->globals) {
+ return;
+ }
+ iv_del(mrb, mrb->globals, sym, NULL);
+}
+
static int
gv_i(mrb_state *mrb, mrb_sym sym, mrb_value v, void *p)
{
@@ -1067,7 +1054,7 @@ mrb_f_global_variables(mrb_state *mrb, mrb_value self)
buf[2] = 0;
for (i = 1; i <= 9; ++i) {
buf[1] = (char)(i + '0');
- mrb_ary_push(mrb, ary, mrb_symbol_value(mrb_intern2(mrb, buf, 2)));
+ mrb_ary_push(mrb, ary, mrb_symbol_value(mrb_intern(mrb, buf, 2)));
}
return ary;
}
@@ -1130,7 +1117,7 @@ mrb_class_sym(mrb_state *mrb, struct RClass *c, struct RClass *outer)
{
mrb_value name;
- name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern2(mrb, "__classid__", 11));
+ name = mrb_obj_iv_get(mrb, (struct RObject*)c, mrb_intern_lit(mrb, "__classid__"));
if (mrb_nil_p(name)) {
if (!outer) return 0;