effekt icon indicating copy to clipboard operation
effekt copied to clipboard

Effekt v0.2.2 crashes on Windows

Open jiribenes opened this issue 11 months ago • 2 comments

Steps to reproduce:

  1. Use Windows
  2. Install Effekt v0.2.2
  3. Open Effekt REPL
  4. Write 42 and press Enter.
  5. See the error message below.

Error message

The error message points to the fact that we added a setPosixFilePermissions to our Kiama fork a few months ago in commit https://github.com/effekt-lang/kiama/commit/89515c8d17c2772d1caba6f1ef7a9ff5d1d93022:

Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.nio.file.Files.setPosixFilePermissions(Files.java:2168)
        at kiama.util.IO$.createFile(IO.scala:81)
        at effekt.JSRunner$.build(Runner.scala:131)
        at effekt.JSRunner$.build(Runner.scala:124)
        at effekt.Runner.eval(Runner.scala:58)
        at effekt.Runner.eval$(Runner.scala:14)

How to resolve

We should at least catch the UnsupportedOperationException. If we want, we might be able to use AclFileAttributeView on Windows or just fallback to java.io.File.setExecutable().

Note that although it's technically an issue in our Kiama fork, I'm filing it here for visibility (and in order to expedite it). :)

jiribenes avatar Mar 01 '24 15:03 jiribenes

But wait, there's more! Even if you work around the UnsupportedOperationException like this:

def createFile(filename: String, content: String, executable: Boolean = false): Unit = {
     val writer = filewriter(filename)
     writer.write(content)
     writer.close()
     try {
       if (executable) {
         val pPath = Path.of(filename)
+        try {
         val perms = Set(
           OWNER_READ, OWNER_WRITE, OWNER_EXECUTE,
           GROUP_READ,
           OTHERS_READ
         )
         Files.setPosixFilePermissions(pPath, SetHasAsJava(perms).asJava)
+        } catch { case e: java.lang.UnsupportedOperationException => () }
       }
       writer.write(content)
     } finally {
       writer.close()
     }
   }

then neither the REPL nor the compiler work on Windows as we create a file with a shebang:

#!/usr/bin/env node
require(...).main()

and then try to execute it, which on Windows throws:

java.io.IOException: Cannot run program ...: CreateProcess error=193 (%1 is not a valid Win32 app).

jiribenes avatar Mar 07 '24 08:03 jiribenes

I've also verified that this is, in fact, a regression from v0.2.1 as there, Effekt creates a JavaScript file directly (which does work on Windows, both in the REPL and as a compiler).

jiribenes avatar Mar 07 '24 08:03 jiribenes