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();
 
