[RustPython] fcntl.ioctl 수정하기

Merged PR

 update ioctl first arg


개요

CPython에서 ioctl 함수의 첫 번째 인자로 File Descriptor를 받는다. File Descriptor는 fileno()를 통해 구한 Integer 타입 fileno()를 갖고 있는 IOBase의 객체여야한다.

RustPython은 ioctl 함수의 첫 번째 인자로 Integer 타입만 받도록 되어있었고, fileno() 메서드를 갖고 있는 객체에 대한 검증은 되지 않고 있는 상황이었다. 따라서, Integer 타입 외의 fileno() 메서드를 갖고 있는 객체도 받을 수 있게 변경했다.


과정

분석

fcntl.ioctl() 함수는 첫 번째 인자로 File Descriptor 를 받는다. 이때, Integer 타입의 File Descriptor를 받는 것 뿐만 아니라, fileno() 메소드를 가진 객체 역시 받을 수 있어야한다.

RustPython은 Integer 타입만 받는 상황이고, fileno() 메소드를 갖고 있는 객체까지 받을 수 있게 수정해야 한다.


수정

  1. ioctl() 함수가 받고 있는 첫 번째 인자의 타입을 i32에서 PyObjectRef로 변경한다.
  2. 인자로 넘어온 PyObjectRef가 Integer 타입이라면 i32로 변경한다.
  3. 아니라면, 해당 객체가 fileno() 메소드를 갖고 있는지 확인하고, 갖고 있다면 호출해 i32 타입의 fd 값을 구한다.
1.png

위 사진처럼 수정한 내용으로 테스트를 정상적으로 통과했고 머지될 수 있었지만, 좀 더 나은 방법이 존재했다.

내가 PR이 Merge된 후 내가 작업한 내용과 관련된 새로운 PR이 올라왔다.

Allow fcntl functions to accept objects with fileno() function

첫 번째 인자로 PyObjectRef 타입을 받는 것이 아닌, io::Fildes 타입을 받게 되면 바로 fd 값을 받을 수 있게 된다. 결과적으로 내가 수정한 내용을 훨씬 줄일 수 있는 내용이었다.

사실 이 내용은 바로 위에 있는 함수인 fcntl을 보면 힌트를 얻을 수 있는데, 제대로 확인하지 못했다. 테스트를 통과한다고 끝이라고 생각하지말고, 좀 더 나은 방법이 있는지 고민해봐야겠다.