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>();
8154e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi        List<JType> bufferArgTypes = new ArrayList<JType>();
816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit JNI signature (arguments)
818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // (JNIEnv *_env, jobject this, jint plane, jfloatArray equation_ref, jint offset) {
822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print("  (JNIEnv *_env, jobject _this");
824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < numArgs; i++) {
825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", ");
826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            JType argType = jfunc.getArgType(i);
82766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            String suffix = "";
828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!argType.isPrimitive()) {
829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (argType.isArray()) {
830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_ref";
83166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (argType.isBuffer()) {
832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    suffix = "_buf";
833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                nonPrimitiveArgs.add(new Integer(i));
835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (jfunc.getArgType(i).isBuffer()) {
836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    int cIndex = jfunc.getArgCIndex(i);
837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String cname = cfunc.getArgName(cIndex);
838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    bufferArgNames.add(cname);
8394e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    bufferArgTypes.add(jfunc.getArgType(i));
840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    numBufferArgs++;
841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
84366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
84450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
84550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                stringArgs.add(new Integer(i));
84650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(getJniType(argType) + " " + jfunc.getArgName(i) + suffix);
849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isPointerFunc) {
851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(", jint remaining");
852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println(") {");
8546cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numArrays = 0;
856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        int numBuffers = 0;
85750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        int numStrings = 0;
858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int idx = nonPrimitiveArgs.get(i).intValue();
86050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            JType argType = jfunc.getArgType(idx);
86150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isArray()) {
862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numArrays;
863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
86450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isBuffer()) {
865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                ++numBuffers;
866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
86750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            if (argType.isString()) {
86850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                ++numStrings;
86950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit method body
873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for _exception and _returnValue
875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // android::gl::ogles_context_t *ctx;
8796cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        //
880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // jint _exception;
881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLenum _returnValue;
882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        CType returnType = cfunc.getType();
884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isVoid = returnType.isVoid();
885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        boolean isUnsupported = isUnsupportedFunc(cfunc);
887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (isUnsupported) {
888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
8899875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        "    \"" + cfunc.getName() + "\");");
892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!isVoid) {
893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String retval = getErrorReturnValue(cfunc);
89466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
89566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
89666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
89766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
89866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
89966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
90066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
90166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("}");
904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
9079875750593aae7c2a62f33c620809d49162393ebElliott Hughes
908e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        String requiresExtension = isRequiresFunc(cfunc);
909e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        if (requiresExtension != null) {
910e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent +
911e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "if (! supportsExtension(_env, _this, have_" + requiresExtension + "ID)) {");
912e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
9139875750593aae7c2a62f33c620809d49162393ebElliott Hughes                        "jniThrowException(_env, \"java/lang/UnsupportedOperationException\",");
914e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + indent +
915e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                        "    \"" + cfunc.getName() + "\");");
916e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            if (isVoid) {
917e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                out.println(indent + indent + "    return;");
918e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            } else {
919e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich                String retval = getErrorReturnValue(cfunc);
92066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (cfunc.getType().isEGLHandle()) {
92166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    String baseType = cfunc.getType().getBaseType().toLowerCase();
92266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
92366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "return toEGLHandle(_env, " + baseType + "Class, " +
92466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                baseType + "Constructor, " + retval + ");");
92566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
92666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "return " + retval + ";");
92766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
928e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            }
929e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich            out.println(indent + "}");
930e44e45c454a1f6ab89bce338d4ef12471549a7a2Jack Palevich        }
931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent +
933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                "android::gl::ogles_context_t *ctx = getContext(_env, _this);");
934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        boolean initializeReturnValue = stringArgs.size() > 0;
93766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        boolean emitExceptionCheck = ((numArrays > 0 || numStrings > 0)
93866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                             && (hasNonConstArg(jfunc, cfunc, nonPrimitiveArgs)
93966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                                 || (cfunc.hasPointerArg() && numArrays > 0))
94066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasCheckTest(cfunc)
94166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || hasIfTest(cfunc))
94266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                         || (stringArgs.size() > 0);
943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // mChecker.getChecks(cfunc.getName()) != null
944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit an _exeption variable if there will be error checks
945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (emitExceptionCheck) {
946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + "jint _exception = 0;");
947bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionType = NULL;");
948bf13ba5e77804ca7466acb7100cdaf7c14cc0fb7Mathias Agopian            out.println(indent + "const char * _exceptionMessage = NULL;");
949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit a single _array or multiple _XXXArray variables
952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numBufferArgs == 1) {
9534e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi            JType bufferType = bufferArgTypes.get(0);
9544e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi            if (bufferType.isTypedBuffer()) {
9554e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer());
9564e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                out.println(indent + typedArrayType + " _array = (" + typedArrayType + ") 0;");
9574e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi            } else {
958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + "jarray _array = (jarray) 0;");
9594e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi            }
9604e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi            out.println(indent + "jint _bufferOffset = (jint) 0;");
961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numBufferArgs; i++) {
9634e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                JType bufferType = bufferArgTypes.get(0);
9644e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                if (bufferType.isTypedBuffer()) {
9654e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    String typedArrayType = getJniType(bufferType.getArrayTypeForTypedBuffer());
9664e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + typedArrayType + " _" + bufferArgNames.get(i) +
9674e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "Array = (" + typedArrayType + ") 0;");
9684e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                } else {
9694e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + "jarray _" + bufferArgNames.get(i) +
9704e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "Array = (jarray) 0;");
9714e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                }
972e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                out.println(indent + "jint _" + bufferArgNames.get(i) +
973e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "BufferOffset = (jint) 0;");
974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            String retval = getErrorReturnValue(cfunc);
978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (retval != null) {
979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue = " + retval + ";");
98150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            } else if (initializeReturnValue) {
98250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + returnType.getDeclaration() +
98366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            " _returnValue = 0;");
984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent + returnType.getDeclaration() +
986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            " _returnValue;");
987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for EGL Handles
99166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
99366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // EGLSurface surface_native = (EGLHandle)fromEGLHandle(_env, surfaceClass, surfaceConstructor, surface);
99566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
99666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
99766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
99866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
99966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
100066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
100166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
100266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isBuffer()
100366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || jfunc.getArgType(idx).isArray()
100466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                   || !jfunc.getArgType(idx).isEGLHandle())
100566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
100666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
100766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
100866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String decl = type.getDeclaration();
100966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
101066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + " " + cname + "_native = (" +
101166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            decl + ") fromEGLHandle(_env, " +
101266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            type.getBaseType().toLowerCase() +
101366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "GetHandleID, " + jfunc.getArgName(idx) +
101466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            ");");
101566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
101666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
101766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
101866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit local variable declarations for element/sentinel checks
101966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
102066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Example:
102166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
102266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // bool attrib_list_sentinel_found = false;
102366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        //
102466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        emitLocalVariablesForSentinel(cfunc, out);
102566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit local variable declarations for pointer arguments
1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Example:
1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn_base;
1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // GLfixed *eqn;
1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //
1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String offset = "offset";
1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String remaining = "_remaining";
1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (!jfunc.getArgType(idx).isBuffer() && !jfunc.getArgType(idx).isArray())
104266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    continue;
104366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String decl = type.getDeclaration();
104666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                decl +
1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (decl.endsWith("*") ? "" : " ") +
1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" + decl + ") 0;");
1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
105350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                            "jint " + remaining + ";");
1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(indent +
105866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                decl +
105966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (decl.endsWith("*") ? "" : " ") +
106066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) +
106166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                " = (" + decl + ") 0;");
1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
106750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
106850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
106950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
107050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
107150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
107250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
107350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "const char* _native" + cname + " = 0;");
107550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
107650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
107750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
107850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
107950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
108050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Null pointer checks and GetStringUTFChars
108150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
108250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
108350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
108450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
108550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
108650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
108750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                CType type = cfunc.getArgType(jfunc.getArgCIndex(idx));
108850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String decl = type.getDeclaration();
108950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                needsExit = true;
109066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + "if (!" + cname + ") {");
10912adde7c8372db646da2262731e47cda05afd7fe2Elliott Hughes                out.println(indent + indent + "_exception = 1;");
109266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
109366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionType = \"java/lang/IllegalArgumentException\";");
109466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent +
109566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "_exceptionMessage = \"" + cname + " == null\";");
109666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent + indent + "goto exit;");
109750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
109850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
109950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "_native" + cname + " = _env->GetStringUTFChars(" + cname + ", 0);");
110050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
110150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
110250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
110350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
110450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
110566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for non-object arrays
1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // Emit 'GetPointer' calls for Buffer pointers
1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
11116cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String cname = cfunc.getArgName(cIndex);
1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                offset = numArrays <= 1 ? "offset" :
1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    cname + "Offset";
111550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                remaining = ((numArrays + numBuffers) <= 1) ? "_remaining" :
1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    "_" + cname + "Remaining";
1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
111866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray()
111966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                       && !jfunc.getArgType(idx).isEGLHandle()) {
1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    needsExit = true;
112166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
112266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
112366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
112466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
112566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
112666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + cname +" == null\";");
112766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "if (" + offset + " < 0) {");
113066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
113166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
113266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
113366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
113466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionMessage = \"" + offset +" < 0\";");
113566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + remaining + " = " +
11396cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    "->GetArrayLength(" +
1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    (mUseCPlusPlus ? "" : "_env, ") +
1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                    cname + "_ref) - " + offset + ";");
1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    emitNativeBoundsChecks(cfunc, cname, out, false,
1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           emitExceptionCheck,
1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                           offset, remaining, "    ");
1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base = (" +
1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ")");
11534e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    String arrayGetter = jfunc.getArgType(idx).getArrayGetterForPrimitiveArray();
1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "    " +
1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
11564e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "->" + arrayGetter + "(" +
11576cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) +
1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_ref, (jboolean *)0);");
1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
116166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cname + " = " + cname + "_base + " + offset + ";");
116266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
116366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitSentinelCheck(cfunc, cname, out, false,
116466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      emitExceptionCheck, offset,
116566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                      remaining, indent);
1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println();
116766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isArray()
116866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                              && jfunc.getArgType(idx).isEGLHandle()) {
116966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    needsExit = true;
117066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (!" + cname + "_ref) {");
117166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
117266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
117366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
117466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + cname +" == null\";");
117566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
117666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
117766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "if (" + offset + " < 0) {");
117866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exception = 1;");
117966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
118066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_exceptionType = \"java/lang/IllegalArgumentException\";");
118166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "_exceptionMessage = \"" + offset +" < 0\";");
118266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "goto exit;");
118366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
118466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
118566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + remaining + " = " +
118666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "_env" : "(*_env)") +
118766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    "->GetArrayLength(" +
118866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    (mUseCPlusPlus ? "" : "_env, ") +
118966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                    cname + "_ref) - " + offset + ";");
119066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    emitNativeBoundsChecks(cfunc, cname, out, false,
119166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           emitExceptionCheck,
119266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                           offset, remaining, "    ");
119366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
119466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                jfunc.getArgName(idx) + " = new " +
119566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgType(cIndex).getBaseType() +
119666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                               "["+ remaining + "];");
119766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println();
119866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else if (jfunc.getArgType(idx).isBuffer()) {
1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    String array = numBufferArgs <= 1 ? "_array" :
1200e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "Array";
1201e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                    String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1202e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                        "_" + cfunc.getArgName(cIndex) + "BufferOffset";
1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
120446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "if (" + cname + "_buf) {");
1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.print(indent);
1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
12096cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
121046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (isPointerFunc) {
121146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cname +
1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                " = (" +
1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                cfunc.getArgType(cIndex).getDeclaration() +
12156eedc8d3b598163f797a2f75d05fdc20809a4364Jack Palevich                                ") getDirectBufferPointer(_env, " +
121646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                cname + "_buf);");
121746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String iii = "    ";
12185afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                        out.println(iii + indent + "if ( ! " + cname + " ) {");
121966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        out.println(iii + indent + indent + "return;");
122046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(iii + indent + "}");
122146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    } else {
122246d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent +
122346d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
122446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    " = (" +
122546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cfunc.getArgType(cIndex).getDeclaration() +
122646d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ")getPointer(_env, " +
122746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    cname +
12284e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                    "_buf, (jarray*)&" + array + ", &" + remaining + ", &" + bufferOffset +
122946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                                    ");");
123046d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12325afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                    emitNativeBoundsChecks(cfunc, cname, out, true,
12335afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           emitExceptionCheck,
12345afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich                                           offset, remaining, nullAllowed ? "        " : "    ");
12355afdc87704f82cb6c3576695dd157b65ae6f3d33Jack Palevich
1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (nullAllowed) {
1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + "}");
1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1243e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        // Emit 'GetPrimitiveArrayCritical' for pointers if needed
1244e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        if (nonPrimitiveArgs.size() > 0) {
1245e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer            for (int i = 0; i < nonPrimitiveArgs.size(); i++) {
1246e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
1247e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
1248e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1249e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if(!jfunc.getArgType(idx).isBuffer() || isPointerFunc) continue;
1250e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1251e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String cname = cfunc.getArgName(cIndex);
1252e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String bufferOffset = numBufferArgs <= 1 ? "_bufferOffset" :
1253e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cname + "BufferOffset";
1254e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                String array = numBufferArgs <= 1 ? "_array" :
1255e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
1256e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
125736b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                boolean nullAllowed = isNullAllowed(cfunc) || isPointerFunc;
125836b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                if (nullAllowed) {
125936b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname + "_buf && " + cname +" == NULL) {");
126036b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                } else {
126136b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                    out.println(indent + "if (" + cname +" == NULL) {");
126236b285eac98cccdb9394c14ae2e6ace9f3d90966Thomas Tafertshofer                }
12634e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                JType argType = jfunc.getArgType(idx);
12644e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                if (argType.isTypedBuffer()) {
12654e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    String arrayGetter = argType.getArrayTypeForTypedBuffer().getArrayGetterForPrimitiveArray();
12664e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->" + arrayGetter + "(" + array + ", (jboolean *) 0);");
12674e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
12684e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + "}");
12694e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                } else {
12704e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + indent + "char * _" + cname + "Base = (char *)_env->GetPrimitiveArrayCritical(" + array + ", (jboolean *) 0);");
12714e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + indent + cname + " = (" +cfunc.getArgType(cIndex).getDeclaration() +") (_" + cname + "Base + " + bufferOffset + ");");
12724e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    out.println(indent + "}");
12734e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                }
1274e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer             }
1275e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer        }
1276e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1277e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent + "_returnValue = ");
1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print(indent);
1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        String name = cfunc.getName();
1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (mUseContextPointer) {
1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(2, name.length()); // Strip off 'gl' prefix
1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            name = name.substring(0, 1).toLowerCase() +
1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                name.substring(1, name.length());
1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.print("ctx->procs.");
1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
12916cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.print(name + (isPointerFunc ? "Bounds" : "") + "(");
1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12946cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich        numArgs = cfunc.getNumArgs();
1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (numArgs == 0) {
1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx);");
1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println(");");
1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (mUseContextPointer) {
1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println("ctx,");
1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.println();
1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < numArgs; i++) {
1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                String typecast;
1309071fc660597efdfa5ebc58b427252393e628a497Jesse Hall                if (i == numArgs - 1 && isPointerOffsetFunc) {
1310d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                    typecast = "reinterpret_cast<GLvoid *>";
1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
131266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    typecast = "(" + cfunc.getArgType(i).getDeclaration() + ")";
1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                out.print(indent + indent +
131566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                          typecast);
131666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
131750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                if (cfunc.getArgType(i).isConstCharPointer()) {
131850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                    out.print("_native");
131950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                }
132066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
1321e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                if (cfunc.getArgType(i).isEGLHandle() &&
132266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    !cfunc.getArgType(i).isPointer()){
132366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i)+"_native");
1324d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                } else if (i == numArgs - 1 && isPointerOffsetFunc){
1325d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat                    out.print("("+cfunc.getArgName(i)+")");
132666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                } else {
132766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.print(cfunc.getArgName(i));
132866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                if (i == numArgs - 1) {
1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    if (isPointerFunc) {
1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(",");
1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println(indent + indent + "(GLsizei)remaining");
1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    } else {
1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                        out.println();
1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    }
1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else {
1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(",");
1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println(indent + ");");
1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsExit) {
1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println();
1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            out.println("exit:");
1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            needsExit = false;
1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1350e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer
1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (nonPrimitiveArgs.size() > 0) {
1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int idx = nonPrimitiveArgs.get(i).intValue();
1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                int cIndex = jfunc.getArgCIndex(idx);
135666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && !jfunc.getArgType(idx).isClass()) {
13576cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich
1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // If the argument is 'const', GL will not write to it.
1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // In this case, we can use the 'JNI_ABORT' flag to avoid
1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    // the need to write back to the Java array
1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent +
1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "if (" + jfunc.getArgName(idx) + "_base) {");
13634e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                    String arrayReleaser = jfunc.getArgType(idx).getArrayReleaserForPrimitiveArray();
1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent +
1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (mUseCPlusPlus ? "_env" : "(*_env)") +
13664e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "->" + arrayReleaser + "(" +
13676cbca50b6a438151a6c5f4dbdccc7057c19b73faJack Palevich                                (mUseCPlusPlus ? "" : "_env, ") +
1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                jfunc.getArgName(idx) + "_ref, " +
13694e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "(j" + jfunc.getArgType(idx).getBaseType() + "*)" + cfunc.getArgName(cIndex) +
1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                "_base,");
1371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + indent + indent +
1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                (cfunc.getArgType(cIndex).isConst() ?
137366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                 "JNI_ABORT" : "_exception ? JNI_ABORT: 0" ) +
1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                                ");");
1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                    out.println(indent + "}");
1376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                } else if (jfunc.getArgType(idx).isBuffer()) {
137746d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    if (! isPointerFunc) {
13784e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                        JType argType = jfunc.getArgType(idx);
137946d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        String array = numBufferArgs <= 1 ? "_array" :
1380e58a97b5d77b59fad1572ba3c0572c7434e8e503Thomas Tafertshofer                            "_" + cfunc.getArgName(cIndex) + "Array";
138146d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "if (" + array + ") {");
13824e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                        if (argType.isTypedBuffer()) {
13834e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                            String arrayReleaser =
13844e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                argType.getArrayTypeForTypedBuffer().getArrayReleaserForPrimitiveArray();
13854e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                            out.println(indent + indent +
13864e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "_env->" + arrayReleaser + "(" + array + ", " +
13874e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "(j" + argType.getArrayTypeForTypedBuffer().getBaseType() + "*)" +
13884e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                cfunc.getArgName(cIndex) +
13894e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                ", " +
13904e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                (cfunc.getArgType(cIndex).isConst() ?
13914e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                    "JNI_ABORT" : (emitExceptionCheck ?
13924e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                        "_exception ? JNI_ABORT : 0" : "0")) +
13934e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                ");");
13944e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                        } else {
13954e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                            out.println(indent + indent +
13964e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                "releasePointer(_env, " + array + ", " +
13974e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                cfunc.getArgName(cIndex) +
13984e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                ", " +
13994e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                (cfunc.getArgType(cIndex).isConst() ?
14004e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                    "JNI_FALSE" : (emitExceptionCheck ?
14014e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                        "_exception ? JNI_FALSE : JNI_TRUE" : "JNI_TRUE")) +
14024e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                                ");");
14034e7de461c18278a31be83e7c9074a02fbb6e9475Hiroshi Yamauchi                        }
140446d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                        out.println(indent + "}");
140546d25a371d58c63cbd72f5d08348e9b75c2ac22cJack Palevich                    }
1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                }
1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
141050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        // Emit local variable declaration for strings
141150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        if (stringArgs.size() > 0) {
141250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            for (int i = 0; i < stringArgs.size(); i++) {
141350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int idx = stringArgs.get(i).intValue();
141450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                int cIndex = jfunc.getArgCIndex(idx);
141550d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                String cname = cfunc.getArgName(cIndex);
141650d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
141750d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "if (_native" + cname + ") {");
141850d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "    _env->ReleaseStringUTFChars(" + cname + ", _native" + cname + ");");
141950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich                out.println(indent + "}");
142050d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            }
142150d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
142250d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich            out.println();
142350d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich        }
142450d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
142566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Copy results back to java arrays
142666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer       if (nonPrimitiveArgs.size() > 0) {
142766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            for (int i = nonPrimitiveArgs.size() - 1; i >= 0; i--) {
142866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int idx = nonPrimitiveArgs.get(i).intValue();
142966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                int cIndex = jfunc.getArgCIndex(idx);
143066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getArgType(cIndex).getBaseType().toLowerCase();
143166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                if (jfunc.getArgType(idx).isArray() && jfunc.getArgType(idx).isClass()) {
143266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    remaining  = ((numArrays + numBuffers) <= 1) ? "_remaining" :
143366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                     "_" + cfunc.getArgName(cIndex) + "Remaining";
143466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    offset = numArrays <= 1 ? "offset" : cfunc.getArgName(cIndex) + "Offset";
143566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent +
143666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "if (" + jfunc.getArgName(idx) + ") {");
143766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
143866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "for (int i = 0; i < " + remaining + "; i++) {");
143966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
144066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "jobject " + cfunc.getArgName(cIndex) +
144166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_new = toEGLHandle(_env, " + baseType +
144266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "Class, " + baseType + "Constructor, " +
144366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "[i]);");
144466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + indent +
144566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "_env" : "(*_env)") +
144666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "->SetObjectArrayElement(" +
144766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                (mUseCPlusPlus ? "" : "_env, ") +
144866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) +
144966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "_ref, i + " + offset + ", " +
145066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                cfunc.getArgName(cIndex) + "_new);");
145166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent + "}");
145266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + indent +
145366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                                "delete[] " + jfunc.getArgName(idx) + ";");
145466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                    out.println(indent + "}");
145566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                }
145666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
145766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
145866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
145966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
146066a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        // Throw exception if there is one
146166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        if (emitExceptionCheck) {
146266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "if (_exception) {");
146366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + indent +
146466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                        "jniThrowException(_env, _exceptionType, _exceptionMessage);");
146566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            out.println(indent + "}");
146666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
146766a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer        }
146866a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer
146950d0b14689b0ae95ea7b66a8c2f7b955115812ddJack Palevich
1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!isVoid) {
147166a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            if (cfunc.getType().isEGLHandle()) {
147266a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                String baseType = cfunc.getType().getBaseType().toLowerCase();
147366a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                out.println(indent +
147466a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            "return toEGLHandle(_env, " + baseType + "Class, " +
147566a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer                            baseType + "Constructor, _returnValue);");
147666a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            } else {
147768fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                out.println(indent + "return (" +
147868fc8bbced285a8a2b716e5fe1900968ad8ba7d3Jesse Hall                            getJniType(jfunc.getType()) + ")_returnValue;");
147966a42db8cbfba902f72f0ace5ac448ef4bfd3951Thomas Tafertshofer            }
1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println("}");
1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        out.println();
1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
1487