Skip to content

Commit

Permalink
* ext/digest/digest.c (rb_digest_base_s_digest): add volatile to
Browse files Browse the repository at this point in the history
  protect temporary context object.  [ruby-dev:27979]

* ext/iconv/iconv.c (Init_iconv): rb_gc_register_address() should
  be called before actual variable initialization.
  [ruby-dev:27986]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
matz committed Dec 12, 2005
1 parent 1ca94a0 commit 4d467a0
Show file tree
Hide file tree
Showing 15 changed files with 73 additions and 88 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
@@ -1,3 +1,12 @@
Mon Dec 12 00:33:56 2005 Yukihiro Matsumoto <matz@ruby-lang.org>

* ext/digest/digest.c (rb_digest_base_s_digest): add volatile to
protect temporary context object. [ruby-dev:27979]

* ext/iconv/iconv.c (Init_iconv): rb_gc_register_address() should
be called before actual variable initialization.
[ruby-dev:27986]

Sun Dec 11 22:07:58 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>

* test/rinda/test_rinda.rb (test_remote_array_and_hash): pseudo remote
Expand Down
4 changes: 2 additions & 2 deletions compar.c
Expand Up @@ -53,15 +53,15 @@ cmp_eq(VALUE *a)
{
VALUE c = rb_funcall(a[0], cmp, 1, a[1]);

if (NIL_P(c)) return Qnil;
if (NIL_P(c)) return Qfalse;
if (rb_cmpint(c, a[0], a[1]) == 0) return Qtrue;
return Qfalse;
}

static VALUE
cmp_failed(void)
{
return Qnil;
return Qfalse;
}

/*
Expand Down
2 changes: 1 addition & 1 deletion enum.c
Expand Up @@ -449,7 +449,7 @@ sort_by_cmp(const void *ap, const void *bp, void *data)
* values in <i>enum</i> through the given block.
*
* %w{ apple pear fig }.sort_by {|word| word.length}
#=> ["fig", "pear", "apple"]
#=> ["fig", "pear", "apple"]
*
* The current implementation of <code>sort_by</code> generates an
* array of tuples containing the original collection element and the
Expand Down
6 changes: 3 additions & 3 deletions eval.c
Expand Up @@ -7760,14 +7760,14 @@ rb_f_autoload_p(VALUE obj, VALUE sym)
void
Init_load(void)
{
rb_load_path = rb_ary_new();
rb_define_readonly_variable("$:", &rb_load_path);
rb_define_readonly_variable("$-I", &rb_load_path);
rb_define_readonly_variable("$LOAD_PATH", &rb_load_path);
rb_load_path = rb_ary_new();

rb_features = rb_ary_new();
rb_define_readonly_variable("$\"", &rb_features);
rb_define_readonly_variable("$LOADED_FEATURES", &rb_features);
rb_features = rb_ary_new();

rb_define_global_function("load", rb_f_load, -1);
rb_define_global_function("require", rb_f_require, 1);
Expand All @@ -7777,8 +7777,8 @@ Init_load(void)
rb_define_global_function("autoload?", rb_f_autoload_p, 1);
rb_global_variable(&ruby_wrapper);

ruby_dln_librefs = rb_ary_new();
rb_global_variable(&ruby_dln_librefs);
ruby_dln_librefs = rb_ary_new();
}

static void
Expand Down
92 changes: 25 additions & 67 deletions ext/digest/digest.c
Expand Up @@ -41,8 +41,7 @@ static ID id_metadata;
*/

static algo_t *
get_digest_base_metadata(klass)
VALUE klass;
get_digest_base_metadata(VALUE klass)
{
VALUE obj;
algo_t *algo;
Expand All @@ -58,10 +57,8 @@ get_digest_base_metadata(klass)
return algo;
}

static VALUE rb_digest_base_alloc _((VALUE));
static VALUE
rb_digest_base_alloc(klass)
VALUE klass;
rb_digest_base_alloc(VALUE klass)
{
algo_t *algo;
VALUE obj;
Expand All @@ -83,66 +80,47 @@ rb_digest_base_alloc(klass)
}

static VALUE
rb_digest_base_s_digest(klass, str)
VALUE klass;
VALUE str;
rb_digest_base_s_digest(VALUE klass, VALUE str)
{
algo_t *algo;
void *pctx;
size_t len;
unsigned char *digest;
VALUE obj = rb_digest_base_alloc(klass);
volatile VALUE obj = rb_digest_base_alloc(klass);

algo = get_digest_base_metadata(klass);
Data_Get_Struct(obj, void, pctx);

StringValue(str);
algo->update_func(pctx, RSTRING(str)->ptr, RSTRING(str)->len);

len = algo->digest_len;

digest = xmalloc(len);
algo->final_func(digest, pctx);

obj = rb_str_new(digest, len);

free(digest);
str = rb_str_new(0, algo->digest_len);
algo->final_func(RSTRING(str)->ptr, pctx);

return obj;
return str;
}

static VALUE
rb_digest_base_s_hexdigest(klass, str)
VALUE klass;
VALUE str;
rb_digest_base_s_hexdigest(VALUE klass, VALUE str)
{
algo_t *algo;
void *pctx;
size_t len;
unsigned char *hexdigest;
VALUE obj = rb_digest_base_alloc(klass);
volatile VALUE obj = rb_digest_base_alloc(klass);

algo = get_digest_base_metadata(klass);
Data_Get_Struct(obj, void, pctx);

StringValue(str);
algo->update_func(pctx, RSTRING(str)->ptr, RSTRING(str)->len);

len = algo->digest_len * 2;

hexdigest = xmalloc(len + 1); /* +1 is for '\0' */
algo->end_func(pctx, hexdigest);

obj = rb_str_new(hexdigest, len);
str = rb_str_new(0, algo->digest_len * 2);
algo->end_func(pctx, RSTRING(str)->ptr);

free(hexdigest);

return obj;
return str;
}

static VALUE
rb_digest_base_copy(copy, obj)
VALUE copy, obj;
rb_digest_base_copy(VALUE copy, VALUE obj)
{
algo_t *algo;
void *pctx1, *pctx2;
Expand All @@ -161,8 +139,7 @@ rb_digest_base_copy(copy, obj)
}

static VALUE
rb_digest_base_update(self, str)
VALUE self, str;
rb_digest_base_update(VALUE self, VALUE str)
{
algo_t *algo;
void *pctx;
Expand All @@ -177,10 +154,7 @@ rb_digest_base_update(self, str)
}

static VALUE
rb_digest_base_init(argc, argv, self)
int argc;
VALUE* argv;
VALUE self;
rb_digest_base_init(int argc, VALUE *argv, VALUE self)
{
VALUE arg;

Expand All @@ -192,8 +166,7 @@ rb_digest_base_init(argc, argv, self)
}

static VALUE
rb_digest_base_digest(self)
VALUE self;
rb_digest_base_digest(VALUE self)
{
algo_t *algo;
void *pctx1, *pctx2;
Expand All @@ -204,58 +177,43 @@ rb_digest_base_digest(self)
algo = get_digest_base_metadata(rb_obj_class(self));
Data_Get_Struct(self, void, pctx1);

len = algo->ctx_size;
str = rb_str_new(0, algo->digest_len);

len = algo->ctx_size;
pctx2 = xmalloc(len);
memcpy(pctx2, pctx1, len);

len = algo->digest_len;

digest = xmalloc(len);
algo->final_func(digest, pctx2);

str = rb_str_new(digest, len);

free(digest);
algo->final_func(RSTRING(str)->ptr, pctx2);
free(pctx2);

return str;
}

static VALUE
rb_digest_base_hexdigest(self)
VALUE self;
rb_digest_base_hexdigest(VALUE self)
{
algo_t *algo;
void *pctx1, *pctx2;
unsigned char *hexdigest;
size_t len;
VALUE str;

algo = get_digest_base_metadata(rb_obj_class(self));
Data_Get_Struct(self, void, pctx1);

len = algo->ctx_size;
str = rb_str_new(0, algo->digest_len * 2);

len = algo->ctx_size;
pctx2 = xmalloc(len);
memcpy(pctx2, pctx1, len);

len = algo->digest_len * 2;

hexdigest = xmalloc(len + 1); /* +1 is for '\0' */
algo->end_func(pctx2, hexdigest);

str = rb_str_new(hexdigest, len);

free(hexdigest);
algo->end_func(pctx2, RSTRING(str)->ptr);
free(pctx2);

return str;
}

static VALUE
rb_digest_base_equal(self, other)
VALUE self, other;
rb_digest_base_equal(VALUE self, VALUE other)
{
algo_t *algo;
VALUE klass;
Expand All @@ -282,7 +240,7 @@ rb_digest_base_equal(self, other)
str1 = rb_digest_base_hexdigest(self);

if (RSTRING(str1)->len == RSTRING(str2)->len
&& rb_str_cmp(str1, str2) == 0)
&& rb_str_cmp(str1, str2) == 0)
return Qtrue;

return Qfalse;
Expand Down
10 changes: 5 additions & 5 deletions ext/digest/digest.h
Expand Up @@ -15,11 +15,11 @@

#include "ruby.h"

typedef void (*hash_init_func_t) _((void *));
typedef void (*hash_update_func_t) _((void *, unsigned char *, size_t));
typedef void (*hash_end_func_t) _((void *, unsigned char *));
typedef void (*hash_final_func_t) _((unsigned char *, void *));
typedef int (*hash_equal_func_t) _((void *, void *));
typedef void (*hash_init_func_t)(void *);
typedef void (*hash_update_func_t)(void *, unsigned char *, size_t);
typedef void (*hash_end_func_t)(void *, unsigned char *);
typedef void (*hash_final_func_t)(unsigned char *, void *);
typedef int (*hash_equal_func_t)(void *, void *);

typedef struct {
size_t digest_len;
Expand Down
4 changes: 2 additions & 2 deletions ext/etc/etc.c
Expand Up @@ -521,6 +521,7 @@ Init_etc()
rb_define_module_function(mEtc, "endgrent", etc_endgrent, 0);
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);

rb_global_variable(&sPasswd);
sPasswd = rb_struct_define("Passwd",
"name", "passwd", "uid", "gid",
#ifdef HAVE_ST_PW_GECOS
Expand All @@ -546,14 +547,13 @@ Init_etc()
"expire",
#endif
NULL);
rb_global_variable(&sPasswd);

#ifdef HAVE_GETGRENT
rb_global_variable(&sGroup);
sGroup = rb_struct_define("Group", "name",
#ifdef HAVE_ST_GR_PASSWD
"passwd",
#endif
"gid", "mem", NULL);
rb_global_variable(&sGroup);
#endif
}
2 changes: 1 addition & 1 deletion ext/iconv/iconv.c
Expand Up @@ -1083,8 +1083,8 @@ Init_iconv(void)
id_transliterate = rb_intern("transliterate");
id_discard_ilseq = rb_intern("discard_ilseq");

charset_map = rb_hash_new();
rb_gc_register_address(&charset_map);
charset_map = rb_hash_new();
rb_define_singleton_method(rb_cIconv, "charset_map", charset_map_get, 0);
}

4 changes: 2 additions & 2 deletions ext/win32ole/win32ole.c
Expand Up @@ -6904,8 +6904,8 @@ folevariant_value(self)
void
Init_win32ole()
{
ary_ole_event = rb_ary_new();
rb_global_variable(&ary_ole_event);
ary_ole_event = rb_ary_new();
id_events = rb_intern("events");

com_vtbl.QueryInterface = QueryInterface;
Expand All @@ -6915,8 +6915,8 @@ Init_win32ole()
com_vtbl.GetTypeInfo = GetTypeInfo;
com_vtbl.GetIDsOfNames = GetIDsOfNames;
com_vtbl.Invoke = Invoke;
com_hash = Data_Wrap_Struct(rb_cData, rb_mark_hash, st_free_table, st_init_numtable());
rb_global_variable(&com_hash);
com_hash = Data_Wrap_Struct(rb_cData, rb_mark_hash, st_free_table, st_init_numtable());

cWIN32OLE = rb_define_class("WIN32OLE", rb_cObject);

Expand Down
12 changes: 10 additions & 2 deletions gc.c
Expand Up @@ -106,6 +106,12 @@ rb_memerror(void)
rb_exc_raise(nomem_error);
}

#ifdef RUBY_GC_DEBUG
int always_gc = 0;
#else
# define always_gc 0
#endif

void *
ruby_xmalloc(size_t size)
{
Expand All @@ -117,7 +123,7 @@ ruby_xmalloc(size_t size)
if (size == 0) size = 1;
malloc_increase += size;

if (malloc_increase > malloc_limit) {
if (always_gc || malloc_increase > malloc_limit) {
garbage_collect();
}
RUBY_CRITICAL(mem = malloc(size));
Expand Down Expand Up @@ -165,6 +171,7 @@ ruby_xrealloc(void *ptr, size_t size)
if (!ptr) return ruby_xmalloc(size);
if (size == 0) size = 1;
malloc_increase += size;
if (always_gc) garbage_collect();
RUBY_CRITICAL(mem = realloc(ptr, size));
if (!mem) {
if (garbage_collect()) {
Expand Down Expand Up @@ -394,7 +401,7 @@ rb_newobj(void)
{
VALUE obj;

if (!freelist && !garbage_collect())
if ((always_gc || !freelist) && !garbage_collect())
rb_memerror();

obj = (VALUE)freelist;
Expand Down Expand Up @@ -1018,6 +1025,7 @@ gc_sweep(void)
unsigned long live = 0;

mark_source_filename(ruby_sourcefile);
if (source_filenames)
st_foreach(source_filenames, sweep_source_filename, 0);

freelist = 0;
Expand Down

0 comments on commit 4d467a0

Please sign in to comment.