Skip to content

Commit 6e18b81

Browse files
authored
Merge pull request #16 from gi/release/0.3.2
Version 0.3.2 ### Changed - `engine`: fixed issue with memory leak ([#15](#15))
2 parents 225cc86 + d4e3a90 commit 6e18b81

5 files changed

Lines changed: 38 additions & 4 deletions

File tree

.rubocop.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ RSpec/MultipleMemoizedHelpers:
154154
RSpec/NestedGroups:
155155
Max: 8
156156

157+
Style/DocumentDynamicEvalDefinition:
158+
Enabled: false
159+
157160
Style/BlockDelimiters:
158161
EnforcedStyle: semantic
159162
AllowBracesOnProceduralOneLiners: true

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.3.2] - 2022-02-17
11+
12+
### Changed
13+
- `engine`: fixed issue with memory leak ([#15](https://github.com/gi/handlebars-ruby/pull/15))
14+
1015
## [0.3.1] - 2022-02-04
1116

1217
### Added

lib/handlebars/engine.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require "json"
55
require "mini_racer"
66
require "securerandom"
7+
require_relative "engine/function"
78
require_relative "engine/version"
89

910
module Handlebars
@@ -199,9 +200,7 @@ def call_via_eval(name, args, assign: false)
199200
result = evaluate(code)
200201

201202
if var && result.is_a?(MiniRacer::JavaScriptFunction)
202-
result = ->(*a) { @context.call(var, *a) }
203-
finalizer = ->(*) { evaluate("delete #{var}") }
204-
ObjectSpace.define_finalizer(result, finalizer)
203+
result = Function.new(@context, var)
205204
end
206205

207206
result

lib/handlebars/engine/function.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# frozen_string_literal: true
2+
3+
module Handlebars
4+
class Engine
5+
# A proxy for a JavaScript function defined in the context.
6+
class Function
7+
def initialize(context, name)
8+
@context = context
9+
@name = name
10+
ObjectSpace.define_finalizer(self, self.class.finalizer(context, name))
11+
end
12+
13+
def call(*args)
14+
@context.call(@name, *args)
15+
end
16+
17+
def self.finalizer(context, name)
18+
proc {
19+
begin
20+
context.eval("delete #{name}")
21+
rescue ThreadError # rubocop:disable Lint/SuppressedException
22+
end
23+
}
24+
end
25+
end
26+
end
27+
end

lib/handlebars/engine/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22

33
module Handlebars
44
class Engine
5-
VERSION = "0.3.1"
5+
VERSION = "0.3.2"
66
end
77
end

0 commit comments

Comments
 (0)