summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-01 01:46:44 +0000
committertenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-11-01 01:46:44 +0000
commit6cf6d8556c1df4962ae5775538690e4957e2ac1a (patch)
tree7dc20b7c1b92b1672d1eb806f8d87ff4993bb78f
parent5f3d0f523328be8197fd3d410a1b3bd3febfcbc2 (diff)
* ext/dl/cptr.c (rb_dlptr_size) splitting function to reduce complexity
* ext/dl/cptr.c (rb_dlptr_null_p, rb_dlptr_aref, rb_dlptr_aset) adding documentation * ext/dl/dl.c (rb_dl_free) adding documentation * test/dl/test_cptr.rb (test_null?, test_size, test_size=, test_aref_aset) Improving test coverage * test/dl/test_dl2.rb (test_free_secure) improving test coverage git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25606 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ext/dl/cptr.c56
-rw-r--r--ext/dl/dl.c5
-rw-r--r--test/dl/test_cptr.rb52
-rw-r--r--test/dl/test_dl2.rb31
4 files changed, 110 insertions, 34 deletions
diff --git a/ext/dl/cptr.c b/ext/dl/cptr.c
index b557945a82..488b312025 100644
--- a/ext/dl/cptr.c
+++ b/ext/dl/cptr.c
@@ -223,6 +223,11 @@ rb_dlptr_ref(VALUE self)
return rb_dlptr_new(&(data->ptr),0,0);
}
+/*
+ * call-seq: null?
+ *
+ * Returns true if this is a null pointer.
+ */
VALUE
rb_dlptr_null_p(VALUE self)
{
@@ -357,6 +362,15 @@ rb_dlptr_minus(VALUE self, VALUE other)
return rb_dlptr_new((char *)ptr - num, size + num, 0);
}
+/*
+ * call-seq:
+ * ptr[index] -> an_integer
+ * ptr[start, length] -> a_string
+ *
+ * Returns integer stored at _index_. If _start_ and _length_ are given,
+ * a string containing the bytes from _start_ of length _length_ will be
+ * returned.
+ */
VALUE
rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
{
@@ -380,6 +394,15 @@ rb_dlptr_aref(int argc, VALUE argv[], VALUE self)
return retval;
}
+/*
+ * call-seq:
+ * ptr[index] = int -> int
+ * ptr[start, length] = string or cptr or addr -> string or dl_cptr or addr
+ *
+ * Set the value at +index+ to +int+. Or, set the memory at +start+ until
+ * +length+ with the contents of +string+, the memory from +dl_cptr+, or the
+ * memory pointed at by the memory address +addr+.
+ */
VALUE
rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
{
@@ -415,18 +438,27 @@ rb_dlptr_aset(int argc, VALUE argv[], VALUE self)
return retval;
}
-VALUE
-rb_dlptr_size(int argc, VALUE argv[], VALUE self)
+/*
+ * call-seq: size=(size)
+ *
+ * Set the size of this pointer to +size+
+ */
+static VALUE
+rb_dlptr_size_set(VALUE self, VALUE size)
{
- VALUE size;
+ RPTR_DATA(self)->size = NUM2LONG(size);
+ return size;
+}
- if (rb_scan_args(argc, argv, "01", &size) == 0){
- return LONG2NUM(RPTR_DATA(self)->size);
- }
- else{
- RPTR_DATA(self)->size = NUM2LONG(size);
- return size;
- }
+/*
+ * call-seq: size
+ *
+ * Get the size of this pointer.
+ */
+static VALUE
+rb_dlptr_size_get(VALUE self)
+{
+ return LONG2NUM(RPTR_DATA(self)->size);
}
VALUE
@@ -491,8 +523,8 @@ Init_dlptr(void)
rb_define_method(rb_cDLCPtr, "-", rb_dlptr_minus, 1);
rb_define_method(rb_cDLCPtr, "[]", rb_dlptr_aref, -1);
rb_define_method(rb_cDLCPtr, "[]=", rb_dlptr_aset, -1);
- rb_define_method(rb_cDLCPtr, "size", rb_dlptr_size, -1);
- rb_define_method(rb_cDLCPtr, "size=", rb_dlptr_size, -1);
+ rb_define_method(rb_cDLCPtr, "size", rb_dlptr_size_get, 0);
+ rb_define_method(rb_cDLCPtr, "size=", rb_dlptr_size_set, 1);
rb_define_const(rb_mDL, "NULL", rb_dlptr_new(0, 0, 0));
}
diff --git a/ext/dl/dl.c b/ext/dl/dl.c
index beaed84393..9635794883 100644
--- a/ext/dl/dl.c
+++ b/ext/dl/dl.c
@@ -49,6 +49,11 @@ rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
return PTR2NUM(ptr);
}
+/*
+ * call-seq: DL.free(addr)
+ *
+ * Free the memory at address +addr+
+ */
VALUE
rb_dl_free(VALUE self, VALUE addr)
{
diff --git a/test/dl/test_cptr.rb b/test/dl/test_cptr.rb
index 55a53f97da..4157f83361 100644
--- a/test/dl/test_cptr.rb
+++ b/test/dl/test_cptr.rb
@@ -29,5 +29,57 @@ module DL
assert_equal free.ptr, ptr.free.ptr
end
+
+ def test_null?
+ ptr = CPtr.new(0)
+ assert ptr.null?
+ end
+
+ def test_size
+ ptr = CPtr.malloc(4)
+ assert_equal 4, ptr.size
+ DL.free ptr.to_i
+ end
+
+ def test_size=
+ ptr = CPtr.malloc(4)
+ ptr.size = 10
+ assert_equal 10, ptr.size
+ DL.free ptr.to_i
+ end
+
+ def test_aref_aset
+ check = Proc.new{|str,ptr|
+ assert_equal(str.size(), ptr.size())
+ assert_equal(str, ptr.to_s())
+ assert_equal(str[0,2], ptr.to_s(2))
+ assert_equal(str[0,2], ptr[0,2])
+ assert_equal(str[1,2], ptr[1,2])
+ assert_equal(str[1,0], ptr[1,0])
+ assert_equal(str[0].ord, ptr[0])
+ assert_equal(str[1].ord, ptr[1])
+ }
+ str = 'abc'
+ ptr = CPtr[str]
+ check.call(str, ptr)
+
+ str[0] = "c"
+ assert_equal 'c'.ord, ptr[0] = "c".ord
+ check.call(str, ptr)
+
+ str[0,2] = "aa"
+ assert_equal 'aa', ptr[0,2] = "aa"
+ check.call(str, ptr)
+
+ ptr2 = CPtr['cdeeee']
+ str[0,2] = "cd"
+ assert_equal ptr2, ptr[0,2] = ptr2
+ check.call(str, ptr)
+
+ ptr3 = CPtr['vvvv']
+ str[0,2] = "vv"
+ assert_equal ptr3.to_i, ptr[0,2] = ptr3.to_i
+ check.call(str, ptr)
+ end
end
end
diff --git a/test/dl/test_dl2.rb b/test/dl/test_dl2.rb
index d391e976e5..ac1414920f 100644
--- a/test/dl/test_dl2.rb
+++ b/test/dl/test_dl2.rb
@@ -5,6 +5,15 @@ module DL
class TestDL < TestBase
# TODO: refactor test repetition
+ def test_free_secure
+ assert_raises(SecurityError) do
+ Thread.new do
+ $SAFE = 4
+ DL.free(0)
+ end.join
+ end
+ end
+
def test_realloc
str = "abc"
ptr_id = DL.realloc(0, 4)
@@ -133,27 +142,5 @@ class TestDL < TestBase
ary2 = dlunwrap(addr)
assert_equal(ary, ary2)
end
-
- def test_cptr()
- check = Proc.new{|str,ptr|
- assert_equal(str.size(), ptr.size())
- assert_equal(str, ptr.to_s())
- assert_equal(str[0,2], ptr.to_s(2))
- assert_equal(str[0,2], ptr[0,2])
- assert_equal(str[1,2], ptr[1,2])
- assert_equal(str[1,0], ptr[1,0])
- assert_equal(str[0].ord, ptr[0])
- assert_equal(str[1].ord, ptr[1])
- }
- str = 'abc'
- ptr = CPtr[str]
- check.call(str, ptr)
- str[0] = "c"
- ptr[0] = "c".ord
- check.call(str, ptr)
- str[0,2] = "aa"
- ptr[0,2] = "aa"
- check.call(str, ptr)
- end
end
end # module DL