summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorMasaki Muranaka <[email protected]>2012-10-21 00:49:39 +0900
committerMasaki Muranaka <[email protected]>2012-10-21 00:49:39 +0900
commitd5c4439013084ea5dcd30fd44a3a3d045e2dce67 (patch)
treecda1a2c1a80ec1bab6a5a010345ba7952662bc40 /src/vm.c
parent89a18e4f22de80b836f9d6c3167d71b7078a31bb (diff)
downloadmruby-d5c4439013084ea5dcd30fd44a3a3d045e2dce67.tar.gz
mruby-d5c4439013084ea5dcd30fd44a3a3d045e2dce67.zip
Avoid memcpy() on copying structures.
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/vm.c b/src/vm.c
index a68d089cc..b580df5a5 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -38,6 +38,16 @@
#define STACK_INIT_SIZE 128
#define CALLINFO_INIT_SIZE 32
+static inline void
+stack_copy(mrb_value *dst, const mrb_value *src, size_t size)
+{
+ int i;
+
+ for (i = 0; i < size; i++) {
+ dst[i] = src[i];
+ }
+}
+
static void
stack_init(mrb_state *mrb)
{
@@ -170,7 +180,7 @@ cipop(mrb_state *mrb)
mrb_value *p = (mrb_value *)mrb_malloc(mrb, sizeof(mrb_value)*len);
e->cioff = -1;
- memcpy(p, e->stack, sizeof(mrb_value)*len);
+ stack_copy(p, e->stack, len);
e->stack = p;
}
@@ -296,10 +306,10 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr
mrb->stack[0] = self;
if (undef) {
mrb->stack[1] = mrb_symbol_value(undef);
- memcpy(mrb->stack+2, argv, sizeof(mrb_value)*(argc-1));
+ stack_copy(mrb->stack+2, argv, argc-1);
}
else if (argc > 0) {
- memcpy(mrb->stack+1, argv, sizeof(mrb_value)*argc);
+ stack_copy(mrb->stack+1, argv, argc);
}
mrb->stack[argc+1] = blk;
@@ -351,7 +361,7 @@ mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_v
stack_extend(mrb, ci->nregs, 0);
mrb->stack[0] = self;
if (argc > 0) {
- memcpy(mrb->stack+1, argv, sizeof(mrb_value)*argc);
+ stack_copy(mrb->stack+1, argv, argc);
}
mrb->stack[argc+1] = mrb_nil_value();
@@ -989,12 +999,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
regs[a] = mrb_ary_new_capa(mrb, m1+len+m2);
rest = mrb_ary_ptr(regs[a]);
- memcpy(rest->ptr, stack, sizeof(mrb_value)*m1);
+ stack_copy(rest->ptr, stack, m1);
if (len > 0) {
- memcpy(rest->ptr+m1, pp, sizeof(mrb_value)*len);
+ stack_copy(rest->ptr+m1, pp, len);
}
if (m2 > 0) {
- memcpy(rest->ptr+m1+len, stack+m1+1, sizeof(mrb_value)*m2);
+ stack_copy(rest->ptr+m1+len, stack+m1+1, m2);
}
rest->len = m1+len+m2;
}