summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2019-09-16 09:36:05 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-09-16 10:10:09 +0900
commit0eb9355acdcb67ad0168a81be4ba6d6978cc02fe (patch)
tree017c0e82c4599529cff32db87d2fb2eb3ac5b1b3 /include
parent743d480fba801cdfdea61427017be781262dca54 (diff)
downloadmruby-0eb9355acdcb67ad0168a81be4ba6d6978cc02fe.tar.gz
mruby-0eb9355acdcb67ad0168a81be4ba6d6978cc02fe.zip
Use bit shifting to pack function pointers to `mrb_method_t`.
So you don't need `-falign-functions=2` anymore. Instead your platform must not use higher bits of the pointer (true for most platforms). If not, you have to use `struct mrb_method_t` version.
Diffstat (limited to 'include')
-rw-r--r--include/mruby/proc.h6
1 files changed, 3 insertions, 3 deletions
diff --git a/include/mruby/proc.h b/include/mruby/proc.h
index 9b2cbc6fc..c3083ccf3 100644
--- a/include/mruby/proc.h
+++ b/include/mruby/proc.h
@@ -101,9 +101,9 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx);
#define MRB_METHOD_FUNC_FL ((uintptr_t)1)
#define MRB_METHOD_FUNC_P(m) (((uintptr_t)(m))&MRB_METHOD_FUNC_FL)
-#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)&(~MRB_METHOD_FUNC_FL)))
-#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((struct RProc*)((uintptr_t)(fn)|MRB_METHOD_FUNC_FL)))
-#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(struct RProc*)(pr))
+#define MRB_METHOD_FUNC(m) ((mrb_func_t)((uintptr_t)(m)>>2))
+#define MRB_METHOD_FROM_FUNC(m,fn) ((m)=(mrb_method_t)((((uintptr_t)(fn))<<2)|MRB_METHOD_FUNC_FL))
+#define MRB_METHOD_FROM_PROC(m,pr) ((m)=(mrb_method_t)(pr))
#define MRB_METHOD_PROC_P(m) (!MRB_METHOD_FUNC_P(m))
#define MRB_METHOD_PROC(m) ((struct RProc*)(m))
#define MRB_METHOD_UNDEF_P(m) ((m)==0)