177 static char *
178 skip_over_field_signature(char *name, jboolean void_okay,
179 unsigned int length)
180 {
181 unsigned int array_dim = 0;
182 for (;length > 0;) {
183 switch (name[0]) {
184 case JVM_SIGNATURE_VOID:
185 if (!void_okay) return 0;
186 /* FALL THROUGH */
187 case JVM_SIGNATURE_BOOLEAN:
188 case JVM_SIGNATURE_BYTE:
189 case JVM_SIGNATURE_CHAR:
190 case JVM_SIGNATURE_SHORT:
191 case JVM_SIGNATURE_INT:
192 case JVM_SIGNATURE_FLOAT:
193 case JVM_SIGNATURE_LONG:
194 case JVM_SIGNATURE_DOUBLE:
195 return name + 1;
196
197 case JVM_SIGNATURE_CLASS: {
198 /* Skip over the classname, if one is there. */
199 char *p =
200 skip_over_fieldname(name + 1, JNI_TRUE, --length);
201 /* The next character better be a semicolon. */
202 if (p && p - name - 1 > 0 && p[0] == ';')
203 return p + 1;
204 return 0;
205 }
206
207 case JVM_SIGNATURE_ARRAY:
208 array_dim++;
209 /* JVMS 2nd ed. 4.10 */
210 /* The number of dimensions in an array is limited to 255 ... */
211 if (array_dim > 255) {
212 return 0;
213 }
214 /* The rest of what's there better be a legal signature. */
215 name++;
216 length--;
217 void_okay = JNI_FALSE;
|
177 static char *
178 skip_over_field_signature(char *name, jboolean void_okay,
179 unsigned int length)
180 {
181 unsigned int array_dim = 0;
182 for (;length > 0;) {
183 switch (name[0]) {
184 case JVM_SIGNATURE_VOID:
185 if (!void_okay) return 0;
186 /* FALL THROUGH */
187 case JVM_SIGNATURE_BOOLEAN:
188 case JVM_SIGNATURE_BYTE:
189 case JVM_SIGNATURE_CHAR:
190 case JVM_SIGNATURE_SHORT:
191 case JVM_SIGNATURE_INT:
192 case JVM_SIGNATURE_FLOAT:
193 case JVM_SIGNATURE_LONG:
194 case JVM_SIGNATURE_DOUBLE:
195 return name + 1;
196
197 case JVM_SIGNATURE_CLASS:
198 case JVM_SIGNATURE_PRIMITIVE_OBJECT: {
199 /* Skip over the classname, if one is there. */
200 char *p =
201 skip_over_fieldname(name + 1, JNI_TRUE, --length);
202 /* The next character better be a semicolon. */
203 if (p && p - name - 1 > 0 && p[0] == ';')
204 return p + 1;
205 return 0;
206 }
207
208 case JVM_SIGNATURE_ARRAY:
209 array_dim++;
210 /* JVMS 2nd ed. 4.10 */
211 /* The number of dimensions in an array is limited to 255 ... */
212 if (array_dim > 255) {
213 return 0;
214 }
215 /* The rest of what's there better be a legal signature. */
216 name++;
217 length--;
218 void_okay = JNI_FALSE;
|