[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