10e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson/*
20e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Copyright (C) 2012 The Android Open Source Project
30e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson *
40e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
50e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * you may not use this file except in compliance with the License.
60e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * You may obtain a copy of the License at
70e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson *
80e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
90e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson *
100e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * Unless required by applicable law or agreed to in writing, software
110e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
120e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * See the License for the specific language governing permissions and
140e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson * limitations under the License.
150e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson */
160e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
17b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinpackage com.android.dx.examples;
18b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffin
19b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Code;
20b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Comparison;
21b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.DexMaker;
22b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Label;
23b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.Local;
24b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.MethodId;
25b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.TypeId;
26b8a5896885d4da2b798888b688a46df1adbf5b89Paul Duffinimport com.android.dx.BinaryOp;
270e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
280e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.io.File;
290e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.lang.reflect.Method;
300e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonimport java.lang.reflect.Modifier;
310e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
320e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilsonpublic final class FibonacciMaker {
330e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson    public static void main(String[] args) throws Exception {
340e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        TypeId<?> fibonacci = TypeId.get("Lcom/google/dexmaker/examples/Fibonacci;");
355692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson
360e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        String fileName = "Fibonacci.generated";
375692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson        DexMaker dexMaker = new DexMaker();
380e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        dexMaker.declare(fibonacci, fileName, Modifier.PUBLIC, TypeId.OBJECT);
390e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
400e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        MethodId<?, Integer> fib = fibonacci.getMethod(TypeId.INT, "fib", TypeId.INT);
410e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Code code = dexMaker.declare(fib, Modifier.PUBLIC | Modifier.STATIC);
425692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson
430e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> i = code.getParameter(0, TypeId.INT);
440e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> constant1 = code.newLocal(TypeId.INT);
450e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> constant2 = code.newLocal(TypeId.INT);
460e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> a = code.newLocal(TypeId.INT);
470e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> b = code.newLocal(TypeId.INT);
480e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> c = code.newLocal(TypeId.INT);
490e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> d = code.newLocal(TypeId.INT);
500e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Local<Integer> result = code.newLocal(TypeId.INT);
515692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson
520e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.loadConstant(constant1, 1);
530e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.loadConstant(constant2, 2);
5423abc2fe89ec3713645d64bdb74415a9090084f4Jesse Wilson        Label baseCase = new Label();
550e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.compare(Comparison.LT, baseCase, i, constant2);
560e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.op(BinaryOp.SUBTRACT, a, i, constant1);
570e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.op(BinaryOp.SUBTRACT, b, i, constant2);
580e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.invokeStatic(fib, c, a);
590e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.invokeStatic(fib, d, b);
600e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.op(BinaryOp.ADD, result, c, d);
610e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.returnValue(result);
620e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.mark(baseCase);
630e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        code.returnValue(i);
640e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
650e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        ClassLoader loader = dexMaker.generateAndLoad(
66ff314e1f06b974be78de3356a71072dbf0a450cdJesse Wilson                FibonacciMaker.class.getClassLoader(), getDataDirectory());
675692b3b0303c55524ff206dc7840ffdb1fa47628Jesse Wilson
680e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Class<?> fibonacciClass = loader.loadClass("com.google.dexmaker.examples.Fibonacci");
690e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        Method fibMethod = fibonacciClass.getMethod("fib", int.class);
700e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson        System.out.println(fibMethod.invoke(null, 8));
710e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson    }
720e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson
737ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef    public static File getDataDirectory() {
747ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef        String envVariable = "ANDROID_DATA";
757ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef        String defaultLoc = "/data";
767ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef        String path = System.getenv(envVariable);
777ff2c5291c7e0840ef62842372df0c2ecd5979f4Andrew Yousef        return path == null ? new File(defaultLoc) : new File(path);
780e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson    }
790e49fb9243b7463835ab80ef7cc62435f55846ceJesse Wilson}
80