RFR 8246095: Tweaks to memory access API

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jun 3 14:25:03 UTC 2020


Please review this delta patch; I realized that the previously submitted 
patch had few issues:

* copyright header on TestAdaptVarHandle benchmark was wrong
* stream test for segment spliterator was not updated to include changes 
to copyFrom API
* I've also incorporated a small javadoc tweak to 
MemoryHandles::asUnsigned that was suggested in the CSR process

Here's the patch (if a webrev if preferred, I can also generate that):

diff -r 6b40a32ede25 
src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemoryHandles.java
--- 
a/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemoryHandles.java 
Wed Jun 03 13:57:18 2020 +0100
+++ 
b/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign/MemoryHandles.java 
Wed Jun 03 15:22:03 2020 +0100
@@ -357,9 +357,14 @@
       * primitive data types as if they were a wider signed primitive 
type. For
       * example, it is often convenient to model an <i>unsigned 
short</i> as a
       * Java {@code int} to avoid dealing with negative values, which 
would be
-     * the case if modeled as a Java {@code short}. The returned var handle
-     * converts to and from wider primitive types, to a more narrow 
possibly
-     * unsigned primitive type.
+     * the case if modeled as a Java {@code short}. This is illustrated 
in the following example:
+     * <blockquote><pre>{@code
+    MemorySegment segment = MemorySegment.allocateNative(2);
+    VarHandle SHORT_VH = MemoryLayouts.JAVA_SHORT.varHandle(short.class);
+    VarHandle INT_VH = MemoryHandles.asUnsigned(SHORT_VH, int.class);
+    SHORT_VH.set(segment.baseAddress(), (short)-1);
+    INT_VH.get(segment.baseAddress()); // returns 65535
+     * }</pre></blockquote>
       * <p>
       * When calling e.g. {@link VarHandle#set(Object...)} on the 
resulting var
       * handle, the incoming value (of type {@code adaptedType}) is 
converted by a
diff -r 6b40a32ede25 
test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/SegmentTestDataProvider.java
--- 
a/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/SegmentTestDataProvider.java 
Wed Jun 03 13:57:18 2020 +0100
+++ 
b/test/jdk/java/util/stream/test/org/openjdk/tests/java/util/stream/SegmentTestDataProvider.java 
Wed Jun 03 15:22:03 2020 +0100
@@ -23,7 +23,6 @@

  package org.openjdk.tests.java.util.stream;

-import jdk.incubator.foreign.MemoryAddress;
  import jdk.incubator.foreign.MemoryLayout;
  import jdk.incubator.foreign.MemoryLayouts;
  import jdk.incubator.foreign.MemorySegment;
@@ -116,9 +115,9 @@

      static Consumer<MemorySegment> 
segmentCopier(Consumer<MemorySegment> input) {
          return segment -> {
-            MemorySegment copy = MemorySegment.ofArray(new 
byte[(int)segment.byteSize()]);
-            MemoryAddress.copy(segment.baseAddress(), 
copy.baseAddress(), segment.byteSize());
-            input.accept(copy);
+            MemorySegment dest = MemorySegment.ofArray(new 
byte[(int)segment.byteSize()]);
+            dest.copyFrom(segment);
+            input.accept(dest);
          };
      }

diff -r 6b40a32ede25 
test/micro/org/openjdk/bench/jdk/incubator/foreign/TestAdaptVarHandles.java
--- 
a/test/micro/org/openjdk/bench/jdk/incubator/foreign/TestAdaptVarHandles.java 
Wed Jun 03 13:57:18 2020 +0100
+++ 
b/test/micro/org/openjdk/bench/jdk/incubator/foreign/TestAdaptVarHandles.java 
Wed Jun 03 15:22:03 2020 +0100
@@ -1,25 +1,27 @@
  /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *  Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ *  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
+ *  This code is free software; you can redistribute it and/or modify it
+ *  under the terms of the GNU General Public License version 2 only, as
+ *  published by the Free Software Foundation.
   *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
+ *  This code is distributed in the hope that it will be useful, but 
WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  version 2 for more details (a copy is included in the LICENSE file that
+ *  accompanied this code).
   *
- * You should have received a copy of the GNU General Public License 
version

Maurizio

On 28/05/2020 22:25, Maurizio Cimadamore wrote:
> Hi,
> this followup change includes a number of tweaks that have been added 
> to the memory access API while we were in the process of integrating 
> it. Most of them have been contributed by Chris (thanks!), and are all 
> listed in great details in the CSR below:
>
> https://bugs.openjdk.java.net/browse/JDK-8246096
>
> Implementation-wise it should be all relatively straightforward - 
> apart for the bit of surgery on lambda forms which was required to add 
> a new kind of lambda forms to 'collect' return values. For now this 
> method handle adaptation is package private, and can only be used by 
> MemoryHandles::filterValues - but, if people find it useful, we might 
> consider adding it to the MethodHandle standard combinator toolbox.
>
> Cheers
> Maurizio
>
>
> Webrev:
>
> http://cr.openjdk.java.net/~mcimadamore/8246095_v1/webrev/
>
> Javadoc:
>
> http://cr.openjdk.java.net/~mcimadamore/8246095_v1/javadoc/jdk/incubator/foreign/package-summary.html 
>
>
> Specdiff:
>
> http://cr.openjdk.java.net/~mcimadamore/8246095_v1/specdiff/overview-summary.html 
>
>


More information about the core-libs-dev mailing list