Flag registry #3938

Merged
merged 1 commit into from Jun 9, 2016

Conversation

Projects
None yet
1 participant
@headius
Member

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.

Add a flag registry to ensure our bit flags are optimal.
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

This comment has been minimized.

Show comment
Hide comment
@headius

headius May 28, 2016

Member

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}
Member

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

0 of 2 checks passed

continuous-integration/appveyor/pr AppVeyor build failed
Details
continuous-integration/travis-ci/pr The Travis CI build failed
Details

@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