Giter Club home page Giter Club logo

liquid-c's Introduction

Liquid::C

Build Status

Partial native implementation of the liquid ruby gem in C.

Installation

Add these lines to your application's Gemfile:

gem 'liquid', github: 'Shopify/liquid', branch: 'main'
gem 'liquid-c', github: 'Shopify/liquid-c', branch: 'main'

And then execute:

$ bundle

Usage

require 'liquid/c'

then just use the documented API for the liquid Gem.

Restrictions

  • Input strings are assumed to be UTF-8 encoded strings
  • Tag#parse(tokens) is given a Liquid::Tokenizer object, instead of an array of strings, which only implements the shift method to get the next token.

Performance

To compare Liquid-C's performance with plain Liquid run

bundle exec rake compare:lax

The latest benchmark results are shown below:

$ bundle exec rake compare:lax
/home/spin/.rubies/ruby-3.0.2/bin/ruby ./performance.rb bare benchmark lax

Running benchmark for 10 seconds (with 5 seconds warmup).

Warming up --------------------------------------
              parse:     2.000  i/100ms
             render:     8.000  i/100ms
     parse & render:     2.000  i/100ms
Calculating -------------------------------------
              parse:     29.527  (± 3.4%) i/s -    296.000  in  10.034520s
             render:     89.403  (± 6.7%) i/s -    896.000  in  10.072939s
     parse & render:     20.474  (± 4.9%) i/s -    206.000  in  10.072806s

/home/spin/.rubies/ruby-3.0.2/bin/ruby ./performance.rb c benchmark lax

Running benchmark for 10 seconds (with 5 seconds warmup).

Warming up --------------------------------------
              parse:    10.000  i/100ms
             render:    18.000  i/100ms
     parse & render:     5.000  i/100ms
Calculating -------------------------------------
              parse:     90.672  (± 3.3%) i/s -    910.000  in  10.051124s
             render:    163.871  (± 4.9%) i/s -      1.638k in  10.018105s
     parse & render:     50.165  (± 4.0%) i/s -    505.000  in  10.077377s

Developing

bundle install
# run tests
bundle exec rake

Contributing

  1. Fork it ( http://github.com/Shopify/liquid-c/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

liquid-c's People

Contributors

bdewater avatar byroot avatar casperisfine avatar dirtyf avatar dylanahsmith avatar fw42 avatar gauravmc avatar ggmichaelgo avatar kainjow avatar macournoyer avatar nirvdrum avatar peterzhu2118 avatar pushrax avatar samdoiron avatar terceiro avatar tobi avatar trishume avatar xrxr avatar xthexder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

liquid-c's Issues

Benchmark scripts.

@TonyZou would be ideal to have the benchmarks automatically run this vs ruby liquid and post the results as part of the desc.

Compilation failing due to a warning

The liquid-c gem is bundled in Jekyll and when I updated my bundle earlier on it updated liquid-c from 0.0.2 to 0.0.3. It failed during the compilation. I tried again installing only the gem, it also failed with the following log:

$ gem install liquid-c -v '0.0.3'


Building native extensions.  This could take a while...
ERROR:  Error installing liquid-c:
    ERROR: Failed to build gem native extension.

    /Users/kara/.rvm/rubies/ruby-2.0.0-p353/bin/ruby extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling block.c
compiling lexer.c
compiling liquid.c
compiling parser.c
cc1: warnings being treated as errors
parser.c: In function ‘rb_parse_expression’:
parser.c:165: warning: unused parameter ‘self’
make: *** [parser.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/kara/.rvm/gems/ruby-2.0.0-p353/gems/liquid-c-0.0.3 for inspection.
Results logged to /Users/kara/.rvm/gems/ruby-2.0.0-p353/extensions/x86_64-darwin-10/2.0.0/liquid-c-0.0.3/gem_make.out

I also tried to install v0.0.2 with no problems.

I don't know if it has anything to do with my setup but I managed to get past this by installing liquid-c by itself with the -w cflag in order to ignore warnings during compilation:

$ gem install liquid-c -v '0.0.3' -- --with-cflags=-w

It can probably be corrected with a modification to ext/liquid_c/extconf.rb

Encoding::CompatibilityError when using a binary encoded output

We were getting the error "incompatible character encodings: ASCII-8BIT and UTF-8 (Encoding::CompatibilityError)" after #58 was introduced when trying to render using a binary encoded output buffer.

This error can be demonstrated with the following code

output = String.new(capacity: 10) # defaults to encoding: Encoding::BINARY
template = Liquid::Template.parse("ü{{ unicode_char }}")
template.render!({ 'unicode_char' => 'ñ' }, output: output) # raises Encoding::CompatibilityError

This was happening because the OP_WRITE_RAW instruction was writing using rb_str_cat and a character pointer, which isn't encoding aware, so was writing the UTF-8 text to the binary string. After that, the output buffer is no longer ascii compatible or UTF-8 compatible, so will get a compatibility error when a unicode encoded string with non-ascii compatible characters is written to the output buffer, as happens when writing a string variable.

Using Liquid in C

Hi Liquid team,

Thank you for designing liquid, I love it.

It's possible to use "liquid" inside C? There is any example to use in pure C and not Ruby?

Thanks in advance.

Best,
M.

Doesn't support key-value arguments for filters without spaces

Vanilla liquid supports keyword arguments without spaces around the colons.

❯ b rails c
irb(main):001:0> Liquid::Template.parse("{{ 'home.welcome' | t: count: 1 }}").render
=> "translation missing: en.home.welcome"
irb(main):002:0> require 'liquid/c'
=> true
irb(main):003:0> Liquid::Template.parse("{{ 'home.welcome' | t: count: 1 }}").render
=> "Liquid error: wrong number of arguments (3 for 1..2)"
irb(main):004:0> Liquid::Template.parse("{{ 'home.welcome' | t : count : 1 }}").render
=> "translation missing: en.home.welcome"

Implement `if`/`unless` as an instruction

Introducing an OP_BRANCHUNLESS <offset> instruction (inspired by Ruby).

Pseudo bytecode:

<condition>         <= evaled condition is on stack
OP_BRANCHUNLESS  2  <= jump +2 bytes unless stack_pop
<2 bytes of body>
<end if>

To keep things simple at first, we could compile only the if/unless without any else branches.

This would be the first jump type instruction. if is the simplest one, so it's a good starting point. After this, porting for, case, and, or to instructions will be possible.

However, I think this is where the const_ptr pointer breaks. Any instruction using the const_ptr inside a loop/jump will cause it to be out of sync w/ ip. This should be fixed first.

TypeError: no _dump_data is defined for class Liquid::C::ResourceLimits

Hello there,

when I try to update to latest 4.1 i have this on my specs

     TypeError:
       no _dump_data is defined for class Liquid::C::ResourceLimits

error come from this :

Rails.cache.fetch("render_template/liquid_template/website/#{template_version}/#{name}".freeze, compress: true) do
      Liquid::Template.new.parse(body)
    end

my current version is 4.0. liquid 5.3, ruby 2.7.5, rails 5.2.7

Any idea ? Thanks !

Replace the moving constant pointer with a constant table

The moving constant pointer optimizes for lookup of unique constants, as is the case when delegating to ruby AST objects. However, these will become less common as we add VM compilation for more of the ruby AST nodes.

As mentioned in #83, the moving constant pointer would require the use of two offsets for both ip and const_ptr in order to handle jump instructions for control flow tags. Conditional branching will become a hot code path once we compile control flow tags to VM instructions, so we probably don't want the added overhead of managing the additional jump offset for the moving constant pointer.

We might want to start by using a struct for the instruction pointer pair (ip, const_ptr) to reduce the amount of code affected by switching away from the moving constant pointer.

We could then introduce a constant table which can be referenced by index from instructions. We could start by using this for instructions that are more likely to re-use the same constant (e.g. OP_FILTER, OP_LOOKUP_CONST_KEY, OP_FIND_STATIC_VAR).

Since we are using byte code instructions, we will have to handle multi-byte index references. If we want to handle 24-bit length source string (i.e. 16 MiB), then I think that means we need to either handle 24-bit indexes to be conservative (assuming it isn't possible to introduce more constants than byte of source code but is possible to introduce a unique constant per 256 bytes of source code). However, we could instrument the code to determine if a 24-bit index is actually necessary in practice, if we want to remove/avoid support for it. We should at least be able to treat a 24-bit index as a cold code path.

Reading a 16-bit index does seem like it could end up being a hot code path. For performance, we might want to design for a little-endian CPU that can efficiently read a 16-bit aligned integer (e.g. x86, AMD64). To achieve the alignment of a 16-bit integer when adding an instruction which would have it unaligned, we can have an unaligned version of the instruction which simply skips over a padding/alignment byte then falls through to the aligned version of the instruction in the VM switch statement. We could try this strategy first in a separate PR for the OP_PUSH_INT16.

potential read past end of buffer in `skip_white`

@TonyZou

I was doing a general code review, and I noticed that:

  1. skip_white can return a pointer past the end of the input buffer
  2. none of its callers check for this

Solution should be to add logic to skip_white to return NULL when the buffer ends (just like scan_past), and to wrap all calls to skip_white in the TRY_PARSE macro.

'File does not exist: test_helper' error on 'rake test:integration'

Hi!

While packaging this for GNU Guix, I stumbled upon the following error, which I can't make sense of:

$ rake test:integration --trace
** Invoke test:integration (first_time)
** Invoke compile (first_time)
** Invoke compile:x86_64-linux (first_time)
** Invoke compile:liquid_c:x86_64-linux (first_time)
** Invoke copy:liquid_c:x86_64-linux:2.7.4 (first_time)
** Invoke lib (first_time, not_needed)
** Invoke tmp/x86_64-linux/liquid_c/2.7.4/liquid_c.so (first_time, not_needed)
** Invoke tmp/x86_64-linux/liquid_c/2.7.4 (first_time, not_needed)
** Invoke tmp/x86_64-linux/liquid_c/2.7.4/Makefile (first_time, not_needed)
** Invoke tmp/x86_64-linux/liquid_c/2.7.4 (not_needed)
** Invoke ext/liquid_c/extconf.rb (first_time, not_needed)
** Invoke ext/liquid_c/block.c (first_time, not_needed)
** Invoke ext/liquid_c/c_buffer.c (first_time, not_needed)
** Invoke ext/liquid_c/context.c (first_time, not_needed)
** Invoke ext/liquid_c/document_body.c (first_time, not_needed)
** Invoke ext/liquid_c/expression.c (first_time, not_needed)
** Invoke ext/liquid_c/lexer.c (first_time, not_needed)
** Invoke ext/liquid_c/liquid.c (first_time, not_needed)
** Invoke ext/liquid_c/parse_context.c (first_time, not_needed)
** Invoke ext/liquid_c/parser.c (first_time, not_needed)
** Invoke ext/liquid_c/raw.c (first_time, not_needed)
** Invoke ext/liquid_c/resource_limits.c (first_time, not_needed)
** Invoke ext/liquid_c/tokenizer.c (first_time, not_needed)
** Invoke ext/liquid_c/usage.c (first_time, not_needed)
** Invoke ext/liquid_c/variable.c (first_time, not_needed)
** Invoke ext/liquid_c/variable_lookup.c (first_time, not_needed)
** Invoke ext/liquid_c/vm.c (first_time, not_needed)
** Invoke ext/liquid_c/vm_assembler.c (first_time, not_needed)
** Invoke ext/liquid_c/vm_assembler_pool.c (first_time, not_needed)
** Invoke tmp/x86_64-linux/stage/lib (first_time, not_needed)
** Execute copy:liquid_c:x86_64-linux:2.7.4
install -c tmp/x86_64-linux/liquid_c/2.7.4/liquid_c.so lib/liquid_c.so
cp tmp/x86_64-linux/liquid_c/2.7.4/liquid_c.so tmp/x86_64-linux/stage/lib/liquid_c.so
** Execute compile:liquid_c:x86_64-linux
** Execute compile:x86_64-linux
** Execute compile
** Execute test:integration

File does not exist: test_helper

rake aborted!
Command failed with status (1): [ruby -w -I"lib:lib" -I"/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib" "/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/rake_test_loader.rb" "test/integration_test.rb" ]
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/testtask.rb:130:in `block (3 levels) in define'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/file_utils.rb:57:in `sh'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/file_utils.rb:104:in `ruby'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/testtask.rb:117:in `block (2 levels) in define'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/file_utils_ext.rb:58:in `verbose'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/testtask.rb:111:in `block in define'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `block in execute'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `each'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:281:in `execute'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `synchronize'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/task.rb:188:in `invoke'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:160:in `invoke_task'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `each'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:116:in `block in top_level'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:125:in `run_with_threads'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:110:in `top_level'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:83:in `block in run'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:186:in `standard_exception_handling'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/lib/rake/application.rb:80:in `run'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/lib/ruby/gems/2.7.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/bin/rake:23:in `load'
/gnu/store/j4z07lyi1ykk8bc68h1p4bpj1il9dn3f-ruby-2.7.4/bin/rake:23:in `<main>'
Tasks: TOP => test:integration

I'm using the 4.1.0 released gem as the source, with Ruby 2.7.4 and the following direct dependencies:

The unit tests are OK. Any ideas?

strict_filters no longer working

Hi,

I'm trying to update liquid-c in a project that I work on but I noticed that strict_filters is no longer working (perhaps since this commit).

I've created this gist reproducing the problem: https://gist.github.com/rafaelss/5ed21e59ad2cc5d82acf4b089b5697af

Running working.rb raises the exception correctly (fef8329 is the ref I'm currently using in the project), but running not_working.rb does not.

Is there anything I should change to make the most recent commits work correctly?

Cannot install liquid-c v4.0.0 via Jekill on mac OS

Hello,

When I install Jekyll on my mac via bundle install

Screenshot 2022-04-19 at 10 18 47

I have this error

Fetching gem metadata from https://rubygems.org/.........
Using rake 13.0.6
Using public_suffix 4.0.6
Using json 2.6.1
Using mini_portile2 2.6.1
Using racc 1.6.0
Using httpclient 2.8.3
Using bundler 2.3.11
Using concurrent-ruby 1.1.9
Using rexml 3.2.5
Using http_parser.rb 0.8.0
Using ffi 1.15.4
Using mercenary 0.4.0
Using rainbow 3.0.0
Using colorator 1.1.0
Using filesize 0.2.0
Using forwardable-extended 2.6.0
Using page_template_validator 0.1.0 from source at `_plugins/page_template_validator`
Using yell 2.2.2
Using rb-fsevent 0.11.0
Using eventmachine 1.2.7
Using liquid 4.0.3
Using rouge 3.26.1
Using i18n 1.8.11
Using unicode-display_width 1.8.0
Using progressbar 1.11.0
Using verbal_expressions 0.1.5
Using rb-inotify 0.10.1
Using parallel 1.21.0
Using em-websocket 0.5.3
Using addressable 2.8.0
Fetching liquid-c 4.0.0
Using algoliasearch 1.27.5
Using safe_yaml 1.0.5
Using kramdown 2.3.1
Using ethon 0.15.0
Using sassc 2.4.0
Using posix-spawn 0.3.15
Using jekyll-sass-converter 2.1.0
Using webrick 1.7.0
Using nokogiri 1.12.5
Using ruby-enum 0.9.0
Using terminal-table 2.0.0
Using listen 3.7.0
Using kramdown-parser-gfm 1.1.0
Using typhoeus 1.4.0
Using pathutil 0.16.2
Using algolia_html_extractor 2.6.4
Using nokogumbo 2.0.5
Using commonmarker 0.17.13
Using jekyll-watch 2.2.1
Using html-proofer 3.19.2
Using jekyll 4.2.1
Using jekyll-feed 0.15.1
Using jekyll-include-cache 0.2.1
Using jekyll-commonmark 1.3.1
Using jekyll-last-modified-at 1.3.0
Using jekyll-redirect-from 0.16.0
Using jekyll-sitemap 1.4.0
Using jekyll-algolia 1.7.1
Using jekyll-commonmark-ghpages 0.1.6
Installing liquid-c 4.0.0 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/jeremyfourna/Spryker/spryker-docs/vendor/bundle/ruby/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20220419-36477-dqrfvm.rb extconf.rb
creating Makefile

current directory: /Users/jeremyfourna/Spryker/spryker-docs/vendor/bundle/ruby/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR=" clean

current directory: /Users/jeremyfourna/Spryker/spryker-docs/vendor/bundle/ruby/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR="
compiling block.c
block.c:128:48: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:128:48: note: '{' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:128:48: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:128:48: note: ')' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:129:43: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:129:43: note: '{' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:129:43: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:129:43: note: ')' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:130:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:130:23: note: '{' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:130:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:130:23: note: ')' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:131:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:131:20: note: '{' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:131:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:131:20: note: ')' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:132:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:132:23: note: '{' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:132:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:132:23: note: ')' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:133:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:133:20: note: '{' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:133:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:133:20: note: ')' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:134:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:134:30: note: '{' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:134:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:134:30: note: ')' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:135:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:135:20: note: '{' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:135:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:135:20: note: ')' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:136:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:136:30: note: '{' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:136:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:136:30: note: ')' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:137:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts
[-Werror,-Wcompound-token-split-by-macro]
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:137:30: note: '{' token is here
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24:
note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5:
note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [block.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/jeremyfourna/Spryker/spryker-docs/vendor/bundle/ruby/2.6.0/gems/liquid-c-4.0.0 for inspection.
Results logged to
/Users/jeremyfourna/Spryker/spryker-docs/vendor/bundle/ruby/2.6.0/extensions/universal-darwin-21/2.6.0/liquid-c-4.0.0/gem_make.out

  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:99:in `run'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:51:in `block in make'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:43:in `each'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:43:in `make'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/ext_conf_builder.rb:62:in `block in build'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/tempfile.rb:295:in `open'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/ext_conf_builder.rb:29:in `build'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:185:in `block in build_extension'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:181:in `build_extension'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:229:in `block in build_extensions'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:226:in `each'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:226:in `build_extensions'
  /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/installer.rb:830:in `build_extensions'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/rubygems_gem_installer.rb:71:in `build_extensions'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/rubygems_gem_installer.rb:28:in `install'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/source/rubygems.rb:204:in `install'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/installer/gem_installer.rb:54:in `install'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/installer/gem_installer.rb:16:in `install_from_spec'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/installer/parallel_installer.rb:186:in `do_install'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/installer/parallel_installer.rb:177:in `block in worker_pool'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/worker.rb:62:in `apply_func'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/worker.rb:57:in `block in process_queue'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/worker.rb:54:in `loop'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/worker.rb:54:in `process_queue'
  /Users/jeremyfourna/.gem/ruby/2.6.0/gems/bundler-2.3.11/lib/bundler/worker.rb:91:in `block (2 levels) in create_threads'

An error occurred while installing liquid-c (4.0.0), and Bundler cannot continue.

In Gemfile:
  liquid-c

I can install it without problem liquid-c v4.1.0, but I have this error when trying to install v4.0.0

Building native extensions. This could take a while...
ERROR:  Error installing liquid-c:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20220419-36987-1bds2vr.rb extconf.rb
creating Makefile

current directory: /Library/Ruby/Gems/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR=" clean

current directory: /Library/Ruby/Gems/2.6.0/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR="
compiling block.c
block.c:128:48: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:128:48: note: '{' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:128:48: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:128:48: note: ')' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:129:43: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:129:43: note: '{' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:129:43: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:129:43: note: ')' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:130:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:130:23: note: '{' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:130:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:130:23: note: ')' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:131:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:131:20: note: '{' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:131:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:131:20: note: ')' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:132:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:132:23: note: '{' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:132:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:132:23: note: ')' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:133:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:133:20: note: '{' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:133:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:133:20: note: ')' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:134:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:134:30: note: '{' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:134:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:134:30: note: ')' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:135:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:135:20: note: '{' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:135:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:135:20: note: ')' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:136:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:136:30: note: '{' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:136:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:136:30: note: ')' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:137:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:137:30: note: '{' token is here
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [block.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/liquid-c-4.0.0 for inspection.
Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-21/2.6.0/liquid-c-4.0.0/gem_make.out

Segfault when exception renderer raises on non-internal errors in SFR

I don't think it's an urgent issue, because it only happens when an exception is raised from inside the exception renderer, and only the exception is raised from inside this else branch. Raising from anywhere else in the method does not cause a segfault.

So, as long as LiquidExceptionRenderer#track_liquid_unreported_exception does not raise, no segfault should happen.

The issue seems to be that ip is null. But why is it null, and only on that else branch? I don't know.

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
    frame #0: 0x00000001384a6010 liquid_c.bundle`vm_render_until_error(uncast_args=140732920747216) at vm.c:275:17
   272 	    args->ip = NULL; // used by vm_render_rescue, NULL to indicate that it isn't in a rescue block
   273
   274 	    while (true) {
-> 275 	        switch (*ip++) {
   276 	            case OP_LEAVE:
   277 	                return false;
   278
Target 0: (ruby) stopped.
(lldb) p args->ip
(const uint8_t *) $5 = 0x0000000000000000
(lldb) p args->node_line_number
(const uint8_t *) $6 = 0x0000000000000000
(lldb) p ip
(const uint8_t *) $7 = 0x0000000000000001 ""
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x00000001391a6010 liquid_c.bundle`vm_render_until_error(uncast_args=140732920747216) at vm.c:275:17
    frame #1: 0x00000001000a71c4 ruby`rb_vrescue2 + 276
    frame #2: 0x00000001000a708b ruby`rb_rescue2 + 123
    frame #3: 0x00000001391a683f liquid_c.bundle`liquid_vm_render(body=0x0000000159375d40, context=4392055680, output=4392745200) at vm.c:544:12
    frame #4: 0x000000013919e197 liquid_c.bundle`block_body_render_to_output_buffer(self=4392639680, context=4392055680, output=4392745200) at block.c:253:5
    frame #5: 0x000000010025b410 ruby`vm_call_cfunc + 368
    frame #6: 0x00000001002410f0 ruby`vm_exec_core + 15104
    frame #7: 0x000000010025624a ruby`rb_vm_exec + 2842
    frame #8: 0x0000000100253b71 ruby`rb_vm_invoke_bmethod + 1985
    frame #9: 0x000000010025bdcc ruby`vm_call_bmethod + 172
    frame #10: 0x000000010025c244 ruby`vm_call_opt_send + 756
    frame #11: 0x00000001002410f0 ruby`vm_exec_core + 15104
    frame #12: 0x000000010025624a ruby`rb_vm_exec + 2842
    frame #13: 0x000000010024ee97 ruby`rb_yield + 167
    frame #14: 0x00000001000038d9 ruby`rb_ary_each + 57
    frame #15: 0x000000010025b410 ruby`vm_call_cfunc + 368
    frame #16: 0x0000000100240f7d ruby`vm_exec_core + 14733
    frame #17: 0x000000010025624a ruby`rb_vm_exec + 2842
    frame #18: 0x000000010024ee97 ruby`rb_yield + 167
    frame #19: 0x0000000100009c72 ruby`rb_ary_collect + 242
    frame #20: 0x000000010025b410 ruby`vm_call_cfunc + 368
    frame #21: 0x0000000100240f7d ruby`vm_exec_core + 14733
    frame #22: 0x000000010025624a ruby`rb_vm_exec + 2842
    frame #23: 0x000000010016e1ef ruby`rb_proc_call + 159
    frame #24: 0x00000001000a9682 ruby`rb_ec_exec_end_proc + 370
    frame #25: 0x00000001000a615f ruby`rb_ec_teardown + 175
    frame #26: 0x00000001000a635e ruby`rb_ec_cleanup + 382
    frame #27: 0x00000001000a665f ruby`ruby_run_node + 95
    frame #28: 0x0000000100000abd ruby`main + 93
    frame #29: 0x00007fff6d915cc9 libdyld.dylib`start + 1
(lldb) expr (void)rb_backtrace()
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:68:in `block in autorun'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:141:in `run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:164:in `__run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:164:in `map'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:164:in `block in __run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:326:in `run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:354:in `with_info_handler'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:367:in `on_signal'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:327:in `block in run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:327:in `each'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:328:in `block (2 levels) in run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:341:in `run_one_method'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:1029:in `run_one_method'
	from /Users/ma/.gem/ruby/2.7.1/gems/minitest-reporters-1.4.2/lib/minitest/reporters.rb:48:in `run_with_hooks'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:93:in `run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:211:in `with_info_handler'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:367:in `on_signal'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:94:in `block in run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest.rb:272:in `time_it'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:95:in `block (2 levels) in run'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:195:in `capture_exceptions'
	from /opt/rubies/2.7.1/lib/ruby/gems/2.7.0/gems/minitest-5.14.2/lib/minitest/test.rb:98:in `block (3 levels) in run'
	from test/liquid/liquid_renderer_test.rb:191:in `block in <class:LiquidRendererTest>'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:99:in `render'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:163:in `render_liquid_template'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:189:in `instrument'
	from /Users/ma/.gem/ruby/2.7.1/gems/shopify-tracing-0.9.2/lib/shopify/tracing.rb:96:in `trace'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:190:in `block in instrument'
	from /opt/rubies/2.7.1/lib/ruby/2.7.0/forwardable.rb:235:in `distribution'
	from /Users/ma/.gem/ruby/2.7.1/gems/statsd-instrument-2.9.2/lib/statsd/instrument/legacy_client.rb:195:in `distribution'
	from /Users/ma/.gem/ruby/2.7.1/gems/statsd-instrument-2.9.2/lib/statsd/instrument/legacy_client.rb:281:in `measure_latency'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:191:in `block (2 levels) in instrument'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:166:in `block in render_liquid_template'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:205:in `render_template'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/null_profiling_strategy.rb:11:in `track_template_render'
	from /Users/ma/src/github.com/Shopify/storefront-renderer/app/liquid/liquid_renderer.rb:207:in `block in render_template'
	from /opt/rubies/2.7.1/lib/ruby/2.7.0/delegate.rb:83:in `method_missing'
	from /Users/ma/.gem/ruby/2.7.1/bundler/gems/liquid-7754d5aef571/lib/liquid/template.rb:194:in `render'
	from /Users/ma/.gem/ruby/2.7.1/bundler/gems/liquid-7754d5aef571/lib/liquid/template.rb:232:in `with_profiling'
	from /Users/ma/.gem/ruby/2.7.1/bundler/gems/liquid-7754d5aef571/lib/liquid/template.rb:195:in `block in render'
	from /Users/ma/.gem/ruby/2.7.1/bundler/gems/liquid-7754d5aef571/lib/liquid/document.rb:41:in `render_to_output_buffer'
	from /Users/ma/.gem/ruby/2.7.1/bundler/gems/liquid-7754d5aef571/lib/liquid/document.rb:41:in `render_to_output_buffer'

I tried reproducing with a test in Liquid-C, but haven't been able to yet, so I'm documenting this issue in case I forget.

Repo has corrupted

Looks like this repository has corrupted due to a fork issue. Sent a request to Github however it may help if you guys also follow this up

Install Problem due to Error Flags and Syntax Error

Hi team,

Trying to install liquid-c 4.0.0 under rvm ruby-2.6.8 environment but got these messages:

Command:

gem install liquid-c -v '4.0.0' --source 'https://rubygems.org/'

Error:

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/bin/ruby -I /Users/pyhsieh/.rvm/rubies/ruby-2.6.8/lib/ruby/site_ruby/2.6.0 -r ./siteconf20211022-13087-ldd9s5.rb extconf.rb
creating Makefile

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR=" clean

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR="
compiling block.c
block.c:128:48: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:128:48: note: '{' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:128:48: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:128:48: note: ')' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:129:43: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:129:43: note: '{' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:129:43: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:129:43: note: ')' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:130:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:130:23: note: '{' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:130:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:130:23: note: ')' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:131:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:131:20: note: '{' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:131:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:131:20: note: ')' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:132:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:132:23: note: '{' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:132:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:132:23: note: ')' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:133:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:133:20: note: '{' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:133:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:133:20: note: ')' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:134:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:134:30: note: '{' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:134:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:134:30: note: ')' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:135:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:135:20: note: '{' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:135:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:135:20: note: ')' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:136:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:136:30: note: '{' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:136:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1816:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:136:30: note: ')' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:137:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:137:30: note: '{' token is here
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1826:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/include/ruby-2.6.0/ruby/ruby.h:1811:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [block.o] Error 1

make failed, exit code 2

If compile with warning flags disabled:

gem install liquid-c -v '4.0.0' --source 'https://rubygems.org/' -- --with-cflags=\"-Wno-error -Wno-compound-token-split-by-macro\"

Then I got:

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
/Users/pyhsieh/.rvm/rubies/ruby-2.6.8/bin/ruby -I /Users/pyhsieh/.rvm/rubies/ruby-2.6.8/lib/ruby/site_ruby/2.6.0 -r ./siteconf20211022-14820-xjv08z.rb extconf.rb --with-cflags\=\"-Wno-error -Wno-compound-token-split-by-macro\"
creating Makefile

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR=" clean

current directory: /Users/pyhsieh/.rvm/gems/ruby-2.6.8/gems/liquid-c-4.0.0/ext/liquid_c
make "DESTDIR="
compiling block.c
/bin/sh: -c: line 0: unexpected EOF while looking for matching `"'
/bin/sh: -c: line 1: syntax error: unexpected end of file
make: *** [block.o] Error 2

make failed, exit code 2

Any ideas?

3.x – Cannot import

I'm using 3.x (for Jekyll). With a gemfile of:

gem 'liquid', github: 'Shopify/liquid', branch: '3-0-stable'
gem 'liquid-c', github: 'Shopify/liquid-c', branch: '3-0-stable'

I get the following when trying to import the library:

irb(main):001:0> require 'liquid/c'
NameError: uninitialized constant Liquid::BlockBody
Did you mean?  Liquid::Block
	from /home/will/.bundle/ruby/2.3.0/liquid-c-368d76cde51d/lib/liquid/c.rb:3:in `require'
	from /home/will/.bundle/ruby/2.3.0/liquid-c-368d76cde51d/lib/liquid/c.rb:3:in `<top (required)>'
	from (irb):1:in `require'
	from (irb):1
	from /usr/bin/irb:11:in `<top (required)>'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli/exec.rb:74:in `load'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli/exec.rb:74:in `kernel_load'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli/exec.rb:27:in `run'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli.rb:332:in `exec'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli.rb:20:in `dispatch'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/cli.rb:11:in `start'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/exe/bundle:34:in `block in <top (required)>'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/lib/bundler/friendly_errors.rb:100:in `with_friendly_errors'
	from /var/lib/gems/2.3.0/gems/bundler-1.13.6/exe/bundle:26:in `<top (required)>'
	from /usr/local/bin/bundle:23:in `load'
	from /usr/local/bin/bundle:23:in `<main>'

Install problem

I am using liquid-c in my jekyll based site and cant seem to get it to install on one workstation.

Ruby is installed with brew and the usual configurations are in place. I reinstalled Ruby and did a bunch of other trials, but always end up with this problem. The same site and setup works on other machines and on this machine with using jekyll-docker.

Any tip on what to look at?


Here is the error message I am getting:

Using liquid-c 4.0.0 from https://github.com/Shopify/liquid-c.git (at v4.0.0@8196106)
/usr/local/Cellar/ruby/2.7.2/lib/ruby/2.7.0/rubygems/ext/builder.rb:167: warning: conflicting chdir during another chdir block
/usr/local/Cellar/ruby/2.7.2/lib/ruby/2.7.0/rubygems/ext/builder.rb:175: warning: conflicting chdir during another chdir block
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/Users/manfred/dev/github/org/site/vendor/bundle/ruby/2.7.0/bundler/gems/liquid-c-81961067cdaa/ext/liquid_c
/usr/local/opt/ruby/bin/ruby -I /usr/local/Cellar/ruby/2.7.2/lib/ruby/2.7.0 -r
./siteconf20201110-2586-1tp1kmp.rb extconf.rb
creating Makefile

current directory:
/Users/manfred/dev/github/org/site/vendor/bundle/ruby/2.7.0/bundler/gems/liquid-c-81961067cdaa/ext/liquid_c
make "DESTDIR=" clean

current directory:
/Users/manfred/dev/github/org/site/vendor/bundle/ruby/2.7.0/bundler/gems/liquid-c-81961067cdaa/ext/liquid_c
make "DESTDIR="
compiling block.c
error: unknown warning option '-Wmisleading-indentation'; did you mean
'-Wbinding-in-condition'? [-Werror,-Wunknown-warning-option]
make: *** [block.o] Error 1

make failed, exit code 2

Gem files will remain installed in
/Users/manfred/dev/github/org/site/vendor/bundle/ruby/2.7.0/bundler/gems/liquid-c-81961067cdaa
for inspection.
Results logged to
/Users/manfred/dev/github/org/site/vendor/bundle/ruby/2.7.0/bundler/gems/extensions/x86_64-darwin-19/2.7.0/liquid-c-81961067cdaa/gem_make.out

An error occurred while installing liquid-c (4.0.0), and Bundler cannot
continue.

In Gemfile:
  liquid-c

Compile nested block bodies into their parent block body object

Currently, the library writes liquid VM code into separate growable buffers (in vm_assembler_t) for each Liquid::C::BlockBody object. However, for block body serialization and deserialization (#77) we will want to share an immutable memory allocation across block bodies, so block bodies will need offsets into that shared memory for execution.

Since block bodies will be connected in this way for execution, we may also want to make parsing more efficient by re-using a vm_assembler_t for a block body once that block body has finished being compiled (e.g. when its parent block tag is finished compiling), by not embedding it in the block_body_t struct. That way we could save on the number of memory allocations for these vm_assembler_t buffers and will have less vm_assembler_t buffers to combine at the end of parsing / compilation. For instance, we could have one vm_assembler_t per-level of nesting in the template.

Support for ruby 2.7.4p191 [x86_64-darwin21]

I'm having trouble installing liquid-c on Ruby 2.7.4 on macOS Monterey.

It installs correctly on Ruby 3.0.2 on the same machine.

I've tried switching to using the main branch on github as a source in bundler and that works too.

I have completely reinstalled xcode, homebrew and ruby (via asdf), hoping that would help, but to no avail.

Some output from gem env:

RubyGems Environment:
  - RUBYGEMS VERSION: 3.2.29
  - RUBY VERSION: 2.7.4 (2021-07-07 patchlevel 191) [x86_64-darwin21]
  - INSTALLATION DIRECTORY: /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0
  - USER INSTALLATION DIRECTORY: /Users/iain/.gem/ruby/2.7.0
  - RUBY EXECUTABLE: /Users/iain/.asdf/installs/ruby/2.7.4/bin/ruby
  - GIT EXECUTABLE: /usr/local/bin/git
  - EXECUTABLE DIRECTORY: /Users/iain/.asdf/installs/ruby/2.7.4/bin
  - SPEC CACHE DIRECTORY: /Users/iain/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/iain/.asdf/installs/ruby/2.7.4/etc
  - RUBYGEMS PLATFORMS:
     - ruby
     - x86_64-darwin-21

Below is the full output of gem install liquid-c:

Building native extensions. This could take a while...
ERROR:  Error installing liquid-c:
	ERROR: Failed to build gem native extension.

    current directory: /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0/gems/liquid-c-4.0.0/ext/liquid_c
/Users/iain/.asdf/installs/ruby/2.7.4/bin/ruby -I /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/site_ruby/2.7.0 -r ./siteconf20211027-38778-123e3iq.rb extconf.rb
creating Makefile

current directory: /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0/gems/liquid-c-4.0.0/ext/liquid_c
make DESTDIR\= clean

current directory: /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0/gems/liquid-c-4.0.0/ext/liquid_c
make DESTDIR\=
compiling block.c
block.c:128:48: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:128:48: note: '{' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:128:48: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:128:48: note: ')' token is here
    intern_raise_missing_variable_terminator = rb_intern("raise_missing_variable_terminator");
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:129:43: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:129:43: note: '{' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:129:43: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:129:43: note: ')' token is here
    intern_raise_missing_tag_terminator = rb_intern("raise_missing_tag_terminator");
                                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:130:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:130:23: note: '{' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:130:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:130:23: note: ')' token is here
    intern_nodelist = rb_intern("@nodelist");
                      ^~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:131:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:131:20: note: '{' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:131:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:131:20: note: ')' token is here
    intern_blank = rb_intern("@blank");
                   ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:132:23: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:132:23: note: '{' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:132:23: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:132:23: note: ')' token is here
    intern_is_blank = rb_intern("blank?");
                      ^~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:133:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:133:20: note: '{' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:133:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:133:20: note: ')' token is here
    intern_clear = rb_intern("clear");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:134:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:134:30: note: '{' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:134:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:134:30: note: ')' token is here
    intern_registered_tags = rb_intern("registered_tags");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:135:20: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:135:20: note: '{' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:135:20: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:135:20: note: ')' token is here
    intern_parse = rb_intern("parse");
                   ^~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:136:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:136:30: note: '{' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
block.c:136:30: error: '}' and ')' tokens terminating statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1837:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    }
    ^
block.c:136:30: note: ')' token is here
    intern_square_brackets = rb_intern("[]");
                             ^~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:56: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                                                       ^
block.c:137:30: error: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Werror,-Wcompound-token-split-by-macro]
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                      ^
block.c:137:30: note: '{' token is here
    intern_set_line_number = rb_intern("line_number=");
                             ^~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:24: note: expanded from macro 'rb_intern'
        __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/iain/.asdf/installs/ruby/2.7.4/include/ruby-2.7.0/ruby/ruby.h:1832:5: note: expanded from macro 'RUBY_CONST_ID_CACHE'
    {                                                   \
    ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [block.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0/gems/liquid-c-4.0.0 for inspection.
Results logged to /Users/iain/.asdf/installs/ruby/2.7.4/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-21/2.7.0/liquid-c-4.0.0/gem_make.out

Add support for serializing liquid templates along with their VM code

Once #59 and #60 are merged, the liquid benchmarks show that 60% of the time to parse and render a template happens during parsing. We could save a lot of that time by persisting (e.g. to a cache initially) the parsed template so that it can be re-used for further renders.

I think we should have the persisted format be fairly stable, such that it can be used across deploys of the application. As such, I don't think we should just use Marshal on the liquid gem's parse tree, since that can easily lead to breaking changes from code written without awareness of liquid-c. Instead, we should re-parse tag nodes on deserialization if that don't support liquid VM compilation. For code that is compiled into liquid VM code, we should include two versions in the serialized VM code, one for the liquid-c and one for the application, so either can bump these versions to avoid rendering incompatible VM code.

So the serialized block bodies will consist of the following sections:

  1. liquid VM instructions that don't require deserialization for execution
  2. An array of marshal dumped ruby constants and will require marshal loading on deserialization
  3. Uncompiled tags to parse on deserialization, including the type of tag (e.g. regular, block or raw) and references to any block bodies and "unknown tags" (i.e. handled from Liquid::Block#unknown_tag, such as elsif for Liquid::If)

This will require combining the VM assembler buffers for these block bodies together and removing the assumption that each block body will own its own assembler buffers. Instead, the block bodies should instead reference offsets into the shared buffer for execution. This could be done before adding serialization support (#78).

To keep the ruby constant array simple, we will want to compile the non-ruby constant arguments into the VM instructions as immediate arguments. Currently this isn't the case for OP_RENDER_VARIABLE_RESCUE and OP_WRITE_RAW. Note that doing this for OP_WRITE_RAW will add copying overhead that won't be beneficial without using it for serialization.

Another possible application version compatibility concern is the Liquid::ParseContext, which is an argument for parsing, which can end up being saved and used for rendering (e.g. for parsing included templates). To check for compatibility, we may want to require the application to pass in the same parse options for both parsing and deserializing to consider the serialized template to be compatible with the current application version. We may also want to check the parse context after parsing to make sure the application doesn't depend on mutations of the parse context.

Ruby 3.1

Hello, when i'm trying to use ruby 3.1 i get this error ... Any idea ? Using Liquid 5.3, latest liquid-c, thanks a lot !

TypeError:
  class Liquid::C::ResourceLimits needs to have instance method `_load_data'

private method `shift' called for Liquid::C::Tokenizer

  • liquid 48cb643c026557f48e524dfd39cc9ff90aa3db95
  • liquid-c b20181a
  • ruby 2.7.6p219

Put in liquid-c per the readme and tried my app.

private method `shift' called for #<Liquid::C::Tokenizer:0x00007f5cab514370>
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/block_body.rb:121:in `parse_for_document'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/block_body.rb:29:in `parse'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/document.rb:55:in `parse_body'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/document.rb:23:in `parse'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/document.rb:7:in `parse'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-c-b20181a5e72a/lib/liquid/c.rb:120:in `parse'
/home/jason/.rbenv/versions/2.7.6/lib/ruby/gems/2.7.0/bundler/gems/liquid-48cb643c0265/lib/liquid/template.rb:111:in `parse'

Add profiling support

Right now, only Ruby Liquid has profiling. Profiling Liquid templates in production triggers Ruby Liquid to render the template, not Liquid::C. This is leading us on the wrong paths RE what to optimize.

I need to look at how other VMs are doing profiling with low overhead.

Stable?

The version on Rubygems.org is v0.0.2. This tells me, as a subscriber of SemVer, that it's not stable – that it should not be used in production environments.

Is this assumption true? The README does not discuss versioning practices. What do you think about versioning it (at least at the MAJOR level) alongside Liquid-ruby?

What's the rational behind joining array elements on display?

https://github.com/Shopify/liquid-c/blob/master/ext/liquid_c/vm.c#L117-L130 seems to be responsible for making the test

The current test (https://github.com/Shopify/liquid-c/blob/master/test/unit/variable_test.rb#L124-L126) is implemented as follows:

 def test_write_array
    output = Liquid::Template.parse("{{ ary }}").render({ "ary" => ["foo", 123, ["nested", "ary"], nil, 0.5] })
    assert_equal("foo123nestedary0.5", output)
  end

However, I can hardly find any reason for such behavior. Instead, I would expect the following assertion to pass:

output = Liquid::Template.parse("{{ ary }}").render({ "ary" => ["foo", 123, ["nested", "ary"], nil, 0.5] })
assert_equal('["foo", 123, ["nested", "ary"], nil, 0.5]', output)

Would you consider changing this behavior, which I believe would be equivalent to just removing a couple of lines of code without having to add any new ones https://github.com/Shopify/liquid-c/blob/master/ext/liquid_c/vm.c#L117-L130 ?

Installing liquid-c using Bundler fails on Ubuntu 21.10 with Ruby 3.1.3

Issue

Installing liquid-c using Bundler fails and causes an error on Ubuntu 21.10 with Ruby 3.1.3. On the same system with Ruby 3.1.2, installing liquid-c using Bundler was completed successfully.

The error is shown below:

user@ubuntu21:~/myblog$ ruby -v
ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x86_64-linux]
user@ubuntu21:~/myblog$ bundle add liquid-c
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Fetching gem metadata from https://rubygems. org/...........
Resolving dependencies...
Using bundler 2.4.2
Using public_suffix 5.0.1
Using colorator 1.1.0
Using eventmachine 1.2.7
Using http_parser.rb 0.8.0
Using ffi 1.15.5
Using forwardable-extended 2.6.0
Using google-protobuf 3.21.12 (x86_64-linux)
Using rb-fsevent 0. 11.2
Using rexml 3.2.5
Using liquid 4.0.3
Using mercenary 0.4.0
Using rouge 4.0.1
Using safe_yaml 1.0.5
Using unicode-display_width 2.3.0
Using webrick 1.7.0
Using concurrent- ruby 1.1.10
Using addressable 2.8.1
Using em-websocket 0.5.3
Using sass-embedded 1.57.1 (x86_64-linux-gnu)
Using rb-inotify 0.10.1
Using kramdown 2.4.0
Using pathutil 0.16.2
Fetching liquid-c 4.0.0
Using terminal -table 3.0.2
Using 118n 1.12.0
Using jekyll-sass-converter 3.0.0
Using listen 3.7.1
Using kramdown-parser-gfm 1.1.0
Using jekyll-watch 2.2.1
Using jekyll 4.3.1
Using jekyll-feed 0.17.0
Using jekyll-seo-tag 2.8.0
Using minima 2.5.1
Installing liquid-c 4.0.0 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/user/gems/gems/liquid-c-4.0.0/ext/liquid_c
/home/user/.rbenv/versions/3.1.3/bin/ruby -I /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0 extconf.rb
creating Makefile

current directory: /home/user/gems/gems/liquid-c-4.0.0/ext/liquid_c
make DESTDIR\= sitearchdir\=./.gem.20230102-2556-yd5wkw sitelibdir\=./.gem.20230102-2556-yd5wkw clean

current directory: /home/user/gems/gems/liquid-c-4.0.0/ext/liquid_c
make DESTDIR\= sitearchdir\=./.gem.20230102-2556-yd5wkw sitelibdir\=./.gem.20230102-2556-yd5wkw
compiling block.c
block.c: In function ‘init_liquid_block’:
block.c:126:6: error: old-style function definition [-Werror=old-style-definition]
  126 | void init_liquid_block()
      |      ^~~~~~~~~~~~~~~~~
At top level:
cc1: note: unrecognized command-line option ‘-Wno-self-assign’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-parentheses-equality’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-constant-logical-operand’ may have been intended to silence earlier diagnostics
cc1: all warnings being treated as errors
make: *** [Makefile:247: block.o] Error 1

make failed, exit code 2

Gem files will remain installed in /home/user/gems/gems/liquid-c-4.0.0 for inspection.
Results logged to /home/user/gems/extensions/x86_64-linux/3.1.0/liquid-c-4.0.0/gem_make.out

  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:102:in `run'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:51:in `block in make'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:43:in `each'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:43:in `make'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/ext_conf_builder.rb:42:in `build'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:171:in `build_extension'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:205:in `block in build_extensions'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:202:in `each'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/ext/builder.rb:202:in `build_extensions'
  /home/user/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/installer.rb:843:in `build_extensions'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/rubygems_gem_installer.rb:72:in `build_extensions'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/rubygems_gem_installer.rb:28:in `install'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/source/rubygems.rb:200:in `install'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/installer/gem_installer.rb:54:in `install'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/installer/gem_installer.rb:16:in `install_from_spec'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/installer/parallel_installer.rb:155:in `do_install'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/installer/parallel_installer.rb:146:in `block in worker_pool'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/worker.rb:62:in `apply_func'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/worker.rb:57:in `block in process_queue'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/worker.rb:54:in `loop'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/worker.rb:54:in `process_queue'
  /home/user/gems/gems/bundler-2.4.2/lib/bundler/worker.rb:90:in `block (2 levels) in create_threads'

An error occurred while installing liquid -c (4.0.0), and Bundler cannot continue.

In Gemfile:
liquid-c

Steps to Reproduce

  1. Have a system running Ubuntu.
  2. Install ruby 3.1.3.
# If you have rbenv, you can run the following to install ruby 3.1.3:
rbenv install 3.1.3
rbenv global 3.1.3
  1. Install Jekyll and Bundler.
    gem install jekyll bundler
  2. Create a new Jekyll site.
    jekyll new mysite
  3. Change the working directory to your new site.
    cd mysite
  4. Install liquid-c using Bundler.
    bundle add liquid-c

Environment

Ubuntu 21.10
Ruby 3.1.3
Bundler 2.4.2
Jekyll 4.3.1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.