Dev/Contribution

[RustPython] fcntl.ioctl 수정하기

TaeGit 2022. 9. 1. 15:56

Merged PR

  • PR Comment
 

update ioctl first arg by tgsong827 · Pull Request #4140 · RustPython/RustPython

#4070 add test_ioctl.py. update fn ioctl can take others having fileno method not only Integer.

github.com

 

개요

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

 

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

따라서, Integer 타입 외의 fileno() 메서드를 갖고 있는 객체도 받을 수 있게 변경했다.

 

과정

분석

fcntl.ioctl() 함수는 첫 번째 인자로 File Descriptor 를 받는다.

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

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

 

수정

수정할 내용은 다음과 같다.

  1. ioctl() 함수가 받고 있는 첫 번째 인자의 타입을 i32에서 PyObjectRef로 변경한다.
  2. 인자로 넘어온 PyObjectRefInteger 타입이라면 i32로 변경한다.

  3. 아니라면, 해당 객체가 fileno() 메소드를 갖고 있는지 확인하고, 갖고 있다면 호출해 i32 타입의 fd 값을 구한다.

 

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

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

 

 

Allow fcntl functions to accept objects with fileno() function by zxey · Pull Request #4144 · RustPython/RustPython

As specified in Python official documentation (https://docs.python.org/3.10/library/fcntl.html) All functions in this module take a file descriptor fd as their first argument. This can be an integ...

github.com

 

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

 

사실 이 내용은 바로 위에 있는 함수인 fcntl을 보면 힌트를 얻을 수 있는데, 제대로 확인하지 못했다.

테스트를 통과한다고 끝이라고 생각하지말고, 좀 더 나은 방법이 있는지 고민하는 습관을 들여야겠다.