Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: d38b7b66e682
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 876eab61a31f
Choose a head ref
  • 16 commits
  • 21 files changed
  • 1 contributor

Commits on Apr 6, 2016

  1. [Truffle] Time is safe.

    chrisseaton committed Apr 6, 2016
    Copy the full SHA
    fa0fad6 View commit details
  2. Copy the full SHA
    eaedfe7 View commit details
  3. Copy the full SHA
    7cdff4e View commit details
  4. Copy the full SHA
    8422854 View commit details
  5. Copy the full SHA
    799971f View commit details
  6. Copy the full SHA
    3cdbb1d View commit details
  7. Copy the full SHA
    f7ac98c View commit details
  8. Copy the full SHA
    fdd0890 View commit details
  9. Copy the full SHA
    361c73f View commit details
  10. Copy the full SHA
    eb81113 View commit details
  11. Copy the full SHA
    47c6868 View commit details
  12. Copy the full SHA
    295a048 View commit details
  13. Copy the full SHA
    e8e9e7c View commit details
  14. Copy the full SHA
    a708a57 View commit details
  15. Copy the full SHA
    08b18d3 View commit details
  16. Copy the full SHA
    876eab6 View commit details
Showing with 167 additions and 120 deletions.
  1. +2 −1 core/src/main/java/org/jruby/util/cli/Options.java
  2. +6 −5 test/truffle/integration/safe.sh
  3. +0 −2 truffle/src/main/java/org/jruby/truffle/core/CoreMethod.java
  4. +3 −0 truffle/src/main/java/org/jruby/truffle/core/CoreMethodNodeManager.java
  5. +1 −1 truffle/src/main/java/org/jruby/truffle/core/kernel/KernelNodes.java
  6. +4 −3 truffle/src/main/java/org/jruby/truffle/core/rubinius/IOBufferPrimitiveNodes.java
  7. +17 −16 truffle/src/main/java/org/jruby/truffle/core/rubinius/IOPrimitiveNodes.java
  8. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/NativeFunctionPrimitiveNodes.java
  9. +16 −15 truffle/src/main/java/org/jruby/truffle/core/rubinius/PointerPrimitiveNodes.java
  10. +29 −29 truffle/src/main/java/org/jruby/truffle/core/rubinius/PosixNodes.java
  11. +0 −2 truffle/src/main/java/org/jruby/truffle/core/rubinius/RubiniusPrimitive.java
  12. +1 −1 truffle/src/main/java/org/jruby/truffle/core/rubinius/RubiniusTypeNodes.java
  13. +17 −16 truffle/src/main/java/org/jruby/truffle/core/rubinius/StatPrimitiveNodes.java
  14. +10 −10 truffle/src/main/java/org/jruby/truffle/core/rubinius/TimePrimitiveNodes.java
  15. +29 −1 truffle/src/main/java/org/jruby/truffle/extra/TrufflePrimitiveNodes.java
  16. +2 −1 truffle/src/main/java/org/jruby/truffle/language/Options.java
  17. +1 −1 truffle/src/main/java/org/jruby/truffle/language/globals/CheckStdoutVariableTypeNode.java
  18. +1 −0 truffle/src/main/java/org/jruby/truffle/platform/UnsafeGroup.java
  19. +4 −2 truffle/src/main/ruby/core/main.rb
  20. +5 −1 truffle/src/main/ruby/core/rubinius/platform/pointer.rb
  21. +18 −12 truffle/src/main/ruby/core/shims.rb
3 changes: 2 additions & 1 deletion core/src/main/java/org/jruby/util/cli/Options.java
Original file line number Diff line number Diff line change
@@ -224,7 +224,8 @@ public class Options {

public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE = bool(TRUFFLE, "truffle.platform.safe", true, "Default value for the safety of all operations.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_LOAD = bool(TRUFFLE, "truffle.platform.safe.load", TRUFFLE_PLATFORM_SAFE.load(), "Treat loading, requiring and autoloading as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_IO = bool(TRUFFLE, "truffle.platform.safe.io", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal perofrm IO as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_IO = bool(TRUFFLE, "truffle.platform.safe.io", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal with IO as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_MEMORY = bool(TRUFFLE, "truffle.platform.safe.memory", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal with unmanaged memory as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_THREADS = bool(TRUFFLE, "truffle.platform.safe.threads", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal with threads as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_PROCESSES = bool(TRUFFLE, "truffle.platform.safe.processes", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal with processes as safe.");
public static final Option<Boolean> TRUFFLE_PLATFORM_SAFE_SIGNALS = bool(TRUFFLE, "truffle.platform.safe.siganls", TRUFFLE_PLATFORM_SAFE.load(), "Treat any methods that deal with signals as safe.");
11 changes: 6 additions & 5 deletions test/truffle/integration/safe.sh
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ function unsafe {

# Things that are alway safe

safe -e "14"
safe -e 14

# Check our safe_puts is safe

@@ -24,16 +24,17 @@ safe -e "Truffle::Primitive.safe_puts 'hello, world'"

unsafe -Xtruffle.platform.safe_puts=false -e "Truffle::Primitive.safe_puts 'hello, world'"

# Check default unsafe operations
# Try some unsafe operations

#unsafe -e "puts 'hello, world'"
unsafe -e "puts 'hello, world'"
unsafe -e '`echo foo`'
unsafe -e 'exit!'
unsafe -e 'Rubinius::FFI::Pointer.new(1).read_int'
unsafe -e "File.open('bad.txt')"

# Check we can enable some unsafe operations if we want to

safe -Xtruffle.platform.safe.processes=true -e '`echo foo`'
safe -Xtruffle.platform.safe.exit=true -e 'exit'
safe -Xtruffle.platform.safe.exit=true -e 'exit!'

# Check that safe_puts sanitises correctly

2 changes: 0 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/core/CoreMethod.java
Original file line number Diff line number Diff line change
@@ -84,6 +84,4 @@

UnsafeGroup[] unsafe() default {};

boolean unsafeNeedsAudit() default false;

}
Original file line number Diff line number Diff line change
@@ -271,6 +271,9 @@ public static boolean isSafe(RubyContext context, UnsafeGroup[] groups) {
case IO:
option = options.PLATFORM_SAFE_IO;
break;
case MEMORY:
option = options.PLATFORM_SAFE_MEMORY;
break;
case THREADS:
option = options.PLATFORM_SAFE_THREADS;
break;
Original file line number Diff line number Diff line change
@@ -144,7 +144,7 @@
@CoreClass(name = "Kernel")
public abstract class KernelNodes {

@CoreMethod(names = "`", isModuleFunction = true, needsSelf = false, required = 1, unsafe = UnsafeGroup.PROCESSES)
@CoreMethod(names = "`", isModuleFunction = true, needsSelf = false, required = 1, unsafe = {UnsafeGroup.IO, UnsafeGroup.PROCESSES})
public abstract static class BacktickNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode toHashNode;
Original file line number Diff line number Diff line change
@@ -52,14 +52,15 @@
import org.jruby.truffle.language.control.RaiseException;
import org.jruby.truffle.language.objects.AllocateObjectNode;
import org.jruby.truffle.language.objects.AllocateObjectNodeGen;
import org.jruby.truffle.platform.UnsafeGroup;
import org.jruby.util.ByteList;

public abstract class IOBufferPrimitiveNodes {

private static final int IOBUFFER_SIZE = 32768;
private static final int STACK_BUF_SZ = 8192;

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "iobuffer_allocate")
@RubiniusPrimitive(name = "iobuffer_allocate", unsafe = UnsafeGroup.IO)
public static abstract class IOBufferAllocatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateNode;
@@ -80,7 +81,7 @@ public DynamicObject allocate(DynamicObject classToAllocate) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "iobuffer_unshift", lowerFixnumParameters = 1)
@RubiniusPrimitive(name = "iobuffer_unshift", lowerFixnumParameters = 1, unsafe = UnsafeGroup.IO)
public static abstract class IOBufferUnshiftPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOBufferUnshiftPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -112,7 +113,7 @@ public int unshift(VirtualFrame frame, DynamicObject ioBuffer, DynamicObject str

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "iobuffer_fill")
@RubiniusPrimitive(name = "iobuffer_fill", unsafe = UnsafeGroup.IO)
public static abstract class IOBufferFillPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOBufferFillPrimitiveNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -60,6 +60,7 @@
import org.jruby.truffle.language.dispatch.DispatchHeadNodeFactory;
import org.jruby.truffle.language.objects.AllocateObjectNode;
import org.jruby.truffle.language.objects.AllocateObjectNodeGen;
import org.jruby.truffle.platform.UnsafeGroup;
import org.jruby.truffle.stdlib.sockets.FDSet;
import org.jruby.truffle.stdlib.sockets.FDSetFactory;
import org.jruby.truffle.stdlib.sockets.FDSetFactoryFactory;
@@ -75,7 +76,7 @@ public abstract class IOPrimitiveNodes {

private static int STDOUT = 1;

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_allocate")
@RubiniusPrimitive(name = "io_allocate", unsafe = UnsafeGroup.IO)
public static abstract class IOAllocatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode newBufferNode;
@@ -95,7 +96,7 @@ public DynamicObject allocate(VirtualFrame frame, DynamicObject classToAllocate)

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_connect_pipe", needsSelf = false)
@RubiniusPrimitive(name = "io_connect_pipe", needsSelf = false, unsafe = UnsafeGroup.IO)
public static abstract class IOConnectPipeNode extends RubiniusPrimitiveArrayArgumentsNode {

private final int RDONLY;
@@ -150,7 +151,7 @@ private void newOpenFd(int newFd) {
}
}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_open", needsSelf = false, lowerFixnumParameters = { 1, 2 })
@RubiniusPrimitive(name = "io_open", needsSelf = false, lowerFixnumParameters = { 1, 2 }, unsafe = UnsafeGroup.IO)
public static abstract class IOOpenPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOOpenPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -165,7 +166,7 @@ public int open(DynamicObject path, int mode, int permission) {
}


@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_truncate", needsSelf = false)
@RubiniusPrimitive(name = "io_truncate", needsSelf = false, unsafe = UnsafeGroup.IO)
public static abstract class IOTruncatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOTruncatePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -184,7 +185,7 @@ public int truncate(DynamicObject path, long length) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_ftruncate")
@RubiniusPrimitive(name = "io_ftruncate", unsafe = UnsafeGroup.IO)
public static abstract class IOFTruncatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOFTruncatePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -199,7 +200,7 @@ public int ftruncate(VirtualFrame frame, DynamicObject io, long length) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_fnmatch", needsSelf = false)
@RubiniusPrimitive(name = "io_fnmatch", needsSelf = false, unsafe = UnsafeGroup.IO)
public static abstract class IOFNMatchPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOFNMatchPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -223,7 +224,7 @@ public boolean fnmatch(DynamicObject pattern, DynamicObject path, int flags) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_ensure_open")
@RubiniusPrimitive(name = "io_ensure_open", unsafe = UnsafeGroup.IO)
public static abstract class IOEnsureOpenPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOEnsureOpenPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -246,7 +247,7 @@ public DynamicObject ensureOpen(VirtualFrame frame, DynamicObject file) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_read_if_available", lowerFixnumParameters = 0)
@RubiniusPrimitive(name = "io_read_if_available", lowerFixnumParameters = 0, unsafe = UnsafeGroup.IO)
public static abstract class IOReadIfAvailableNode extends RubiniusPrimitiveArrayArgumentsNode {

private static final FDSetFactory fdSetFactory = FDSetFactoryFactory.create();
@@ -298,7 +299,7 @@ public Object readIfAvailable(DynamicObject file, int numberOfBytes) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_reopen")
@RubiniusPrimitive(name = "io_reopen", unsafe = UnsafeGroup.IO)
public static abstract class IOReopenPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode resetBufferingNode;
@@ -338,7 +339,7 @@ public Object reopen(VirtualFrame frame, DynamicObject file, DynamicObject io) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_reopen_path", lowerFixnumParameters = 1)
@RubiniusPrimitive(name = "io_reopen_path", lowerFixnumParameters = 1, unsafe = UnsafeGroup.IO)
public static abstract class IOReopenPathPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode resetBufferingNode;
@@ -397,7 +398,7 @@ public Object reopenPath(VirtualFrame frame, DynamicObject file, DynamicObject p

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_write")
@RubiniusPrimitive(name = "io_write", unsafe = UnsafeGroup.IO)
public static abstract class IOWritePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOWritePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -441,7 +442,7 @@ public int write(DynamicObject file, DynamicObject string) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_close")
@RubiniusPrimitive(name = "io_close", unsafe = UnsafeGroup.IO)
public static abstract class IOClosePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode ensureOpenNode;
@@ -480,7 +481,7 @@ public int close(VirtualFrame frame, DynamicObject io) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_seek", lowerFixnumParameters = {0, 1})
@RubiniusPrimitive(name = "io_seek", lowerFixnumParameters = {0, 1}, unsafe = UnsafeGroup.IO)
public static abstract class IOSeekPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOSeekPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -495,7 +496,7 @@ public int seek(VirtualFrame frame, DynamicObject io, int amount, int whence) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_accept")
@RubiniusPrimitive(name = "io_accept", unsafe = UnsafeGroup.IO)
public abstract static class AcceptNode extends RubiniusPrimitiveArrayArgumentsNode {

public AcceptNode(RubyContext context, SourceSection sourceSection) {
@@ -529,7 +530,7 @@ public int accept(DynamicObject io) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_sysread")
@RubiniusPrimitive(name = "io_sysread", unsafe = UnsafeGroup.IO)
public static abstract class IOSysReadPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public IOSysReadPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -569,7 +570,7 @@ public DynamicObject sysread(VirtualFrame frame, DynamicObject file, int length)

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "io_select", needsSelf = false, lowerFixnumParameters = 3)
@RubiniusPrimitive(name = "io_select", needsSelf = false, lowerFixnumParameters = 3, unsafe = UnsafeGroup.IO)
public static abstract class IOSelectPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

private static final FDSetFactory fdSetFactory = FDSetFactoryFactory.create();
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@

public abstract class NativeFunctionPrimitiveNodes {

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "nativefunction_type_size", needsSelf = false)
@RubiniusPrimitive(name = "nativefunction_type_size", needsSelf = false)
public static abstract class NativeFunctionTypeSizePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public NativeFunctionTypeSizePrimitiveNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@
import org.jruby.truffle.language.objects.AllocateObjectNode;
import org.jruby.truffle.language.objects.AllocateObjectNodeGen;
import org.jruby.truffle.platform.RubiniusTypes;
import org.jruby.truffle.platform.UnsafeGroup;
import org.jruby.util.ByteList;
import org.jruby.util.unsafe.UnsafeHolder;

@@ -39,7 +40,7 @@ public abstract class PointerPrimitiveNodes {
* library to define that method.
*/

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_allocate")
@RubiniusPrimitive(name = "pointer_allocate", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerAllocatePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -56,7 +57,7 @@ public DynamicObject allocate(DynamicObject pointerClass) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_malloc")
@RubiniusPrimitive(name = "pointer_malloc", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerMallocPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -79,7 +80,7 @@ public DynamicObject malloc(DynamicObject pointerClass, long size) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_free")
@RubiniusPrimitive(name = "pointer_free", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerFreePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerFreePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -95,7 +96,7 @@ public DynamicObject free(DynamicObject pointer) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_set_address")
@RubiniusPrimitive(name = "pointer_set_address", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerSetAddressPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerSetAddressPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -115,7 +116,7 @@ public long setAddress(DynamicObject pointer, long address) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_add")
@RubiniusPrimitive(name = "pointer_add", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerAddPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -137,7 +138,7 @@ public DynamicObject add(DynamicObject a, long b) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_read_int")
@RubiniusPrimitive(name = "pointer_read_int", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerReadIntPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerReadIntPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -155,7 +156,7 @@ protected boolean isSigned(boolean signed) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_read_string", lowerFixnumParameters = 0)
@RubiniusPrimitive(name = "pointer_read_string", lowerFixnumParameters = 0, unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerReadStringPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerReadStringPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -171,7 +172,7 @@ public DynamicObject readString(DynamicObject pointer, int length) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_set_autorelease")
@RubiniusPrimitive(name = "pointer_set_autorelease", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerSetAutoreleasePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerSetAutoreleasePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -186,7 +187,7 @@ public boolean setAutorelease(DynamicObject pointer, boolean autorelease) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_set_at_offset", lowerFixnumParameters = {0, 1})
@RubiniusPrimitive(name = "pointer_set_at_offset", lowerFixnumParameters = {0, 1}, unsafe = UnsafeGroup.MEMORY)
@ImportStatic(RubiniusTypes.class)
public static abstract class PointerSetAtOffsetPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@@ -220,7 +221,7 @@ public long setAtOffsetULL(DynamicObject pointer, int offset, int type, long val

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_read_pointer")
@RubiniusPrimitive(name = "pointer_read_pointer", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerReadPointerPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -243,7 +244,7 @@ public DynamicObject readPointer(DynamicObject pointer) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_address")
@RubiniusPrimitive(name = "pointer_address", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerAddressPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerAddressPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -257,7 +258,7 @@ public long address(DynamicObject pointer) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_get_at_offset")
@RubiniusPrimitive(name = "pointer_get_at_offset", unsafe = UnsafeGroup.MEMORY)
@ImportStatic(RubiniusTypes.class)
public static abstract class PointerGetAtOffsetPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@@ -331,7 +332,7 @@ public DynamicObject getAtOffsetPointer(DynamicObject pointer, int offset, int t

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_write_string")
@RubiniusPrimitive(name = "pointer_write_string", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerWriteStringPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerWriteStringPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -348,7 +349,7 @@ public DynamicObject address(DynamicObject pointer, DynamicObject string, int ma

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_read_string_to_null")
@RubiniusPrimitive(name = "pointer_read_string_to_null", unsafe = UnsafeGroup.MEMORY)
@ImportStatic(PointerGuards.class)
public static abstract class PointerReadStringToNullPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@@ -369,7 +370,7 @@ public DynamicObject readStringToNull(DynamicObject pointer) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "pointer_write_int")
@RubiniusPrimitive(name = "pointer_write_int", unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerWriteIntPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public PointerWriteIntPrimitiveNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ public int dup(int descriptor) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "environ", isModuleFunction = true)
@CoreMethod(names = "environ", isModuleFunction = true, unsafe = {UnsafeGroup.MEMORY, UnsafeGroup.PROCESSES})
public abstract static class EnvironNode extends CoreMethodArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -160,7 +160,7 @@ public int fchown(int descriptor, int owner, int group) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getegid", isModuleFunction = true)
@CoreMethod(names = "getegid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetEGIDNode extends CoreMethodArrayArgumentsNode {

public GetEGIDNode(RubyContext context, SourceSection sourceSection) {
@@ -174,7 +174,7 @@ public int getEGID() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getenv", isModuleFunction = true, required = 1)
@CoreMethod(names = "getenv", isModuleFunction = true, required = 1, unsafe = {UnsafeGroup.MEMORY, UnsafeGroup.PROCESSES})
public abstract static class GetenvNode extends CoreMethodArrayArgumentsNode {

public GetenvNode(RubyContext context, SourceSection sourceSection) {
@@ -194,7 +194,7 @@ public DynamicObject getenv(DynamicObject name) {
}
}

@CoreMethod(unsafeNeedsAudit = true, names = "geteuid", isModuleFunction = true)
@CoreMethod(names = "geteuid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetEUIDNode extends CoreMethodArrayArgumentsNode {

public GetEUIDNode(RubyContext context, SourceSection sourceSection) {
@@ -208,7 +208,7 @@ public int getEUID() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getgid", isModuleFunction = true)
@CoreMethod(names = "getgid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetGIDNode extends CoreMethodArrayArgumentsNode {

public GetGIDNode(RubyContext context, SourceSection sourceSection) {
@@ -222,7 +222,7 @@ public int getGID() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getgroups", isModuleFunction = true, required = 2)
@CoreMethod(names = "getgroups", isModuleFunction = true, required = 2, unsafe = {UnsafeGroup.MEMORY, UnsafeGroup.PROCESSES})
public abstract static class GetGroupsNode extends CoreMethodArrayArgumentsNode {

public GetGroupsNode(RubyContext context, SourceSection sourceSection) {
@@ -252,7 +252,7 @@ public int getGroups(int max, DynamicObject pointer) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getrlimit", isModuleFunction = true, required = 2)
@CoreMethod(names = "getrlimit", isModuleFunction = true, required = 2, unsafe = {UnsafeGroup.PROCESSES, UnsafeGroup.MEMORY})
public abstract static class GetRLimitNode extends CoreMethodArrayArgumentsNode {

public GetRLimitNode(RubyContext context, SourceSection sourceSection) {
@@ -274,7 +274,7 @@ public int getrlimit(int resource, DynamicObject pointer) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getuid", isModuleFunction = true)
@CoreMethod(names = "getuid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetUIDNode extends CoreMethodArrayArgumentsNode {

public GetUIDNode(RubyContext context, SourceSection sourceSection) {
@@ -288,7 +288,7 @@ public int getUID() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "memset", isModuleFunction = true, required = 3)
@CoreMethod(names = "memset", isModuleFunction = true, required = 3, unsafe = UnsafeGroup.MEMORY)
public abstract static class MemsetNode extends CoreMethodArrayArgumentsNode {

public MemsetNode(RubyContext context, SourceSection sourceSection) {
@@ -308,7 +308,7 @@ public DynamicObject memset(DynamicObject pointer, int c, long length) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "putenv", isModuleFunction = true, required = 1)
@CoreMethod(names = "putenv", isModuleFunction = true, required = 1, unsafe = UnsafeGroup.PROCESSES)
public abstract static class PutenvNode extends CoreMethodArrayArgumentsNode {

public PutenvNode(RubyContext context, SourceSection sourceSection) {
@@ -344,7 +344,7 @@ public int readlink(DynamicObject path, DynamicObject pointer, int bufsize) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setenv", isModuleFunction = true, required = 3)
@CoreMethod(names = "setenv", isModuleFunction = true, required = 3, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetenvNode extends CoreMethodArrayArgumentsNode {

public SetenvNode(RubyContext context, SourceSection sourceSection) {
@@ -389,7 +389,7 @@ public int unlink(DynamicObject path) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "umask", isModuleFunction = true, required = 1)
@CoreMethod(names = "umask", isModuleFunction = true, required = 1, unsafe = UnsafeGroup.PROCESSES)
public abstract static class UmaskNode extends CoreMethodArrayArgumentsNode {

public UmaskNode(RubyContext context, SourceSection sourceSection) {
@@ -403,7 +403,7 @@ public int umask(int mask) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "unsetenv", isModuleFunction = true, required = 1)
@CoreMethod(names = "unsetenv", isModuleFunction = true, required = 1, unsafe = UnsafeGroup.PROCESSES)
public abstract static class UnsetenvNode extends CoreMethodArrayArgumentsNode {

public UnsetenvNode(RubyContext context, SourceSection sourceSection) {
@@ -418,7 +418,7 @@ public int unsetenv(DynamicObject name) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "utimes", isModuleFunction = true, required = 2)
@CoreMethod(names = "utimes", isModuleFunction = true, required = 2, unsafe = {UnsafeGroup.PROCESSES, UnsafeGroup.MEMORY})
public abstract static class UtimesNode extends CoreMethodArrayArgumentsNode {

public UtimesNode(RubyContext context, SourceSection sourceSection) {
@@ -477,7 +477,7 @@ public int chdir(DynamicObject path) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getpriority", isModuleFunction = true, required = 2, lowerFixnumParameters = {0, 1})
@CoreMethod(names = "getpriority", isModuleFunction = true, required = 2, lowerFixnumParameters = {0, 1}, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetPriorityNode extends CoreMethodArrayArgumentsNode {

public GetPriorityNode(RubyContext context, SourceSection sourceSection) {
@@ -491,7 +491,7 @@ public int getpriority(int kind, int id) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setgid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0)
@CoreMethod(names = "setgid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetgidNode extends CoreMethodArrayArgumentsNode {

public SetgidNode(RubyContext context, SourceSection sourceSection) {
@@ -505,7 +505,7 @@ public int setgid(int gid) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setpriority", isModuleFunction = true, required = 3, lowerFixnumParameters = {0, 1, 2})
@CoreMethod(names = "setpriority", isModuleFunction = true, required = 3, lowerFixnumParameters = {0, 1, 2}, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetPriorityNode extends CoreMethodArrayArgumentsNode {

public SetPriorityNode(RubyContext context, SourceSection sourceSection) {
@@ -519,7 +519,7 @@ public int setpriority(int kind, int id, int priority) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setresuid", isModuleFunction = true, required = 3, lowerFixnumParameters = {0, 1, 2})
@CoreMethod(names = "setresuid", isModuleFunction = true, required = 3, lowerFixnumParameters = {0, 1, 2}, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetResuidNode extends CoreMethodArrayArgumentsNode {

public SetResuidNode(RubyContext context, SourceSection sourceSection) {
@@ -534,7 +534,7 @@ public int setresuid(int uid, int id, int priority) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "seteuid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0)
@CoreMethod(names = "seteuid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetEuidNode extends CoreMethodArrayArgumentsNode {

public SetEuidNode(RubyContext context, SourceSection sourceSection) {
@@ -548,7 +548,7 @@ public int seteuid(int uid) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setreuid", isModuleFunction = true, required = 2, lowerFixnumParameters = {0, 1})
@CoreMethod(names = "setreuid", isModuleFunction = true, required = 2, lowerFixnumParameters = {0, 1}, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetReuidNode extends CoreMethodArrayArgumentsNode {

public SetReuidNode(RubyContext context, SourceSection sourceSection) {
@@ -563,7 +563,7 @@ public int setreuid(int uid, int id) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setrlimit", isModuleFunction = true, required = 2)
@CoreMethod(names = "setrlimit", isModuleFunction = true, required = 2, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetRLimitNode extends CoreMethodArrayArgumentsNode {

public SetRLimitNode(RubyContext context, SourceSection sourceSection) {
@@ -584,7 +584,7 @@ public int setrlimit(int resource, DynamicObject pointer) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setruid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0)
@CoreMethod(names = "setruid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetRuidNode extends CoreMethodArrayArgumentsNode {

public SetRuidNode(RubyContext context, SourceSection sourceSection) {
@@ -599,7 +599,7 @@ public int setruid(int uid) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setuid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0)
@CoreMethod(names = "setuid", isModuleFunction = true, required = 1, lowerFixnumParameters = 0, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetUidNode extends CoreMethodArrayArgumentsNode {

public SetUidNode(RubyContext context, SourceSection sourceSection) {
@@ -613,7 +613,7 @@ public int setuid(int uid) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "setsid", isModuleFunction = true)
@CoreMethod(names = "setsid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class SetSidNode extends CoreMethodArrayArgumentsNode {

public SetSidNode(RubyContext context, SourceSection sourceSection) {
@@ -721,7 +721,7 @@ public DynamicObject getcwd(DynamicObject resultPath, int maxSize) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "errno", isModuleFunction = true)
@CoreMethod(names = "errno", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class ErrnoNode extends CoreMethodArrayArgumentsNode {

public ErrnoNode(RubyContext context, SourceSection sourceSection) {
@@ -735,7 +735,7 @@ public int errno() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "errno=", isModuleFunction = true, required = 1)
@CoreMethod(names = "errno=", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class ErrnoAssignNode extends CoreMethodArrayArgumentsNode {

public ErrnoAssignNode(RubyContext context, SourceSection sourceSection) {
@@ -771,7 +771,7 @@ public int fcntl(int fd, int fcntl, int arg) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getpgid", isModuleFunction = true, required = 1)
@CoreMethod(names = "getpgid", isModuleFunction = true, required = 1, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetpgidNode extends CoreMethodArrayArgumentsNode {

public GetpgidNode(RubyContext context, SourceSection sourceSection) {
@@ -785,7 +785,7 @@ public int getpgid(int pid) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getpgrp", isModuleFunction = true)
@CoreMethod(names = "getpgrp", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetpgrpNode extends CoreMethodArrayArgumentsNode {

public GetpgrpNode(RubyContext context, SourceSection sourceSection) {
@@ -813,7 +813,7 @@ public int isATTY(int fd) {

}

@CoreMethod(unsafeNeedsAudit = true, names = "getppid", isModuleFunction = true)
@CoreMethod(names = "getppid", isModuleFunction = true, unsafe = UnsafeGroup.PROCESSES)
public abstract static class GetppidNode extends CoreMethodArrayArgumentsNode {

public GetppidNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -28,6 +28,4 @@

UnsafeGroup[] unsafe() default {};

boolean unsafeNeedsAudit() default false;

}
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@
@CoreClass(name = "Rubinius::Type")
public abstract class RubiniusTypeNodes {

@CoreMethod(unsafeNeedsAudit = true, names = "each_ancestor", onSingleton = true, required = 1, needsBlock = true)
@CoreMethod(names = "each_ancestor", onSingleton = true, required = 1, needsBlock = true)
public abstract static class EachAncestorNode extends YieldingCoreMethodNode {

public EachAncestorNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -22,12 +22,13 @@
import org.jruby.truffle.language.objects.ReadObjectFieldNodeGen;
import org.jruby.truffle.language.objects.WriteObjectFieldNode;
import org.jruby.truffle.language.objects.WriteObjectFieldNodeGen;
import org.jruby.truffle.platform.UnsafeGroup;

public abstract class StatPrimitiveNodes {

public static final HiddenKey STAT_IDENTIFIER = new HiddenKey("stat");

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_atime")
@RubiniusPrimitive(name = "stat_atime", unsafe = UnsafeGroup.IO)
public static abstract class StatAtimePrimitiveNode extends StatReadPrimitiveNode {

public StatAtimePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -42,7 +43,7 @@ public Object atime(VirtualFrame frame, DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_ctime")
@RubiniusPrimitive(name = "stat_ctime", unsafe = UnsafeGroup.IO)
public static abstract class StatCtimePrimitiveNode extends StatReadPrimitiveNode {

public StatCtimePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -57,7 +58,7 @@ public Object ctime(VirtualFrame frame, DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_mtime")
@RubiniusPrimitive(name = "stat_mtime", unsafe = UnsafeGroup.IO)
public static abstract class StatMtimePrimitiveNode extends StatReadPrimitiveNode {

public StatMtimePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -72,7 +73,7 @@ public Object mtime(VirtualFrame frame, DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_nlink")
@RubiniusPrimitive(name = "stat_nlink", unsafe = UnsafeGroup.IO)
public static abstract class NlinkPrimitiveNode extends StatReadPrimitiveNode {

public NlinkPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -86,7 +87,7 @@ public int nlink(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_rdev")
@RubiniusPrimitive(name = "stat_rdev", unsafe = UnsafeGroup.IO)
public static abstract class RdevPrimitiveNode extends StatReadPrimitiveNode {

public RdevPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -100,7 +101,7 @@ public long rdev(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_blksize")
@RubiniusPrimitive(name = "stat_blksize", unsafe = UnsafeGroup.IO)
public static abstract class StatBlksizePrimitiveNode extends StatReadPrimitiveNode {

public StatBlksizePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -114,7 +115,7 @@ public long blksize(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_blocks")
@RubiniusPrimitive(name = "stat_blocks", unsafe = UnsafeGroup.IO)
public static abstract class StatBlocksPrimitiveNode extends StatReadPrimitiveNode {

public StatBlocksPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -128,7 +129,7 @@ public long blocks(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_dev")
@RubiniusPrimitive(name = "stat_dev", unsafe = UnsafeGroup.IO)
public static abstract class StatDevPrimitiveNode extends StatReadPrimitiveNode {

public StatDevPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -142,7 +143,7 @@ public long dev(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_ino")
@RubiniusPrimitive(name = "stat_ino", unsafe = UnsafeGroup.IO)
public static abstract class StatInoPrimitiveNode extends StatReadPrimitiveNode {

public StatInoPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -156,7 +157,7 @@ public long ino(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_stat")
@RubiniusPrimitive(name = "stat_stat", unsafe = UnsafeGroup.IO)
public static abstract class StatStatPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private WriteObjectFieldNode writeStatNode;
@@ -186,7 +187,7 @@ public Object stat(DynamicObject rubyStat, Object path) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_fstat")
@RubiniusPrimitive(name = "stat_fstat", unsafe = UnsafeGroup.IO)
public static abstract class StatFStatPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private WriteObjectFieldNode writeStatNode;
@@ -211,7 +212,7 @@ public int fstat(DynamicObject rubyStat, int fd) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_lstat")
@RubiniusPrimitive(name = "stat_lstat", unsafe = UnsafeGroup.IO)
public static abstract class StatLStatPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private WriteObjectFieldNode writeStatNode;
@@ -256,7 +257,7 @@ public FileStat getStat(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_size")
@RubiniusPrimitive(name = "stat_size", unsafe = UnsafeGroup.IO)
public static abstract class StatSizePrimitiveNode extends StatReadPrimitiveNode {

public StatSizePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -270,7 +271,7 @@ public long size(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_mode")
@RubiniusPrimitive(name = "stat_mode", unsafe = UnsafeGroup.IO)
public static abstract class StatModePrimitiveNode extends StatReadPrimitiveNode {

public StatModePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -284,7 +285,7 @@ public int mode(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_gid")
@RubiniusPrimitive(name = "stat_gid", unsafe = UnsafeGroup.IO)
public static abstract class StatGIDPrimitiveNode extends StatReadPrimitiveNode {

public StatGIDPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -298,7 +299,7 @@ public int gid(DynamicObject rubyStat) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "stat_uid")
@RubiniusPrimitive(name = "stat_uid", unsafe = UnsafeGroup.IO)
public static abstract class StatUIDPrimitiveNode extends StatReadPrimitiveNode {

public StatUIDPrimitiveNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -78,7 +78,7 @@
*/
public abstract class TimePrimitiveNodes {

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_s_now")
@RubiniusPrimitive(name = "time_s_now")
public static abstract class TimeSNowPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -104,7 +104,7 @@ private DateTime now(DynamicObject timeZone) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_s_specific", needsSelf = false, lowerFixnumParameters = { 1 })
@RubiniusPrimitive(name = "time_s_specific", needsSelf = false, lowerFixnumParameters = { 1 })
public static abstract class TimeSSpecificPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private ReadTimeZoneNode readTimeZoneNode;
@@ -163,7 +163,7 @@ private DateTime localtime(long milliseconds, DynamicObject zoneName) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_seconds")
@RubiniusPrimitive(name = "time_seconds")
public static abstract class TimeSecondsPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeSecondsPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -177,7 +177,7 @@ public long timeSeconds(DynamicObject time) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_useconds")
@RubiniusPrimitive(name = "time_useconds")
public static abstract class TimeUSecondsPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeUSecondsPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -192,7 +192,7 @@ public long timeUSeconds(DynamicObject time) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_decompose")
@RubiniusPrimitive(name = "time_decompose")
public static abstract class TimeDecomposePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child private ReadTimeZoneNode readTimeZoneNode;
@@ -241,7 +241,7 @@ public DynamicObject timeDecompose(DynamicObject time) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_strftime")
@RubiniusPrimitive(name = "time_strftime")
public static abstract class TimeStrftimePrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeStrftimePrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -258,7 +258,7 @@ public DynamicObject timeStrftime(DynamicObject time, DynamicObject format) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_s_from_array", needsSelf = true, lowerFixnumParameters = { 0 /*sec*/, 1 /* min */, 2 /* hour */, 3 /* mday */, 4 /* month */, 5 /* year */, 6 /*nsec*/, 7 /*isdst*/ })
@RubiniusPrimitive(name = "time_s_from_array", needsSelf = true, lowerFixnumParameters = { 0 /*sec*/, 1 /* min */, 2 /* hour */, 3 /* mday */, 4 /* month */, 5 /* year */, 6 /*nsec*/, 7 /*isdst*/ })
public static abstract class TimeSFromArrayPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

@Child ReadTimeZoneNode readTimeZoneNode;
@@ -362,7 +362,7 @@ private static int cast(Object value) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_nseconds")
@RubiniusPrimitive(name = "time_nseconds")
public static abstract class TimeNSecondsPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeNSecondsPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -377,7 +377,7 @@ public long timeNSeconds(DynamicObject time) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_set_nseconds", lowerFixnumParameters = 0)
@RubiniusPrimitive(name = "time_set_nseconds", lowerFixnumParameters = 0)
public static abstract class TimeSetNSecondsPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeSetNSecondsPrimitiveNode(RubyContext context, SourceSection sourceSection) {
@@ -394,7 +394,7 @@ public long timeSetNSeconds(DynamicObject time, int nanoseconds) {

}

@RubiniusPrimitive(unsafeNeedsAudit = true, name = "time_utc_offset")
@RubiniusPrimitive(name = "time_utc_offset")
public static abstract class TimeUTCOffsetPrimitiveNode extends RubiniusPrimitiveArrayArgumentsNode {

public TimeUTCOffsetPrimitiveNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -292,7 +292,7 @@ public DynamicObject graalVersion() {

}

@CoreMethod(unsafeNeedsAudit = true, names = "simple_shell", onSingleton = true, unsafe = UnsafeGroup.IO)
@CoreMethod(names = "simple_shell", onSingleton = true, unsafe = UnsafeGroup.IO)
public abstract static class SimpleShellNode extends CoreMethodArrayArgumentsNode {

public SimpleShellNode(RubyContext context, SourceSection sourceSection) {
@@ -984,6 +984,34 @@ public boolean ioSafe() {

}

@CoreMethod(names = "memory_safe?", onSingleton = true)
public abstract static class IsMemorySafeNode extends CoreMethodNode {

public IsMemorySafeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@Specialization
public boolean memorySafe() {
return getContext().getOptions().PLATFORM_SAFE_MEMORY;
}

}

@CoreMethod(names = "signals_safe?", onSingleton = true)
public abstract static class AreSignalsSafeNode extends CoreMethodNode {

public AreSignalsSafeNode(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@Specialization
public boolean signalsSafe() {
return getContext().getOptions().PLATFORM_SAFE_SIGNALS;
}

}

@CoreMethod(names = "require_core", isModuleFunction = true, required = 1)
public abstract static class RequireCoreNode extends CoreMethodArrayArgumentsNode {

Original file line number Diff line number Diff line change
@@ -55,6 +55,7 @@
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_EXIT;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_IO;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_LOAD;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_MEMORY;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_PROCESSES;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_PUTS;
import static org.jruby.util.cli.Options.TRUFFLE_PLATFORM_SAFE_SIGNALS;
@@ -74,9 +75,9 @@ public class Options {

// Platform

public final boolean PLATFORM_SAFE = TRUFFLE_PLATFORM_SAFE.load();
public final boolean PLATFORM_SAFE_LOAD = TRUFFLE_PLATFORM_SAFE_LOAD.load();
public final boolean PLATFORM_SAFE_IO = TRUFFLE_PLATFORM_SAFE_IO.load();
public final boolean PLATFORM_SAFE_MEMORY = TRUFFLE_PLATFORM_SAFE_MEMORY.load();
public final boolean PLATFORM_SAFE_THREADS = TRUFFLE_PLATFORM_SAFE_THREADS.load();
public final boolean PLATFORM_SAFE_PROCESSES = TRUFFLE_PLATFORM_SAFE_PROCESSES.load();
public final boolean PLATFORM_SAFE_SIGNALS = TRUFFLE_PLATFORM_SAFE_SIGNALS.load();
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ public CheckStdoutVariableTypeNode(RubyContext context, SourceSection sourceSect
public Object execute(VirtualFrame frame) {
final Object childValue = child.execute(frame);

if (childValue == nil() || !getRespondToWriteNode().doesRespondTo(frame, "write", childValue)) {
if (getContext().getOptions().PLATFORM_SAFE_IO && (childValue == nil() || !getRespondToWriteNode().doesRespondTo(frame, "write", childValue))) {
unsuitableTypeProfile.enter();
throw new RaiseException(coreLibrary().typeErrorMustHaveWriteMethod(childValue, this));
}
Original file line number Diff line number Diff line change
@@ -12,6 +12,7 @@
public enum UnsafeGroup {
LOAD,
IO,
MEMORY,
THREADS,
PROCESSES,
SIGNALS,
6 changes: 4 additions & 2 deletions truffle/src/main/ruby/core/main.rb
Original file line number Diff line number Diff line change
@@ -6,6 +6,8 @@
# GNU General Public License version 2
# GNU Lesser General Public License version 2.1

Signal.trap("INT") do
raise Interrupt
if Truffle::Primitive.signals_safe?
Signal.trap("INT") do
raise Interrupt
end
end
6 changes: 5 additions & 1 deletion truffle/src/main/ruby/core/rubinius/platform/pointer.rb
Original file line number Diff line number Diff line change
@@ -294,7 +294,11 @@ def autorelease?
raise PrimitiveFailure, "FFI::Pointer#pointer_autorelease_p primitive failed"
end

NULL = Pointer.new(0x0)
if Truffle::Primitive.memory_safe?
NULL = Pointer.new(0x0)
else
NULL = nil
end
end

class MemoryPointer < Pointer
30 changes: 18 additions & 12 deletions truffle/src/main/ruby/core/shims.rb
Original file line number Diff line number Diff line change
@@ -20,9 +20,15 @@ def internal_encoding

end

STDIN = File.new(0)
STDOUT = File.new(1)
STDERR = File.new(2)
if Truffle::Primitive.io_safe?
STDIN = File.new(0)
STDOUT = File.new(1)
STDERR = File.new(2)
else
STDIN = nil
STDOUT = nil
STDERR = nil
end

$stdin = STDIN
$stdout = STDOUT
@@ -158,15 +164,15 @@ def printf(fmt, *args)

# Windows probably doesn't have a HOME env var, but Rubinius requires it in places, so we need
# to construct the value and place it in the hash.
unless ENV['HOME']
if ENV['HOMEDRIVE']
ENV['HOME'] = if ENV['HOMEPATH']
ENV['HOMEDRIVE'] + ENV['HOMEPATH']
else
ENV['USERPROFILE']
end
end
end
#unless ENV['HOME']
# if ENV['HOMEDRIVE']
# ENV['HOME'] = if ENV['HOMEPATH']
# ENV['HOMEDRIVE'] + ENV['HOMEPATH']
# else
# ENV['USERPROFILE']
# end
# end
#end

class Exception