aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.h
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-18 07:41:22 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-06-18 07:41:22 +0000
commit2e5aa3fba8fe96331ab420694aacf710dd995f43 (patch)
tree98877b525b4e94b0b15505be70051f73d7b3bdd4 /vm_insnhelper.h
parent4a4f7aeaa16d0dbcc9580b345fa34deaa6a97898 (diff)
downloadruby-2e5aa3fba8fe96331ab420694aacf710dd995f43.tar.gz
hidden objects should not be pushed.
* vm_insnhelper.h (PUSH): hidden objects (klass == 0) should not be pushed to a VM value stack. Add assertion for it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63687 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_insnhelper.h')
-rw-r--r--vm_insnhelper.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/vm_insnhelper.h b/vm_insnhelper.h
index f630f73194..25bd92f6fd 100644
--- a/vm_insnhelper.h
+++ b/vm_insnhelper.h
@@ -36,7 +36,18 @@ RUBY_SYMBOL_EXPORT_END
/* deal with stack */
/**********************************************************/
-#define PUSH(x) (SET_SV(x), INC_SP(1))
+static inline int
+rb_obj_hidden_p(VALUE obj)
+{
+ if (SPECIAL_CONST_P(obj)) {
+ return FALSE;
+ }
+ else {
+ return RBASIC_CLASS(obj) ? FALSE : TRUE;
+ }
+}
+
+#define PUSH(x) (VM_ASSERT(!rb_obj_hidden_p(x)), SET_SV(x), INC_SP(1))
#define TOPN(n) (*(GET_SP()-(n)-1))
#define POPN(n) (DEC_SP(n))
#define POP() (DEC_SP(1))