aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack')
-rw-r--r--actionpack/CHANGELOG.md13
-rw-r--r--actionpack/lib/action_view/data/encoding_conversions.dumpbin0 -> 122854 bytes
-rw-r--r--actionpack/lib/action_view/template.rb26
3 files changed, 39 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG.md b/actionpack/CHANGELOG.md
index 99c3ac3c04..74711c0320 100644
--- a/actionpack/CHANGELOG.md
+++ b/actionpack/CHANGELOG.md
@@ -62,6 +62,19 @@
persistent between requests so if you need to manipulate the environment
for your test you need to do it before the cookie jar is created.
+## Rails 3.1.2 (unreleased) ##
+
+* Implement a workaround for a bug in ruby-1.9.3p0 where an error would be raised
+ while attempting to convert a template from one encoding to another.
+
+ Please see http://redmine.ruby-lang.org/issues/5564 for details of the bug.
+
+ The workaround is to load all conversions into memory ahead of time, and will
+ only happen if the ruby version is *exactly* 1.9.3p0. The hope is obviously that
+ the underlying problem will be resolved in the next patchlevel release of
+ 1.9.3.
+
+ *Jon Leighton*
## Rails 3.1.1 (unreleased) ##
diff --git a/actionpack/lib/action_view/data/encoding_conversions.dump b/actionpack/lib/action_view/data/encoding_conversions.dump
new file mode 100644
index 0000000000..18d7cd448b
--- /dev/null
+++ b/actionpack/lib/action_view/data/encoding_conversions.dump
Binary files differ
diff --git a/actionpack/lib/action_view/template.rb b/actionpack/lib/action_view/template.rb
index 10797c010f..1f1a8f7867 100644
--- a/actionpack/lib/action_view/template.rb
+++ b/actionpack/lib/action_view/template.rb
@@ -3,6 +3,32 @@ require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/kernel/singleton_class'
+if RUBY_ENGINE == 'ruby' && RUBY_VERSION == '1.9.3' && RUBY_PATCHLEVEL == 0
+ # This is a hack to work around a bug in Ruby 1.9.3p0:
+ # http://redmine.ruby-lang.org/issues/5564
+ #
+ # Basically, at runtime we may need to perform some encoding conversions on the templates,
+ # but if the converter hasn't been loaded by Ruby beforehand (i.e. now), then it won't be
+ # able to find it (due to a bug).
+ #
+ # However, we don't know what conversions we may need to do a runtime. So we load up a
+ # marshal-dumped structure which contains a pre-generated list of all the possible conversions,
+ # and we load all of them.
+ #
+ # In my testing this increased the process size by about 3.9 MB (after the conversions array
+ # is GC'd) and took around 170ms to run, which seems acceptable for a workaround.
+ #
+ # The script to dump the conversions is: https://gist.github.com/1342729
+
+ filename = File.join(File.dirname(__FILE__), 'data', 'encoding_conversions.dump')
+ conversions = Marshal.load(File.read(filename))
+ conversions.each do |from, to_array|
+ to_array.each do |to|
+ Encoding::Converter.new(from, to)
+ end
+ end
+end
+
module ActionView
# = Action View Template
class Template