MemoryUtil.java

  1. package org.jruby.ext.ffi;

  2. import org.jruby.Ruby;
  3. import org.jruby.RubyArray;
  4. import org.jruby.RubyFloat;
  5. import org.jruby.RubyString;
  6. import org.jruby.runtime.builtin.IRubyObject;

  7. public final class MemoryUtil {
  8.     private MemoryUtil() {}

  9.     public static final IRubyObject getArrayOfSigned8(Ruby runtime, MemoryIO io, long offset, int count) {

  10.         byte[] array = new byte[count];
  11.         io.get(offset, array, 0, array.length);
  12.        
  13.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  14.         for (int i = 0; i < array.length; ++i) {
  15.             arr.add(Util.newSigned8(runtime, array[i]));
  16.         }

  17.         return arr;
  18.     }

  19.     public static final void putArrayOfSigned8(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  20.         byte[] array = new byte[ary.size()];
  21.         for (int i = 0; i < array.length; ++i) {
  22.             array[i] = Util.int8Value(ary.entry(i));
  23.         }

  24.         io.put(offset, array, 0, array.length);
  25.     }

  26.     public static final IRubyObject getArrayOfUnsigned8(Ruby runtime, MemoryIO io, long offset, int count) {

  27.         byte[] array = new byte[count];
  28.         io.get(offset, array, 0, array.length);

  29.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  30.         for (int i = 0; i < array.length; ++i) {
  31.             arr.add(Util.newUnsigned8(runtime, array[i]));
  32.         }

  33.         return arr;
  34.     }

  35.     public static final void putArrayOfUnsigned8(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  36.         byte[] array = new byte[ary.size()];
  37.         for (int i = 0; i < array.length; ++i) {
  38.             array[i] = (byte) Util.uint8Value(ary.entry(i));
  39.         }

  40.         io.put(offset, array, 0, array.length);
  41.     }

  42.     public static final IRubyObject getArrayOfSigned16(Ruby runtime, MemoryIO io, long offset, int count) {

  43.         short[] array = new short[count];
  44.         io.get(offset, array, 0, array.length);

  45.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  46.         for (int i = 0; i < array.length; ++i) {
  47.             arr.add(Util.newSigned16(runtime, array[i]));
  48.         }

  49.         return arr;
  50.     }
  51.    
  52.     public static final void putArrayOfSigned16(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  53.         short[] array = new short[ary.size()];
  54.         for (int i = 0; i < array.length; ++i) {
  55.             array[i] = Util.int16Value(ary.entry(i));
  56.         }

  57.         io.put(offset, array, 0, array.length);
  58.     }

  59.     public static final IRubyObject getArrayOfUnsigned16(Ruby runtime, MemoryIO io, long offset, int count) {

  60.         short[] array = new short[count];
  61.         io.get(offset, array, 0, array.length);

  62.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  63.         for (int i = 0; i < array.length; ++i) {
  64.             arr.add(Util.newUnsigned16(runtime, array[i]));
  65.         }

  66.         return arr;
  67.     }

  68.     public static final void putArrayOfUnsigned16(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  69.         short[] array = new short[ary.size()];
  70.         for (int i = 0; i < array.length; ++i) {
  71.             array[i] = (short) Util.uint16Value(ary.entry(i));
  72.         }

  73.         io.put(offset, array, 0, array.length);
  74.     }

  75.     public static final IRubyObject getArrayOfSigned32(Ruby runtime, MemoryIO io, long offset, int count) {

  76.         int[] array = new int[count];
  77.         io.get(offset, array, 0, array.length);

  78.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  79.         for (int i = 0; i < array.length; ++i) {
  80.             arr.add(Util.newSigned32(runtime, array[i]));
  81.         }

  82.         return arr;
  83.     }

  84.     public static final void putArrayOfSigned32(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  85.         int[] array = new int[ary.size()];
  86.         for (int i = 0; i < array.length; ++i) {
  87.             array[i] = Util.int32Value(ary.entry(i));
  88.         }

  89.         io.put(offset, array, 0, array.length);
  90.     }
  91.    
  92.     public static final IRubyObject getArrayOfUnsigned32(Ruby runtime, MemoryIO io, long offset, int count) {

  93.         int[] array = new int[count];
  94.         io.get(offset, array, 0, array.length);

  95.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  96.         for (int i = 0; i < array.length; ++i) {
  97.             arr.add(Util.newUnsigned32(runtime, array[i]));
  98.         }

  99.         return arr;
  100.     }

  101.     public static final void putArrayOfUnsigned32(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  102.         int[] array = new int[ary.size()];
  103.         for (int i = 0; i < array.length; ++i) {
  104.             array[i] = (int) Util.uint32Value(ary.entry(i));
  105.         }

  106.         io.put(offset, array, 0, array.length);
  107.     }

  108.     public static final IRubyObject getArrayOfSigned64(Ruby runtime, MemoryIO io, long offset, int count) {

  109.         long[] array = new long[count];
  110.         io.get(offset, array, 0, array.length);

  111.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  112.         for (int i = 0; i < array.length; ++i) {
  113.             arr.add(Util.newSigned64(runtime, array[i]));
  114.         }

  115.         return arr;
  116.     }

  117.     public static final void putArrayOfSigned64(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  118.         long[] array = new long[ary.size()];
  119.         for (int i = 0; i < array.length; ++i) {
  120.             array[i] = Util.int64Value(ary.entry(i));
  121.         }

  122.         io.put(offset, array, 0, array.length);
  123.     }

  124.     public static final IRubyObject getArrayOfUnsigned64(Ruby runtime, MemoryIO io, long offset, int count) {

  125.         long[] array = new long[count];
  126.         io.get(offset, array, 0, array.length);

  127.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  128.         for (int i = 0; i < array.length; ++i) {
  129.             arr.add(Util.newUnsigned64(runtime, array[i]));
  130.         }

  131.         return arr;
  132.     }

  133.     public static final void putArrayOfUnsigned64(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  134.         long[] array = new long[ary.size()];
  135.         for (int i = 0; i < array.length; ++i) {
  136.             array[i] = Util.uint64Value(ary.entry(i));
  137.         }

  138.         io.put(offset, array, 0, array.length);
  139.     }

  140.     public static final IRubyObject getArrayOfFloat32(Ruby runtime, MemoryIO io, long offset, int count) {

  141.         float[] array = new float[count];
  142.         io.get(offset, array, 0, array.length);

  143.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  144.         for (int i = 0; i < array.length; ++i) {
  145.             arr.add(RubyFloat.newFloat(runtime, array[i]));
  146.         }

  147.         return arr;
  148.     }

  149.     public static final void putArrayOfFloat32(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  150.         float[] array = new float[ary.size()];
  151.         for (int i = 0; i < array.length; ++i) {
  152.             array[i] = Util.floatValue(ary.entry(i));
  153.         }

  154.         io.put(offset, array, 0, array.length);
  155.     }

  156.     public static final IRubyObject getArrayOfFloat64(Ruby runtime, MemoryIO io, long offset, int count) {

  157.         double[] array = new double[count];
  158.         io.get(offset, array, 0, array.length);

  159.         RubyArray arr = RubyArray.newArray(runtime, array.length);
  160.         for (int i = 0; i < array.length; ++i) {
  161.             arr.add(RubyFloat.newFloat(runtime, array[i]));
  162.         }

  163.         return arr;
  164.     }

  165.     public static final void putArrayOfFloat64(Ruby runtime, MemoryIO io, long offset, RubyArray ary) {

  166.         double[] array = new double[ary.size()];
  167.         for (int i = 0; i < array.length; ++i) {
  168.             array[i] = Util.doubleValue(ary.entry(i));
  169.         }

  170.         io.put(offset, array, 0, array.length);
  171.     }

  172.     /**
  173.      * Creates a ruby string from a byte array and sets the taint flag on it
  174.      *
  175.      * @param runtime The ruby runtime
  176.      * @param bytes The array to make into a ruby string.
  177.      * @return A ruby string.
  178.      */
  179.     public static final RubyString newTaintedString(Ruby runtime, byte[] bytes) {
  180.         RubyString s = RubyString.newStringNoCopy(runtime, bytes);
  181.         s.setTaint(true);
  182.         return s;
  183.     }

  184.     /**
  185.      * Reads a byte (binary) string from a memory object.
  186.      *
  187.      * @param runtime The ruby runtime
  188.      * @param io The memory object to read the string from
  189.      * @param offset The offset within the memory object to start reading
  190.      * @param length The number of bytes to read
  191.      * @return A ruby string
  192.      */
  193.     public static final RubyString getTaintedByteString(Ruby runtime, MemoryIO io, long offset, int length) {
  194.         byte[] bytes = new byte[length];
  195.         io.get(offset, bytes, 0, bytes.length);
  196.         return newTaintedString(runtime, bytes);
  197.     }

  198.     /**
  199.      * Gets a NUL terminated string from a memory object
  200.      *
  201.      * @param runtime The ruby runtime
  202.      * @param io The memory object to read the string from
  203.      * @param offset The offset within the memory object to start reading
  204.      * @return A ruby string
  205.      */
  206.     public static final IRubyObject getTaintedString(Ruby runtime, MemoryIO io, long offset) {
  207.         return newTaintedString(runtime, io.getZeroTerminatedByteArray(offset));
  208.     }

  209.     /**
  210.      * Reads a NUL terminated string from a memory object
  211.      *
  212.      * @param runtime The ruby runtime
  213.      * @param io The memory object to read the string from
  214.      * @param offset The offset within the memory object to start reading
  215.      * @param maxlen The maximum number of bytes to read
  216.      * @return A ruby string
  217.      */
  218.     public static final IRubyObject getTaintedString(Ruby runtime, MemoryIO io, long offset, int length) {
  219.         return newTaintedString(runtime, io.getZeroTerminatedByteArray(offset, length));
  220.     }
  221. }