From 303dba6372739d7cae4a51e71a07e607c595afc6 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 15 Jun 2011 13:56:37 -0500 Subject: [PATCH] Coerce event handler record arguments to correct record type. This lets events be sent to bro that contain record arguments that don't have to fill in all &optional record fields. This corresponds to broccoli-python tests that were updated in commit 8b87d8f61ef89162019cd4acc01be93700b0c588 --- src/EventHandler.cc | 25 +++++++++++++++++++ .../Baseline/istate.pybroccoli/bro..stdout | 4 +++ 2 files changed, 29 insertions(+) diff --git a/src/EventHandler.cc b/src/EventHandler.cc index 9cc5306c9c..ef0c9fc63c 100644 --- a/src/EventHandler.cc +++ b/src/EventHandler.cc @@ -69,7 +69,32 @@ void EventHandler::Call(val_list* vl, bool no_remote) } if ( local ) + { + if ( FType() ) + { + const type_list* arg_types = type->ArgTypes()->Types(); + loop_over_list(*vl, i) + { + Val* v = (*vl)[i]; + BroType* va_t = v->Type(); + BroType* ar_t = (*arg_types)[i]; + if ( va_t->Tag() == TYPE_RECORD && ar_t->Tag() == TYPE_RECORD ) + { + if ( ! same_type(va_t, ar_t) ) + { + Val* nv; + nv = v->AsRecordVal()->CoerceTo(ar_t->AsRecordType()); + if ( nv ) + { + vl->replace(i, nv); + Unref(v); + } + } + } + } + } Unref(local->Call(vl)); + } else { loop_over_list(*vl, i) diff --git a/testing/btest/Baseline/istate.pybroccoli/bro..stdout b/testing/btest/Baseline/istate.pybroccoli/bro..stdout index f8c0c63c45..9eec3a4550 100644 --- a/testing/btest/Baseline/istate.pybroccoli/bro..stdout +++ b/testing/btest/Baseline/istate.pybroccoli/bro..stdout @@ -13,3 +13,7 @@ Servus ==== record [a=42, b=6.6.7.7] 42, 6.6.7.7 +==== coerced record +[a=13, b=, c=helloworld] +13 +helloworld