JniCodeEmitter.java revision 071fc660597efdfa5ebc58b427252393e628a497
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
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isNullAllowed(CFunc cfunc) {
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
23066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].equals("nullAllowed")) {
23166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
23266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
23366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
23466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
23566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
23666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
23766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
23866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
23966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
24066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasCheckTest(CFunc cfunc) {
24166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
24266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
24366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
24466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
24566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("check")) {
24666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    return true;
24766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
24866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
24966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
25066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
25166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
25266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return false;
25366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
25466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
25566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    boolean hasIfTest(CFunc cfunc) {
25666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
25766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
25866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
25966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
26066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("ifcheck")) {
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
26366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    int skipOneCheck(String[] checks, int index) {
27166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks[index].equals("return")) {
27266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
27366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("check")) {
27466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
27566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].startsWith("sentinel")) {
27666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 3;
27766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("ifcheck")) {
27866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 5;
27966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("unsupported")) {
28066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 1;
28166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("requires")) {
28266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 2;
28366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else if (checks[index].equals("nullAllowed")) {
28466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            index += 1;
28566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        } else {
28666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.out.println("Error: unknown keyword \"" +
28766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               checks[index] + "\"");
28866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            System.exit(0);
28966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
29066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
29166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        return index;
29266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
29366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getErrorReturnValue(CFunc cfunc) {
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isVoid) {
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return null;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (returnType.getBaseType().startsWith("EGL")) {
30266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return "(" + returnType.getDeclaration() + ") 0";
30366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
30466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("return")) {
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return checks[index + 1];
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
31366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return null;
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    boolean isUnsupportedFunc(CFunc cfunc) {
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String[] checks = mChecker.getChecks(cfunc.getName());
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int index = 1;
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (checks != null) {
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            while (index < checks.length) {
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (checks[index].equals("unsupported")) {
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    return true;
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
32966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
3359875750593aae7c2a62f33c620809d49162393ebElliott Hughes
336e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    String isRequiresFunc(CFunc cfunc) {
337e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String[] checks = mChecker.getChecks(cfunc.getName());
338e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        int index = 1;
339e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (checks != null) {
340e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            while (index < checks.length) {
34166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].equals("requires")) {
342e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                    return checks[index+1];
343e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                } else {
34466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
345e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                }
346e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
347e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
348e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        return null;
349e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich    }
3509875750593aae7c2a62f33c620809d49162393ebElliott Hughes
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    void emitNativeBoundsChecks(CFunc cfunc, String cname, PrintStream out,
352ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
353ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
3549875750593aae7c2a62f33c620809d49162393ebElliott Hughes        String[] checks = mChecker.getChecks(cfunc.getName());
3559875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3569875750593aae7c2a62f33c620809d49162393ebElliott Hughes        boolean lastWasIfcheck = false;
3579875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3589875750593aae7c2a62f33c620809d49162393ebElliott Hughes        int index = 1;
3599875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (checks != null) {
3609875750593aae7c2a62f33c620809d49162393ebElliott Hughes            while (index < checks.length) {
3619875750593aae7c2a62f33c620809d49162393ebElliott Hughes                if (checks[index].startsWith("check")) {
3629875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (lastWasIfcheck) {
3639875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        printIfcheckPostamble(out, isBuffer, emitExceptionCheck,
3649875750593aae7c2a62f33c620809d49162393ebElliott Hughes                                offset, remaining, iii);
3659875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3669875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = false;
3679875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (cname != null && !cname.equals(checks[index + 1])) {
3689875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        index += 3;
3699875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        continue;
3709875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
3719875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "if (" + remaining + " < " + checks[index + 2] + ") {");
37266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
3739875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String exceptionClassName = "java/lang/IllegalArgumentException";
374ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // If the "check" keyword was of the form
375ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // "check_<class name>", use the class name in the
376ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    // exception to be thrown
377ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    int underscore = checks[index].indexOf('_');
378ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                    if (underscore >= 0) {
3799875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        String abbr = checks[index].substring(underscore + 1);
3809875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        if (abbr.equals("AIOOBE")) {
3819875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            exceptionClassName = "java/lang/ArrayIndexOutOfBoundsException";
382ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        } else {
3839875750593aae7c2a62f33c620809d49162393ebElliott Hughes                            throw new RuntimeException("unknown exception abbreviation: " + abbr);
384ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
38666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
38766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \""+exceptionClassName+"\";");
38866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
38966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "_exceptionMessage = \"" +
39066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               (isBuffer ? "remaining()" : "length - " +
39166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               offset) + " < " + checks[index + 2] +
39266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               " < needed\";");
3939875750593aae7c2a62f33c620809d49162393ebElliott Hughes
3949875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + indent + "goto exit;");
3959875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "}");
3969875750593aae7c2a62f33c620809d49162393ebElliott Hughes
39766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
39866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
3999875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 3;
4009875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else if (checks[index].equals("ifcheck")) {
4019875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    String[] matches = checks[index + 4].split(",");
4026cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
4039875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    if (!lastWasIfcheck) {
4049875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "int _needed;");
4059875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "switch (" + checks[index + 3] + ") {");
4069875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4079875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4089875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    for (int i = 0; i < matches.length; i++) {
4099875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#if defined(" + matches[i] + ")");
4109875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println(iii + "    case " + matches[i] + ":");
4119875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        out.println("#endif // defined(" + matches[i] + ")");
4129875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    }
4139875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        _needed = " + checks[index + 2] + ";");
4149875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    out.println(iii + "        break;");
4159875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4169875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    lastWasIfcheck = true;
4179875750593aae7c2a62f33c620809d49162393ebElliott Hughes                    index += 5;
4189875750593aae7c2a62f33c620809d49162393ebElliott Hughes                } else {
41966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
4229875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4239875750593aae7c2a62f33c620809d49162393ebElliott Hughes
4249875750593aae7c2a62f33c620809d49162393ebElliott Hughes        if (lastWasIfcheck) {
4259875750593aae7c2a62f33c620809d49162393ebElliott Hughes            printIfcheckPostamble(out, isBuffer, emitExceptionCheck, iii);
4269875750593aae7c2a62f33c620809d49162393ebElliott Hughes        }
4279875750593aae7c2a62f33c620809d49162393ebElliott Hughes    }
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitSentinelCheck(CFunc cfunc, String cname, PrintStream out,
43066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            boolean isBuffer, boolean emitExceptionCheck, String offset, String remaining, String iii) {
43166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
43266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
43366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
43466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
43566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
43666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
43766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
43866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    if (cname != null && !cname.equals(checks[index + 1])) {
43966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        index += 3;
44066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        continue;
44166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    }
44266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
44366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + cname + "_sentinel = false;");
44466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "for (int i = " + remaining +
44566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " - 1; i >= 0; i--)  {");
44666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "if (" + cname +
44766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "[i] == " + checks[index + 2] + "){");
44866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent +
44966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + "_sentinel = true;");
45066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + indent + "break;");
45166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "}");
45266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
45366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii +
45466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + cname + "_sentinel == false) {");
45566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exception = 1;");
45666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent +
45766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
45866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "_exceptionMessage = \"" + cname +
45966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " must contain " + checks[index + 2] + "!\";");
46066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + indent + "goto exit;");
46166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(iii + "}");
46266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
46366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
46466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
46566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
46666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
46766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
46866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
46966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
47066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
47166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    void emitLocalVariablesForSentinel(CFunc cfunc, PrintStream out) {
47366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        String[] checks = mChecker.getChecks(cfunc.getName());
47566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
47666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        int index = 1;
47766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (checks != null) {
47866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            while (index < checks.length) {
47966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (checks[index].startsWith("sentinel")) {
48066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String cname = checks[index + 1];
48166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "bool " + cname + "_sentinel = false;");
48266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
48366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index += 3;
48466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
48566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
48666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    index = skipOneCheck(checks, index);
48766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
48866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
48966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
49066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer    }
49166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
492ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    boolean hasNonConstArg(JFunc jfunc, CFunc cfunc, List<Integer> nonPrimitiveArgs) {
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(idx).isArray()) {
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (!cfunc.getArgType(cIndex).isConst()) {
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        return true;
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5116cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /**
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * Emit a function in several variants:
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if nativeDecl: public native <returntype> func(args);
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * if !nativeDecl:
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if interfaceDecl:  public <returntype> func(args);
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *   if !interfaceDecl: public <returntype> func(args) { body }
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
521ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    void emitFunction(JFunc jfunc, PrintStream out, boolean nativeDecl, boolean interfaceDecl) {
52266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!nativeDecl && !interfaceDecl && !isPointerFunc) {
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // If it's not a pointer function, we've already emitted it
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // with nativeDecl == true
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
530427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        String maybeStatic = mUseStaticMethods ? "static " : "";
531427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
534427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "private " + maybeStatic +"native " :
535427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        (nativeDecl ? "Bounds" : "") +
539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
542427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                        (nativeDecl ? "public " + maybeStatic +"native " :
543427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich                         (interfaceDecl ? "" : "public ") + maybeStatic) +
544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getType() + " " +
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        jfunc.getName() +
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "(");
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
5486cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String argName = jfunc.getArgName(i);
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
5536cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + indent + argType + " " + argName);
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (i == numArgs - 1) {
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (isPointerFunc && nativeDecl) {
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + "int remaining");
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(",");
564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nativeDecl || interfaceDecl) {
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ") {");
571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String iii = indent + indent;
573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // emitBoundsChecks(jfunc, out, iii);
57546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            emitFunctionCall(jfunc, out, iii, false);
57646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
57746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // Set the pointer after we call the native code, so that if
57846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // the native code throws an exception we don't modify the
57946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // pointer. We assume that the native code is written so that
58046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // if an exception is thrown, then the underlying glXXXPointer
58146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich            // function will not have been called.
58246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich
583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String fname = jfunc.getName();
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (isPointerFunc) {
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                // TODO - deal with VBO variants
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (fname.equals("glColorPointer")) {
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if ((size == 4) &&");
588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_UNSIGNED_BYTE) ||");
590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_colorPointer = pointer;");
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glNormalPointer")) {
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((type == GL_FLOAT) ||");
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_normalPointer = pointer;");
601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glTexCoordPointer")) {
603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_texCoordPointer = pointer;");
612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (fname.equals("glVertexPointer")) {
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "if (((size == 2) ||");
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 3) ||");
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (size == 4)) &&");
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    ((type == GL_FLOAT) ||");
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_BYTE) ||");
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_SHORT) ||");
620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "     (type == GL_FIXED)) &&");
621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "    (stride >= 0)) {");
622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + indent + "_vertexPointer = pointer;");
623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(iii + "}");
62466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glPointSizePointerOES")) {
62566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((type == GL_FLOAT) ||");
62666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
62766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
62866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_pointSizePointerOES = pointer;");
62966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
63066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glMatrixIndexPointerOES")) {
63166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
63266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
63366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
63466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
63566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
63666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
63766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
63866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
63966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_matrixIndexPointerOES = pointer;");
64066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
64166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                } else if (fname.equals("glWeightPointer")) {
64266089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "if (((size == 2) ||");
64366089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 3) ||");
64466089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (size == 4)) &&");
64566089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    ((type == GL_FLOAT) ||");
64666089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_BYTE) ||");
64766089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_SHORT) ||");
64866089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "     (type == GL_FIXED)) &&");
64966089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "    (stride >= 0)) {");
65066089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + indent + "_weightPointerOES = pointer;");
65166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich                    out.println(iii + "}");
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            boolean isVoid = jfunc.getType().isVoid();
656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + indent + "return _returnValue;");
659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "}");
661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
665ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public void addNativeRegistration(String s) {
666ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        nativeRegistrations.add(s);
667ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
6686cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
669427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich    public void emitNativeRegistration(String registrationFunctionName,
670427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich            PrintStream cStream) {
671ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("static const char *classPathName = \"" +
672ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        mClassPathName +
673ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "\";");
674ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
675ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
676ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("static JNINativeMethod methods[] = {");
677ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
678ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{\"_nativeClassInit\", \"()V\", (void*)nativeClassInit },");
679ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
680ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        Iterator<String> i = nativeRegistrations.iterator();
681ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        while (i.hasNext()) {
682ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich            cStream.println(i.next());
683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
684ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
685ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("};");
686ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println();
687ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
688ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
689427f585f726af6e3bd1fb835f26b2af9f609c483Jack Palevich        cStream.println("int " + registrationFunctionName + "(JNIEnv *_env)");
690ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("{");
691ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
692ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "int err;");
693ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
694ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent +
695ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich                        "err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));");
696ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
697ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println(indent + "return err;");
698ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        cStream.println("}");
699ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    }
700ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich
701ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich    public JniCodeEmitter() {
702ffac1eff58b59ffdaca1c4a296fa7dead51c487bJack Palevich        super();
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniType(JType jType) {
706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isVoid()) {
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "void";
708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String baseType = jType.getBaseType();
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (jType.isPrimitive()) {
712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (baseType.equals("String")) {
713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "jstring";
714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                return "j" + baseType;
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else if (jType.isArray()) {
71866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            return jType.isClass() ? "jobjectArray" : "j" + baseType + "Array";
719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return "jobject";
721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
7236cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    String getJniMangledName(String name) {
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("_", "_1");
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll(";", "_2");
727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        name = name.replaceAll("\\[", "_3");
728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return name;
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    public void emitJniCode(JFunc jfunc, PrintStream out) {
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CFunc cfunc = jfunc.getCFunc();
7336cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit comment identifying original C function
735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // /* void glClipPlanef ( GLenum plane, const GLfloat *equation ) */
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("/* " + cfunc.getOriginal() + " */");
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (name)
743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // void
747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android_glClipPlanef__I_3FI
748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String outName = "android_" + jfunc.getName();
75166089a33ea4efda711a3a5180f0b001bdac48dcfJack Palevich        boolean isPointerFunc = isPointerFunc(jfunc);
752071fc660597efdfa5ebc58b427252393e628a497Jesse Hall        boolean isPointerOffsetFunc =
753071fc660597efdfa5ebc58b427252393e628a497Jesse Hall            (outName.endsWith("Pointer") || outName.endsWith("PointerOES") ||
754071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glDrawElements") ||
755071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glDrawRangeElements") ||
756071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexImage2D") ||
757071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexSubImage2D") ||
758071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexImage2D") ||
759071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexSubImage2D") ||
760071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexImage3D") ||
761071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glTexSubImage3D") ||
762071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexImage3D") ||
763071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glCompressedTexSubImage3D") ||
764071fc660597efdfa5ebc58b427252393e628a497Jesse Hall             outName.endsWith("glReadPixels"))
765071fc660597efdfa5ebc58b427252393e628a497Jesse Hall            && !jfunc.getCFunc().hasPointerArg();
766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName += "Bounds";
768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("static ");
771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(getJniType(jfunc.getType()));
772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(outName);
773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String rsignature = getJniName(jfunc.getType());
775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String signature = "";
777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArgs = jfunc.getNumArgs();
778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += getJniName(argType);
781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            signature += "I";
784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
786edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Append signature to function name
78750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        String sig = getJniMangledName(signature).replace('.', '_').replace('/', '_');
78866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (!mUseSimpleMethodNames) {
78966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.print("__" + sig);
79066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            outName += "__" + sig;
79166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
7926cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        signature = signature.replace('.', '/');
794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsignature = rsignature.replace('.', '/');
7956cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (rsignature.length() == 0) {
798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature = "V";
799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String s = "{\"" +
802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            jfunc.getName() +
803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            (isPointerFunc ? "Bounds" : "") +
804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", \"(" + signature +")" +
805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            rsignature +
806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            "\", (void *) " +
807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            outName +
808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            " },";
809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        nativeRegistrations.add(s);
810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<Integer> nonPrimitiveArgs = new ArrayList<Integer>();
81250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        List<Integer> stringArgs = new ArrayList<Integer>();
813edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBufferArgs = 0;
814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        List<String> bufferArgNames = new ArrayList<String>();
815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (arguments)
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) {
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("  (JNIEnv *_env, jobject _this");
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", ");
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
82666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String suffix = "";
827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!argType.isPrimitive()) {
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (argType.isArray()) {
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_ref";
83066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (argType.isBuffer()) {
831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_buf";
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nonPrimitiveArgs.add(new Integer(i));
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(i).isBuffer()) {
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int cIndex = jfunc.getArgCIndex(i);
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String cname = cfunc.getArgName(cIndex);
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    bufferArgNames.add(cname);
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    numBufferArgs++;
839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
84166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
84250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
84350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                stringArgs.add(new Integer(i));
84450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix);
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", jint remaining");
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(") {");
8526cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArrays = 0;
854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBuffers = 0;
85550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        int numStrings = 0;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int idx = nonPrimitiveArgs.get(i).intValue();
85850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            JType argType = jfunc.getArgType(idx);
85950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isArray()) {
860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numArrays;
861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
86250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isBuffer()) {
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numBuffers;
864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
86550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
86650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                ++numStrings;
86750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit method body
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for _exception and _returnValue
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android::gl::ogles_context_t *ctx;
8776cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        //
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // jint _exception;
879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLenum _returnValue;
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isUnsupported = isUnsupportedFunc(cfunc);
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isUnsupported) {
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
8879875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "    \"" + cfunc.getName() + "\");");
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String retval = getErrorReturnValue(cfunc);
89266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
89366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
89466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
89566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
89666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
89766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
89866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
89966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("}");
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
9059875750593aae7c2a62f33c620809d49162393ebElliott Hughes
906e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String requiresExtension = isRequiresFunc(cfunc);
907e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (requiresExtension != null) {
908e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent +
909e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {");
910e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
9119875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
912e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
913e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "    \"" + cfunc.getName() + "\");");
914e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            if (isVoid) {
915e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                out.println(indent + indent + "    return;");
916e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            } else {
917e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                String retval = getErrorReturnValue(cfunc);
91866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
91966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
92066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
92166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
92266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
92366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
92466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
92566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
926e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
927e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + "}");
928e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "android::gl::ogles_context_t *ctx = getContext(_env, _this);");
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        boolean initializeReturnValue = stringArgs.size() > 0;
93566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0)
93666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                             && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs)
93766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                                 || (cfunc.hasPointerArg() && numArrays > 0))
93866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasCheckTest(cfunc)
93966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasIfTest(cfunc))
94066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || (stringArgs.size() > 0);
941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // mChecker.getChecks(cfunc.getName()) != null
942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit an _exeption variable if there will be error checks
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "jint _exception = 0;");
945bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionType = NULL;");
946bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionMessage = NULL;");
947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit a single _array or multiple _XXXArray variables
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numBufferArgs == 1) {
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _array = (jarray) 0;");
952e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _bufferOffset = (jint) 0;");
953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numBufferArgs; i++) {
955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _" + bufferArgNames.get(i) +
956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "Array = (jarray) 0;");
957e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _" + bufferArgNames.get(i) +
958e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "BufferOffset = (jint) 0;");
959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String retval = getErrorReturnValue(cfunc);
963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (retval != null) {
964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue = " + retval + ";");
96650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            } else if (initializeReturnValue) {
96750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + returnType.getDeclaration() +
96866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            " _returnValue = 0;");
969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue;");
972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for EGL Handles
97666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
97766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
97866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
97966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface);
98066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
98166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
98266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
98366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
98466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
98566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
98666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
98766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isBuffer()
98866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || jfunc.getArgType(idx).isArray()
98966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || !jfunc.getArgType(idx).isEGLHandle())
99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
99266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
99366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String decl = type.getDeclaration();
99466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
99566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + " " + cname + "_native = (" +
99666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + ") fromEGLHandle(_env, " +
99766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            type.getBaseType().toLowerCase() +
99866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "GetHandleID, " + jfunc.getArgName(idx) +
99966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            ");");
100066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
100166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
100266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
100366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for element/sentinel checks
100466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
100566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
100666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
100766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // bool attrib_list_sentinel_found = false;
100866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
100966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        emitLocalVariablesForSentinel(cfunc, out);
101066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for pointer arguments
1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn_base;
1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn;
1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String offset = "offset";
1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String remaining = "_remaining";
1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray())
102766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
102866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String decl = type.getDeclaration();
103166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                decl +
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (decl.endsWith("*") ? "" : " ") +
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" + decl + ") 0;");
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
103850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "jint " + remaining + ";");
1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
104366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                decl +
104466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (decl.endsWith("*") ? "" : " ") +
104566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) +
104666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " = (" + decl + ") 0;");
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
105350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
105450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
105550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
105650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
105750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
105850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
105950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "const char* _native" + cname + " = 0;");
106050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
106150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
106250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
106350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
106450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
106550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Null pointer checks and GetStringUTFChars
106650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
106750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
106850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
106950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
107050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
107150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
107350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String decl = type.getDeclaration();
107450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                needsExit = true;
107566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + "if (!" + cname + ") {");
107666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
107766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionType = \"java/lang/IllegalArgumentException\";");
107866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
107966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionMessage = \"" + cname + " == null\";");
108066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent + "goto exit;");
108150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
108250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
108350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "_native" + cname + " = _env->GetStringUTFChars(" + cname + ", 0);");
108450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
108550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
108650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
108750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
108850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
108966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for non-object arrays
1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPointer' calls for Buffer pointers
1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
10956cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                offset = numArrays <= 1 ? "offset" :
1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    cname + "Offset";
109950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray()
110366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                       && !jfunc.getArgType(idx).isEGLHandle()) {
1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
110566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
110666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
110766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
110866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
110966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
111066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + cname +" == null\";");
111166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "if (" + offset + " < 0) {");
111466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
111566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
111666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
111766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
111866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + offset +" < 0\";");
111966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + remaining + " = " +
11236cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "->GetArrayLength(" +
1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    (mUseCPlusPlus ? "" : "_env, ") +
1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    cname + "_ref) - " + offset + ";");
1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, false,
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           emitExceptionCheck,
1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           offset, remaining, "    ");
1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" +
1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")");
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->GetPrimitiveArrayCritical(" +
11406cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref, (jboolean *)0);");
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
114466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + " = " + cname + "_base + " + offset + ";");
114566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
114666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitSentinelCheck(cfunc, cname, out, false,
114766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      emitExceptionCheck, offset,
114866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      remaining, indent);
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
115066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isArray()
115166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                              && jfunc.getArgType(idx).isEGLHandle()) {
115266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
115366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
115466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
115566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
115666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
115766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + cname +" == null\";");
115866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
115966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
116066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (" + offset + " < 0) {");
116166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
116266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
116366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
116466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + offset +" < 0\";");
116566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
116666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
116766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
116866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + remaining + " = " +
116966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
117066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    "->GetArrayLength(" +
117166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "" : "_env, ") +
117266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    cname + "_ref) - " + offset + ";");
117366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitNativeBoundsChecks(cfunc, cname, out, false,
117466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           emitExceptionCheck,
117566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           offset, remaining, "    ");
117666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
117766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) + " = new " +
117866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgType(cIndex).getBaseType() +
117966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "["+ remaining + "];");
118066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println();
118166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isBuffer()) {
1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
1183e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "Array";
1184e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                    String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1185e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "BufferOffset";
1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "if (" + cname + "_buf) {");
1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.print(indent);
1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
11926cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
119346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (isPointerFunc) {
119446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " = (" +
1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
11986eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich                                ") getDirectBufferPointer(_env, " +
119946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                cname + "_buf);");
120046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String iii = "    ";
12015afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                        out.println(iii + indent + "if ( ! " + cname + " ) {");
120266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        out.println(iii + indent + indent + "return;");
120346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(iii + indent + "}");
120446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    } else {
120546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
120646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
120746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    " = (" +
120846d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgType(cIndex).getDeclaration() +
120946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ")getPointer(_env, " +
121046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
1211e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                                    "_buf, &" + array + ", &" + remaining + ", &" + bufferOffset +
121246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
121346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12155afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                    emitNativeBoundsChecks(cfunc, cname, out, true,
12165afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           emitExceptionCheck,
12175afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           offset, remaining, nullAllowed ? "        " : "    ");
12185afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich
1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "}");
1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1226e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for pointers if needed
1227e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
1228e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1229e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
1230e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
1231e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1232e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue;
1233e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1234e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
1235e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1236e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cname + "BufferOffset";
1237e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String array = numBufferArgs <= 1 ? "_array" :
1238e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
1239e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
124036b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
124136b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                if (nullAllowed) {
124236b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {");
124336b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                } else {
124436b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname +" == NULL) {");
124536b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                }
1246e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);");
1247e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
1248e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "}");
1249e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer             }
1250e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        }
1251e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1252e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + "_returnValue = ");
1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent);
1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String name = cfunc.getName();
1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(2, name.length()); // Strip off 'gl' prefix
1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(0, 1).toLowerCase() +
1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                name.substring(1, name.length());
1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print("ctx->procs.");
1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
12666cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(name + (isPointerFunc ? "Bounds" : "") + "(");
1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12696cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        numArgs = cfunc.getNumArgs();
1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numArgs == 0) {
1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx);");
1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(");");
1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx,");
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println();
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numArgs; i++) {
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typecast;
1284071fc660597efdfa5ebc58b427252393e628a497Jesse Hall                if (i == numArgs - 1 && isPointerOffsetFunc) {
1285071fc660597efdfa5ebc58b427252393e628a497Jesse Hall                    typecast = "(GLvoid *)";
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
128766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")";
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(indent + indent +
129066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                          typecast);
129166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
129250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                if (cfunc.getArgType(i).isConstCharPointer()) {
129350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                    out.print("_native");
129450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                }
129566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1296e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if (cfunc.getArgType(i).isEGLHandle() &&
129766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    !cfunc.getArgType(i).isPointer()){
129866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i)+"_native");
129966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
130066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i));
130166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1) {
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (isPointerFunc) {
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(",");
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "(GLsizei)remaining");
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else {
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println();
1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsExit) {
1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("exit:");
1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            needsExit = false;
1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1323e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
132966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
13306cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // If the argument is 'const', GL will not write to it.
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // In this case, we can use the 'JNI_ABORT' flag to avoid
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // the need to write back to the Java array
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "if (" + jfunc.getArgName(idx) + "_base) {");
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "->ReleasePrimitiveArrayCritical(" +
13396cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) + "_ref, " +
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgName(cIndex) +
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base,");
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + indent +
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
134566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                 "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) +
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
134946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (! isPointerFunc) {
135046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String array = numBufferArgs <= 1 ? "_array" :
1351e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
135246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "if (" + array + ") {");
135346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + indent +
135446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    "releasePointer(_env, " + array + ", " +
135546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgName(cIndex) +
135646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ", " +
135746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    (cfunc.getArgType(cIndex).isConst() ?
135866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "JNI_FALSE" : (emitExceptionCheck ?
135966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) +
136046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
136146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "}");
136246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
136750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
136850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
136950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
137050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
137150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
137250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
137350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
137450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "if (_native" + cname + ") {");
137550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "    _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");");
137650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
137750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
137850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
137950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
138050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
138150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
138266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Copy results back to java arrays
138366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer       if (nonPrimitiveArgs.size() > 0) {
138466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
138566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
138666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
138766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase();
138866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) {
138966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    remaining  = ((numArrays + numBuffers) <= 1) ? "_remaining" :
139066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_" + cfunc.getArgName(cIndex) + "Remaining";
139166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset";
139266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
139366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + jfunc.getArgName(idx) + ") {");
139466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
139566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "for (int i = 0; i < " + remaining + "; i++) {");
139666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
139766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "jobject " + cfunc.getArgName(cIndex) +
139866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_new = toEGLHandle(_env, " + baseType +
139966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "Class, " + baseType + "Constructor, " +
140066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "[i]);");
140166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
140266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "_env" : "(*_env)") +
140366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "->SetObjectArrayElement(" +
140466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "" : "_env, ") +
140566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) +
140666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_ref, i + " + offset + ", " +
140766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "_new);");
140866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "}");
140966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
141066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "delete[] " + jfunc.getArgName(idx) + ";");
141166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
141266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
141366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
141466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
141566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
141666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
141766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Throw exception if there is one
141866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (emitExceptionCheck) {
141966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "if (_exception) {");
142066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + indent +
142166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        "jniThrowException(_env, _exceptionType, _exceptionMessage);");
142266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "}");
142366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
142466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
142566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
142650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
142866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (cfunc.getType().isEGLHandle()) {
142966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getType().getBaseType().toLowerCase();
143066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
143166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "return toEGLHandle(_env, " + baseType + "Class, " +
143266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            baseType + "Constructor, _returnValue);");
143366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            } else {
143468fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                out.println(indent + "return (" +
143568fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                            getJniType(jfunc.getType()) + ")_returnValue;");
143666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
1437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("}");
1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1444