Skip to content
Snippets Groups Projects
Commit 85abda31 authored by Florian Angerer's avatar Florian Angerer
Browse files

Implement 'Sys.umask'.

parent eb825986
No related branches found
No related tags found
No related merge requests found
......@@ -23,6 +23,7 @@
#include <rffiutils.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/stat.h>
#include <glob.h>
......@@ -110,3 +111,7 @@ void call_base_eSoftVersion(void (*call_eSoftVersion_setfields)(char *zlibVersio
snprintf(sPcreVersion, 256, "%s", pcre_version());
call_eSoftVersion_setfields(sZlibVersion, sPcreVersion);
}
int call_base_umask(int mode) {
return umask(mode);
}
59
60
......@@ -761,7 +761,7 @@ public class LaFunctions {
}
b = RDataFactory.createDoubleVector(bData, RDataFactory.COMPLETE_VECTOR);
if (aDn != null) {
setNamesNode.setNames(b, RDataFactory.createStringVector((String) aDn.getDataAt(1)));
setNamesNode.setNames(b, (RStringVector) RRuntime.asAbstractVector(aDn.getDataAt(1)));
}
}
......
......@@ -45,14 +45,17 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.FrameInstance.FrameAccess;
import com.oracle.truffle.api.frame.MaterializedFrame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.profiles.ConditionProfile;
import com.oracle.truffle.r.nodes.attributes.SpecialAttributesFunctions.SetClassAttributeNode;
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
import com.oracle.truffle.r.nodes.builtin.RBuiltinPackages;
import com.oracle.truffle.r.nodes.function.visibility.SetVisibilityNode;
import com.oracle.truffle.r.runtime.FileSystemUtils;
import com.oracle.truffle.r.runtime.RArguments;
import com.oracle.truffle.r.runtime.RCaller;
......@@ -64,6 +67,7 @@ import com.oracle.truffle.r.runtime.builtins.RBuiltin;
import com.oracle.truffle.r.runtime.context.RContext;
import com.oracle.truffle.r.runtime.data.RDataFactory;
import com.oracle.truffle.r.runtime.data.RFunction;
import com.oracle.truffle.r.runtime.data.RIntVector;
import com.oracle.truffle.r.runtime.data.RLogicalVector;
import com.oracle.truffle.r.runtime.data.RNull;
import com.oracle.truffle.r.runtime.data.RStringVector;
......@@ -317,7 +321,6 @@ public class SysFunctions {
}
}
// TODO implement
@RBuiltin(name = "Sys.umask", visibility = CUSTOM, kind = INTERNAL, parameterNames = {"octmode"}, behavior = COMPLEX)
public abstract static class SysUmask extends RBuiltinNode.Arg1 {
......@@ -326,11 +329,23 @@ public class SysFunctions {
casts.arg("octmode").asIntegerVector().findFirst();
}
@SuppressWarnings("unused")
@Specialization
@TruffleBoundary
protected Object sysUmask(int octmode) {
throw RError.nyi(this, "Sys.umask");
protected Object sysUmask(VirtualFrame frame, int octmode,
@Cached("create()") BaseRFFI.UmaskNode umaskNode,
@Cached("create()") SetVisibilityNode setVisibilityNode,
@Cached("create()") SetClassAttributeNode setClassNode) {
int res;
if (octmode == RRuntime.INT_NA) {
res = umaskNode.umask(0);
umaskNode.umask(res);
setVisibilityNode.execute(frame, true);
} else {
res = umaskNode.umask(octmode);
setVisibilityNode.execute(frame, false);
}
RIntVector rv = RDataFactory.createIntVectorFromScalar(res);
setClassNode.execute(rv, RDataFactory.createStringVector("octmode"));
return rv;
}
}
......
......@@ -36,7 +36,7 @@ import com.oracle.truffle.r.runtime.RError.Message;
public class FileSystemUtils {
private static PosixFilePermission[] permissionValues = PosixFilePermission.values();
private static Set<PosixFilePermission> permissionsFromMode(int mode) {
public static Set<PosixFilePermission> permissionsFromMode(int mode) {
Set<PosixFilePermission> permissions = EnumSet.noneOf(PosixFilePermission.class);
for (int i = 0; i < permissionValues.length; i++) {
if ((mode & (1 << (permissionValues.length - i - 1))) != 0) {
......
......@@ -266,6 +266,21 @@ public final class BaseRFFI {
}
}
public static final class UmaskNode extends NativeCallNode {
private UmaskNode(DownCallNodeFactory parent) {
super(parent.createDownCallNode(NativeFunction.umask));
}
public int umask(int mode) {
return (int) call(mode);
}
public static UmaskNode create() {
return RFFIFactory.getBaseRFFI().createUmaskNode();
}
}
public GetpidNode createGetpidNode() {
return new GetpidNode(downCallNodeFactory);
}
......@@ -302,6 +317,10 @@ public final class BaseRFFI {
return new ESoftVersionNode(downCallNodeFactory);
}
public UmaskNode createUmaskNode() {
return new UmaskNode(downCallNodeFactory);
}
/*
* Some functions are called from non-Truffle contexts, which requires a RootNode
*/
......
......@@ -42,6 +42,7 @@ public enum NativeFunction {
uname("((string, string, string, string, string): void): void", "call_base_"),
glob("((string): void, string): void", "call_base_"),
eSoftVersion("((string, string): void): void", "call_base_"),
umask("(sint32): sint32", "call_base_"),
// PCRE
maketables("(): sint64", "call_pcre_"),
compile("((uint64, string, sint32): void, string, sint32, uint64): void", "call_pcre_"),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment