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")) {
577284145d564fa8a422a8e564a38c730fb4a2962bAndy McFadden            jniName += "J";
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) {
200bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
201bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian                "offset", "_remaining", iii);
202bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian    }
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void printIfcheckPostamble(PrintStream out, boolean isBuffer, boolean emitExceptionCheck,
205ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            String offset, String remaining, String iii) {
206bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "    default:");
207bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "        _needed = 1;");
208bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "        break;");
209bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "}");
210bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian
211bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "if (" + remaining + " < _needed) {");
212bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + indent + "_exception = 1;");
213bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + indent +
214bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian                "_exceptionType = \"java/lang/IllegalArgumentException\";");
215bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + indent +
216bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian                "_exceptionMessage = \"" +
217bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian                (isBuffer ? "remaining()" : "length - " + offset) +
218bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian                " < needed\";");
219bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + indent + "goto exit;");
220bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        out.println(iii + "}");
221bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian
222bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian        needsExit = true;
223bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian    }
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
225b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos    boolean isNullAllowed(CFunc cfunc, String cname) {
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) {
230b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (checks[index].equals("nullAllowed") &&
231b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    checks[index + 1].equals(cname)) {
23266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
23366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
23466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
23566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
23666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
23766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
23866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
23966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
24066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
24166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasCheckTest(CFunc cfunc) {
24266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
24366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
24466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
24566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
24666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("check")) {
24766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
24866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
24966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
25066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
25166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
25266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
25366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
25466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
25566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
256b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos    boolean hasCheckTest(CFunc cfunc, String cname) {
257b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        String[] checks = mChecker.getChecks(cfunc.getName());
258b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        int index = 1;
259b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        if (checks != null) {
260b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            while (index < checks.length) {
261b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (checks[index].startsWith("check") &&
262b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    cname != null && cname.equals(checks[index + 1])) {
263b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    return true;
264b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                } else {
265b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    index = skipOneCheck(checks, index);
266b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
267b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            }
268b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        }
269b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        return false;
270b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos    }
271b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
27266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasIfTest(CFunc cfunc) {
27366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
27466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
27566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
27666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
27766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("ifcheck")) {
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
28066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    int skipOneCheck(String[] checks, int index) {
28866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks[index].equals("return")) {
28966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
29066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("check")) {
29166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
29266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("sentinel")) {
29366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
29466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("ifcheck")) {
29566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 5;
29666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("unsupported")) {
29766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 1;
29866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("requires")) {
29966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
30066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("nullAllowed")) {
301b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            index += 2;
30266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else {
30366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.out.println("Error: unknown keyword \"" +
30466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               checks[index] + "\"");
30566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.exit(0);
30666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
30766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
30866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return index;
30966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
31066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getErrorReturnValue(CFunc cfunc) {
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isVoid) {
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return null;
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (returnType.getBaseType().startsWith("EGL")) {
31966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return "(" + returnType.getDeclaration() + ") 0";
32066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
32166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("return")) {
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return checks[index + 1];
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
33066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return null;
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isUnsupportedFunc(CFunc cfunc) {
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("unsupported")) {
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
34666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3529875750593aae7c2a62f33c620809d49162393ebElliott Hughes
353e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    String isRequiresFunc(CFunc cfunc) {
354e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String[] checks = mChecker.getChecks(cfunc.getName());
355e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        int index = 1;
356e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (checks != null) {
357e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            while (index < checks.length) {
35866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].equals("requires")) {
359e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                    return checks[index+1];
360e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                } else {
36166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
362e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                }
363e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
364e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
365e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        return null;
366e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    }
3679875750593aae7c2a62f33c620809d49162393ebElliott Hughes
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out,
369ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
370ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
3719875750593aae7c2a62f33c620809d49162393ebElliott Hughes        String[] checks = mChecker.getChecks(cfunc.getName());
3729875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3739875750593aae7c2a62f33c620809d49162393ebElliott Hughes        boolean lastWasIfcheck = false;
3749875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3759875750593aae7c2a62f33c620809d49162393ebElliott Hughes        int index = 1;
3769875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (checks != null) {
3779875750593aae7c2a62f33c620809d49162393ebElliott Hughes            while (index < checks.length) {
3789875750593aae7c2a62f33c620809d49162393ebElliott Hughes                if (checks[index].startsWith("check")) {
3799875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (lastWasIfcheck) {
3809875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
3819875750593aae7c2a62f33c620809d49162393ebElliott Hughes                                offset, remaining, iii);
3829875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3839875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = false;
3849875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (cname != null && !cname.equals(checks[index + 1])) {
3859875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        index += 3;
3869875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        continue;
3879875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3889875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "if (" + remaining + " < " + checks[index + 2] + ") {");
38966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
3909875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String exceptionClassName = "java/lang/IllegalArgumentException";
391ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // If the "check" keyword was of the form
392ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // "check_<class name>", use the class name in the
393ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // exception to be thrown
394ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    int underscore = checks[index].indexOf('_');
395ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    if (underscore >= 0) {
3969875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        String abbr = checks[index].substring(underscore + 1);
3979875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        if (abbr.equals("AIOOBE")) {
3989875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            exceptionClassName = "java/lang/ArrayIndexOutOfBoundsException";
399ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        } else {
4009875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            throw new RuntimeException("unknown exception abbreviation: " + abbr);
401ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        }
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
40366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
40466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \""+exceptionClassName+"\";");
40566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
40666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "_exceptionMessage = \"" +
40766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               (isBuffer ? "remaining()" : "length - " +
40866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               offset) + " < " + checks[index + 2] +
40966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               " < needed\";");
4109875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4119875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + indent + "goto exit;");
4129875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "}");
4139875750593aae7c2a62f33c620809d49162393ebElliott Hughes
41466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
41566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
4169875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 3;
4179875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else if (checks[index].equals("ifcheck")) {
4189875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String[] matches = checks[index + 4].split(",");
4196cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
4209875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (!lastWasIfcheck) {
4219875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "int _needed;");
4229875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "switch (" + checks[index + 3] + ") {");
4239875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4249875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4259875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    for (int i = 0; i < matches.length; i++) {
4269875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#if defined(" + matches[i] + ")");
4279875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "    case " + matches[i] + ":");
4289875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#endif // defined(" + matches[i] + ")");
4299875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4309875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        _needed = " + checks[index + 2] + ";");
4319875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        break;");
4329875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4339875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = true;
4349875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 5;
4359875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else {
43666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
4399875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4409875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4419875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (lastWasIfcheck) {
4429875750593aae7c2a62f33c620809d49162393ebElliott Hughes            printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii);
4439875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4449875750593aae7c2a62f33c620809d49162393ebElliott Hughes    }
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitSentinelCheck(CFunc cfunc, String cname, PrintStream out,
44766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
44866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
44966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
45066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
45166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
45266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
45366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
45466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
45566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    if (cname != null && !cname.equals(checks[index + 1])) {
45666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        index += 3;
45766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        continue;
45866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    }
45966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
46066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + cname + "_sentinel = false;");
46166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "for (int i = " + remaining +
46266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " - 1; i >= 0; i--)  {");
46366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "if (" + cname +
46466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "[i] == " + checks[index + 2] + "){");
46566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent +
46666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + "_sentinel = true;");
46766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent + "break;");
46866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "}");
46966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
47066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii +
47166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + cname + "_sentinel == false) {");
47266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
47366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
47466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
47566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exceptionMessage = \"" + cname +
47666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " must contain " + checks[index + 2] + "!\";");
47766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "goto exit;");
47866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
47966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
48066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
48166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
48266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
48366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
48466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
48566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
48666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
48766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
48866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
489b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos    void emitStringCheck(CFunc cfunc, String cname, PrintStream out, String iii) {
490b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
491b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        String[] checks = mChecker.getChecks(cfunc.getName());
492b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
493b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        int index = 1;
494b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        if (checks != null) {
495b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            while (index < checks.length) {
496b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (checks[index].startsWith("check")) {
497b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    if (cname != null && !cname.equals(checks[index + 1])) {
498b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    index += 3;
499b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    continue;
500b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
501b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + "_stringlen = _env->GetStringUTFLength(" + cname + ");");
502b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + "if (" + checks[index + 2] + " > _stringlen) {");
503b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + indent + "_exception = 1;");
504b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + indent +
505b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionType = \"java/lang/ArrayIndexOutOfBoundsException\";");
506b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + indent +
507b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionMessage = \"length of " + cname + " is shorter than " +
508b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            checks[index + 2] + " argument\";");
509b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + indent + "goto exit;");
510b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(iii + "}");
511b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    index += 3;
512b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    needsExit = true;
513b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                } else {
514b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    index = skipOneCheck(checks, index);
515b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
516b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            }
517b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos        }
518b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos    }
519b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
52066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitLocalVariablesForSentinel(CFunc cfunc, PrintStream out) {
52166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
52266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
52366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
52466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
52566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
52666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
52766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
52866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String cname = checks[index + 1];
52966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "bool " + cname + "_sentinel = false;");
53066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
53166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
53266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
53366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
53466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
53566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
53666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
53766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
53866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
53966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
540ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    boolean hasNonConstArg(JFunc jfunc, CFunc cfunc, List<Integer> nonPrimitiveArgs) {
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5596cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Emit a function in several variants:
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if nativeDecl: public native <returntype> func(args);
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if !nativeDecl:
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if interfaceDecl:  public <returntype> func(args);
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if !interfaceDecl: public <returntype> func(args) { body }
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
569ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void emitFunction(JFunc jfunc, PrintStream out, boolean nativeDecl, boolean interfaceDecl) {
57066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!nativeDecl && !interfaceDecl && !isPointerFunc) {
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // If it's not a pointer function, we've already emitted it
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // with nativeDecl == true
575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
578427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        String maybeStatic = mUseStaticMethods ? "static " : "";
579427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
582427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "private " + maybeStatic +"native " :
583427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "Bounds" : "") +
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
590427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "public " + maybeStatic +"native " :
591427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
5966cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
6016cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + indent + argType + " " + argName);
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc && nativeDecl) {
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + "int remaining");
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nativeDecl || interfaceDecl) {
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ") {");
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String iii = indent + indent;
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // emitBoundsChecks(jfunc, out, iii);
62346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            emitFunctionCall(jfunc, out, iii, false);
62446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
62546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // Set the pointer after we call the native code, so that if
62646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // the native code throws an exception we don't modify the
62746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // pointer. We assume that the native code is written so that
62846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // if an exception is thrown, then the underlying glXXXPointer
62946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // function will not have been called.
63046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String fname = jfunc.getName();
632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isPointerFunc) {
633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // TODO - deal with VBO variants
634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (fname.equals("glColorPointer")) {
635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if ((size == 4) &&");
636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_UNSIGNED_BYTE) ||");
638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_colorPointer = pointer;");
641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glNormalPointer")) {
643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((type == GL_FLOAT) ||");
644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_normalPointer = pointer;");
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glTexCoordPointer")) {
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_texCoordPointer = pointer;");
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glVertexPointer")) {
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
669edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_vertexPointer = pointer;");
671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
67266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glPointSizePointerOES")) {
67366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((type == GL_FLOAT) ||");
67466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
67566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
67666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_pointSizePointerOES = pointer;");
67766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
67866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glMatrixIndexPointerOES")) {
67966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
68066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
68166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
68266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
68366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
68466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
68566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
68666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
68766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_matrixIndexPointerOES = pointer;");
68866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
68966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glWeightPointer")) {
69066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
69166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
69266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
69366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
69466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
69566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
69666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
69766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
69866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_weightPointerOES = pointer;");
69966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean isVoid = jfunc.getType().isVoid();
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + indent + "return _returnValue;");
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "}");
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
713ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public void addNativeRegistration(String s) {
714ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        nativeRegistrations.add(s);
715ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
7166cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
717427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich    public void emitNativeRegistration(String registrationFunctionName,
718427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            PrintStream cStream) {
719ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("static const char *classPathName = \"" +
720ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        mClassPathName +
721ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "\";");
722ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
723ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
724c4e95a3e5ee2076d0c9bb1f18920e31c325bf391Daniel Micay        cStream.println("static const JNINativeMethod methods[] = {");
725ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
726ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },");
727ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
728ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        Iterator<String> i = nativeRegistrations.iterator();
729ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        while (i.hasNext()) {
730ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            cStream.println(i.next());
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
732ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
733ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("};");
734ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
735ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
736ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
737427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        cStream.println("int " + registrationFunctionName + "(JNIEnv *_env)");
738ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{");
739ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
740ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "int err;");
741ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
742ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
743ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));");
744ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
745ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent + "return err;");
746ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("}");
747ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
748ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
749ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public JniCodeEmitter() {
750ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        super();
751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniType(JType jType) {
754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isVoid()) {
755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "void";
756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String baseType = jType.getBaseType();
759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isPrimitive()) {
760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (baseType.equals("String")) {
761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "jstring";
762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "j" + baseType;
764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (jType.isArray()) {
76666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return jType.isClass() ? "jobjectArray" : "j" + baseType + "Array";
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "jobject";
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
7716cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniMangledName(String name) {
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("_", "_1");
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll(";", "_2");
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("\\[", "_3");
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return name;
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJniCode(JFunc jfunc, PrintStream out) {
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CFunc cfunc = jfunc.getCFunc();
7816cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit comment identifying original C function
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */
787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("/* " + cfunc.getOriginal() + " */");
789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (name)
791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // void
795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android_glClipPlanef__I_3FI
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String outName = "android_" + jfunc.getName();
79966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
800071fc660597efdfa5ebc58b427252393e628a497Jesse Hall        boolean isPointerOffsetFunc =
801071fc660597efdfa5ebc58b427252393e628a497Jesse Hall            (outName.endsWith("Pointer") || outName.endsWith("PointerOES") ||
802071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glDrawElements") ||
803071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glDrawRangeElements") ||
804071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexImage2D") ||
805071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexSubImage2D") ||
806071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexImage2D") ||
807071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexSubImage2D") ||
808071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexImage3D") ||
809071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexSubImage3D") ||
810071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexImage3D") ||
811071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexSubImage3D") ||
812071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glReadPixels"))
813071fc660597efdfa5ebc58b427252393e628a497Jesse Hall            && !jfunc.getCFunc().hasPointerArg();
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName += "Bounds";
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("static ");
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(getJniType(jfunc.getType()));
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(outName);
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String rsignature = getJniName(jfunc.getType());
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature = "";
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += getJniName(argType);
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += "I";
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Append signature to function name
83550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        String sig = getJniMangledName(signature).replace('.', '_').replace('/', '_');
83666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (!mUseSimpleMethodNames) {
83766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.print("__" + sig);
83866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            outName += "__" + sig;
83966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
8406cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = signature.replace('.', '/');
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsignature = rsignature.replace('.', '/');
8436cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (rsignature.length() == 0) {
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature = "V";
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String s = "{\"" +
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getName() +
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (isPointerFunc ? "Bounds" : "") +
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", \"(" + signature +")" +
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature +
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", (void *) " +
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName +
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            " },";
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nativeRegistrations.add(s);
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<Integer> nonPrimitiveArgs = new ArrayList<Integer>();
86050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        List<Integer> stringArgs = new ArrayList<Integer>();
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBufferArgs = 0;
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<String> bufferArgNames = new ArrayList<String>();
863569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi        List<JType> bufferArgTypes = new ArrayList<JType>();
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (arguments)
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) {
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("  (JNIEnv *_env, jobject _this");
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", ");
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
87566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String suffix = "";
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!argType.isPrimitive()) {
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (argType.isArray()) {
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_ref";
87966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (argType.isBuffer()) {
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_buf";
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nonPrimitiveArgs.add(new Integer(i));
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(i).isBuffer()) {
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int cIndex = jfunc.getArgCIndex(i);
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String cname = cfunc.getArgName(cIndex);
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    bufferArgNames.add(cname);
887569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    bufferArgTypes.add(jfunc.getArgType(i));
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    numBufferArgs++;
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
89166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
89250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
89350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                stringArgs.add(new Integer(i));
89450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix);
897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", jint remaining");
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(") {");
9026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArrays = 0;
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBuffers = 0;
90550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        int numStrings = 0;
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int idx = nonPrimitiveArgs.get(i).intValue();
90850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            JType argType = jfunc.getArgType(idx);
90950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isArray()) {
910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numArrays;
911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
91250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isBuffer()) {
913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numBuffers;
914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
91550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
91650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                ++numStrings;
91750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit method body
921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for _exception and _returnValue
923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android::gl::ogles_context_t *ctx;
9276cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        //
928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // jint _exception;
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLenum _returnValue;
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isUnsupported = isUnsupportedFunc(cfunc);
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isUnsupported) {
936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
9379875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "    \"" + cfunc.getName() + "\");");
940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String retval = getErrorReturnValue(cfunc);
94266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
94366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
94466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
94566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
94666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
94766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
94866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
94966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("}");
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
9559875750593aae7c2a62f33c620809d49162393ebElliott Hughes
956e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String requiresExtension = isRequiresFunc(cfunc);
957e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (requiresExtension != null) {
958e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent +
959e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {");
960e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
9619875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
962e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
963e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "    \"" + cfunc.getName() + "\");");
964e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            if (isVoid) {
965e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                out.println(indent + indent + "    return;");
966e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            } else {
967e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                String retval = getErrorReturnValue(cfunc);
96866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
96966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
97066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
97166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
97266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
97366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
97466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
97566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
976e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
977e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + "}");
978e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "android::gl::ogles_context_t *ctx = getContext(_env, _this);");
982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        boolean initializeReturnValue = stringArgs.size() > 0;
98566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0)
98666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                             && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs)
98766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                                 || (cfunc.hasPointerArg() && numArrays > 0))
9887969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                                         || (numBufferArgs > 0)
98966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasCheckTest(cfunc)
99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasIfTest(cfunc))
99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || (stringArgs.size() > 0);
992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // mChecker.getChecks(cfunc.getName()) != null
993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit an _exeption variable if there will be error checks
994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "jint _exception = 0;");
996bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionType = NULL;");
997bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionMessage = NULL;");
998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit a single _array or multiple _XXXArray variables
1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numBufferArgs == 1) {
1002569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi            JType bufferType = bufferArgTypes.get(0);
1003569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi            if (bufferType.isTypedBuffer()) {
1004569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer());
1005569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                out.println(indent + typedArrayType + " _array = (" + typedArrayType + ") 0;");
1006569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi            } else {
1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _array = (jarray) 0;");
1008569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi            }
1009569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi            out.println(indent + "jint _bufferOffset = (jint) 0;");
1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numBufferArgs; i++) {
1012569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                JType bufferType = bufferArgTypes.get(0);
1013569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                if (bufferType.isTypedBuffer()) {
1014569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer());
1015569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + typedArrayType + " _" + bufferArgNames.get(i) +
1016569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "Array = (" + typedArrayType + ") 0;");
1017569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                } else {
1018569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + "jarray _" + bufferArgNames.get(i) +
1019569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "Array = (jarray) 0;");
1020569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                }
1021e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _" + bufferArgNames.get(i) +
1022e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "BufferOffset = (jint) 0;");
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String retval = getErrorReturnValue(cfunc);
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (retval != null) {
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue = " + retval + ";");
103050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            } else if (initializeReturnValue) {
103150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + returnType.getDeclaration() +
103266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            " _returnValue = 0;");
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue;");
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
103966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for EGL Handles
104066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
104166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
104266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
104366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface);
104466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
104566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
104666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
104766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
104866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
104966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
105066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
105166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isBuffer()
105266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || jfunc.getArgType(idx).isArray()
105366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || !jfunc.getArgType(idx).isEGLHandle())
105466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
105566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
105666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
105766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String decl = type.getDeclaration();
105866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
105966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + " " + cname + "_native = (" +
106066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + ") fromEGLHandle(_env, " +
106166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            type.getBaseType().toLowerCase() +
106266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "GetHandleID, " + jfunc.getArgName(idx) +
106366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            ");");
106466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
106566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
106666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
106766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for element/sentinel checks
106866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
106966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
107066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
107166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // bool attrib_list_sentinel_found = false;
107266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
107366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        emitLocalVariablesForSentinel(cfunc, out);
107466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for pointer arguments
1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn_base;
1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn;
1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String offset = "offset";
1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String remaining = "_remaining";
1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray())
109166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
109266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String decl = type.getDeclaration();
109566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                decl +
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (decl.endsWith("*") ? "" : " ") +
1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" + decl + ") 0;");
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
110250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "jint " + remaining + ";");
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
110766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                decl +
110866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (decl.endsWith("*") ? "" : " ") +
110966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) +
111066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " = (" + decl + ") 0;");
1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
111750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
1118b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            boolean requiresStringLengthCheck = false;
111950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
112050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
112150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
112250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
112350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
112450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "const char* _native" + cname + " = 0;");
1125b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (hasCheckTest(cfunc, cname)) {
1126b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    requiresStringLengthCheck = true;
1127b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
1128b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            }
1129b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1130b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos            if (requiresStringLengthCheck) {
1131b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                out.println(indent + "jsize _stringlen = 0;");
113250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
113350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
113450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
113550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
113650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
113750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Null pointer checks and GetStringUTFChars
113850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
113950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
114050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
114150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
114250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
114350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1144b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                boolean nullAllowed = isNullAllowed(cfunc, cname);
1145b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                String nullAllowedIndent = nullAllowed ? indent : "";
1146b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
114750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
114850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String decl = type.getDeclaration();
1149b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1150b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (nullAllowed) {
1151b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + "if (" + cname + ") {");
1152b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                } else {
1153b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    needsExit = true;
1154b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + "if (!" + cname + ") {");
1155b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + indent + "_exception = 1;");
1156b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + indent +
115766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionType = \"java/lang/IllegalArgumentException\";");
1158b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + indent +
115966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionMessage = \"" + cname + " == null\";");
1160b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + indent + "goto exit;");
1161b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + "}");
1162b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
1163b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1164b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                out.println(nullAllowedIndent + indent + "_native" + cname +
1165b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        " = _env->GetStringUTFChars(" + cname + ", 0);");
1166b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1167b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                emitStringCheck(cfunc, cname, out, nullAllowedIndent + indent);
116850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1169b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                if (nullAllowed) {
1170b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(indent + "}");
1171b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                }
117250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
117350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
117450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
117550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
117650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
117766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for non-object arrays
1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPointer' calls for Buffer pointers
1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
11836cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                offset = numArrays <= 1 ? "offset" :
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    cname + "Offset";
118750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1190b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                boolean nullAllowed = isNullAllowed(cfunc, cname);
1191b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                String nullAllowedIndent = nullAllowed ? indent : "";
1192b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
119366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray()
119466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                       && !jfunc.getArgType(idx).isEGLHandle()) {
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1197b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    if (nullAllowed) {
1198b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "if (" + cname + "_ref) {");
1199b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1200b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    else
1201b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    {
1202b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "if (!" + cname + "_ref) {");
1203b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "_exception = 1;");
1204b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent +
1205b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                "_exceptionType = " +
1206b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                "\"java/lang/IllegalArgumentException\";");
1207b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent +
1208b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                "_exceptionMessage = \"" + cname +
1209b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                " == null\";");
1210b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "goto exit;");
1211b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "}");
1212b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1213b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1214b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + "if (" + offset +
1215b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            " < 0) {");
1216b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1217b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exception = 1;");
1218b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1219b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionType = " +
1220b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "\"java/lang/IllegalArgumentException\";");
1221b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1222b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionMessage = \"" + offset +" < 0\";");
1223b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1224b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "goto exit;");
1225b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + "}");
1226b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1227b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + remaining + " = " +
1228b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            (mUseCPlusPlus ? "_env" : "(*_env)") +
1229b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "->GetArrayLength(" +
1230b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            (mUseCPlusPlus ? "" : "_env, ") +
1231b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            cname + "_ref) - " + offset + ";");
1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, false,
1234b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            emitExceptionCheck, offset, remaining,
1235b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            nullAllowedIndent + indent);
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1237b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent +
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" +
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")");
1242569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    String arrayGetter = jfunc.getArgType(idx).getArrayGetterForPrimitiveArray();
1243b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + "    " +
1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1245569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "->" + arrayGetter + "(" +
12466cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref, (jboolean *)0);");
1249b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent +
125066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + " = " + cname + "_base + " + offset + ";");
125166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
125266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitSentinelCheck(cfunc, cname, out, false,
1253b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            emitExceptionCheck, offset, remaining,
1254b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            nullAllowedIndent + indent);
1255b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1256b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    if (nullAllowed) {
1257b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "}");
1258b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1259b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
126166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isArray()
126266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                              && jfunc.getArgType(idx).isEGLHandle()) {
126366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
126466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1265b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    if (nullAllowed) {
1266b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "if (" + cname + "_ref) {");
1267b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1268b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    else
1269b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    {
1270b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "if (!" + cname + "_ref) {");
1271b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "_exception = 1;");
1272b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "_exceptionType = " +
1273b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                "\"java/lang/IllegalArgumentException\";");
1274b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "_exceptionMessage = \"" +
1275b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                                cname +" == null\";");
1276b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + indent + "goto exit;");
1277b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "}");
1278b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1279b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1280b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + "if (" + offset +
1281b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            " < 0) {");
1282b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1283b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exception = 1;");
1284b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1285b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionType = " +
1286b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "\"java/lang/IllegalArgumentException\";");
1287b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1288b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "_exceptionMessage = \"" + offset +" < 0\";");
1289b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + indent +
1290b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            "goto exit;");
1291b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + "}");
1292b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1293b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent + remaining + " = " +
129466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
129566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    "->GetArrayLength(" +
129666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "" : "_env, ") +
129766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    cname + "_ref) - " + offset + ";");
129866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitNativeBoundsChecks(cfunc, cname, out, false,
1299b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            emitExceptionCheck, offset, remaining,
1300b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                            nullAllowedIndent + indent);
1301b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    out.println(nullAllowedIndent + indent +
130266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) + " = new " +
130366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgType(cIndex).getBaseType() +
130466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "["+ remaining + "];");
1305b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
1306b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    if (nullAllowed) {
1307b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        out.println(indent + "}");
1308b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    }
1309b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos
131066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println();
131166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isBuffer()) {
13127969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                    needsExit = needsExit || (!nullAllowed && !isPointerFunc);
13137969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
1315e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "Array";
1316e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                    String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1317e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "BufferOffset";
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1319b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                    nullAllowed = nullAllowed || isPointerFunc;
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "if (" + cname + "_buf) {");
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.print(indent);
1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
13247969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                    else
13257969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                    {
13267969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + "if (!" + cname + "_buf) {");
13277969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + indent + "_exception = 1;");
13287969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + indent + "_exceptionType = " +
13297969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                                "\"java/lang/IllegalArgumentException\";");
13307969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + indent + "_exceptionMessage = \"" +
13317969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                                cname +" == null\";");
13327969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + indent + "goto exit;");
13337969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                        out.println(indent + "}");
13347969999ddd959a6e5e2fb5842ea0e17ac6bb13a5Romain Guy                    }
13356cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
133646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (isPointerFunc) {
133746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " = (" +
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
13416eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich                                ") getDirectBufferPointer(_env, " +
134246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                cname + "_buf);");
134346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String iii = "    ";
13445afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                        out.println(iii + indent + "if ( ! " + cname + " ) {");
134566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        out.println(iii + indent + indent + "return;");
134646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(iii + indent + "}");
134746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    } else {
134846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
134946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
135046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    " = (" +
135146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgType(cIndex).getDeclaration() +
135246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ")getPointer(_env, " +
135346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
1354569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                    "_buf, (jarray*)&" + array + ", &" + remaining + ", &" + bufferOffset +
135546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
135646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13585afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                    emitNativeBoundsChecks(cfunc, cname, out, true,
13595afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           emitExceptionCheck,
13605afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           offset, remaining, nullAllowed ? "        " : "    ");
13615afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "}");
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1369e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for pointers if needed
1370e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
1371e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1372e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
1373e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
1374e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1375e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue;
1376e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1377e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
1378e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1379e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cname + "BufferOffset";
1380e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String array = numBufferArgs <= 1 ? "_array" :
1381e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
1382e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1383b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                boolean nullAllowed = isNullAllowed(cfunc, cname) ||
1384b62e242c4c2bdfe84ce28231d2fcc85e79517f8cPablo Ceballos                        isPointerFunc;
138536b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                if (nullAllowed) {
138636b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {");
138736b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                } else {
138836b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname +" == NULL) {");
138936b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                }
1390569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                JType argType = jfunc.getArgType(idx);
1391569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                if (argType.isTypedBuffer()) {
1392569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    String arrayGetter = argType.getArrayTypeForTypedBuffer().getArrayGetterForPrimitiveArray();
1393569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->" + arrayGetter + "(" + array + ", (jboolean *) 0);");
1394569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
1395569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + "}");
1396569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                } else {
1397569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);");
1398569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
1399569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    out.println(indent + "}");
1400569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                }
1401e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer             }
1402e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        }
1403e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1404e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + "_returnValue = ");
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent);
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String name = cfunc.getName();
1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(2, name.length()); // Strip off 'gl' prefix
1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(0, 1).toLowerCase() +
1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                name.substring(1, name.length());
1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print("ctx->procs.");
1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
14186cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(name + (isPointerFunc ? "Bounds" : "") + "(");
1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
14216cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        numArgs = cfunc.getNumArgs();
1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numArgs == 0) {
1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx);");
1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(");");
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx,");
1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println();
1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numArgs; i++) {
1435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typecast;
1436071fc660597efdfa5ebc58b427252393e628a497Jesse Hall                if (i == numArgs - 1 && isPointerOffsetFunc) {
1437d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                    typecast = "reinterpret_cast<GLvoid *>";
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
143966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")";
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(indent + indent +
144266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                          typecast);
144366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
144450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                if (cfunc.getArgType(i).isConstCharPointer()) {
144550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                    out.print("_native");
144650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                }
144766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1448e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if (cfunc.getArgType(i).isEGLHandle() &&
144966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    !cfunc.getArgType(i).isPointer()){
145066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i)+"_native");
1451d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                } else if (i == numArgs - 1 && isPointerOffsetFunc){
1452d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                    out.print("("+cfunc.getArgName(i)+")");
145366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
145466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i));
145566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1) {
1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (isPointerFunc) {
1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(",");
1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "(GLsizei)remaining");
1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else {
1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println();
1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsExit) {
1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("exit:");
1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            needsExit = false;
1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1477e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
148366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
14846cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // If the argument is 'const', GL will not write to it.
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // In this case, we can use the 'JNI_ABORT' flag to avoid
1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // the need to write back to the Java array
1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "if (" + jfunc.getArgName(idx) + "_base) {");
1490569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                    String arrayReleaser = jfunc.getArgType(idx).getArrayReleaserForPrimitiveArray();
1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1493569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "->" + arrayReleaser + "(" +
14946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) + "_ref, " +
1496569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "(j" + jfunc.getArgType(idx).getBaseType() + "*)" + cfunc.getArgName(cIndex) +
1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base,");
1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + indent +
1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
150066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                 "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) +
1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
150446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (! isPointerFunc) {
1505569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                        JType argType = jfunc.getArgType(idx);
150646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String array = numBufferArgs <= 1 ? "_array" :
1507e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
150846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "if (" + array + ") {");
1509569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                        if (argType.isTypedBuffer()) {
1510569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                            String arrayReleaser =
1511569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                argType.getArrayTypeForTypedBuffer().getArrayReleaserForPrimitiveArray();
1512569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                            out.println(indent + indent +
1513569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "_env->" + arrayReleaser + "(" + array + ", " +
1514569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "(j" + argType.getArrayTypeForTypedBuffer().getBaseType() + "*)" +
1515569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                cfunc.getArgName(cIndex) +
1516569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                ", " +
1517569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                (cfunc.getArgType(cIndex).isConst() ?
1518569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                    "JNI_ABORT" : (emitExceptionCheck ?
1519569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                        "_exception ? JNI_ABORT : 0" : "0")) +
1520569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                ");");
1521569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                        } else {
1522569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                            out.println(indent + indent +
1523569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                "releasePointer(_env, " + array + ", " +
1524569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                cfunc.getArgName(cIndex) +
1525569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                ", " +
1526569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                (cfunc.getArgType(cIndex).isConst() ?
1527569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                    "JNI_FALSE" : (emitExceptionCheck ?
1528569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                        "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) +
1529569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                                ");");
1530569bc1bcddf08a3247e896b52da61772956964c5Hiroshi Yamauchi                        }
153146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "}");
153246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
153750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
153850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
153950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
154050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
154150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
154250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
154350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
154450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "if (_native" + cname + ") {");
154550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "    _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");");
154650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
154750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
154850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
154950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
155050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
155150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
155266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Copy results back to java arrays
155366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer       if (nonPrimitiveArgs.size() > 0) {
155466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
155566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
155666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
155766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase();
155866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) {
155966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    remaining  = ((numArrays + numBuffers) <= 1) ? "_remaining" :
156066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_" + cfunc.getArgName(cIndex) + "Remaining";
156166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset";
156266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
156366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + jfunc.getArgName(idx) + ") {");
156466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
156566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "for (int i = 0; i < " + remaining + "; i++) {");
156666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
156766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "jobject " + cfunc.getArgName(cIndex) +
156866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_new = toEGLHandle(_env, " + baseType +
156966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "Class, " + baseType + "Constructor, " +
157066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "[i]);");
157166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
157266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "_env" : "(*_env)") +
157366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "->SetObjectArrayElement(" +
157466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "" : "_env, ") +
157566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) +
157666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_ref, i + " + offset + ", " +
157766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "_new);");
157866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "}");
157966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
158066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "delete[] " + jfunc.getArgName(idx) + ";");
158166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
158266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
158366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
158466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
158566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
158666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
158766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Throw exception if there is one
158866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (emitExceptionCheck) {
158966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "if (_exception) {");
159066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + indent +
159166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        "jniThrowException(_env, _exceptionType, _exceptionMessage);");
159266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "}");
159366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
159466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
159566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
159650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
159866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (cfunc.getType().isEGLHandle()) {
159966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getType().getBaseType().toLowerCase();
160066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
160166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "return toEGLHandle(_env, " + baseType + "Class, " +
160266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            baseType + "Constructor, _returnValue);");
160366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            } else {
160468fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                out.println(indent + "return (" +
160568fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                            getJniType(jfunc.getType()) + ")_returnValue;");
160666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
1607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("}");
1610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
1611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1614