1 dumi 1.5 // Realtime.java, created Sun Nov 12 14:42:50 2000 by wbeebee 2 dumi 1.5 // Copyright (C) 2000 Wes Beebee <wbeebee@mit.edu> 3 dumi 1.5 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 dumi 1.5 package harpoon.Analysis.Realtime; 5 dumi 1.5 6 wbeebee 1.8 import java.util.ArrayList; 7 dumi 1.5 import java.util.Collection; 8 wbeebee 1.8 import java.util.List; 9 dumi 1.5 import java.util.Set; 10 dumi 1.5 11 dumi 1.5 import harpoon.Analysis.Quads.ArrayInitRemover; 12 dumi 1.5 import harpoon.Analysis.ClassHierarchy; 13 wbeebee 1.8 import harpoon.Analysis.Tree.Canonicalize; 14 salcianu 1.13 import harpoon.Analysis.Quads.QuadClassHierarchy; 15 dumi 1.5 16 dumi 1.5 import harpoon.ClassFile.CachingCodeFactory; 17 dumi 1.5 import harpoon.ClassFile.Linker; 18 dumi 1.5 import harpoon.ClassFile.HClass; 19 dumi 1.5 import harpoon.ClassFile.HCodeFactory; 20 dumi 1.5 21 dumi 1.5 import harpoon.IR.Quads.QuadNoSSA; 22 dumi 1.5 23 dumi 1.5 import harpoon.Util.HClassUtil; 24 wbeebee 1.8 import harpoon.Util.ParseUtil; 25 dumi 1.5 import harpoon.Util.Util; 26 salcianu 1.13 import harpoon.Util.Options.Option; 27 salcianu 1.13 import harpoon.Main.CompilerStageEZ; 28 dumi 1.5 29 dumi 1.5 import harpoon.Backend.Generic.Frame; 30 salcianu 1.13 31 salcianu 1.13 import java.util.List; 32 salcianu 1.13 import java.util.LinkedList; 33 salcianu 1.13 34 dumi 1.5 /** 35 dumi 1.5 * <code>Realtime</code> is the top-level access point for the rest of the 36 dumi 1.5 * Harpoon compiler to provide support for the Realtime Java MemoryArea 37 dumi 1.5 * extensions described in the 38 dumi 1.5 * <a href= 39 dumi 1.5 * "http://java.sun.com/aboutJava/communityprocess/first/jsr001/rtj.pdf"> 40 dumi 1.5 * Realtime Java Specification</a> and there's also a 41 dumi 1.5 * <a href="http://tao.doc.wustl.edu/rtj/api/index.html">JavaDoc version</a>. 42 dumi 1.5 * 43 dumi 1.5 * @author Wes Beebee <wbeebee@mit.edu> 44 cananian 1.16 * @version $Id: Realtime.java,v 1.16 2004/02/08 01:53:47 cananian Exp $ 45 dumi 1.5 */ 46 dumi 1.5 47 dumi 1.5 public class Realtime { 48 wbeebee 1.12 /** Is Realtime JAVA support turned on? */ 49 wbeebee 1.12 public static boolean REALTIME_JAVA = false; 50 wbeebee 1.12 51 wbeebee 1.12 /** Remove tagging when you remove all checks? */ 52 wbeebee 1.12 public static boolean REMOVE_TAGS = true; 53 wbeebee 1.12 54 wbeebee 1.12 /** Add support for realtime threads */ 55 wbeebee 1.12 public static boolean REALTIME_THREADS = false; 56 wbeebee 1.12 57 wbeebee 1.12 /** Add support for CheckQuanta */ 58 wbeebee 1.12 public static boolean REALTIME_THREADS_PREEMPT = false; 59 dumi 1.5 60 wbeebee 1.9 /** Add support for RTJPerf */ 61 wbeebee 1.12 public static boolean RTJ_PERF = false; 62 wbeebee 1.9 63 wbeebee 1.12 /** Determine which analysis method to use. */ 64 wbeebee 1.12 public static int ANALYSIS_METHOD = 0; 65 wbeebee 1.12 /** Very conservative analysis method - keep all checks */ 66 wbeebee 1.12 public static final int SIMPLE = 0; 67 wbeebee 1.12 /** Pointer analysis to determine whether checks can be removed */ 68 dumi 1.5 public static final int CHEESY_POINTER_ANALYSIS = 1; 69 wbeebee 1.12 /** More complicated pointer analysis to determine which checks to 70 wbeebee 1.12 * remove. 71 wbeebee 1.12 */ 72 wbeebee 1.12 public static final int REAL_POINTER_ANALYSIS = 2; 73 wbeebee 1.12 /** Overly aggressive (and wrong!) check removal that removes all checks. 74 wbeebee 1.12 */ 75 wbeebee 1.12 public static final int ALL = 3; 76 wbeebee 1.12 77 wbeebee 1.12 /** Add code to the executable to enable gathering of runtime statistics. 78 wbeebee 1.12 */ 79 wbeebee 1.12 public static boolean COLLECT_RUNTIME_STATS = false; 80 wbeebee 1.12 81 wbeebee 1.12 /** Add checks to determine if a <code>NoHeapRealtimeThread</code> is 82 wbeebee 1.12 * touching the heap. 83 wbeebee 1.12 */ 84 wbeebee 1.12 public static boolean NOHEAP_CHECKS = false; 85 wbeebee 1.12 86 wbeebee 1.12 /** Add masking support, but no checks */ 87 wbeebee 1.12 public static boolean NOHEAP_MASK = false; 88 wbeebee 1.12 89 wbeebee 1.12 /** Add additional information on calls to RTJ_malloc to store information 90 wbeebee 1.12 * about the def. points of all objects which are allocated. 91 wbeebee 1.12 */ 92 wbeebee 1.12 public static boolean DEBUG_REF = false; 93 wbeebee 1.12 94 wbeebee 1.12 /** Configure Realtime Java based on the following command-line options. 95 wbeebee 1.12 */ 96 wbeebee 1.12 public static void configure(String options) { 97 wbeebee 1.12 String opts = options.toLowerCase(); 98 wbeebee 1.12 System.out.print("RTJ: on, noheap: "); 99 wbeebee 1.12 REALTIME_JAVA = true; 100 wbeebee 1.12 if (opts.indexOf("noheap_checks")!=-1) { 101 wbeebee 1.12 NOHEAP_CHECKS = true; 102 wbeebee 1.12 System.out.print("checks"); 103 wbeebee 1.12 } else if (opts.indexOf("noheap")!=-1) { 104 wbeebee 1.12 NOHEAP_MASK = true; 105 wbeebee 1.12 System.out.print("no checks"); 106 wbeebee 1.12 } else { 107 wbeebee 1.12 System.out.print("no support"); 108 wbeebee 1.12 } 109 wbeebee 1.12 System.out.print(", DEBUG_REF: "); 110 wbeebee 1.12 if (opts.indexOf("debug_ref")!=-1) { 111 wbeebee 1.12 DEBUG_REF = true; 112 wbeebee 1.12 System.out.print("yes"); 113 wbeebee 1.12 } else { 114 wbeebee 1.12 System.out.print("no"); 115 wbeebee 1.12 } 116 wbeebee 1.12 System.out.print(", Collect Statistics: "); 117 wbeebee 1.12 if (opts.indexOf("stats")!=-1) { 118 dumi 1.5 System.out.print("yes"); 119 dumi 1.5 COLLECT_RUNTIME_STATS = true; 120 wbeebee 1.12 } else { 121 dumi 1.5 System.out.print("no"); 122 wbeebee 1.12 } 123 wbeebee 1.12 System.out.print(", Analysis Method: "); 124 wbeebee 1.12 if (opts.indexOf("simple")!=-1) { 125 dumi 1.5 ANALYSIS_METHOD = SIMPLE; 126 dumi 1.5 System.out.print("simple"); 127 wbeebee 1.12 } else if (opts.indexOf("cheesy")!=-1) { 128 dumi 1.5 ANALYSIS_METHOD = CHEESY_POINTER_ANALYSIS; 129 dumi 1.5 System.out.print("cheesy"); 130 wbeebee 1.12 } else if (opts.indexOf("realpa")!=-1) { 131 dumi 1.5 ANALYSIS_METHOD = REAL_POINTER_ANALYSIS; 132 dumi 1.5 System.out.print("realpa"); 133 wbeebee 1.12 } else if (opts.indexOf("all")!=-1) { 134 dumi 1.5 System.out.print("all, Remove Tags: "); 135 dumi 1.5 if (opts.indexOf("keeptags")!=-1) { 136 wbeebee 1.12 System.out.print("no"); 137 wbeebee 1.12 REMOVE_TAGS = false; 138 dumi 1.5 } else { 139 wbeebee 1.12 System.out.print("yes"); 140 dumi 1.5 } 141 dumi 1.5 ANALYSIS_METHOD = ALL; 142 wbeebee 1.12 } else { 143 wbeebee 1.12 System.out.println(); 144 dumi 1.5 assert false : "Please specify an analysis method."; 145 wbeebee 1.12 } 146 wbeebee 1.12 System.out.print(", Realtime threads: "); 147 wbeebee 1.12 if (opts.indexOf("threads")!=-1) { 148 wbeebee 1.12 REALTIME_THREADS = true; 149 wbeebee 1.12 if (opts.indexOf("preempt")!=-1) { 150 wbeebee 1.12 REALTIME_THREADS_PREEMPT = true; 151 wbeebee 1.12 System.out.print("preempt"); 152 wbeebee 1.12 } else { 153 wbeebee 1.12 System.out.print("non-preempt"); 154 wbeebee 1.12 } 155 wbeebee 1.12 } else { 156 wbeebee 1.12 System.out.print("no"); 157 wbeebee 1.12 } 158 wbeebee 1.12 System.out.print(", RTJ Perf: "); 159 wbeebee 1.12 if (opts.indexOf("rtj_perf")!=-1) { 160 wbeebee 1.12 RTJ_PERF = true; 161 wbeebee 1.12 System.out.println("yes"); 162 wbeebee 1.12 } else { 163 wbeebee 1.12 System.out.println("no"); 164 wbeebee 1.12 } 165 wbeebee 1.12 } 166 wbeebee 1.12 167 wbeebee 1.12 /** Creates a field memoryArea on <code>java.lang.Object</code>. 168 wbeebee 1.12 * Since primitive arrays inherit from <code>java.lang.Object</code>, 169 wbeebee 1.12 * this catches them as well. 170 wbeebee 1.12 */ 171 wbeebee 1.12 172 wbeebee 1.12 public static void setupObject(Linker linker) { 173 wbeebee 1.12 // special hack to make setupObject idempotent 174 wbeebee 1.12 // find something better 175 wbeebee 1.12 if(setupObject_WAS_CALLED) { 176 dumi 1.5 System.out.println("Warning: setupObject called again -> ignored"); 177 dumi 1.5 return; 178 wbeebee 1.12 } 179 wbeebee 1.12 setupObject_WAS_CALLED = true; 180 wbeebee 1.12 Stats.realtimeBegin(); 181 wbeebee 1.12 // Adds javax.realtime.MemoryArea java.lang.Object.memoryArea 182 wbeebee 1.12 linker.forName("java.lang.Object").getMutator() 183 dumi 1.5 .addDeclaredField("memoryArea", 184 wbeebee 1.12 linker.forName("javax.realtime.MemoryArea")); 185 wbeebee 1.12 Stats.realtimeEnd(); 186 wbeebee 1.12 } 187 wbeebee 1.12 private static boolean setupObject_WAS_CALLED = false; 188 wbeebee 1.12 189 wbeebee 1.12 /** Adds all methods required for RTJ in the rootset, including: 190 wbeebee 1.12 * <ul> 191 wbeebee 1.12 * <li>javax.realtime.RealtimeThread(java.lang.ThreadGroup, 192 wbeebee 1.12 * java.lang.Runnable, 193 wbeebee 1.12 * java.lang.String)</li> 194 wbeebee 1.12 * <li>javax.realtime.RealtimeThread.getMemoryArea()</li> 195 wbeebee 1.12 * <li>javax.realtime.RealtimeThread.currentRealtimeThread()</li> 196 wbeebee 1.12 * <li>java.lang.Thread.setPriority(int)</li> 197 wbeebee 1.12 * <li>javax.realtime.MemoryArea.checkAccess(java.lang.Object)</li> 198 wbeebee 1.12 * <li>javax.realtime.MemoryArea.bless(java.lang.Object)</li> 199 wbeebee 1.12 * <li>javax.realtime.MemoryArea.bless(java.lang.Object, int[])</li> 200 wbeebee 1.12 * </ul> 201 wbeebee 1.12 */ 202 wbeebee 1.12 203 wbeebee 1.12 private static String resourcePath(String fileName) { 204 wbeebee 1.12 return "harpoon/Analysis/Realtime/"+fileName+".properties"; 205 wbeebee 1.12 } 206 dumi 1.5 207 wbeebee 1.12 public static Collection getRoots(final Linker linker) { 208 wbeebee 1.12 final List roots = new ArrayList(); 209 wbeebee 1.12 210 wbeebee 1.12 try { 211 wbeebee 1.12 // Read in all method roots for RTJ base 212 wbeebee 1.12 ParseUtil.readResource(resourcePath("realtime-method"), 213 wbeebee 1.12 new ParseUtil.StringParser() { 214 wbeebee 1.12 public void parseString(String s) 215 wbeebee 1.12 throws ParseUtil.BadLineException { 216 wbeebee 1.8 roots.add(ParseUtil.parseMethod(linker, s)); 217 wbeebee 1.12 } 218 wbeebee 1.12 }); 219 wbeebee 1.12 220 wbeebee 1.12 // Read in all class roots for RTJ base 221 wbeebee 1.12 ParseUtil.readResource(resourcePath("realtime-class"), 222 wbeebee 1.12 new ParseUtil.StringParser() { 223 wbeebee 1.12 public void parseString(String s) 224 wbeebee 1.12 throws ParseUtil.BadLineException { 225 wbeebee 1.12 roots.add(linker.forDescriptor(s)); 226 wbeebee 1.12 } 227 wbeebee 1.12 }); 228 wbeebee 1.12 229 wbeebee 1.12 230 wbeebee 1.12 if (COLLECT_RUNTIME_STATS) { 231 wbeebee 1.12 // Read in all method roots for calculating object memalloc statistics 232 wbeebee 1.12 ParseUtil.readResource(resourcePath("stats-method"), 233 wbeebee 1.12 new ParseUtil.StringParser() { 234 wbeebee 1.12 public void parseString(String s) 235 wbeebee 1.8 throws ParseUtil.BadLineException { 236 wbeebee 1.12 roots.add(ParseUtil.parseMethod(linker, s)); 237 wbeebee 1.12 } 238 wbeebee 1.12 }); 239 wbeebee 1.12 } 240 wbeebee 1.12 241 wbeebee 1.12 if (REALTIME_THREADS) { 242 wbeebee 1.12 // Read in all method roots for RTJ thread support 243 wbeebee 1.12 ParseUtil.readResource(resourcePath("thread-method"), 244 wbeebee 1.12 new ParseUtil.StringParser() { 245 wbeebee 1.12 public void parseString(String s) 246 wbeebee 1.12 throws ParseUtil.BadLineException { 247 wbeebee 1.12 roots.add(ParseUtil.parseMethod(linker, s)); 248 wbeebee 1.12 } 249 wbeebee 1.12 }); 250 wbeebee 1.12 } 251 wbeebee 1.12 252 wbeebee 1.12 if (RTJ_PERF) { 253 wbeebee 1.9 // Read in all method roots for RTJPerf support 254 wbeebee 1.12 ParseUtil.readResource(resourcePath("rtjperf-method"), 255 wbeebee 1.12 new ParseUtil.StringParser() { 256 wbeebee 1.12 public void parseString(String s) 257 wbeebee 1.12 throws ParseUtil.BadLineException { 258 wbeebee 1.12 roots.add(ParseUtil.parseMethod(linker, s)); 259 wbeebee 1.12 } 260 wbeebee 1.12 }); 261 wbeebee 1.12 } 262 wbeebee 1.12 263 wbeebee 1.12 } catch (java.io.IOException e) { 264 wbeebee 1.12 assert false : "Properties file for RTJ error: "+e; 265 wbeebee 1.12 } 266 wbeebee 1.12 267 wbeebee 1.12 return roots; 268 wbeebee 1.12 } 269 wbeebee 1.12 270 wbeebee 1.12 /** Adds realtime support to a block of code using an 271 wbeebee 1.12 * <code>harpoon.ClassFile.HCodeFactory</code>. This includes 272 wbeebee 1.12 * all of the pre-analysis modifications: 273 wbeebee 1.12 * <ul> 274 wbeebee 1.12 * <li> Makes sure that all classes that inherited from 275 wbeebee 1.12 * <code>java.lang.Thread</code> now inherit from 276 wbeebee 1.12 * <code>javax.realtime.RealtimeThread</code>. </li> 277 wbeebee 1.12 * <li> Makes every new <code>java.lang.Thread</code> into a new 278 wbeebee 1.12 * <code>javax.realtime.RealtimeThread</code>. </li> 279 wbeebee 1.12 * </ul> 280 wbeebee 1.12 */ 281 wbeebee 1.12 282 wbeebee 1.12 public static HCodeFactory setupCode(final Linker linker, 283 wbeebee 1.12 final ClassHierarchy ch, 284 wbeebee 1.12 final HCodeFactory parent) { 285 wbeebee 1.12 Stats.realtimeBegin(); 286 wbeebee 1.12 HCodeFactory hcf = Stats.trackQuadsIn(parent); 287 wbeebee 1.12 ThreadToRealtimeThread.updateClassHierarchy(linker, ch); 288 wbeebee 1.12 hcf = (new ThreadToRealtimeThread(hcf, linker)).codeFactory(); 289 wbeebee 1.12 if ((!REMOVE_TAGS)||(ANALYSIS_METHOD!=ALL)) { 290 dumi 1.5 hcf = new ArrayInitRemover(hcf).codeFactory(); 291 dumi 1.5 } 292 wbeebee 1.12 hcf = new CachingCodeFactory(hcf); 293 wbeebee 1.12 Stats.realtimeEnd(); 294 wbeebee 1.12 return hcf; 295 wbeebee 1.12 } 296 wbeebee 1.12 297 wbeebee 1.12 /** Adds realtime support to a block of code using an 298 wbeebee 1.12 * <code>harpoon.ClassFile.HCodeFactory</code>. This includes the 299 wbeebee 1.12 * analysis and all of the post-analysis modifications. 300 wbeebee 1.12 * <ul> 301 wbeebee 1.12 * <li> Attaches the current memory area to every new array and 302 wbeebee 1.12 * new object (sets the field <code>Object.memoryArea</code>).</li> 303 wbeebee 1.12 * <li> Wraps checks around <code>harpoon.IR.Quads.SET</code>s and 304 wbeebee 1.12 * <code>harpoon.IR.Quads.ASET</code>s. </li> 305 wbeebee 1.12 * </ul> 306 wbeebee 1.12 */ 307 wbeebee 1.12 308 wbeebee 1.12 public static HCodeFactory addChecks(Linker linker, 309 wbeebee 1.12 ClassHierarchy ch, 310 wbeebee 1.12 HCodeFactory parent, 311 wbeebee 1.12 Set roots) { 312 wbeebee 1.12 Stats.realtimeBegin(); 313 wbeebee 1.12 CheckRemoval cr = null; 314 wbeebee 1.12 Stats.analysisBegin(); 315 wbeebee 1.12 switch (ANALYSIS_METHOD) { 316 wbeebee 1.12 case SIMPLE: { 317 wbeebee 1.12 cr = new SimpleCheckRemoval(); 318 wbeebee 1.12 break; 319 wbeebee 1.12 } 320 wbeebee 1.12 case CHEESY_POINTER_ANALYSIS: { 321 wbeebee 1.12 CachingCodeFactory ccf = 322 wbeebee 1.12 new CachingCodeFactory(QuadNoSSA.codeFactory(parent)); 323 wbeebee 1.12 cr = new CheesyPACheckRemoval(linker, ch, ccf, roots); 324 wbeebee 1.12 break; 325 wbeebee 1.12 } 326 wbeebee 1.12 case REAL_POINTER_ANALYSIS: { 327 wbeebee 1.12 cr = new PACheckRemoval(linker, ch, parent, roots); 328 wbeebee 1.12 break; 329 wbeebee 1.12 } 330 wbeebee 1.12 case ALL: { 331 wbeebee 1.12 cr = new AllCheckRemoval(); 332 wbeebee 1.12 break; 333 wbeebee 1.12 } 334 wbeebee 1.12 default: { 335 wbeebee 1.12 assert false : "No RTJ analysis method specified."; 336 wbeebee 1.12 } 337 wbeebee 1.12 } 338 wbeebee 1.12 Stats.analysisEnd(); 339 wbeebee 1.12 HCodeFactory hcf; 340 wbeebee 1.12 if (REMOVE_TAGS&&(ANALYSIS_METHOD==ALL)) { 341 dumi 1.5 hcf = parent; 342 wbeebee 1.12 } else { 343 dumi 1.5 hcf = CheckAdder.codeFactory(cr, new AllCheckRemoval(), parent); 344 dumi 1.5 } 345 wbeebee 1.12 hcf = Stats.trackQuadsOut(hcf); 346 wbeebee 1.12 Stats.realtimeEnd(); 347 wbeebee 1.12 return hcf; 348 wbeebee 1.12 } 349 wbeebee 1.12 350 wbeebee 1.12 /** Add checks to see if a <code>NoHeapRealtimeThread</code> 351 wbeebee 1.12 * illegally touches the heap. 352 wbeebee 1.12 */ 353 wbeebee 1.12 public static HCodeFactory addNoHeapChecks(HCodeFactory hcf) { 354 wbeebee 1.12 if (NOHEAP_CHECKS) { 355 dumi 1.5 return (new HeapCheckAdder()).codeFactory(hcf); 356 dumi 1.5 } 357 wbeebee 1.12 return hcf; 358 wbeebee 1.12 } 359 wbeebee 1.12 360 wbeebee 1.12 /** Add code to check to see if a realtime thread quanta 361 wbeebee 1.12 * has passed to determine whether to do a user-thread-level 362 wbeebee 1.12 * context switch. 363 wbeebee 1.12 */ 364 wbeebee 1.12 365 wbeebee 1.12 public static HCodeFactory addQuantaChecker(HCodeFactory hcf) { 366 wbeebee 1.12 if (REALTIME_THREADS&&(!REALTIME_THREADS_PREEMPT)) { 367 wbeebee 1.12 return Canonicalize.codeFactory((new QuantaChecker(hcf)) 368 wbeebee 1.12 .codeFactory()); 369 dumi 1.5 } 370 wbeebee 1.12 return hcf; 371 wbeebee 1.12 } 372 wbeebee 1.12 373 wbeebee 1.12 374 wbeebee 1.12 /** Print statistics about the static analysis and addition of 375 wbeebee 1.12 * Realtime support. */ 376 dumi 1.5 377 wbeebee 1.12 public static void printStats() { 378 wbeebee 1.12 Stats.print(); 379 salcianu 1.13 } 380 salcianu 1.13 381 salcianu 1.13 382 salcianu 1.13 public static class QuadPass extends CompilerStageEZ { 383 salcianu 1.13 public QuadPass() { super("realtime-quad-pass"); } 384 salcianu 1.13 385 salcianu 1.13 public List/*<Option>*/ getOptions() { 386 salcianu 1.13 List/*<Option>*/ opts = new LinkedList/*<Option>*/(); 387 salcianu 1.13 388 salcianu 1.15 opts.add(new Option("t", "", "<RTJOptions>", 389 salcianu 1.15 "Turns on Realtime Java extensions with the options given in the optional argument <RTJOptions>") { 390 salcianu 1.13 public void action() { 391 salcianu 1.13 Realtime.configure(getOptionalArg(0)); 392 salcianu 1.13 } 393 salcianu 1.13 }); 394 salcianu 1.13 395 salcianu 1.13 return opts; 396 salcianu 1.13 } 397 salcianu 1.13 398 salcianu 1.14 public boolean enabled() { return REALTIME_JAVA; } 399 salcianu 1.13 400 salcianu 1.13 protected void real_action() { 401 salcianu 1.13 hcf = Realtime.setupCode(linker, classHierarchy, hcf); 402 salcianu 1.13 classHierarchy = new QuadClassHierarchy(linker, roots, hcf); 403 salcianu 1.13 hcf = Realtime.addChecks(linker, classHierarchy, hcf, roots); 404 salcianu 1.13 } 405 salcianu 1.13 } 406 salcianu 1.13 407 salcianu 1.13 public static class TreePass extends CompilerStageEZ { 408 salcianu 1.13 public TreePass() { super("realtime-tree-pass"); } 409 salcianu 1.14 public boolean enabled() { return REALTIME_JAVA; } 410 salcianu 1.13 411 salcianu 1.13 protected void real_action() { 412 salcianu 1.13 hcf = Realtime.addNoHeapChecks(hcf); 413 salcianu 1.13 hcf = Realtime.addQuantaChecker(hcf); 414 salcianu 1.13 hcf = harpoon.Analysis.Tree.DerivationChecker.codeFactory(hcf); 415 salcianu 1.13 hcf = new CachingCodeFactory(hcf); 416 salcianu 1.13 } 417 wbeebee 1.12 } 418 cananian 1.16 }