From b621983164216876ebd8d304468f02a895088940 Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Sat, 22 Apr 2017 01:13:21 +0000
Subject: [PATCH] method.h: pack rb_method_definition_t struct

We only have 12 method types, so 4 bits is enough for
rb_method_type_t.

Size reductions:

- x86-64     48 => 40 bytes
- x86        28 => 24 bytes

* method.h (enum method_optimized_type): split out for CPP
  (struct rb_method_definition struct): pack on unaligned systems
  (rb_method_definition_t): split typedef to help ctags
---
 method.h | 25 ++++++++++++++-----------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/method.h b/method.h
index 510c9b6f40..14bbc8c001 100644
--- a/method.h
+++ b/method.h
@@ -144,10 +144,16 @@ typedef struct rb_method_refined_struct {
     const VALUE owner;
 } rb_method_refined_t;
 
-typedef struct rb_method_definition_struct {
-    rb_method_type_t type :  8; /* method type */
-    int alias_count       : 28;
-    int complemented_count: 28;
+enum method_optimized_type {
+    OPTIMIZED_METHOD_TYPE_SEND,
+    OPTIMIZED_METHOD_TYPE_CALL,
+    OPTIMIZED_METHOD_TYPE__MAX
+};
+
+PACKED_STRUCT_UNALIGNED(struct rb_method_definition_struct {
+    rb_method_type_t type :  4; /* method type */
+    int alias_count : 28;
+    int complemented_count : 28;
 
     union {
 	rb_method_iseq_t iseq;
@@ -157,16 +163,13 @@ typedef struct rb_method_definition_struct {
 	rb_method_refined_t refined;
 
 	const VALUE proc;                 /* should be marked */
-	enum method_optimized_type {
-	    OPTIMIZED_METHOD_TYPE_SEND,
-	    OPTIMIZED_METHOD_TYPE_CALL,
-
-	    OPTIMIZED_METHOD_TYPE__MAX
-	} optimize_type;
+	enum method_optimized_type optimize_type;
     } body;
 
     ID original_id;
-} rb_method_definition_t;
+});
+
+typedef struct rb_method_definition_struct rb_method_definition_t;
 
 #define UNDEFINED_METHOD_ENTRY_P(me) (!(me) || !(me)->def || (me)->def->type == VM_METHOD_TYPE_UNDEF)
 #define UNDEFINED_REFINED_METHOD_P(def) \
-- 
EW

