前田です。

In message "[ruby-dev:1578] Re: [BUG] String.dup"
Yukihiro Matsumoto <matz / netlab.co.jp> wrote:

||2. PrimitiveなクラスはObjectのサブクラスではなくして, Kernelを直接イン
||   クルードする.
|
|これはできません.というのもインスタンスがT_OBJECT以外の構造
|をもつクラスはクラス階層の中に組み込まれているからです.たと
|えば,NumericはComplexなどのスーパークラスですからObjectのサ
|ブクラスである必要がありますが,FloatやBignum,Fixnumのスーパー
|クラスでもあります.これらをNumericのサブクラスから外すのは
|望ましくないと思います.

最初に石塚さんがおっしゃっていたように、

Object --- Primitive -+- Array
                      |
                      +- Hash
                      .
                      .
                      .
                      +- Data

としておいて、data_object_allocはDataのサブクラスしか受けつけ
ないようにするというのはどうでしょう。
拡張モジュールを全部書き直さないといけないのが難ですが、

    cDBM = rb_define_class("DBM", cObject);

などとなっているのを、

    cDBM = rb_define_class("DBM", cData);

とするだけなので、それほどコストはかからないと思います。

-- 
前田 修吾