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 static org.jikesrvm.classloader.RVMType.REFARRAY_OFFSET_ARRAY;
016    
017    import org.jikesrvm.ArchitectureSpecific.CodeArray;
018    import org.jikesrvm.SizeConstants;
019    import org.jikesrvm.VM;
020    import org.jikesrvm.classloader.Atom;
021    import org.jikesrvm.classloader.RVMClass;
022    import org.jikesrvm.classloader.RVMMethod;
023    import org.jikesrvm.classloader.RVMType;
024    import org.jikesrvm.classloader.SpecializedMethod;
025    import org.jikesrvm.classloader.TypeReference;
026    import org.jikesrvm.compilers.common.CompiledMethod;
027    import org.jikesrvm.objectmodel.JavaHeaderConstants;
028    import org.jikesrvm.objectmodel.ObjectModel;
029    import org.jikesrvm.runtime.Magic;
030    import org.mmtk.plan.TransitiveClosure;
031    import org.vmmagic.pragma.Inline;
032    import org.vmmagic.pragma.Interruptible;
033    import org.vmmagic.pragma.NoInline;
034    import org.vmmagic.pragma.SpecializedMethodInvoke;
035    import org.vmmagic.pragma.Uninterruptible;
036    import org.vmmagic.unboxed.Address;
037    import org.vmmagic.unboxed.ObjectReference;
038    
039    /**
040     * A method that scan objects and is specialized to a specific MMTk
041     * TransitiveClosure type.
042     * <p>
043     * In general as there may not be a 1-1 mapping between objects and the
044     * specialized methods this class is responsible for performing the
045     * mapping.
046     * <p>
047     * Specialized methods must have a static 'invoke' method that matches
048     * the given signature and return type.
049     */
050    @Uninterruptible
051    public final class SpecializedScanMethod extends SpecializedMethod implements SizeConstants, JavaHeaderConstants {
052    
053      /** Use specialized scanning ? */
054      public static final boolean ENABLED = true;
055    
056      /** This method's signature: the object to be scanned and the trace to use */
057      private static final TypeReference[] signature = new TypeReference[] {
058        TypeReference.JavaLangObject,
059        TypeReference.findOrCreate(TransitiveClosure.class)};
060    
061      /** The return type of this method: void */
062      private static final TypeReference returnType = TypeReference.Void;
063    
064      /** Our type reference */
065      private static final TypeReference specializedScanMethodType = TypeReference.findOrCreate(SpecializedScanMethod.class);
066    
067      /** Objects with no references or primitive arrays */
068      private static final int NULL_PATTERN = 0;
069      /** Number of patterns we will specialize */
070      private static final int SPECIALIZED_PATTERNS = 64;
071      /** Reference arrays */
072      private static final int REFARRAY_PATTERN = 64;
073      /** Fallback to a slower path that is not specialized */
074      private static final int FALLBACK_PATTERN = 65;
075      /** The total number of patterns */
076      private static final int PATTERNS = 66;
077      /** Maximum field offset we can deal with */
078      private static final int MAX_SPECIALIZED_OFFSET = 6 << LOG_BYTES_IN_ADDRESS;
079    
080      /** We keep the specialized methods for key object reference patterns here.*/
081      private final CompiledMethod[] specializedMethods = new CompiledMethod[PATTERNS];
082    
083      /** The specialized signature of the method */
084      private final TypeReference[] specializedSignature;
085    
086      public SpecializedScanMethod(int id, TypeReference specializedTrace) {
087        super(id);
088        this.specializedSignature = new TypeReference[] { TypeReference.JavaLangObject, specializedTrace };
089    
090        if (!VM.BuildWithBaseBootImageCompiler) {
091          /* Compile our specialized methods when we are opt compiling */
092          RVMClass myClass = specializedScanMethodType.peekType().asClass();
093          for(int i=0; i < PATTERNS; i++) {
094            RVMMethod method = myClass.findStaticMethod(templateMethodName(i), specializedMethodDescriptor);
095            specializedMethods[i] = compileSpecializedMethod(method, specializedSignature);
096          }
097        }
098      }
099    
100      /**
101       * Get the pattern index for a given type
102       */
103      @Interruptible
104      private static int getPattern(RVMType type) {
105        /* Handle array types */
106        if (type.isArrayType()) {
107          if (type.asArray().getElementType().isReferenceType()) {
108            return REFARRAY_PATTERN;
109          }
110          return NULL_PATTERN;
111        }
112    
113        /* Build a bitmap if the object is compact enough and is not a reference array */
114        int[] offsets = type.getReferenceOffsets();
115    
116        if (VM.VerifyAssertions) VM._assert(offsets != null);
117    
118        if (offsets.length == 0) {
119          return NULL_PATTERN;
120        }
121        if ((offsets.length << LOG_BYTES_IN_ADDRESS) > SPECIALIZED_PATTERNS) {
122          return FALLBACK_PATTERN;
123        }
124    
125        int base = FIELD_ZERO_OFFSET.toInt();
126        int pattern = 0;
127    
128        for(int i=0; i < offsets.length; i++) {
129          int reference = (offsets[i] - base);
130          if (reference > MAX_SPECIALIZED_OFFSET) {
131            return FALLBACK_PATTERN;
132          }
133          pattern |= 1 << (reference >> LOG_BYTES_IN_ADDRESS);
134        }
135    
136        if (pattern < 0 || pattern > 63) {
137          pattern = FALLBACK_PATTERN;
138        }
139    
140        return pattern;
141      }
142    
143      /**
144       * TODO: Lazily compile specialized methods?
145       */
146      @Override
147      @Interruptible
148      public synchronized CodeArray specializeMethod(RVMType type) {
149        /* Work out which pattern this type uses */
150        int pattern = getPattern(type);
151    
152        if (VM.BuildWithBaseBootImageCompiler) {
153          /* There is no point specializing if we aren't opt compiling */
154          return null;
155        }
156    
157        /* Ensure we have a compiled method cached. */
158        if (VM.VerifyAssertions) VM._assert(specializedMethods[pattern] != null);
159    
160        /* Return the code entry array */
161        return specializedMethods[pattern].getEntryCodeArray();
162      }
163    
164      @Override
165      public TypeReference[] getSignature() {
166        return signature;
167      }
168    
169      @Override
170      public TypeReference getReturnType() {
171        return returnType;
172      }
173    
174      /**
175       * This method performs the scanning of a given object.
176       * <p>
177       * This is the method that (may) be hijacked by the compiler to call the specialized method.
178       * <p>
179       * It is safe for a compiler to ignore the potential gains and just use this method
180       * directly.
181       *
182       * @param id The specialized method id
183       * @param object The object to scan
184       * @param trace The trace to scan
185       */
186      @SpecializedMethodInvoke
187      @NoInline
188      public static void invoke(int id, Object object, TransitiveClosure trace) {
189        /* By default we call a non-specialized fallback */
190        fallback(object, trace);
191      }
192    
193      /** Fallback */
194      public static void fallback(Object object, TransitiveClosure trace) {
195        ObjectReference objectRef = ObjectReference.fromObject(object);
196        RVMType type = ObjectModel.getObjectType(objectRef.toObject());
197        int[] offsets = type.getReferenceOffsets();
198        if (offsets != REFARRAY_OFFSET_ARRAY) {
199          if (VM.VerifyAssertions) VM._assert(type.isClassType() || (type.isArrayType() && !type.asArray().getElementType().isReferenceType()));
200          for(int i=0; i < offsets.length; i++) {
201            trace.processEdge(objectRef, objectRef.toAddress().plus(offsets[i]));
202          }
203        } else {
204          if (VM.VerifyAssertions) VM._assert(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).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    }