ruby-changes:70392
From: Samuel <ko1@a...>
Date: Tue, 21 Dec 2021 08:26:05 +0900 (JST)
Subject: [ruby-changes:70392] 49166fc74a (master): Improved exception usage/classes.
https://git.ruby-lang.org/ruby.git/commit/?id=49166fc74a From 49166fc74a9cd0bf48baa08d32e020183ad46723 Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuel.williams@o...> Date: Mon, 20 Dec 2021 09:59:45 +1300 Subject: Improved exception usage/classes. --- file.c | 24 +++++++++++-------- include/ruby/internal/intern/file.h | 2 ++ io_buffer.c | 46 +++++++++++++++++++++---------------- test/ruby/test_io_buffer.rb | 15 ++++++------ 4 files changed, 49 insertions(+), 38 deletions(-) diff --git a/file.c b/file.c index b073051944f..829d6d513dc 100644 --- a/file.c +++ b/file.c @@ -2518,19 +2518,23 @@ rb_file_birthtime(VALUE obj) https://github.com/ruby/ruby/blob/trunk/file.c#L2518 off_t rb_file_size(VALUE file) { - rb_io_t *fptr; - struct stat st; + if (RB_TYPE_P(file, T_FILE)) { + rb_io_t *fptr; + struct stat st; - RB_IO_POINTER(file, fptr); - if (fptr->mode & FMODE_WRITABLE) { - rb_io_flush_raw(file, 0); - } + RB_IO_POINTER(file, fptr); + if (fptr->mode & FMODE_WRITABLE) { + rb_io_flush_raw(file, 0); + } - if (fstat(fptr->fd, &st) == -1) { - rb_sys_fail_path(fptr->pathv); - } + if (fstat(fptr->fd, &st) == -1) { + rb_sys_fail_path(fptr->pathv); + } - return st.st_size; + return st.st_size; + } else { + return NUM2OFFT(rb_funcall(file, idSize, 0)); + } } static VALUE diff --git a/include/ruby/internal/intern/file.h b/include/ruby/internal/intern/file.h index 7a6af998725..2dc60c7ba78 100644 --- a/include/ruby/internal/intern/file.h +++ b/include/ruby/internal/intern/file.h @@ -198,6 +198,8 @@ int rb_is_absolute_path(const char *path); https://github.com/ruby/ruby/blob/trunk/include/ruby/internal/intern/file.h#L198 * @exception rb_eFrozenError `file` is frozen. * @exception rb_eIOError `file` is closed. * @exception rb_eSystemCallError Permission denied etc. + * @exception rb_eNoMethodError The given non-file object doesn't respond + * to `#size`. * @return The size of the passed file. * @note Passing a non-regular file such as a UNIX domain socket to this * function is not a failure. But the return value is diff --git a/io_buffer.c b/io_buffer.c index d2a12b98fbd..cc022a7c9fe 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -14,6 +14,11 @@ https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L14 #include "internal/error.h" VALUE rb_cIOBuffer; +VALUE rb_eIOBufferLockedError; +VALUE rb_eIOBufferAllocationError; +VALUE rb_eIOBufferMutationError; +VALUE rb_eIOBufferInvalidatedError; + size_t RUBY_IO_BUFFER_PAGE_SIZE; size_t RUBY_IO_BUFFER_DEFAULT_SIZE; @@ -163,7 +168,7 @@ io_buffer_initialize(struct rb_io_buffer *data, void *base, size_t size, enum rb https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L168 } if (!data->base) { - rb_raise(rb_eRuntimeError, "Could not allocate buffer!"); + rb_raise(rb_eIOBufferAllocationError, "Could not allocate buffer!"); } data->source = source; @@ -327,9 +332,6 @@ io_buffer_map(int argc, VALUE *argv, VALUE klass) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L332 } VALUE io = argv[0]; - if (!RB_TYPE_P(io, T_FILE)) { - rb_raise(rb_eArgError, "Must be file/io!"); - } size_t size; if (argc >= 2) { @@ -622,7 +624,7 @@ rb_io_buffer_lock(VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L624 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_LOCKED) { - rb_raise(rb_eRuntimeError, "Buffer already locked!"); + rb_raise(rb_eIOBufferLockedError, "Buffer already locked!"); } data->flags |= RB_IO_BUFFER_LOCKED; @@ -637,7 +639,7 @@ rb_io_buffer_unlock(VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L639 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (!(data->flags & RB_IO_BUFFER_LOCKED)) { - rb_raise(rb_eRuntimeError, "Buffer not locked!"); + rb_raise(rb_eIOBufferLockedError, "Buffer not locked!"); } data->flags &= ~RB_IO_BUFFER_LOCKED; @@ -652,7 +654,7 @@ rb_io_buffer_locked(VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L654 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_LOCKED) { - rb_raise(rb_eRuntimeError, "Buffer already locked!"); + rb_raise(rb_eIOBufferLockedError, "Buffer already locked!"); } data->flags |= RB_IO_BUFFER_LOCKED; @@ -671,7 +673,7 @@ rb_io_buffer_free(VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L673 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_LOCKED) { - rb_raise(rb_eRuntimeError, "Buffer is locked!"); + rb_raise(rb_eIOBufferLockedError, "Buffer is locked!"); } io_buffer_free(data); @@ -683,7 +685,7 @@ static inline void https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L685 rb_io_buffer_validate(struct rb_io_buffer *data, size_t offset, size_t length) { if (offset + length > data->size) { - rb_raise(rb_eRuntimeError, "Specified offset + length exceeds source size!"); + rb_raise(rb_eArgError, "Specified offset + length exceeds source size!"); } } @@ -751,11 +753,11 @@ rb_io_buffer_get_mutable(VALUE self, void **base, size_t *size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L753 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_IMMUTABLE) { - rb_raise(rb_eRuntimeError, "Buffer is immutable!"); + rb_raise(rb_eIOBufferMutationError, "Buffer is immutable!"); } if (!io_buffer_validate(data)) { - rb_raise(rb_eRuntimeError, "Buffer has been invalidated!"); + rb_raise(rb_eIOBufferInvalidatedError, "Buffer has been invalidated!"); } if (data && data->base) { @@ -765,7 +767,7 @@ rb_io_buffer_get_mutable(VALUE self, void **base, size_t *size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L767 return; } - rb_raise(rb_eRuntimeError, "Buffer is not allocated!"); + rb_raise(rb_eIOBufferAllocationError, "Buffer is not allocated!"); } void @@ -775,7 +777,7 @@ rb_io_buffer_get_immutable(VALUE self, const void **base, size_t *size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L777 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (!io_buffer_validate(data)) { - rb_raise(rb_eRuntimeError, "Buffer has been invalidated!"); + rb_raise(rb_eIOBufferInvalidatedError, "Buffer has been invalidated!"); } if (data && data->base) { @@ -785,7 +787,7 @@ rb_io_buffer_get_immutable(VALUE self, const void **base, size_t *size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L787 return; } - rb_raise(rb_eRuntimeError, "Buffer is not allocated!"); + rb_raise(rb_eIOBufferAllocationError, "Buffer is not allocated!"); } size_t @@ -798,7 +800,7 @@ rb_io_buffer_copy(VALUE self, VALUE source, size_t offset) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L800 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_IMMUTABLE) { - rb_raise(rb_eRuntimeError, "Buffer is immutable!"); + rb_raise(rb_eIOBufferMutationError, "Buffer is immutable!"); } if (RB_TYPE_P(source, T_STRING)) { @@ -830,7 +832,7 @@ rb_io_buffer_transfer(VALUE self) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L832 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_LOCKED) { - rb_raise(rb_eRuntimeError, "Cannot transfer ownership of locked buffer!"); + rb_raise(rb_eIOBufferLockedError, "Cannot transfer ownership of locked buffer!"); } VALUE instance = rb_io_buffer_type_allocate(rb_class_of(self)); @@ -877,7 +879,7 @@ rb_io_buffer_resize(VALUE self, size_t size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L879 TypedData_Get_Struct(self, struct rb_io_buffer, &rb_io_buffer_type, data); if (data->flags & RB_IO_BUFFER_LOCKED) { - rb_raise(rb_eRuntimeError, "Cannot resize locked buffer!"); + rb_raise(rb_eIOBufferLockedError, "Cannot resize locked buffer!"); } if (data->base == NULL) { @@ -886,7 +888,7 @@ rb_io_buffer_resize(VALUE self, size_t size) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L888 } if (io_buffer_external_p(data->flags)) { - rb_raise(rb_eRuntimeError, "Cannot resize external buffer!"); + rb_raise(rb_eIOBufferMutationError, "Cannot resize external buffer!"); } #ifdef MREMAP_MAYMOVE @@ -956,7 +958,7 @@ static void https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L958 io_buffer_validate_type(size_t size, size_t offset) { if (offset > size) { - rb_raise(rb_eRuntimeError, "Type extends beyond end of buffer!"); + rb_raise(rb_eArgError, "Type extends beyond end of buffer!"); } } @@ -1151,7 +1153,7 @@ rb_io_buffer_clear(VALUE self, uint8_t value, size_t offset, size_t length) https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L1153 rb_io_buffer_get_mutable(self, &base, &size); if (offset + length > size) { - rb_raise(rb_eRuntimeError, "Offset + length out of bounds!"); + rb_raise(rb_eArgError, "The given offset + length out of bounds!"); } memset((char*)base + offset, value, length); @@ -1215,6 +1217,10 @@ void https://github.com/ruby/ruby/blob/trunk/io_buffer.c#L1217 Init_IO_Buffer(void) { rb_cIOBuffer = rb_define_class_under(rb_cIO, "Buffer", rb_cObject); + rb_eIOBufferLockedError = rb_define_class_under(rb_cIOBuffer, "LockedEr (... truncated) -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/