summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-09-03 05:20:14 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-09-03 05:20:14 +0000
commit6f484e4930be69c58462dd11c97663e6c8488b8e (patch)
tree324b1dbdf4149be943eb3cbff26ad7f377e53dc0 /ext
parent20254d4e133331e69e6aa7514e1e72ad7d14d496 (diff)
* variable.c (rb_copy_generic_ivar): remove old generic instance
variable table if it existes. * class.c (rb_make_metaclass): metaclass of a metaclass is a metaclass itself. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2784 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext')
-rw-r--r--ext/digest/digest.c105
-rw-r--r--ext/digest/md5/md5init.c7
-rw-r--r--ext/extmk.rb.in2
-rw-r--r--ext/stringio/stringio.c20
4 files changed, 55 insertions, 79 deletions
diff --git a/ext/digest/digest.c b/ext/digest/digest.c
index 3d47685aac..f4f5729f32 100644
--- a/ext/digest/digest.c
+++ b/ext/digest/digest.c
@@ -41,16 +41,17 @@ static ID id_metadata;
*/
static algo_t *
-get_digest_base_metadata(class)
- VALUE class;
+get_digest_base_metadata(klass)
+ VALUE klass;
{
VALUE obj;
algo_t *algo;
- if (rb_cvar_defined(class, id_metadata) == Qfalse)
+ if (rb_cvar_defined(klass, id_metadata) == Qfalse) {
rb_notimplement();
+ }
- obj = rb_cvar_get(class, id_metadata);
+ obj = rb_cvar_get(klass, id_metadata);
Data_Get_Struct(obj, algo_t, algo);
@@ -58,54 +59,42 @@ get_digest_base_metadata(class)
}
static VALUE
-rb_digest_base_s_new(argc, argv, class)
- int argc;
- VALUE* argv;
- VALUE class;
+rb_digest_base_alloc(klass)
+ VALUE klass;
{
algo_t *algo;
VALUE obj;
void *pctx;
- if (class == cDigest_Base)
+ if (klass == cDigest_Base) {
rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
+ }
- algo = get_digest_base_metadata(class);
+ algo = get_digest_base_metadata(klass);
pctx = xmalloc(algo->ctx_size);
algo->init_func(pctx);
- obj = Data_Wrap_Struct(class, 0, free, pctx);
-
- rb_obj_call_init(obj, argc, argv);
+ obj = Data_Wrap_Struct(klass, 0, free, pctx);
return obj;
}
static VALUE
-rb_digest_base_s_digest(class, str)
- VALUE class;
+rb_digest_base_s_digest(klass, str)
+ VALUE klass;
VALUE str;
{
algo_t *algo;
void *pctx;
size_t len;
unsigned char *digest;
- VALUE obj;
+ VALUE obj = rb_digest_base_alloc(klass);
- if (class == cDigest_Base)
- rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
+ algo = get_digest_base_metadata(klass);
+ Data_Get_Struct(obj, void, pctx);
-#ifdef StringValue
StringValue(str);
-#else
- Check_Type(str, T_STRING);
-#endif
-
- algo = get_digest_base_metadata(class);
-
- pctx = xmalloc(algo->ctx_size);
- algo->init_func(pctx);
algo->update_func(pctx, RSTRING(str)->ptr, RSTRING(str)->len);
len = algo->digest_len;
@@ -122,26 +111,18 @@ rb_digest_base_s_digest(class, str)
}
static VALUE
-rb_digest_base_s_hexdigest(class, str)
- VALUE class;
+rb_digest_base_s_hexdigest(klass, str)
+ VALUE klass;
VALUE str;
{
algo_t *algo;
void *pctx;
size_t len;
unsigned char *hexdigest;
- VALUE obj;
-
- if (class == cDigest_Base)
- rb_raise(rb_eNotImpError, "Digest::Base is an abstract class");
+ VALUE obj = rb_digest_base_alloc(klass);
-#ifdef StringValue
StringValue(str);
-#else
- Check_Type(str, T_STRING);
-#endif
-
- algo = get_digest_base_metadata(class);
+ algo = get_digest_base_metadata(klass);
pctx = xmalloc(algo->ctx_size);
algo->init_func(pctx);
@@ -161,21 +142,25 @@ rb_digest_base_s_hexdigest(class, str)
}
static VALUE
-rb_digest_base_clone(self)
- VALUE self;
+rb_digest_base_become(copy, obj)
+ VALUE copy, obj;
{
algo_t *algo;
void *pctx1, *pctx2;
- VALUE class;
-
- class = CLASS_OF(self);
- algo = get_digest_base_metadata(class);
- Data_Get_Struct(self, void, pctx1);
-
- pctx2 = xmalloc(algo->ctx_size);
+ VALUE klass;
+
+ printf("Digest::Base::bacome\n");
+ if (copy = obj) return copy;
+ rb_check_frozen(copy);
+ algo = get_digest_base_metadata(CLASS_OF(klass));
+ if (algo != get_digest_base_metadata(CLASS_OF(obj))) {
+ rb_raise(rb_eTypeError, "wrong argument class");
+ }
+ Data_Get_Struct(copy, void, pctx1);
+ Data_Get_Struct(copy, void, pctx2);
memcpy(pctx2, pctx1, algo->ctx_size);
- return Data_Wrap_Struct(class, 0, free, pctx2);
+ return copy;
}
static VALUE
@@ -185,12 +170,7 @@ rb_digest_base_update(self, str)
algo_t *algo;
void *pctx;
-#ifdef StringValue
StringValue(str);
-#else
- Check_Type(str, T_STRING);
-#endif
-
algo = get_digest_base_metadata(CLASS_OF(self));
Data_Get_Struct(self, void, pctx);
@@ -281,13 +261,13 @@ rb_digest_base_equal(self, other)
VALUE self, other;
{
algo_t *algo;
- VALUE class;
+ VALUE klass;
VALUE str1, str2;
- class = CLASS_OF(self);
- algo = get_digest_base_metadata(class);
+ klass = CLASS_OF(self);
+ algo = get_digest_base_metadata(klass);
- if (CLASS_OF(other) == class) {
+ if (CLASS_OF(other) == klass) {
void *pctx1, *pctx2;
Data_Get_Struct(self, void, pctx1);
@@ -296,11 +276,7 @@ rb_digest_base_equal(self, other)
return algo->equal_func(pctx1, pctx2) ? Qtrue : Qfalse;
}
-#ifdef StringValue
StringValue(other);
-#else
- Check_Type(other, T_STRING);
-#endif
str2 = other;
if (RSTRING(str2)->len == algo->digest_len)
@@ -326,12 +302,13 @@ Init_digest()
cDigest_Base = rb_define_class_under(mDigest, "Base", rb_cObject);
- rb_define_singleton_method(cDigest_Base, "new", rb_digest_base_s_new, -1);
+ printf("Init_digest\n");
+ rb_define_singleton_method(cDigest_Base, "allocate", rb_digest_base_alloc, 0);
rb_define_singleton_method(cDigest_Base, "digest", rb_digest_base_s_digest, 1);
rb_define_singleton_method(cDigest_Base, "hexdigest", rb_digest_base_s_hexdigest, 1);
rb_define_method(cDigest_Base, "initialize", rb_digest_base_init, -1);
- rb_define_method(cDigest_Base, "clone", rb_digest_base_clone, 0);
+ rb_define_method(cDigest_Base, "become", rb_digest_base_become, 1);
rb_define_method(cDigest_Base, "update", rb_digest_base_update, 1);
rb_define_method(cDigest_Base, "<<", rb_digest_base_update, 1);
rb_define_method(cDigest_Base, "digest", rb_digest_base_digest, 0);
diff --git a/ext/digest/md5/md5init.c b/ext/digest/md5/md5init.c
index 90ab707433..69b15c5b39 100644
--- a/ext/digest/md5/md5init.c
+++ b/ext/digest/md5/md5init.c
@@ -18,7 +18,6 @@ void
Init_md5()
{
VALUE mDigest, cDigest_Base, cDigest_MD5;
- ID id_metadata;
rb_require("digest.so");
@@ -27,8 +26,6 @@ Init_md5()
cDigest_MD5 = rb_define_class_under(mDigest, "MD5", cDigest_Base);
- id_metadata = rb_intern("metadata");
-
- rb_cvar_set(cDigest_MD5, id_metadata,
- Data_Wrap_Struct(rb_cObject, 0, 0, &md5), Qtrue);
+ rb_cvar_declare(cDigest_MD5, rb_intern("metadata"),
+ Data_Wrap_Struct(rb_cObject, 0, 0, &md5));
}
diff --git a/ext/extmk.rb.in b/ext/extmk.rb.in
index cebb115214..b2d0b02937 100644
--- a/ext/extmk.rb.in
+++ b/ext/extmk.rb.in
@@ -822,7 +822,7 @@ if $extlist.size > 0
if File.exist?(f)
$extinit += format("\
\tInit_%s();\n\
-\trb_provide(\"%s\");\n\
+\trb_provide(\"%s.so\");\n\
", i, t)
$extobjs += "ext/"
$extobjs += f
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index a6ba07307e..4f682b3a20 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -148,7 +148,7 @@ static VALUE strio_closed _((VALUE));
static VALUE strio_closed_read _((VALUE));
static VALUE strio_closed_write _((VALUE));
static VALUE strio_eof _((VALUE));
-static VALUE strio_clone _((VALUE));
+static VALUE strio_become _((VALUE, VALUE));
static VALUE strio_get_lineno _((VALUE));
static VALUE strio_set_lineno _((VALUE, VALUE));
static VALUE strio_get_pos _((VALUE));
@@ -405,14 +405,17 @@ strio_eof(self)
}
static VALUE
-strio_clone(self)
- VALUE self;
+strio_become(copy, orig)
+ VALUE copy, orig;
{
- struct StringIO *ptr = StringIO(self);
- VALUE clone = rb_call_super(0, 0);
- DATA_PTR(clone) = ptr;
+ struct StringIO *ptr = StringIO(orig);
+
+ if (DATA_PTR(copy)) {
+ strio_free(DATA_PTR(ptr));
+ }
+ DATA_PTR(copy) = ptr;
++ptr->count;
- return self;
+ return copy;
}
static VALUE
@@ -883,8 +886,7 @@ Init_stringio()
rb_define_singleton_method(StringIO, "open", strio_s_open, -1);
rb_define_method(StringIO, "initialize", strio_initialize, -1);
rb_enable_super(StringIO, "initialize");
- rb_define_method(StringIO, "clone", strio_clone, 0);
- rb_enable_super(StringIO, "clone");
+ rb_define_method(StringIO, "become", strio_become, 1);
rb_define_method(StringIO, "reopen", strio_reopen, -1);
rb_define_method(StringIO, "string", strio_get_string, 0);