This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch] natString.cc: Some fixes for bounds checking arithmetic.


Ralph Loader wrote:
I was wondering about a similar thing in kaffe, and it may be saner to write the array index argument checking code once in a final class in Java and/or a static inline method in C++/function in C and let the compiler do the inlining magic.


Sounds good in theory. A couple of issues to deal with in practice:

- sometimes you have start and length, sometimes you have start and
end.  The APIs aren't consistent.

there is no official 'array bounds checking api' by sun, so we are free to define a good one, i.e. whatever suits you best ;) Here is an extremely verbose implementation (may be suitable for testing the inliner ;)


private static final void checkIfLess(int left, int right, int type) {
	if (left >= right) {
		throwException(type);
	}
}

private static final void checkIfGreaterOrEqual(int left, int right, int type) throws IndexOutOfBoundsException {
if (left < right) {
throwException(type);
}
}


private static final void throwException(int type) throws IndexOutOfBoundsException {
switch (type) {
case INDEX:
throw new IndexOutOfBoundsException();
break;
case ARRAY_INDEX:
throw new ArrayIndexOutOfBoundsException();
break;
case STRING_INDEX:
throw new StringIndexOutOfBoundsException();
break;
default:
throw new Error("Exception type is messed up");
}
}
}


public static final void checkStartOffset(int start_off, int array_length, int type) throws IndexOutOfBoundsException {
checkIfGreaterOrEqual(start_off, 0);
checkIfLess(start_off, array_length);
}


public static final void checkEndOffset(int end_off, int array_length, int type) throws IndexOutOfBoundsException {
checkIfGreaterOrEqual(end_off, 0);
checkIfLess(end_off, array_length);
}


public static final void checkBounds(int start_off, int end_off, int array_length, int type) throws IndexOutOfBoundsException {
checkStartOffset(start_off, array_length);
checkEndOffset(end_off, array_length);
checkGreaterOrEqual(end_off, start_off);
}


I could also imagine a set of bool testBounds(...) functions that don't throw an exception, but allow the caller to set up a more elaborate exception message. They could be used by the check* methods to simplify the design:

public static final void checkBounds(int start_off, int end_off, int array_length, int type) throws IndexOutOfBoundsException {
checkStartOffset(start_off, array_length);
checkEndOffset(end_off, array_length);
if (testLess(end_off, start_off) {
throwException(type, "End offset " + end_off + " is less than start offset " + start_off);
}
}


with a throwException(int type, String message) method, and the check* methods chnaged in the obvious ways to call test* methods.

what do you think?

cheers,
dalibor topic


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]