From 9d8f1f29fc404eaac444d8d8422e889c5ef4d85e Mon Sep 17 00:00:00 2001 From: Charles Oliver Nutter Date: Wed, 8 Jan 2025 23:48:45 -0600 Subject: [PATCH] Use switch pattern matching to improve handler selection This eliminates it from profiles, but does not appear to affect performance significantly. --- java/src/json/ext/Generator.java | 34 +++++++++++++++----------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/java/src/json/ext/Generator.java b/java/src/json/ext/Generator.java index 4ab92805..82d4c0e4 100644 --- a/java/src/json/ext/Generator.java +++ b/java/src/json/ext/Generator.java @@ -18,6 +18,7 @@ import org.jruby.RubyFixnum; import org.jruby.RubyFloat; import org.jruby.RubyHash; +import org.jruby.RubyNil; import org.jruby.RubyString; import org.jruby.RubySymbol; import org.jruby.RubyException; @@ -99,24 +100,21 @@ static RubyString generateJson(ThreadContext context, T // the best I could get and ignore the warnings @SuppressWarnings("unchecked") private static Handler getHandlerFor(Ruby runtime, T object) { - switch (((RubyBasicObject) object).getNativeClassIndex()) { - case NIL : return NIL_HANDLER; - case TRUE : return (Handler) TRUE_HANDLER; - case FALSE : return (Handler) FALSE_HANDLER; - case FLOAT : return (Handler) FLOAT_HANDLER; - case FIXNUM : return (Handler) FIXNUM_HANDLER; - case BIGNUM : return (Handler) BIGNUM_HANDLER; - case STRING : - if (Helpers.metaclass(object) != runtime.getString()) break; - return (Handler) STRING_HANDLER; - case ARRAY : - if (Helpers.metaclass(object) != runtime.getArray()) break; - return (Handler) ARRAY_HANDLER; - case HASH : - if (Helpers.metaclass(object) != runtime.getHash()) break; - return (Handler) HASH_HANDLER; - } - return GENERIC_HANDLER; + return switch (object) { + case RubyNil o -> NIL_HANDLER; + case RubyBoolean.True o -> (Handler) TRUE_HANDLER; + case RubyBoolean.False o -> (Handler) FALSE_HANDLER; + case RubyFloat o -> (Handler) FLOAT_HANDLER; + case RubyFixnum o -> (Handler) FIXNUM_HANDLER; + case RubyBignum o -> (Handler) BIGNUM_HANDLER; + case RubyString s -> + (Helpers.metaclass(object) != runtime.getString()) ? GENERIC_HANDLER : (Handler) STRING_HANDLER; + case RubyArray a -> + (Helpers.metaclass(object) != runtime.getArray()) ? GENERIC_HANDLER : (Handler) ARRAY_HANDLER; + case RubyHash h -> + (Helpers.metaclass(object) != runtime.getHash()) ? GENERIC_HANDLER : (Handler) HASH_HANDLER; + default -> GENERIC_HANDLER; + }; }