mirror of
https://github.com/zeek/zeek.git
synced 2025-10-12 11:38:20 +00:00
172 lines
4.8 KiB
Diff
172 lines
4.8 KiB
Diff
Index: pac_type.h
|
|
===================================================================
|
|
--- pac_type.h (revision 4130)
|
|
+++ pac_type.h (working copy)
|
|
@@ -78,12 +78,6 @@
|
|
string EvalByteOrder(Output *out_cc, Env *env) const;
|
|
|
|
virtual string EvalMember(const ID *member_id) const;
|
|
-#if 0
|
|
- // member_env() is used for finding a member of the type.
|
|
- // Thus member_env() of a ParameterizedType should return
|
|
- // ReferredDataType()->env()
|
|
- // virtual Env *member_env() const;
|
|
-#endif
|
|
|
|
// The variable defined by the type
|
|
const ID *value_var() const { return value_var_; }
|
|
@@ -223,6 +217,8 @@
|
|
|
|
virtual bool ByteOrderSensitive() const = 0;
|
|
|
|
+ bool NeedsBufferingStateVar() const;
|
|
+
|
|
void GenBufferingLoop(Output* out_cc, Env* env, int flags);
|
|
void GenParseBuffer(Output* out_cc, Env* env, int flags);
|
|
void GenParseCode2(Output* out_cc, Env* env, const DataPtr& data, int flags);
|
|
Index: lib/binpac_buffer.h
|
|
===================================================================
|
|
--- lib/binpac_buffer.h (revision 4130)
|
|
+++ lib/binpac_buffer.h (working copy)
|
|
@@ -24,18 +24,18 @@
|
|
void DiscardData();
|
|
|
|
// Whether there is enough data for the frame
|
|
- bool ready() const{ return message_complete_; }
|
|
+ bool ready() const{ return message_complete_ || mode_ == UNKNOWN_MODE; }
|
|
|
|
inline const_byteptr begin() const
|
|
{
|
|
- BINPAC_ASSERT(message_complete_);
|
|
+ BINPAC_ASSERT(ready());
|
|
return ( buffer_n_ == 0 ) ?
|
|
orig_data_begin_ : buffer_;
|
|
}
|
|
|
|
inline const_byteptr end() const
|
|
{
|
|
- BINPAC_ASSERT(message_complete_);
|
|
+ BINPAC_ASSERT(ready());
|
|
if ( buffer_n_ == 0 )
|
|
{
|
|
BINPAC_ASSERT(frame_length_ >= 0);
|
|
Index: pac_type.cc
|
|
===================================================================
|
|
--- pac_type.cc (revision 4130)
|
|
+++ pac_type.cc (working copy)
|
|
@@ -285,9 +285,8 @@
|
|
parsing_complete_var, extern_type_bool->Clone());
|
|
parsing_complete_var_field_->Prepare(env);
|
|
|
|
- if ( ( buffer_mode() == BUFFER_BY_LENGTH ||
|
|
- buffer_mode() == BUFFER_BY_LINE ) &&
|
|
- ! env->GetDataType(buffering_state_id) )
|
|
+ if ( NeedsBufferingStateVar() &&
|
|
+ !env->GetDataType(buffering_state_id) )
|
|
{
|
|
buffering_state_var_field_ = new PrivVarField(
|
|
buffering_state_id->clone(),
|
|
@@ -387,17 +386,17 @@
|
|
break;
|
|
|
|
case BUFFER_BY_LENGTH:
|
|
- if ( buffering_state_var_field_ )
|
|
- {
|
|
- out_cc->println("if ( %s == 0 )",
|
|
- env->RValue(buffering_state_id));
|
|
- out_cc->inc_indent();
|
|
- out_cc->println("{");
|
|
- }
|
|
+ if ( !NeedsBufferingStateVar() )
|
|
+ break;
|
|
|
|
+ ASSERT(env->GetDataType(buffering_state_id));
|
|
+ out_cc->println("if ( %s == 0 )",
|
|
+ env->RValue(buffering_state_id));
|
|
+ out_cc->inc_indent();
|
|
+ out_cc->println("{");
|
|
+
|
|
if ( attr_length_expr_ )
|
|
{
|
|
- // frame_buffer_arg = attr_length_expr_->EvalExpr(out_cc, env);
|
|
frame_buffer_arg = strfmt("%d", InitialBufferLength());
|
|
}
|
|
else if ( attr_restofflow_ )
|
|
@@ -407,7 +406,7 @@
|
|
}
|
|
else
|
|
{
|
|
- frame_buffer_arg = strfmt("%d", InitialBufferLength());
|
|
+ ASSERT(0);
|
|
}
|
|
|
|
out_cc->println("%s->NewFrame(%s, %s);",
|
|
@@ -415,16 +414,14 @@
|
|
frame_buffer_arg.c_str(),
|
|
attr_chunked() ? "true" : "false");
|
|
|
|
- if ( buffering_state_var_field_ )
|
|
- {
|
|
- out_cc->println("%s = 1;",
|
|
- env->LValue(buffering_state_id));
|
|
- out_cc->println("}");
|
|
- out_cc->dec_indent();
|
|
- }
|
|
+ out_cc->println("%s = 1;",
|
|
+ env->LValue(buffering_state_id));
|
|
+ out_cc->println("}");
|
|
+ out_cc->dec_indent();
|
|
break;
|
|
|
|
case BUFFER_BY_LINE:
|
|
+ ASSERT(env->GetDataType(buffering_state_id));
|
|
out_cc->println("if ( %s == 0 )",
|
|
env->RValue(buffering_state_id));
|
|
out_cc->inc_indent();
|
|
@@ -890,6 +887,25 @@
|
|
return ! attr_byteorder_expr() && ByteOrderSensitive();
|
|
}
|
|
|
|
+bool Type::NeedsBufferingStateVar() const
|
|
+ {
|
|
+ if ( !incremental_input() )
|
|
+ return false;
|
|
+ switch ( buffer_mode() )
|
|
+ {
|
|
+ case BUFFER_NOTHING:
|
|
+ case NOT_BUFFERABLE:
|
|
+ return false;
|
|
+ case BUFFER_BY_LINE:
|
|
+ return true;
|
|
+ case BUFFER_BY_LENGTH:
|
|
+ return ( attr_length_expr_ || attr_restofflow_ );
|
|
+ default:
|
|
+ ASSERT(0);
|
|
+ return false;
|
|
+ }
|
|
+ }
|
|
+
|
|
bool Type::DoTraverse(DataDepVisitor *visitor)
|
|
{
|
|
foreach (i, FieldList, fields_)
|
|
Index: pac_flow.cc
|
|
===================================================================
|
|
--- pac_flow.cc (revision 4130)
|
|
+++ pac_flow.cc (working copy)
|
|
@@ -224,15 +224,13 @@
|
|
out_cc->println("catch ( Exception const &e )");
|
|
out_cc->inc_indent();
|
|
out_cc->println("{");
|
|
- out_cc->println("DEBUG_MSG(\"%%.6f binpac exception: %%s\\n\", network_time(), e.c_msg());");
|
|
GenCleanUpCode(out_cc);
|
|
if ( dataunit_->type() == AnalyzerDataUnit::FLOWUNIT )
|
|
{
|
|
out_cc->println("%s->DiscardData();",
|
|
env_->LValue(flow_buffer_id));
|
|
- out_cc->println("BINPAC_ASSERT(!%s->ready());",
|
|
- env_->RValue(flow_buffer_id));
|
|
}
|
|
+ out_cc->println("throw e;");
|
|
out_cc->println("}");
|
|
out_cc->dec_indent();
|
|
|