1bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root/*
2bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Copyright (C) 2006 The Android Open Source Project
3bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
4bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * you may not use this file except in compliance with the License.
6bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * You may obtain a copy of the License at
7bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
8bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root *
10bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * Unless required by applicable law or agreed to in writing, software
11bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * See the License for the specific language governing permissions and
14bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root * limitations under the License.
15bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root */
16bd393b7f39a71a13893aea8b64474b0b07ebe0ddKenny Root
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.io.PrintStream;
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.ArrayList;
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.HashSet;
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.Iterator;
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectimport java.util.List;
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevichpublic class JniCodeEmitter {
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    static final boolean mUseCPlusPlus = true;
26ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    protected boolean mUseContextPointer = true;
27427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich    protected boolean mUseStaticMethods = false;
2866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    protected boolean mUseSimpleMethodNames = false;
2966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    protected boolean mUseHideCommentForAPI = false;
30ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    protected String mClassPathName;
31ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    protected ParameterChecker mChecker;
32ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    protected List<String> nativeRegistrations = new ArrayList<String>();
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean needsExit;
34ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    protected static String indent = "    ";
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    HashSet<String> mFunctionsEmitted = new HashSet<String>();
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public static String getJniName(JType jType) {
38ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        String jniName = "";
3966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (jType.isEGLHandle()) {
4066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return (jType.isArray() ? "[" : "" ) + "Landroid/opengl/" + jType.getBaseType() + ";";
4166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (jType.isClass()) {
42ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            return "L" + jType.getBaseType() + ";";
43ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (jType.isArray()) {
44ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName = "[";
45ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        }
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        String baseType = jType.getBaseType();
48ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        if (baseType.equals("int")) {
49ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "I";
50ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (baseType.equals("float")) {
51ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "F";
52ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (baseType.equals("boolean")) {
53ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "Z";
54ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (baseType.equals("short")) {
55ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "S";
56ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (baseType.equals("long")) {
57ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "L";
58ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        } else if (baseType.equals("byte")) {
59ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            jniName += "B";
6050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        } else if (baseType.equals("String")) {
6150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            jniName += "Ljava/lang/String;";
6250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        } else if (baseType.equals("void")) {
6350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            // nothing.
6450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        } else {
659875750593aae7c2a62f33c620809d49162393ebElliott Hughes            throw new RuntimeException("Unknown primitive basetype " + baseType);
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
67ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        return jniName;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
70ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public void emitCode(CFunc cfunc, String original,
71ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            PrintStream javaInterfaceStream,
72ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            PrintStream javaImplStream,
73ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            PrintStream cStream) {
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        JFunc jfunc;
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature;
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean duplicate;
776cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (cfunc.hasTypedPointerArg()) {
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc = JFunc.convert(cfunc, true);
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Don't emit duplicate functions
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // These may appear because they are defined in multiple
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // Java interfaces (e.g., GL11/GL11ExtensionPack)
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature = jfunc.toString();
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            duplicate = false;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mFunctionsEmitted.contains(signature)) {
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                duplicate = true;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                mFunctionsEmitted.add(signature);
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!duplicate) {
93ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                emitNativeDeclaration(jfunc, javaImplStream);
94ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                emitJavaCode(jfunc, javaImplStream);
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
96427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            if (javaInterfaceStream != null) {
97427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                emitJavaInterfaceCode(jfunc, javaInterfaceStream);
98427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            }
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!duplicate) {
100ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                emitJniCode(jfunc, cStream);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
10266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            // Don't create IOBuffer versions of the EGL functions
10366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (cfunc.hasEGLHandleArg()) {
10466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                return;
10566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        jfunc = JFunc.convert(cfunc, false);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = jfunc.toString();
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        duplicate = false;
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mFunctionsEmitted.contains(signature)) {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            duplicate = true;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mFunctionsEmitted.add(signature);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!duplicate) {
119ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            emitNativeDeclaration(jfunc, javaImplStream);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
121427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        if (javaInterfaceStream != null) {
122427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            emitJavaInterfaceCode(jfunc, javaInterfaceStream);
123427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        }
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!duplicate) {
125ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            emitJavaCode(jfunc, javaImplStream);
126ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            emitJniCode(jfunc, cStream);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitNativeDeclaration(JFunc jfunc, PrintStream out) {
13166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (mUseHideCommentForAPI) {
13266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println("    /* @hide C function " + jfunc.getCFunc().getOriginal() + " */");
13366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println();
13466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else {
13566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println("    // C function " + jfunc.getCFunc().getOriginal());
13666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println();
13766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, true, false);
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJavaInterfaceCode(JFunc jfunc, PrintStream out) {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, false, true);
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJavaCode(JFunc jfunc, PrintStream out) {
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        emitFunction(jfunc, out, false, false);
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1496cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
15066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich    boolean isPointerFunc(JFunc jfunc) {
15166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        String name = jfunc.getName();
15266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        return (name.endsWith("Pointer") || name.endsWith("PointerOES"))
15366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich            && jfunc.getCFunc().hasPointerArg();
15466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich    }
15566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich
156ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void emitFunctionCall(JFunc jfunc, PrintStream out, String iii, boolean grabArray) {
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = jfunc.getType().isVoid();
15866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(iii +
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " _returnValue;");
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii +
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (isVoid ? "" : "_returnValue = ") +
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    jfunc.getName() +
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    (isPointerFunc ? "Bounds" : "" ) +
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "(");
1696cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (grabArray && argType.isTypedBuffer()) {
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typeName = argType.getBaseType();
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                typeName = typeName.substring(9, typeName.length() - 6);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(iii + indent + "get" + typeName + "Array(" + argName + "),");
1796cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                out.print(iii + indent + "getOffset(" + argName + ")");
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(iii + indent + argName);
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc) {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + argName + ".remaining()");
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(iii + ");");
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
198ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck,
199ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            String iii) {
200ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
201ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                                      "offset", "_remaining", iii);
202ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            }
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck,
205ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            String offset, String remaining, String iii) {
206ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "    default:");
207ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "        _needed = 0;");
208ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "        break;");
209ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "}");
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "if (" + remaining + " < _needed) {");
21266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(iii + indent + "_exception = 1;");
21366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(iii + indent +
21466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                           "_exceptionType = \"java/lang/IllegalArgumentException\";");
21566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(iii + indent +
21666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                           "_exceptionMessage = \"" +
21766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                           (isBuffer ? "remaining()" : "length - " + offset) +
21866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                           " < needed\";");
219ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + indent + "goto exit;");
220ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                out.println(iii + "}");
22166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
22266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                needsExit = true;
223ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            }
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isNullAllowed(CFunc cfunc) {
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
23066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].equals("nullAllowed")) {
23166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
23266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
23366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
23466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
23566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
23666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
23766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
23866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
23966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
24066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasCheckTest(CFunc cfunc) {
24166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
24266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
24366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
24466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
24566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("check")) {
24666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
24766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
24866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
24966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
25066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
25166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
25266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
25366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
25466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
25566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasIfTest(CFunc cfunc) {
25666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
25766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
25866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
25966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
26066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("ifcheck")) {
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
26366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    int skipOneCheck(String[] checks, int index) {
27166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks[index].equals("return")) {
27266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
27366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("check")) {
27466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
27566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("sentinel")) {
27666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
27766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("ifcheck")) {
27866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 5;
27966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("unsupported")) {
28066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 1;
28166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("requires")) {
28266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
28366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("nullAllowed")) {
28466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 1;
28566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else {
28666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.out.println("Error: unknown keyword \"" +
28766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               checks[index] + "\"");
28866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.exit(0);
28966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
29066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
29166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return index;
29266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
29366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getErrorReturnValue(CFunc cfunc) {
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isVoid) {
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return null;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (returnType.getBaseType().startsWith("EGL")) {
30266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return "(" + returnType.getDeclaration() + ") 0";
30366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
30466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("return")) {
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return checks[index + 1];
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
31366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return null;
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isUnsupportedFunc(CFunc cfunc) {
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("unsupported")) {
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
32966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3359875750593aae7c2a62f33c620809d49162393ebElliott Hughes
336e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    String isRequiresFunc(CFunc cfunc) {
337e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String[] checks = mChecker.getChecks(cfunc.getName());
338e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        int index = 1;
339e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (checks != null) {
340e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            while (index < checks.length) {
34166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].equals("requires")) {
342e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                    return checks[index+1];
343e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                } else {
34466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
345e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                }
346e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
347e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
348e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        return null;
349e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    }
3509875750593aae7c2a62f33c620809d49162393ebElliott Hughes
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out,
352ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
353ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
3549875750593aae7c2a62f33c620809d49162393ebElliott Hughes        String[] checks = mChecker.getChecks(cfunc.getName());
3559875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3569875750593aae7c2a62f33c620809d49162393ebElliott Hughes        boolean lastWasIfcheck = false;
3579875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3589875750593aae7c2a62f33c620809d49162393ebElliott Hughes        int index = 1;
3599875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (checks != null) {
3609875750593aae7c2a62f33c620809d49162393ebElliott Hughes            while (index < checks.length) {
3619875750593aae7c2a62f33c620809d49162393ebElliott Hughes                if (checks[index].startsWith("check")) {
3629875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (lastWasIfcheck) {
3639875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
3649875750593aae7c2a62f33c620809d49162393ebElliott Hughes                                offset, remaining, iii);
3659875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3669875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = false;
3679875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (cname != null && !cname.equals(checks[index + 1])) {
3689875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        index += 3;
3699875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        continue;
3709875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3719875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "if (" + remaining + " < " + checks[index + 2] + ") {");
37266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
3739875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String exceptionClassName = "java/lang/IllegalArgumentException";
374ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // If the "check" keyword was of the form
375ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // "check_<class name>", use the class name in the
376ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // exception to be thrown
377ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    int underscore = checks[index].indexOf('_');
378ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    if (underscore >= 0) {
3799875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        String abbr = checks[index].substring(underscore + 1);
3809875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        if (abbr.equals("AIOOBE")) {
3819875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            exceptionClassName = "java/lang/ArrayIndexOutOfBoundsException";
382ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        } else {
3839875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            throw new RuntimeException("unknown exception abbreviation: " + abbr);
384ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
38666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
38766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \""+exceptionClassName+"\";");
38866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
38966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "_exceptionMessage = \"" +
39066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               (isBuffer ? "remaining()" : "length - " +
39166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               offset) + " < " + checks[index + 2] +
39266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               " < needed\";");
3939875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3949875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + indent + "goto exit;");
3959875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "}");
3969875750593aae7c2a62f33c620809d49162393ebElliott Hughes
39766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
39866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
3999875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 3;
4009875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else if (checks[index].equals("ifcheck")) {
4019875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String[] matches = checks[index + 4].split(",");
4026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
4039875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (!lastWasIfcheck) {
4049875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "int _needed;");
4059875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "switch (" + checks[index + 3] + ") {");
4069875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4079875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4089875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    for (int i = 0; i < matches.length; i++) {
4099875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#if defined(" + matches[i] + ")");
4109875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "    case " + matches[i] + ":");
4119875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#endif // defined(" + matches[i] + ")");
4129875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4139875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        _needed = " + checks[index + 2] + ";");
4149875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        break;");
4159875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4169875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = true;
4179875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 5;
4189875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else {
41966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
4229875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4239875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4249875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (lastWasIfcheck) {
4259875750593aae7c2a62f33c620809d49162393ebElliott Hughes            printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii);
4269875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4279875750593aae7c2a62f33c620809d49162393ebElliott Hughes    }
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitSentinelCheck(CFunc cfunc, String cname, PrintStream out,
43066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
43166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
43266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
43366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
43466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
43566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
43666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
43766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
43866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    if (cname != null && !cname.equals(checks[index + 1])) {
43966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        index += 3;
44066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        continue;
44166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    }
44266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
44366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + cname + "_sentinel = false;");
44466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "for (int i = " + remaining +
44566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " - 1; i >= 0; i--)  {");
44666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "if (" + cname +
44766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "[i] == " + checks[index + 2] + "){");
44866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent +
44966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + "_sentinel = true;");
45066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent + "break;");
45166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "}");
45266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
45366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii +
45466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + cname + "_sentinel == false) {");
45566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
45666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
45766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
45866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exceptionMessage = \"" + cname +
45966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " must contain " + checks[index + 2] + "!\";");
46066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "goto exit;");
46166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
46266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
46366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
46466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
46566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
46666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
46766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
46866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
46966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
47066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
47166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitLocalVariablesForSentinel(CFunc cfunc, PrintStream out) {
47366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
47566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
47766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
47866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
47966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
48066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String cname = checks[index + 1];
48166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "bool " + cname + "_sentinel = false;");
48266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
48366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
48466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
48566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
48666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
48766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
48866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
48966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
49066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
49166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
492ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    boolean hasNonConstArg(JFunc jfunc, CFunc cfunc, List<Integer> nonPrimitiveArgs) {
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5116cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Emit a function in several variants:
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if nativeDecl: public native <returntype> func(args);
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if !nativeDecl:
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if interfaceDecl:  public <returntype> func(args);
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if !interfaceDecl: public <returntype> func(args) { body }
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
521ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void emitFunction(JFunc jfunc, PrintStream out, boolean nativeDecl, boolean interfaceDecl) {
52266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!nativeDecl && !interfaceDecl && !isPointerFunc) {
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // If it's not a pointer function, we've already emitted it
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // with nativeDecl == true
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
530427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        String maybeStatic = mUseStaticMethods ? "static " : "";
531427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
534427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "private " + maybeStatic +"native " :
535427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "Bounds" : "") +
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
542427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "public " + maybeStatic +"native " :
543427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
5486cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
5536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + indent + argType + " " + argName);
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc && nativeDecl) {
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + "int remaining");
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nativeDecl || interfaceDecl) {
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ") {");
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String iii = indent + indent;
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // emitBoundsChecks(jfunc, out, iii);
57546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            emitFunctionCall(jfunc, out, iii, false);
57646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
57746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // Set the pointer after we call the native code, so that if
57846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // the native code throws an exception we don't modify the
57946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // pointer. We assume that the native code is written so that
58046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // if an exception is thrown, then the underlying glXXXPointer
58146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // function will not have been called.
58246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String fname = jfunc.getName();
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isPointerFunc) {
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // TODO - deal with VBO variants
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (fname.equals("glColorPointer")) {
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if ((size == 4) &&");
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_UNSIGNED_BYTE) ||");
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_colorPointer = pointer;");
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glNormalPointer")) {
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((type == GL_FLOAT) ||");
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_normalPointer = pointer;");
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glTexCoordPointer")) {
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_texCoordPointer = pointer;");
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glVertexPointer")) {
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_vertexPointer = pointer;");
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
62466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glPointSizePointerOES")) {
62566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((type == GL_FLOAT) ||");
62666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
62766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
62866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_pointSizePointerOES = pointer;");
62966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
63066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glMatrixIndexPointerOES")) {
63166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
63266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
63366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
63466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
63566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
63666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
63766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
63866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
63966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_matrixIndexPointerOES = pointer;");
64066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
64166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glWeightPointer")) {
64266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
64366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
64466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
64566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
64666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
64766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
64866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
64966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
65066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_weightPointerOES = pointer;");
65166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean isVoid = jfunc.getType().isVoid();
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + indent + "return _returnValue;");
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "}");
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
665ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public void addNativeRegistration(String s) {
666ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        nativeRegistrations.add(s);
667ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
6686cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
669427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich    public void emitNativeRegistration(String registrationFunctionName,
670427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            PrintStream cStream) {
671ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("static const char *classPathName = \"" +
672ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        mClassPathName +
673ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "\";");
674ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
675ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
676ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("static JNINativeMethod methods[] = {");
677ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
678ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },");
679ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
680ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        Iterator<String> i = nativeRegistrations.iterator();
681ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        while (i.hasNext()) {
682ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            cStream.println(i.next());
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
684ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
685ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("};");
686ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
687ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
688ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
689427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        cStream.println("int " + registrationFunctionName + "(JNIEnv *_env)");
690ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{");
691ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
692ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "int err;");
693ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
694ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
695ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));");
696ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
697ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent + "return err;");
698ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("}");
699ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
700ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
701ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public JniCodeEmitter() {
702ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        super();
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniType(JType jType) {
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isVoid()) {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "void";
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String baseType = jType.getBaseType();
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isPrimitive()) {
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (baseType.equals("String")) {
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "jstring";
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "j" + baseType;
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (jType.isArray()) {
71866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return jType.isClass() ? "jobjectArray" : "j" + baseType + "Array";
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "jobject";
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
7236cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniMangledName(String name) {
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("_", "_1");
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll(";", "_2");
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("\\[", "_3");
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return name;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJniCode(JFunc jfunc, PrintStream out) {
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CFunc cfunc = jfunc.getCFunc();
7336cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit comment identifying original C function
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("/* " + cfunc.getOriginal() + " */");
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (name)
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // void
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android_glClipPlanef__I_3FI
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String outName = "android_" + jfunc.getName();
75166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVBOPointerFunc = (outName.endsWith("Pointer") ||
75366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                outName.endsWith("PointerOES") ||
754b3ffef9dfe43a0b33aef57b279ab0e8b98df6e8cJack Palevich            outName.endsWith("DrawElements") || outName.endsWith("VertexAttribPointer")) &&
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            !jfunc.getCFunc().hasPointerArg();
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName += "Bounds";
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("static ");
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(getJniType(jfunc.getType()));
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(outName);
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String rsignature = getJniName(jfunc.getType());
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature = "";
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += getJniName(argType);
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += "I";
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Append signature to function name
77750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        String sig = getJniMangledName(signature).replace('.', '_').replace('/', '_');
77866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (!mUseSimpleMethodNames) {
77966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.print("__" + sig);
78066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            outName += "__" + sig;
78166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
7826cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = signature.replace('.', '/');
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsignature = rsignature.replace('.', '/');
7856cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (rsignature.length() == 0) {
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature = "V";
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String s = "{\"" +
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getName() +
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (isPointerFunc ? "Bounds" : "") +
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", \"(" + signature +")" +
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature +
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", (void *) " +
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName +
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            " },";
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nativeRegistrations.add(s);
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<Integer> nonPrimitiveArgs = new ArrayList<Integer>();
80250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        List<Integer> stringArgs = new ArrayList<Integer>();
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBufferArgs = 0;
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<String> bufferArgNames = new ArrayList<String>();
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (arguments)
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) {
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("  (JNIEnv *_env, jobject _this");
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", ");
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
81666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String suffix = "";
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!argType.isPrimitive()) {
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (argType.isArray()) {
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_ref";
82066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (argType.isBuffer()) {
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_buf";
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nonPrimitiveArgs.add(new Integer(i));
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(i).isBuffer()) {
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int cIndex = jfunc.getArgCIndex(i);
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String cname = cfunc.getArgName(cIndex);
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    bufferArgNames.add(cname);
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    numBufferArgs++;
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
83166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
83250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
83350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                stringArgs.add(new Integer(i));
83450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix);
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", jint remaining");
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(") {");
8426cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArrays = 0;
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBuffers = 0;
84550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        int numStrings = 0;
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int idx = nonPrimitiveArgs.get(i).intValue();
84850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            JType argType = jfunc.getArgType(idx);
84950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isArray()) {
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numArrays;
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
85250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isBuffer()) {
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numBuffers;
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
85550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
85650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                ++numStrings;
85750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit method body
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for _exception and _returnValue
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android::gl::ogles_context_t *ctx;
8676cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        //
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // jint _exception;
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLenum _returnValue;
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isUnsupported = isUnsupportedFunc(cfunc);
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isUnsupported) {
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
8779875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "    \"" + cfunc.getName() + "\");");
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String retval = getErrorReturnValue(cfunc);
88266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
88366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
88466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
88566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
88666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
88766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
88866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
88966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("}");
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
8959875750593aae7c2a62f33c620809d49162393ebElliott Hughes
896e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String requiresExtension = isRequiresFunc(cfunc);
897e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (requiresExtension != null) {
898e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent +
899e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {");
900e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
9019875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
902e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
903e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "    \"" + cfunc.getName() + "\");");
904e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            if (isVoid) {
905e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                out.println(indent + indent + "    return;");
906e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            } else {
907e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                String retval = getErrorReturnValue(cfunc);
90866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
90966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
91066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
91166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
91266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
91366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
91466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
91566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
916e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
917e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + "}");
918e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "android::gl::ogles_context_t *ctx = getContext(_env, _this);");
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        boolean initializeReturnValue = stringArgs.size() > 0;
92566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0)
92666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                             && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs)
92766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                                 || (cfunc.hasPointerArg() && numArrays > 0))
92866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasCheckTest(cfunc)
92966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasIfTest(cfunc))
93066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || (stringArgs.size() > 0);
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // mChecker.getChecks(cfunc.getName()) != null
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit an _exeption variable if there will be error checks
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "jint _exception = 0;");
93566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "const char * _exceptionType;");
93666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "const char * _exceptionMessage;");
937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit a single _array or multiple _XXXArray variables
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numBufferArgs == 1) {
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _array = (jarray) 0;");
942e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _bufferOffset = (jint) 0;");
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numBufferArgs; i++) {
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _" + bufferArgNames.get(i) +
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "Array = (jarray) 0;");
947e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _" + bufferArgNames.get(i) +
948e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "BufferOffset = (jint) 0;");
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String retval = getErrorReturnValue(cfunc);
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (retval != null) {
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue = " + retval + ";");
95650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            } else if (initializeReturnValue) {
95750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + returnType.getDeclaration() +
95866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            " _returnValue = 0;");
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue;");
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
96566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for EGL Handles
96666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
96766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
96866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
96966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface);
97066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
97166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
97266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
97366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
97466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
97566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
97666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
97766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isBuffer()
97866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || jfunc.getArgType(idx).isArray()
97966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || !jfunc.getArgType(idx).isEGLHandle())
98066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
98166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
98266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
98366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String decl = type.getDeclaration();
98466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
98566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + " " + cname + "_native = (" +
98666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + ") fromEGLHandle(_env, " +
98766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            type.getBaseType().toLowerCase() +
98866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "GetHandleID, " + jfunc.getArgName(idx) +
98966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            ");");
99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
99266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
99366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for element/sentinel checks
99466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
99666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // bool attrib_list_sentinel_found = false;
99866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        emitLocalVariablesForSentinel(cfunc, out);
100066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for pointer arguments
1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn_base;
1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn;
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String offset = "offset";
1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String remaining = "_remaining";
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray())
101766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
101866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String decl = type.getDeclaration();
102166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                decl +
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (decl.endsWith("*") ? "" : " ") +
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" + decl + ") 0;");
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
102850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "jint " + remaining + ";");
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
103366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                decl +
103466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (decl.endsWith("*") ? "" : " ") +
103566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) +
103666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " = (" + decl + ") 0;");
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
104350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
104450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
104550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
104650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
104750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
104850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
104950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "const char* _native" + cname + " = 0;");
105050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
105150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
105250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
105350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
105450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
105550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Null pointer checks and GetStringUTFChars
105650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
105750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
105850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
105950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
106050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
106150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
106250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
106350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String decl = type.getDeclaration();
106450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                needsExit = true;
106566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + "if (!" + cname + ") {");
106666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
106766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionType = \"java/lang/IllegalArgumentException\";");
106866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
106966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionMessage = \"" + cname + " == null\";");
107066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent + "goto exit;");
107150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
107250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "_native" + cname + " = _env->GetStringUTFChars(" + cname + ", 0);");
107450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
107550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
107750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
107850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for non-object arrays
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPointer' calls for Buffer pointers
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
10856cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                offset = numArrays <= 1 ? "offset" :
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    cname + "Offset";
108950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray()
109366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                       && !jfunc.getArgType(idx).isEGLHandle()) {
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
109566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
109666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
109766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
109866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
109966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
110066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + cname +" == null\";");
110166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "if (" + offset + " < 0) {");
110466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
110566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
110666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
110766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
110866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + offset +" < 0\";");
110966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + remaining + " = " +
11136cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "->GetArrayLength(" +
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    (mUseCPlusPlus ? "" : "_env, ") +
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    cname + "_ref) - " + offset + ";");
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, false,
1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           emitExceptionCheck,
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           offset, remaining, "    ");
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" +
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")");
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->GetPrimitiveArrayCritical(" +
11306cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref, (jboolean *)0);");
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
113466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + " = " + cname + "_base + " + offset + ";");
113566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
113666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitSentinelCheck(cfunc, cname, out, false,
113766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      emitExceptionCheck, offset,
113866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      remaining, indent);
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
114066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isArray()
114166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                              && jfunc.getArgType(idx).isEGLHandle()) {
114266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
114366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
114466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
114566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
114666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
114766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + cname +" == null\";");
114866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
114966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
115066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (" + offset + " < 0) {");
115166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
115266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
115366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
115466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + offset +" < 0\";");
115566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
115666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
115766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
115866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + remaining + " = " +
115966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
116066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    "->GetArrayLength(" +
116166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "" : "_env, ") +
116266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    cname + "_ref) - " + offset + ";");
116366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitNativeBoundsChecks(cfunc, cname, out, false,
116466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           emitExceptionCheck,
116566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           offset, remaining, "    ");
116666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
116766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) + " = new " +
116866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgType(cIndex).getBaseType() +
116966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "["+ remaining + "];");
117066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println();
117166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isBuffer()) {
1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
1173e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "Array";
1174e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                    String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1175e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "BufferOffset";
1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "if (" + cname + "_buf) {");
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.print(indent);
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
11826cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
118346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (isPointerFunc) {
118446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " = (" +
1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
11886eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich                                ") getDirectBufferPointer(_env, " +
118946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                cname + "_buf);");
119046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String iii = "    ";
11915afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                        out.println(iii + indent + "if ( ! " + cname + " ) {");
119266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        out.println(iii + indent + indent + "return;");
119346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(iii + indent + "}");
119446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    } else {
119546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
119646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
119746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    " = (" +
119846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgType(cIndex).getDeclaration() +
119946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ")getPointer(_env, " +
120046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
1201e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                                    "_buf, &" + array + ", &" + remaining + ", &" + bufferOffset +
120246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
120346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12055afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                    emitNativeBoundsChecks(cfunc, cname, out, true,
12065afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           emitExceptionCheck,
12075afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           offset, remaining, nullAllowed ? "        " : "    ");
12085afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich
1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "}");
1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1216e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for pointers if needed
1217e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
1218e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1219e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
1220e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
1221e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1222e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue;
1223e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1224e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
1225e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1226e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cname + "BufferOffset";
1227e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String array = numBufferArgs <= 1 ? "_array" :
1228e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
1229e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
123036b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
123136b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                if (nullAllowed) {
123236b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {");
123336b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                } else {
123436b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname +" == NULL) {");
123536b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                }
1236e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);");
1237e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
1238e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "}");
1239e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer             }
1240e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        }
1241e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1242e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + "_returnValue = ");
1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent);
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String name = cfunc.getName();
1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(2, name.length()); // Strip off 'gl' prefix
1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(0, 1).toLowerCase() +
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                name.substring(1, name.length());
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print("ctx->procs.");
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
12566cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(name + (isPointerFunc ? "Bounds" : "") + "(");
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12596cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        numArgs = cfunc.getNumArgs();
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numArgs == 0) {
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx);");
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(");");
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx,");
1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println();
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numArgs; i++) {
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typecast;
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1 && isVBOPointerFunc) {
127566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    typecast = "(const GLvoid *)";
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
127766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")";
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(indent + indent +
128066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                          typecast);
128166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
128250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                if (cfunc.getArgType(i).isConstCharPointer()) {
128350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                    out.print("_native");
128450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                }
128566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1286e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if (cfunc.getArgType(i).isEGLHandle() &&
128766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    !cfunc.getArgType(i).isPointer()){
128866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i)+"_native");
128966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
129066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i));
129166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1) {
1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (isPointerFunc) {
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(",");
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "(GLsizei)remaining");
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else {
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println();
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsExit) {
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("exit:");
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            needsExit = false;
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1313e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
131966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
13206cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // If the argument is 'const', GL will not write to it.
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // In this case, we can use the 'JNI_ABORT' flag to avoid
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // the need to write back to the Java array
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "if (" + jfunc.getArgName(idx) + "_base) {");
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ReleasePrimitiveArrayCritical(" +
13296cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) + "_ref, " +
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgName(cIndex) +
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base,");
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + indent +
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
133566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                 "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) +
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
133946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (! isPointerFunc) {
134046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String array = numBufferArgs <= 1 ? "_array" :
1341e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
134246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "if (" + array + ") {");
134346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + indent +
134446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    "releasePointer(_env, " + array + ", " +
134546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgName(cIndex) +
134646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ", " +
134746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    (cfunc.getArgType(cIndex).isConst() ?
134866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "JNI_FALSE" : (emitExceptionCheck ?
134966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) +
135046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
135146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "}");
135246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
135750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
135850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
135950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
136050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
136150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
136250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
136350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
136450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "if (_native" + cname + ") {");
136550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "    _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");");
136650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
136750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
136850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
136950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
137050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
137150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
137266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Copy results back to java arrays
137366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer       if (nonPrimitiveArgs.size() > 0) {
137466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
137566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
137666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
137766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase();
137866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) {
137966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    remaining  = ((numArrays + numBuffers) <= 1) ? "_remaining" :
138066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_" + cfunc.getArgName(cIndex) + "Remaining";
138166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset";
138266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
138366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + jfunc.getArgName(idx) + ") {");
138466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
138566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "for (int i = 0; i < " + remaining + "; i++) {");
138666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
138766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "jobject " + cfunc.getArgName(cIndex) +
138866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_new = toEGLHandle(_env, " + baseType +
138966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "Class, " + baseType + "Constructor, " +
139066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "[i]);");
139166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
139266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "_env" : "(*_env)") +
139366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "->SetObjectArrayElement(" +
139466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "" : "_env, ") +
139566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) +
139666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_ref, i + " + offset + ", " +
139766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "_new);");
139866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "}");
139966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
140066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "delete[] " + jfunc.getArgName(idx) + ";");
140166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
140266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
140366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
140466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
140566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
140666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
140766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Throw exception if there is one
140866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (emitExceptionCheck) {
140966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "if (_exception) {");
141066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + indent +
141166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        "jniThrowException(_env, _exceptionType, _exceptionMessage);");
141266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "}");
141366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
141466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
141566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
141650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
141866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (cfunc.getType().isEGLHandle()) {
141966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getType().getBaseType().toLowerCase();
142066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
142166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "return toEGLHandle(_env, " + baseType + "Class, " +
142266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            baseType + "Constructor, _returnValue);");
142366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            } else {
142466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + "return _returnValue;");
142566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("}");
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1433