Skip to content

Commit 72b5d1a

Browse files
committed
Refactor IO and move .normalize_options method to IOOperations
1 parent 4183d40 commit 72b5d1a

File tree

4 files changed

+99
-99
lines changed

4 files changed

+99
-99
lines changed

lib/truffle/stringio.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def initialize(string = nil, mode = nil, **options)
143143
warn 'StringIO::new() does not take block; use StringIO::open() instead'
144144
end
145145

146-
mode, _binary, _external, _internal, _autoclose, _perm = IO.normalize_options(mode, nil, options)
146+
mode, _binary, _external, _internal, _autoclose, _perm = Truffle::IOOperations.normalize_options(mode, nil, options)
147147

148148
if Primitive.nil?(string)
149149
mode ||= IO::RDWR

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1164,7 +1164,7 @@ def initialize(path_or_fd, mode = nil, perm = nil, **options)
11641164
@path = nil
11651165
else
11661166
path = Truffle::Type.coerce_to_path path_or_fd
1167-
nmode, _binary, _external, _internal, _autoclose, perm = IO.normalize_options(mode, perm, options)
1167+
nmode, _binary, _external, _internal, _autoclose, perm = Truffle::IOOperations.normalize_options(mode, perm, options)
11681168
fd = IO.sysopen(path, nmode, perm)
11691169

11701170
@path = path

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

Lines changed: 4 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ def self.binwrite(file, string, offset = nil, **options)
337337
default_mode = File::CREAT | File::RDWR | File::BINARY
338338
default_mode |= File::TRUNC unless offset
339339

340-
mode, _binary, external, _internal, _autoclose, perm = IO.normalize_options(nil, nil, options, default_mode)
340+
mode, _binary, external, _internal, _autoclose, perm = Truffle::IOOperations.normalize_options(nil, nil, options, default_mode)
341341

342342
File.open(file, mode, encoding: (external || 'ASCII-8BIT'), perm: perm) do |f|
343343
f.seek(offset) if offset
@@ -502,7 +502,7 @@ def self.write(file, string, offset = nil, **options)
502502
default_mode = File::CREAT | File::WRONLY
503503
default_mode |= File::TRUNC unless offset
504504

505-
mode, _binary, external, _internal, _autoclose, perm = IO.normalize_options(nil, nil, options, default_mode)
505+
mode, _binary, external, _internal, _autoclose, perm = Truffle::IOOperations.normalize_options(nil, nil, options, default_mode)
506506

507507
open_args = [mode]
508508
open_kw = { encoding: (external || 'ASCII-8BIT'), perm: perm }
@@ -569,99 +569,6 @@ def self.try_convert(obj)
569569
Truffle::Type.rb_check_convert_type obj, IO, :to_io
570570
end
571571

572-
def self.normalize_options(mode, perm, options, default_mode = nil)
573-
autoclose = true
574-
575-
if mode
576-
mode = (Truffle::Type.try_convert(mode, Integer, :to_int) or
577-
Truffle::Type.coerce_to(mode, String, :to_str))
578-
end
579-
580-
if options
581-
if optmode = options[:mode]
582-
optmode = (Truffle::Type.try_convert(optmode, Integer, :to_int) or
583-
Truffle::Type.coerce_to(optmode, String, :to_str))
584-
end
585-
586-
if mode && optmode
587-
raise ArgumentError, 'mode specified twice'
588-
end
589-
590-
mode ||= optmode
591-
mode ||= default_mode
592-
593-
if flags = options[:flags]
594-
flags = Truffle::Type.rb_convert_type(flags, Integer, :to_int)
595-
596-
if Primitive.nil?(mode)
597-
mode = flags
598-
elsif Primitive.is_a?(mode, Integer)
599-
mode |= flags
600-
else # it's a String
601-
mode = Truffle::IOOperations.parse_mode(mode)
602-
mode |= flags
603-
end
604-
end
605-
606-
if optperm = options[:perm]
607-
optperm = Truffle::Type.try_convert(optperm, Integer, :to_int)
608-
end
609-
610-
if perm
611-
raise ArgumentError, 'perm specified twice' if optperm
612-
else
613-
perm = optperm
614-
end
615-
616-
autoclose = Primitive.as_boolean(options[:autoclose]) if options.key?(:autoclose)
617-
end
618-
619-
mode ||= default_mode
620-
621-
if Primitive.is_a?(mode, String)
622-
mode, external, internal = mode.split(':', 3)
623-
raise ArgumentError, 'invalid access mode' unless mode
624-
625-
binary = true if mode.include?(?b)
626-
binary = false if mode.include?(?t)
627-
elsif mode
628-
binary = true if (mode & BINARY) != 0
629-
end
630-
631-
if options
632-
if options[:textmode] and options[:binmode]
633-
raise ArgumentError, 'both textmode and binmode specified'
634-
end
635-
636-
if Primitive.nil? binary
637-
binary = options[:binmode]
638-
elsif options.key?(:textmode) or options.key?(:binmode)
639-
raise ArgumentError, 'text/binary mode specified twice'
640-
end
641-
642-
if !external and !internal
643-
external = options[:external_encoding]
644-
internal = options[:internal_encoding]
645-
elsif options[:external_encoding] or options[:internal_encoding] or options[:encoding]
646-
raise ArgumentError, 'encoding specified twice'
647-
end
648-
649-
if !external and !internal
650-
encoding = options[:encoding]
651-
652-
if Primitive.is_a?(encoding, Encoding)
653-
external = encoding
654-
elsif !Primitive.nil?(encoding)
655-
encoding = StringValue(encoding)
656-
external, internal = encoding.split(':', 2)
657-
end
658-
end
659-
end
660-
external = Encoding::BINARY if binary and !external and !internal
661-
perm ||= 0666
662-
[mode, binary, external, internal, autoclose, perm]
663-
end
664-
665572
def self.open(*args, **options)
666573
io = new(*args, **options)
667574

@@ -720,7 +627,7 @@ def self.popen(*args)
720627
end
721628
end
722629

723-
mode, binary, external, internal, _autoclose, _perm = IO.normalize_options(mode, nil, io_options)
630+
mode, binary, external, internal, _autoclose, _perm = Truffle::IOOperations.normalize_options(mode, nil, io_options)
724631
mode_int = Truffle::IOOperations.parse_mode mode
725632

726633
readable = false
@@ -941,7 +848,7 @@ def initialize(fd, mode = nil, **options)
941848
@external = nil
942849
@pid = nil
943850

944-
mode, binary, external, internal, autoclose_tmp, _perm = IO.normalize_options(mode, nil, options)
851+
mode, binary, external, internal, autoclose_tmp, _perm = Truffle::IOOperations.normalize_options(mode, nil, options)
945852

946853
fd = Truffle::Type.coerce_to(fd, Integer, :to_int)
947854
sync = fd == 2 # stderr is always unbuffered, see setvbuf(3)

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

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,5 +432,98 @@ def self.rb_io_ext_int_to_encs(mode, external, internal)
432432

433433
[external, internal]
434434
end
435+
436+
def self.normalize_options(mode, perm, options, default_mode = nil)
437+
autoclose = true
438+
439+
if mode
440+
mode = (Truffle::Type.try_convert(mode, Integer, :to_int) or
441+
Truffle::Type.coerce_to(mode, String, :to_str))
442+
end
443+
444+
if options
445+
if optmode = options[:mode]
446+
optmode = (Truffle::Type.try_convert(optmode, Integer, :to_int) or
447+
Truffle::Type.coerce_to(optmode, String, :to_str))
448+
end
449+
450+
if mode && optmode
451+
raise ArgumentError, 'mode specified twice'
452+
end
453+
454+
mode ||= optmode
455+
mode ||= default_mode
456+
457+
if flags = options[:flags]
458+
flags = Truffle::Type.rb_convert_type(flags, Integer, :to_int)
459+
460+
if Primitive.nil?(mode)
461+
mode = flags
462+
elsif Primitive.is_a?(mode, Integer)
463+
mode |= flags
464+
else # it's a String
465+
mode = Truffle::IOOperations.parse_mode(mode)
466+
mode |= flags
467+
end
468+
end
469+
470+
if optperm = options[:perm]
471+
optperm = Truffle::Type.try_convert(optperm, Integer, :to_int)
472+
end
473+
474+
if perm
475+
raise ArgumentError, 'perm specified twice' if optperm
476+
else
477+
perm = optperm
478+
end
479+
480+
autoclose = Primitive.as_boolean(options[:autoclose]) if options.key?(:autoclose)
481+
end
482+
483+
mode ||= default_mode
484+
485+
if Primitive.is_a?(mode, String)
486+
mode, external, internal = mode.split(':', 3)
487+
raise ArgumentError, 'invalid access mode' unless mode
488+
489+
binary = true if mode.include?(?b)
490+
binary = false if mode.include?(?t)
491+
elsif mode
492+
binary = true if (mode & BINARY) != 0
493+
end
494+
495+
if options
496+
if options[:textmode] and options[:binmode]
497+
raise ArgumentError, 'both textmode and binmode specified'
498+
end
499+
500+
if Primitive.nil? binary
501+
binary = options[:binmode]
502+
elsif options.key?(:textmode) or options.key?(:binmode)
503+
raise ArgumentError, 'text/binary mode specified twice'
504+
end
505+
506+
if !external and !internal
507+
external = options[:external_encoding]
508+
internal = options[:internal_encoding]
509+
elsif options[:external_encoding] or options[:internal_encoding] or options[:encoding]
510+
raise ArgumentError, 'encoding specified twice'
511+
end
512+
513+
if !external and !internal
514+
encoding = options[:encoding]
515+
516+
if Primitive.is_a?(encoding, Encoding)
517+
external = encoding
518+
elsif !Primitive.nil?(encoding)
519+
encoding = StringValue(encoding)
520+
external, internal = encoding.split(':', 2)
521+
end
522+
end
523+
end
524+
external = Encoding::BINARY if binary and !external and !internal
525+
perm ||= 0666
526+
[mode, binary, external, internal, autoclose, perm]
527+
end
435528
end
436529
end

0 commit comments

Comments
 (0)