|
1 | 1 | #![allow(non_upper_case_globals)] |
2 | | -use crate::cruby::{Qfalse, Qnil, Qtrue, VALUE, RUBY_T_ARRAY, RUBY_T_STRING, RUBY_T_HASH, RUBY_T_CLASS}; |
| 2 | +use crate::cruby::{Qfalse, Qnil, Qtrue, VALUE, RUBY_T_ARRAY, RUBY_T_STRING, RUBY_T_HASH, RUBY_T_CLASS, RUBY_T_MODULE}; |
3 | 3 | use crate::cruby::{rb_cInteger, rb_cFloat, rb_cArray, rb_cHash, rb_cString, rb_cSymbol, rb_cObject, rb_cTrueClass, rb_cFalseClass, rb_cNilClass, rb_cRange, rb_cSet, rb_cRegexp, rb_cClass, rb_cModule}; |
4 | 4 | use crate::cruby::ClassRelationship; |
5 | 5 | use crate::cruby::get_class_name; |
6 | 6 | use crate::cruby::ruby_sym_to_rust_string; |
7 | 7 | use crate::cruby::rb_mRubyVMFrozenCore; |
| 8 | +use crate::cruby::rb_obj_class; |
8 | 9 | use crate::hir::PtrPrintMap; |
9 | 10 |
|
10 | 11 | #[derive(Copy, Clone, Debug, PartialEq)] |
@@ -145,9 +146,13 @@ fn is_range_exact(val: VALUE) -> bool { |
145 | 146 | val.class_of() == unsafe { rb_cRange } |
146 | 147 | } |
147 | 148 |
|
148 | | -fn is_class_exact(val: VALUE) -> bool { |
149 | | - // Objects with RUBY_T_CLASS type and not instances of Module |
150 | | - val.builtin_type() == RUBY_T_CLASS && val.class_of() != unsafe { rb_cModule } |
| 149 | +fn is_module_exact(val: VALUE) -> bool { |
| 150 | + if val.builtin_type() != RUBY_T_MODULE { |
| 151 | + return false; |
| 152 | + } |
| 153 | + |
| 154 | + let klass = unsafe { rb_obj_class(val) }; |
| 155 | + klass == unsafe { rb_cModule } |
151 | 156 | } |
152 | 157 |
|
153 | 158 | impl Type { |
@@ -202,7 +207,10 @@ impl Type { |
202 | 207 | else if is_string_exact(val) { |
203 | 208 | Type { bits: bits::StringExact, spec: Specialization::Object(val) } |
204 | 209 | } |
205 | | - else if is_class_exact(val) { |
| 210 | + else if is_module_exact(val) { |
| 211 | + Type { bits: bits::ModuleExact, spec: Specialization::Object(val) } |
| 212 | + } |
| 213 | + else if val.builtin_type() == RUBY_T_CLASS { |
206 | 214 | Type { bits: bits::ClassExact, spec: Specialization::Object(val) } |
207 | 215 | } |
208 | 216 | else if val.class_of() == unsafe { rb_cRegexp } { |
@@ -301,6 +309,7 @@ impl Type { |
301 | 309 | if class == unsafe { rb_cFloat } { return true; } |
302 | 310 | if class == unsafe { rb_cHash } { return true; } |
303 | 311 | if class == unsafe { rb_cInteger } { return true; } |
| 312 | + if class == unsafe { rb_cModule } { return true; } |
304 | 313 | if class == unsafe { rb_cNilClass } { return true; } |
305 | 314 | if class == unsafe { rb_cObject } { return true; } |
306 | 315 | if class == unsafe { rb_cRange } { return true; } |
@@ -410,6 +419,7 @@ impl Type { |
410 | 419 | if self.is_subtype(types::FloatExact) { return Some(unsafe { rb_cFloat }); } |
411 | 420 | if self.is_subtype(types::HashExact) { return Some(unsafe { rb_cHash }); } |
412 | 421 | if self.is_subtype(types::IntegerExact) { return Some(unsafe { rb_cInteger }); } |
| 422 | + if self.is_subtype(types::ModuleExact) { return Some(unsafe { rb_cModule }); } |
413 | 423 | if self.is_subtype(types::NilClassExact) { return Some(unsafe { rb_cNilClass }); } |
414 | 424 | if self.is_subtype(types::ObjectExact) { return Some(unsafe { rb_cObject }); } |
415 | 425 | if self.is_subtype(types::RangeExact) { return Some(unsafe { rb_cRange }); } |
|
0 commit comments