<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ruby.git/method.h, branch v2_1_7</title>
<subtitle>The Ruby Programming Language</subtitle>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/'/>
<entry>
<title>merge revision(s) r49222,r49480,r49493: [Backport #10765]</title>
<updated>2015-03-17T16:12:28+00:00</updated>
<author>
<name>nagachika</name>
<email>nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2015-03-17T16:12:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=c4b21f736ebb339fc46760f800851a7eed444c47'/>
<id>c4b21f736ebb339fc46760f800851a7eed444c47</id>
<content type='text'>
	method.h: UNDEFINED_REFINED_METHOD_P

	* method.h (UNDEFINED_REFINED_METHOD_P): macro to tell if refined
  original method is defined.
	* vm_method.c (remove_method): When remove refined
	  method, raise a NameError if the method is not
	  defined in refined class.
	
	  But if the method is defined in refined class,
	  it should keep refined method and remove original
	  method.
	  
	  Patch by Seiei Higa. [ruby-core:67722] [Bug #10765]

	* class.c (method_entry_i, class_instance_method_list,
	  rb_obj_singleton_methods): should not include methods of
	  superclasses if recur is false. [ruby-dev:48854] [Bug #10826]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@49992 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
	method.h: UNDEFINED_REFINED_METHOD_P

	* method.h (UNDEFINED_REFINED_METHOD_P): macro to tell if refined
  original method is defined.
	* vm_method.c (remove_method): When remove refined
	  method, raise a NameError if the method is not
	  defined in refined class.
	
	  But if the method is defined in refined class,
	  it should keep refined method and remove original
	  method.
	  
	  Patch by Seiei Higa. [ruby-core:67722] [Bug #10765]

	* class.c (method_entry_i, class_instance_method_list,
	  rb_obj_singleton_methods): should not include methods of
	  superclasses if recur is false. [ruby-dev:48854] [Bug #10826]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@49992 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>* include/ruby/ruby.h (struct RClass): Add wrapper struct around</title>
<updated>2013-12-03T08:11:07+00:00</updated>
<author>
<name>tmm1</name>
<email>tmm1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-12-03T08:11:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=084b602d9a52b62a04d17f65ba1a9b8a767d1e3e'/>
<id>084b602d9a52b62a04d17f65ba1a9b8a767d1e3e</id>
<content type='text'>
  RClass-&gt;m_tbl with serial. This prevents double marking method
  tables, since many classes/modules can share the same method table.
  This improves minor mark time in a large application by 30%.
* internal.h (struct method_table_wrapper): Define new
  wrapper struct with additional serial.
* internal.h (RCLASS_M_TBL_INIT): New macro for initializing method
  table wrapper and st_table.
* method.h (void rb_sweep_method_entry): Rename rb_free_m_table to
  rb_free_m_tbl for consistentcy
* .gdbinit (define rb_method_entry): Update rb_method_entry gdb helper
  for new method table structure.
* class.c: Use RCLASS_M_TBL_WRAPPER and
  RCLASS_M_TBL_INIT macros.
* class.c (rb_include_class_new): Share WRAPPER between module and
  iclass, so serial can prevent double marking.
* eval.c (rb_prepend_module): ditto.
* eval.c (rb_using_refinement): ditto.
* gc.c: Mark and free new wrapper struct.
* gc.c (obj_memsize_of): Count size of additional wrapper struct.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43973 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  RClass-&gt;m_tbl with serial. This prevents double marking method
  tables, since many classes/modules can share the same method table.
  This improves minor mark time in a large application by 30%.
* internal.h (struct method_table_wrapper): Define new
  wrapper struct with additional serial.
* internal.h (RCLASS_M_TBL_INIT): New macro for initializing method
  table wrapper and st_table.
* method.h (void rb_sweep_method_entry): Rename rb_free_m_table to
  rb_free_m_tbl for consistentcy
* .gdbinit (define rb_method_entry): Update rb_method_entry gdb helper
  for new method table structure.
* class.c: Use RCLASS_M_TBL_WRAPPER and
  RCLASS_M_TBL_INIT macros.
* class.c (rb_include_class_new): Share WRAPPER between module and
  iclass, so serial can prevent double marking.
* eval.c (rb_prepend_module): ditto.
* eval.c (rb_using_refinement): ditto.
* gc.c: Mark and free new wrapper struct.
* gc.c (obj_memsize_of): Count size of additional wrapper struct.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43973 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>	* vm_core.h (enum): avoid syntax error.</title>
<updated>2013-10-22T12:59:27+00:00</updated>
<author>
<name>shyouhei</name>
<email>shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-10-22T12:59:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=ec6f077809d87aa3f529e0fc233297653608a283'/>
<id>ec6f077809d87aa3f529e0fc233297653608a283</id>
<content type='text'>
	* method.h: ditto.

	* internal.h: ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
	* method.h: ditto.

	* internal.h: ditto.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43390 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>* class.c (class_alloc): remove mc_tbl</title>
<updated>2013-09-24T05:02:13+00:00</updated>
<author>
<name>charliesome</name>
<email>charliesome@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-09-24T05:02:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=f088828106254ebb0d07b0385966692c3f938c0c'/>
<id>f088828106254ebb0d07b0385966692c3f938c0c</id>
<content type='text'>
* gc.c (obj_free): ditto

* internal.h (struct rb_classext_struct): ditto

* method.h (rb_method_entry): remove ent param

* vm_method.c: restore the global method cache. Per class cache tables
  turned out to be far too slow.

  [ruby-core:57289] [Bug #8930]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43027 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* gc.c (obj_free): ditto

* internal.h (struct rb_classext_struct): ditto

* method.h (rb_method_entry): remove ent param

* vm_method.c: restore the global method cache. Per class cache tables
  turned out to be far too slow.

  [ruby-core:57289] [Bug #8930]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43027 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>vm_method.c: constify</title>
<updated>2013-09-10T03:39:28+00:00</updated>
<author>
<name>nobu</name>
<email>nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-09-10T03:39:28+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=9d9dfc217240613e6e64f314d888b94fd9c80a4e'/>
<id>9d9dfc217240613e6e64f314d888b94fd9c80a4e</id>
<content type='text'>
* vm_method.c (rb_resolve_refined_method): constify.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42902 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* vm_method.c (rb_resolve_refined_method): constify.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42902 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>* class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,</title>
<updated>2013-09-04T05:25:06+00:00</updated>
<author>
<name>charliesome</name>
<email>charliesome@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-09-04T05:25:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=2f522b9cc6f3e184404040b12af4486520a73b26'/>
<id>2f522b9cc6f3e184404040b12af4486520a73b26</id>
<content type='text'>
  variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
  vm_method.c: Implement class hierarchy method cache invalidation.

  [ruby-core:55053] [Feature #8426] [GH-387]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
  vm_method.c: Implement class hierarchy method cache invalidation.

  [ruby-core:55053] [Feature #8426] [GH-387]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42822 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>* class.c, include/ruby/ruby.h: add write barriers for T_CLASS,</title>
<updated>2013-06-14T09:23:54+00:00</updated>
<author>
<name>ko1</name>
<email>ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-06-14T09:23:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=87a120fbdc25544135e8d625e8dc11950b7245a3'/>
<id>87a120fbdc25544135e8d625e8dc11950b7245a3</id>
<content type='text'>
  T_MODULE, T_ICLASS.
* constant.h: constify rb_const_entry_t::value and file to detect
  assignment.
* variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy):
  added. update table with write barrier.
* method.h: constify some variables to detect assignment.
* object.c (init_copy): add WBs.
* variable.c: ditto.
* vm_method.c (rb_add_method): ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  T_MODULE, T_ICLASS.
* constant.h: constify rb_const_entry_t::value and file to detect
  assignment.
* variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy):
  added. update table with write barrier.
* method.h: constify some variables to detect assignment.
* object.c (init_copy): add WBs.
* variable.c: ditto.
* vm_method.c (rb_add_method): ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@41299 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>vm_method.c: rb_method_entry_at</title>
<updated>2013-05-13T05:51:14+00:00</updated>
<author>
<name>nobu</name>
<email>nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-05-13T05:51:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=304850801475722c686e31c93f82e18ede93ba05'/>
<id>304850801475722c686e31c93f82e18ede93ba05</id>
<content type='text'>
* vm_method.c (rb_method_entry_at): return the method entry for id at
  klass, without ancestors.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40683 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* vm_method.c (rb_method_entry_at): return the method entry for id at
  klass, without ancestors.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40683 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>vm_method.c: show respond_to location</title>
<updated>2013-02-06T04:35:23+00:00</updated>
<author>
<name>nobu</name>
<email>nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2013-02-06T04:35:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=6eb76ba664a7ea1dc2b6804a0f2280e1f7531c53'/>
<id>6eb76ba664a7ea1dc2b6804a0f2280e1f7531c53</id>
<content type='text'>
* proc.c (rb_method_entry_location, rb_{mod,obj}_method_location): new
  functions to obtain source location of method definition.
* vm_method.c (rb_obj_respond_to): show the location of old style
  respond_to? method.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* proc.c (rb_method_entry_location, rb_{mod,obj}_method_location): new
  functions to obtain source location of method definition.
* vm_method.c (rb_obj_respond_to): show the location of old style
  respond_to? method.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39089 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
<entry>
<title>* method.h: remove `VM_METHOD_TYPE_CFUNC_FRAMELESS' method type.</title>
<updated>2012-12-17T22:04:12+00:00</updated>
<author>
<name>ko1</name>
<email>ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e</email>
</author>
<published>2012-12-17T22:04:12+00:00</published>
<link rel='alternate' type='text/html' href='https://git.ruby-lang.org/ruby.git/commit/?id=256c5f257743401d4ee7e2ba756ef2ffd22e4d7a'/>
<id>256c5f257743401d4ee7e2ba756ef2ffd22e4d7a</id>
<content type='text'>
  This method type is for optimized CFUNC such as Fixnum#+ and so on.
  This feature is half-baked and no way to use them.
  [Background]
  Now, VM has opt_plus instructions to optimize `+' methods for
  some Classes (such as Fixnum, Float (flonum)). We call this
  type of instructions as `specialized instructions'.
  This simple technique improve simple program dramatically.
  However, we can make specialized instructions for only several
  types (classes) and selectors (method names) because a large
  instruction will be slow. In other words, this technique has no
  extensibility.
  To overcome this problem, VM_METHOD_TYPE_CFUNC_FRAMELESS was
  introduced (r37198). This type is a variant of CFUNC, but called
  their functiions directly without building a method frame.
  Any CFUNC method can be defined as frameless methods if a method
  is not needed to make method frame. Frameless methods are faster
  as specialized instructions (a bit slower, but no need to care).
  No problem described at
  http://charlie.bz/blog/why-do-singleton-methods-make-ruby-slow
  because this technique doesn't see class, but see method body
  itself. Alias is also no problem.
  [Problem]
  However, we can't set frameless method type for polymorphic methods
  such as Array#[]. Necessity for method frame depends on which
  parameter type. For example, Fixnum#+ needs method frame if
  coerce is needed. Current VM_METHOD_TYPE_CFUNC_FRAMELESS is not
  flexible and need more tuning to introduce it.
  Expected behavior of frameless method type may be:
  result = optimized_cfunc(params); /* call optimized cfunc */
  if (result == Qundef) { result = normal_cfunc(); }
  This is why I say this feature is half-baked.
  We need to learn primitive method in Smalltalk more.
  (I heard this name at RubyConf Taiwan this month. Thanks!)
  [Conclusion]
  Nobody may use this feature and there is no compatibility issue.
  This feature goes to next minor (2.1?).
* proc.c (rb_method_entry_arity): ditto.
* vm_eval.c, vm_insnhelper.c, vm_method.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
  This method type is for optimized CFUNC such as Fixnum#+ and so on.
  This feature is half-baked and no way to use them.
  [Background]
  Now, VM has opt_plus instructions to optimize `+' methods for
  some Classes (such as Fixnum, Float (flonum)). We call this
  type of instructions as `specialized instructions'.
  This simple technique improve simple program dramatically.
  However, we can make specialized instructions for only several
  types (classes) and selectors (method names) because a large
  instruction will be slow. In other words, this technique has no
  extensibility.
  To overcome this problem, VM_METHOD_TYPE_CFUNC_FRAMELESS was
  introduced (r37198). This type is a variant of CFUNC, but called
  their functiions directly without building a method frame.
  Any CFUNC method can be defined as frameless methods if a method
  is not needed to make method frame. Frameless methods are faster
  as specialized instructions (a bit slower, but no need to care).
  No problem described at
  http://charlie.bz/blog/why-do-singleton-methods-make-ruby-slow
  because this technique doesn't see class, but see method body
  itself. Alias is also no problem.
  [Problem]
  However, we can't set frameless method type for polymorphic methods
  such as Array#[]. Necessity for method frame depends on which
  parameter type. For example, Fixnum#+ needs method frame if
  coerce is needed. Current VM_METHOD_TYPE_CFUNC_FRAMELESS is not
  flexible and need more tuning to introduce it.
  Expected behavior of frameless method type may be:
  result = optimized_cfunc(params); /* call optimized cfunc */
  if (result == Qundef) { result = normal_cfunc(); }
  This is why I say this feature is half-baked.
  We need to learn primitive method in Smalltalk more.
  (I heard this name at RubyConf Taiwan this month. Thanks!)
  [Conclusion]
  Nobody may use this feature and there is no compatibility issue.
  This feature goes to next minor (2.1?).
* proc.c (rb_method_entry_arity): ditto.
* vm_eval.c, vm_insnhelper.c, vm_method.c: ditto.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38431 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
</pre>
</div>
</content>
</entry>
</feed>
