mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	ROBJECT_IV_INDEX_TBL: convert into an inline function
Former ROBJECT_IV_INDEX_TBL macro included RCLASS_IV_INDEX_TBL, which is not disclosed to extension libraies. The macro was kind of broken. Why not just deprecate it, and convert the internal use into an inline function.
This commit is contained in:
		
							parent
							
								
									e2c2283a80
								
							
						
					
					
						commit
						6649677eb9
					
				
				
				Notes:
				
					git
				
				2020-08-19 14:31:23 +09:00 
				
			
			
			
		
		
					 5 changed files with 55 additions and 5 deletions
				
			
		|  | @ -27,6 +27,7 @@ | |||
| #endif | ||||
| 
 | ||||
| #include "ruby/internal/attr/artificial.h" | ||||
| #include "ruby/internal/attr/deprecated.h" | ||||
| #include "ruby/internal/attr/pure.h" | ||||
| #include "ruby/internal/cast.h" | ||||
| #include "ruby/internal/fl_type.h" | ||||
|  | @ -39,24 +40,31 @@ | |||
| /** @cond INTERNAL_MACRO */ | ||||
| #define ROBJECT_NUMIV         ROBJECT_NUMIV | ||||
| #define ROBJECT_IVPTR         ROBJECT_IVPTR | ||||
| #define ROBJECT_IV_INDEX_TBL  ROBJECT_IV_INDEX_TBL | ||||
| /** @endcond */ | ||||
| 
 | ||||
| enum ruby_robject_flags { ROBJECT_EMBED = RUBY_FL_USER1 }; | ||||
| 
 | ||||
| enum ruby_robject_consts { ROBJECT_EMBED_LEN_MAX = RBIMPL_EMBED_LEN_MAX_OF(VALUE) }; | ||||
| 
 | ||||
| struct st_table; | ||||
| 
 | ||||
| struct RObject { | ||||
|     struct RBasic basic; | ||||
|     union { | ||||
|         struct { | ||||
|             uint32_t numiv; | ||||
|             VALUE *ivptr; | ||||
|             void *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */ | ||||
|             struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */ | ||||
|         } heap; | ||||
|         VALUE ary[ROBJECT_EMBED_LEN_MAX]; | ||||
|     } as; | ||||
| }; | ||||
| 
 | ||||
| RBIMPL_SYMBOL_EXPORT_BEGIN() | ||||
| struct st_table *rb_obj_iv_index_tbl(const struct RObject *obj); | ||||
| RBIMPL_SYMBOL_EXPORT_END() | ||||
| 
 | ||||
| RBIMPL_ATTR_PURE_UNLESS_DEBUG() | ||||
| RBIMPL_ATTR_ARTIFICIAL() | ||||
| static inline uint32_t | ||||
|  | @ -89,9 +97,17 @@ ROBJECT_IVPTR(VALUE obj) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| #define ROBJECT_IV_INDEX_TBL(o) \ | ||||
|     ((RBASIC(o)->flags & ROBJECT_EMBED) ? \ | ||||
|      RCLASS_IV_INDEX_TBL(rb_obj_class(o)) : \ | ||||
|      ROBJECT(o)->as.heap.iv_index_tbl) | ||||
| RBIMPL_ATTR_DEPRECATED(("Whoever have used it before?  Just tell us so.  We can stop deleting it.")) | ||||
| RBIMPL_ATTR_PURE_UNLESS_DEBUG() | ||||
| RBIMPL_ATTR_ARTIFICIAL() | ||||
| static inline struct st_table * | ||||
| ROBJECT_IV_INDEX_TBL(VALUE obj) | ||||
| { | ||||
|     RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT); | ||||
| 
 | ||||
|     struct RObject *const ptr = ROBJECT(obj); | ||||
| 
 | ||||
|     return rb_obj_iv_index_tbl(ptr); | ||||
| } | ||||
| 
 | ||||
| #endif /* RBIMPL_ROBJECT_H */ | ||||
|  |  | |||
|  | @ -47,6 +47,9 @@ | |||
| #undef RHASH_IFNONE | ||||
| #undef RHASH_SIZE | ||||
| 
 | ||||
| /* internal/object.h */ | ||||
| #undef ROBJECT_IV_INDEX_TBL | ||||
| 
 | ||||
| /* internal/struct.h */ | ||||
| #undef RSTRUCT_LEN | ||||
| #undef RSTRUCT_PTR | ||||
|  |  | |||
|  | @ -10,6 +10,11 @@ | |||
|  * @brief      Internal header for Object. | ||||
|  */ | ||||
| #include "ruby/ruby.h"          /* for VALUE */ | ||||
| #include "internal/class.h"     /* for RCLASS_IV_INDEX_TBL */ | ||||
| 
 | ||||
| #ifdef ROBJECT_IV_INDEX_TBL | ||||
| # undef ROBJECT_IV_INDEX_TBL | ||||
| #endif | ||||
| 
 | ||||
| /* object.c */ | ||||
| VALUE rb_class_search_ancestor(VALUE klass, VALUE super); | ||||
|  | @ -22,6 +27,7 @@ int rb_bool_expected(VALUE, const char *); | |||
| static inline void RBASIC_CLEAR_CLASS(VALUE obj); | ||||
| static inline void RBASIC_SET_CLASS_RAW(VALUE obj, VALUE klass); | ||||
| static inline void RBASIC_SET_CLASS(VALUE obj, VALUE klass); | ||||
| static inline struct st_table *ROBJECT_IV_INDEX_TBL_inline(VALUE obj); | ||||
| 
 | ||||
| RUBY_SYMBOL_EXPORT_BEGIN | ||||
| /* object.c (export) */ | ||||
|  | @ -58,4 +64,20 @@ RBASIC_SET_CLASS(VALUE obj, VALUE klass) | |||
|     RBASIC_SET_CLASS_RAW(obj, klass); | ||||
|     RB_OBJ_WRITTEN(obj, oldv, klass); | ||||
| } | ||||
| 
 | ||||
| RBIMPL_ATTR_PURE() | ||||
| static inline struct st_table * | ||||
| ROBJECT_IV_INDEX_TBL_inline(VALUE obj) | ||||
| { | ||||
|     if (RB_FL_ANY_RAW(obj, ROBJECT_EMBED)) { | ||||
|         VALUE klass = rb_obj_class(obj); | ||||
|         return RCLASS_IV_INDEX_TBL(klass); | ||||
|     } | ||||
|     else { | ||||
|         const struct RObject *const ptr = ROBJECT(obj); | ||||
|         return ptr->as.heap.iv_index_tbl; | ||||
|     } | ||||
| } | ||||
| #define ROBJECT_IV_INDEX_TBL ROBJECT_IV_INDEX_TBL_inline | ||||
| 
 | ||||
| #endif /* INTERNAL_OBJECT_H */ | ||||
|  |  | |||
							
								
								
									
										8
									
								
								object.c
									
										
									
									
									
								
							
							
						
						
									
										8
									
								
								object.c
									
										
									
									
									
								
							|  | @ -320,6 +320,14 @@ rb_obj_singleton_class(VALUE obj) | |||
|     return rb_singleton_class(obj); | ||||
| } | ||||
| 
 | ||||
| struct st_table * | ||||
| rb_obj_iv_index_tbl(const struct RObject *obj) | ||||
| { | ||||
|     /* This is a function that practically never gets used.  Just to keep
 | ||||
|      * backwards compatibility to ruby 2.x. */ | ||||
|     return ROBJECT_IV_INDEX_TBL((VALUE)obj); | ||||
| } | ||||
| 
 | ||||
| /*! \private */ | ||||
| MJIT_FUNC_EXPORTED void | ||||
| rb_obj_copy_ivar(VALUE dest, VALUE obj) | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ | |||
| #include "internal/error.h" | ||||
| #include "internal/eval.h" | ||||
| #include "internal/hash.h" | ||||
| #include "internal/object.h" | ||||
| #include "internal/re.h" | ||||
| #include "internal/symbol.h" | ||||
| #include "internal/thread.h" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 卜部昌平
						卜部昌平