summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-30 12:54:41 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-30 12:54:41 +0000
commit3cce74dc4c4abfb6840de4ba9bcea4df2f502b15 (patch)
treeebfdb2480bfc27503496706ff17f853509c01e13
parent0777c729cd1ae095ce18b55fb1cdf20b0d34cb0d (diff)
merges r25605 from trunk into ruby_1_9_1.
-- * test/dl/test_dl2.rb (**) testing malloc and realloc * ext/dl/dl.c (**) adding documentation git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@26512 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ext/dl/dl.c13
-rw-r--r--test/dl/test_dl2.rb47
-rw-r--r--version.h2
3 files changed, 61 insertions, 1 deletions
diff --git a/ext/dl/dl.c b/ext/dl/dl.c
index 7a21fa9d25..39ffc5a1fa 100644
--- a/ext/dl/dl.c
+++ b/ext/dl/dl.c
@@ -16,6 +16,12 @@ rb_dl_dlopen(int argc, VALUE argv[], VALUE self)
return rb_class_new_instance(argc, argv, rb_cDLHandle);
}
+/*
+ * call-seq: DL.malloc
+ *
+ * Allocate +size+ bytes of memory and return the integer memory address
+ * for the allocated memory.
+ */
VALUE
rb_dl_malloc(VALUE self, VALUE size)
{
@@ -26,6 +32,13 @@ rb_dl_malloc(VALUE self, VALUE size)
return PTR2NUM(ptr);
}
+/*
+ * call-seq: DL.realloc(addr, size)
+ *
+ * Change the size of the memory allocated at the memory location +addr+ to
+ * +size+ bytes. Returns the memory address of the reallocated memory, which
+ * may be different than the address passed in.
+ */
VALUE
rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
{
diff --git a/test/dl/test_dl2.rb b/test/dl/test_dl2.rb
index 3c854aea8f..00b4e27155 100644
--- a/test/dl/test_dl2.rb
+++ b/test/dl/test_dl2.rb
@@ -3,6 +3,53 @@ require 'dl/callback'
module DL
class TestDL < TestBase
+ # TODO: refactor test repetition
+
+ def test_realloc
+ str = "abc"
+ ptr_id = DL.realloc(0, 4)
+ ptr = CPtr.new(ptr_id, 4)
+
+ assert_equal ptr_id, ptr.to_i
+
+ cfunc = CFunc.new(@libc['strcpy'], TYPE_VOIDP, 'strcpy')
+ x = cfunc.call([ptr_id,str].pack("l!p").unpack("l!*"))
+ assert_equal("abc\0", ptr[0,4])
+ DL.free ptr_id
+ end
+
+ def test_realloc_secure
+ assert_raises(SecurityError) do
+ Thread.new do
+ $SAFE = 4
+ DL.realloc(0, 4)
+ end.join
+ end
+ end
+
+ def test_malloc
+ str = "abc"
+
+ ptr_id = DL.malloc(4)
+ ptr = CPtr.new(ptr_id, 4)
+
+ assert_equal ptr_id, ptr.to_i
+
+ cfunc = CFunc.new(@libc['strcpy'], TYPE_VOIDP, 'strcpy')
+ x = cfunc.call([ptr_id,str].pack("l!p").unpack("l!*"))
+ assert_equal("abc\0", ptr[0,4])
+ DL.free ptr_id
+ end
+
+ def test_malloc_security
+ assert_raises(SecurityError) do
+ Thread.new do
+ $SAFE = 4
+ DL.malloc(4)
+ end.join
+ end
+ end
+
def test_call_int()
cfunc = CFunc.new(@libc['atoi'], TYPE_INT, 'atoi')
x = cfunc.call(["100"].pack("p").unpack("l!*"))
diff --git a/version.h b/version.h
index 153de8c226..6fb8758400 100644
--- a/version.h
+++ b/version.h
@@ -1,5 +1,5 @@
#define RUBY_VERSION "1.9.1"
-#define RUBY_PATCHLEVEL 417
+#define RUBY_PATCHLEVEL 418
#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 1