diff --git a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/source/SourceTest.java b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/source/SourceTest.java index bbcefe773aca..5f0fe0bccd75 100644 --- a/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/source/SourceTest.java +++ b/truffle/com.oracle.truffle.api.test/src/com/oracle/truffle/api/source/SourceTest.java @@ -153,4 +153,30 @@ public void literalSources() throws IOException { assertEquals(literal.getReader().read(buffer), code.length()); assertEquals(new String(buffer), code); } + + @Test + public void clientManagedSourceChange() throws IOException { + final String path = "test.input"; + final String code1 = "test\ntest"; + final String code2 = "test\ntest\nlonger\ntest"; + final Source source1 = Source.fromFileName(code1, path); + assertEquals(source1.getCode(), code1); + assertEquals(source1.getLineNumber(code1.length() - 1), 2); + final Source source2 = Source.fromFileName(code2, path); + assertEquals(source2.getCode(), code2); + assertEquals(source2.getLineNumber(code2.length() - 1), 4); + } + + @Test + public void clientManagedSourceChangeAbsolute() throws IOException { + final String path = new File("test.input").getAbsolutePath(); + final String code1 = "test\ntest"; + final String code2 = "test\ntest\nlonger\ntest"; + final Source source1 = Source.fromFileName(code1, path); + assertEquals(source1.getCode(), code1); + assertEquals(source1.getLineNumber(code1.length() - 1), 2); + final Source source2 = Source.fromFileName(code2, path); + assertEquals(source2.getCode(), code2); + assertEquals(source2.getLineNumber(code2.length() - 1), 4); + } } diff --git a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java index f872f98f5a25..ffe1dca2b172 100644 --- a/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java +++ b/truffle/com.oracle.truffle.api/src/com/oracle/truffle/api/source/Source.java @@ -219,15 +219,16 @@ public static Source fromFileName(CharSequence chars, String fileName) throws IO if (source == null) { source = new ClientManagedFileSource(file, fileName, path, chars); nameToSource.put(path, new WeakReference<>(source)); + return source; } - } else if (source instanceof ClientManagedFileSource) { + } + if (source instanceof ClientManagedFileSource) { final ClientManagedFileSource modifiableSource = (ClientManagedFileSource) source; modifiableSource.setCode(chars); return modifiableSource; } else { throw new IOException("Attempt to modify contents of a file Source"); } - return source; } /** @@ -1052,6 +1053,7 @@ private static final class ClientManagedFileSource extends Source implements Clo } void setCode(CharSequence chars) { + clearTextMap(); this.code = chars.toString(); }