summaryrefslogtreecommitdiffhomepage
path: root/src/kernel.c
diff options
context:
space:
mode:
authorksss <[email protected]>2017-02-06 11:04:42 +0900
committerksss <[email protected]>2017-02-06 11:16:47 +0900
commitbd72dba8c05056693e42c74b35d90691221f0d0d (patch)
treec4f96f2a3aebcacda1a9e3cf2097b59cbf947c2f /src/kernel.c
parentf2b18a604c6e4db5875b689ba26b377ad720a3ab (diff)
downloadmruby-bd72dba8c05056693e42c74b35d90691221f0d0d.tar.gz
mruby-bd72dba8c05056693e42c74b35d90691221f0d0d.zip
Kernel#local_variables: Make result array unique
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c11
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