JniCodeEmitter.java revision 6cbca50b6a438151a6c5f4dbdccc7057c19b73fa
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.io.PrintStream;
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.ArrayList;
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.HashSet;
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.Iterator;
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.List;
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/**
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Emits a Java interface and Java & C implementation for a C function.
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * <p> The Java interface will have Buffer and array variants for functions that
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * have a typed pointer argument.  The array variant will convert a single "<type> *data"
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * argument to a pair of arguments "<type>[] data, int offset".
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic class JniCodeEmitter implements CodeEmitter {
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If true, use C++ style for calling through a JNIEnv *:
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // env->Func(...)
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // If false, use C style:
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // (*env)->Func(env, ...)
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static final boolean mUseCPlusPlus = true;
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean mUseContextPointer = true;
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String mClassPathName;
256cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    ParameterChecker mChecker;
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJava10InterfaceStream;
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJava10ExtInterfaceStream;
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJava11InterfaceStream;
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJava11ExtInterfaceStream;
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJava11ExtPackInterfaceStream;
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJavaImplStream;
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mCStream;
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    PrintStream mJavaInterfaceStream;
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    List<String> nativeRegistrations = new ArrayList<String>();
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean needsExit;
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    static String indent = "    ";
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    HashSet<String> mFunctionsEmitted = new HashSet<String>();
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param java10InterfaceStream the PrintStream to which to emit the Java interface for GL 1.0 functions
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param java10ExtInterfaceStream the PrintStream to which to emit the Java interface for GL 1.0 extension functions
486cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich     * @param java11InterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 functions
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param java11ExtInterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 Extension functions
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param java11ExtPackInterfaceStream the PrintStream to which to emit the Java interface for GL 1.1 Extension Pack functions
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param javaImplStream the PrintStream to which to emit the Java implementation
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * @param cStream the PrintStream to which to emit the C implementation
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public JniCodeEmitter(String classPathName,
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          ParameterChecker checker,
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream java10InterfaceStream,
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream java10ExtInterfaceStream,
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream java11InterfaceStream,
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream java11ExtInterfaceStream,
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream java11ExtPackInterfaceStream,
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream javaImplStream,
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          PrintStream cStream,
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          boolean useContextPointer) {
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mClassPathName = classPathName;
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mChecker = checker;
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJava10InterfaceStream = java10InterfaceStream;
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJava10ExtInterfaceStream = java10ExtInterfaceStream;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJava11InterfaceStream = java11InterfaceStream;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJava11ExtInterfaceStream = java11ExtInterfaceStream;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJava11ExtPackInterfaceStream = java11ExtPackInterfaceStream;
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mJavaImplStream = javaImplStream;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream = cStream;
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mUseContextPointer = useContextPointer;
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void setVersion(int version, boolean ext, boolean pack) {
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (version == 0) {
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mJavaInterfaceStream = ext ? mJava10ExtInterfaceStream :
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                mJava10InterfaceStream;
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (version == 1) {
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mJavaInterfaceStream = ext ?
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                (pack ? mJava11ExtPackInterfaceStream :
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                 mJava11ExtInterfaceStream) :
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                mJava11InterfaceStream;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            throw new RuntimeException("Bad version: " + version);
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitCode(CFunc cfunc, String original) {
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        JFunc jfunc;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature;
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean duplicate;
946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (cfunc.hasTypedPointerArg()) {
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc = JFunc.convert(cfunc, true);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Don't emit duplicate functions
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // These may appear because they are defined in multiple
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Java interfaces (e.g., GL11/GL11ExtensionPack)
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature = jfunc.toString();
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            duplicate = false;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mFunctionsEmitted.contains(signature)) {
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                duplicate = true;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                mFunctionsEmitted.add(signature);
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!duplicate) {
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                emitNativeDeclaration(jfunc, mJavaImplStream);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                emitJavaCode(jfunc, mJavaImplStream);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            emitJavaInterfaceCode(jfunc, mJavaInterfaceStream);
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!duplicate) {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                emitJniCode(jfunc, mCStream);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        jfunc = JFunc.convert(cfunc, false);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = jfunc.toString();
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        duplicate = false;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mFunctionsEmitted.contains(signature)) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            duplicate = true;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mFunctionsEmitted.add(signature);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!duplicate) {
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            emitNativeDeclaration(jfunc, mJavaImplStream);
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitJavaInterfaceCode(jfunc, mJavaInterfaceStream);
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!duplicate) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            emitJavaCode(jfunc, mJavaImplStream);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            emitJniCode(jfunc, mCStream);
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitNativeDeclaration(JFunc jfunc, PrintStream out) {
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("    // C function " + jfunc.getCFunc().getOriginal());
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, true, false);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJavaInterfaceCode(JFunc jfunc, PrintStream out) {
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, false, true);
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJavaCode(JFunc jfunc, PrintStream out) {
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, false, false);
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitFunctionCall(JFunc jfunc, PrintStream out, String iii, boolean grabArray ) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = jfunc.getType().isVoid();
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isPointerFunc = jfunc.getName().endsWith("Pointer") &&
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getCFunc().hasPointerArg();
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(iii +
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " _returnValue;");
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii +
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (isVoid ? "" : "_returnValue = ") +
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    jfunc.getName() +
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (isPointerFunc ? "Bounds" : "" ) +
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "(");
1686cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (grabArray && argType.isTypedBuffer()) {
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typeName = argType.getBaseType();
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                typeName = typeName.substring(9, typeName.length() - 6);
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(iii + indent + "get" + typeName + "Array(" + argName + "),");
1786cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                out.print(iii + indent + "getOffset(" + argName + ")");
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(iii + indent + argName);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc) {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + argName + ".remaining()");
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1936cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + ");");
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void printIfcheckPostamble(PrintStream out, boolean isBuffer,
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               boolean emitExceptionCheck, String iii) {
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                              "offset", "_remaining", iii);
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void printIfcheckPostamble(PrintStream out, boolean isBuffer,
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               boolean emitExceptionCheck,
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                               String offset, String remaining, String iii) {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "    default:");
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "        _needed = 0;");
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "        break;");
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "}");
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "if (" + remaining + " < _needed) {");
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(iii + indent + "_exception = 1;");
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + indent +
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (mUseCPlusPlus ? "_env" : "(*_env)") +
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "->ThrowNew(" +
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (mUseCPlusPlus ? "" : "_env, ") +
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "IAEClass, " +
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "\"" +
2216cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                    (isBuffer ?
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                     "remaining()" : "length - " + offset) +
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    " < needed\");");
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + indent + "goto exit;");
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        needsExit = true;
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + "}");
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isNullAllowed(CFunc cfunc) {
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("return")) {
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 2;
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].startsWith("check")) {
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 3;
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("ifcheck")) {
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 5;
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("unsupported")) {
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("nullAllowed")) {
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.out.println("Error: unknown keyword \"" +
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                       checks[index] + "\"");
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.exit(0);
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getErrorReturnValue(CFunc cfunc) {
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isVoid) {
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return null;
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("return")) {
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return checks[index + 1];
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].startsWith("check")) {
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 3;
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("ifcheck")) {
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 5;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("unsupported")) {
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("nullAllowed")) {
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.out.println("Error: unknown keyword \"" +
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                       checks[index] + "\"");
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.exit(0);
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return null;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isUnsupportedFunc(CFunc cfunc) {
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("unsupported")) {
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("return")) {
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 2;
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].startsWith("check")) {
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 3;
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("ifcheck")) {
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 5;
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("nullAllowed")) {
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.out.println("Error: unknown keyword \"" +
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                       checks[index] + "\"");
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.exit(0);
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out,
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                boolean isBuffer, boolean emitExceptionCheck,
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                String offset, String remaining, String iii) {
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String checkVar;
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String retval = getErrorReturnValue(cfunc);
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean lastWasIfcheck = false;
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean remainingDeclared = false;
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean nullCheckDeclared = false;
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean offsetChecked = false;
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].startsWith("check")) {
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (lastWasIfcheck) {
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                              offset, remaining, iii);
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    lastWasIfcheck = false;
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (cname != null && !cname.equals(checks[index + 1])) {
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        index += 3;
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        continue;
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (" + remaining + " < " +
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                checks[index + 2] +
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ") {");
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (emitExceptionCheck) {
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(iii + indent + "_exception = 1;");
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
3466cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            String exceptionClassName = "IAEClass";
3476cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            // If the "check" keyword was of the form
3486cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            // "check_<class name>", use the class name in the
3496cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            // exception to be thrown
3506cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            int underscore = checks[index].indexOf('_');
3516cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            if (underscore >= 0) {
3526cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            exceptionClassName = checks[index].substring(underscore + 1) + "Class";
3536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich            }
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent +
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ThrowNew(" +
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "" : "_env, ") +
3586cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                exceptionClassName + ", " +
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "\"" +
3606cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (isBuffer ?
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                 "remaining()" : "length - " + offset) +
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " < " + checks[index + 2] +
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "\");");
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "goto exit;");
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
3686cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 3;
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("ifcheck")) {
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String[] matches = checks[index + 4].split(",");
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!lastWasIfcheck) {
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(iii + "int _needed;");
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(iii +
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "switch (" +
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    checks[index + 3] +
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    ") {");
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
3806cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    for (int i = 0; i < matches.length; i++) {
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println("#if defined(" + matches[i] + ")");
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(iii +
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "    case " +
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    matches[i] +
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    ":");
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println("#endif // defined(" + matches[i] + ")");
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii +
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "        _needed = " +
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                checks[index + 2] +
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ";");
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii +
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "        break;");
3956cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    lastWasIfcheck = true;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 5;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("return")) {
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // ignore
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 2;
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("unsupported")) {
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // ignore
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (checks[index].equals("nullAllowed")) {
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // ignore
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    index += 1;
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.out.println("Error: unknown keyword \"" +
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                       checks[index] + "\"");
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    System.exit(0);
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (lastWasIfcheck) {
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii);
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean hasNonConstArg(JFunc jfunc, CFunc cfunc,
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<Integer> nonPrimitiveArgs) {
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
4406cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Emit a function in several variants:
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if nativeDecl: public native <returntype> func(args);
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if !nativeDecl:
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if interfaceDecl:  public <returntype> func(args);
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if !interfaceDecl: public <returntype> func(args) { body }
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitFunction(JFunc jfunc,
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                      PrintStream out,
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                      boolean nativeDecl, boolean interfaceDecl) {
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isPointerFunc =
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getName().endsWith("Pointer") &&
455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getCFunc().hasPointerArg();
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!nativeDecl && !interfaceDecl && !isPointerFunc) {
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // If it's not a pointer function, we've already emitted it
459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // with nativeDecl == true
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "private native " :
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                         (interfaceDecl ? "" : "public ")) +
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "Bounds" : "") +
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "public native " :
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                         (interfaceDecl ? "" : "public ")) +
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
4796cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
4846cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + indent + argType + " " + argName);
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc && nativeDecl) {
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + "int remaining");
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nativeDecl || interfaceDecl) {
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ") {");
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String iii = indent + indent;
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String fname = jfunc.getName();
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isPointerFunc) {
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // TODO - deal with VBO variants
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (fname.equals("glColorPointer")) {
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if ((size == 4) &&");
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_UNSIGNED_BYTE) ||");
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_colorPointer = pointer;");
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glNormalPointer")) {
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((type == GL_FLOAT) ||");
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_normalPointer = pointer;");
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glTexCoordPointer")) {
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_texCoordPointer = pointer;");
534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glVertexPointer")) {
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_vertexPointer = pointer;");
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // emitBoundsChecks(jfunc, out, iii);
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            emitFunctionCall(jfunc, out, iii, false);
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean isVoid = jfunc.getType().isVoid();
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + indent + "return _returnValue;");
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "}");
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public static String getJniName(JType jType) {
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String jniName = "";
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isClass()) {
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "L" + jType.getBaseType() + ";";
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (jType.isArray()) {
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName = "[";
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
5696cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String baseType = jType.getBaseType();
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (baseType.equals("int")) {
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "I";
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (baseType.equals("float")) {
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "F";
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (baseType.equals("boolean")) {
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "Z";
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (baseType.equals("short")) {
578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "S";
579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (baseType.equals("long")) {
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "L";
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (baseType.equals("byte")) {
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jniName += "B";
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return jniName;
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniType(JType jType) {
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isVoid()) {
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "void";
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String baseType = jType.getBaseType();
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isPrimitive()) {
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (baseType.equals("String")) {
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "jstring";
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "j" + baseType;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (jType.isArray()) {
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "j" + baseType + "Array";
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "jobject";
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
6056cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniMangledName(String name) {
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("_", "_1");
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll(";", "_2");
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("\\[", "_3");
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return name;
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJniCode(JFunc jfunc, PrintStream out) {
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CFunc cfunc = jfunc.getCFunc();
6156cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit comment identifying original C function
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("/* " + cfunc.getOriginal() + " */");
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (name)
625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // void
629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android_glClipPlanef__I_3FI
630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String outName = "android_" + jfunc.getName();
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isPointerFunc = outName.endsWith("Pointer") &&
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getCFunc().hasPointerArg();
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVBOPointerFunc = (outName.endsWith("Pointer") ||
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName.endsWith("DrawElements")) &&
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            !jfunc.getCFunc().hasPointerArg();
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName += "Bounds";
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("static ");
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(getJniType(jfunc.getType()));
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(outName);
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String rsignature = getJniName(jfunc.getType());
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature = "";
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += getJniName(argType);
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += "I";
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Append signature to function name
6596cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        String sig = getJniMangledName(signature).replace('.', '_');
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("__" + sig);
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outName += "__" + sig;
6626cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = signature.replace('.', '/');
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsignature = rsignature.replace('.', '/');
6656cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (rsignature.length() == 0) {
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature = "V";
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String s = "{\"" +
672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getName() +
673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (isPointerFunc ? "Bounds" : "") +
674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", \"(" + signature +")" +
675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature +
676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", (void *) " +
677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName +
678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            " },";
679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nativeRegistrations.add(s);
680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<Integer> nonPrimitiveArgs = new ArrayList<Integer>();
682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBufferArgs = 0;
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<String> bufferArgNames = new ArrayList<String>();
684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (arguments)
686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) {
690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("  (JNIEnv *_env, jobject _this");
692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", ");
694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String suffix;
696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!argType.isPrimitive()) {
697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (argType.isArray()) {
698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_ref";
699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_buf";
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nonPrimitiveArgs.add(new Integer(i));
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(i).isBuffer()) {
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int cIndex = jfunc.getArgCIndex(i);
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String cname = cfunc.getArgName(cIndex);
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    bufferArgNames.add(cname);
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    numBufferArgs++;
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                suffix = "";
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix);
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", jint remaining");
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(") {");
7196cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArrays = 0;
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBuffers = 0;
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int idx = nonPrimitiveArgs.get(i).intValue();
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int cIndex = jfunc.getArgCIndex(idx);
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String cname = cfunc.getArgName(cIndex);
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (jfunc.getArgType(idx).isArray()) {
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numArrays;
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (jfunc.getArgType(idx).isBuffer()) {
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numBuffers;
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit method body
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for _exception and _returnValue
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android::gl::ogles_context_t *ctx;
7416cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        //
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // jint _exception;
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLenum _returnValue;
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isUnsupported = isUnsupportedFunc(cfunc);
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isUnsupported) {
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "_env->ThrowNew(UOEClass,");
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "    \"" + cfunc.getName() + "\");");
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String retval = getErrorReturnValue(cfunc);
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "return " + retval + ";");
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("}");
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "android::gl::ogles_context_t *ctx = getContext(_env, _this);");
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean emitExceptionCheck = (numArrays > 0 || numBuffers > 0) &&
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs);
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // mChecker.getChecks(cfunc.getName()) != null
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit an _exeption variable if there will be error checks
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "jint _exception = 0;");
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit a single _array or multiple _XXXArray variables
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numBufferArgs == 1) {
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _array = (jarray) 0;");
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numBufferArgs; i++) {
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _" + bufferArgNames.get(i) +
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "Array = (jarray) 0;");
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String retval = getErrorReturnValue(cfunc);
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (retval != null) {
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue = " + retval + ";");
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue;");
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for pointer arguments
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn_base;
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn;
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String offset = "offset";
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String remaining = "_remaining";
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String decl = type.getDeclaration();
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                decl +
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (decl.endsWith("*") ? "" : " ") +
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" + decl + ") 0;");
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                remaining = (numArrays <= 1 && numBuffers <= 1) ? "_remaining" :
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "jint " + remaining + ";");
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            decl +
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            (decl.endsWith("*") ? "" : " ") +
8286cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                            jfunc.getArgName(idx) +
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " = (" + decl + ") 0;");
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String retval = isVoid ? "" : " _returnValue";
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPrimitiveArrayCritical' for arrays
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPointer' calls for Buffer pointers
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int bufArgIdx = 0;
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
8446cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                offset = numArrays <= 1 ? "offset" :
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    cname + "Offset";
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                remaining = (numArrays <= 1 && numBuffers <= 1) ? "_remaining" :
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
8536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                "if (!" +
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref) {");
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (emitExceptionCheck) {
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "_exception = 1;");
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ThrowNew(" +
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "" : "_env, ") +
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "IAEClass, " +
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "\"" + cname +
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " == null\");");
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    goto exit;");
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "if (" + offset + " < 0) {");
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (emitExceptionCheck) {
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "_exception = 1;");
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ThrowNew(" +
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "" : "_env, ") +
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "IAEClass, " +
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "\"" + offset + " < 0\");");
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    goto exit;");
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + remaining + " = " +
8856cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "->GetArrayLength(" +
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    (mUseCPlusPlus ? "" : "_env, ") +
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    cname + "_ref) - " + offset + ";");
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, false,
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           emitExceptionCheck,
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           offset, remaining, "    ");
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" +
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")");
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->GetPrimitiveArrayCritical(" +
9026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref, (jboolean *)0);");
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname + " = " + cname + "_base + " + offset +
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ";");
908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "_" + bufferArgNames.get(bufArgIdx++) + "Array";
912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    boolean nullAllowed = isNullAllowed(cfunc);
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "if (" + cname + "_buf) {");
916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.print(indent);
917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
9186cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " = (" +
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")getPointer(_env, " +
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_buf, &" + array + ", &" + remaining + ");");
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "}");
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, true,
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           emitExceptionCheck,
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           offset, remaining, "    ");
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + "_returnValue = ");
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent);
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String name = cfunc.getName();
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(2, name.length()); // Strip off 'gl' prefix
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(0, 1).toLowerCase() +
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                name.substring(1, name.length());
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print("ctx->procs.");
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
9516cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(name + (isPointerFunc ? "Bounds" : "") + "(");
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
9546cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        numArgs = cfunc.getNumArgs();
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numArgs == 0) {
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx);");
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(");");
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx,");
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println();
966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numArgs; i++) {
968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typecast;
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1 && isVBOPointerFunc) {
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    typecast = "const GLvoid *";
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    typecast = cfunc.getArgType(i).getDeclaration();
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(indent + indent +
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          "(" +
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          typecast +
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          ")" +
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                          cfunc.getArgName(i));
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1) {
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (isPointerFunc) {
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(",");
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "(GLsizei)remaining");
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else {
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println();
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsExit) {
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("exit:");
997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            needsExit = false;
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bufArgIdx = 0;
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
10076cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // If the argument is 'const', GL will not write to it.
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // In this case, we can use the 'JNI_ABORT' flag to avoid
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // the need to write back to the Java array
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "if (" + jfunc.getArgName(idx) + "_base) {");
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ReleasePrimitiveArrayCritical(" +
10166cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) + "_ref, " +
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgName(cIndex) +
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base,");
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + indent +
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                 "JNI_ABORT" :
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                 "_exception ? JNI_ABORT: 0") +
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "_" + bufferArgNames.get(bufArgIdx++) + "Array";
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "if (" + array + ") {");
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "releasePointer(_env, " + array + ", " +
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgName(cIndex) +
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ", " +
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                 "JNI_FALSE" : "_exception ? JNI_FALSE : JNI_TRUE") +
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "return _returnValue;");
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("}");
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void addNativeRegistration(String s) {
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nativeRegistrations.add(s);
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitNativeRegistration() {
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("static const char *classPathName = \"" +
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        mClassPathName +
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "\";");
1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println();
1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("static JNINativeMethod methods[] = {");
1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },");
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Iterator<String> i = nativeRegistrations.iterator();
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (i.hasNext()) {
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mCStream.println(i.next());
1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("};");
1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println();
10716cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("int register_com_google_android_gles_jni_GLImpl(JNIEnv *_env)");
1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("{");
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println(indent +
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "int err;");
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println(indent +
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));");
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println(indent + "return err;");
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mCStream.println("}");
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1085