From 4526e164f1f577f497d7e6040b340030d6cbe3ce Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Mon, 27 Apr 2020 02:30:10 +0200 Subject: [PATCH] [feaLib] Check lookup index in chaining lookups Raise if lookup_index is None, which would happen only of the lookup referenced belongs to the wrong table. The error message needs to be less cryptic, though. Fixes https://github.com/fonttools/fonttools/issues/1896 --- Lib/fontTools/feaLib/builder.py | 6 ++++++ Tests/feaLib/builder_test.py | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/Lib/fontTools/feaLib/builder.py b/Lib/fontTools/feaLib/builder.py index b23fcf752..4e7826d01 100644 --- a/Lib/fontTools/feaLib/builder.py +++ b/Lib/fontTools/feaLib/builder.py @@ -1263,6 +1263,9 @@ class ChainContextPosBuilder(LookupBuilder): st.PosLookupRecord = [] for sequenceIndex, l in enumerate(lookups): if l is not None: + if l.lookup_index is None: + raise FeatureLibError('Missing lookup index', + self.location) rec = otTables.PosLookupRecord() rec.SequenceIndex = sequenceIndex rec.LookupListIndex = l.lookup_index @@ -1310,6 +1313,9 @@ class ChainContextSubstBuilder(LookupBuilder): st.SubstLookupRecord = [] for sequenceIndex, l in enumerate(lookups): if l is not None: + if l.lookup_index is None: + raise FeatureLibError('Missing lookup index', + self.location) rec = otTables.SubstLookupRecord() rec.SequenceIndex = sequenceIndex rec.LookupListIndex = l.lookup_index diff --git a/Tests/feaLib/builder_test.py b/Tests/feaLib/builder_test.py index eead46a1b..a90bc91e6 100644 --- a/Tests/feaLib/builder_test.py +++ b/Tests/feaLib/builder_test.py @@ -430,6 +430,28 @@ class BuilderTest(unittest.TestCase): "Lookup blocks cannot be placed inside 'aalt' features", self.build, "feature aalt {lookup L {} L;} aalt;") + def test_chain_subst_refrences_GPOS_looup(self): + self.assertRaisesRegex( + FeatureLibError, + "Missing lookup index", + self.build, + "lookup dummy { pos a 50; } dummy;" + "feature test {" + " sub a' lookup dummy b;" + "} test;" + ) + + def test_chain_pos_refrences_GSUB_looup(self): + self.assertRaisesRegex( + FeatureLibError, + "Missing lookup index", + self.build, + "lookup dummy { sub a by A; } dummy;" + "feature test {" + " pos a' lookup dummy b;" + "} test;" + ) + def test_extensions(self): class ast_BaseClass(ast.MarkClass): def asFea(self, indent=""):