summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-17 08:16:13 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-02-17 08:16:13 +0000
commit0f4767392afba3ca33935f6ef269d19681f07d3d (patch)
tree8395feb8e126fe221f8017e4336141ca275786e2
parent180ed5ffae18a885820497867ffc241b16ccea7d (diff)
downloadruby-0f4767392afba3ca33935f6ef269d19681f07d3d.tar.gz
* merged from trunk r26678:26697.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/mvm@26698 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--.merged-trunk-revision2
-rw-r--r--ChangeLog53
-rw-r--r--KNOWNBUGS.rb11
-rw-r--r--common.mk2
-rw-r--r--configure.in2
-rw-r--r--ext/dl/cfunc.c35
-rw-r--r--ext/dl/closure.c4
-rw-r--r--ext/dl/cptr.c4
-rw-r--r--ext/dl/depend6
-rw-r--r--ext/dl/dl_conversions.c50
-rw-r--r--ext/dl/method.c2
-rw-r--r--file.c16
-rw-r--r--gc.c84
-rw-r--r--hash.c11
-rw-r--r--test/dl/test_base.rb6
-rw-r--r--test/dl/test_handle.rb20
-rw-r--r--test/dl/test_import.rb2
-rw-r--r--test/dl/test_method.rb2
-rw-r--r--vm.c2
-rw-r--r--vm_eval.c6
-rw-r--r--vm_insnhelper.c1
21 files changed, 224 insertions, 97 deletions
diff --git a/.merged-trunk-revision b/.merged-trunk-revision
index 935f7281b6..b15816706f 100644
--- a/.merged-trunk-revision
+++ b/.merged-trunk-revision
@@ -1 +1 @@
-26678
+26697
diff --git a/ChangeLog b/ChangeLog
index 11e57ed330..dae6a4e185 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,56 @@
+Wed Feb 17 17:05:39 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_cfunc): removed unused variable.
+
+ * vm.c (vm_frametype_name): define only when VMDEBUG.
+
+Wed Feb 17 15:34:45 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/dl/dl_conversions.c (rb_dl_type_to_ffi_type): support signed
+ long long.
+
+ * ext/dl/cfunc.c (rb_dlcfunc_inspect): get rid of overflow.
+
+ * ext/dl/closure.c (dlc_callback, rb_dlclosure_init): ditto.
+
+ * ext/dl/cptr.c (rb_dlptr_s_malloc): ditto.
+
+ * ext/dl/method.c (rb_dlfunction_initialize): ditto.
+
+Wed Feb 17 01:16:12 2010 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * hash.c (hash_update): always raise an exception when adding a new
+ key during iteration. Traditionally, an exception was raised only
+ when rehash occurs, but it may lead to difficult bug to reproduce.
+ [ruby-core:23614]
+
+Tue Feb 16 22:09:27 2010 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * gc.c (chain_finalized_object): fix precedence.
+
+Tue Feb 16 21:32:01 2010 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * gc.c (rb_objspace_call_finalizer): always run finalizer at exit,
+ before object is free'd. [ruby-dev:40382]
+
+Tue Feb 16 20:56:39 2010 Tanaka Akira <akr@fsij.org>
+
+ * file.c (rb_group_member): renamed from group_member.
+ don't use group_member() in glibc because it's not valgrind clean.
+ http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=570047
+
+Tue Feb 16 19:19:21 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/dl/cfunc.c (rb_dlcfunc_call): convert signed value to
+ unsigned.
+
+Tue Feb 16 19:02:59 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/dl/test_{base,handle}.rb: use more verbose assertions.
+
+ * test/dl/test_import.rb (DL::LIBC::BoundQsortCallback): renamed
+ to get rid of overwriting warning.
+
Tue Feb 16 11:03:19 2010 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/dl/method.c: Adding DL::Method as a superclass for DL::Function
diff --git a/KNOWNBUGS.rb b/KNOWNBUGS.rb
index b97a08d928..a1b426a6d4 100644
--- a/KNOWNBUGS.rb
+++ b/KNOWNBUGS.rb
@@ -3,3 +3,14 @@
# So all tests will cause failure.
#
+assert_finish 1, %q{
+ open("tst-remove-load.rb", "w") {|f|
+ f << <<'End'
+module Kernel
+ remove_method :load
+end
+raise
+End
+ }
+ load "tst-remove-load.rb"
+}, '[ruby-dev:40234] [ruby-core:27959]'
diff --git a/common.mk b/common.mk
index b3ee071903..1fe5260ade 100644
--- a/common.mk
+++ b/common.mk
@@ -703,7 +703,7 @@ INSNS2VMOPT = --srcdir="$(srcdir)"
srcs: {$(VPATH)}parse.c {$(VPATH)}lex.c {$(VPATH)}newline.c srcs-ext srcs-enc
-EXT_SRCS = $(srcdir)/ext/ripper/ripper.c $(srcdir)/ext/dl/callback/callback.c
+EXT_SRCS = $(srcdir)/ext/ripper/ripper.c
srcs-ext: $(EXT_SRCS)
diff --git a/configure.in b/configure.in
index 9cfe675a0b..90a56902f4 100644
--- a/configure.in
+++ b/configure.in
@@ -1114,7 +1114,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot getcwd eacce
setitimer setruid seteuid setreuid setresuid setproctitle socketpair\
setrgid setegid setregid setresgid issetugid pause lchown lchmod\
getpgrp setpgrp getpgid setpgid initgroups getgroups setgroups\
- getpriority getrlimit setrlimit sysconf group_member\
+ getpriority getrlimit setrlimit sysconf \
dlopen sigprocmask sigaction sigsetjmp _setjmp _longjmp snprintf\
setsid telldir seekdir fchmod cosh sinh tanh log2 round signbit\
setuid setgid daemon select_large_fdset setenv unsetenv\
diff --git a/ext/dl/cfunc.c b/ext/dl/cfunc.c
index 4d10c82ff2..21afcc5677 100644
--- a/ext/dl/cfunc.c
+++ b/ext/dl/cfunc.c
@@ -147,12 +147,12 @@ rb_dlcfunc_initialize(int argc, VALUE argv[], VALUE self)
struct cfunc_data *data;
void *saddr;
const char *sname;
-
+
rb_scan_args(argc, argv, "13", &addr, &type, &name, &calltype);
-
+
saddr = (void*)(NUM2PTR(rb_Integer(addr)));
sname = NIL_P(name) ? NULL : StringValuePtr(name);
-
+
TypedData_Get_Struct(self, struct cfunc_data, &dlcfunc_data_type, data);
if( data->name ) xfree(data->name);
data->ptr = saddr;
@@ -284,11 +284,11 @@ rb_dlcfunc_inspect(VALUE self)
{
VALUE val;
char *str;
- int str_size;
+ size_t str_size;
struct cfunc_data *cfunc;
-
+
TypedData_Get_Struct(self, struct cfunc_data, &dlcfunc_data_type, cfunc);
-
+
str_size = (cfunc->name ? strlen(cfunc->name) : 0) + 100;
str = ruby_xmalloc(str_size);
snprintf(str, str_size - 1,
@@ -339,22 +339,31 @@ rb_dlcfunc_call(VALUE self, VALUE ary)
memset(stack, 0, sizeof(DLSTACK_TYPE) * DLSTACK_SIZE);
Check_Type(ary, T_ARRAY);
-
+
TypedData_Get_Struct(self, struct cfunc_data, &dlcfunc_data_type, cfunc);
if( cfunc->ptr == 0 ){
rb_raise(rb_eDLError, "can't call null-function");
return Qnil;
}
-
+
+ if( RARRAY_LEN(ary) >= DLSTACK_SIZE ){
+ rb_raise(rb_eDLError, "too many arguments (stack overflow)");
+ }
for( i = 0; i < RARRAY_LEN(ary); i++ ){
- if( i >= DLSTACK_SIZE ){
- rb_raise(rb_eDLError, "too many arguments (stack overflow)");
+ unsigned long rb_big2ulong_pack(VALUE x);
+ VALUE arg = RARRAY_PTR(ary)[i];
+
+ rb_check_safe_obj(arg);
+ if (FIXNUM_P(arg)) {
+ stack[i] = FIX2LONG(arg);
+ }
+ else {
+ Check_Type(arg, T_BIGNUM);
+ stack[i] = rb_big2ulong_pack(arg);
}
- rb_check_safe_obj(RARRAY_PTR(ary)[i]);
- stack[i] = NUM2LONG(RARRAY_PTR(ary)[i]);
}
-
+
/* calltype == CFUNC_CDECL */
if( cfunc->calltype == CFUNC_CDECL
#ifndef FUNC_STDCALL
diff --git a/ext/dl/closure.c b/ext/dl/closure.c
index da5ade1d87..a2e0b05bb4 100644
--- a/ext/dl/closure.c
+++ b/ext/dl/closure.c
@@ -57,7 +57,7 @@ dlc_callback(ffi_cif *cif, void *resp, void **args, void *ctx)
VALUE self = (VALUE)ctx;
VALUE rbargs = rb_iv_get(self, "@args");
VALUE ctype = rb_iv_get(self, "@ctype");
- int argc = RARRAY_LEN(rbargs);
+ int argc = RARRAY_LENINT(rbargs);
VALUE *params = xcalloc(argc, sizeof(VALUE *));
VALUE ret;
int i, dl_type;
@@ -165,7 +165,7 @@ rb_dlclosure_init(int rbargc, VALUE argv[], VALUE self)
if (2 == rb_scan_args(rbargc, argv, "21", &ret, &args, &abi))
abi = INT2NUM(FFI_DEFAULT_ABI);
- argc = RARRAY_LEN(args);
+ argc = RARRAY_LENINT(args);
TypedData_Get_Struct(self, dl_closure, &dlclosure_data_type, cl);
diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c
index 11ecf6f81d..75848f8358 100644
--- a/ext/dl/cptr.c
+++ b/ext/dl/cptr.c
@@ -104,7 +104,7 @@ rb_dlptr2cptr(VALUE val)
else{
rb_raise(rb_eTypeError, "DL::PtrData was expected");
}
-
+
return ptr;
}
@@ -186,7 +186,7 @@ static VALUE
rb_dlptr_s_malloc(int argc, VALUE argv[], VALUE klass)
{
VALUE size, sym, obj;
- int s;
+ long s;
freefunc_t f;
switch (rb_scan_args(argc, argv, "11", &size, &sym)) {
diff --git a/ext/dl/depend b/ext/dl/depend
index 992c17c1b8..b6bb5a8b57 100644
--- a/ext/dl/depend
+++ b/ext/dl/depend
@@ -1,7 +1,13 @@
cfunc.o: cfunc.c dl.h $(hdrdir)/ruby.h
+closure.o: closure.c dl.h dl_conversions.h $(hdrdir)/ruby.h
+
cptr.o: cptr.c dl.h $(hdrdir)/ruby.h $(hdrdir)/io.h
handle.o: handle.c dl.h $(hdrdir)/ruby.h
+method.o: method.c dl.h dl_conversions.h $(hdrdir)/ruby.h
+
dl.o: dl.c dl.h $(hdrdir)/ruby.h $(hdrdir)/io.h
+
+dl_conversions.o: dl_conversions.c dl_conversions.h
diff --git a/ext/dl/dl_conversions.c b/ext/dl/dl_conversions.c
index 01d6218f7d..1331006507 100644
--- a/ext/dl/dl_conversions.c
+++ b/ext/dl/dl_conversions.c
@@ -1,38 +1,40 @@
#include <dl_conversions.h>
-ffi_type * rb_dl_type_to_ffi_type(int dl_type)
+ffi_type *
+rb_dl_type_to_ffi_type(int dl_type)
{
int signed_p = 1;
- if(dl_type < 0) {
+ if (dl_type < 0) {
dl_type = -1 * dl_type;
signed_p = 0;
}
- switch(dl_type) {
- case DLTYPE_VOID:
- return &ffi_type_void;
- case DLTYPE_VOIDP:
- return &ffi_type_pointer;
- case DLTYPE_CHAR:
- return signed_p ? &ffi_type_schar : &ffi_type_uchar;
- case DLTYPE_SHORT:
- return signed_p ? &ffi_type_sshort : &ffi_type_ushort;
- case DLTYPE_INT:
- return signed_p ? &ffi_type_sint : &ffi_type_uint;
- case DLTYPE_LONG:
- return signed_p ? &ffi_type_slong : &ffi_type_ulong;
+#define rb_ffi_type_of(t) (signed_p ? &ffi_type_s##t : &ffi_type_u##t)
+
+ switch (dl_type) {
+ case DLTYPE_VOID:
+ return &ffi_type_void;
+ case DLTYPE_VOIDP:
+ return &ffi_type_pointer;
+ case DLTYPE_CHAR:
+ return rb_ffi_type_of(char);
+ case DLTYPE_SHORT:
+ return rb_ffi_type_of(short);
+ case DLTYPE_INT:
+ return rb_ffi_type_of(int);
+ case DLTYPE_LONG:
+ return rb_ffi_type_of(long);
#if HAVE_LONG_LONG
- case DLTYPE_LONG_LONG:
- return &ffi_type_uint64;
- break;
+ case DLTYPE_LONG_LONG:
+ return rb_ffi_type_of(int64);
#endif
- case DLTYPE_FLOAT:
- return &ffi_type_float;
- case DLTYPE_DOUBLE:
- return &ffi_type_double;
- default:
- rb_raise(rb_eRuntimeError, "unknown type %d", dl_type);
+ case DLTYPE_FLOAT:
+ return &ffi_type_float;
+ case DLTYPE_DOUBLE:
+ return &ffi_type_double;
+ default:
+ rb_raise(rb_eRuntimeError, "unknown type %d", dl_type);
}
return &ffi_type_pointer;
}
diff --git a/ext/dl/method.c b/ext/dl/method.c
index 8462292d98..1bd0fa8c3e 100644
--- a/ext/dl/method.c
+++ b/ext/dl/method.c
@@ -91,7 +91,7 @@ rb_dlfunction_initialize(int argc, VALUE argv[], VALUE self)
result = ffi_prep_cif (
cif,
NUM2INT(abi),
- RARRAY_LEN(args),
+ RARRAY_LENINT(args),
DL2FFI_TYPE(NUM2INT(ret_type)),
arg_types);
diff --git a/file.c b/file.c
index c7fed56f75..68756274fa 100644
--- a/file.c
+++ b/file.c
@@ -920,9 +920,8 @@ rb_file_lstat(VALUE obj)
#endif
}
-#ifndef HAVE_GROUP_MEMBER
static int
-group_member(GETGROUPS_T gid)
+rb_group_member(GETGROUPS_T gid)
{
#ifndef _WIN32
if (getgid() == gid || getegid() == gid)
@@ -949,7 +948,6 @@ group_member(GETGROUPS_T gid)
#endif
return FALSE;
}
-#endif
#ifndef S_IXUGO
# define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
@@ -986,7 +984,7 @@ eaccess(const char *path, int mode)
if (st.st_uid == euid) /* owner */
mode <<= 6;
- else if (group_member(st.st_gid))
+ else if (rb_group_member(st.st_gid))
mode <<= 3;
if ((int)(st.st_mode & mode) == mode) return 0;
@@ -1486,7 +1484,7 @@ rb_file_grpowned_p(VALUE obj, VALUE fname)
struct stat st;
if (rb_stat(fname, &st) < 0) return Qfalse;
- if (group_member(st.st_gid)) return Qtrue;
+ if (rb_group_member(st.st_gid)) return Qtrue;
#endif
return Qfalse;
}
@@ -4323,7 +4321,7 @@ static VALUE
rb_stat_grpowned(VALUE obj)
{
#ifndef _WIN32
- if (group_member(get_stat(obj)->st_gid)) return Qtrue;
+ if (rb_group_member(get_stat(obj)->st_gid)) return Qtrue;
#endif
return Qfalse;
}
@@ -4385,7 +4383,7 @@ rb_stat_R(VALUE obj)
return st->st_mode & S_IRUSR ? Qtrue : Qfalse;
#endif
#ifdef S_IRGRP
- if (group_member(get_stat(obj)->st_gid))
+ if (rb_group_member(get_stat(obj)->st_gid))
return st->st_mode & S_IRGRP ? Qtrue : Qfalse;
#endif
#ifdef S_IROTH
@@ -4477,7 +4475,7 @@ rb_stat_W(VALUE obj)
return st->st_mode & S_IWUSR ? Qtrue : Qfalse;
#endif
#ifdef S_IWGRP
- if (group_member(get_stat(obj)->st_gid))
+ if (rb_group_member(get_stat(obj)->st_gid))
return st->st_mode & S_IWGRP ? Qtrue : Qfalse;
#endif
#ifdef S_IWOTH
@@ -4572,7 +4570,7 @@ rb_stat_X(VALUE obj)
return st->st_mode & S_IXUSR ? Qtrue : Qfalse;
#endif
#ifdef S_IXGRP
- if (group_member(get_stat(obj)->st_gid))
+ if (rb_group_member(get_stat(obj)->st_gid))
return st->st_mode & S_IXGRP ? Qtrue : Qfalse;
#endif
#ifdef S_IXOTH
diff --git a/gc.c b/gc.c
index c9960420d4..0338d5e64b 100644
--- a/gc.c
+++ b/gc.c
@@ -2566,11 +2566,29 @@ run_single_final(VALUE arg)
}
static void
-run_final(rb_objspace_t *objspace, VALUE obj)
+run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE objid, VALUE table)
{
long i;
int status;
- VALUE args[3], table, objid;
+ VALUE args[3];
+
+ args[1] = 0;
+ args[2] = (VALUE)rb_safe_level();
+ if (!args[1] && RARRAY_LEN(table) > 0) {
+ args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
+ }
+ for (i=0; i<RARRAY_LEN(table); i++) {
+ VALUE final = RARRAY_PTR(table)[i];
+ args[0] = RARRAY_PTR(final)[1];
+ args[2] = FIX2INT(RARRAY_PTR(final)[0]);
+ rb_protect(run_single_final, (VALUE)args, &status);
+ }
+}
+
+static void
+run_final(rb_objspace_t *objspace, VALUE obj)
+{
+ VALUE table, objid;
RUBY_DATA_FUNC free_func = 0;
objid = rb_obj_id(obj); /* make obj into id */
@@ -2588,17 +2606,7 @@ run_final(rb_objspace_t *objspace, VALUE obj)
if (finalizer_table &&
st_delete(finalizer_table, (st_data_t*)&obj, &table)) {
- args[1] = 0;
- args[2] = (VALUE)rb_safe_level();
- if (!args[1] && RARRAY_LEN(table) > 0) {
- args[1] = rb_obj_freeze(rb_ary_new3(1, objid));
- }
- for (i=0; i<RARRAY_LEN(table); i++) {
- VALUE final = RARRAY_PTR(table)[i];
- args[0] = RARRAY_PTR(final)[1];
- args[2] = FIX2INT(RARRAY_PTR(final)[0]);
- rb_protect(run_single_final, (VALUE)args, &status);
- }
+ run_finalizer(objspace, obj, objid, table);
}
}
@@ -2630,18 +2638,33 @@ static int
chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg)
{
RVALUE *p = (RVALUE *)key, **final_list = (RVALUE **)arg;
- if (p->as.basic.flags & FL_FINALIZE) {
+ if ((p->as.basic.flags & (FL_FINALIZE|FL_MARK)) == FL_FINALIZE) {
if (BUILTIN_TYPE(p) != T_ZOMBIE) {
p->as.free.flags = FL_MARK | T_ZOMBIE; /* remain marked */
RDATA(p)->dfree = 0;
}
p->as.free.next = *final_list;
*final_list = p;
- return ST_CONTINUE;
- }
- else {
- return ST_DELETE;
}
+ return ST_CONTINUE;
+}
+
+struct force_finalize_list {
+ VALUE obj;
+ VALUE table;
+ struct force_finalize_list *next;
+};
+
+static int
+force_chain_object(st_data_t key, st_data_t val, st_data_t arg)
+{
+ struct force_finalize_list **prev = (struct force_finalize_list **)arg;
+ struct force_finalize_list *curr = ALLOC(struct force_finalize_list);
+ curr->obj = key;
+ curr->table = val;
+ curr->next = *prev;
+ *prev = curr;
+ return ST_DELETE;
}
void
@@ -2659,15 +2682,24 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
/* run finalizers */
if (finalizer_table) {
- finalize_deferred(objspace);
- while (finalizer_table->num_entries > 0) {
+ do {
+ /* XXX: this loop will make no sense */
+ /* because mark will not be removed */
+ finalize_deferred(objspace);
+ mark_tbl(objspace, finalizer_table, 0);
st_foreach(finalizer_table, chain_finalized_object,
- (st_data_t)&final_list);
- if (!(p = final_list)) break;
- do {
- final_list = p->as.free.next;
- run_final(objspace, (VALUE)p);
- } while ((p = final_list) != 0);
+ (st_data_t)&deferred_final_list);
+ } while (deferred_final_list);
+ /* force to run finalizer */
+ while (finalizer_table->num_entries) {
+ struct force_finalize_list *list = 0;
+ st_foreach(finalizer_table, force_chain_object, (st_data_t)&list);
+ while (list) {
+ struct force_finalize_list *curr = list;
+ run_finalizer(objspace, curr->obj, rb_obj_id(curr->obj), curr->table);
+ list = curr->next;
+ xfree(curr);
+ }
}
st_free_table(finalizer_table);
finalizer_table = 0;
diff --git a/hash.c b/hash.c
index daee40ebbc..c281b58f86 100644
--- a/hash.c
+++ b/hash.c
@@ -268,6 +268,14 @@ rb_hash_modify(VALUE hash)
}
static void
+hash_update(VALUE hash, VALUE key)
+{
+ if (RHASH(hash)->iter_lev > 0 && !st_lookup(RHASH(hash)->ntbl, key, 0)) {
+ rb_raise(rb_eRuntimeError, "can't add a new key into hash during iteration");
+ }
+}
+
+static void
default_proc_arity_check(VALUE proc)
{
int n = rb_proc_arity(proc);
@@ -1034,6 +1042,7 @@ VALUE
rb_hash_aset(VALUE hash, VALUE key, VALUE val)
{
rb_hash_modify(hash);
+ hash_update(hash, key);
if (hash == key) {
rb_raise(rb_eArgError, "recursive key for hash");
}
@@ -1628,6 +1637,7 @@ static int
rb_hash_update_i(VALUE key, VALUE value, VALUE hash)
{
if (key == Qundef) return ST_CONTINUE;
+ hash_update(hash, key);
st_insert(RHASH(hash)->ntbl, key, value);
return ST_CONTINUE;
}
@@ -1639,6 +1649,7 @@ rb_hash_update_block_i(VALUE key, VALUE value, VALUE hash)
if (rb_hash_has_key(hash, key)) {
value = rb_yield_values(3, key, rb_hash_aref(hash, key), value);
}
+ hash_update(hash, key);
st_insert(RHASH(hash)->ntbl, key, value);
return ST_CONTINUE;
}
diff --git a/test/dl/test_base.rb b/test/dl/test_base.rb
index e67f0795d5..b0e5e6fa11 100644
--- a/test/dl/test_base.rb
+++ b/test/dl/test_base.rb
@@ -66,11 +66,11 @@ module DL
end
def assert_match(expected, actual, message="")
- assert(expected === actual, message)
+ assert_operator(expected, :===, actual, message)
end
def assert_positive(actual)
- assert(actual > 0)
+ assert_operator(actual, :>, 0)
end
def assert_zero(actual)
@@ -78,7 +78,7 @@ module DL
end
def assert_negative(actual)
- assert(actual < 0)
+ assert_operator(actual, :<, 0)
end
def test_empty()
diff --git a/test/dl/test_handle.rb b/test/dl/test_handle.rb
index 7a7d5bd71c..0345e96e63 100644
--- a/test/dl/test_handle.rb
+++ b/test/dl/test_handle.rb
@@ -4,7 +4,7 @@ module DL
class TestHandle < TestBase
def test_to_i
handle = DL::Handle.new(LIBC_SO)
- assert handle.to_i
+ assert_kind_of Integer, handle.to_i
end
def test_static_sym_secure
@@ -22,7 +22,7 @@ module DL
end
def test_static_sym
- assert DL::Handle.sym('dlopen')
+ assert_not_nil DL::Handle.sym('dlopen')
assert_equal DL::Handle.sym('dlopen'), DL::Handle['dlopen']
end
@@ -57,8 +57,8 @@ module DL
def test_sym
handle = DL::Handle.new(LIBC_SO)
- assert handle.sym('calloc')
- assert handle['calloc']
+ assert_not_nil handle.sym('calloc')
+ assert_not_nil handle['calloc']
end
def test_handle_close
@@ -98,12 +98,12 @@ module DL
def test_initialize_noargs
handle = DL::Handle.new
- assert handle['rb_str_new']
+ assert_not_nil handle['rb_str_new']
end
def test_initialize_flags
handle = DL::Handle.new(LIBC_SO, DL::RTLD_LAZY | DL::RTLD_GLOBAL)
- assert handle['calloc']
+ assert_not_nil handle['calloc']
end
def test_enable_close
@@ -134,7 +134,7 @@ module DL
# library.
# --- Ubuntu Linux 8.04 dlsym(3)
handle = DL::Handle::NEXT
- assert handle['malloc']
+ assert_not_nil handle['malloc']
rescue
# BSD
#
@@ -145,19 +145,19 @@ module DL
# called from a shared library, all subsequent shared libraries are
# searched. RTLD_NEXT is useful for implementing wrappers around library
# functions. For example, a wrapper function getpid() could access the
- # “real” getpid() with dlsym(RTLD_NEXT, "getpid"). (Actually, the dlfunc()
+ # "real" getpid() with dlsym(RTLD_NEXT, "getpid"). (Actually, the dlfunc()
# interface, below, should be used, since getpid() is a function and not a
# data object.)
# --- FreeBSD 8.0 dlsym(3)
require 'objspace'
handle = DL::Handle::NEXT
- assert handle['Init_objspace']
+ assert_not_nil handle['Init_objspace']
end
end
def test_DEFAULT
handle = DL::Handle::DEFAULT
- assert handle['malloc']
+ assert_not_nil handle['malloc']
end
end
end
diff --git a/test/dl/test_import.rb b/test/dl/test_import.rb
index e4af382abc..56a417f9ab 100644
--- a/test/dl/test_import.rb
+++ b/test/dl/test_import.rb
@@ -18,7 +18,7 @@ module DL
extern "int gettimeofday(timeval*, timezone*)" rescue nil
QsortCallback = bind("void *qsort_callback(void*, void*)", :temp)
- BoundQsortCallback = bind("void *qsort_callback(void*, void*)"){|ptr1,ptr2| ptr1[0] <=> ptr2[0]}
+ BoundQsortCallback = bind("void *bound_qsort_callback(void*, void*)"){|ptr1,ptr2| ptr1[0] <=> ptr2[0]}
Timeval = struct [
"long tv_sec",
"long tv_usec",
diff --git a/test/dl/test_method.rb b/test/dl/test_method.rb
index e1ed5ed88b..4c104aaa04 100644
--- a/test/dl/test_method.rb
+++ b/test/dl/test_method.rb
@@ -4,7 +4,7 @@ require 'dl/func'
module DL
class TestMethod < TestBase
def test_method_call
- f = Method.new(@libc['sinf'], [TYPE_FLOAT], TYPE_FLOAT)
+ f = Method.new(@libm['sinf'], [TYPE_FLOAT], TYPE_FLOAT)
assert_in_delta 1.0, f.call(90 * Math::PI / 180), 0.0001
end
end
diff --git a/vm.c b/vm.c
index ff2551b26a..b089484e3a 100644
--- a/vm.c
+++ b/vm.c
@@ -981,6 +981,7 @@ vm_init_redefined_flag(rb_vm_t *vm)
/* for vm development */
+#if VMDEBUG
static const char *
vm_frametype_name(const rb_control_frame_t *cfp)
{
@@ -999,6 +1000,7 @@ vm_frametype_name(const rb_control_frame_t *cfp)
rb_bug("unknown frame");
}
}
+#endif
/* evaluator body */
diff --git a/vm_eval.c b/vm_eval.c
index e3c4efcb74..d60f4d46a8 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -816,8 +816,10 @@ rb_f_loop(VALUE self)
return Qnil; /* dummy */
}
+#if VMDEBUG
static const char *
vm_frametype_name(const rb_control_frame_t *cfp);
+#endif
VALUE
rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
@@ -860,7 +862,9 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1,
/* check skipped frame */
while (th->cfp != cfp) {
- /* printf("skipped frame: %s\n", vm_frametype_name(th->cfp)); */
+#if VMDEBUG
+ printf("skipped frame: %s\n", vm_frametype_name(th->cfp));
+#endif
if (UNLIKELY(VM_FRAME_TYPE(th->cfp) == VM_FRAME_MAGIC_CFUNC)) {
const rb_method_entry_t *me = th->cfp->me;
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, th->cfp->self, me->called_id, me->klass);
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index ae1d86d97b..23b48506f5 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -364,7 +364,6 @@ vm_call_cfunc(rb_thread_t *th, rb_control_frame_t *reg_cfp,
const rb_method_entry_t *me)
{
VALUE val = 0;
- int state = 0;
const rb_method_definition_t *def = me->def;
rb_control_frame_t *cfp;