Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.Sign up
Flag registry #3938
tldr: this is a registry for all flags we use against Ruby objects in JRuby. The goal is to maximize utilization of the flags and ensure we do not overlap.
See the first commit and the doco for FlagRegistry.
My intent with this is to begin exploring more specialized subclasses of key Ruby core classes. For example, we might want to have a RubyArrayOne that only holds one value initially in a field rather than an array. If it grows, we would set a "failed" flag that would indicate we need to fall back to using the values array rather than the one field. Rather than putting this as a boolean on the class, increasing object size, we can use flags. But I wanted a better mechanism to ensure I'm not overlapping other flags higher in the hierarchy, as our use of them broadens.
This implementation expects ancestors to register their flags first, ensuring they are packed tightly. The rest of the logic makes sure that no child overlaps any parent, and the flags are calculated based on the nearest flag-registering parent's last shift value. There's an additional piece of work here: rewrite the Constants class so that instead of calculating these flags at runtime, it just has the literal calculated flag values, so they can be folded into all places where they are called. See the hacky assertion in StringSupport for a reason why this would be better. Note that OpenJDK 7 and higher *will* fold runtime-calculated static final values when jitting, so performance wise this additional improvement would mostly just simplify javac-emitted bytecode and possibly improve the performance of interpreted bytecode *slightly*.
FWIW, despite having flag values in RubyBasicObject up to the tenth bit, we only end up using the following values: