summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author卜部昌平 <shyouhei@ruby-lang.org>2021-01-20 10:26:49 +0900
committer卜部昌平 <shyouhei@ruby-lang.org>2021-01-27 09:30:15 +0900
commit0300dec32b5a25b409dc5dfa59b81f4e39fab501 (patch)
tree797898f48eb8c33ca16e33331407c9e71a4e95d3
parent7ccdad7be83b8bd4fcd09a5bf224d33a64fa1d6f (diff)
kill OBJ_TAINT etc.
Now that RUBY_FL_TAINT is recycled to become new RUBY_FL_SHAREABLE. Setting/clearing this flag from extension libraries break Ractor. Especially problematic one is OBJ_INFECT, which would make non-shareable objects travel across Ractor boundaries. Such operations should just be prohibited.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/4100
-rw-r--r--.gdbinit3
-rw-r--r--include/ruby/internal/fl_type.h33
2 files changed, 9 insertions, 27 deletions
diff --git a/.gdbinit b/.gdbinit
index 49380951b8..60aa8fb6ac 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1324,8 +1324,7 @@ define print_flags
printf "RUBY_FL_PROMOTED0 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED0 ? "1" : "0"
printf "RUBY_FL_PROMOTED1 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED1 ? "1" : "0"
printf "RUBY_FL_FINALIZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FINALIZE ? "1" : "0"
- printf "RUBY_FL_TAINT : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_TAINT ? "1" : "0"
- printf "RUBY_FL_UNTRUSTED : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_UNTRUSTED ? "1" : "0"
+ printf "RUBY_FL_SHAREABLE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_SHAREABLE ? "1" : "0"
printf "RUBY_FL_EXIVAR : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_EXIVAR ? "1" : "0"
printf "RUBY_FL_FREEZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FREEZE ? "1" : "0"
diff --git a/include/ruby/internal/fl_type.h b/include/ruby/internal/fl_type.h
index 994003653d..01c1d2b4d5 100644
--- a/include/ruby/internal/fl_type.h
+++ b/include/ruby/internal/fl_type.h
@@ -204,7 +204,7 @@ ruby_fl_type {
RUBY_FL_SINGLETON = RUBY_FL_USER0,
};
-enum { RUBY_FL_DUPPED = RUBY_T_MASK | RUBY_FL_EXIVAR | RUBY_FL_TAINT };
+enum { RUBY_FL_DUPPED = RUBY_T_MASK | RUBY_FL_EXIVAR | RUBY_FL_SHAREABLE };
RBIMPL_SYMBOL_EXPORT_BEGIN()
void rb_obj_infect(VALUE victim, VALUE carrier);
@@ -362,18 +362,7 @@ RBIMPL_ATTR_ARTIFICIAL()
static inline bool
RB_OBJ_TAINTABLE(VALUE obj)
{
- if (! RB_FL_ABLE(obj)) {
- return false;
- }
- else if (RB_TYPE_P(obj, RUBY_T_BIGNUM)) {
- return false;
- }
- else if (RB_TYPE_P(obj, RUBY_T_FLOAT)) {
- return false;
- }
- else {
- return true;
- }
+ return false;
}
RBIMPL_ATTR_PURE_UNLESS_DEBUG()
@@ -381,7 +370,7 @@ RBIMPL_ATTR_ARTIFICIAL()
static inline VALUE
RB_OBJ_TAINTED_RAW(VALUE obj)
{
- return RB_FL_TEST_RAW(obj, RUBY_FL_TAINT);
+ return false;
}
RBIMPL_ATTR_PURE_UNLESS_DEBUG()
@@ -389,41 +378,35 @@ RBIMPL_ATTR_ARTIFICIAL()
static inline bool
RB_OBJ_TAINTED(VALUE obj)
{
- return RB_FL_ANY(obj, RUBY_FL_TAINT);
+ return false;
}
RBIMPL_ATTR_ARTIFICIAL()
static inline void
RB_OBJ_TAINT_RAW(VALUE obj)
{
- RB_FL_SET_RAW(obj, RUBY_FL_TAINT);
+ return;
}
RBIMPL_ATTR_ARTIFICIAL()
static inline void
RB_OBJ_TAINT(VALUE obj)
{
- if (RB_OBJ_TAINTABLE(obj)) {
- RB_OBJ_TAINT_RAW(obj);
- }
+ return;
}
RBIMPL_ATTR_ARTIFICIAL()
static inline void
RB_OBJ_INFECT_RAW(VALUE dst, VALUE src)
{
- RBIMPL_ASSERT_OR_ASSUME(RB_OBJ_TAINTABLE(dst));
- RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(src));
- RB_FL_SET_RAW(dst, RB_OBJ_TAINTED_RAW(src));
+ return;
}
RBIMPL_ATTR_ARTIFICIAL()
static inline void
RB_OBJ_INFECT(VALUE dst, VALUE src)
{
- if (RB_OBJ_TAINTABLE(dst) && RB_FL_ABLE(src)) {
- RB_OBJ_INFECT_RAW(dst, src);
- }
+ return;
}
RBIMPL_ATTR_PURE_UNLESS_DEBUG()