From ea07784dbccedab600da0d64133bee004624aef4 Mon Sep 17 00:00:00 2001 From: "Erik S. Chang" Date: Mon, 4 Jun 2012 14:51:36 -0700 Subject: [PATCH] properly emit sparse LWES::Events from Ruby Hashes LWES::Emitter#emit(klass, { ... }) works regardless of whether the :sparse flag was passed when creating classes. --- ext/lwes_ext/emitter.c | 11 ++++++++++- test/unit/test_event.rb | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/ext/lwes_ext/emitter.c b/ext/lwes_ext/emitter.c index 574ed4b..2cfb3bb 100644 --- a/ext/lwes_ext/emitter.c +++ b/ext/lwes_ext/emitter.c @@ -371,6 +371,7 @@ static VALUE emitter_ltlt(VALUE self, VALUE event) static VALUE emitter_emit(int argc, VALUE *argv, VALUE self) { volatile VALUE raise_inspect; + char *err; VALUE name = Qnil; VALUE event = Qnil; argc = rb_scan_args(argc, argv, "11", &name, &event); @@ -400,7 +401,15 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self) * struct created */ event = rb_funcall(name, id_new, 1, event); - return emit_struct(self, event); + if (TYPE(event) == T_STRUCT) + return emit_struct(self, event); + if (rb_obj_is_kind_of(event, cLWES_Event)) + return emit_event(self, event); + name = rb_class_name(name); + err = StringValuePtr(name); + rb_raise(rb_eArgError, + "%s created a bad event: %s", + err, RAISE_INSPECT(event)); default: if (rb_obj_is_kind_of(name, cLWES_Event)) return emit_event(self, name); diff --git a/test/unit/test_event.rb b/test/unit/test_event.rb index aba50b8..1ca4de3 100644 --- a/test/unit/test_event.rb +++ b/test/unit/test_event.rb @@ -141,6 +141,23 @@ class TestEvent < Test::Unit::TestCase receiver.close end + def test_emit_class_from_hash_subclassed + receiver = UDPSocket.new + receiver.bind(nil, @options[:port]) + emitter = LWES::Emitter.new(@options) + tmp = { :t_string => 'hello' } + + tdb = LWES::TypeDB.new("#{File.dirname(__FILE__)}/test1.esf") + ev1 = LWES::Event.subclass :name => "Event1", :db => tdb + emitter.emit ev1, tmp + buf, _ = receiver.recvfrom(65536) + parsed = LWES::Event.parse(buf) + assert_instance_of ev1, parsed + assert_equal parsed.to_hash, ev1.new(tmp).to_hash + ensure + receiver.close + end + def teardown new_classes = LWES::Event::CLASSES new_classes.each_key { |k| Object.__send__ :remove_const, k.to_sym } -- 2.11.4.GIT