From 72cda9bec8acef27368c7ee0e24500b0494dbf1b Mon Sep 17 00:00:00 2001 From: youdie006 Date: Fri, 11 Sep 2026 11:38:24 +0900 Subject: [PATCH] Guard packerProc against a missing :packer key on JRuby RubyHash#fastARef returns Java null for an absent key, so registering a Symbol type with only an :unpacker raised NullPointerException. ExtensionEntry.hasPacker already guards the same value this way. --- ext/java/org/msgpack/jruby/Factory.java | 2 +- spec/factory_spec.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ext/java/org/msgpack/jruby/Factory.java b/ext/java/org/msgpack/jruby/Factory.java index 34a6c22a..bd31e685 100644 --- a/ext/java/org/msgpack/jruby/Factory.java +++ b/ext/java/org/msgpack/jruby/Factory.java @@ -112,7 +112,7 @@ public IRubyObject registerTypeInternal(ThreadContext ctx, IRubyObject type, IRu extensionRegistry.put(extModule, (int) typeId, recursive, packerProc, unpackerProc); if (extModule == runtime.getSymbol()) { - hasSymbolExtType = !packerProc.isNil(); + hasSymbolExtType = packerProc != null && !packerProc.isNil(); } if (options != null) { diff --git a/spec/factory_spec.rb b/spec/factory_spec.rb index 15b5e5d3..2abedab3 100644 --- a/spec/factory_spec.rb +++ b/spec/factory_spec.rb @@ -273,6 +273,12 @@ class MyType2 < MyType expect(factory.load(factory.dump(:foo))).to be == "foo" end + it 'handles Symbol type registered with only an unpacker' do + factory = MessagePack::Factory.new + factory.register_type(0x00, Symbol, unpacker: :to_sym.to_proc) + expect(factory.load(factory.dump(:foo))).to be == "foo" + end + describe "registering multiple ext type for the same class" do let(:payload) do factory = MessagePack::Factory.new