From de733f328e360dcae694319b0ff8e488d1d86704 Mon Sep 17 00:00:00 2001 From: Mario Caropreso Date: Wed, 16 Aug 2023 20:05:45 +0000 Subject: [PATCH] Addressed an issue where syntax errors generated inside an eval method cause an Internal Server Error due to a TypeError. In order to display the extraced source of a syntax error, we try to locate the node id for the backtrace location. The call to RubyVM::AbstractSyntaxTree.node_id_for_backtrace_location is expecting a Thread::Backtrace::Location object, but we are passing a SourceMapLocation instead. This commit does two things: 1) it addresses the issue by making sure that we are always passing a Thread::Backtrace::Location instead 2) it allows the development view to show the extracted source fragment --- .../lib/active_support/syntax_error_proxy.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/syntax_error_proxy.rb b/activesupport/lib/active_support/syntax_error_proxy.rb index 59d96d86813b..a0e2ce385744 100644 --- a/activesupport/lib/active_support/syntax_error_proxy.rb +++ b/activesupport/lib/active_support/syntax_error_proxy.rb @@ -43,7 +43,8 @@ def backtrace_locations private def parse_message_for_trace - if __getobj__.to_s.start_with?("(eval") + # If RUBY_VERSION < 3.2, the path method is not available for SyntaxError + if is_eval? # If the exception is coming from a call to eval, we need to keep # the path of the file in which eval was called to ensure we can # return the right source fragment to show the location of the @@ -54,5 +55,15 @@ def parse_message_for_trace __getobj__.to_s.split("\n") end end + + if SyntaxError.method_defined?(:path) # Ruby 3.3+ + def is_eval? + __getobj__.path.start_with?("(eval") + end + else # 3.2 and older versions of Ruby + def is_eval? + __getobj__.to_s.start_with?("(eval") + end + end end end