Skip to content

Commit 15aad7c

Browse files
committed
Add new primitive(G|S)etWorkingDirectory prims
1 parent 1b2c708 commit 15aad7c

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/AbstractOSProcessPlugin.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,9 @@ protected final NilObject doChdir(@SuppressWarnings("unused") final Object recei
127127
@GenerateNodeFactory
128128
@SqueakPrimitive(names = "primitiveGetCurrentWorkingDirectory")
129129
protected abstract static class PrimGetCurrentWorkingDirectoryNode extends AbstractPrimitiveNode implements Primitive0 {
130-
131130
@Specialization
132-
protected final NativeObject doGet(@SuppressWarnings("unused") final Object receiver) {
133-
final SqueakImageContext image = getContext();
131+
protected static final NativeObject doGet(@SuppressWarnings("unused") final Object receiver,
132+
@Bind final SqueakImageContext image) {
134133
return image.asByteString(image.env.getCurrentWorkingDirectory().getPath());
135134
}
136135
}

src/de.hpi.swa.trufflesqueak/src/de/hpi/swa/trufflesqueak/nodes/plugins/FilePlugin.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,13 @@
2525
import com.oracle.truffle.api.TruffleFile;
2626
import com.oracle.truffle.api.TruffleFile.AttributeDescriptor;
2727
import com.oracle.truffle.api.TruffleFile.Attributes;
28+
import com.oracle.truffle.api.TruffleLanguage.Env;
29+
import com.oracle.truffle.api.dsl.Bind;
2830
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
2931
import com.oracle.truffle.api.dsl.ImportStatic;
3032
import com.oracle.truffle.api.dsl.NodeFactory;
3133
import com.oracle.truffle.api.dsl.Specialization;
34+
import com.oracle.truffle.api.nodes.Node;
3235

3336
import de.hpi.swa.trufflesqueak.exceptions.PrimitiveFailed;
3437
import 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

Comments
 (0)