001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.jikesrvm.mm.mminterface;
014
015 import org.jikesrvm.VM;
016 import org.jikesrvm.SizeConstants;
017 import org.jikesrvm.ArchitectureSpecific.CodeArray;
018 import org.jikesrvm.classloader.Atom;
019 import org.jikesrvm.classloader.RVMClass;
020 import org.jikesrvm.classloader.RVMMethod;
021 import org.jikesrvm.classloader.SpecializedMethod;
022 import org.jikesrvm.classloader.RVMType;
023 import org.jikesrvm.classloader.TypeReference;
024 import org.jikesrvm.compilers.common.CompiledMethod;
025 import org.jikesrvm.objectmodel.JavaHeaderConstants;
026 import org.jikesrvm.objectmodel.ObjectModel;
027 import org.jikesrvm.runtime.Magic;
028 import org.mmtk.plan.TransitiveClosure;
029 import org.vmmagic.pragma.Inline;
030 import org.vmmagic.pragma.Interruptible;
031 import org.vmmagic.pragma.NoInline;
032 import org.vmmagic.pragma.SpecializedMethodInvoke;
033 import org.vmmagic.pragma.Uninterruptible;
034 import org.vmmagic.unboxed.Address;
035 import org.vmmagic.unboxed.ObjectReference;
036
037 /**
038 * A method that scan objects and is specialized to a specific MMTk
039 * TransitiveClosure type.
040 *
041 * In general as there may not be a 1-1 mapping between objects and the
042 * specialized methods this class is responsible for performing the
043 * mapping.
044 *
045 * Specialized methods must have a static 'invoke' method that matches
046 * the given signature and return type.
047 */
048 @Uninterruptible
049 public final class SpecializedScanMethod extends SpecializedMethod implements SizeConstants, JavaHeaderConstants {
050
051 /** Use specialized scanning ? */
052 public static final boolean ENABLED = true;
053
054 /** This method's signature: the object to be scanned and the trace to use */
055 private static final TypeReference[] signature = new TypeReference[] {
056 TypeReference.JavaLangObject,
057 TypeReference.findOrCreate(TransitiveClosure.class)};
058
059 /** The return type of this method: void */
060 private static final TypeReference returnType = TypeReference.Void;
061
062 /** Our type reference */
063 private static final TypeReference specializedScanMethodType = TypeReference.findOrCreate(SpecializedScanMethod.class);
064
065 /** Objects with no references or primitive arrays */
066 private static final int NULL_PATTERN = 0;
067 /** Number of patterns we will specialize */
068 private static final int SPECIALIZED_PATTERNS = 64;
069 /** Reference arrays */
070 private static final int REFARRAY_PATTERN = 64;
071 /** Fallback to a slower path that is not specialized */
072 private static final int FALLBACK_PATTERN = 65;
073 /** The total number of patterns */
074 private static final int PATTERNS = 66;
075 /** Maximum field offset we can deal with */
076 private static final int MAX_SPECIALIZED_OFFSET = 6 << LOG_BYTES_IN_ADDRESS;
077
078 /** We keep the specialized methods for key object reference patterns here.*/
079 private final CompiledMethod[] specializedMethods = new CompiledMethod[PATTERNS];
080
081 /** The specialized signature of the method */
082 private final TypeReference[] specializedSignature;
083
084 public SpecializedScanMethod(int id, TypeReference specializedTrace) {
085 super(id);
086 this.specializedSignature = new TypeReference[] { TypeReference.JavaLangObject, specializedTrace };
087
088 if (!VM.BuildWithBaseBootImageCompiler) {
089 /* Compile our specialized methods when we are opt compiling */
090 RVMClass myClass = specializedScanMethodType.peekType().asClass();
091 for(int i=0; i < PATTERNS; i++) {
092 RVMMethod method = myClass.findStaticMethod(templateMethodName(i), specializedMethodDescriptor);
093 specializedMethods[i] = compileSpecializedMethod(method, specializedSignature);
094 }
095 }
096 }
097
098 /**
099 * Get the pattern index for a given type
100 */
101 @Interruptible
102 private static int getPattern(RVMType type) {
103 /* Handle array types */
104 if (type.isArrayType()) {
105 if (type.asArray().getElementType().isReferenceType()) {
106 return REFARRAY_PATTERN;
107 }
108 return NULL_PATTERN;
109 }
110
111 /* Build a bitmap if the object is compact enough and is not a reference array */
112 int[] offsets = type.asClass().getReferenceOffsets();
113
114 if (offsets.length == 0) {
115 return NULL_PATTERN;
116 }
117 if ((offsets.length << LOG_BYTES_IN_ADDRESS) > SPECIALIZED_PATTERNS) {
118 return FALLBACK_PATTERN;
119 }
120
121 int base = FIELD_ZERO_OFFSET.toInt();
122 int pattern = 0;
123
124 for(int i=0; i < offsets.length; i++) {
125 int reference = (offsets[i] - base);
126 if (reference > MAX_SPECIALIZED_OFFSET) {
127 return FALLBACK_PATTERN;
128 }
129 pattern |= 1 << (reference >> LOG_BYTES_IN_ADDRESS);
130 }
131
132 if (pattern < 0 || pattern > 63) {
133 pattern = FALLBACK_PATTERN;
134 }
135
136 return pattern;
137 }
138
139 /**
140 * Return the specialized method for the given type.
141 *
142 * TODO: Lazily compile specialized methods?
143 */
144 @Interruptible
145 public synchronized CodeArray specializeMethod(RVMType type) {
146 /* Work out which pattern this type uses */
147 int pattern = getPattern(type);
148
149 if (VM.BuildWithBaseBootImageCompiler) {
150 /* There is no point specializing if we aren't opt compiling */
151 return null;
152 }
153
154 /* Ensure we have a compiled method cached. */
155 if (VM.VerifyAssertions) VM._assert(specializedMethods[pattern] != null);
156
157 /* Return the code entry array */
158 return specializedMethods[pattern].getEntryCodeArray();
159 }
160
161 /**
162 * @return the method signature of the specialized method's invoke.
163 */
164 public TypeReference[] getSignature() {
165 return signature;
166 }
167
168 /**
169 * @return the return type of the specialized method's invoke
170 */
171 public TypeReference getReturnType() {
172 return returnType;
173 }
174
175 /**
176 * This method peforms the scanning of a given object.
177 *
178 * This is the method that (may) be hijacked by the compiler to call the specialized method.
179 *
180 * It is safe for a compiler to ignore the potential gains and just use this method
181 * directly.
182 *
183 * @param id The specialized method id
184 * @param object The object to scan
185 * @param trace The trace to scan
186 */
187 @SpecializedMethodInvoke
188 @NoInline
189 public static void invoke(int id, Object object, TransitiveClosure trace) {
190 /* By default we call a non-specialized fallback */
191 fallback(object, trace);
192 }
193
194 /** Fallback */
195 public static void fallback(Object object, TransitiveClosure trace) {
196 ObjectReference objectRef = ObjectReference.fromObject(object);
197 RVMType type = ObjectModel.getObjectType(objectRef.toObject());
198 if (type.isClassType()) {
199 RVMClass klass = type.asClass();
200 int[] offsets = klass.getReferenceOffsets();
201 for(int i=0; i < offsets.length; i++) {
202 trace.processEdge(objectRef, objectRef.toAddress().plus(offsets[i]));
203 }
204 } else if (type.isArrayType() && type.asArray().getElementType().isReferenceType()) {
205 for(int i=0; i < ObjectModel.getArrayLength(objectRef.toObject()); i++) {
206 trace.processEdge(objectRef, objectRef.toAddress().plus(i << LOG_BYTES_IN_ADDRESS));
207 }
208 }
209 }
210
211 /** All Scalars */
212 public static void scalar(Object object, TransitiveClosure trace) {
213 Address base = Magic.objectAsAddress(object);
214 int[] offsets = ObjectModel.getObjectType(object).asClass().getReferenceOffsets();
215 for (int i = 0; i < offsets.length; i++) {
216 trace.processEdge(ObjectReference.fromObject(object), base.plus(offsets[i]));
217 }
218 }
219
220 /** Reference Arrays */
221 public static void referenceArray(Object object, TransitiveClosure trace) {
222 Address base = Magic.objectAsAddress(object);
223 int length = ObjectModel.getArrayLength(object);
224 for (int i=0; i < length; i++) {
225 trace.processEdge(ObjectReference.fromObject(object), base.plus(i << LOG_BYTES_IN_ADDRESS));
226 }
227 }
228
229 /** No Reference fields / Primitive Arrays */
230 public static void noReferences(Object object, TransitiveClosure trace) {}
231
232 /** All patterns bottom out here */
233 @Inline
234 public static void pattern(int pattern, Object object, TransitiveClosure trace) {
235 Address base = Magic.objectAsAddress(object).plus(FIELD_ZERO_OFFSET);
236 if ((pattern & 1) != 0) {
237 trace.processEdge(ObjectReference.fromObject(object), base.plus(0));
238 }
239 if ((pattern & 2) != 0) {
240 trace.processEdge(ObjectReference.fromObject(object), base.plus(1 << LOG_BYTES_IN_ADDRESS));
241 }
242 if ((pattern & 4) != 0) {
243 trace.processEdge(ObjectReference.fromObject(object), base.plus(2 << LOG_BYTES_IN_ADDRESS));
244 }
245 if ((pattern & 8) != 0) {
246 trace.processEdge(ObjectReference.fromObject(object), base.plus(3 << LOG_BYTES_IN_ADDRESS));
247 }
248 if ((pattern & 16) != 0) {
249 trace.processEdge(ObjectReference.fromObject(object), base.plus(4 << LOG_BYTES_IN_ADDRESS));
250 }
251 if ((pattern & 32) != 0) {
252 trace.processEdge(ObjectReference.fromObject(object), base.plus(5 << LOG_BYTES_IN_ADDRESS));
253 }
254 }
255
256 /**
257 * Find the template method name for a given pattern.
258 *
259 * @param pattern The pattern to look for
260 * @return The method name that will be used.
261 */
262 private Atom templateMethodName(int pattern) {
263 switch(pattern) {
264 case 1: return Names.scalarRNNNNN;
265 case 2: return Names.scalarNRNNNN;
266 case 3: return Names.scalarRRNNNN;
267 case 4: return Names.scalarNNRNNN;
268 case 5: return Names.scalarRNRNNN;
269 case 6: return Names.scalarNRRNNN;
270 case 7: return Names.scalarRRRNNN;
271 case 8: return Names.scalarNNNRNN;
272 case 9: return Names.scalarRNNRNN;
273 case 10: return Names.scalarNRNRNN;
274 case 11: return Names.scalarRRNRNN;
275 case 12: return Names.scalarNNRRNN;
276 case 13: return Names.scalarRNRRNN;
277 case 14: return Names.scalarNRRRNN;
278 case 15: return Names.scalarRRRRNN;
279 case 16: return Names.scalarNNNNRN;
280 case 17: return Names.scalarRNNNRN;
281 case 18: return Names.scalarNRNNRN;
282 case 19: return Names.scalarRRNNRN;
283 case 20: return Names.scalarNNRNRN;
284 case 21: return Names.scalarRNRNRN;
285 case 22: return Names.scalarNRRNRN;
286 case 23: return Names.scalarRRRNRN;
287 case 24: return Names.scalarNNNRRN;
288 case 25: return Names.scalarRNNRRN;
289 case 26: return Names.scalarNRNRRN;
290 case 27: return Names.scalarRRNRRN;
291 case 28: return Names.scalarNNRRRN;
292 case 29: return Names.scalarRNRRRN;
293 case 30: return Names.scalarNRRRRN;
294 case 31: return Names.scalarRRRRRN;
295 case 32: return Names.scalarNNNNNR;
296 case 33: return Names.scalarRNNNNR;
297 case 34: return Names.scalarNRNNNR;
298 case 35: return Names.scalarRRNNNR;
299 case 36: return Names.scalarNNRNNR;
300 case 37: return Names.scalarRNRNNR;
301 case 38: return Names.scalarNRRNNR;
302 case 39: return Names.scalarRRRNNR;
303 case 40: return Names.scalarNNNRNR;
304 case 41: return Names.scalarRNNRNR;
305 case 42: return Names.scalarNRNRNR;
306 case 43: return Names.scalarRRNRNR;
307 case 44: return Names.scalarNNRRNR;
308 case 45: return Names.scalarRNRRNR;
309 case 46: return Names.scalarNRRRNR;
310 case 47: return Names.scalarRRRRNR;
311 case 48: return Names.scalarNNNNRR;
312 case 49: return Names.scalarRNNNRR;
313 case 50: return Names.scalarNRNNRR;
314 case 51: return Names.scalarRRNNRR;
315 case 52: return Names.scalarNNRNRR;
316 case 53: return Names.scalarRNRNRR;
317 case 54: return Names.scalarNRRNRR;
318 case 55: return Names.scalarRRRNRR;
319 case 56: return Names.scalarNNNRRR;
320 case 57: return Names.scalarRNNRRR;
321 case 58: return Names.scalarNRNRRR;
322 case 59: return Names.scalarRRNRRR;
323 case 60: return Names.scalarNNRRRR;
324 case 61: return Names.scalarRNRRRR;
325 case 62: return Names.scalarNRRRRR;
326 case 63: return Names.scalarRRRRRR;
327 case NULL_PATTERN: return Names.noReferences;
328 case REFARRAY_PATTERN: return Names.referenceArray;
329 case FALLBACK_PATTERN:
330 default: return Names.scalar;
331 }
332 }
333
334 /** The generic descriptor for the specialized methods */
335 private static final Atom specializedMethodDescriptor = Atom.findOrCreateAsciiAtom("(Ljava/lang/Object;Lorg/mmtk/plan/TransitiveClosure;)V");
336
337 /** The atoms for the names of the specialized methods */
338 private static final class Names {
339 static final Atom fallback = Atom.findOrCreateAsciiAtom("fallback");
340 static final Atom referenceArray = Atom.findOrCreateAsciiAtom("referenceArray");
341 static final Atom scalar = Atom.findOrCreateAsciiAtom("scalar");
342 static final Atom noReferences = Atom.findOrCreateAsciiAtom("noReferences");
343 static final Atom scalarRNNNNN = Atom.findOrCreateAsciiAtom("scalarRNNNNN");
344 static final Atom scalarNRNNNN = Atom.findOrCreateAsciiAtom("scalarNRNNNN");
345 static final Atom scalarRRNNNN = Atom.findOrCreateAsciiAtom("scalarRRNNNN");
346 static final Atom scalarNNRNNN = Atom.findOrCreateAsciiAtom("scalarNNRNNN");
347 static final Atom scalarRNRNNN = Atom.findOrCreateAsciiAtom("scalarRNRNNN");
348 static final Atom scalarNRRNNN = Atom.findOrCreateAsciiAtom("scalarNRRNNN");
349 static final Atom scalarRRRNNN = Atom.findOrCreateAsciiAtom("scalarRRRNNN");
350 static final Atom scalarNNNRNN = Atom.findOrCreateAsciiAtom("scalarNNNRNN");
351 static final Atom scalarRNNRNN = Atom.findOrCreateAsciiAtom("scalarRNNRNN");
352 static final Atom scalarNRNRNN = Atom.findOrCreateAsciiAtom("scalarNRNRNN");
353 static final Atom scalarRRNRNN = Atom.findOrCreateAsciiAtom("scalarRRNRNN");
354 static final Atom scalarNNRRNN = Atom.findOrCreateAsciiAtom("scalarNNRRNN");
355 static final Atom scalarRNRRNN = Atom.findOrCreateAsciiAtom("scalarRNRRNN");
356 static final Atom scalarNRRRNN = Atom.findOrCreateAsciiAtom("scalarNRRRNN");
357 static final Atom scalarRRRRNN = Atom.findOrCreateAsciiAtom("scalarRRRRNN");
358 static final Atom scalarNNNNRN = Atom.findOrCreateAsciiAtom("scalarNNNNRN");
359 static final Atom scalarRNNNRN = Atom.findOrCreateAsciiAtom("scalarRNNNRN");
360 static final Atom scalarNRNNRN = Atom.findOrCreateAsciiAtom("scalarNRNNRN");
361 static final Atom scalarRRNNRN = Atom.findOrCreateAsciiAtom("scalarRRNNRN");
362 static final Atom scalarNNRNRN = Atom.findOrCreateAsciiAtom("scalarNNRNRN");
363 static final Atom scalarRNRNRN = Atom.findOrCreateAsciiAtom("scalarRNRNRN");
364 static final Atom scalarNRRNRN = Atom.findOrCreateAsciiAtom("scalarNRRNRN");
365 static final Atom scalarRRRNRN = Atom.findOrCreateAsciiAtom("scalarRRRNRN");
366 static final Atom scalarNNNRRN = Atom.findOrCreateAsciiAtom("scalarNNNRRN");
367 static final Atom scalarRNNRRN = Atom.findOrCreateAsciiAtom("scalarRNNRRN");
368 static final Atom scalarNRNRRN = Atom.findOrCreateAsciiAtom("scalarNRNRRN");
369 static final Atom scalarRRNRRN = Atom.findOrCreateAsciiAtom("scalarRRNRRN");
370 static final Atom scalarNNRRRN = Atom.findOrCreateAsciiAtom("scalarNNRRRN");
371 static final Atom scalarRNRRRN = Atom.findOrCreateAsciiAtom("scalarRNRRRN");
372 static final Atom scalarNRRRRN = Atom.findOrCreateAsciiAtom("scalarNRRRRN");
373 static final Atom scalarRRRRRN = Atom.findOrCreateAsciiAtom("scalarRRRRRN");
374 static final Atom scalarNNNNNR = Atom.findOrCreateAsciiAtom("scalarNNNNNR");
375 static final Atom scalarRNNNNR = Atom.findOrCreateAsciiAtom("scalarRNNNNR");
376 static final Atom scalarNRNNNR = Atom.findOrCreateAsciiAtom("scalarNRNNNR");
377 static final Atom scalarRRNNNR = Atom.findOrCreateAsciiAtom("scalarRRNNNR");
378 static final Atom scalarNNRNNR = Atom.findOrCreateAsciiAtom("scalarNNRNNR");
379 static final Atom scalarRNRNNR = Atom.findOrCreateAsciiAtom("scalarRNRNNR");
380 static final Atom scalarNRRNNR = Atom.findOrCreateAsciiAtom("scalarNRRNNR");
381 static final Atom scalarRRRNNR = Atom.findOrCreateAsciiAtom("scalarRRRNNR");
382 static final Atom scalarNNNRNR = Atom.findOrCreateAsciiAtom("scalarNNNRNR");
383 static final Atom scalarRNNRNR = Atom.findOrCreateAsciiAtom("scalarRNNRNR");
384 static final Atom scalarNRNRNR = Atom.findOrCreateAsciiAtom("scalarNRNRNR");
385 static final Atom scalarRRNRNR = Atom.findOrCreateAsciiAtom("scalarRRNRNR");
386 static final Atom scalarNNRRNR = Atom.findOrCreateAsciiAtom("scalarNNRRNR");
387 static final Atom scalarRNRRNR = Atom.findOrCreateAsciiAtom("scalarRNRRNR");
388 static final Atom scalarNRRRNR = Atom.findOrCreateAsciiAtom("scalarNRRRNR");
389 static final Atom scalarRRRRNR = Atom.findOrCreateAsciiAtom("scalarRRRRNR");
390 static final Atom scalarNNNNRR = Atom.findOrCreateAsciiAtom("scalarNNNNRR");
391 static final Atom scalarRNNNRR = Atom.findOrCreateAsciiAtom("scalarRNNNRR");
392 static final Atom scalarNRNNRR = Atom.findOrCreateAsciiAtom("scalarNRNNRR");
393 static final Atom scalarRRNNRR = Atom.findOrCreateAsciiAtom("scalarRRNNRR");
394 static final Atom scalarNNRNRR = Atom.findOrCreateAsciiAtom("scalarNNRNRR");
395 static final Atom scalarRNRNRR = Atom.findOrCreateAsciiAtom("scalarRNRNRR");
396 static final Atom scalarNRRNRR = Atom.findOrCreateAsciiAtom("scalarNRRNRR");
397 static final Atom scalarRRRNRR = Atom.findOrCreateAsciiAtom("scalarRRRNRR");
398 static final Atom scalarNNNRRR = Atom.findOrCreateAsciiAtom("scalarNNNRRR");
399 static final Atom scalarRNNRRR = Atom.findOrCreateAsciiAtom("scalarRNNRRR");
400 static final Atom scalarNRNRRR = Atom.findOrCreateAsciiAtom("scalarNRNRRR");
401 static final Atom scalarRRNRRR = Atom.findOrCreateAsciiAtom("scalarRRNRRR");
402 static final Atom scalarNNRRRR = Atom.findOrCreateAsciiAtom("scalarNNRRRR");
403 static final Atom scalarRNRRRR = Atom.findOrCreateAsciiAtom("scalarRNRRRR");
404 static final Atom scalarNRRRRR = Atom.findOrCreateAsciiAtom("scalarNRRRRR");
405 static final Atom scalarRRRRRR = Atom.findOrCreateAsciiAtom("scalarRRRRRR");
406 }
407
408 // CHECKSTYLE:OFF
409
410 public static void scalarRNNNNN(Object object, TransitiveClosure trace) { pattern( 1, object, trace); }
411 public static void scalarNRNNNN(Object object, TransitiveClosure trace) { pattern( 2, object, trace); }
412 public static void scalarRRNNNN(Object object, TransitiveClosure trace) { pattern( 3, object, trace); }
413 public static void scalarNNRNNN(Object object, TransitiveClosure trace) { pattern( 4, object, trace); }
414 public static void scalarRNRNNN(Object object, TransitiveClosure trace) { pattern( 5, object, trace); }
415 public static void scalarNRRNNN(Object object, TransitiveClosure trace) { pattern( 6, object, trace); }
416 public static void scalarRRRNNN(Object object, TransitiveClosure trace) { pattern( 7, object, trace); }
417 public static void scalarNNNRNN(Object object, TransitiveClosure trace) { pattern( 8, object, trace); }
418 public static void scalarRNNRNN(Object object, TransitiveClosure trace) { pattern( 9, object, trace); }
419 public static void scalarNRNRNN(Object object, TransitiveClosure trace) { pattern(10, object, trace); }
420 public static void scalarRRNRNN(Object object, TransitiveClosure trace) { pattern(11, object, trace); }
421 public static void scalarNNRRNN(Object object, TransitiveClosure trace) { pattern(12, object, trace); }
422 public static void scalarRNRRNN(Object object, TransitiveClosure trace) { pattern(13, object, trace); }
423 public static void scalarNRRRNN(Object object, TransitiveClosure trace) { pattern(14, object, trace); }
424 public static void scalarRRRRNN(Object object, TransitiveClosure trace) { pattern(15, object, trace); }
425 public static void scalarNNNNRN(Object object, TransitiveClosure trace) { pattern(16, object, trace); }
426 public static void scalarRNNNRN(Object object, TransitiveClosure trace) { pattern(17, object, trace); }
427 public static void scalarNRNNRN(Object object, TransitiveClosure trace) { pattern(18, object, trace); }
428 public static void scalarRRNNRN(Object object, TransitiveClosure trace) { pattern(19, object, trace); }
429 public static void scalarNNRNRN(Object object, TransitiveClosure trace) { pattern(20, object, trace); }
430 public static void scalarRNRNRN(Object object, TransitiveClosure trace) { pattern(21, object, trace); }
431 public static void scalarNRRNRN(Object object, TransitiveClosure trace) { pattern(22, object, trace); }
432 public static void scalarRRRNRN(Object object, TransitiveClosure trace) { pattern(23, object, trace); }
433 public static void scalarNNNRRN(Object object, TransitiveClosure trace) { pattern(24, object, trace); }
434 public static void scalarRNNRRN(Object object, TransitiveClosure trace) { pattern(25, object, trace); }
435 public static void scalarNRNRRN(Object object, TransitiveClosure trace) { pattern(26, object, trace); }
436 public static void scalarRRNRRN(Object object, TransitiveClosure trace) { pattern(27, object, trace); }
437 public static void scalarNNRRRN(Object object, TransitiveClosure trace) { pattern(28, object, trace); }
438 public static void scalarRNRRRN(Object object, TransitiveClosure trace) { pattern(29, object, trace); }
439 public static void scalarNRRRRN(Object object, TransitiveClosure trace) { pattern(30, object, trace); }
440 public static void scalarRRRRRN(Object object, TransitiveClosure trace) { pattern(31, object, trace); }
441 public static void scalarNNNNNR(Object object, TransitiveClosure trace) { pattern(32, object, trace); }
442 public static void scalarRNNNNR(Object object, TransitiveClosure trace) { pattern(33, object, trace); }
443 public static void scalarNRNNNR(Object object, TransitiveClosure trace) { pattern(34, object, trace); }
444 public static void scalarRRNNNR(Object object, TransitiveClosure trace) { pattern(35, object, trace); }
445 public static void scalarNNRNNR(Object object, TransitiveClosure trace) { pattern(36, object, trace); }
446 public static void scalarRNRNNR(Object object, TransitiveClosure trace) { pattern(37, object, trace); }
447 public static void scalarNRRNNR(Object object, TransitiveClosure trace) { pattern(38, object, trace); }
448 public static void scalarRRRNNR(Object object, TransitiveClosure trace) { pattern(39, object, trace); }
449 public static void scalarNNNRNR(Object object, TransitiveClosure trace) { pattern(40, object, trace); }
450 public static void scalarRNNRNR(Object object, TransitiveClosure trace) { pattern(41, object, trace); }
451 public static void scalarNRNRNR(Object object, TransitiveClosure trace) { pattern(42, object, trace); }
452 public static void scalarRRNRNR(Object object, TransitiveClosure trace) { pattern(43, object, trace); }
453 public static void scalarNNRRNR(Object object, TransitiveClosure trace) { pattern(44, object, trace); }
454 public static void scalarRNRRNR(Object object, TransitiveClosure trace) { pattern(45, object, trace); }
455 public static void scalarNRRRNR(Object object, TransitiveClosure trace) { pattern(46, object, trace); }
456 public static void scalarRRRRNR(Object object, TransitiveClosure trace) { pattern(47, object, trace); }
457 public static void scalarNNNNRR(Object object, TransitiveClosure trace) { pattern(48, object, trace); }
458 public static void scalarRNNNRR(Object object, TransitiveClosure trace) { pattern(49, object, trace); }
459 public static void scalarNRNNRR(Object object, TransitiveClosure trace) { pattern(50, object, trace); }
460 public static void scalarRRNNRR(Object object, TransitiveClosure trace) { pattern(51, object, trace); }
461 public static void scalarNNRNRR(Object object, TransitiveClosure trace) { pattern(52, object, trace); }
462 public static void scalarRNRNRR(Object object, TransitiveClosure trace) { pattern(53, object, trace); }
463 public static void scalarNRRNRR(Object object, TransitiveClosure trace) { pattern(54, object, trace); }
464 public static void scalarRRRNRR(Object object, TransitiveClosure trace) { pattern(55, object, trace); }
465 public static void scalarNNNRRR(Object object, TransitiveClosure trace) { pattern(56, object, trace); }
466 public static void scalarRNNRRR(Object object, TransitiveClosure trace) { pattern(57, object, trace); }
467 public static void scalarNRNRRR(Object object, TransitiveClosure trace) { pattern(58, object, trace); }
468 public static void scalarRRNRRR(Object object, TransitiveClosure trace) { pattern(59, object, trace); }
469 public static void scalarNNRRRR(Object object, TransitiveClosure trace) { pattern(60, object, trace); }
470 public static void scalarRNRRRR(Object object, TransitiveClosure trace) { pattern(61, object, trace); }
471 public static void scalarNRRRRR(Object object, TransitiveClosure trace) { pattern(62, object, trace); }
472 public static void scalarRRRRRR(Object object, TransitiveClosure trace) { pattern(63, object, trace); }
473
474 // CHECKSTYLE:ON
475 }