11/*
2- * Copyright (c) 2021, 2025 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2021, 2026 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * The Universal Permissive License (UPL), Version 1.0
4242
4343import java .util .List ;
4444
45+ import com .oracle .graal .python .annotations .ArgumentClinic ;
46+ import com .oracle .graal .python .annotations .ArgumentClinic .ClinicConversion ;
4547import com .oracle .graal .python .annotations .Builtin ;
4648import com .oracle .graal .python .builtins .CoreFunctions ;
4749import com .oracle .graal .python .builtins .PythonBuiltins ;
50+ import com .oracle .graal .python .builtins .modules .PosixModuleBuiltins .PathConversionNode ;
51+ import com .oracle .graal .python .builtins .modules .PosixModuleBuiltins .PosixPath ;
4852import com .oracle .graal .python .builtins .objects .PNone ;
53+ import com .oracle .graal .python .nodes .PConstructAndRaiseNode ;
4954import com .oracle .graal .python .nodes .function .PythonBuiltinBaseNode ;
50- import com .oracle .graal .python .nodes .function .builtins .PythonUnaryBuiltinNode ;
55+ import com .oracle .graal .python .nodes .function .builtins .PythonClinicBuiltinNode ;
56+ import com .oracle .graal .python .nodes .function .builtins .PythonUnaryClinicBuiltinNode ;
57+ import com .oracle .graal .python .nodes .function .builtins .clinic .ArgumentClinicProvider ;
58+ import com .oracle .graal .python .runtime .PosixSupportLibrary ;
59+ import com .oracle .graal .python .runtime .PosixSupportLibrary .PosixException ;
60+ import com .oracle .graal .python .runtime .PythonContext ;
61+ import com .oracle .truffle .api .dsl .Bind ;
62+ import com .oracle .truffle .api .dsl .Cached ;
5163import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
5264import com .oracle .truffle .api .dsl .NodeFactory ;
5365import com .oracle .truffle .api .dsl .Specialization ;
66+ import com .oracle .truffle .api .frame .VirtualFrame ;
67+ import com .oracle .truffle .api .library .CachedLibrary ;
68+ import com .oracle .truffle .api .nodes .Node ;
5469
5570@ CoreFunctions (defineModule = "_posixshmem" )
5671public final class PosixShMemModuleBuiltins extends PythonBuiltins {
@@ -60,12 +75,53 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
6075 return PosixShMemModuleBuiltinsFactory .getFactories ();
6176 }
6277
63- @ Builtin (name = "shm_unlink" , minNumOfPositionalArgs = 1 )
78+ @ Builtin (name = "shm_open" , minNumOfPositionalArgs = 2 , parameterNames = {"path" , "flags" , "mode" })
79+ @ ArgumentClinic (name = "path" , conversionClass = PathConversionNode .class , args = {"false" , "false" })
80+ @ ArgumentClinic (name = "flags" , conversion = ClinicConversion .Int )
81+ @ ArgumentClinic (name = "mode" , conversion = ClinicConversion .Int , defaultValue = "0777" )
6482 @ GenerateNodeFactory
65- public abstract static class LocaleConvNode extends PythonUnaryBuiltinNode {
66- @ SuppressWarnings ("unused" )
83+ public abstract static class ShmOpenNode extends PythonClinicBuiltinNode {
84+
85+ @ Override
86+ protected ArgumentClinicProvider getArgumentClinic () {
87+ return PosixShMemModuleBuiltinsClinicProviders .ShmOpenNodeClinicProviderGen .INSTANCE ;
88+ }
89+
90+ @ Specialization
91+ static int shmOpen (VirtualFrame frame , PosixPath path , int flags , int mode ,
92+ @ Bind Node inliningTarget ,
93+ @ Bind PythonContext context ,
94+ @ CachedLibrary ("context.getPosixSupport()" ) PosixSupportLibrary posixLib ,
95+ @ Cached PConstructAndRaiseNode .Lazy constructAndRaiseNode ) {
96+ try {
97+ return posixLib .shmOpen (context .getPosixSupport (), path .value , flags , mode );
98+ } catch (PosixException e ) {
99+ throw constructAndRaiseNode .get (inliningTarget ).raiseOSErrorFromPosixException (frame , e , path .originalObject );
100+ }
101+ }
102+ }
103+
104+ @ Builtin (name = "shm_unlink" , minNumOfPositionalArgs = 1 , parameterNames = {"path" })
105+ @ ArgumentClinic (name = "path" , conversionClass = PathConversionNode .class , args = {"false" , "false" })
106+ @ GenerateNodeFactory
107+ public abstract static class ShmUnlinkNode extends PythonUnaryClinicBuiltinNode {
108+
109+ @ Override
110+ protected ArgumentClinicProvider getArgumentClinic () {
111+ return PosixShMemModuleBuiltinsClinicProviders .ShmUnlinkNodeClinicProviderGen .INSTANCE ;
112+ }
113+
67114 @ Specialization
68- public Object doit (Object path ) {
115+ static PNone shmUnlink (VirtualFrame frame , PosixPath path ,
116+ @ Bind Node inliningTarget ,
117+ @ Bind PythonContext context ,
118+ @ CachedLibrary ("context.getPosixSupport()" ) PosixSupportLibrary posixLib ,
119+ @ Cached PConstructAndRaiseNode .Lazy constructAndRaiseNode ) {
120+ try {
121+ posixLib .shmUnlink (context .getPosixSupport (), path .value );
122+ } catch (PosixException e ) {
123+ throw constructAndRaiseNode .get (inliningTarget ).raiseOSErrorFromPosixException (frame , e , path .originalObject );
124+ }
69125 return PNone .NONE ;
70126 }
71127 }
0 commit comments