2525import com .oracle .truffle .api .TruffleFile ;
2626import com .oracle .truffle .api .TruffleFile .AttributeDescriptor ;
2727import com .oracle .truffle .api .TruffleFile .Attributes ;
28+ import com .oracle .truffle .api .TruffleLanguage .Env ;
29+ import com .oracle .truffle .api .dsl .Bind ;
2830import com .oracle .truffle .api .dsl .GenerateNodeFactory ;
2931import com .oracle .truffle .api .dsl .ImportStatic ;
3032import com .oracle .truffle .api .dsl .NodeFactory ;
3133import com .oracle .truffle .api .dsl .Specialization ;
34+ import com .oracle .truffle .api .nodes .Node ;
3235
3336import de .hpi .swa .trufflesqueak .exceptions .PrimitiveFailed ;
3437import de .hpi .swa .trufflesqueak .image .SqueakImageContext ;
@@ -711,6 +714,16 @@ private static void writeToOutputStream(final OutputStream outputStream, final b
711714 }
712715 }
713716
717+ @ GenerateNodeFactory
718+ @ SqueakPrimitive (names = "primitiveGetWorkingDirectory" )
719+ protected abstract static class PrimGetWorkingDirectoryNode extends AbstractPrimitiveNode implements Primitive0 {
720+ @ Specialization
721+ protected static final NativeObject getWorkingDirectory (@ SuppressWarnings ("unused" ) final Object receiver ,
722+ @ Bind final SqueakImageContext image ) {
723+ return image .asByteString (image .env .getCurrentWorkingDirectory ().getPath ());
724+ }
725+ }
726+
714727 @ GenerateNodeFactory
715728 @ SqueakPrimitive (names = "primitiveHasFileAccess" )
716729 protected abstract static class PrimHasFileAccessNode extends AbstractPrimitiveNode implements Primitive0 {
@@ -719,4 +732,20 @@ protected final boolean hasFileAccess(@SuppressWarnings("unused") final Object r
719732 return BooleanObject .wrap (getContext ().env .isFileIOAllowed ());
720733 }
721734 }
735+
736+ @ GenerateNodeFactory
737+ @ SqueakPrimitive (names = "primitiveSetWorkingDirectory" )
738+ protected abstract static class PrimSetWorkingDirectoryNode extends AbstractPrimitiveNode implements Primitive1WithFallback {
739+ @ Specialization (guards = "path.isByteType()" )
740+ protected static final Object setWorkingDirectory (final Object receiver , final NativeObject path ,
741+ @ Bind final Node node ) {
742+ final Env env = getContext (node ).env ;
743+ final TruffleFile file = env .getPublicTruffleFile (path .asStringUnsafe ());
744+ if (!file .exists ()) {
745+ throw PrimitiveFailed .andTransferToInterpreter ();
746+ }
747+ env .setCurrentWorkingDirectory (file );
748+ return receiver ;
749+ }
750+ }
722751}
0 commit comments