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