提交 548fd30c 编写于 作者: A asaha

Merge

......@@ -464,6 +464,7 @@ c8cfbe57bcd5042d2fef42dcef14d73dd4bdc416 jdk8u60-b25
fe1c420a8982e58f6d49c50b729732d93f9682dd jdk8u65-b05
3ee40ba7525d6d5ee201a475b967ca2e5c3c9ab3 jdk8u65-b06
bd2ad7acb217391747dae8263c090483af454313 jdk8u65-b07
d215cd281678e4b89a4155755cd6e03e37b7e9b1 jdk8u65-b08
e9f82302d5fdef8a0976640e09363895e9dcde3c jdk8u66-b00
64d7bd4e98150447916f210e3bfd6875a4c2728a jdk8u66-b01
d8210091911b14930192abd3138ee37c281fb632 jdk8u66-b02
......
......@@ -76,14 +76,14 @@ ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphS
}
if (flags & irfMarkFirst) {
firstGlyph = currGlyph;
firstGlyph = (le_uint32)currGlyph;
}
if (flags & irfMarkLast) {
lastGlyph = currGlyph;
lastGlyph = (le_uint32)currGlyph;
}
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
if (!(flags & irfDontAdvance)) {
// XXX: Should handle reverse too...
......@@ -97,18 +97,29 @@ void IndicRearrangementProcessor::endStateTable()
{
}
void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const
void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const
{
LEGlyphID a, b, c, d;
le_int32 ia, ib, ic, id, ix, x;
LEErrorCode success = LE_NO_ERROR;
if (LE_FAILURE(success)) return;
if (verb == irvNoAction) {
return;
}
if (firstGlyph > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
return;
}
switch(verb)
{
case irvNoAction:
break;
case irvxA:
if (firstGlyph == lastGlyph) break;
if (firstGlyph + 1 < firstGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
ia = glyphStorage.getCharIndex(firstGlyph, success);
x = firstGlyph + 1;
......@@ -125,6 +136,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDx:
if (firstGlyph == lastGlyph) break;
if (lastGlyph - 1 > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
d = glyphStorage[lastGlyph];
id = glyphStorage.getCharIndex(lastGlyph, success);
x = lastGlyph - 1;
......@@ -153,6 +169,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error.
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
......@@ -174,6 +195,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
......@@ -195,6 +221,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
......@@ -216,6 +247,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
......@@ -237,6 +273,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
......@@ -262,6 +303,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
......@@ -287,6 +333,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
......@@ -312,6 +363,11 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
......@@ -337,6 +393,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -359,6 +419,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvCDxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -381,6 +445,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -403,6 +471,10 @@ void IndicRearrangementProcessor::doRearrangementAction(LEGlyphStorage &glyphSto
break;
case irvDCxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......
......@@ -56,7 +56,7 @@ public:
virtual void endStateTable();
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const;
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const;
IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success);
virtual ~IndicRearrangementProcessor();
......@@ -76,8 +76,8 @@ public:
static UClassID getStaticClassID();
protected:
le_int32 firstGlyph;
le_int32 lastGlyph;
le_uint32 firstGlyph;
le_uint32 lastGlyph;
LEReferenceTo<IndicRearrangementSubtableHeader> indicRearrangementSubtableHeader;
LEReferenceToArrayOf<IndicRearrangementStateEntry> entryTable;
......
......@@ -74,14 +74,14 @@ le_uint16 IndicRearrangementProcessor2::processStateEntry(LEGlyphStorage &glyphS
}
if (flags & irfMarkFirst) {
firstGlyph = currGlyph;
firstGlyph = (le_uint32)currGlyph;
}
if (flags & irfMarkLast) {
lastGlyph = currGlyph;
lastGlyph = (le_uint32)currGlyph;
}
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask));
doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
if (!(flags & irfDontAdvance)) {
currGlyph += dir;
......@@ -94,18 +94,29 @@ void IndicRearrangementProcessor2::endStateTable()
{
}
void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const
void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const
{
LEGlyphID a, b, c, d;
le_int32 ia, ib, ic, id, ix, x;
LEErrorCode success = LE_NO_ERROR;
if (LE_FAILURE(success)) return;
if (verb == irvNoAction) {
return;
}
if (firstGlyph > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
return;
}
switch(verb)
{
case irvNoAction:
break;
case irvxA:
if (firstGlyph == lastGlyph) break;
if (firstGlyph + 1 < firstGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
ia = glyphStorage.getCharIndex(firstGlyph, success);
x = firstGlyph + 1;
......@@ -122,6 +133,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDx:
if (firstGlyph == lastGlyph) break;
if (lastGlyph - 1 > lastGlyph) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
d = glyphStorage[lastGlyph];
id = glyphStorage.getCharIndex(lastGlyph, success);
x = lastGlyph - 1;
......@@ -150,6 +166,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) { // difference == 1 is a no-op, < 1 is an error.
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
......@@ -171,6 +192,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
ia = glyphStorage.getCharIndex(firstGlyph, success);
......@@ -192,6 +218,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
......@@ -213,6 +244,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCx:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 1)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
ic = glyphStorage.getCharIndex(lastGlyph - 1, success);
......@@ -234,6 +270,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
......@@ -259,6 +300,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxA:
if ((lastGlyph - 2 > lastGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
c = glyphStorage[lastGlyph - 1];
d = glyphStorage[lastGlyph];
......@@ -284,6 +330,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDxAB:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
......@@ -309,6 +360,11 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDxBA:
if ((firstGlyph + 2 < firstGlyph) ||
(lastGlyph - firstGlyph < 2)) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
d = glyphStorage[lastGlyph];
......@@ -334,6 +390,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -356,6 +416,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvCDxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -378,6 +442,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxAB:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......@@ -400,6 +468,10 @@ void IndicRearrangementProcessor2::doRearrangementAction(LEGlyphStorage &glyphSt
break;
case irvDCxBA:
if (lastGlyph - firstGlyph < 3) {
success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
break;
}
a = glyphStorage[firstGlyph];
b = glyphStorage[firstGlyph + 1];
......
......@@ -56,7 +56,7 @@ public:
virtual void endStateTable();
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb) const;
void doRearrangementAction(LEGlyphStorage &glyphStorage, IndicRearrangementVerb verb, LEErrorCode &success) const;
IndicRearrangementProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success);
virtual ~IndicRearrangementProcessor2();
......@@ -76,8 +76,8 @@ public:
static UClassID getStaticClassID();
protected:
le_int32 firstGlyph;
le_int32 lastGlyph;
le_uint32 firstGlyph;
le_uint32 lastGlyph;
LEReferenceToArrayOf<IndicRearrangementStateEntry2> entryTable;
LEReferenceTo<IndicRearrangementSubtableHeader2> indicRearrangementSubtableHeader;
......
......@@ -75,6 +75,7 @@ void MorphTableHeader::process(const LETableReference &base, LEGlyphStorage &gly
return;
}
subtableHeader.addOffset(length, success);
if (LE_FAILURE(success)) break;
}
SubtableCoverage coverage = SWAPW(subtableHeader->coverage);
FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
......@@ -91,6 +92,8 @@ void MorphSubtableHeader::process(const LEReferenceTo<MorphSubtableHeader> &base
{
SubtableProcessor *processor = NULL;
if (LE_FAILURE(success)) return;
switch (SWAPW(coverage) & scfTypeMask)
{
case mstIndicRearrangement:
......
......@@ -197,6 +197,7 @@ void MorphTableHeader2::process(const LEReferenceTo<MorphTableHeader2> &base, LE
return;
}
subtableHeader.addOffset(length, success); // Don't addOffset for the last entry.
if (LE_FAILURE(success)) break;
}
le_uint32 coverage = SWAPL(subtableHeader->coverage);
FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
......@@ -212,6 +213,8 @@ void MorphSubtableHeader2::process(const LEReferenceTo<MorphSubtableHeader2> &ba
{
SubtableProcessor2 *processor = NULL;
if (LE_FAILURE(success)) return;
switch (SWAPL(coverage) & scfTypeMask2)
{
case mstIndicRearrangement:
......
......@@ -63,6 +63,8 @@ void SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &s
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segmentArrayLookupTable, segments, thisGlyph, success);
......
......@@ -63,6 +63,8 @@ void SegmentArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
// lookupSegment already range checked by lookupSegment() function.
......
......@@ -64,6 +64,8 @@ void SegmentSingleProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
const LookupSegment *lookupSegment = segmentSingleLookupTable->lookupSegment(segmentSingleLookupTable, segments, thisGlyph, success);
......
......@@ -61,10 +61,11 @@ SimpleArrayProcessor2::~SimpleArrayProcessor2()
void SimpleArrayProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
{
if (LE_FAILURE(success)) return;
le_int32 glyphCount = glyphStorage.getGlyphCount();
le_int32 glyph;
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
LEGlyphID thisGlyph = glyphStorage[glyph];
if (LE_GET_GLYPH(thisGlyph) < 0xFFFF) {
......
......@@ -63,6 +63,8 @@ void SingleTableProcessor::process(LEGlyphStorage &glyphStorage, LEErrorCode &su
le_int32 glyph;
le_int32 glyphCount = glyphStorage.getGlyphCount();
if (LE_FAILURE(success)) return;
for (glyph = 0; glyph < glyphCount; glyph += 1) {
const LookupSingle *lookupSingle = singleTableLookupTable->lookupSingle(singleTableLookupTable, entries, glyphStorage[glyph], success);
......
......@@ -382,6 +382,16 @@ public class TestLibrary {
return LocateRegistry.createRegistry(getUnusedRandomPort());
}
/**
* Creates an RMI {@link Registry} on an ephemeral port.
*
* @returns an RMI Registry
* @throws RemoteException if there was a problem creating a Registry.
*/
public static Registry createRegistryOnEphemeralPort() throws RemoteException {
return LocateRegistry.createRegistry(0);
}
/**
* Returns the port number the RMI {@link Registry} is running on.
*
......
......@@ -58,7 +58,6 @@ import java.util.concurrent.atomic.AtomicInteger;
public class PinClientSocketFactory {
private static final int PORT = TestLibrary.getUnusedRandomPort();
private static final int SESSIONS = 50;
public interface Factory extends Remote {
......@@ -96,10 +95,13 @@ public class PinClientSocketFactory {
}
UnicastRemoteObject.unexportObject(factoryImpl, true);
Registry registryImpl = LocateRegistry.createRegistry(PORT);
Registry registryImpl = TestLibrary.createRegistryOnEphemeralPort();
int port = TestLibrary.getRegistryPort(registryImpl);
System.out.println("Registry listening on port " + port);
CSF csf = new CSF();
Reference<CSF> registryRef = new WeakReference<CSF>(csf);
Registry registryStub = LocateRegistry.getRegistry("", PORT, csf);
Registry registryStub = LocateRegistry.getRegistry("", port, csf);
csf = null;
registryStub.list();
registryStub = null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册