pr-zlib 1.0.0 → 1.0.1
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 +7 -0
- data/CHANGES +8 -0
- data/Rakefile +78 -47
- data/lib/pr/rbzlib.rb +811 -818
- data/lib/pr/zlib.rb +16 -16
- data/pr-zlib.gemspec +17 -23
- data/profile/bench_pr_zlib.rb +43 -0
- data/profile/bench_zlib.rb +43 -0
- data/profile/profile_pr_zlib_read.rb +28 -0
- data/profile/profile_pr_zlib_write.rb +26 -0
- data/test/test_rbzlib.rb +124 -127
- data/test/test_rbzlib_bytef.rb +2 -5
- data/test/test_rbzlib_posf.rb +1 -4
- data/test/test_zlib.rb +2 -5
- data/test/test_zlib_deflate.rb +1 -4
- data/test/test_zlib_gzip_file.rb +1 -4
- data/test/test_zlib_gzip_reader.rb +173 -174
- data/test/test_zlib_gzip_writer.rb +175 -179
- data/test/test_zlib_inflate.rb +1 -4
- data/test/test_zlib_zstream.rb +1 -4
- metadata +61 -45
data/lib/pr/zlib.rb
CHANGED
@@ -9,7 +9,7 @@ include Rbzlib
|
|
9
9
|
module Zlib
|
10
10
|
|
11
11
|
RUBY_ZLIB_VERSION = '0.6.0'
|
12
|
-
PR_ZLIB_VERSION = '1.0.
|
12
|
+
PR_ZLIB_VERSION = '1.0.1'
|
13
13
|
|
14
14
|
class Error < StandardError
|
15
15
|
end
|
@@ -88,7 +88,7 @@ module Zlib
|
|
88
88
|
|
89
89
|
def raise_zlib_error(err, msg)
|
90
90
|
msg = zError(err) if msg.nil? || msg==''
|
91
|
-
|
91
|
+
|
92
92
|
case err
|
93
93
|
when Z_STREAM_END
|
94
94
|
raise StreamEnd, msg
|
@@ -110,7 +110,7 @@ module Zlib
|
|
110
110
|
raise Error, "unknown zlib error #errend: #msgend"
|
111
111
|
end
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
def zstream_expand_buffer()
|
115
115
|
if @buf.nil?
|
116
116
|
@buf = Bytef.new(0.chr * ZSTREAM_INITIAL_BUFSIZE)
|
@@ -483,15 +483,15 @@ module Zlib
|
|
483
483
|
|
484
484
|
def finish()
|
485
485
|
@z.zstream_run("", 0, Z_FINISH)
|
486
|
-
|
486
|
+
@z.zstream_detach_buffer()
|
487
487
|
end
|
488
488
|
|
489
489
|
def flush_next_in
|
490
|
-
|
490
|
+
@z.zstream_detach_input
|
491
491
|
end
|
492
492
|
|
493
493
|
def flush_next_out
|
494
|
-
|
494
|
+
@z.zstream_detach_buffer
|
495
495
|
end
|
496
496
|
|
497
497
|
def initialize
|
@@ -558,7 +558,7 @@ module Zlib
|
|
558
558
|
|
559
559
|
def deflate(src,flush=Z_NO_FLUSH)
|
560
560
|
do_deflate(src,flush)
|
561
|
-
|
561
|
+
@z.zstream_detach_buffer
|
562
562
|
end
|
563
563
|
|
564
564
|
def <<(src)
|
@@ -570,7 +570,7 @@ module Zlib
|
|
570
570
|
if(v_flush != Z_NO_FLUSH)
|
571
571
|
@z.zstream_run("", 0, flush)
|
572
572
|
end
|
573
|
-
|
573
|
+
@z.zstream_detach_buffer()
|
574
574
|
end
|
575
575
|
|
576
576
|
def params(level=Z_DEFAULT_COMPRESSION,strategy=Z_DEFAULT_STRATEGY)
|
@@ -1111,7 +1111,7 @@ module Zlib
|
|
1111
1111
|
gzfile_write(str, str.length)
|
1112
1112
|
str.length
|
1113
1113
|
end
|
1114
|
-
|
1114
|
+
|
1115
1115
|
def putc(ch)
|
1116
1116
|
raise GzipFile::Error, "closed gzip stream" unless @gz.z.ZSTREAM_IS_READY()
|
1117
1117
|
gzfile_write(ch.chr, 1)
|
@@ -1281,7 +1281,7 @@ module Zlib
|
|
1281
1281
|
end
|
1282
1282
|
|
1283
1283
|
def readline(rs=$/)
|
1284
|
-
|
1284
|
+
gets(rs)
|
1285
1285
|
end
|
1286
1286
|
|
1287
1287
|
def each(rs=$/)
|
@@ -1343,7 +1343,7 @@ module Zlib
|
|
1343
1343
|
return nil if @gz.z.input.nil?
|
1344
1344
|
@gz.z.input.dup
|
1345
1345
|
end
|
1346
|
-
|
1346
|
+
|
1347
1347
|
def rscheck(rsptr,rslen,rs)
|
1348
1348
|
raise RuntimeError, "rs modified" if rs != rsptr
|
1349
1349
|
end
|
@@ -1385,10 +1385,10 @@ module Zlib
|
|
1385
1385
|
gzfile_read_more()
|
1386
1386
|
ap = n - rslen
|
1387
1387
|
end
|
1388
|
-
|
1388
|
+
|
1389
1389
|
rscheck(rsptr, rslen, rs) if (!rspara)
|
1390
1390
|
res = @gz.z.buf.buffer[ap,@gz.z.buf.offset - n + 1].index(rsptr[0])
|
1391
|
-
|
1391
|
+
|
1392
1392
|
if res.nil?
|
1393
1393
|
n = @gz.z.buf.offset + 1
|
1394
1394
|
else
|
@@ -1417,12 +1417,12 @@ module Zlib
|
|
1417
1417
|
return ""
|
1418
1418
|
end
|
1419
1419
|
|
1420
|
-
while (!@gz.z.ZSTREAM_IS_FINISHED() && @gz.z.buf.offset < len)
|
1420
|
+
while (!@gz.z.ZSTREAM_IS_FINISHED() && @gz.z.buf.offset < len)
|
1421
1421
|
gzfile_read_more()
|
1422
1422
|
end
|
1423
1423
|
|
1424
|
-
if (GZFILE_IS_FINISHED(@gz))
|
1425
|
-
if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
|
1424
|
+
if (GZFILE_IS_FINISHED(@gz))
|
1425
|
+
if (@gz.z.flags & GZFILE_FLAG_FOOTER_FINISHED).zero?
|
1426
1426
|
gzfile_check_footer()
|
1427
1427
|
end
|
1428
1428
|
return nil
|
data/pr-zlib.gemspec
CHANGED
@@ -1,28 +1,22 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
gem.has_rdoc = true
|
14
|
-
gem.files = Dir["**/*"].reject{ |f| f.include?('SVN') }
|
15
|
-
gem.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'pr-zlib'
|
5
|
+
spec.version = '1.0.1'
|
6
|
+
spec.authors = ['Park Heesob', 'Daniel Berger']
|
7
|
+
spec.email = 'phasis@gmail.com'
|
8
|
+
spec.homepage = 'https://github.com/djberg96/pr-zlib'
|
9
|
+
spec.summary = 'Pure Ruby version of the zlib library'
|
10
|
+
spec.test_files = Dir['test/*.rb']
|
11
|
+
spec.files = Dir["**/*"].reject{ |f| f.include?('git') }
|
12
|
+
spec.extra_rdoc_files = ['README', 'CHANGES', 'MANIFEST']
|
16
13
|
|
17
|
-
|
14
|
+
spec.add_development_dependency('test-unit', '>= 2.4.0')
|
15
|
+
spec.add_development_dependency('ruby-prof')
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
if $0 == __FILE__
|
27
|
-
Gem::Builder.new(spec).build
|
17
|
+
spec.description = <<-EOF
|
18
|
+
The pr-zlib library is a pure Ruby implementation of both the zlib C
|
19
|
+
library, and the Ruby zlib interface that ships as part of the standard
|
20
|
+
library.
|
21
|
+
EOF
|
28
22
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
########################################################################
|
2
|
+
# This benchmarks the zlib library that ships as part of the Ruby
|
3
|
+
# standard library.
|
4
|
+
#
|
5
|
+
# You can run this benchmark via the bench:przlib Rake task.
|
6
|
+
########################################################################
|
7
|
+
require 'pr/zlib'
|
8
|
+
require 'benchmark'
|
9
|
+
|
10
|
+
print "\n\n== Running the benchmarks for pr-zlib ==\n\n"
|
11
|
+
|
12
|
+
# First, let's create a ~7 MB text file.
|
13
|
+
|
14
|
+
FILE_NAME = "benchmark.txt"
|
15
|
+
GZ_FILE_NAME = "benchmark.txt.gz"
|
16
|
+
|
17
|
+
File.open(FILE_NAME, "w") do |fh|
|
18
|
+
10000.times{ |x|
|
19
|
+
s = "Now is the time for #{x} good men to come to the aid of their country."
|
20
|
+
fh.puts s
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
Benchmark.bm do |x|
|
25
|
+
x.report("write") do
|
26
|
+
5.times{
|
27
|
+
Zlib::GzipWriter.open(GZ_FILE_NAME) do |gz|
|
28
|
+
gz.write(File.read(FILE_NAME))
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
x.report("read") do
|
34
|
+
5.times{
|
35
|
+
Zlib::GzipReader.open(GZ_FILE_NAME) do |gz|
|
36
|
+
gz.read
|
37
|
+
end
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
File.delete(FILE_NAME) if File.exists?(FILE_NAME)
|
43
|
+
File.delete(GZ_FILE_NAME) if File.exists?(GZ_FILE_NAME)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
########################################################################
|
2
|
+
# This benchmarks the zlib library that ships as part of the Ruby
|
3
|
+
# standard library.
|
4
|
+
#
|
5
|
+
# You can run this benchmark via the bench-zlib Rake task.
|
6
|
+
########################################################################
|
7
|
+
require 'zlib'
|
8
|
+
require 'benchmark'
|
9
|
+
|
10
|
+
print "\n\n== Running the benchmarks for zlib (stdlib) ==\n\n"
|
11
|
+
|
12
|
+
# First, let's create a ~7 MB text file.
|
13
|
+
|
14
|
+
FILE_NAME = "benchmark.txt"
|
15
|
+
GZ_FILE_NAME = "benchmark.txt.gz"
|
16
|
+
|
17
|
+
File.open(FILE_NAME, "w") do |fh|
|
18
|
+
10000.times{ |x|
|
19
|
+
s = "Now is the time for #{x} good men to come to the aid of their country."
|
20
|
+
fh.puts s
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
Benchmark.bm do |x|
|
25
|
+
x.report("write") do
|
26
|
+
5.times{
|
27
|
+
Zlib::GzipWriter.open(GZ_FILE_NAME) do |gz|
|
28
|
+
gz.write(File.read(FILE_NAME))
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
x.report("read") do
|
34
|
+
5.times{
|
35
|
+
Zlib::GzipReader.open(GZ_FILE_NAME) do |gz|
|
36
|
+
gz.read
|
37
|
+
end
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
File.delete(FILE_NAME) if File.exists?(FILE_NAME)
|
43
|
+
File.delete(GZ_FILE_NAME) if File.exists?(GZ_FILE_NAME)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'pr/zlib'
|
2
|
+
|
3
|
+
FILE_NAME = 'zlib_temp.txt'
|
4
|
+
GZ_FILE_NAME = 'zlib_temp.txt.gz'
|
5
|
+
|
6
|
+
# Create a text file to use first.
|
7
|
+
File.open(FILE_NAME, "w") do |fh|
|
8
|
+
1000.times{ |x|
|
9
|
+
s = "Now is the time for #{x} good men to come to the aid of their country."
|
10
|
+
fh.puts s
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
Zlib::GzipWriter.open(GZ_FILE_NAME){ |gz| gz.write(IO.read(FILE_NAME)) }
|
15
|
+
|
16
|
+
require 'ruby-prof'
|
17
|
+
|
18
|
+
result = RubyProf.profile do
|
19
|
+
Zlib::GzipReader.open(GZ_FILE_NAME) do |gz|
|
20
|
+
gz.read
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
File.delete(FILE_NAME) if File.exists?(FILE_NAME)
|
25
|
+
File.delete(GZ_FILE_NAME) if File.exists?(GZ_FILE_NAME)
|
26
|
+
|
27
|
+
printer = RubyProf::FlatPrinter.new(result)
|
28
|
+
printer.print(STDOUT)
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'pr/zlib'
|
2
|
+
|
3
|
+
FILE_NAME = 'zlib_temp.txt'
|
4
|
+
GZ_FILE_NAME = 'zlib_temp.txt.gz'
|
5
|
+
|
6
|
+
# Create a text file to use first.
|
7
|
+
File.open(FILE_NAME, "w") do |fh|
|
8
|
+
1000.times{ |x|
|
9
|
+
s = "Now is the time for #{x} good men to come to the aid of their country."
|
10
|
+
fh.puts s
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'ruby-prof'
|
15
|
+
|
16
|
+
result = RubyProf.profile do
|
17
|
+
Zlib::GzipWriter.open(GZ_FILE_NAME) do |gz|
|
18
|
+
gz.write(File.read(FILE_NAME))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
File.delete(FILE_NAME) if File.exists?(FILE_NAME)
|
23
|
+
File.delete(GZ_FILE_NAME) if File.exists?(GZ_FILE_NAME)
|
24
|
+
|
25
|
+
printer = RubyProf::FlatPrinter.new(result)
|
26
|
+
printer.print(STDOUT)
|
data/test/test_rbzlib.rb
CHANGED
@@ -3,134 +3,131 @@
|
|
3
3
|
#
|
4
4
|
# Test case for the Rbzlib module.
|
5
5
|
########################################################################
|
6
|
-
require 'rubygems'
|
7
|
-
gem 'test-unit'
|
8
|
-
|
9
6
|
require 'pr/rbzlib'
|
10
|
-
require 'test
|
7
|
+
require 'test-unit'
|
11
8
|
|
12
9
|
class TC_Rbzlib < Test::Unit::TestCase
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
10
|
+
include Rbzlib
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@fixnum = 7
|
14
|
+
@buffer = 0.chr * 16
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_version
|
18
|
+
assert_equal('1.2.3', ZLIB_VERSION)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_fixnum_ord
|
22
|
+
assert_respond_to(7, :ord)
|
23
|
+
assert_equal(7, 7.ord)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_misc_constants
|
27
|
+
assert_equal(9, MAX_MEM_LEVEL)
|
28
|
+
assert_equal(8, DEF_MEM_LEVEL)
|
29
|
+
assert_equal(15, MAX_WBITS)
|
30
|
+
assert_equal(MAX_WBITS, DEF_WBITS)
|
31
|
+
assert_equal(0, STORED_BLOCK)
|
32
|
+
assert_equal(1, STATIC_TREES)
|
33
|
+
assert_equal(2, DYN_TREES)
|
34
|
+
assert_equal(3, MIN_MATCH)
|
35
|
+
assert_equal(258, MAX_MATCH)
|
36
|
+
assert_equal(0x20, PRESET_DICT)
|
37
|
+
assert_equal(65521, BASE)
|
38
|
+
assert_equal(5552, NMAX)
|
39
|
+
assert_equal(0, OS_CODE)
|
40
|
+
assert_equal(1, SEEK_CUR)
|
41
|
+
assert_equal(2, SEEK_END)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_sync_contants
|
45
|
+
assert_equal(0, Z_NO_FLUSH)
|
46
|
+
assert_equal(1, Z_PARTIAL_FLUSH)
|
47
|
+
assert_equal(2, Z_SYNC_FLUSH)
|
48
|
+
assert_equal(3, Z_FULL_FLUSH)
|
49
|
+
assert_equal(4, Z_FINISH)
|
50
|
+
assert_equal(5, Z_BLOCK)
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_stream_constants
|
54
|
+
assert_equal(0, Z_OK)
|
55
|
+
assert_equal(1, Z_STREAM_END)
|
56
|
+
assert_equal(2, Z_NEED_DICT)
|
57
|
+
assert_equal(-1, Z_ERRNO)
|
58
|
+
assert_equal(-1, Z_EOF)
|
59
|
+
assert_equal(-2, Z_STREAM_ERROR)
|
60
|
+
assert_equal(-3, Z_DATA_ERROR)
|
61
|
+
assert_equal(-4, Z_MEM_ERROR)
|
62
|
+
assert_equal(-5, Z_BUF_ERROR)
|
63
|
+
assert_equal(-6, Z_VERSION_ERROR)
|
64
|
+
assert_equal(16384, Z_BUFSIZE)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_compression_constants
|
68
|
+
assert_equal(0, Z_NO_COMPRESSION)
|
69
|
+
assert_equal(1, Z_BEST_SPEED)
|
70
|
+
assert_equal(9, Z_BEST_COMPRESSION)
|
71
|
+
assert_equal(-1, Z_DEFAULT_COMPRESSION)
|
72
|
+
assert_equal(8, Z_DEFLATED)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_encoding_constants
|
76
|
+
assert_equal(1, Z_FILTERED)
|
77
|
+
assert_equal(2, Z_HUFFMAN_ONLY)
|
78
|
+
assert_equal(3, Z_RLE)
|
79
|
+
assert_equal(4, Z_FIXED)
|
80
|
+
assert_equal(0, Z_DEFAULT_STRATEGY)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_crc_constants
|
84
|
+
assert_equal(0x01, ASCII_FLAG)
|
85
|
+
assert_equal(0x02, HEAD_CRC)
|
86
|
+
assert_equal(0x04, EXTRA_FIELD)
|
87
|
+
assert_equal(0x08, ORIG_NAME)
|
88
|
+
assert_equal(0x10, COMMENT_)
|
89
|
+
assert_equal(0xE0, RESERVED)
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_zError
|
93
|
+
assert_respond_to(self, :zError)
|
94
|
+
assert_equal('stream end', self.zError(Z_STREAM_END))
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_zlibVersion
|
98
|
+
assert_respond_to(self, :zlibVersion)
|
99
|
+
assert_equal(ZLIB_VERSION, self.zlibVersion)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_z_error
|
103
|
+
assert_respond_to(self, :z_error)
|
104
|
+
assert_raise(RuntimeError){ self.z_error('hello') }
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_adler32
|
108
|
+
assert_respond_to(Rbzlib, :adler32)
|
109
|
+
assert_equal(1, Rbzlib.adler32(32, nil))
|
110
|
+
assert_equal(0, Rbzlib.adler32(0, @buffer))
|
111
|
+
assert_equal(1048577, Rbzlib.adler32(1, @buffer))
|
112
|
+
assert_equal(10485770, Rbzlib.adler32(10, @buffer))
|
113
|
+
assert_equal(33554464, Rbzlib.adler32(32, @buffer))
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_adler32_expected_errors
|
117
|
+
assert_raise(ArgumentError){ Rbzlib.adler32 }
|
118
|
+
assert_raise(ArgumentError){ Rbzlib.adler32('test') }
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_get_crc_table
|
122
|
+
assert_respond_to(Rbzlib, :get_crc_table)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_gz_open
|
126
|
+
assert_respond_to(Rbzlib, :gz_open)
|
127
|
+
end
|
128
|
+
|
129
|
+
def teardown
|
130
|
+
@fixnum = 0
|
131
|
+
@buffer = nil
|
132
|
+
end
|
136
133
|
end
|