diff --git a/kernel/bootstrap/compiled_method.rb b/kernel/bootstrap/compiled_method.rb index 7fc1ac7..05e7d32 100644 --- a/kernel/bootstrap/compiled_method.rb +++ b/kernel/bootstrap/compiled_method.rb @@ -1,4 +1,14 @@ class CompiledMethod + def self.load_from_file(path, version) + Ruby.primitive :load_file + raise PrimitiveFailure, "primitive failed" + end + + def activate_as_script + Ruby.primitive :activate_as_script + raise PrimitiveFailure, "primitive failed" + end + def compile Ruby.primitive :iseq_compile raise PrimitiveFailure, "primitive failed" diff --git a/kernel/bootstrap/io.rb b/kernel/bootstrap/io.rb index e3e282f..9ae1bf3 100644 --- a/kernel/bootstrap/io.rb +++ b/kernel/bootstrap/io.rb @@ -4,6 +4,11 @@ class IO raise PrimitiveFailure, "primitive failed" end + def self.create_pipe(lhs, rhs) + Ruby.primitive :create_pipe + raise PrimitiveFailure, "primitive failed" + end + def write(str) Ruby.primitive :io_write raise PrimitiveFailure, "IO#write failed. Might not have passed a string." @@ -31,4 +36,19 @@ class IO def ttyname prim_operation(1) end + + def reopen(other) + Ruby.primitive :io_reopen + raise ArgumentError, "only accepts an IO object" + end + + def io_close + Ruby.primitive :io_close + raise PrimitiveFailure, "primitive failed" + end + + def close + Ruby.primitive :io_close_ng + raise PrimitiveFailure, "IO#close primitive failed" + end end diff --git a/kernel/bootstrap/object.rb b/kernel/bootstrap/object.rb index 75aeb87..980bca7 100644 --- a/kernel/bootstrap/object.rb +++ b/kernel/bootstrap/object.rb @@ -47,4 +47,8 @@ class Object raise PrimitiveFailure, "primitive failed" end + def become!(obj) + Ruby.primitive :object_become + raise PrimitiveFailure, "primitive failed" + end end diff --git a/kernel/bootstrap/primitives.rb b/kernel/bootstrap/primitives.rb deleted file mode 100644 index 95c22e2..0000000 --- a/kernel/bootstrap/primitives.rb +++ /dev/null @@ -1,37 +0,0 @@ -# All primitives not else where in the bootstrap must be here. - -class Object - def become!(obj) - Ruby.primitive :object_become - raise PrimitiveFailure, "primitive failed" - end -end - -class IO - def self.create_pipe(lhs, rhs) - Ruby.primitive :create_pipe - raise PrimitiveFailure, "primitive failed" - end - - def reopen(other) - Ruby.primitive :io_reopen - raise ArgumentError, "only accepts an IO object" - end - - def io_close - Ruby.primitive :io_close - raise PrimitiveFailure, "primitive failed" - end -end - -class CompiledMethod - def self.load_from_file(path, version) - Ruby.primitive :load_file - raise PrimitiveFailure, "primitive failed" - end - - def activate_as_script - Ruby.primitive :activate_as_script - raise PrimitiveFailure, "primitive failed" - end -end diff --git a/kernel/core/io.rb b/kernel/core/io.rb index b521bfa..c72e2e5 100644 --- a/kernel/core/io.rb +++ b/kernel/core/io.rb @@ -529,13 +529,6 @@ class IO return 0 end - def close() - raise IOError, "Instance of IO already closed" if closed? - - io_close or raise SystemCallError, "Invalid file descriptor" - nil - end - def descriptor @descriptor end diff --git a/shotgun/lib/primitives.rb b/shotgun/lib/primitives.rb index a9492b7..a6abb18 100644 --- a/shotgun/lib/primitives.rb +++ b/shotgun/lib/primitives.rb @@ -4538,6 +4538,28 @@ class ShotgunPrimitives } CODE end + + defprim :io_close_ng + def io_close_ng + <<-CODE + ARITY(0); + native_int j; + + GUARD(IO_P(msg->recv)); + + j = io_to_fd(msg->recv); + + if(j == -1) { + RAISE("IOError", "instance of IO already closed"); + } else if(close(j)) { + RAISE_FROM_ERRNO("Unable to close IO object"); + } else { + cpu_event_clear(state, j); + io_set_descriptor(msg->recv, I2N(-1)); + RET(Qnil); + } + CODE + end end prim = ShotgunPrimitives.new