4242
4343import java .util .List ;
4444
45+ import com .oracle .graal .python .annotations .ArgumentClinic ;
4546import com .oracle .graal .python .annotations .Builtin ;
47+ import com .oracle .graal .python .annotations .PythonOS ;
4648import com .oracle .graal .python .builtins .CoreFunctions ;
4749import com .oracle .graal .python .builtins .Python3Core ;
4850import com .oracle .graal .python .builtins .PythonBuiltins ;
49- import com .oracle .graal .python .annotations .PythonOS ;
5051import com .oracle .graal .python .builtins .objects .PNone ;
52+ import com .oracle .graal .python .nodes .PConstructAndRaiseNode ;
5153import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
52- import com .oracle .graal .python .nodes .function .builtins .PythonTernaryBuiltinNode ;
54+ import com .oracle .graal .python .nodes .function .builtins .PythonTernaryClinicBuiltinNode ;
55+ import com .oracle .graal .python .nodes .function .builtins .clinic .ArgumentClinicProvider ;
56+ import com .oracle .graal .python .runtime .PosixSupportLibrary ;
57+ import com .oracle .truffle .api .dsl .Bind ;
58+ import com .oracle .truffle .api .dsl .Cached ;
5359import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
5460import com .oracle .truffle .api .dsl .NodeFactory ;
5561import com .oracle .truffle .api .dsl .Specialization ;
5662import com .oracle .truffle .api .frame .VirtualFrame ;
63+ import com .oracle .truffle .api .library .CachedLibrary ;
64+ import com .oracle .truffle .api .nodes .Node ;
5765
5866@ CoreFunctions (defineModule = "msvcrt" , os = PythonOS .PLATFORM_WIN32 )
5967public final class MsvcrtModuleBuiltins extends PythonBuiltins {
68+
69+ public static final int LK_LOCK = 1 ;
70+ public static final int LK_NBLCK = 2 ;
71+ public static final int LK_UNLOCK = 3 ;
72+
6073 @ Override
6174 protected List <? extends NodeFactory <? extends PythonBuiltinBaseNode >> getNodeFactories () {
6275 return MsvcrtModuleBuiltinsFactory .getFactories ();
@@ -65,18 +78,35 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
6578 @ Override
6679 public void initialize (Python3Core core ) {
6780 super .initialize (core );
68- addBuiltinConstant ("LK_NBLCK" , 0 );
69- addBuiltinConstant ("LK_UNLCK" , 0 );
81+ addBuiltinConstant ("LK_LOCK" , LK_LOCK );
82+ addBuiltinConstant ("LK_NBLCK" , LK_NBLCK );
83+ addBuiltinConstant ("LK_UNLCK" , LK_UNLOCK );
7084 }
7185
72- @ Builtin (name = "locking" , minNumOfPositionalArgs = 3 )
86+ @ Builtin (name = "locking" , minNumOfPositionalArgs = 3 , parameterNames = {"fd" , "mode" , "nbytes" })
87+ @ ArgumentClinic (name = "fd" , conversion = ArgumentClinic .ClinicConversion .Int )
88+ @ ArgumentClinic (name = "mode" , conversion = ArgumentClinic .ClinicConversion .Int )
89+ @ ArgumentClinic (name = "nbytes" , conversion = ArgumentClinic .ClinicConversion .Long )
7390 @ GenerateNodeFactory
74- public abstract static class EnumKeyNode extends PythonTernaryBuiltinNode {
75- @ SuppressWarnings ("unused" )
91+ public abstract static class LockingNode extends PythonTernaryClinicBuiltinNode {
7692 @ Specialization
77- static Object locking (VirtualFrame frame , Object file , Object operation , Object arg ) {
78- // TODO: implement on windows, this is just here to make mesonbuild work
93+ Object locking (VirtualFrame frame , int fd , int mode , long nbytes ,
94+ @ Bind Node inliningTarget ,
95+ @ Cached SysModuleBuiltins .AuditNode auditNode ,
96+ @ CachedLibrary ("getPosixSupport()" ) PosixSupportLibrary posixLib ,
97+ @ Cached PConstructAndRaiseNode .Lazy constructAndRaiseNode ) {
98+ auditNode .audit (inliningTarget , "msvcrt.locking" , fd , mode , nbytes );
99+ try {
100+ posixLib .fcntlLock (getPosixSupport (), fd , mode == LK_NBLCK , mode == LK_LOCK ? 1 : 0 , 0 , 0 , nbytes );
101+ } catch (PosixSupportLibrary .PosixException e ) {
102+ throw constructAndRaiseNode .get (inliningTarget ).raiseOSErrorFromPosixException (frame , e );
103+ }
79104 return PNone .NONE ;
80105 }
106+
107+ @ Override
108+ protected ArgumentClinicProvider getArgumentClinic () {
109+ return MsvcrtModuleBuiltinsClinicProviders .LockingNodeClinicProviderGen .INSTANCE ;
110+ }
81111 }
82112}
0 commit comments