summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/mruby.h6
-rw-r--r--mrbgems/mruby-array-ext/src/array.c2
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c1
-rw-r--r--mrbgems/mruby-compiler/mrbgem.rake2
-rw-r--r--mrbgems/mruby-eval/src/eval.c15
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c6
-rw-r--r--mrbgems/mruby-hash-ext/src/hash-ext.c6
-rw-r--r--mrbgems/mruby-io/src/file.c4
-rw-r--r--mrbgems/mruby-io/src/io.c2
-rw-r--r--mrbgems/mruby-metaprog/src/metaprog.c2
-rw-r--r--mrbgems/mruby-method/src/method.c8
-rw-r--r--mrbgems/mruby-print/src/print.c4
-rw-r--r--mrbgems/mruby-proc-ext/test/proc.c2
-rw-r--r--mrbgems/mruby-sprintf/src/sprintf.c2
-rw-r--r--mrbgems/mruby-string-ext/src/string.c6
-rw-r--r--mrbgems/mruby-struct/src/struct.c10
-rw-r--r--mrbgems/mruby-test/driver.c2
-rw-r--r--src/array.c13
-rw-r--r--src/class.c22
-rw-r--r--src/etc.c2
-rw-r--r--src/kernel.c6
-rw-r--r--src/mruby_core.rake4
-rw-r--r--src/proc.c27
-rw-r--r--src/vm.c3
24 files changed, 73 insertions, 84 deletions
diff --git a/include/mruby.h b/include/mruby.h
index 52bcd58bf..18dd311f7 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -889,7 +889,7 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass
* | `H` | {Hash} | {mrb_value} | when `!` follows, the value may be `nil` |
* | `s` | {String} | const char *, {mrb_int} | Receive two arguments; `s!` gives (`NULL`,`0`) for `nil` |
* | `z` | {String} | const char * | `NULL` terminated string; `z!` gives `NULL` for `nil` |
- * | `a` | {Array} | {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
+ * | `a` | {Array} | const {mrb_value} *, {mrb_int} | Receive two arguments; `a!` gives (`NULL`,`0`) for `nil` |
* | `f` | {Integer}/{Float} | {mrb_float} | |
* | `i` | {Integer}/{Float} | {mrb_int} | |
* | `b` | boolean | {mrb_bool} | |
@@ -897,7 +897,7 @@ MRB_API struct RClass* mrb_define_module_under_id(mrb_state *mrb, struct RClass
* | `d` | data | void *, {mrb_data_type} const | 2nd argument will be used to check data type so it won't be modified; when `!` follows, the value may be `nil` |
* | `I` | inline struct | void * | |
* | `&` | block | {mrb_value} | &! raises exception if no block given. |
- * | `*` | rest arguments | {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. |
+ * | `*` | rest arguments | const {mrb_value} *, {mrb_int} | Receive the rest of arguments as an array; `*!` avoid copy of the stack. |
* | <code>\|</code> | optional | | After this spec following specs would be optional. |
* | `?` | optional given | {mrb_bool} | `TRUE` if preceding argument is given. Used to check optional argument is given. |
* | `:` | keyword args | {mrb_kwargs} const | Get keyword arguments. @see mrb_kwargs |
@@ -991,7 +991,7 @@ MRB_API mrb_int mrb_get_argc(mrb_state *mrb);
*
* Correctly handles *splat arguments.
*/
-MRB_API mrb_value* mrb_get_argv(mrb_state *mrb);
+MRB_API const mrb_value *mrb_get_argv(mrb_state *mrb);
/**
* Retrieve the first and only argument from mrb_state.
diff --git a/mrbgems/mruby-array-ext/src/array.c b/mrbgems/mruby-array-ext/src/array.c
index 9d7f1b28a..f6695f6b6 100644
--- a/mrbgems/mruby-array-ext/src/array.c
+++ b/mrbgems/mruby-array-ext/src/array.c
@@ -97,7 +97,7 @@ static mrb_value
mrb_ary_values_at(mrb_state *mrb, mrb_value self)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
index 8fa4fa822..93a4941f4 100644
--- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
+++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
@@ -18,7 +18,6 @@
#include <mruby/dump.h>
#include <mruby/string.h>
#include <mruby/variable.h>
-#include <mruby/throw.h>
#include <stdlib.h>
#include <string.h>
diff --git a/mrbgems/mruby-compiler/mrbgem.rake b/mrbgems/mruby-compiler/mrbgem.rake
index b25bdaff7..90583e64f 100644
--- a/mrbgems/mruby-compiler/mrbgem.rake
+++ b/mrbgems/mruby-compiler/mrbgem.rake
@@ -5,7 +5,7 @@ MRuby::Gem::Specification.new 'mruby-compiler' do |spec|
lex_def = "#{dir}/core/lex.def"
core_objs = Dir.glob("#{dir}/core/*.c").map { |f|
- next nil if build.cxx_exception_enabled? and f =~ /(codegen).c$/
+ next nil if build.cxx_exception_enabled? and f =~ /(codegen|y\.tab)\.c$/
objfile(f.pathmap("#{build_dir}/core/%n"))
}.compact
diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c
index 34a438060..d9df8678f 100644
--- a/mrbgems/mruby-eval/src/eval.c
+++ b/mrbgems/mruby-eval/src/eval.c
@@ -6,6 +6,7 @@
#include <mruby/opcode.h>
#include <mruby/error.h>
+struct REnv *mrb_env_new(mrb_state *mrb, struct mrb_context *c, mrb_callinfo *ci, int nstacks, mrb_value *stack, struct RClass *tc);
mrb_value mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p);
mrb_value mrb_obj_instance_eval(mrb_state *mrb, mrb_value self);
@@ -20,7 +21,6 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
struct REnv *e;
mrb_callinfo *ci; /* callinfo of eval caller */
struct RClass *target_class = NULL;
- mrb_int bidx;
if (!mrb_nil_p(binding)) {
mrb_raise(mrb, E_ARGUMENT_ERROR, "Binding of eval must be nil.");
@@ -83,16 +83,7 @@ create_proc_from_string(mrb_state *mrb, const char *s, mrb_int len, mrb_value bi
e = ci->env;
}
else {
- e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV,
- (struct RClass*)target_class);
- e->mid = ci->mid;
- e->stack = ci[1].stackent;
- e->cxt = mrb->c;
- MRB_ENV_SET_LEN(e, ci->proc->body.irep->nlocals);
- bidx = ci->argc;
- if (ci->argc < 0) bidx = 2;
- else bidx += 1;
- MRB_ENV_SET_BIDX(e, bidx);
+ e = mrb_env_new(mrb, mrb->c, ci, ci->proc->body.irep->nlocals, ci[1].stackent, target_class);
ci->env = e;
}
proc->e.env = e;
@@ -149,7 +140,7 @@ static mrb_value
f_instance_eval(mrb_state *mrb, mrb_value self)
{
mrb_value b;
- mrb_int argc; mrb_value *argv;
+ mrb_int argc; const mrb_value *argv;
mrb_get_args(mrb, "*!&", &argv, &argc, &b);
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 00ee7c223..41fda9eed 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -255,7 +255,7 @@ fiber_switch(mrb_state *mrb, mrb_value self, mrb_int len, const mrb_value *a, mr
static mrb_value
fiber_resume(mrb_state *mrb, mrb_value self)
{
- mrb_value *a;
+ const mrb_value *a;
mrb_int len;
mrb_bool vmexec = FALSE;
@@ -315,7 +315,7 @@ static mrb_value
fiber_transfer(mrb_state *mrb, mrb_value self)
{
struct mrb_context *c = fiber_check(mrb, self);
- mrb_value* a;
+ const mrb_value* a;
mrb_int len;
fiber_check_cfunc(mrb, mrb->c);
@@ -374,7 +374,7 @@ mrb_fiber_yield(mrb_state *mrb, mrb_int len, const mrb_value *a)
static mrb_value
fiber_yield(mrb_state *mrb, mrb_value self)
{
- mrb_value *a;
+ const mrb_value *a;
mrb_int len;
mrb_get_args(mrb, "*!", &a, &len);
diff --git a/mrbgems/mruby-hash-ext/src/hash-ext.c b/mrbgems/mruby-hash-ext/src/hash-ext.c
index 75ebd412b..16e066c73 100644
--- a/mrbgems/mruby-hash-ext/src/hash-ext.c
+++ b/mrbgems/mruby-hash-ext/src/hash-ext.c
@@ -22,7 +22,8 @@
static mrb_value
hash_values_at(mrb_state *mrb, mrb_value hash)
{
- mrb_value *argv, result;
+ const mrb_value *argv;
+ mrb_value result;
mrb_int argc, i;
int ai;
@@ -49,7 +50,8 @@ hash_values_at(mrb_state *mrb, mrb_value hash)
static mrb_value
hash_slice(mrb_state *mrb, mrb_value hash)
{
- mrb_value *argv, result;
+ const mrb_value *argv;
+ mrb_value result;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-io/src/file.c b/mrbgems/mruby-io/src/file.c
index d272cab7d..ab325195c 100644
--- a/mrbgems/mruby-io/src/file.c
+++ b/mrbgems/mruby-io/src/file.c
@@ -115,7 +115,7 @@ mrb_file_s_umask(mrb_state *mrb, mrb_value klass)
static mrb_value
mrb_file_s_unlink(mrb_state *mrb, mrb_value obj)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_value pathv;
mrb_int argc, i;
char *path;
@@ -533,7 +533,7 @@ static mrb_value
mrb_file_s_chmod(mrb_state *mrb, mrb_value klass) {
mrb_int mode;
mrb_int argc, i;
- mrb_value *filenames;
+ const mrb_value *filenames;
int ai = mrb_gc_arena_save(mrb);
mrb_get_args(mrb, "i*", &mode, &filenames, &argc);
diff --git a/mrbgems/mruby-io/src/io.c b/mrbgems/mruby-io/src/io.c
index 0fa0f34b1..d4505e4f7 100644
--- a/mrbgems/mruby-io/src/io.c
+++ b/mrbgems/mruby-io/src/io.c
@@ -1154,7 +1154,7 @@ mrb_io_s_pipe(mrb_state *mrb, mrb_value klass)
static mrb_value
mrb_io_s_select(mrb_state *mrb, mrb_value klass)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
mrb_value read, read_io, write, except, timeout, list;
struct timeval *tp, timerec;
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c
index b421226f9..f9c01ea1c 100644
--- a/mrbgems/mruby-metaprog/src/metaprog.c
+++ b/mrbgems/mruby-metaprog/src/metaprog.c
@@ -642,7 +642,7 @@ static mrb_value
mrb_mod_remove_method(mrb_state *mrb, mrb_value mod)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
struct RClass *c = mrb_class_ptr(mod);
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-method/src/method.c b/mrbgems/mruby-method/src/method.c
index c6de6a7bd..0a2897847 100644
--- a/mrbgems/mruby-method/src/method.c
+++ b/mrbgems/mruby-method/src/method.c
@@ -109,7 +109,7 @@ method_eql(mrb_state *mrb, mrb_value self)
static mrb_value
mcall(mrb_state *mrb, mrb_value recv, mrb_value proc, mrb_value name, struct RClass *owner,
- mrb_int argc, mrb_value *argv, mrb_value block)
+ mrb_int argc, const mrb_value *argv, mrb_value block)
{
mrb_value ret;
mrb_sym orig_mid = mrb->c->ci->mid;
@@ -142,7 +142,8 @@ method_call(mrb_state *mrb, mrb_value self)
mrb_value recv = mrb_iv_get(mrb, self, MRB_SYM(_recv));
struct RClass *owner = mrb_class_ptr(mrb_iv_get(mrb, self, MRB_SYM(_owner)));
mrb_int argc;
- mrb_value *argv, block;
+ const mrb_value *argv;
+ mrb_value block;
mrb_get_args(mrb, "*&", &argv, &argc, &block);
return mcall(mrb, recv, proc, name, owner, argc, argv, block);
@@ -156,7 +157,8 @@ method_bcall(mrb_state *mrb, mrb_value self)
mrb_value recv = mrb_iv_get(mrb, self, MRB_SYM(_recv));
mrb_value owner = mrb_iv_get(mrb, self, MRB_SYM(_owner));
mrb_int argc;
- mrb_value *argv, block;
+ const mrb_value *argv;
+ mrb_value block;
mrb_get_args(mrb, "o*&", &recv, &argv, &argc, &block);
bind_check(mrb, recv, owner);
diff --git a/mrbgems/mruby-print/src/print.c b/mrbgems/mruby-print/src/print.c
index 6e91e1941..30b2930b5 100644
--- a/mrbgems/mruby-print/src/print.c
+++ b/mrbgems/mruby-print/src/print.c
@@ -53,7 +53,7 @@ static mrb_value
mrb_print(mrb_state *mrb, mrb_value self)
{
mrb_int argc, i;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
for (i=0; i<argc; i++) {
@@ -69,7 +69,7 @@ static mrb_value
mrb_puts(mrb_state *mrb, mrb_value self)
{
mrb_int argc, i;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
for (i=0; i<argc; i++) {
diff --git a/mrbgems/mruby-proc-ext/test/proc.c b/mrbgems/mruby-proc-ext/test/proc.c
index 7072fe2e9..0253f2b60 100644
--- a/mrbgems/mruby-proc-ext/test/proc.c
+++ b/mrbgems/mruby-proc-ext/test/proc.c
@@ -35,7 +35,7 @@ static mrb_value
cfunc_env_get(mrb_state *mrb, mrb_value self)
{
mrb_sym n;
- mrb_value *argv; mrb_int argc;
+ const mrb_value *argv; mrb_int argc;
mrb_method_t m;
struct RProc *p;
mrb_get_args(mrb, "na", &n, &argv, &argc);
diff --git a/mrbgems/mruby-sprintf/src/sprintf.c b/mrbgems/mruby-sprintf/src/sprintf.c
index 3ecf11afb..951b37059 100644
--- a/mrbgems/mruby-sprintf/src/sprintf.c
+++ b/mrbgems/mruby-sprintf/src/sprintf.c
@@ -517,7 +517,7 @@ static mrb_value
mrb_f_sprintf(mrb_state *mrb, mrb_value obj)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c
index 4b8f99597..09cbf7995 100644
--- a/mrbgems/mruby-string-ext/src/string.c
+++ b/mrbgems/mruby-string-ext/src/string.c
@@ -194,7 +194,8 @@ mrb_str_concat_m(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_str_start_with(mrb_state *mrb, mrb_value self)
{
- mrb_value *argv, sub;
+ const mrb_value *argv;
+ mrb_value sub;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
@@ -223,7 +224,8 @@ mrb_str_start_with(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_str_end_with(mrb_state *mrb, mrb_value self)
{
- mrb_value *argv, sub;
+ const mrb_value *argv;
+ mrb_value sub;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index 7c6f50090..c64a494a5 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -262,12 +262,12 @@ static mrb_value
mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
{
mrb_value name, rest;
- mrb_value *pargv;
+ const mrb_value *pargv;
mrb_int argcnt;
mrb_int i;
mrb_value b, st;
mrb_sym id;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
name = mrb_nil_value();
@@ -321,7 +321,7 @@ num_members(mrb_state *mrb, struct RClass *klass)
/*
*/
static mrb_value
-mrb_struct_initialize_withArg(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value self)
+mrb_struct_initialize_withArg(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value self)
{
struct RClass *klass = mrb_obj_class(mrb, self);
mrb_int i, n;
@@ -343,7 +343,7 @@ mrb_struct_initialize_withArg(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb
static mrb_value
mrb_struct_initialize(mrb_state *mrb, mrb_value self)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
mrb_get_args(mrb, "*!", &argv, &argc);
@@ -646,7 +646,7 @@ static mrb_value
mrb_struct_values_at(mrb_state *mrb, mrb_value self)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
diff --git a/mrbgems/mruby-test/driver.c b/mrbgems/mruby-test/driver.c
index f780e7e57..d26233683 100644
--- a/mrbgems/mruby-test/driver.c
+++ b/mrbgems/mruby-test/driver.c
@@ -50,7 +50,7 @@ eval_test(mrb_state *mrb)
static mrb_value
t_print(mrb_state *mrb, mrb_value self)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
mrb_int i;
diff --git a/src/array.c b/src/array.c
index c4bc554ef..8827cba9e 100644
--- a/src/array.c
+++ b/src/array.c
@@ -280,7 +280,7 @@ static mrb_value
mrb_ary_s_create(mrb_state *mrb, mrb_value klass)
{
mrb_value ary;
- mrb_value *vals;
+ const mrb_value *vals;
mrb_int len;
struct RArray *a;
@@ -340,7 +340,7 @@ mrb_ary_plus(mrb_state *mrb, mrb_value self)
{
struct RArray *a1 = mrb_ary_ptr(self);
struct RArray *a2;
- mrb_value *ptr;
+ const mrb_value *ptr;
mrb_int blen, len1;
mrb_get_args(mrb, "a", &ptr, &blen);
@@ -509,7 +509,7 @@ static mrb_value
mrb_ary_push_m(mrb_state *mrb, mrb_value self)
{
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int len, len2;
struct RArray *a;
@@ -615,7 +615,8 @@ static mrb_value
mrb_ary_unshift_m(mrb_state *mrb, mrb_value self)
{
struct RArray *a = mrb_ary_ptr(self);
- mrb_value *vals, *ptr;
+ const mrb_value *vals;
+ mrb_value *ptr;
mrb_int alen, len;
mrb_get_args(mrb, "*!", &vals, &alen);
@@ -832,7 +833,7 @@ aget_index(mrb_state *mrb, mrb_value index)
#endif
else {
mrb_int i, argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "i*!", &i, &argv, &argc);
return i;
@@ -947,7 +948,7 @@ mrb_ary_aset(mrb_state *mrb, mrb_value self)
ary_modify(mrb, mrb_ary_ptr(self));
if (mrb_get_argc(mrb) == 2) {
- mrb_value *vs = mrb_get_argv(mrb);
+ const mrb_value *vs = mrb_get_argv(mrb);
v1 = vs[0]; v2 = vs[1];
/* a[n..m] = v */
diff --git a/src/class.c b/src/class.c
index bbf64e8ea..f00d3c782 100644
--- a/src/class.c
+++ b/src/class.c
@@ -806,7 +806,7 @@ mrb_get_argc(mrb_state *mrb)
return argc;
}
-MRB_API mrb_value*
+MRB_API const mrb_value*
mrb_get_argv(mrb_state *mrb)
{
mrb_int argc = mrb->c->ci->argc;
@@ -856,7 +856,7 @@ void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
H: Hash [mrb_value] when ! follows, the value may be nil
s: String [const char*,mrb_int] Receive two arguments; s! gives (NULL,0) for nil
z: String [const char*] NUL terminated string; z! gives NULL for nil
- a: Array [mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil
+ a: Array [const mrb_value*,mrb_int] Receive two arguments; a! gives (NULL,0) for nil
c: Class/Module [strcut RClass*]
f: Integer/Float [mrb_float]
i: Integer/Float [mrb_int]
@@ -865,7 +865,7 @@ void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
d: data [void*,mrb_data_type const] 2nd argument will be used to check data type so it won't be modified; when ! follows, the value may be nil
I: inline struct [void*]
&: block [mrb_value] &! raises exception if no block given
- *: rest argument [mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack
+ *: rest argument [const mrb_value*,mrb_int] The rest of the arguments as an array; *! avoid copy of the stack
|: optional Following arguments are optional
?: optional given [mrb_bool] true if preceding argument (optional) is given
':': keyword args [mrb_kwargs const] Get keyword arguments
@@ -1083,10 +1083,10 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
{
mrb_value aa;
struct RArray *a;
- mrb_value **pb;
+ const mrb_value **pb;
mrb_int *pl;
- pb = va_arg(ap, mrb_value**);
+ pb = va_arg(ap, const mrb_value**);
pl = va_arg(ap, mrb_int*);
if (i < argc) {
aa = argv[i++];
@@ -1215,11 +1215,11 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
case '*':
{
- mrb_value **var;
+ const mrb_value **var;
mrb_int *pl;
mrb_bool nocopy = (altmode || !argv_on_stack) ? TRUE : FALSE;
- var = va_arg(ap, mrb_value**);
+ var = va_arg(ap, const mrb_value**);
pl = va_arg(ap, mrb_int*);
if (argc > i) {
*pl = argc-i;
@@ -1754,7 +1754,7 @@ static mrb_value
mod_attr_define(mrb_state *mrb, mrb_value mod, mrb_value (*accessor)(mrb_state *, mrb_value), mrb_sym (*access_name)(mrb_state *, mrb_sym))
{
struct RClass *c = mrb_class_ptr(mod);
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc, i;
int ai;
@@ -1843,7 +1843,7 @@ mrb_value
mrb_instance_new(mrb_state *mrb, mrb_value cv)
{
mrb_value obj, blk;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
mrb_sym init;
@@ -2248,7 +2248,7 @@ mrb_mod_undef(mrb_state *mrb, mrb_value mod)
{
struct RClass *c = mrb_class_ptr(mod);
mrb_int argc;
- mrb_value *argv;
+ const mrb_value *argv;
mrb_get_args(mrb, "*", &argv, &argc);
while (argc--) {
@@ -2468,7 +2468,7 @@ mrb_mod_dup(mrb_state *mrb, mrb_value self)
static mrb_value
mrb_mod_module_function(mrb_state *mrb, mrb_value mod)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc, i;
mrb_sym mid;
mrb_method_t m;
diff --git a/src/etc.c b/src/etc.c
index 96f95ad5f..cfab84014 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -123,7 +123,7 @@ mrb_obj_id(mrb_value obj)
return MakeID(mrb_symbol(obj));
case MRB_TT_INTEGER:
return MakeID(mrb_int_id(mrb_integer(obj)));
-#ifdef MRB_NO_FLOAT
+#ifndef MRB_NO_FLOAT
case MRB_TT_FLOAT:
return MakeID(mrb_float_id(mrb_float(obj)));
#endif
diff --git a/src/kernel.c b/src/kernel.c
index c34d0bb6e..e29c33874 100644
--- a/src/kernel.c
+++ b/src/kernel.c
@@ -219,7 +219,7 @@ mrb_obj_class_m(mrb_state *mrb, mrb_value self)
}
static mrb_value
-mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
+mrb_obj_extend(mrb_state *mrb, mrb_int argc, const mrb_value *argv, mrb_value obj)
{
mrb_int i;
@@ -264,7 +264,7 @@ mrb_obj_extend(mrb_state *mrb, mrb_int argc, mrb_value *argv, mrb_value obj)
static mrb_value
mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
{
- mrb_value *argv;
+ const mrb_value *argv;
mrb_int argc;
mrb_get_args(mrb, "*", &argv, &argc);
@@ -524,7 +524,7 @@ static mrb_value
mrb_obj_missing(mrb_state *mrb, mrb_value mod)
{
mrb_sym name;
- mrb_value *a;
+ const mrb_value *a;
mrb_int alen;
mrb_get_args(mrb, "n*!", &name, &a, &alen);
diff --git a/src/mruby_core.rake b/src/mruby_core.rake
index 73fddb220..0b9e94a20 100644
--- a/src/mruby_core.rake
+++ b/src/mruby_core.rake
@@ -4,12 +4,12 @@ MRuby.each_target do
current_build_dir = "#{build_dir}/#{relative_from_root}"
objs = Dir.glob("#{current_dir}/*.c").map { |f|
- next nil if cxx_exception_enabled? and f =~ /(error|vm).c$/
+ next nil if cxx_exception_enabled? and f =~ /(error|vm|gc)\.c$/
objfile(f.pathmap("#{current_build_dir}/%n"))
}.compact
if cxx_exception_enabled?
- objs += %w(vm error).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" }
+ objs += %w(vm error gc).map { |v| compile_as_cxx "#{current_dir}/#{v}.c", "#{current_build_dir}/#{v}.cxx" }
end
self.libmruby_objs << objs
diff --git a/src/proc.c b/src/proc.c
index b971b6520..732e94817 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -57,22 +57,21 @@ mrb_proc_new(mrb_state *mrb, const mrb_irep *irep)
return p;
}
-static struct REnv*
-env_new(mrb_state *mrb, mrb_int nlocals)
+struct REnv*
+mrb_env_new(mrb_state *mrb, struct mrb_context *c, mrb_callinfo *ci, int nstacks, mrb_value *stack, struct RClass *tc)
{
struct REnv *e;
- mrb_callinfo *ci = mrb->c->ci;
mrb_int bidx;
- e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, NULL);
- MRB_ENV_SET_LEN(e, nlocals);
+ e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, tc);
+ MRB_ENV_SET_LEN(e, nstacks);
bidx = ci->argc;
- if (ci->argc < 0) bidx = 2;
+ if (bidx < 0) bidx = 2;
else bidx += 1;
MRB_ENV_SET_BIDX(e, bidx);
e->mid = ci->mid;
- e->stack = mrb->c->stack;
- e->cxt = mrb->c;
+ e->stack = stack;
+ e->cxt = c;
return e;
}
@@ -90,12 +89,8 @@ closure_setup(mrb_state *mrb, struct RProc *p)
else if (up) {
struct RClass *tc = MRB_PROC_TARGET_CLASS(p);
- e = env_new(mrb, up->body.irep->nlocals);
+ e = mrb_env_new(mrb, mrb->c, ci, up->body.irep->nlocals, mrb->c->stack, tc);
ci->env = e;
- if (tc) {
- e->c = tc;
- mrb_field_write_barrier(mrb, (struct RBasic*)e, (struct RBasic*)tc);
- }
if (MRB_PROC_ENV_P(up) && MRB_PROC_ENV(up)->cxt == NULL) {
e->mid = MRB_PROC_ENV(up)->mid;
}
@@ -137,15 +132,11 @@ mrb_proc_new_cfunc_with_env(mrb_state *mrb, mrb_func_t func, mrb_int argc, const
struct REnv *e;
int i;
- p->e.env = e = env_new(mrb, argc);
+ p->e.env = e = mrb_env_new(mrb, mrb->c, mrb->c->ci, 0, NULL, NULL);
p->flags |= MRB_PROC_ENVSET;
mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)e);
MRB_ENV_CLOSE(e);
- /* NOTE: Prevents keeping invalid addresses when NoMemoryError is raised from `mrb_malloc()`. */
- e->stack = NULL;
- MRB_ENV_SET_LEN(e, 0);
-
e->stack = (mrb_value*)mrb_malloc(mrb, sizeof(mrb_value) * argc);
MRB_ENV_SET_LEN(e, argc);
diff --git a/src/vm.c b/src/vm.c
index d1f4660be..bcb78c0c9 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -552,7 +552,8 @@ mrb_value
mrb_f_send(mrb_state *mrb, mrb_value self)
{
mrb_sym name;
- mrb_value block, *argv, *regs;
+ mrb_value block, *regs;
+ const mrb_value *argv;
mrb_int argc, i, len;
mrb_method_t m;
struct RClass *c;