From 6649677eb93a101a5411a942ca1b84b541262537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?= Date: Mon, 17 Aug 2020 13:51:23 +0900 Subject: 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. --- internal/object.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'internal') diff --git a/internal/object.h b/internal/object.h index d34f498ee1..aa820128c7 100644 --- a/internal/object.h +++ b/internal/object.h @@ -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 */ -- cgit v1.2.3