private final void pushStack(final Namespace mns, Namespace[] newscope, 
			final List<Namespace> toadd) {
		// OK, we've checked the namespaces in the Element, and 'toadd' contains
		// all namespaces that are not already in scope.
		depth++;

		if (depth >= scope.length) {
			// we need more space on the stack.
			scope = ArrayCopy.copyOf(scope, scope.length * 2);
			added = ArrayCopy.copyOf(added, scope.length);
		}

		// Sort out the added namespaces.
		if (toadd.isEmpty()) {
			// nothing changed in the scope.
			added[depth] = EMPTY;
		} else {
			added[depth] = toadd.toArray(new Namespace[toadd.size()]);
			if (added[depth][0] == mns) {
				Arrays.sort(added[depth], 1, added[depth].length, NSCOMP);
			} else {
				Arrays.sort(added[depth], NSCOMP);
			}
		}

		if (mns != newscope[0]) {
			if (toadd.isEmpty()) {
				// we need to make newscope a copy of the previous level's
				// scope, because it is not yet a copy.
				newscope = ArrayCopy.copyOf(newscope, newscope.length);
			}
			// we need to take the Namespace at position 0, and insert it
			// in it's place later in the array.
			// we need to take the mns from later in the array, and move it
			// to the front.
			final Namespace tmp = newscope[0];
			int ip = - binarySearch(newscope, 1, newscope.length, tmp) - 1;
			// we can be sure that (- ip - 1 ) is >= 1
			// we also know that we want to move the data before the ip
			// backwards one spot, so the math is slightly different....
			ip--;
			System.arraycopy(newscope, 1, newscope, 0, ip);
			newscope[ip] = tmp;

			ip = binarySearch(newscope, 0, newscope.length, mns);
			// we can be sure that ip is >= 0
			System.arraycopy(newscope, 0, newscope, 1, ip);
			newscope[0] = mns;
		}

		scope[depth] = newscope;
	}