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>
|
Tue Aug 18 22:52:50 2015 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* tool/downloader.rb: support old versions of ruby.
|
* tool/downloader.rb: support old versions of ruby.
|
||||||
|
|
19
insns.def
19
insns.def
|
@ -914,6 +914,8 @@ defineclass
|
||||||
(VALUE val)
|
(VALUE val)
|
||||||
{
|
{
|
||||||
VALUE klass;
|
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);
|
rb_vm_defineclass_type_t type = VM_DEFINECLASS_TYPE(flags);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -963,7 +965,18 @@ defineclass
|
||||||
case VM_DEFINECLASS_TYPE_SINGLETON_CLASS:
|
case VM_DEFINECLASS_TYPE_SINGLETON_CLASS:
|
||||||
/* val is dummy. classdef returns class scope value */
|
/* val is dummy. classdef returns class scope value */
|
||||||
/* super is dummy */
|
/* 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;
|
break;
|
||||||
case VM_DEFINECLASS_TYPE_MODULE:
|
case VM_DEFINECLASS_TYPE_MODULE:
|
||||||
/* val is dummy. classdef returns class scope value */
|
/* 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));
|
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 */
|
/* enter scope */
|
||||||
vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS,
|
vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS,
|
||||||
klass, 0, VM_ENVVAL_BLOCK_PTR(GET_BLOCK_PTR()),
|
klass, 0, VM_ENVVAL_BLOCK_PTR(GET_BLOCK_PTR()),
|
||||||
class_iseq->iseq_encoded, GET_SP(),
|
class_iseq->iseq_encoded, GET_SP(),
|
||||||
class_iseq->local_size, 0, class_iseq->stack_max);
|
class_iseq->local_size, 0, class_iseq->stack_max);
|
||||||
|
|
||||||
|
RB_GC_GUARD(class_iseq_val);
|
||||||
|
|
||||||
RESTORE_REGS();
|
RESTORE_REGS();
|
||||||
NEXT_INSN();
|
NEXT_INSN();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#define RUBY_VERSION "2.2.4"
|
#define RUBY_VERSION "2.2.4"
|
||||||
#define RUBY_RELEASE_DATE "2015-08-19"
|
#define RUBY_RELEASE_DATE "2015-08-25"
|
||||||
#define RUBY_PATCHLEVEL 174
|
#define RUBY_PATCHLEVEL 175
|
||||||
|
|
||||||
#define RUBY_RELEASE_YEAR 2015
|
#define RUBY_RELEASE_YEAR 2015
|
||||||
#define RUBY_RELEASE_MONTH 8
|
#define RUBY_RELEASE_MONTH 8
|
||||||
#define RUBY_RELEASE_DAY 19
|
#define RUBY_RELEASE_DAY 25
|
||||||
|
|
||||||
#include "ruby/version.h"
|
#include "ruby/version.h"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue