aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2019-07-19 14:37:59 +0900
committerKoichi Sasada <ko1@atdot.net>2019-07-19 14:41:36 +0900
commitae750799c1b28b06d02e50cd26450b9903516526 (patch)
treebc481e13362b188265911dcbf9b11488bc0c20e4 /array.c
parenta44ad9a1451eb86385339cfd72713ff764f1c820 (diff)
downloadruby-ae750799c1b28b06d02e50cd26450b9903516526.tar.gz
Use FL_TEST_RAW() to check flags.
FL_TEST() uses FL_ABLE() which test data types. However, in array.c we don't need to check it (all of them should be T_ARRAY), so I changed from FL_TEST() to FL_TEST_RAW() which does not check FL_ABLE(). Instead of FL_ABLE(), add assertion to check given object is a T_ARRAY object. For example, rb_ary_free() becomes slim: with FL_TEST(): 0000000000006a30 <rb_ary_free>: 6a30: 40 f6 c7 07 test $0x7,%dil 6a34: 48 8b 07 mov (%rdi),%rax 6a37: 75 09 jne 6a42 <rb_ary_free+0x12> 6a39: 48 f7 c7 f7 ff ff ff test $0xfffffffffffffff7,%rdi 6a40: 75 1e jne 6a60 <rb_ary_free+0x30> 6a42: a9 00 00 00 02 test $0x2000000,%eax 6a47: 74 07 je 6a50 <rb_ary_free+0x20> 6a49: f3 c3 repz retq 6a4b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 6a50: 48 8b 7f 20 mov 0x20(%rdi),%rdi 6a54: e9 00 00 00 00 jmpq 6a59 <rb_ary_free+0x29> 6a59: 0f 1f 80 00 00 00 00 nopl 0x0(%rax) 6a60: 89 c2 mov %eax,%edx 6a62: 83 e2 1f and $0x1f,%edx 6a65: 83 fa 1b cmp $0x1b,%edx 6a68: 74 d8 je 6a42 <rb_ary_free+0x12> 6a6a: f6 c4 60 test $0x60,%ah 6a6d: 74 d3 je 6a42 <rb_ary_free+0x12> 6a6f: eb d8 jmp 6a49 <rb_ary_free+0x19>``` with FL_TEST_RAW(): 0000000000006a30 <rb_ary_free>: 6a30: 48 f7 07 00 60 00 02 testq $0x2006000,(%rdi) 6a37: 74 07 je 6a40 <rb_ary_free+0x10> 6a39: f3 c3 repz retq 6a3b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 6a40: 48 8b 7f 20 mov 0x20(%rdi),%rdi 6a44: e9 00 00 00 00 jmpq 6a49 <rb_ary_free+0x19>
Diffstat (limited to 'array.c')
-rw-r--r--array.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/array.c b/array.c
index f46bc55481..ffeb884134 100644
--- a/array.c
+++ b/array.c
@@ -34,16 +34,20 @@ VALUE rb_cArray;
#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))
#define SMALL_ARRAY_LEN 16
-# define ARY_SHARED_P(ary) \
- (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
- FL_TEST((ary),ELTS_SHARED)!=0)
-# define ARY_EMBED_P(ary) \
- (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
- FL_TEST((ary), RARRAY_EMBED_FLAG)!=0)
+#define ARY_SHARED_P(ary) \
+ (assert(RB_TYPE_P((VALUE)(ary), T_ARRAY)), \
+ assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ FL_TEST_RAW((ary),ELTS_SHARED)!=0)
+
+#define ARY_EMBED_P(ary) \
+ (assert(RB_TYPE_P((VALUE)(ary), T_ARRAY)), \
+ assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ FL_TEST_RAW((ary), RARRAY_EMBED_FLAG) != 0)
#define ARY_HEAP_PTR(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.ptr)
#define ARY_HEAP_LEN(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.len)
-#define ARY_HEAP_CAPA(a) (assert(!ARY_EMBED_P(a)), assert(!ARY_SHARED_ROOT_P(a)), RARRAY(a)->as.heap.aux.capa)
+#define ARY_HEAP_CAPA(a) (assert(!ARY_EMBED_P(a)), assert(!ARY_SHARED_ROOT_P(a)), \
+ RARRAY(a)->as.heap.aux.capa)
#define ARY_EMBED_PTR(a) (assert(ARY_EMBED_P(a)), RARRAY(a)->as.ary)
#define ARY_EMBED_LEN(a) \
@@ -52,13 +56,16 @@ VALUE rb_cArray;
(RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
#define ARY_HEAP_SIZE(a) (assert(!ARY_EMBED_P(a)), assert(ARY_OWNS_HEAP_P(a)), ARY_CAPA(a) * sizeof(VALUE))
-#define ARY_OWNS_HEAP_P(a) (!FL_TEST((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
+#define ARY_OWNS_HEAP_P(a) (assert(RB_TYPE_P((a), T_ARRAY)), \
+ !FL_TEST_RAW((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
+
#define FL_SET_EMBED(a) do { \
assert(!ARY_SHARED_P(a)); \
FL_SET((a), RARRAY_EMBED_FLAG); \
RARY_TRANSIENT_UNSET(a); \
ary_verify(a); \
} while (0)
+
#define FL_UNSET_EMBED(ary) FL_UNSET((ary), RARRAY_EMBED_FLAG|RARRAY_EMBED_LEN_MASK)
#define FL_SET_SHARED(ary) do { \
assert(!ARY_EMBED_P(ary)); \
@@ -125,7 +132,8 @@ VALUE rb_cArray;
RB_OBJ_WRITE(_ary_, &RARRAY(_ary_)->as.heap.aux.shared_root, _value_); \
} while (0)
#define RARRAY_SHARED_ROOT_FLAG FL_USER5
-#define ARY_SHARED_ROOT_P(ary) (FL_TEST((ary), RARRAY_SHARED_ROOT_FLAG))
+#define ARY_SHARED_ROOT_P(ary) (assert(RB_TYPE_P((ary), T_ARRAY)), \
+ FL_TEST_RAW((ary), RARRAY_SHARED_ROOT_FLAG))
#define ARY_SHARED_ROOT_REFCNT(ary) \
(assert(ARY_SHARED_ROOT_P(ary)), RARRAY(ary)->as.heap.aux.capa)
#define ARY_SHARED_ROOT_OCCUPIED(ary) (ARY_SHARED_ROOT_REFCNT(ary) == 1)
@@ -776,7 +784,7 @@ rb_ary_free(VALUE ary)
}
}
else {
- RB_DEBUG_COUNTER_INC(obj_ary_embed);
+ RB_DEBUG_COUNTER_INC(obj_ary_embed);
}
if (ARY_SHARED_P(ary)) {