mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
merge revision(s) r44568: [Backport #9399]
* iseq.c (iseq_load): keep type_map to get rid of memory leak. based on a patch by Eric Wong at [ruby-core:59699]. [Bug #9399] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@45108 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f38ceeacd6
commit
1f133813d0
4 changed files with 19 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Sat Feb 22 14:01:42 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* iseq.c (iseq_load): keep type_map to get rid of memory leak.
|
||||||
|
based on a patch by Eric Wong at [ruby-core:59699]. [Bug #9399]
|
||||||
|
|
||||||
Sat Feb 22 13:56:38 2014 Charlie Somerville <charliesome@ruby-lang.org>
|
Sat Feb 22 13:56:38 2014 Charlie Somerville <charliesome@ruby-lang.org>
|
||||||
|
|
||||||
* compile.c (iseq_build_from_ary_body): Use :blockptr instead of :block
|
* compile.c (iseq_build_from_ary_body): Use :blockptr instead of :block
|
||||||
|
|
8
iseq.c
8
iseq.c
|
@ -480,6 +480,7 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
|
||||||
VALUE type, body, locals, args, exception;
|
VALUE type, body, locals, args, exception;
|
||||||
|
|
||||||
st_data_t iseq_type;
|
st_data_t iseq_type;
|
||||||
|
static struct st_table *type_map_cache = 0;
|
||||||
struct st_table *type_map = 0;
|
struct st_table *type_map = 0;
|
||||||
rb_iseq_t *iseq;
|
rb_iseq_t *iseq;
|
||||||
rb_compile_option_t option;
|
rb_compile_option_t option;
|
||||||
|
@ -519,7 +520,9 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
|
||||||
GetISeqPtr(iseqval, iseq);
|
GetISeqPtr(iseqval, iseq);
|
||||||
iseq->self = iseqval;
|
iseq->self = iseqval;
|
||||||
|
|
||||||
|
type_map = type_map_cache;
|
||||||
if (type_map == 0) {
|
if (type_map == 0) {
|
||||||
|
struct st_table *cached_map;
|
||||||
type_map = st_init_numtable();
|
type_map = st_init_numtable();
|
||||||
st_insert(type_map, ID2SYM(rb_intern("top")), ISEQ_TYPE_TOP);
|
st_insert(type_map, ID2SYM(rb_intern("top")), ISEQ_TYPE_TOP);
|
||||||
st_insert(type_map, ID2SYM(rb_intern("method")), ISEQ_TYPE_METHOD);
|
st_insert(type_map, ID2SYM(rb_intern("method")), ISEQ_TYPE_METHOD);
|
||||||
|
@ -530,6 +533,11 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
|
||||||
st_insert(type_map, ID2SYM(rb_intern("eval")), ISEQ_TYPE_EVAL);
|
st_insert(type_map, ID2SYM(rb_intern("eval")), ISEQ_TYPE_EVAL);
|
||||||
st_insert(type_map, ID2SYM(rb_intern("main")), ISEQ_TYPE_MAIN);
|
st_insert(type_map, ID2SYM(rb_intern("main")), ISEQ_TYPE_MAIN);
|
||||||
st_insert(type_map, ID2SYM(rb_intern("defined_guard")), ISEQ_TYPE_DEFINED_GUARD);
|
st_insert(type_map, ID2SYM(rb_intern("defined_guard")), ISEQ_TYPE_DEFINED_GUARD);
|
||||||
|
cached_map = ATOMIC_PTR_CAS(type_map_cache, (struct st_table *)0, type_map);
|
||||||
|
if (cached_map) {
|
||||||
|
st_free_table(type_map);
|
||||||
|
type_map = cached_map;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (st_lookup(type_map, type, &iseq_type) == 0) {
|
if (st_lookup(type_map, type, &iseq_type) == 0) {
|
||||||
|
|
|
@ -161,5 +161,10 @@ atomic_size_exchange(size_t *ptr, size_t val)
|
||||||
# define ATOMIC_PTR_EXCHANGE(var, val) (void *)ATOMIC_SIZE_EXCHANGE(*(size_t *)&(var), (size_t)(val))
|
# define ATOMIC_PTR_EXCHANGE(var, val) (void *)ATOMIC_SIZE_EXCHANGE(*(size_t *)&(var), (size_t)(val))
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef ATOMIC_PTR_CAS
|
||||||
|
# if SIZEOF_VOIDP == SIZEOF_SIZE_T
|
||||||
|
# define ATOMIC_PTR_CAS(var, oldval, val) (void *)ATOMIC_SIZE_CAS(*(size_t *)&(var), (size_t)(oldval), (size_t)(val))
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* RUBY_ATOMIC_H */
|
#endif /* RUBY_ATOMIC_H */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#define RUBY_VERSION "2.0.0"
|
#define RUBY_VERSION "2.0.0"
|
||||||
#define RUBY_RELEASE_DATE "2014-02-22"
|
#define RUBY_RELEASE_DATE "2014-02-22"
|
||||||
#define RUBY_PATCHLEVEL 448
|
#define RUBY_PATCHLEVEL 449
|
||||||
|
|
||||||
#define RUBY_RELEASE_YEAR 2014
|
#define RUBY_RELEASE_YEAR 2014
|
||||||
#define RUBY_RELEASE_MONTH 2
|
#define RUBY_RELEASE_MONTH 2
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue