mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* insns.def (defineclass): introduce an ad-hoc patch to avoid
an issue reported on [Bug #10871]. This patch does not fix completely. For example, method definition in a block (like 1.times{def ...; end}) still causes same issue. To solve all, we need a huge patch and it seems difficult for stable branch. Use Ruby 2.3 and later to solve this issue completely. (See [Bug #10943]) git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_2@51673 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
6a13cf0052
commit
d93cfe5d9e
3 changed files with 36 additions and 4 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
Tue Aug 25 01:01:01 2015 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* insns.def (defineclass): introduce an ad-hoc patch to avoid
|
||||
an issue reported on [Bug #10871].
|
||||
|
||||
This patch does not fix completely. For example, method definition
|
||||
in a block (like 1.times{def ...; end}) still causes same issue.
|
||||
To solve all, we need a huge patch and it seems difficult for
|
||||
stable branch.
|
||||
|
||||
Use Ruby 2.3 and later to solve this issue completely.
|
||||
(See [Bug #10943])
|
||||
|
||||
Tue Aug 18 22:52:50 2015 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||
|
||||
* tool/downloader.rb: support old versions of ruby.
|
||||
|
|
21
insns.def
21
insns.def
|
@ -914,6 +914,8 @@ defineclass
|
|||
(VALUE val)
|
||||
{
|
||||
VALUE klass;
|
||||
VALUE class_iseq_val = class_iseq->self;
|
||||
rb_iseq_t *orig_class_iseq = NULL;
|
||||
rb_vm_defineclass_type_t type = VM_DEFINECLASS_TYPE(flags);
|
||||
|
||||
switch (type) {
|
||||
|
@ -963,7 +965,18 @@ defineclass
|
|||
case VM_DEFINECLASS_TYPE_SINGLETON_CLASS:
|
||||
/* val is dummy. classdef returns class scope value */
|
||||
/* super is dummy */
|
||||
klass = rb_singleton_class(cbase);
|
||||
{
|
||||
klass = rb_singleton_class(cbase);
|
||||
|
||||
/* Copy iseq to duplicate cref_stack place.
|
||||
* This is ad-hoc solution for [Bug #10871].
|
||||
* and this does not solve more complicated source code with singleton class.
|
||||
* If you need to solve everything, use Ruby 2.3 and later.
|
||||
*/
|
||||
orig_class_iseq = class_iseq;
|
||||
class_iseq_val = rb_iseq_clone(class_iseq->self, cbase);
|
||||
GetISeqPtr(class_iseq_val, class_iseq);
|
||||
}
|
||||
break;
|
||||
case VM_DEFINECLASS_TYPE_MODULE:
|
||||
/* val is dummy. classdef returns class scope value */
|
||||
|
@ -992,12 +1005,18 @@ defineclass
|
|||
}
|
||||
|
||||
COPY_CREF(class_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC, NULL));
|
||||
if (orig_class_iseq) {
|
||||
COPY_CREF(orig_class_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC, NULL));
|
||||
}
|
||||
|
||||
/* enter scope */
|
||||
vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS,
|
||||
klass, 0, VM_ENVVAL_BLOCK_PTR(GET_BLOCK_PTR()),
|
||||
class_iseq->iseq_encoded, GET_SP(),
|
||||
class_iseq->local_size, 0, class_iseq->stack_max);
|
||||
|
||||
RB_GC_GUARD(class_iseq_val);
|
||||
|
||||
RESTORE_REGS();
|
||||
NEXT_INSN();
|
||||
}
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
#define RUBY_VERSION "2.2.4"
|
||||
#define RUBY_RELEASE_DATE "2015-08-19"
|
||||
#define RUBY_PATCHLEVEL 174
|
||||
#define RUBY_RELEASE_DATE "2015-08-25"
|
||||
#define RUBY_PATCHLEVEL 175
|
||||
|
||||
#define RUBY_RELEASE_YEAR 2015
|
||||
#define RUBY_RELEASE_MONTH 8
|
||||
#define RUBY_RELEASE_DAY 19
|
||||
#define RUBY_RELEASE_DAY 25
|
||||
|
||||
#include "ruby/version.h"
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue