From 97e57afa75629b70ba2681c8c77e174ae69066e2 Mon Sep 17 00:00:00 2001 From: Peter Ohler Date: Wed, 31 Jul 2024 18:13:31 -0400 Subject: [PATCH] WIP --- ext/oj/usual.c | 19 ++++++++++++++++++- test/test_parser_usual.rb | 7 +++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ext/oj/usual.c b/ext/oj/usual.c index e6160f9a..afdd67f3 100644 --- a/ext/oj/usual.c +++ b/ext/oj/usual.c @@ -289,6 +289,12 @@ static void close_object(ojParser p) { } rb_hash_bulk_insert(d->vtail - head, head, obj); d->ktail = d->khead + c->ki; + if (0 == head - d->vhead && rb_block_given_p()) { + rb_yield(obj); + // TBD decrement vtail? + d->vtail--; + return; + } d->vtail = head; head--; *head = obj; @@ -572,7 +578,18 @@ static VALUE result(ojParser p) { Usual d = (Usual)p->ctx; if (d->vhead < d->vtail) { - return *d->vhead; + long cnt = d->vtail - d->vhead; + volatile VALUE ary; + volatile VALUE *vp; + + if (1 == cnt) { + return *d->vhead; + } + ary = rb_ary_new(); + for (vp = d->vhead; vp < d->vtail; vp++) { + rb_ary_push(ary, *vp); + } + return ary; } if (d->raise_on_empty) { rb_raise(oj_parse_error_class, "empty string"); diff --git a/test/test_parser_usual.rb b/test/test_parser_usual.rb index f9b620c2..77b49eae 100755 --- a/test/test_parser_usual.rb +++ b/test/test_parser_usual.rb @@ -114,6 +114,13 @@ def test_decimal assert_equal(Float, doc.class) end + def test_multi + p = Oj::Parser.new(:usual) + puts p.just_one + #puts p.parse('{"b":{"x":2}}') + puts p.parse('{"a":1}{"b":{"x":2}} {"c":3}') { |j| puts j } + end + def test_omit_null p = Oj::Parser.new(:usual) p.omit_null = true