--- misc/icu/source/layout/LookupProcessor.h 2011-02-03 09:20:27.657005678 +0000 +++ misc/build/icu/source/layout/LookupProcessor.h 2011-02-03 09:25:34.498396208 +0000 @@ -58,6 +58,7 @@ const FeatureListTable *featureListTable; FeatureMask *lookupSelectArray; + le_uint32 lookupSelectCount; le_uint16 *lookupOrderArray; le_uint32 lookupOrderCount; --- misc/icu/source/layout/LookupProcessor.cpp 2011-02-02 12:29:54.369077099 +0000 +++ misc/build/icu/source/layout/LookupProcessor.cpp 2011-02-02 12:31:54.215503036 +0000 @@ -62,6 +62,10 @@ if (selectMask != 0) { const LookupTable *lookupTable = lookupListTable->getLookupTable(lookup); + + if (!lookupTable) + continue; + le_uint16 lookupFlags = SWAPW(lookupTable->lookupFlags); glyphIterator.reset(lookupFlags, selectMask); @@ -96,6 +100,9 @@ for (le_uint16 lookup = 0; lookup < lookupCount; lookup += 1) { le_uint16 lookupListIndex = SWAPW(featureTable->lookupListIndexArray[lookup]); + if (lookupListIndex >= lookupSelectCount) + continue; + lookupSelectArray[lookupListIndex] |= featureMask; lookupOrderArray[store++] = lookupListIndex; } @@ -106,7 +113,7 @@ LookupProcessor::LookupProcessor(const char *baseAddress, Offset scriptListOffset, Offset featureListOffset, Offset lookupListOffset, LETag scriptTag, LETag languageTag, const FeatureMap *featureMap, le_int32 featureMapCount, le_bool orderFeatures) - : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), + : lookupListTable(NULL), featureListTable(NULL), lookupSelectArray(NULL), lookupSelectCount(0), lookupOrderArray(NULL), lookupOrderCount(0) { const ScriptListTable *scriptListTable = NULL; @@ -146,6 +153,8 @@ lookupSelectArray[i] = 0; } + lookupSelectCount = lookupListCount; + le_int32 count, order = 0; le_int32 featureReferences = 0; const FeatureTable *featureTable = NULL; @@ -162,6 +171,10 @@ le_uint16 featureIndex = SWAPW(langSysTable->featureIndexArray[feature]); featureTable = featureListTable->getFeatureTable(featureIndex, &featureTag); + + if (!featureTable) + continue; + featureReferences += SWAPW(featureTable->lookupCount); }