Skip to content

Commit 2569923

Browse files
committed
Move the mode translation methods to IOOperations.
1 parent 2e88e09 commit 2569923

File tree

3 files changed

+128
-122
lines changed

3 files changed

+128
-122
lines changed

src/main/ruby/truffleruby/core/file.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1298,7 +1298,13 @@ def size
12981298
end
12991299
end # File
13001300

1301-
# Inject the constants into IO
1301+
# Inject the constants into IO and IOOperations
13021302
class IO
13031303
include File::Constants
13041304
end
1305+
1306+
module Truffle
1307+
module IOOperations
1308+
include File::Constants
1309+
end
1310+
end

src/main/ruby/truffleruby/core/io.rb

Lines changed: 8 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -706,119 +706,6 @@ def self.open(*args)
706706
end
707707
end
708708

709-
def self.parse_mode(mode)
710-
return mode if Primitive.object_kind_of? mode, Integer
711-
712-
mode = StringValue(mode)
713-
714-
ret = CLOEXEC
715-
716-
case mode[0]
717-
when ?r
718-
ret |= RDONLY
719-
when ?w
720-
ret |= WRONLY | CREAT | TRUNC
721-
when ?a
722-
ret |= WRONLY | CREAT | APPEND
723-
else
724-
raise ArgumentError, "invalid mode -- #{mode}"
725-
end
726-
727-
return ret if mode.length == 1
728-
729-
case mode[1]
730-
when ?+
731-
ret &= ~(RDONLY | WRONLY)
732-
ret |= RDWR
733-
when ?b
734-
ret |= BINARY
735-
when ?t
736-
ret &= ~BINARY
737-
when ?:
738-
return ret
739-
else
740-
raise ArgumentError, "invalid mode -- #{mode}"
741-
end
742-
743-
return ret if mode.length == 2
744-
745-
case mode[2]
746-
when ?+
747-
ret &= ~(RDONLY | WRONLY)
748-
ret |= RDWR
749-
when ?b
750-
ret |= BINARY
751-
when ?t
752-
ret &= ~BINARY
753-
when ?:
754-
return ret
755-
else
756-
raise ArgumentError, "invalid mode -- #{mode}"
757-
end
758-
759-
ret
760-
end
761-
762-
# The constants used to express a mode for the opening of files are
763-
# different to the fmode constants used to express the mode of an
764-
# opened file used by C extensions. Thus we will need to translate
765-
# from the o_mode to the fmode and vice versa.
766-
def self.translate_omode_to_fmode(o_mode)
767-
fmode = 0
768-
if (o_mode & WRONLY != 0)
769-
fmode |= FMODE_WRITABLE
770-
elsif (o_mode & RDWR != 0)
771-
fmode |= FMODE_READWRITE
772-
else
773-
fmode |= FMODE_READABLE
774-
end
775-
776-
if (o_mode & CREAT != 0)
777-
fmode |= FMODE_CREATE
778-
end
779-
780-
if (o_mode & TRUNC != 0)
781-
fmode |= FMODE_TRUNC
782-
end
783-
784-
if (o_mode & APPEND != 0)
785-
fmode |= FMODE_APPEND
786-
end
787-
788-
if (o_mode & BINARY != 0)
789-
fmode |= FMODE_BINMODE
790-
end
791-
fmode
792-
end
793-
794-
def self.translate_fmode_to_omode(f_mode)
795-
omode = 0
796-
if f_mode & FMODE_READWRITE == FMODE_READWRITE
797-
omode |= RDWR
798-
elsif f_mode & FMODE_READABLE != 0
799-
omode |= RDONLY
800-
else
801-
omode |= WRONLY
802-
end
803-
804-
if (f_mode & FMODE_CREATE != 0)
805-
omode |= CREAT
806-
end
807-
808-
if (f_mode & FMODE_TRUNC != 0)
809-
omode |= TRUNC
810-
end
811-
812-
if (f_mode & FMODE_APPEND != 0)
813-
omode |= APPEND
814-
end
815-
816-
if (f_mode & FMODE_BINMODE != 0)
817-
omode |= BINARY
818-
end
819-
omode
820-
end
821-
822709
def self.pipe(external = nil, internal = nil, options = nil)
823710
lhs, rhs = Truffle::IOOperations.create_pipe(self, self, external, internal, options)
824711

@@ -862,7 +749,7 @@ def self.popen(*args)
862749
end
863750

864751
mode, binary, external, internal, _autoclose, _perm = IO.normalize_options(mode, nil, io_options)
865-
mode_int = parse_mode mode
752+
mode_int = Truffle::IOOperations.parse_mode mode
866753

867754
readable = false
868755
writable = false
@@ -1024,7 +911,7 @@ def self.select(readables = nil, writables = nil, errorables = nil, timeout = ni
1024911
# IO.sysopen("testfile") #=> 3
1025912
def self.sysopen(path, mode = nil, perm = nil)
1026913
path = Truffle::Type.coerce_to_path path
1027-
mode = parse_mode(mode || 'r')
914+
mode = Truffle::IOOperations.parse_mode(mode || 'r')
1028915
perm ||= 0666
1029916

1030917
fd = Truffle::POSIX.open(path, mode, perm)
@@ -1048,7 +935,7 @@ def self.setup(io, fd, mode=nil, sync=false)
1048935
end
1049936

1050937
if mode
1051-
mode = parse_mode(mode)
938+
mode = Truffle::IOOperations.parse_mode(mode)
1052939
mode &= ACCMODE
1053940

1054941
if cur_mode and (cur_mode == RDONLY or cur_mode == WRONLY) and mode != cur_mode
@@ -1062,7 +949,7 @@ def self.setup(io, fd, mode=nil, sync=false)
1062949
io.close if Primitive.io_fd(io) != -1
1063950

1064951
Primitive.io_set_fd(io, fd)
1065-
io.instance_variable_set :@mode, translate_omode_to_fmode(mode)
952+
io.instance_variable_set :@mode, Truffle::IOOperations.translate_omode_to_fmode(mode)
1066953
io.sync = Primitive.as_boolean(sync)
1067954
io.autoclose = true
1068955
ibuffer = mode != WRONLY ? IO::InternalBuffer.new : nil
@@ -1571,7 +1458,7 @@ def eof?
15711458
end
15721459

15731460
def external_encoding
1574-
if @mode & FMODE_READWRITE == FMODE_READABLE
1461+
if @mode & FMODE_WRITABLE == 0
15751462
@external || Encoding.default_external
15761463
else
15771464
@external
@@ -2138,9 +2025,9 @@ def reopen(other, mode=undefined)
21382025
if (mode & FMODE_WRITABLE != 0)
21392026
mode |= FMODE_CREATE
21402027
end
2141-
mode = IO.translate_fmode_to_omode(mode)
2028+
mode = Truffle::IOOperations.translate_fmode_to_omode(mode)
21422029
else
2143-
mode = IO.parse_mode(mode)
2030+
mode = Truffle::IOOperations.parse_mode(mode)
21442031
end
21452032

21462033
path = Truffle::Type.coerce_to_path(other)
@@ -2159,7 +2046,7 @@ def reopen(other, mode=undefined)
21592046
mode = Truffle::POSIX.fcntl(Primitive.io_fd(self), F_GETFL, 0)
21602047
Errno.handle if mode < 0
21612048

2162-
@mode = IO.translate_omode_to_fmode((mode & ACCMODE))
2049+
@mode = Truffle::IOOperations.translate_omode_to_fmode((mode & ACCMODE))
21632050
@ibuffer = (@mode & FMODE_READWRITE) != FMODE_WRITABLE ? IO::InternalBuffer.new : nil
21642051
end
21652052

src/main/ruby/truffleruby/core/truffle/io_operations.rb

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,5 +190,118 @@ def self.select(readables, readable_ios, writables, writable_ios, errorables, er
190190

191191
end
192192

193+
# The constants used to express a mode for the opening of files are
194+
# different to the fmode constants used to express the mode of an
195+
# opened file used by C extensions. Thus we will need to translate
196+
# from the o_mode to the fmode and vice versa.
197+
def self.translate_omode_to_fmode(o_mode)
198+
fmode = 0
199+
if (o_mode & WRONLY != 0)
200+
fmode |= FMODE_WRITABLE
201+
elsif (o_mode & RDWR != 0)
202+
fmode |= FMODE_READWRITE
203+
else
204+
fmode |= FMODE_READABLE
205+
end
206+
207+
if (o_mode & CREAT != 0)
208+
fmode |= FMODE_CREATE
209+
end
210+
211+
if (o_mode & TRUNC != 0)
212+
fmode |= FMODE_TRUNC
213+
end
214+
215+
if (o_mode & APPEND != 0)
216+
fmode |= FMODE_APPEND
217+
end
218+
219+
if (o_mode & BINARY != 0)
220+
fmode |= FMODE_BINMODE
221+
end
222+
fmode
223+
end
224+
225+
def self.translate_fmode_to_omode(f_mode)
226+
omode = 0
227+
if f_mode & FMODE_READWRITE == FMODE_READWRITE
228+
omode |= RDWR
229+
elsif f_mode & FMODE_READABLE != 0
230+
omode |= RDONLY
231+
else
232+
omode |= WRONLY
233+
end
234+
235+
if (f_mode & FMODE_CREATE != 0)
236+
omode |= CREAT
237+
end
238+
239+
if (f_mode & FMODE_TRUNC != 0)
240+
omode |= TRUNC
241+
end
242+
243+
if (f_mode & FMODE_APPEND != 0)
244+
omode |= APPEND
245+
end
246+
247+
if (f_mode & FMODE_BINMODE != 0)
248+
omode |= BINARY
249+
end
250+
omode
251+
end
252+
253+
def self.parse_mode(mode)
254+
return mode if Primitive.object_kind_of? mode, Integer
255+
256+
mode = StringValue(mode)
257+
258+
ret = CLOEXEC
259+
260+
case mode[0]
261+
when ?r
262+
ret |= RDONLY
263+
when ?w
264+
ret |= WRONLY | CREAT | TRUNC
265+
when ?a
266+
ret |= WRONLY | CREAT | APPEND
267+
else
268+
raise ArgumentError, "invalid mode -- #{mode}"
269+
end
270+
271+
return ret if mode.length == 1
272+
273+
case mode[1]
274+
when ?+
275+
ret &= ~(RDONLY | WRONLY)
276+
ret |= RDWR
277+
when ?b
278+
ret |= BINARY
279+
when ?t
280+
ret &= ~BINARY
281+
when ?:
282+
return ret
283+
else
284+
raise ArgumentError, "invalid mode -- #{mode}"
285+
end
286+
287+
return ret if mode.length == 2
288+
289+
case mode[2]
290+
when ?+
291+
ret &= ~(RDONLY | WRONLY)
292+
ret |= RDWR
293+
when ?b
294+
ret |= BINARY
295+
when ?t
296+
ret &= ~BINARY
297+
when ?:
298+
return ret
299+
else
300+
raise ArgumentError, "invalid mode -- #{mode}"
301+
end
302+
303+
ret
304+
end
305+
193306
end
194307
end

0 commit comments

Comments
 (0)