Skip to content
akiray03 edited this page Mar 6, 2013 · 25 revisions

実装メモ

  • iij/mrubyの実装は MRB_TT_FILE で作っているが、 MRB_TT_DATA に置き換える
  • MRB_TT_DATA に置き換えて、 IO#newしたオブジェクトがGCに回収されて動くところまでは試作した https://github.com/iij/mruby-io
  • IO, File のメソッドのうち、rubyで記述できるものはできるだけrubyで記述する
  • 既存のIO, Fileのコードはなるべく持って行かない :p
  • 細々とした(似た名前の) Cのユーティリティ関数は減らしたい
  • libc依存 (FILE構造体を持つ) の解消までは目指さない (MRB_TT_DATA で、 FILE構造体を持ち続ける)
  • テスト書く
  • FileTest作るか

実装の手順

  • MRB_TT_DATAに変えて、IO#newしたオブジェクトがGCに回収されて動くところまで作る
  • テスト書く
  • IOのメソッドを1個ずつ移植する。Rubyで書ける部分はRubyで書く。テストも書く。
  • テストは正常系と異常系のテストをセットにして書く。
  • mrbtestで書きにくいテストは、crubyのminitestなり使ってテストする
  • 本家mrubyでIO, Fileが使えるところがゴール

必要なメソッド

  • * が付いているメソッドから実装していく

cで書くもの

* IO#new
* IO#close
* IO#closed?
  IO.__popen__  : IO.popen のブロック非対応版
  IO.select :あとまわし?
* IO#read
* IO#write
* IO#sync
* IO#sync=
  IO#flush
  File.umask
* File.unlink, delete
  File.rename
* File.exist?, exists?
* File.dirname  : rubyで書ける?
  File.basename : rubyで書ける?
  File.realpath
  File.size
  File._getwd   : File.expand_path用のutil
  File._gethome : File.expand_path用のutil
  File#flock

rubyで書く

* IO.open
  IO.popen
* IO#gets
* IO#puts
* IO#print
* IO#each, #each_line
* File.open
  File.expand_path
  File#path

crubyのメソッド一覧

IO

method iij/mruby mruby-io memo
IO.binread
IO.binwrite
IO.copy_stream
IO.new, IO.for_fd, IO.open IO.new, IO.open o
IO.foreach
IO.pipe
IO.popen o o
IO.read
IO.readlines
IO.select o
IO.sysopen o o
IO.try_convert
IO.write
IO#<<
IO#advise
IO#autoclose=
IO#autoclose?
IO#binmode
IO#binmode?
IO#bytes obsolete
IO#chars obsolete
IO#clone, IO#dup
IO#close o o
IO#close_on_exec=
IO#close_on_exec?
IO#close_read
IO#close_write
IO#closed? o o
IO#codepoints obsolete
IO#each_byte o o
IO#each_char o
IO#each_codepoint
IO#each_line o o
IO#eof, IO#eof? o
IO#external_encoding
IO#fcntl
IO#fdatasync
IO#fileno, IO#to_i
IO#flush o
IO#fsync
IO#getbyte
IO#getc o o
IO#gets o o
IO#internal_encoding
IO#ioctl
IO#isatty, IO#tty?
IO#lineno
IO#lineno=
IO#lines obsolete
IO#pid o
IO#pos, IO#tell o
IO#pos= o
IO#print o o
IO#printf o o
IO#putc
IO#puts o o
IO#read o o
IO#read_nonblock
IO#readbyte
IO#readchar o
IO#readline o
IO#readlines o
IO#readpartial
IO#reopen
IO#rewind
IO#seek o
IO#set_encoding
IO#stat
IO#sync o
IO#sync= o
IO#sysread o
IO#sysseek o
IO#syswrite o
IO#to_io o
IO#ungetbyte
IO#ungetc o
IO#write o o
IO#write_nonblock

File

method iij/mruby mruby-io memo
File.absolute_path
File.atime
File.basename o o
File.blockdev? FileTest
File.chardev? FileTest
File.chmod
File.chown
File.ctime
File.delete, File.unlink o o
File.directory? o FileTest
File.dirname o o
File.executable? FileTest
File.executable_real? FileTest
File.exist?, exists? o o FileTest
File.expand_path o
File.extname o
File.file? o FileTest
File.fnmatch, File.fnmatch?
File.ftype
File.grpowned? FileTest
File.identical? FileTest
File.join o o
File.lchmod
File.lchown
File.link
File.lstat
File.mtime
File.new, File.open o o
File.owned? FileTest
File.path
File.pipe? o FileTest
File.readable? FileTest
File.readable_real? FileTest
File.readlink
File.realdirpath
File.realpath o o
File.rename o o
File.setgid? FileTest
File.setuid? FileTest
File.size o o
File.size? o FileTest
File.socket? o FileTest
File.split
File.stat
File.sticky? FileTest
File.symlink
File.symlink? o FileTest
File.truncate
File.umask o o
File.utime
File.world_readable?
File.world_writable?
File.writable? FileTest
File.writable_real? FileTest
File.zero? o FileTest
File#atime
File#chmod
File#chown
File#ctime
File#flock
File#lstat
File#mtime
File#path, File#to_path File#path o
File#size o
File#truncate
Clone this wiki locally