Skip to content

Commit bdc488b

Browse files
Watson1978claude
andcommitted
IO::Buffer: 定数 10 個と例外クラス 5 個を追加
PR rurema#3278 のレビューで「未収録の定数・例外クラスへの参照はリンク切れになる ので早めの回で追加すると良い」と助言いただいた分。 定数 (10): EXTERNAL / INTERNAL / SHARED / LOCKED / PRIVATE / READONLY と LITTLE_ENDIAN / BIG_ENDIAN / HOST_ENDIAN / NETWORK_ENDIAN 例外クラス (5): AccessError / AllocationError / InvalidatedError / LockedError / MaskError 実機で登場バージョンを確認したところ、SHARED と MaskError のみ 3.2 で追加 されていた (他は 3.1 から存在) ため、その 2 つだけ #@SInCE 3.2 で分岐した。 例外の発生条件は io_buffer.c の rb_raise 箇所を確認したうえで記述し、 再現できるもの (AccessError / LockedError / MaskError) は実機で確認した例を 添えた。AllocationError と InvalidatedError は意図的に再現させることが難しい ため、例は付けず条件の説明のみとした。 あわせて set_string の raise 記述から AccessError への参照を張った。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 4703a68 commit bdc488b

1 file changed

Lines changed: 106 additions & 0 deletions

File tree

manual/api/_builtin/IO__Buffer.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,60 @@ OS のページサイズをバイト数で表した値です。
5757
バッファを仮想メモリ機構(Unix では匿名 mmap、Windows では VirtualAlloc)で
5858
確保することを表すフラグです。[m:IO::Buffer.new] の flags に指定します。
5959

60+
### const EXTERNAL -> Integer
61+
62+
バッファが外部(external)のメモリ領域、すなわち [c:String] など他のオブジェクトが
63+
所有するメモリ領域を指していることを表すフラグです。
64+
65+
### const INTERNAL -> Integer
66+
67+
バッファが内部(internal)のメモリ領域、すなわち Ruby が直接確保したメモリ領域を
68+
指していることを表すフラグです。
69+
70+
#@since 3.2
71+
### const SHARED -> Integer
72+
73+
バッファが他のプロセスと共有されるメモリ領域を指していることを表すフラグです。
74+
#@end
75+
76+
### const LOCKED -> Integer
77+
78+
バッファがロックされていることを表すフラグです。
79+
80+
ロックされている間はバッファの解放やリサイズができません。
81+
[m:IO::Buffer#locked] を参照してください。
82+
83+
### const PRIVATE -> Integer
84+
85+
バッファがコピーオンライトで確保されていることを表すフラグです。
86+
87+
このバッファへの変更は元のメモリ領域には反映されません。
88+
89+
### const READONLY -> Integer
90+
91+
バッファが読み込み専用であることを表すフラグです。
92+
93+
このフラグが立っているバッファに書き込もうとすると
94+
[c:IO::Buffer::AccessError] が発生します。
95+
96+
### const LITTLE_ENDIAN -> Integer
97+
### const BIG_ENDIAN -> Integer
98+
### const HOST_ENDIAN -> Integer
99+
### const NETWORK_ENDIAN -> Integer
100+
101+
バイトオーダー(エンディアン)を表す定数です。
102+
103+
HOST_ENDIAN は実行中の環境のバイトオーダーで、LITTLE_ENDIAN か BIG_ENDIAN の
104+
いずれかと同じ値になります。NETWORK_ENDIAN はネットワークバイトオーダーで、
105+
BIG_ENDIAN と同じ値です。
106+
107+
```ruby
108+
p IO::Buffer::NETWORK_ENDIAN == IO::Buffer::BIG_ENDIAN # => true
109+
110+
# リトルエンディアンの環境の場合
111+
p IO::Buffer::HOST_ENDIAN == IO::Buffer::LITTLE_ENDIAN # => true
112+
```
113+
60114
## Class Methods
61115

62116
### def new(size = IO::Buffer::DEFAULT_SIZE, flags = 0) -> IO::Buffer
@@ -136,6 +190,7 @@ buf.get_string(0, 99) # ~> ArgumentError
136190
- **raise** `ArgumentError` -- offset と length の合計がバッファのバイト数を超える場合に発生します。
137191

138192
- **raise** `IO::Buffer::AccessError` -- 書き込みできないバッファに対して呼び出した場合に発生します。
193+
詳しくは [c:IO::Buffer::AccessError] を参照してください。
139194

140195
```ruby
141196
buf = IO::Buffer.new(8)
@@ -150,3 +205,54 @@ IO::Buffer.new(2).set_string("TOOLONG") # ~> ArgumentError
150205
```
151206

152207
- **SEE** [m:IO::Buffer#get_string]
208+
209+
# class IO::Buffer::AccessError < RuntimeError
210+
211+
書き込みできないバッファに書き込もうとした場合や、
212+
外部(external)のバッファをリサイズしようとした場合に発生します。
213+
214+
```ruby
215+
buf = IO::Buffer.for("abc")
216+
p buf.readonly? # => true
217+
buf.set_string("z") # ~> IO::Buffer::AccessError
218+
```
219+
220+
# class IO::Buffer::AllocationError < RuntimeError
221+
222+
バッファ用のメモリ領域を確保できなかった場合に発生します。
223+
224+
# class IO::Buffer::InvalidatedError < RuntimeError
225+
226+
無効になったバッファを使用しようとした場合に発生します。
227+
228+
バッファが指しているメモリ領域が既に解放されているなど、
229+
そのバッファがもう使用できない状態になっていることを表します。
230+
231+
# class IO::Buffer::LockedError < RuntimeError
232+
233+
ロックされているバッファに対して、ロック中は行えない操作をした場合に発生します。
234+
235+
具体的には、ロック中のバッファをリサイズしようとした場合や、
236+
[m:IO::Buffer#transfer] で所有権を移そうとした場合、
237+
既にロックされているバッファを再度ロックしようとした場合などです。
238+
239+
```ruby
240+
buf = IO::Buffer.new(4)
241+
buf.locked do |b|
242+
b.resize(8) # ~> IO::Buffer::LockedError
243+
end
244+
```
245+
246+
#@since 3.2
247+
# class IO::Buffer::MaskError < ArgumentError
248+
249+
ビット演算に渡したマスクが不正な場合に発生します。
250+
251+
具体的には、長さ 0 のバッファをマスクに指定した場合や、
252+
マスクが演算対象のバッファと重なっている場合です。
253+
254+
```ruby
255+
IO::Buffer.new(4) & IO::Buffer.new(0) # ~> IO::Buffer::MaskError
256+
```
257+
258+
#@end

0 commit comments

Comments
 (0)