rb_sdl2 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6e1202e5d4354c491782ad3d005ff73685498fe74db86b27fb5dd89e96bbd6e0
4
- data.tar.gz: d3544770d711514d14ea918eaacf135569e8ccb0329ec52f956ea0fdfddde46a
3
+ metadata.gz: 343018a331bb80be39191fae7cce6088e59f30522926e6d7da2e8ea0db468683
4
+ data.tar.gz: e1a9393769b54fe801ad6af026f3a34f5ed544d12aeb621f41b7771a31bda453
5
5
  SHA512:
6
- metadata.gz: f7675ac774fd74152857edbad3a319f5700336dbe7cc375f80b2775ddf9f4695a3a07ecfd5c667252252cb7907539efd28662cae29d9ae7424fa2776edf7cc8e
7
- data.tar.gz: 8ec901e68e62c38d850c4ddeac7526e23bd433f3ad238327f60f4ab8529ad4c3a779301b231a82ad0bc20a39341c8c079b853fd1955be34eb397ef5f8114a137
6
+ metadata.gz: 0a72ab5495e18557a202454284b55c2d30ebbcec6bf21d7487f95398b06ac0498cee3537ce28a9f8bc1ba75e7ef5eafed222d06dfd5a83809c7f806003131a23
7
+ data.tar.gz: fe2d518ee617debbaf5651bb875ababc54c6379db21ac80b68f0bfab40881a2879bd2e3af5790e0d2370a83942f07cecdeefdeecaea4f692fe17a5849a8553e8
data/CHANGELOG.md CHANGED
@@ -12,6 +12,22 @@
12
12
 
13
13
  ### Security
14
14
 
15
+ ## [0.1.2] - 2021-10-19
16
+
17
+ ### Added
18
+ - RWOps#inspect - Return Ruby File#inspect like string.
19
+
20
+ ### Changed
21
+ - RWOps - The constructor can accept blocks.
22
+ - RWOperator - Code cleanup.
23
+
24
+ ### Fixed
25
+ - RWOps - some bugs.
26
+ - RWOperator - some bugs.
27
+
28
+ ### Removed
29
+ - RWOps.to_ptr - There is no use case.
30
+
15
31
  ## [0.1.1] - 2021-10-11
16
32
 
17
33
  ### Added
@@ -10,7 +10,7 @@ module RbSDL2
10
10
  def initialize(obj)
11
11
  # int (* close) (struct SDL_RWops * context);
12
12
  super(:int, [:pointer]) do |_context|
13
- # close の際に _context ポインターを開放してはならない。
13
+ # close の際に _context ポインターを開放してはならない。ポインターは GC が管理する。
14
14
  (obj.close; 0) rescue -1
15
15
  end
16
16
  end
@@ -63,10 +63,13 @@ module RbSDL2
63
63
  end
64
64
  end
65
65
 
66
- class RWopsPointer < ::FFI::AutoPointer
66
+ class RWOperatorPointer < RWOps::RWOpsPointer
67
67
  class << self
68
- # SDL_AllocRW で確保したポインターのみ SDL_FreeRW で開放できる。
69
- def release(ptr) = ::SDL2.SDL_FreeRW(ptr)
68
+ def release(ptr)
69
+ # オブジェクトはクローズしない。(GC 回収の時には close コールバックオブジェクトは消えている)
70
+ # SDL_AllocRW で確保したポインターのみ SDL_FreeRW で開放できる。
71
+ ::SDL2.SDL_FreeRW(ptr)
72
+ end
70
73
  end
71
74
  end
72
75
 
@@ -77,26 +80,26 @@ module RbSDL2
77
80
  # メソッドの戻り値は Ruby IO と同じ値を返せばよい。
78
81
  # メソッド内での例外は SDL のエラーに変換され、Ruby 側には反映されない。
79
82
  # obj がメソッド呼び出しに応答しない場合も安全である。その場合は SDL 側にエラーが通知される。
80
- def new(io)
81
- ptr = RWopsPointer.new(::SDL2.SDL_AllocRW)
83
+ def new(obj)
84
+ ptr = RWOperatorPointer.new(::SDL2.SDL_AllocRW)
82
85
  raise RbSDL2Error if ptr.null?
83
- super(ptr, io)
86
+ super(ptr, obj)
84
87
  end
85
88
  end
86
89
 
87
90
  def initialize(ptr, obj)
88
- st = ::SDL2::SDL_RWops.new(ptr)
89
- st[:close] = @close = CloseCallback.new(obj)
90
- st[:read] = @read = ReadCallback.new(obj)
91
- st[:seek] = @seek = SeekCallback.new(obj)
92
- st[:size] = @size = SizeCallback.new(obj)
93
- st[:write] = @write = WriteCallback.new(obj)
94
91
  @obj = obj
95
- @ptr = ptr
92
+ @st = ::SDL2::SDL_RWops.new(ptr).tap do |st|
93
+ st[:close] = @close = CloseCallback.new(obj)
94
+ st[:read] = @read = ReadCallback.new(obj)
95
+ st[:seek] = @seek = SeekCallback.new(obj)
96
+ st[:size] = @size = SizeCallback.new(obj)
97
+ st[:write] = @write = WriteCallback.new(obj)
98
+ end
96
99
  end
97
100
 
98
101
  def __getobj__ = @obj
99
102
 
100
- def to_ptr = @ptr
103
+ def to_ptr = @st.to_ptr
101
104
  end
102
105
  end
@@ -1,11 +1,12 @@
1
1
  module RbSDL2
2
2
  class RWOps
3
- class Releaser < ::FFI::AutoPointer
3
+ class RWOpsPointer < ::FFI::AutoPointer
4
4
  class << self
5
5
  def release(ptr)
6
6
  # SDL_RWclose は RWOps構造体を開放する。そのため呼び出しは1回しかできない。
7
7
  # ::FFI::AutoPointer を使うことで2重開放を防ぐ。
8
- raise RbSDL2Error if ::SDL2.SDL_RWclose(ptr) < 0
8
+ err = ::SDL2.SDL_RWclose(ptr)
9
+ raise RbSDL2Error if err < 0
9
10
  end
10
11
  end
11
12
 
@@ -26,16 +27,28 @@ module RbSDL2
26
27
  else
27
28
  ::SDL2.SDL_RWFromMem(mem, size)
28
29
  end
30
+ ptr = RWOpsPointer.new(ptr)
29
31
  raise RbSDL2Error if ptr.null?
32
+ ptr.autorelease = autoclose
30
33
  obj = allocate
31
- obj.__send__(:initialize, ptr, mem, autoclose: autoclose)
34
+ obj.__send__(:initialize, ptr, mem)
35
+ if block_given?
36
+ begin
37
+ yield(obj)
38
+ ensure
39
+ obj.close
40
+ end
41
+ else
42
+ obj
43
+ end
32
44
  end
33
45
 
34
46
  # mode は一般的なファイルAPIと同じ文字列が使用できる。
35
47
  def new(file, _mode = "rb", autoclose: true, mode: _mode)
36
- ptr = ::SDL2.SDL_RWFromFile(file.to_s, mode)
48
+ ptr = RWOpsPointer.new(::SDL2.SDL_RWFromFile(file.to_s, mode))
37
49
  raise RbSDL2Error if ptr.null?
38
- obj = super(ptr, autoclose: autoclose)
50
+ ptr.autorelease = autoclose
51
+ obj = super(ptr, file)
39
52
  if block_given?
40
53
  begin
41
54
  yield(obj)
@@ -48,37 +61,49 @@ module RbSDL2
48
61
  end
49
62
  alias open new
50
63
 
51
- def to_ptr(ptr)
52
- obj = allocate
53
- obj.__send__(:initialize, ptr, autoclose: false)
54
- obj
55
- end
56
-
57
64
  require_relative 'rw_ops/rw_operator'
58
65
 
59
- def with_object(obj)
60
- rw = RWOperator.new(obj)
66
+ # io 引数には Ruby の IO オブジェクトのように振る舞うオブジェクトを与える。
67
+ # オブジェクトは自動的にクローズされない。(close が呼ばれた場合はクローズする)
68
+ # autoclose オプション引数に false を与えて、RWOps#to_ptr から取り出したポインターを
69
+ # C のスコープへ渡す場合、ポインターが利用されている間 RWOps オブジェクトを生存させる必要がある。
70
+ def with_object(io, autoclose: true)
71
+ rw = RWOperator.new(io)
72
+ ptr = rw.to_ptr
73
+ ptr.autorelease = autoclose
61
74
  obj = allocate
62
- obj.__send__(:initialize, rw.to_ptr, rw, autoclose: false)
75
+ obj.__send__(:initialize, ptr, rw)
76
+ if block_given?
77
+ begin
78
+ yield(obj)
79
+ ensure
80
+ obj.close
81
+ end
82
+ else
83
+ obj
84
+ end
63
85
  end
64
86
  end
65
87
 
66
- def initialize(ptr, obj = nil, autoclose:)
88
+ def initialize(ptr, obj = nil)
67
89
  @obj = obj
68
- @ptr = Releaser.new(ptr)
69
- self.autoclose = autoclose
90
+ @ptr = ptr
70
91
  end
71
92
 
72
93
  def autoclose=(bool)
73
94
  @ptr.autorelease = bool
74
95
  end
75
96
 
76
- def autoclose? = @ptr.autorelease
97
+ def autoclose? = @ptr.autorelease?
77
98
 
78
99
  def close = @ptr.free
79
100
 
80
101
  def closed? = @ptr.released?
81
102
 
103
+ def inspect
104
+ "#<#{self.class.name}:#{@obj.inspect}>"
105
+ end
106
+
82
107
  def read(length = nil)
83
108
  raise IOError if closed?
84
109
  len = length.nil? ? size : length.to_i
data/rb_sdl2.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "rb_sdl2"
5
- spec.version = "0.1.1"
5
+ spec.version = "0.1.2"
6
6
  spec.author = "shinokaro"
7
7
  spec.email = "shinokaro@hotmail.co.jp"
8
8
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rb_sdl2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - shinokaro
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-11 00:00:00.000000000 Z
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi