@@ -19,10 +19,12 @@ static ID
1919 intern_parse ,
2020 intern_square_brackets ,
2121 intern_unknown_tag_in_liquid_tag ,
22- intern_ivar_nodelist ;
22+ intern_ivar_nodelist ,
23+ intern_raise_unknown_tag ;
2324
2425static VALUE tag_registry ;
2526static VALUE variable_placeholder = Qnil ;
27+ static VALUE cLiquidBlock ;
2628
2729typedef struct parse_context {
2830 tokenizer_t * tokenizer ;
@@ -375,7 +377,9 @@ static VALUE block_body_parse_from_serialize(block_body_t *body, VALUE tokenizer
375377 VALUE markup = rb_utf8_str_new (tag_markup_header_markup (current_tag ), current_tag -> markup_len );
376378
377379 VALUE tag_class = rb_funcall (tag_registry , intern_square_brackets , 1 , tag_name );
378- assert (RTEST (tag_class ));
380+ if (!RTEST (tag_class )) {
381+ return rb_funcall (cLiquidBlock , intern_raise_unknown_tag , 4 , tag_name , Qnil , Qnil , parse_context_obj );
382+ }
379383
380384 serialize_parse_context_enter_tag (serialize_context , current_tag );
381385 VALUE new_tag = rb_funcall (tag_class , intern_parse , 4 ,
@@ -700,13 +704,17 @@ void liquid_define_block_body()
700704 intern_square_brackets = rb_intern ("[]" );
701705 intern_unknown_tag_in_liquid_tag = rb_intern ("unknown_tag_in_liquid_tag" );
702706 intern_ivar_nodelist = rb_intern ("@nodelist" );
707+ intern_raise_unknown_tag = rb_intern ("raise_unknown_tag" );
703708
704709 tag_registry = rb_funcall (cLiquidTemplate , rb_intern ("tags" ), 0 );
705710 rb_global_variable (& tag_registry );
706711
707712 VALUE cLiquidCBlockBody = rb_define_class_under (mLiquidC , "BlockBody" , rb_cObject );
708713 rb_define_alloc_func (cLiquidCBlockBody , block_body_allocate );
709714
715+ cLiquidBlock = rb_const_get (mLiquid , rb_intern ("Block" ));
716+ rb_global_variable (& cLiquidBlock );
717+
710718 rb_define_method (cLiquidCBlockBody , "initialize" , block_body_initialize , 1 );
711719 rb_define_method (cLiquidCBlockBody , "parse" , block_body_parse , 2 );
712720 rb_define_method (cLiquidCBlockBody , "freeze" , block_body_freeze , 0 );
0 commit comments