@@ -166,6 +166,14 @@ def initialize(string = nil, mode = nil, **options)
166
166
mode_from_string ( string . frozen? ? 'r' : 'r+' )
167
167
end
168
168
169
+ if @writable && @__data__ . string . frozen?
170
+ raise Errno ::EACCES , 'Permission denied'
171
+ end
172
+
173
+ if @truncate
174
+ @__data__ . string . replace ( '' . force_encoding ( @__data__ . string . encoding ) )
175
+ end
176
+
169
177
self
170
178
end
171
179
@@ -672,43 +680,37 @@ def yaml_initialize(type, val)
672
680
end
673
681
674
682
private def mode_from_string ( mode )
675
- @append = truncate = false
683
+ @append = @ truncate = false
676
684
677
685
if mode [ 0 ] == ?r
678
686
@readable = true
679
687
@writable = mode [ -1 ] == ?+ ? true : false
680
688
end
681
689
682
690
if mode [ 0 ] == ?w
683
- @writable = truncate = true
691
+ @writable = @ truncate = true
684
692
@readable = mode [ -1 ] == ?+ ? true : false
685
693
end
686
694
687
695
if mode [ 0 ] == ?a
688
696
@append = @writable = true
689
697
@readable = mode [ -1 ] == ?+ ? true : false
690
698
end
691
-
692
- d = @__data__ # no sync, only called from initialize
693
- raise Errno ::EACCES , 'Permission denied' if @writable && d . string . frozen?
694
- d . string . replace ( '' . force_encoding ( d . string . encoding ) ) if truncate
695
699
end
696
700
697
701
private def mode_from_integer ( mode )
698
- @readable = @writable = @append = false
699
- d = @__data__ # no sync, only called from initialize
702
+ @readable = @writable = @append = @truncate = false
700
703
701
704
if mode == 0 or mode & IO ::RDWR != 0
702
705
@readable = true
703
706
end
704
707
705
708
if mode & ( IO ::WRONLY | IO ::RDWR ) != 0
706
- raise Errno ::EACCES , 'Permission denied' if d . string . frozen?
707
709
@writable = true
708
710
end
709
711
710
712
@append = true if ( mode & IO ::APPEND ) != 0
711
- d . string . replace ( '' . force_encoding ( d . string . encoding ) ) if ( mode & IO ::TRUNC ) != 0
713
+ @truncate = true if ( mode & IO ::TRUNC ) != 0
712
714
end
713
715
714
716
private def getline ( arg_error , sep , limit , chomp = false )
0 commit comments