FibonacciMaker.java revision ff314e1f06b974be78de3356a71072dbf0a450cd
1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville/* 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Copyright (C) 2012 The Android Open Source Project 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * you may not use this file except in compliance with the License. 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * You may obtain a copy of the License at 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * http://www.apache.org/licenses/LICENSE-2.0 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * Unless required by applicable law or agreed to in writing, software 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * See the License for the specific language governing permissions and 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville * limitations under the License. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville */ 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepackage com.google.dexmaker.examples; 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.BinaryOp; 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.Code; 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.Comparison; 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.DexMaker; 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.Label; 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.Local; 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.MethodId; 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport com.google.dexmaker.TypeId; 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.io.File; 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.lang.reflect.Method; 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport java.lang.reflect.Modifier; 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillepublic final class FibonacciMaker { 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public static void main(String[] args) throws Exception { 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville DexMaker dexMaker = new DexMaker(); 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TypeId<?> fibonacci = TypeId.get("Lcom/google/dexmaker/examples/Fibonacci;"); 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville String fileName = "Fibonacci.generated"; 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville dexMaker.declare(fibonacci, fileName, Modifier.PUBLIC, TypeId.OBJECT); 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MethodId<?, Integer> fib = fibonacci.getMethod(TypeId.INT, "fib", TypeId.INT); 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Code code = dexMaker.declare(fib, Modifier.PUBLIC | Modifier.STATIC); 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> i = code.getParameter(0, TypeId.INT); 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> constant1 = code.newLocal(TypeId.INT); 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> constant2 = code.newLocal(TypeId.INT); 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> a = code.newLocal(TypeId.INT); 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> b = code.newLocal(TypeId.INT); 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> c = code.newLocal(TypeId.INT); 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> d = code.newLocal(TypeId.INT); 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Local<Integer> result = code.newLocal(TypeId.INT); 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville code.loadConstant(constant1, 1); 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville code.loadConstant(constant2, 2); 50 Label baseCase = code.newLabel(); 51 code.compare(Comparison.LT, baseCase, i, constant2); 52 code.op(BinaryOp.SUBTRACT, a, i, constant1); 53 code.op(BinaryOp.SUBTRACT, b, i, constant2); 54 code.invokeStatic(fib, c, a); 55 code.invokeStatic(fib, d, b); 56 code.op(BinaryOp.ADD, result, c, d); 57 code.returnValue(result); 58 code.mark(baseCase); 59 code.returnValue(i); 60 61 ClassLoader loader = dexMaker.generateAndLoad( 62 FibonacciMaker.class.getClassLoader(), getDataDirectory()); 63 Class<?> fibonacciClass = loader.loadClass("com.google.dexmaker.examples.Fibonacci"); 64 Method fibMethod = fibonacciClass.getMethod("fib", int.class); 65 System.out.println(fibMethod.invoke(null, 8)); 66 } 67 68 public static File getDataDirectory() throws Exception { 69 Class<?> environmentClass = Class.forName("android.os.Environment"); 70 Method method = environmentClass.getMethod("getDataDirectory"); 71 Object dataDirectory = method.invoke(null); 72 return (File) dataDirectory; 73 } 74} 75