deferral 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a4478021f73e80fbf08a0d2830543684653ea7513c836c7c03ae798b9fe96798
4
- data.tar.gz: 78d3092455e200432ca094fef131875060330fe72d9ea4498b5c7e2485d43d9b
3
+ metadata.gz: df6589679f83c024ae2b3e33c2a172f86b7b71b94b135b79af9fa80201d8911f
4
+ data.tar.gz: 2265ea2d27731ffc8abe5f358b67bc3ef91538334969af2a0bfb29adef86fa21
5
5
  SHA512:
6
- metadata.gz: 33bdfd6fcd268d83299f9f7c78fe377e14ee041d00a65d2b0c19b556dbe9cc9bece3370089546ce619b857c89b7bc894a1e73987ebe564c44b2c483a218d6c19
7
- data.tar.gz: 6375625cb220f0aa1f138e8c776591e9e226ed752d3ef0bda2e9583ac33f3649386e18e9360b69df84fab346bf38cf72e591a3613f8a014b43891035f099c61b
6
+ metadata.gz: 2ecb6345db973339220e9cd5b2b57d1c6f0d80f6d1b5e64519348cda9df3a66a3abcf21d508d72ca882b0eb096c8fa26af898a0642c67bd01aa93a2aa7f01d76
7
+ data.tar.gz: 86d0896af5471e7f1c9d64e2458567b06a298479050e687541fc3d6dd48e50f124464db2b91c876b011fe9448a261abe4fb32fe9245ec083a5444525fa334e89
data/README.md CHANGED
@@ -3,12 +3,14 @@
3
3
  ```ruby
4
4
  # gem install deferral
5
5
 
6
- require "deferral"
6
+ require "deferral/toplevel"
7
+ using Deferral::TopLevel
8
+ # it makes "defer" without module name available everywhere in this file
7
9
 
8
10
  def my_method_name
9
11
  # ...
10
12
  file = File.open("my_file", "r")
11
- Deferral.defer { file.close }
13
+ defer { file.close }
12
14
 
13
15
  file.write "data..."
14
16
  # ...
@@ -19,16 +21,15 @@ def my_method_name(list)
19
21
  # ...
20
22
  list.each do |item|
21
23
  file = File.open(item, "r")
22
- Deferral.defer { file.close }
24
+ defer { file.close }
23
25
 
24
26
  file.write "data..."
25
27
  # ...
26
28
  end # `file.close` is called at the end of block
27
29
  end
28
30
 
29
- require "deferral/toplevel"
30
- using Deferral::TopLevel
31
- # it makes "defer" without module name available everywhere in this file
31
+ # "deferral" imports `Deferral.defer`, not to inject top-level methods widely.
32
+ require "deferral"
32
33
 
33
34
  # or enable everywhere! (DANGER!)
34
35
  require "deferral/kernel_ext"
data/lib/deferral.rb CHANGED
@@ -11,38 +11,52 @@ module Deferral
11
11
  # end
12
12
  # end
13
13
 
14
- def self.defer(&block)
15
- raise ArgumentError, "release block is not specified" unless block
14
+ module Mixin
15
+ def defer(&block)
16
+ raise ArgumentError, "release block is not specified" unless block
16
17
 
17
- store = (Thread.current[:deferral_store] ||= {})
18
- if !store.empty? && !store[:stack].empty?
19
- store[:stack].last.add(block)
20
- return
21
- end
18
+ store = (Thread.current[:deferral_store] ||= {})
19
+ if !store.empty? && !store[:stack].empty?
20
+ store[:stack].last.add(block)
21
+ return
22
+ end
22
23
 
23
- stack = store[:stack] = [StackFrame.new(:root)] # root stack frame as first "caller" position of this method
24
- first_return = true
24
+ stack = store[:stack] = [StackFrame.new(:root)] # root stack frame as first "caller" position of this method
25
+ first_return = true
25
26
 
26
- trace = TracePoint.new(:call, :return, :b_call, :b_return) do |tp|
27
- if tp.event == :return && first_return # return from this method
28
- first_return = false
29
- next
30
- end
27
+ trace = TracePoint.new(:call, :return, :b_call, :b_return) do |tp|
28
+ if tp.event == :return && first_return # return from this method
29
+ first_return = false
30
+ next
31
+ end
31
32
 
32
- case tp.event
33
- when :call, :b_call
34
- stack << StackFrame.new(tp.event)
35
- when :return, :b_return
36
- frame = stack.pop
37
- frame.release!
38
- if frame.root?
39
- trace.disable
33
+ case tp.event
34
+ when :call, :b_call
35
+ if tp.defined_class == Deferral::Mixin && tp.method_id == :defer
36
+ # invocation of "defer" itself - ignore it
37
+ next
38
+ end
39
+
40
+ stack << StackFrame.new(tp.event)
41
+ when :return, :b_return
42
+ if tp.defined_class == Deferral::Mixin && tp.method_id == :defer
43
+ # invocation of "defer" itself - ignore it
44
+ next
45
+ end
46
+
47
+ frame = stack.pop
48
+ frame.release!
49
+ if frame.root?
50
+ trace.disable
51
+ end
52
+ else
53
+ raise "unexpected TracePoint event:#{tp.event}"
40
54
  end
41
- else
42
- raise "unexpected TracePoint event:#{tp.event}"
43
55
  end
56
+ stack.last.add(block)
57
+ trace.enable
44
58
  end
45
- stack.last.add(block)
46
- trace.enable
47
59
  end
60
+
61
+ extend Mixin
48
62
  end
@@ -1,7 +1,5 @@
1
1
  require_relative "../deferral"
2
2
 
3
3
  module Kernel
4
- def defer(&block)
5
- Deferral.defer(&block)
6
- end
4
+ include Deferral::Mixin
7
5
  end
@@ -20,7 +20,7 @@ module Deferral
20
20
  @releases.reverse.each do |r|
21
21
  begin
22
22
  r.call
23
- rescue Exception => e
23
+ rescue Exception
24
24
  # ignore all exceptions ...
25
25
  # no way to add "suppressed" exceptions to the exception already thrown
26
26
  end
@@ -2,8 +2,6 @@ require_relative "../deferral"
2
2
 
3
3
  module Deferral::TopLevel
4
4
  refine Kernel do
5
- def defer(&block)
6
- Deferral.defer(&block)
7
- end
5
+ include Deferral::Mixin
8
6
  end
9
7
  end
@@ -1,3 +1,3 @@
1
1
  module Deferral
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deferral
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - TAGOMORI Satoshi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-13 00:00:00.000000000 Z
11
+ date: 2018-03-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler