author | erikj |
Tue, 12 Sep 2017 19:03:39 +0200 | |
changeset 47216 | 71c04702a3d5 |
parent 34447 | nashorn/src/jdk.dynalink/share/classes/jdk/dynalink/linker/support/DefaultInternalObjectFilter.java@ec4c069f9436 |
child 50695 | 36ca515343e0 |
permissions | -rw-r--r-- |
28881
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
1 |
/* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
2 |
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
4 |
* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. Oracle designates this |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
10 |
* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
15 |
* accompanied this code). |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
16 |
* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
20 |
* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
22 |
* or visit www.oracle.com if you need additional information or have any |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
23 |
* questions. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
24 |
*/ |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
25 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
26 |
/* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
27 |
* This file is available under and governed by the GNU General Public |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
28 |
* License version 2 only, as published by the Free Software Foundation. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
29 |
* However, the following notice accompanied the original version of this |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
30 |
* file, and Oracle licenses the original version of this file under the BSD |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
31 |
* license: |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
32 |
*/ |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
33 |
/* |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
34 |
Copyright 2009-2015 Attila Szegedi |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
35 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
36 |
Licensed under both the Apache License, Version 2.0 (the "Apache License") |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
37 |
and the BSD License (the "BSD License"), with licensee being free to |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
38 |
choose either of the two at their discretion. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
39 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
40 |
You may not use this file except in compliance with either the Apache |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
41 |
License or the BSD License. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
42 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
43 |
If you choose to use this file in compliance with the Apache License, the |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
44 |
following notice applies to you: |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
45 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
46 |
You may obtain a copy of the Apache License at |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
47 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
48 |
http://www.apache.org/licenses/LICENSE-2.0 |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
49 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
50 |
Unless required by applicable law or agreed to in writing, software |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
51 |
distributed under the License is distributed on an "AS IS" BASIS, |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
52 |
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
53 |
implied. See the License for the specific language governing |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
54 |
permissions and limitations under the License. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
55 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
56 |
If you choose to use this file in compliance with the BSD License, the |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
57 |
following notice applies to you: |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
58 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
59 |
Redistribution and use in source and binary forms, with or without |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
60 |
modification, are permitted provided that the following conditions are |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
61 |
met: |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
62 |
* Redistributions of source code must retain the above copyright |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
63 |
notice, this list of conditions and the following disclaimer. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
64 |
* Redistributions in binary form must reproduce the above copyright |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
65 |
notice, this list of conditions and the following disclaimer in the |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
66 |
documentation and/or other materials provided with the distribution. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
67 |
* Neither the name of the copyright holder nor the names of |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
68 |
contributors may be used to endorse or promote products derived from |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
69 |
this software without specific prior written permission. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
70 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
71 |
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
72 |
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
73 |
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
74 |
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
75 |
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
76 |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
77 |
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
78 |
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
79 |
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
80 |
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
81 |
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
82 |
*/ |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
83 |
|
34447
ec4c069f9436
8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents:
33339
diff
changeset
|
84 |
package jdk.dynalink.linker.support; |
28881
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
85 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
86 |
import java.lang.invoke.MethodHandle; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
87 |
import java.lang.invoke.MethodHandles; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
88 |
import java.lang.invoke.MethodType; |
34447
ec4c069f9436
8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents:
33339
diff
changeset
|
89 |
import jdk.dynalink.DynamicLinkerFactory; |
ec4c069f9436
8141338: Move jdk.internal.dynalink package to jdk.dynalink
attila
parents:
33339
diff
changeset
|
90 |
import jdk.dynalink.linker.MethodHandleTransformer; |
28881
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
91 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
92 |
/** |
33333 | 93 |
* Default implementation for a |
94 |
* {@link DynamicLinkerFactory#setInternalObjectsFilter(MethodHandleTransformer)} |
|
33339 | 95 |
* that delegates to a pair of filtering method handles. It takes a method |
96 |
* handle of {@code Object(Object)} type for filtering parameter values and |
|
97 |
* another one of the same type for filtering return values. It applies them as |
|
98 |
* parameter and return value filters on method handles passed to its |
|
99 |
* {@link #transform(MethodHandle)} method, on those parameters and return values |
|
100 |
* that are declared to have type {@link Object}. Also handles |
|
101 |
* {@link MethodHandle#isVarargsCollector() method handles that support variable |
|
102 |
* arity calls} with a last {@code Object[]} parameter. You can broadly think of |
|
103 |
* the parameter filter as being a wrapping method for exposing internal runtime |
|
104 |
* objects wrapped into an adapter with some public interface, and the return |
|
105 |
* value filter as being its inverse unwrapping method. |
|
28881
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
106 |
*/ |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
107 |
public class DefaultInternalObjectFilter implements MethodHandleTransformer { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
108 |
private static final MethodHandle FILTER_VARARGS = new Lookup(MethodHandles.lookup()).findStatic( |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
109 |
DefaultInternalObjectFilter.class, "filterVarArgs", MethodType.methodType(Object[].class, MethodHandle.class, Object[].class)); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
110 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
111 |
private final MethodHandle parameterFilter; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
112 |
private final MethodHandle returnFilter; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
113 |
private final MethodHandle varArgFilter; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
114 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
115 |
/** |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
116 |
* Creates a new filter. |
33333 | 117 |
* @param parameterFilter the filter for method parameters. Must be of type |
118 |
* {@code Object(Object)}, or {@code null}. |
|
119 |
* @param returnFilter the filter for return values. Must be of type |
|
120 |
* {@code Object(Object)}, or {@code null}. |
|
121 |
* @throws IllegalArgumentException if one or both filters are not of the |
|
122 |
* expected type. |
|
28881
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
123 |
*/ |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
124 |
public DefaultInternalObjectFilter(final MethodHandle parameterFilter, final MethodHandle returnFilter) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
125 |
this.parameterFilter = checkHandle(parameterFilter, "parameterFilter"); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
126 |
this.returnFilter = checkHandle(returnFilter, "returnFilter"); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
127 |
this.varArgFilter = parameterFilter == null ? null : FILTER_VARARGS.bindTo(parameterFilter); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
128 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
129 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
130 |
@Override |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
131 |
public MethodHandle transform(final MethodHandle target) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
132 |
assert target != null; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
133 |
MethodHandle[] filters = null; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
134 |
final MethodType type = target.type(); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
135 |
final boolean isVarArg = target.isVarargsCollector(); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
136 |
final int paramCount = type.parameterCount(); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
137 |
final MethodHandle paramsFiltered; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
138 |
// Filter parameters |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
139 |
if (parameterFilter != null) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
140 |
int firstFilter = -1; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
141 |
// Ignore receiver, start from argument 1 |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
142 |
for(int i = 1; i < paramCount; ++i) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
143 |
final Class<?> paramType = type.parameterType(i); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
144 |
final boolean filterVarArg = isVarArg && i == paramCount - 1 && paramType == Object[].class; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
145 |
if (filterVarArg || paramType == Object.class) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
146 |
if (filters == null) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
147 |
firstFilter = i; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
148 |
filters = new MethodHandle[paramCount - firstFilter]; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
149 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
150 |
filters[i - firstFilter] = filterVarArg ? varArgFilter : parameterFilter; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
151 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
152 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
153 |
paramsFiltered = filters != null ? MethodHandles.filterArguments(target, firstFilter, filters) : target; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
154 |
} else { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
155 |
paramsFiltered = target; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
156 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
157 |
// Filter return value if needed |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
158 |
final MethodHandle returnFiltered = returnFilter != null && type.returnType() == Object.class ? MethodHandles.filterReturnValue(paramsFiltered, returnFilter) : paramsFiltered; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
159 |
// Preserve varargs collector state |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
160 |
return isVarArg && !returnFiltered.isVarargsCollector() ? returnFiltered.asVarargsCollector(type.parameterType(paramCount - 1)) : returnFiltered; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
161 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
162 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
163 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
164 |
private static MethodHandle checkHandle(final MethodHandle handle, final String handleKind) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
165 |
if (handle != null) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
166 |
final MethodType objectObjectType = MethodType.methodType(Object.class, Object.class); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
167 |
if (!handle.type().equals(objectObjectType)) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
168 |
throw new IllegalArgumentException("Method type for " + handleKind + " must be " + objectObjectType); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
169 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
170 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
171 |
return handle; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
172 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
173 |
|
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
174 |
@SuppressWarnings("unused") |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
175 |
private static Object[] filterVarArgs(final MethodHandle parameterFilter, final Object[] args) throws Throwable { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
176 |
Object[] newArgs = null; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
177 |
for(int i = 0; i < args.length; ++i) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
178 |
final Object arg = args[i]; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
179 |
final Object newArg = parameterFilter.invokeExact(arg); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
180 |
if (arg != newArg) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
181 |
if (newArgs == null) { |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
182 |
newArgs = args.clone(); |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
183 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
184 |
newArgs[i] = newArg; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
185 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
186 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
187 |
return newArgs == null ? args : newArgs; |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
188 |
} |
0008daeef352
8072596: Arrays.asList results in ClassCastException with a JS array
attila
parents:
diff
changeset
|
189 |
} |