nashorn/samples/dynalink/ArrayStreamLinkerExporter.java
author cjplummer
Sat, 06 May 2017 00:05:32 +0000
changeset 46439 6de560f6c1ad
parent 41842 50202a344d28
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     1
/*
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     3
 *
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     4
 * Redistribution and use in source and binary forms, with or without
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     5
 * modification, are permitted provided that the following conditions
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     6
 * are met:
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     7
 *
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     8
 *   - Redistributions of source code must retain the above copyright
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
     9
 *     notice, this list of conditions and the following disclaimer.
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    10
 *
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    11
 *   - Redistributions in binary form must reproduce the above copyright
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    12
 *     notice, this list of conditions and the following disclaimer in the
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    13
 *     documentation and/or other materials provided with the distribution.
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    14
 *
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    15
 *   - Neither the name of Oracle nor the names of its
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    16
 *     contributors may be used to endorse or promote products derived
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    17
 *     from this software without specific prior written permission.
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    18
 *
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    20
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    21
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    22
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    23
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    24
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    25
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    26
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    27
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    28
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    29
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    30
 */
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    31
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    32
import java.lang.invoke.MethodHandle;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    33
import java.lang.invoke.MethodType;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    34
import java.util.ArrayList;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    35
import java.util.List;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    36
import java.util.stream.DoubleStream;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    37
import java.util.stream.IntStream;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    38
import java.util.stream.LongStream;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    39
import java.util.stream.Stream;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    40
import jdk.dynalink.CallSiteDescriptor;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    41
import jdk.dynalink.NamedOperation;
41842
50202a344d28 8168005: Introduce namespaces for GET, SET Dynalink operations
attila
parents: 41422
diff changeset
    42
import jdk.dynalink.NamespaceOperation;
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    43
import jdk.dynalink.Operation;
41842
50202a344d28 8168005: Introduce namespaces for GET, SET Dynalink operations
attila
parents: 41422
diff changeset
    44
import jdk.dynalink.StandardNamespace;
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    45
import jdk.dynalink.StandardOperation;
41422
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
    46
import jdk.dynalink.linker.GuardedInvocation;
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    47
import jdk.dynalink.linker.GuardingDynamicLinker;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    48
import jdk.dynalink.linker.GuardingDynamicLinkerExporter;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    49
import jdk.dynalink.linker.LinkRequest;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    50
import jdk.dynalink.linker.LinkerServices;
41422
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
    51
import jdk.dynalink.linker.TypeBasedGuardingDynamicLinker;
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    52
import jdk.dynalink.linker.support.Guards;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    53
import jdk.dynalink.linker.support.Lookup;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    54
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    55
/**
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    56
 * This is a dynalink pluggable linker (see http://openjdk.java.net/jeps/276).
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    57
 * This linker adds "stream" property to Java arrays. The appropriate Stream
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    58
 * type object is returned for "stream" property on Java arrays. Note that
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    59
 * the dynalink beans linker just adds "length" property and Java array objects
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    60
 * don't have any other property. "stream" property does not conflict with anything
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    61
 * else!
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    62
 */
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    63
public final class ArrayStreamLinkerExporter extends GuardingDynamicLinkerExporter {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    64
    static {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    65
        System.out.println("pluggable dynalink array stream linker loaded");
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    66
    }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    67
41422
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
    68
    public static Object arrayToStream(final Object array) {
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    69
        if (array instanceof int[]) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    70
            return IntStream.of((int[])array);
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    71
        } else if (array instanceof long[]) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    72
            return LongStream.of((long[])array);
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    73
        } else if (array instanceof double[]) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    74
            return DoubleStream.of((double[])array);
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    75
        } else if (array instanceof Object[]) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    76
            return Stream.of((Object[])array);
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    77
        } else {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    78
            throw new IllegalArgumentException();
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    79
        }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    80
    }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    81
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    82
    private static final MethodType GUARD_TYPE = MethodType.methodType(Boolean.TYPE, Object.class);
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    83
    private static final MethodHandle ARRAY_TO_STREAM = Lookup.PUBLIC.findStatic(
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    84
            ArrayStreamLinkerExporter.class, "arrayToStream",
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    85
            MethodType.methodType(Object.class, Object.class));
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    86
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    87
    @Override
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    88
    public List<GuardingDynamicLinker> get() {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    89
        final ArrayList<GuardingDynamicLinker> linkers = new ArrayList<>();
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    90
        linkers.add(new TypeBasedGuardingDynamicLinker() {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    91
            @Override
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    92
            public boolean canLinkType(final Class<?> type) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    93
                return type == Object[].class || type == int[].class ||
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    94
                       type == long[].class || type == double[].class;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    95
            }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    96
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
    97
            @Override
41422
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
    98
            public GuardedInvocation getGuardedInvocation(final LinkRequest request,
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
    99
                final LinkerServices linkerServices) throws Exception {
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   100
                final Object self = request.getReceiver();
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   101
                if (self == null || !canLinkType(self.getClass())) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   102
                    return null;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   103
                }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   104
41422
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
   105
                final CallSiteDescriptor desc = request.getCallSiteDescriptor();
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
   106
                final Operation op = desc.getOperation();
97eda72f53b6 8167117: insert missing final keywords
attila
parents: 34549
diff changeset
   107
                final Object name = NamedOperation.getName(op);
41842
50202a344d28 8168005: Introduce namespaces for GET, SET Dynalink operations
attila
parents: 41422
diff changeset
   108
                final boolean getProp = NamespaceOperation.contains(
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   109
                        NamedOperation.getBaseOperation(op),
41842
50202a344d28 8168005: Introduce namespaces for GET, SET Dynalink operations
attila
parents: 41422
diff changeset
   110
                        StandardOperation.GET, StandardNamespace.PROPERTY);
34548
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   111
                if (getProp && "stream".equals(name)) {
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   112
                    return new GuardedInvocation(ARRAY_TO_STREAM,
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   113
                        Guards.isOfClass(self.getClass(), GUARD_TYPE));
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   114
                }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   115
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   116
                return null;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   117
            }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   118
        });
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   119
        return linkers;
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   120
    }
44779bfb4c13 8144841: Add a sample for pluggable dynalink linker for stream property on arrays and a REAMDE for linker samples
sundar
parents:
diff changeset
   121
}