aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--ext/bigdecimal/bigdecimal.c22
2 files changed, 20 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 1415c7da09..1cd71497c9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,6 @@
-Wed Sep 9 21:19:27 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Sep 9 21:20:49 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_data_type): typed.
* ext/dl/cfunc.c (dlcfunc_data_type): typed.
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index c917e84090..de18b83784 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -203,11 +203,23 @@ static int VpLimitRound(Real *c,U_LONG ixDigit);
*/
static void
-BigDecimal_delete(Real *pv)
+BigDecimal_delete(void *pv)
{
VpFree(pv);
}
+static size_t
+BigDecimal_memsize(const void *ptr)
+{
+ const Real *pv = ptr;
+ return pv ? (sizeof(*pv) + pv->MaxPrec * sizeof(U_LONG)) : 0;
+}
+
+static const rb_data_type_t BigDecimal_data_type = {
+ "BigDecimal",
+ 0, BigDecimal_delete, BigDecimal_memsize,
+};
+
static VALUE
ToValue(Real *p)
{
@@ -231,8 +243,8 @@ GetVpValue(VALUE v, int must)
switch(TYPE(v))
{
case T_DATA:
- if(RDATA(v)->dfree ==(void *) BigDecimal_delete) {
- Data_Get_Struct(v, Real, pv);
+ if(rb_typeddata_is_kind_of(v, &BigDecimal_data_type)) {
+ pv = DATA_PTR(v);
return pv;
} else {
goto SomeOneMayDoIt;
@@ -503,7 +515,7 @@ VP_EXPORT Real *
VpNewRbClass(U_LONG mx, char *str, VALUE klass)
{
Real *pv = VpAlloc(mx,str);
- pv->obj = (VALUE)Data_Wrap_Struct(klass, 0, BigDecimal_delete, pv);
+ pv->obj = TypedData_Wrap_Struct(klass, &BigDecimal_data_type, pv);
return pv;
}
@@ -511,7 +523,7 @@ VP_EXPORT Real *
VpCreateRbObject(U_LONG mx, const char *str)
{
Real *pv = VpAlloc(mx,str);
- pv->obj = (VALUE)Data_Wrap_Struct(rb_cBigDecimal, 0, BigDecimal_delete, pv);
+ pv->obj = TypedData_Wrap_Struct(rb_cBigDecimal, &BigDecimal_data_type, pv);
return pv;
}