Skip to content

Commit 542deb4

Browse files
committed
Fix compiled template external calls
- Don't undef __send__ (causes warnings) - Dynamic include/render now call __external__.call(:include/render, ...) - Default external handler raises FileSystemError for missing assets - Enables proper yield-based external call handling
1 parent c5a44be commit 542deb4

File tree

4 files changed

+11
-27
lines changed

4 files changed

+11
-27
lines changed

lib/liquid/box.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -386,16 +386,13 @@ class << Kernel
386386
end
387387

388388
def neuter_basic_object!
389-
# Suppress the "__send__" warning - we know what we're doing
390389
@box.eval(<<~'RUBY')
391-
original_verbose = $VERBOSE
392-
$VERBOSE = nil
393390
class BasicObject
394391
undef_method(:instance_eval) rescue nil
395392
undef_method(:instance_exec) rescue nil
396-
undef_method(:__send__) rescue nil
393+
# Don't undef __send__ - it causes warnings and is equivalent to send
394+
# which we already restrict via public_send
397395
end
398-
$VERBOSE = original_verbose
399396
RUBY
400397
end
401398

lib/liquid/compile/compiled_template.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ def default_external_handler(filter_handler)
173173
input # Return unchanged if filter not found
174174
end
175175

176+
when :include, :render
177+
# Dynamic include/render - not supported without a custom handler
178+
template_name, _var, _attrs, _alias_name, *_rest = args
179+
raise Liquid::FileSystemError, "Could not find asset #{template_name}"
180+
176181
else
177182
raise ArgumentError, "Unknown external call type: #{call_type}"
178183
end

lib/liquid/compile/tags/include_compiler.rb

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ def self.compile_dynamic_include(tag, compiler, code)
9595

9696
if compiler.debug?
9797
code.line "# Dynamic include (template name from variable)"
98-
code.line "$stderr.puts '* WARN: Liquid runtime file system access - dynamic include (template name from variable)' if $VERBOSE"
9998
end
10099

101100
name_expr = ExpressionCompiler.compile(template_name_expr, compiler)
@@ -111,16 +110,8 @@ def self.compile_dynamic_include(tag, compiler, code)
111110
var_expr = variable_name_expr ? ExpressionCompiler.compile(variable_name_expr, compiler) : "nil"
112111
alias_expr = alias_name ? alias_name.inspect : "nil"
113112

114-
# Call the runtime dynamic include method
115-
code.line "if defined?(__include_dynamic__)"
116-
code.indent do
117-
code.line "__output__ << __include_dynamic__(#{name_expr}, #{var_expr}, #{attrs_var}, #{alias_expr}, assigns)"
118-
end
119-
code.line "else"
120-
code.indent do
121-
code.line "raise RuntimeError, 'Dynamic include requires __include_dynamic__ method: ' + #{name_expr}.inspect"
122-
end
123-
code.line "end"
113+
# Call the external handler for dynamic includes
114+
code.line "__output__ << __external__.call(:include, #{name_expr}, #{var_expr}, #{attrs_var}, #{alias_expr}, assigns, __context__)"
124115
end
125116
end
126117
end

lib/liquid/compile/tags/render_compiler.rb

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ def self.compile_dynamic_render(tag, compiler, code)
152152

153153
if compiler.debug?
154154
code.line "# Dynamic render (template name from variable)"
155-
code.line "$stderr.puts '* WARN: Liquid runtime file system access - dynamic render (template name from variable)' if $VERBOSE"
156155
end
157156

158157
name_expr = ExpressionCompiler.compile(template_name_expr, compiler)
@@ -168,16 +167,8 @@ def self.compile_dynamic_render(tag, compiler, code)
168167
var_expr = variable_name_expr ? ExpressionCompiler.compile(variable_name_expr, compiler) : "nil"
169168
alias_expr = alias_name ? alias_name.inspect : "nil"
170169

171-
# Call the runtime dynamic render method
172-
code.line "if defined?(__render_dynamic__)"
173-
code.indent do
174-
code.line "__output__ << __render_dynamic__(#{name_expr}, #{var_expr}, #{attrs_var}, #{alias_expr}, #{is_for_loop})"
175-
end
176-
code.line "else"
177-
code.indent do
178-
code.line "raise RuntimeError, 'Dynamic render requires __render_dynamic__ method: ' + #{name_expr}.inspect"
179-
end
180-
code.line "end"
170+
# Call the external handler for dynamic renders
171+
code.line "__output__ << __external__.call(:render, #{name_expr}, #{var_expr}, #{attrs_var}, #{alias_expr}, #{is_for_loop}, __context__)"
181172
end
182173
end
183174
end

0 commit comments

Comments
 (0)