Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2003-2007 the original author or authors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.codehaus.groovy.control;
 
 import  org.objectweb.asm.Opcodes;
 
 import java.util.*;

Visitor to produce several optimizations - to replace numbered constants with references to static fields

Author(s):
Alex Tkachman
 
     private ClassNode currentClass;
     private SourceUnit source;
 
     private Map const2Var = new HashMap();
     private List missingFields = new LinkedList();
 
     public OptimizerVisitor(CompilationUnit cu) {
     }
 
     public void visitClass(ClassNode nodeSourceUnit source) {
         this. = node;
         this. = source;
         .clear();
         .clear();
         super.visitClass(node);
         addMissingFields();
     }
 
     private void addMissingFields() {
         for (Iterator it = .iterator(); it.hasNext(); ) {
             FieldNode f = (FieldNodeit.next();
             .addField(f);
         }
     }
 
     private void setConstField(ConstantExpression constantExpression) {
         final Object n = constantExpression.getValue();
         if (!(n instanceof Number || n instanceof Character)) return;
         FieldNode field = (FieldNode.get(n);
         if (field!=null) {
             constantExpression.setConstantName(field.getName());
             return;
         }
         final String name = "$const$" + .size();
         //TODO: this part here needs a bit of rethinking. If it can happen that the field is defined already,
         //      then is this code still valid?
         field = .getDeclaredField(name);
         if (field==null) {
             field = new FieldNode(name,
                     Opcodes.ACC_PRIVATE|Opcodes.ACC_STATIC|Opcodes.ACC_SYNTHETIC| Opcodes.ACC_FINAL,
                     constantExpression.getType(),
                     ,
                     constantExpression
                     );
             field.setSynthetic(true);
             .add(field);
         }
         constantExpression.setConstantName(field.getName());
         .put(nfield);
     }
 
     public Expression transform(Expression exp) {
         if (exp == nullreturn null;
         if (!.isInterface() && exp.getClass() == ConstantExpression.class) {
             setConstField((ConstantExpression)exp);
         }
         return exp.transformExpression(this);
     }
 
     protected SourceUnit getSourceUnit() {
         return ;
     }
 
     public void visitClosureExpression(ClosureExpression expression) {
     	/*
    	 * GROOVY-3339 - do nothing - so that numbers don't get replaced by cached constants in closure classes
    	 */
    }
New to GrepCode? Check out our FAQ X