diff options
| author | ksss <[email protected]> | 2017-02-06 11:04:42 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2017-02-06 11:16:47 +0900 |
| commit | bd72dba8c05056693e42c74b35d90691221f0d0d (patch) | |
| tree | c4f96f2a3aebcacda1a9e3cf2097b59cbf947c2f /src/kernel.c | |
| parent | f2b18a604c6e4db5875b689ba26b377ad720a3ab (diff) | |
| download | mruby-bd72dba8c05056693e42c74b35d90691221f0d0d.tar.gz mruby-bd72dba8c05056693e42c74b35d90691221f0d0d.zip | |
Kernel#local_variables: Make result array unique
Diffstat (limited to 'src/kernel.c')
| -rw-r--r-- | src/kernel.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/kernel.c b/src/kernel.c index 5ca1736c3..8b00d701b 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -6,6 +6,7 @@ #include <mruby.h> #include <mruby/array.h> +#include <mruby/hash.h> #include <mruby/class.h> #include <mruby/proc.h> #include <mruby/string.h> @@ -1106,8 +1107,8 @@ mrb_obj_ceqq(mrb_state *mrb, mrb_value self) static mrb_value mrb_local_variables(mrb_state *mrb, mrb_value self) { - mrb_value ret; struct RProc *proc; + mrb_value vars; struct mrb_irep *irep; size_t i; @@ -1121,10 +1122,10 @@ mrb_local_variables(mrb_state *mrb, mrb_value self) if (!irep->lv) { return mrb_ary_new(mrb); } - ret = mrb_ary_new_capa(mrb, irep->nlocals - 1); + vars = mrb_hash_new(mrb); for (i = 0; i + 1 < irep->nlocals; ++i) { if (irep->lv[i].name) { - mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name)); + mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value()); } } if (proc->env) { @@ -1137,7 +1138,7 @@ mrb_local_variables(mrb_state *mrb, mrb_value self) if (irep->lv) { for (i = 0; i + 1 < irep->nlocals; ++i) { if (irep->lv[i].name) { - mrb_ary_push(mrb, ret, mrb_symbol_value(irep->lv[i].name)); + mrb_hash_set(mrb, vars, mrb_symbol_value(irep->lv[i].name), mrb_true_value()); } } } @@ -1146,7 +1147,7 @@ mrb_local_variables(mrb_state *mrb, mrb_value self) } } - return ret; + return mrb_hash_keys(mrb, vars); } void |
