Skip to content

Commit

Permalink
Add Liquid::C::DeserializationError
Browse files Browse the repository at this point in the history
  • Loading branch information
peterzhu2118 committed Jan 8, 2021
1 parent 387b84b commit 005b088
Show file tree
Hide file tree
Showing 6 changed files with 20 additions and 11 deletions.
10 changes: 2 additions & 8 deletions ext/liquid_c/block.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,10 @@ static ID
intern_parse,
intern_square_brackets,
intern_unknown_tag_in_liquid_tag,
intern_ivar_nodelist,
intern_raise_unknown_tag;
intern_ivar_nodelist;

static VALUE tag_registry;
static VALUE variable_placeholder = Qnil;
static VALUE cLiquidBlock;

typedef struct parse_context {
tokenizer_t *tokenizer;
Expand Down Expand Up @@ -352,7 +350,7 @@ static VALUE block_body_parse_from_serialize(block_body_t *body, VALUE tokenizer

VALUE tag_class = rb_funcall(tag_registry, intern_square_brackets, 1, tag_name);
if (!RTEST(tag_class)) {
return rb_funcall(cLiquidBlock, intern_raise_unknown_tag, 4, tag_name, Qnil, Qnil, parse_context_obj);
rb_raise(cLiquidCDeserializationError, "cannot find known tag `%"PRIsVALUE"`", tag_name);
}

serialize_parse_context_enter_tag(serialize_context, current_tag);
Expand Down Expand Up @@ -678,17 +676,13 @@ void liquid_define_block_body()
intern_square_brackets = rb_intern("[]");
intern_unknown_tag_in_liquid_tag = rb_intern("unknown_tag_in_liquid_tag");
intern_ivar_nodelist = rb_intern("@nodelist");
intern_raise_unknown_tag = rb_intern("raise_unknown_tag");

tag_registry = rb_funcall(cLiquidTemplate, rb_intern("tags"), 0);
rb_global_variable(&tag_registry);

VALUE cLiquidCBlockBody = rb_define_class_under(mLiquidC, "BlockBody", rb_cObject);
rb_define_alloc_func(cLiquidCBlockBody, block_body_allocate);

cLiquidBlock = rb_const_get(mLiquid, rb_intern("Block"));
rb_global_variable(&cLiquidBlock);

rb_define_method(cLiquidCBlockBody, "initialize", block_body_initialize, 1);
rb_define_method(cLiquidCBlockBody, "parse", block_body_parse, 2);
rb_define_method(cLiquidCBlockBody, "freeze", block_body_freeze, 0);
Expand Down
5 changes: 4 additions & 1 deletion ext/liquid_c/liquid.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ ID id_ivar_line_number;

VALUE mLiquid, mLiquidC, cLiquidVariable, cLiquidTemplate, cLiquidBlockBody;
VALUE cLiquidVariableLookup, cLiquidRangeLookup;
VALUE cLiquidArgumentError, cLiquidSyntaxError, cMemoryError;
VALUE cLiquidArgumentError, cLiquidSyntaxError, cMemoryError, cLiquidCDeserializationError;

rb_encoding *utf8_encoding;
int utf8_encoding_index;
Expand Down Expand Up @@ -65,6 +65,9 @@ RUBY_FUNC_EXPORTED void Init_liquid_c(void)
cMemoryError = rb_const_get(mLiquid, rb_intern("MemoryError"));
rb_global_variable(&cMemoryError);

cLiquidCDeserializationError = rb_const_get(mLiquidC, rb_intern("DeserializationError"));
rb_global_variable(&cLiquidCDeserializationError);

cLiquidVariable = rb_const_get(mLiquid, rb_intern("Variable"));
rb_global_variable(&cLiquidVariable);

Expand Down
2 changes: 1 addition & 1 deletion ext/liquid_c/liquid.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ extern ID id_ivar_line_number;

extern VALUE mLiquid, mLiquidC, cLiquidVariable, cLiquidTemplate, cLiquidBlockBody;
extern VALUE cLiquidVariableLookup, cLiquidRangeLookup;
extern VALUE cLiquidArgumentError, cLiquidSyntaxError, cMemoryError;
extern VALUE cLiquidArgumentError, cLiquidSyntaxError, cMemoryError, cLiquidCDeserializationError;
extern rb_encoding *utf8_encoding;
extern int utf8_encoding_index;

Expand Down
4 changes: 4 additions & 0 deletions ext/liquid_c/template.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ static VALUE template_load(VALUE self, VALUE source, VALUE options)

document_body_header_t *header = (document_body_header_t *)data;

if (header->version != DOCUMENT_BODY_CURRENT_VERSION) {
rb_raise(cLiquidCDeserializationError, "Incompatible serialization versions, expected %u but got %u\n", DOCUMENT_BODY_CURRENT_VERSION, header->version);
}

assert(RSTRING_LEN(source) >= header->buffer_offset + header->buffer_offset);
const char *body_data = data + header->buffer_offset;

Expand Down
3 changes: 2 additions & 1 deletion lib/liquid/c.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# frozen_string_literal: true

require 'liquid/c/version'
require 'liquid'
require 'liquid/c/version'
require 'liquid/c/errors'
require 'liquid_c'
require 'liquid/c/compile_ext'

Expand Down
7 changes: 7 additions & 0 deletions lib/liquid/c/errors.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# frozen_string_literal: true

module Liquid
module C
DeserializationError = Class.new(Liquid::Error)
end
end

0 comments on commit 005b088

Please sign in to comment.