help-smalltalk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-smalltalk] [PATCH] kernel: Fix IndexOutOfRange with empty matches


From: Holger Hans Peter Freyther
Subject: [Help-smalltalk] [PATCH] kernel: Fix IndexOutOfRange with empty matches in the regexp
Date: Fri, 13 Dec 2013 11:21:32 +0100

It is possible to have a non nil Interval that is empty. Make
the code work on isNil or isEmpty to avoid the exception.

Fixes:
SystemExceptions.IndexOutOfRange(Exception)>>signal (ExcHandling.st:254)
SystemExceptions.IndexOutOfRange class>>signalOn:withIndex: (SysExcept.st:660)
Interval>>first (Interval.st:245)
Kernel.MatchingRegexResults>>at: (Regex.st:382)

2013-12-08  Holger Hans Peter Freyther  <address@hidden>

        * kernel/Regex.st: Check for isEmpty of the Interval before
        trying to use it.

2013-12-08  Holger Hans Peter Freyther <address@hidden>

        * kernel/RegexpTests.st: Add tests for Regexp.
---
 ChangeLog                                   |  5 +++
 kernel/Regex.st                             |  7 +++--
 packages/kernel-tests/ChangeLog             |  4 +++
 packages/kernel-tests/Makefile.frag         |  2 +-
 packages/kernel-tests/kernel/RegexpTests.st | 48 +++++++++++++++++++++++++++++
 packages/kernel-tests/package.xml           |  2 ++
 6 files changed, 65 insertions(+), 3 deletions(-)
 create mode 100644 packages/kernel-tests/kernel/RegexpTests.st

diff --git a/ChangeLog b/ChangeLog
index 68c511a..7b6f5e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-12-08  Holger Hans Peter Freyther  <address@hidden>
+
+       * kernel/Regex.st: Check for isEmpty of the Interval before
+       trying to use it.
+
 2013-12-11  Lee Duhem  <address@hidden>
 
        * kernel/MappedColl.st:  Fix variable name typos in reject: and
diff --git a/kernel/Regex.st b/kernel/Regex.st
index 91a4ab3..5bc1046 100644
--- a/kernel/Regex.st
+++ b/kernel/Regex.st
@@ -377,9 +377,12 @@ RegexResults subclass: MatchingRegexResults [
        (cache at: anIndex) isNil 
            ifTrue: 
                [reg := registers at: anIndex.
-               text := reg isNil 
+               text := reg isNil
                            ifTrue: [nil]
-                           ifFalse: [self subject copyFrom: reg first to: reg 
last].
+                           ifFalse: [
+                               reg isEmpty
+                                       ifTrue: ['']
+                                       ifFalse: [self subject copyFrom: reg 
first to: reg last]].
                cache at: anIndex put: text].
        ^cache at: anIndex
     ]
diff --git a/packages/kernel-tests/ChangeLog b/packages/kernel-tests/ChangeLog
index ce2e127..532f991 100644
--- a/packages/kernel-tests/ChangeLog
+++ b/packages/kernel-tests/ChangeLog
@@ -1,3 +1,7 @@
+2013-12-08  Holger Hans Peter Freyther  <address@hidden>
+
+       * kernel/RegexpTests.st: Add tests for Regexp.
+
 2013-12-13  Holger Hans Peter Freyther  <address@hidden>
 
        * kernel/MappedCollectionTests.st: Add tests for MappedCollection.
diff --git a/packages/kernel-tests/Makefile.frag 
b/packages/kernel-tests/Makefile.frag
index 1d19d61..e44befc 100644
--- a/packages/kernel-tests/Makefile.frag
+++ b/packages/kernel-tests/Makefile.frag
@@ -1,5 +1,5 @@
 Kernel-Tests_FILES = \
-packages/kernel-tests/ChangeLog 
packages/kernel-tests/kernel/CompiledMethodTests.st 
packages/kernel-tests/kernel/ContextPartTests.st 
packages/kernel-tests/kernel/MappedCollectionTests.st 
packages/kernel-tests/kernel/ObjectTests.st 
+packages/kernel-tests/ChangeLog 
packages/kernel-tests/kernel/CompiledMethodTests.st 
packages/kernel-tests/kernel/ContextPartTests.st 
packages/kernel-tests/kernel/MappedCollectionTests.st 
packages/kernel-tests/kernel/ObjectTests.st 
packages/kernel-tests/kernel/RegexpTests.st 
 $(Kernel-Tests_FILES):
 $(srcdir)/packages/kernel-tests/stamp-classes: $(Kernel-Tests_FILES)
        touch $(srcdir)/packages/kernel-tests/stamp-classes
diff --git a/packages/kernel-tests/kernel/RegexpTests.st 
b/packages/kernel-tests/kernel/RegexpTests.st
new file mode 100644
index 0000000..a239756
--- /dev/null
+++ b/packages/kernel-tests/kernel/RegexpTests.st
@@ -0,0 +1,48 @@
+TestCase subclass: TestRegexp [
+
+    testEmptyMatch [
+        | data match |
+
+       data := '""'.
+       match := (data =~ '"([^"]*)"').
+
+        "Check that it has matched"
+        self assert: match class equals: Kernel.MatchingRegexResults.
+        self assert: match matched.
+        self assert: match size = 1.
+        self assert: (match at: 1) equals: ''.
+
+        "Check if an exception is thrown"
+        self shouldnt: [match printString] raise: Exception.
+    ]
+
+    testMatch [
+        | data match |
+
+       data := '"A"'.
+       match := (data =~ '"([^"]*)"').
+
+        "Check that it has matched"
+        self assert: match class equals: Kernel.MatchingRegexResults.
+        self assert: match matched.
+        self assert: match size = 1.
+        self assert: (match at: 1) equals: 'A'.
+
+        "Check if an exception is thrown"
+        self shouldnt: [match printString] raise: Exception.
+    ]
+
+    testOptionalMatch [
+       | match |
+        match := 'Mary Jane Emily' =~ '(\w+)( \w+)?( \w+)?( \w+)?( \w+)?'.
+
+       self assert: match class equals: Kernel.MatchingRegexResults.
+       self assert: match matched.
+       self assert: match size = 5.
+       self assert: (match at: 1) equals: 'Mary'.
+       self assert: (match at: 2) equals: ' Jane'.
+       self assert: (match at: 3) equals: ' Emily'.
+       self assert: (match at: 4) equals: nil.
+       self assert: (match at: 5) equals: nil.
+    ]
+]
diff --git a/packages/kernel-tests/package.xml 
b/packages/kernel-tests/package.xml
index 7699d23..18681bb 100644
--- a/packages/kernel-tests/package.xml
+++ b/packages/kernel-tests/package.xml
@@ -6,10 +6,12 @@
    <sunit>TestContextPart</sunit>
    <sunit>TestMappedCollection</sunit>
    <sunit>TestObject</sunit>
+   <sunit>TestRegexp</sunit>
    <filein>kernel/CompiledMethodTests.st</filein>
    <filein>kernel/ContextPartTests.st</filein>
    <filein>kernel/MappedCollectionTests.st</filein>
    <filein>kernel/ObjectTests.st</filein>
+   <filein>kernel/RegexpTests.st</filein>
   </test>
 
   <file>ChangeLog</file>
-- 
1.8.4.rc3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]