Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2012 Trillian AB
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/gpl-2.0.html>.
  */
 package org.robovm.compiler;
 
 
 import static org.robovm.compiler.Bro.*;
 import static org.robovm.compiler.Types.*;
 import static org.robovm.compiler.llvm.Type.*;
 
 
 import soot.VoidType;

Author(s):
niklas
 
 public class StructMemberMethodCompiler extends BroMethodCompiler {
 
     private StructureType structType;
     
     public StructMemberMethodCompiler(Config config) {
         super(config);
     }
 
     @Override
     public void reset(Clazz clazz) {
         super.reset(clazz);
          = null;
         if (isStruct()) {
              = getStructType();
         }
     }
     
     @Override
     protected void doCompile(ModuleBuilder moduleBuilderSootMethod method) {
         if ("_sizeOf".equals(method.getName()) || "sizeOf".equals(method.getName())) {
             structSizeOf(moduleBuildermethod);
         } else {
             structMember(moduleBuildermethod);
         }
     }
     
     private void structSizeOf(ModuleBuilder moduleBuilderSootMethod method) {
         Function fn = FunctionBuilder.structSizeOf(method);
         moduleBuilder.addFunction(fn);
         fn.add(new Ret(sizeof()));
     }
 
     private void structMember(ModuleBuilder moduleBuilderSootMethod method) {
         Function function = FunctionBuilder.structMember(method);
         moduleBuilder.addFunction(function);
         
         // Get the value of the handle field in the Struct base class and cast it to a <structType>*
         Variable handleI64 = function.newVariable();
         function.add(new Load(handleI64getFieldPtr(functionfunction.getParameterRef(1), 
                 offsetof(new StructureType(new StructureType()), 1, 0), )));
         Variable handlePtr = function.newVariable(new PointerType());
         function.add(new Inttoptr(handlePtrhandleI64.ref(), handlePtr.getType()));
         
         int offset = getStructMemberOffset(method) + 1; // Add 1 since the first type in structType is the superclass type or {}.      
         Type memberType = getStructMemberType(method);
         Variable memberPtr = function.newVariable(new PointerType(memberType));
         if (memberType != .getTypeAt(offset)) {
             // Several @StructMembers of different types have this offset (union)
             Variable tmp = function.newVariable(new PointerType(.getTypeAt(offset)));
             function.add(new Getelementptr(tmphandlePtr.ref(), 0, offset));
             function.add(new Bitcast(memberPtrtmp.ref(), memberPtr.getType()));
         } else {
             function.add(new Getelementptr(memberPtrhandlePtr.ref(), 0, offset));
        }
        
        VariableRef env = function.getParameterRef(0);
        if (method.getParameterCount() == 0) {
            // Getter
            Value result = loadValueForGetter(methodfunctionmemberTypememberPtr.ref(),
                    function.getParameterRef(0), .);
            function.add(new Ret(result));
            
        } else {
            // Setter
            
            Value value = function.getParameterRef(2); // 'env' is parameter 0, 'this' is at 1, the value we're interested in is at index 2
            storeValueForSetter(methodfunctionmemberTypememberPtr.ref(), env,
                    value.);
            
            if (method.getReturnType().equals(VoidType.v())) {
                function.add(new Ret());
            } else {
                function.add(new Ret(function.getParameterRef(1)));
            }
        }
    }
New to GrepCode? Check out our FAQ X