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 Descriptor는 fileno()
를 통해 구한 Integer 타입 fileno()
를 갖고 있는 IOBase의 객체여야한다.
RustPython은 ioctl
함수의 첫 번째 인자로 Integer 타입만 받도록 되어있었고, fileno()
메서드를 갖고 있는 객체에 대한 검증은 되지 않고 있는 상황이었다.
따라서, Integer 타입 외의 fileno()
메서드를 갖고 있는 객체도 받을 수 있게 변경했다.
과정
분석
fcntl.ioctl()
함수는 첫 번째 인자로 File Descriptor 를 받는다.
이때, Integer 타입의 File Descriptor를 받는 것 뿐만 아니라, fileno()
메소드를 가진 객체 역시 받을 수 있어야한다.
RustPython은 Integer 타입만 받는 상황이고, fileno()
메소드를 갖고 있는 객체까지 받을 수 있게 수정해야 한다.
수정
수정할 내용은 다음과 같다.
ioctl()
함수가 받고 있는 첫 번째 인자의 타입을 i32에서 PyObjectRef로 변경한다.- 인자로 넘어온 PyObjectRef가 Integer 타입이라면 i32로 변경한다.
- 아니라면, 해당 객체가
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
을 보면 힌트를 얻을 수 있는데, 제대로 확인하지 못했다.
테스트를 통과한다고 끝이라고 생각하지말고, 좀 더 나은 방법이 있는지 고민하는 습관을 들여야겠다.
'Dev > Contribution' 카테고리의 다른 글
[RustPython] traceback.tb_next mutable 하게 만들기 (0) | 2022.08.21 |
---|---|
[RustPython] sslError 클래스에 library, reason 속성 추가하기 (0) | 2022.08.19 |
[RustPython] Set타입 fn update 수정하기 (0) | 2022.08.07 |
[RustPython] StopIteration 수정하기 (0) | 2022.08.07 |