From 164c7e7307e2087c020f992f85c18ecc797358a7 Mon Sep 17 00:00:00 2001 From: Lukas Stadler Date: Thu, 3 Mar 2016 10:42:20 +0100 Subject: [PATCH 1/3] clear text map when updating code in ClientManagedFileSource --- .../src/com/oracle/truffle/api/source/Source.java | 1 + 1 file changed, 1 insertion(+) 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 012907e1226d..91ba74aefb01 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 @@ -1000,6 +1000,7 @@ private static final class ClientManagedFileSource extends Source implements Clo } void setCode(CharSequence chars) { + clearTextMap(); this.code = chars.toString(); } From 2e89f5b9537a524c95a32e032c1113a726d1d0e1 Mon Sep 17 00:00:00 2001 From: Lukas Stadler Date: Fri, 4 Mar 2016 13:26:59 +0100 Subject: [PATCH 2/3] properly update client-managed Sources with relative paths --- .../src/com/oracle/truffle/api/source/Source.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 91ba74aefb01..ae1d5c0da9f1 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 @@ -212,15 +212,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; } /** From 7ce955bcf63af113d1acbd41892054a53b6b5c09 Mon Sep 17 00:00:00 2001 From: Lukas Stadler Date: Fri, 4 Mar 2016 13:27:20 +0100 Subject: [PATCH 3/3] tests for client-managed file source changes --- .../oracle/truffle/api/source/SourceTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) 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); + } }