Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flag registry #3938

Merged
merged 1 commit into from
Jun 9, 2016
Merged

Flag registry #3938

merged 1 commit into from
Jun 9, 2016

Conversation

headius
Copy link
Member

@headius headius commented May 28, 2016

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*.
@headius
Copy link
Member Author

headius commented May 28, 2016

FWIW, despite having flag values in RubyBasicObject up to the tenth bit, we only end up using the following values:

class org.jruby.RubyBasicObject={0, 1, 2, 3}
class org.jruby.ext.stringio.StringIO={4, 5}
class org.jruby.RubyHash={4, 5}
class org.jruby.RubyMatchData={4}
class org.jruby.RubyModule={4, 5, 6, 7}
class org.jruby.RubyString={4, 5}

@headius headius merged commit d698f96 into jruby:master Jun 9, 2016
@headius headius added this to the JRuby 9.1.3.0 milestone Jun 9, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant