Browse Source

Merge branch 'main' into SDL3

Sasha Szpakowski 1 year ago
parent
commit
2bdadf51d4
100 changed files with 427 additions and 238 deletions
  1. 144 60
      .github/workflows/main.yml
  2. 1 0
      .gitignore
  3. 2 2
      CMakeLists.txt
  4. 2 0
      changes.txt
  5. BIN
      extra/windows/love.rc
  6. 1 1
      license.txt
  7. 1 1
      platform/xcode/macosx/love-macosx.plist
  8. 9 19
      readme.md
  9. 1 1
      src/common/Color.h
  10. 18 1
      src/common/Data.cpp
  11. 20 6
      src/common/Data.h
  12. 1 1
      src/common/EnumMap.h
  13. 1 1
      src/common/Exception.cpp
  14. 1 1
      src/common/Exception.h
  15. 1 1
      src/common/Matrix.cpp
  16. 1 1
      src/common/Matrix.h
  17. 5 2
      src/common/Module.cpp
  18. 9 11
      src/common/Module.h
  19. 1 1
      src/common/Object.cpp
  20. 1 1
      src/common/Object.h
  21. 1 1
      src/common/Optional.h
  22. 2 2
      src/common/Range.h
  23. 1 1
      src/common/Reference.cpp
  24. 1 1
      src/common/Reference.h
  25. 1 1
      src/common/Stream.cpp
  26. 1 1
      src/common/Stream.h
  27. 1 1
      src/common/StringMap.cpp
  28. 1 1
      src/common/StringMap.h
  29. 1 1
      src/common/Variant.cpp
  30. 1 1
      src/common/Variant.h
  31. 1 1
      src/common/Vector.cpp
  32. 1 1
      src/common/Vector.h
  33. 9 7
      src/common/android.cpp
  34. 1 1
      src/common/android.h
  35. 1 1
      src/common/apple.h
  36. 1 1
      src/common/apple.mm
  37. 1 1
      src/common/b64.cpp
  38. 1 1
      src/common/b64.h
  39. 1 1
      src/common/config.h
  40. 1 1
      src/common/delay.cpp
  41. 1 1
      src/common/delay.h
  42. 1 1
      src/common/deprecation.cpp
  43. 1 1
      src/common/deprecation.h
  44. 1 1
      src/common/floattypes.cpp
  45. 1 1
      src/common/floattypes.h
  46. 1 1
      src/common/int.h
  47. 1 1
      src/common/ios.h
  48. 1 1
      src/common/ios.mm
  49. 1 1
      src/common/macos.h
  50. 1 1
      src/common/macos.mm
  51. 1 1
      src/common/math.h
  52. 1 1
      src/common/memory.cpp
  53. 1 1
      src/common/memory.h
  54. 9 1
      src/common/pixelformat.cpp
  55. 1 1
      src/common/pixelformat.h
  56. 1 4
      src/common/runtime.cpp
  57. 16 9
      src/common/runtime.h
  58. 1 1
      src/common/types.cpp
  59. 1 1
      src/common/types.h
  60. 1 1
      src/common/utf8.cpp
  61. 1 1
      src/common/utf8.h
  62. 1 1
      src/common/version.h
  63. 1 1
      src/libraries/ddsparse/ddsinfo.h
  64. 1 1
      src/libraries/ddsparse/ddsparse.cpp
  65. 1 1
      src/libraries/ddsparse/ddsparse.h
  66. 1 1
      src/libraries/enet/lua-enet.h
  67. 1 1
      src/libraries/luasocket/libluasocket/ftp.lua.h
  68. 1 1
      src/libraries/luasocket/libluasocket/headers.lua.h
  69. 15 9
      src/libraries/luasocket/libluasocket/http.lua
  70. 35 15
      src/libraries/luasocket/libluasocket/http.lua.h
  71. 1 1
      src/libraries/luasocket/libluasocket/inet.c
  72. 1 1
      src/libraries/luasocket/libluasocket/ltn12.lua.h
  73. 1 1
      src/libraries/luasocket/libluasocket/luasocket.h
  74. 2 2
      src/libraries/luasocket/libluasocket/makefile
  75. 1 1
      src/libraries/luasocket/libluasocket/mbox.lua.h
  76. 1 1
      src/libraries/luasocket/libluasocket/mime.lua.h
  77. 28 1
      src/libraries/luasocket/libluasocket/options.c
  78. 3 0
      src/libraries/luasocket/libluasocket/options.h
  79. 2 2
      src/libraries/luasocket/libluasocket/smtp.lua
  80. 2 2
      src/libraries/luasocket/libluasocket/smtp.lua.h
  81. 1 1
      src/libraries/luasocket/libluasocket/socket.lua.h
  82. 2 0
      src/libraries/luasocket/libluasocket/tcp.c
  83. 1 1
      src/libraries/luasocket/libluasocket/tp.lua.h
  84. 1 1
      src/libraries/luasocket/libluasocket/url.lua
  85. 4 3
      src/libraries/luasocket/libluasocket/url.lua.h
  86. 1 1
      src/libraries/luasocket/libluasocket/usocket.c
  87. 2 0
      src/libraries/luasocket/libluasocket/wsocket.c
  88. 1 1
      src/libraries/luasocket/luasocket.cpp
  89. 1 1
      src/libraries/luasocket/luasocket.h
  90. 3 3
      src/love.cpp
  91. 5 1
      src/modules/audio/Audio.cpp
  92. 5 4
      src/modules/audio/Audio.h
  93. 1 1
      src/modules/audio/Effect.cpp
  94. 1 1
      src/modules/audio/Effect.h
  95. 1 1
      src/modules/audio/Filter.cpp
  96. 1 1
      src/modules/audio/Filter.h
  97. 1 1
      src/modules/audio/RecordingDevice.cpp
  98. 1 1
      src/modules/audio/RecordingDevice.h
  99. 1 1
      src/modules/audio/Source.cpp
  100. 1 1
      src/modules/audio/Source.h

+ 144 - 60
.github/workflows/main.yml

@@ -2,7 +2,7 @@ name: continuous-integration
 on: [push, pull_request]
 
 jobs:
-  linux-os:
+  Linux:
     runs-on: ubuntu-22.04
     permissions:
       checks: write
@@ -25,12 +25,12 @@ jobs:
                                           libcurl4-openssl-dev libfuse2 wmctrl openbox mesa-vulkan-drivers \
                                           libvulkan1 vulkan-tools vulkan-validationlayers
     - name: Checkout love-appimage-source
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         repository: love2d/love-appimage-source
         ref: 12.x
     - name: Checkout LÖVE
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         path: love2d-${{ github.sha }}
     - name: Get Dependencies for AppImage
@@ -61,60 +61,63 @@ jobs:
     - name: Run Test Suite (opengl)
       run: |
         chmod a+x love-${{ github.sha }}.AppImage
-        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --runAllTests --isRunner
+        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner
     - name: Love Test Report (opengl)
       id: report1
       uses: ellraiser/love-test-report@main
       with:
         name: Love Testsuite Linux
         title: test-report-linux-opengl
-        path: love2d-${{ github.sha }}/testing/output/lovetest_runAllTests.md
+        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
         token: ${{ secrets.GITHUB_TOKEN }}
     - name: Zip Test Output (opengl)
       run: |
         7z a -tzip test-output-linux-opengl.zip love2d-${{ github.sha }}/testing/output/
     - name: Artifact Test Output (opengl)
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: test-output-linux-opengl-${{ steps.report1.outputs.conclusion }}
         path: test-output-linux-opengl.zip
     # linux opengles tests
     - name: Run Test Suite (opengles)
+      env:
+        LOVE_GRAPHICS_DEBUG: 1
       run: |
         export LOVE_GRAPHICS_USE_OPENGLES=1
-        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --runAllTests --isRunner
+        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner
     - name: Love Test Report (opengles)
       uses: ellraiser/love-test-report@main
       id: report2
       with:
         name: Love Testsuite Linux
         title: test-report-linux-opengles
-        path: love2d-${{ github.sha }}/testing/output/lovetest_runAllTests.md
+        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
         token: ${{ secrets.GITHUB_TOKEN }}
     - name: Zip Test Output (opengles)
       run: |
         7z a -tzip test-output-linux-opengles.zip love2d-${{ github.sha }}/testing/output/
     - name: Artifact Test Output (opengles)
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: test-output-linux-opengles-${{ steps.report2.outputs.conclusion }}
         path: test-output-linux-opengles.zip
 #    # linux vulkan tests
 #    - name: Run Test Suite (vulkan)
+#      env:
+#        LOVE_GRAPHICS_DEBUG: 1
 #      run: |
-#        export LOVE_GRAPHICS_DEBUG=1
-#        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --runAllTests --isRunner --renderers vulkan
+#        ./love-${{ github.sha }}.AppImage love2d-${{ github.sha }}/testing/main.lua --all --isRunner --renderers vulkan
 #    - name: Love Test Report (vulkan)
 #      uses: ellraiser/love-test-report@main
 #      with:
 #        name: Love Testsuite Linux
 #        title: test-report-linux-vulkan
-#        path: love2d-${{ github.sha }}/testing/output/lovetest_runAllTests.md
+#        path: love2d-${{ github.sha }}/testing/output/lovetest_all.md
 #    - name: Zip Test Output (vulkan)
 #      run: |
 #        7z a -tzip test-output-linux-vulkan.zip love2d-${{ github.sha }}/testing/output/
 #    - name: Artifact Test Output (vulkan)
-#      uses: actions/upload-artifact@v3
+#      uses: actions/upload-artifact@v4
 #      with:
 #        name: test-output-linux-vulkan
 #        path: test-output-linux-vulkan.zip
@@ -125,12 +128,12 @@ jobs:
         kill $XVFBPID
         kill $OPENBOXPID
     - name: Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-linux-x86_64.AppImage
         path: love-${{ github.sha }}.AppImage
     - name: Artifact Debug Symbols
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-x86_64-AppImage-debug
         path: love-${{ github.sha }}.AppImage-debug.tar.gz
@@ -140,7 +143,7 @@ jobs:
         echo "${{ steps.report1.outputs.failed }} opengl tests failed"
         echo "${{ steps.report2.outputs.failed }} opengles tests failed"
         exit 1
-  windows-os:
+  Windows:
     runs-on: windows-latest
     permissions:
       checks: write
@@ -202,31 +205,32 @@ jobs:
         echo nofiles=ignore>> "%GITHUB_OUTPUT%"
         echo moredef=-DLOVE_EXTRA_DLLS=%CD%\angle\libEGL.dll;%CD%\angle\libGLESv2.dll>> "%GITHUB_OUTPUT%"
         exit /b 0
-    - name: Download Windows SDK Setup 10.0.20348
-      run: curl -Lo winsdksetup.exe https://go.microsoft.com/fwlink/?linkid=2164145
-    - name: Install Debugging Tools for Windows
-      id: windbg
-      run: |
-        setlocal enabledelayedexpansion
-        start /WAIT %CD%\winsdksetup.exe /features OptionId.WindowsDesktopDebuggers /q /log %CD%\log.txt
-        echo ERRORLEVEL=!ERRORLEVEL! >> %GITHUB_OUTPUT%
-    - name: Print Debugging Tools Install Log
-      if: always()
+    - name: Download pdbstr
+      run: curl -Lfo pdbstr.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.PdbStr/20230731.1609.0
+    - name: Download srctool
+      run: curl -Lfo srctool.nupkg https://www.nuget.org/api/v2/package/Microsoft.Debugging.Tools.SrcTool/20230731.1609.0
+    - name: Extract Tools and Add to PATH
       run: |
-        type log.txt
-        exit /b ${{ steps.windbg.outputs.ERRORLEVEL }}
+        mkdir debugtools
+        cd debugtools
+        if errorlevel 1 exit /b 1
+        7z e ..\srctool.nupkg content/amd64/srctool.exe
+        if errorlevel 1 exit /b 1
+        7z e ..\pdbstr.nupkg content/amd64/pdbstr.exe
+        if errorlevel 1 exit /b 1
+        echo %CD%>>%GITHUB_PATH%
     - name: Setup Python 3.10
-      uses: actions/setup-python@v4
+      uses: actions/setup-python@v5
       with:
         python-version: "3.10"
     - name: Download source_index.py
-      run: curl -Lo source_index.py https://gist.github.com/MikuAuahDark/d9c099f5714e09a765496471c2827a55/raw/df34956052035f3473c5f01861dfb53930d06843/source_index.py
+      run: curl -Lfo source_index.py https://gist.github.com/MikuAuahDark/d9c099f5714e09a765496471c2827a55/raw/df34956052035f3473c5f01861dfb53930d06843/source_index.py
     - name: Clone Megasource
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         path: megasource
         repository: love2d/megasource
-        ref: 12.x
+        ref: main
     - id: megasource
       name: Get Megasource Commit SHA
       shell: python
@@ -238,11 +242,11 @@ jobs:
         commit = result.stdout.split()[0]
         with open(os.environ["GITHUB_OUTPUT"], "w", encoding="UTF-8") as f: f.write(f"commit={commit}")
     - name: Checkout
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         path: megasource/libs/love
     - name: Download ANGLE
-      uses: robinraju/release-downloader@v1.7
+      uses: robinraju/release-downloader@v1.9
       if: steps.vars.outputs.angle == '1'
       with:
         repository: MikuAuahDark/angle-winbuild
@@ -255,19 +259,19 @@ jobs:
       if: steps.vars.outputs.angle == '1'
       working-directory: angle
       run: 7z x angle-win-${{ steps.vars.outputs.arch }}.zip
-    - name: Delete Strawbery Perl
+    - name: Remove Strawbery Perl From Path
       # https://github.com/actions/runner-images/issues/6627
       # In particular, this is not pretty, but even CMAKE_IGNORE_PREFIX_PATH
-      # cannot help in this case. Delete the whole folder!
+      # cannot help in this case.
       run: |
-        rmdir /s /q C:\Strawberry
+        move /y C:\Strawberry C:\Strawberry_not_in_PATH
         exit /b 0
     - name: Configure
       env:
         CFLAGS: /Zi
         CXXFLAGS: /Zi
         LDFLAGS: /DEBUG:FULL /OPT:REF /OPT:ICF
-      run: cmake -Bbuild -Smegasource -T v142 -A ${{ matrix.platform }} --install-prefix %CD%\install -DCMAKE_PDB_OUTPUT_DIRECTORY=%CD%\pdb ${{ steps.vars.outputs.moredef }}
+      run: cmake -Bbuild -Smegasource -T v143 -A ${{ matrix.platform }} --install-prefix %CD%\install -DCMAKE_PDB_OUTPUT_DIRECTORY=%CD%\pdb ${{ steps.vars.outputs.moredef }}
     - name: Install
       run: cmake --build build --target PACKAGE --config Release -j2
     - name: Copy LuaJIT lua51.pdb
@@ -285,7 +289,7 @@ jobs:
         --source %CD%\build\libs\LuaJIT https://raw.githubusercontent.com/love2d/megasource/${{ steps.megasource.outputs.commit }}/libs/LuaJIT ^
         pdb\Release\*.pdb
     - name: Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}
         path: |
@@ -294,12 +298,12 @@ jobs:
         if-no-files-found: ${{ steps.vars.outputs.nofiles }}
     - name: Artifact JIT Modules
       if: steps.vars.outputs.jitmodules == '1'
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-windows-jitmodules
         path: build/libs/LuaJIT/src/jit/*.lua
     - name: Artifact PDB
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-dbg
         path: pdb/Release/*.pdb
@@ -317,10 +321,12 @@ jobs:
     # windows opengl tests
     - name: Run Tests (opengl)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
+      env:
+        LOVE_GRAPHICS_DEBUG: 1
       run: |
         echo 'check dir'
         ls
-        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --runAllTests --isRunner
+        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner
     - name: Love Test Report (opengl)
       id: report1
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
@@ -328,7 +334,7 @@ jobs:
       with:
         name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} ${{ steps.vars.outputs.compatname }} (opengl)
         title: test-report-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-opengl
-        path: megasource/libs/love/testing/output/lovetest_runAllTests.md
+        path: megasource/libs/love/testing/output/lovetest_all.md
         token: ${{ secrets.GITHUB_TOKEN }}
     - name: Zip Test Output (opengl)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
@@ -336,16 +342,18 @@ jobs:
         7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-opengl.zip megasource/libs/love/testing/output/
     - name: Artifact Test Output (opengl)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: test-output-windows-${{ steps.vars.outputs.arch }}-opengl-${{ steps.report1.outputs.conclusion }}
         path: test-output-windows-${{ steps.vars.outputs.arch }}-opengl.zip
     # windows opengles tests
     - name: Run Tests (opengles)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
+      env:
+        LOVE_GRAPHICS_DEBUG: 1
+        LOVE_GRAPHICS_USE_OPENGLES: 1
       run: |
-        $ENV:LOVE_GRAPHICS_USE_OPENGLES=1
-        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --runAllTests --isRunner
+        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner
     - name: Love Test Report (opengles)
       id: report2
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
@@ -353,7 +361,7 @@ jobs:
       with:
         name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} ${{ steps.vars.outputs.compatname }} (opengles)
         title: test-report-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-opengles
-        path: megasource/libs/love/testing/output/lovetest_runAllTests.md
+        path: megasource/libs/love/testing/output/lovetest_all.md
         token: ${{ secrets.GITHUB_TOKEN }}
     - name: Zip Test Output (opengles)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
@@ -361,7 +369,7 @@ jobs:
         7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-opengles.zip megasource/libs/love/testing/output/
     - name: Artifact Test Output (opengles)
       if: steps.vars.outputs.arch != 'ARM64' && steps.vars.outputs.compatname != '-compat'
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: test-output-windows-${{ steps.vars.outputs.arch }}-opengles-${{ steps.report2.outputs.conclusion }}
         path: test-output-windows-${{ steps.vars.outputs.arch }}-opengles.zip
@@ -387,23 +395,24 @@ jobs:
 #    # windows vulkan tests
 #    - name: Run Tests (vulkan)
 #      if: steps.vars.outputs.arch != 'ARM64'
+#      env:
+#        LOVE_GRAPHICS_DEBUG: 1
 #      run: |
-#        $ENV:LOVE_GRAPHICS_DEBUG=1
-#        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --runAllTests --isRunner --renderers vulkan
+#        powershell.exe ./install/lovec.exe ./megasource/libs/love/testing/main.lua --all --isRunner --renderers vulkan
 #    - name: Love Test Report (vulkan)
 #      if: steps.vars.outputs.arch != 'ARM64'
 #      uses: ellraiser/love-test-report@main
 #      with:
 #        name: Love Testsuite Windows ${{ steps.vars.outputs.arch }} ${{ steps.vars.outputs.compatname }} (vulkan)
 #        title: test-report-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-vulkan
-#        path: megasource/libs/love/testing/output/lovetest_runAllTests.md
+#        path: megasource/libs/love/testing/output/lovetest_all.md
 #    - name: Zip Test Output (vulkan)
 #      if: steps.vars.outputs.arch != 'ARM64'
 #      run: |
 #        7z a -tzip test-output-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-vulkan.zip megasource/libs/love/testing/output/
 #    - name: Artifact Test Output (vulkan)
 #      if: steps.vars.outputs.arch != 'ARM64'
-#      uses: actions/upload-artifact@v3
+#      uses: actions/upload-artifact@v4
 #      with:
 #        name: test-output-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-vulkan
 #        path: test-output-windows-${{ steps.vars.outputs.arch }}${{ steps.vars.outputs.compatname }}-vulkan.zip
@@ -414,9 +423,9 @@ jobs:
       pull-requests: write
     steps:
     - name: Checkout
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
     - name: Clone Dependencies
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         path: apple-dependencies
         repository: love2d/love-apple-dependencies
@@ -434,28 +443,30 @@ jobs:
       run:
         ditto -c -k --sequesterRsrc --keepParent love-macos/love.app love-macos.zip 
     - name: Artifact
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: love-macos
         path: love-macos.zip
     # macos opengl tests (metal not supported on runners)
     - name: Run Test Suite
+      env:
+        LOVE_GRAPHICS_DEBUG: 1
       run: |
         ls
-        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --runAllTests --isRunner
+        love-macos/love.app/Contents/MacOS/love ./testing/main.lua --all --isRunner
     - name: Love Test Report
       id: report1
       uses: ellraiser/love-test-report@main
       with:
         name: Love Testsuite MacOS
         title: test-report-macos
-        path: testing/output/lovetest_runAllTests.md
+        path: testing/output/lovetest_all.md
         token: ${{ secrets.GITHUB_TOKEN }}
     - name: Zip Test Output
       run: |
         7z a -tzip test-output-macos-opengl.zip ./testing/output/
     - name: Artifact Test Output
-      uses: actions/upload-artifact@v3
+      uses: actions/upload-artifact@v4
       with:
         name: test-output-macos-opengl-${{ steps.report1.outputs.conclusion }}
         path: test-output-macos-opengl.zip
@@ -468,9 +479,9 @@ jobs:
     runs-on: macos-latest
     steps:
     - name: Checkout
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
     - name: Clone Dependencies
-      uses: actions/checkout@v3
+      uses: actions/checkout@v4
       with:
         path: apple-dependencies
         repository: love2d/love-apple-dependencies
@@ -481,3 +492,76 @@ jobs:
     - name: Build
       run:
         xcodebuild -project platform/xcode/love.xcodeproj -scheme love-ios -configuration Release -destination 'platform=iOS Simulator,name=iPhone 11'
+  Android:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        build_type: [Debug, Release]
+    env:
+      GRADLE_OPTS: "-Dorg.gradle.jvmargs='-Xmx4G'"
+    steps:
+    - name: Prepare Environment
+      run: sudo apt-get update && curl -Lfo kitware-archive.sh https://apt.kitware.com/kitware-archive.sh && sudo bash ./kitware-archive.sh
+    - name: Install Dependencies
+      run: sudo apt-get install ninja-build cmake
+    - name: Checkout love-android
+      uses: actions/checkout@v4
+      with:
+        repository: love2d/love-android
+        submodules: false
+    - name: Setup Java 17
+      uses: actions/setup-java@v4
+      with:
+        distribution: adopt-hotspot
+        java-version: 17
+        cache: gradle
+    - name: Clone Megasource
+      uses: actions/checkout@v4
+      with:
+        path: app/src/main/cpp/megasource
+        repository: love2d/megasource
+        ref: main
+    - name: Checkout
+      uses: actions/checkout@v4
+      with:
+        path: app/src/main/cpp/love
+    - name: Build Normal Flavor
+      run: bash ./gradlew assembleNormalRecord${{ matrix.build_type }}
+    - name: Build Release-specific Binaries
+      if: ${{ matrix.build_type == 'Release' }}
+      run: bash ./gradlew bundleNormalNoRecordRelease bundleEmbedRecordRelease bundleEmbedNoRecordRelease
+    - name: Artifact (Normal debug APK)
+      if: ${{ matrix.build_type == 'Debug' }}
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android-debug.apk
+        path: app/build/outputs/apk/normalRecord/debug/app-normal-record-debug.apk
+    - name: Artifact (Normal unsigned APK)
+      if: ${{ matrix.build_type == 'Release' }}
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android.apk
+        path: app/build/outputs/apk/normalRecord/release/app-normal-record-release-unsigned.apk
+    - name: Artifact (Normal AAB w/o recording)
+      if: ${{ matrix.build_type == 'Release' }}
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android-ps.aab
+        path: app/build/outputs/bundle/normalNoRecordRelease/app-normal-noRecord-release.aab
+    - name: Artifact (Embed AAB)
+      if: ${{ matrix.build_type == 'Release' }}
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android-embed-record.aab
+        path: app/build/outputs/bundle/embedRecordRelease/app-embed-record-release.aab
+    - name: Artifact (Embed AAB w/o recording)
+      if: ${{ matrix.build_type == 'Release' }}
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android-embed.aab
+        path: app/build/outputs/bundle/embedNoRecordRelease/app-embed-noRecord-release.aab
+    - name: Artifact (Debug symbols)
+      uses: actions/upload-artifact@v4
+      with:
+        name: love-android-unstripped-debugsyms-${{ matrix.build_type }}
+        path: app/build/intermediates/cxx

+ 1 - 0
.gitignore

@@ -73,3 +73,4 @@ stamp-h1
 /testing/output/*.html
 /testing/output/*.md
 /testing/output/actual/*.png
+/testing/output/difference/*.png

+ 2 - 2
CMakeLists.txt

@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2006-2023 LOVE Development Team
+# Copyright (c) 2006-2024 LOVE Development Team
 #
 # This software is provided 'as-is', without any express or implied
 # warranty.  In no event will the authors be held liable for any damages
@@ -60,7 +60,7 @@ else()
 endif()
 
 
-if(APPLE OR MEGA_ARM64)
+if(APPLE)
 	set(LOVE_DEFAULT_JIT FALSE)
 else()
 	set(LOVE_DEFAULT_JIT TRUE)

+ 2 - 0
changes.txt

@@ -101,6 +101,7 @@ Released: N/A
 * Changed RevoluteJoint:getMotorTorque and WheelJoint:getMotorTorque to take 'dt' as a parameter instead of 'inverse_dt'.
 * Changed love.math.perlinNoise and simplexNoise to use higher precision numbers for its internal calculations.
 * Changed t.accelerometerjoystick startup flag in love.conf to unset by default.
+* Changed love.data.hash to take in a container type.
 
 * Renamed 'display' field to 'displayindex' in love.window.setMode/updateMode/getMode and love.conf.
 * Renamed love.graphics Text objects to TextBatch.
@@ -120,6 +121,7 @@ Released: N/A
 * Deprecated t.accelerometerjoystick in love.conf (replaced by love.sensor module).
 * Deprecated the variants of Mesh:attachAttribute and SpriteBatch:attachAttribute which accept a Mesh (replaced by variants which accept a Buffer).
 * Deprecated Texture:newImageData (replaced by love.graphics.readbackTexture).
+* Deprecated love.data.hash (replaced by function variant, which takes container type).
 
 * Removed the variant of SpriteBatch:setColor() which turns off all previously set colors.
 * Removed the no-argument variant of love.graphics.setColorMask.

BIN
extra/windows/love.rc


+ 1 - 1
license.txt

@@ -6,7 +6,7 @@ This distribution contains code from the following projects (full license text b
  - LOVE
 	Website: https://love2d.org/
 	License: zlib
-	Copyright (c) 2006-2023 LOVE Development Team
+	Copyright (c) 2006-2024 LOVE Development Team
 
  - ENet
 	Website: http://enet.bespin.org/index.html

+ 1 - 1
platform/xcode/macosx/love-macosx.plist

@@ -70,7 +70,7 @@
 	<key>NSHighResolutionCapable</key>
 	<true/>
 	<key>NSHumanReadableCopyright</key>
-	<string>© 2006-2023 LÖVE Development Team</string>
+	<string>© 2006-2024 LÖVE Development Team</string>
 	<key>NSPrincipalClass</key>
 	<string>NSApplication</string>
 	<key>NSSupportsAutomaticGraphicsSwitching</key>

+ 9 - 19
readme.md

@@ -11,12 +11,13 @@ If you need further help, feel free to ask on our [forums][forums], our [Discord
 Repository
 ----------
 
-We use the 'main' branch for patch development of the current major release, and therefore it should not be considered stable.
-There may also be a branch for the next major version in development, which is named after that version.
+We use the 'main' branch for development of the next major release, and therefore it should not be considered stable.
+
+There are also branches for currently released major versions, which may have fixes and changes meant for upcoming patch releases within that major version.
 
 We tag all our releases (since we started using mercurial and git), and have binary downloads available for them.
 
-Experimental changes are developed in a separate [love-experiments][love-experiments] repository.
+Experimental changes are sometimes developed in a separate [love-experiments][love-experiments] repository.
 
 Builds
 ------
@@ -32,12 +33,11 @@ There are also unstable/nightly builds:
 Test Suite
 ----------
 
-The test suite in `testing/` covers all the LÖVE APIs, and tests them the same way developers use them. You can view current test coverage from any [12.0-dev action][12devworkflows].  
-You can run the suite locally like you would run a normal LÖVE project, i.e.:  
-`love testing/main.lua`
+The test suite in `testing/` covers all the LÖVE APIs, and tests them the same way developers use them. You can view current test coverage from any [action][workflows].  
+You can run the suite locally like you would run a normal LÖVE project, e.g.:  
+`love testing`
 
 See the [readme][testsuite] in the testing folder for more info.  
-You can contribute to the test suite [here][testsuitemain]
 
 Contributing
 ------------
@@ -70,7 +70,6 @@ Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the
 ### iOS
 Building for iOS requires macOS and Xcode.
 
-#### LÖVE 11.4 and newer
 Download the `love-apple-dependencies` zip file corresponding to the LÖVE version being used from the [Releases page][dependencies-ios],
 unzip it, and place the `iOS/libraries` subfolder into love's `platform/xcode/ios` folder.
 
@@ -80,14 +79,6 @@ Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the
 
 See `readme-iOS.rtf` for more information.
 
-#### LÖVE 11.3 and older
-Download the `ios-libraries` zip file corresponding to the LÖVE version being used from the [Releases page][dependencies-ios],
-unzip it, and place the `include` and `libraries` subfolders into love's `platform/xcode/ios` folder.
-
-Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-ios` target.
-
-See `readme-iOS.rtf` for more information.
-
 ### Android
 Visit the [Android build repository][android-repository] for build instructions.
 
@@ -117,6 +108,5 @@ Dependencies
 [codestyle]: https://love2d.org/wiki/Code_Style
 [android-repository]: https://github.com/love2d/love-android
 [releases]: https://github.com/love2d/love/releases
-[testsuite]: https://github.com/love2d/love/tree/12.0-development/testing
-[testsuitemain]: https://github.com/ellraiser/love-test
-[12devworkflows]: https://github.com/love2d/love/actions/workflows/main.yml?query=branch%3A12.0-development
+[testsuite]: https://github.com/love2d/love/tree/main/testing
+[workflows]: https://github.com/love2d/love/actions/workflows/main.yml?query=branch%3Amain

+ 1 - 1
src/common/Color.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 18 - 1
src/common/Data.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -20,10 +20,27 @@
 
 // LOVE
 #include "Data.h"
+#include "thread/threads.h"
 
 namespace love
 {
 
 love::Type Data::type("Data", &Object::type);
 
+Data::~Data()
+{
+	delete mutex;
+}
+
+static void createMutex(love::thread::Mutex **mutexAddress)
+{
+	*mutexAddress = love::thread::newMutex();
+}
+
+love::thread::Mutex *Data::getMutex()
+{
+	std::call_once(mutexCreated, createMutex, &mutex);
+	return mutex;
+}
+
 } // love

+ 20 - 6
src/common/Data.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -22,15 +22,20 @@
 #define LOVE_DATA_H
 
 // LOVE
-#include "config.h"
 #include "Object.h"
 
 // C
 #include <stddef.h>
+#include <mutex>
 
 namespace love
 {
 
+namespace thread
+{
+class Mutex;
+}
+
 /**
  * This class is a simple abstraction over all objects which contain data.
  **/
@@ -40,10 +45,8 @@ public:
 
 	static love::Type type;
 
-	/**
-	 * Destructor.
-	 **/
-	virtual ~Data() {}
+	Data() {};
+	virtual ~Data();
 
 	/**
 	 * Creates a duplicate of Data derived class instance.
@@ -60,6 +63,17 @@ public:
 	 **/
 	virtual size_t getSize() const = 0;
 
+	/**
+	 * Gets the Mutex associated with this Data object. Creates it in a thread-
+	 * safe manner if necessary.
+	 **/
+	love::thread::Mutex *getMutex();
+
+private:
+
+	love::thread::Mutex *mutex = nullptr;
+	std::once_flag mutexCreated;
+
 }; // Data
 
 } // love

+ 1 - 1
src/common/EnumMap.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Exception.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Exception.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Matrix.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Matrix.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 5 - 2
src/common/Module.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -62,9 +62,12 @@ namespace love
 love::Type Module::type("Module", &Object::type);
 Module *Module::instances[] = {};
 
-Module::Module()
+Module::Module(Module::ModuleType moduleType, const char *name)
+	: moduleType(moduleType)
+	, name(name)
 {
 	initDeprecation();
+	registerInstance(this);
 }
 
 Module::~Module()

+ 9 - 11
src/common/Module.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -62,13 +62,13 @@ public:
 		M_MAX_ENUM
 	};
 
-	Module();
+	Module(ModuleType moduleType, const char *name);
 	virtual ~Module();
 
     /**
      * Gets the base type of the module.
      **/
-	virtual ModuleType getModuleType() const = 0;
+	ModuleType getModuleType() const { return moduleType; }
 
 	/**
 	 * Gets the name of the module. This is used in case of errors
@@ -76,14 +76,7 @@ public:
 	 *
 	 * @return The full name of the module, eg. love.graphics.opengl.
 	 **/
-	virtual const char *getName() const = 0;
-
-	/**
-	 * Add module to internal registry. To be used /only/ in
-	 * runtime.cpp:luax_register_module()
-	 * @param instance The module instance.
-	 */
-	static void registerInstance(Module *instance);
+	const char *getName() const { return name.c_str(); }
 
 	/**
 	 * Retrieve module instance from internal registry. May return NULL
@@ -106,6 +99,11 @@ public:
 
 private:
 
+	static void registerInstance(Module *instance);
+
+	ModuleType moduleType;
+	std::string name;
+
 	static Module *instances[M_MAX_ENUM];
 
 }; // Module

+ 1 - 1
src/common/Object.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Object.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Optional.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 2 - 2
src/common/Range.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -61,7 +61,7 @@ struct Range
 		return first <= other.first && last >= other.last;
 	}
 
-	bool intersects(const Range &other)
+	bool intersects(const Range &other) const
 	{
 		return !(first > other.last || last < other.first);
 	}

+ 1 - 1
src/common/Reference.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Reference.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Stream.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Stream.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/StringMap.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/StringMap.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Variant.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Variant.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Vector.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/Vector.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 9 - 7
src/common/android.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -385,18 +385,20 @@ struct AssetInfo: public love::filesystem::physfs::PhysfsIo<AssetInfo>
 		return 1;
 	}
 
-	AssetInfo *duplicate() const
+	AssetInfo(const AssetInfo &other)
+	: assetManager(other.assetManager)
+	, size(strlen(other.filename) + 1)
 	{
-		AAsset *newAsset = AAssetManager_open(assetManager, filename, AASSET_MODE_RANDOM);
+		asset = AAssetManager_open(assetManager, other.filename, AASSET_MODE_RANDOM);
 
-		if (newAsset == nullptr)
+		if (asset == nullptr)
 		{
 			PHYSFS_setErrorCode(PHYSFS_ERR_OS_ERROR);
-			return nullptr;
+			throw new love::Exception("Unable to duplicate AssetInfo");
 		}
 
-		AAsset_seek64(asset, tell(), SEEK_SET);
-		return fromAAsset(assetManager, filename, asset);
+		filename = new (std::nothrow) char[size];
+		memcpy(filename, other.filename, size);
 	}
 
 	~AssetInfo() override

+ 1 - 1
src/common/android.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/apple.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/apple.mm

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/b64.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/b64.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/config.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/delay.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/delay.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/deprecation.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/deprecation.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/floattypes.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/floattypes.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/int.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/ios.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/ios.mm

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/macos.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/macos.mm

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/math.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/memory.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/memory.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 9 - 1
src/common/pixelformat.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -342,6 +342,10 @@ PixelFormat getSRGBPixelFormat(PixelFormat format)
 	{
 	case PIXELFORMAT_RGBA8_UNORM: return PIXELFORMAT_RGBA8_sRGB;
 	case PIXELFORMAT_BGRA8_UNORM: return PIXELFORMAT_BGRA8_sRGB;
+	case PIXELFORMAT_DXT1_UNORM: return PIXELFORMAT_DXT1_sRGB;
+	case PIXELFORMAT_DXT3_UNORM: return PIXELFORMAT_DXT3_sRGB;
+	case PIXELFORMAT_DXT5_UNORM: return PIXELFORMAT_DXT5_sRGB;
+	case PIXELFORMAT_BC7_UNORM: return PIXELFORMAT_BC7_sRGB;
 	case PIXELFORMAT_PVR1_RGB2_UNORM: return PIXELFORMAT_PVR1_RGB2_sRGB;
 	case PIXELFORMAT_PVR1_RGB4_UNORM: return PIXELFORMAT_PVR1_RGB4_sRGB;
 	case PIXELFORMAT_PVR1_RGBA2_UNORM: return PIXELFORMAT_PVR1_RGBA2_sRGB;
@@ -374,6 +378,10 @@ PixelFormat getLinearPixelFormat(PixelFormat format)
 	{
 	case PIXELFORMAT_RGBA8_sRGB: return PIXELFORMAT_RGBA8_UNORM;
 	case PIXELFORMAT_BGRA8_sRGB: return PIXELFORMAT_BGRA8_UNORM;
+	case PIXELFORMAT_DXT1_sRGB: return PIXELFORMAT_DXT1_UNORM;
+	case PIXELFORMAT_DXT3_sRGB: return PIXELFORMAT_DXT3_UNORM;
+	case PIXELFORMAT_DXT5_sRGB: return PIXELFORMAT_DXT5_UNORM;
+	case PIXELFORMAT_BC7_sRGB: return PIXELFORMAT_BC7_UNORM;
 	case PIXELFORMAT_PVR1_RGB2_sRGB: return PIXELFORMAT_PVR1_RGB2_UNORM;
 	case PIXELFORMAT_PVR1_RGB4_sRGB: return PIXELFORMAT_PVR1_RGB4_UNORM;
 	case PIXELFORMAT_PVR1_RGBA2_sRGB: return PIXELFORMAT_PVR1_RGBA2_UNORM;

+ 1 - 1
src/common/pixelformat.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 4
src/common/runtime.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -473,9 +473,6 @@ int luax_register_module(lua_State *L, const WrappedModule &m)
 	lua_setfield(L, -3, m.name); // love.graphics = table
 	lua_remove(L, -2); // love
 
-	// Register module instance
-	Module::registerInstance(m.module);
-
 	return 1;
 }
 

+ 16 - 9
src/common/runtime.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -629,22 +629,29 @@ T *luax_optmodule(lua_State *L)
 }
 
 /**
- * Converts the value at idx to the specified type without checking that
- * this conversion is valid. If the type has been previously verified with
- * luax_istype, then this can be safely used. Otherwise, use luax_checktype.
+ * Converts the value at idx to the specified type. Returns null if the type
+ * doesn't match.
  * @param L The Lua state.
  * @param idx The index on the stack.
  * @param type The type of the object.
  **/
 template <typename T>
-T *luax_totype(lua_State *L, int idx, const love::Type& /*type*/)
+T *luax_totype(lua_State *L, int idx, const love::Type &type)
 {
-	T *o = (T *)(((Proxy *)lua_touserdata(L, idx))->object);
+	if (lua_type(L, idx) != LUA_TUSERDATA)
+		return nullptr;
 
-	if (o == nullptr)
-		luaL_error(L, "Cannot use object after it has been released.");
+	Proxy *p = (Proxy *) lua_touserdata(L, idx);
+
+	if (p->type != nullptr && p->type->isa(type))
+	{
+		if (p->object == nullptr)
+			luaL_error(L, "Cannot use object after it has been released.");
+
+		return (T *) p->object;
+	}
 
-	return o;
+	return nullptr;
 }
 
 template <typename T>

+ 1 - 1
src/common/types.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/types.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/utf8.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/utf8.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/common/version.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/ddsparse/ddsinfo.h

@@ -1,7 +1,7 @@
 /**
  * Simple DDS data parser for compressed 2D textures.
  *
- * Copyright (c) 2013-2023 Sasha Szpakowski
+ * Copyright (c) 2013-2024 Sasha Szpakowski
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/ddsparse/ddsparse.cpp

@@ -1,7 +1,7 @@
 /**
  * Simple DDS data parser for compressed 2D textures.
  *
- * Copyright (c) 2013-2023 Sasha Szpakowski
+ * Copyright (c) 2013-2024 Sasha Szpakowski
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/ddsparse/ddsparse.h

@@ -1,7 +1,7 @@
 /**
  * Simple DDS data parser for compressed 2D textures.
  *
- * Copyright (c) 2013-2023 Sasha Szpakowski
+ * Copyright (c) 2013-2024 Sasha Szpakowski
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/enet/lua-enet.h

@@ -1,5 +1,5 @@
 /**
-* Copyright (c) 2006-2023 LOVE Development Team
+* Copyright (c) 2006-2024 LOVE Development Team
 * 
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/libluasocket/ftp.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/libluasocket/headers.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 15 - 9
src/libraries/luasocket/libluasocket/http.lua

@@ -54,7 +54,7 @@ local function receiveheaders(sock, headers)
     while line ~= "" do
         -- get field-name and value
         name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)"))
-        if not (name and value) then return nil, "malformed reponse headers" end
+        if not (name and value) then return nil, "malformed response headers" end
         name = string.lower(name)
         -- get next line (value might be folded)
         line, err  = sock:receive()
@@ -62,7 +62,7 @@ local function receiveheaders(sock, headers)
         -- unfold any folded values
         while string.find(line, "^%s") do
             value = value .. line
-            line = sock:receive()
+            line, err = sock:receive()
             if err then return nil, err end
         end
         -- save pair in table
@@ -81,7 +81,7 @@ socket.sourcet["http-chunked"] = function(sock, headers)
         dirty = function() return sock:dirty() end
     }, {
         __call = function()
-            -- get chunk size, skip extention
+            -- get chunk size, skip extension
             local line, err = sock:receive()
             if err then return nil, err end
             local size = base.tonumber(string.gsub(line, ";.*", ""), 16)
@@ -219,9 +219,11 @@ local function adjustproxy(reqt)
     local proxy = reqt.proxy or _M.PROXY
     if proxy then
         proxy = url.parse(proxy)
-        return proxy.host, proxy.port or 3128
+        proxy.port = proxy.port or 3128
+        proxy.create = SCHEMES[proxy.scheme].create(reqt)
+        return proxy.host, proxy.port, proxy.create
     else
-        return reqt.host, reqt.port
+        return reqt.host, reqt.port, reqt.create
     end
 end
 
@@ -279,7 +281,7 @@ local function adjustrequest(reqt)
     if not (host and host ~= "") then
         socket.try(nil, "invalid host '" .. base.tostring(nreqt.host) .. "'")
     end
-    -- compute uri if user hasn't overriden
+    -- compute uri if user hasn't overridden
     nreqt.uri = reqt.uri or adjusturi(nreqt)
     -- adjust headers in request
     nreqt.headers = adjustheaders(nreqt)
@@ -291,7 +293,10 @@ local function adjustrequest(reqt)
     end
 
     -- ajust host and port if there is a proxy
-    nreqt.host, nreqt.port = adjustproxy(nreqt)
+    local proxy_create
+    nreqt.host, nreqt.port, proxy_create = adjustproxy(nreqt)
+    if not reqt.create then nreqt.create = proxy_create end
+
     return nreqt
 end
 
@@ -300,6 +305,8 @@ local function shouldredirect(reqt, code, headers)
     if not location then return false end
     location = string.gsub(location, "%s", "")
     if location == "" then return false end
+    -- the RFC says the redirect URL may be relative
+    location = url.absolute(reqt.url, location)
     local scheme = url.parse(location).scheme
     if scheme and (not SCHEMES[scheme]) then return false end
     -- avoid https downgrades
@@ -323,8 +330,7 @@ end
 local trequest, tredirect
 
 --[[local]] function tredirect(reqt, location)
-    -- the RFC says the redirect URL has to be absolute, but some
-    -- servers do not respect that
+    -- the RFC says the redirect URL may be relative
     local newurl = url.absolute(reqt.url, location)
     -- if switching schemes, reset port and create function
     if url.parse(newurl).scheme ~= reqt.scheme then

+ 35 - 15
src/libraries/luasocket/libluasocket/http.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -167,8 +167,8 @@ const unsigned char http_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x28, 0x6e, 0x61, 
 	0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 
 	0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 0x22, 0x6d, 0x61, 0x6c, 0x66, 
-	0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x72, 0x65, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x68, 0x65, 0x61, 0x64, 
-	0x65, 0x72, 0x73, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+	0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x68, 0x65, 0x61, 
+	0x64, 0x65, 0x72, 0x73, 0x22, 0x20, 0x65, 0x6e, 0x64, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 
 	0x69, 0x6e, 0x67, 0x2e, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 
@@ -186,8 +186,9 @@ const unsigned char http_lua[] =
 	0x22, 0x29, 0x20, 0x64, 0x6f, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 
 	0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x2e, 0x2e, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x0a,
-	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 
-	0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 
+	0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 
+	0x28, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x65, 0x72, 0x72, 
 	0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 0x6c, 0x2c, 0x20, 
 	0x65, 0x72, 0x72, 0x20, 0x65, 0x6e, 0x64, 0x0a,
@@ -235,7 +236,7 @@ const unsigned char http_lua[] =
 	0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 
 	0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x20, 
-	0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x0a,
+	0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
 	0x6c, 0x69, 0x6e, 0x65, 0x2c, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x3a, 0x72, 
 	0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x28, 0x29, 0x0a,
@@ -570,12 +571,20 @@ const unsigned char http_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x75, 0x72, 
 	0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x29, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, 0x74, 
+	0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x33, 
+	0x31, 0x32, 0x38, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x72, 0x65, 0x61, 
+	0x74, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x45, 0x53, 0x5b, 0x70, 0x72, 0x6f, 0x78, 0x79, 
+	0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x5d, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x28, 0x72, 0x65, 
+	0x71, 0x74, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x72, 0x6f, 
 	0x78, 0x79, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x70, 0x6f, 0x72, 
-	0x74, 0x20, 0x6f, 0x72, 0x20, 0x33, 0x31, 0x32, 0x38, 0x0a,
+	0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 
-	0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x0a,
+	0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 
+	0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
 	0x65, 0x6e, 0x64, 0x0a,
 	0x0a,
@@ -710,7 +719,7 @@ const unsigned char http_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x20, 0x75, 0x72, 0x69, 
 	0x20, 0x69, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6f, 0x76, 
-	0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x0a,
+	0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, 
 	0x71, 0x74, 0x2e, 0x75, 0x72, 0x69, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x75, 0x72, 
 	0x69, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,
@@ -736,9 +745,17 @@ const unsigned char http_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x61, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x73, 0x74, 0x20, 
 	0x61, 0x6e, 0x64, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 
 	0x69, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, 
+	0x65, 0x61, 0x74, 0x65, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x2c, 0x20, 0x6e, 0x72, 
-	0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x70, 
-	0x72, 0x6f, 0x78, 0x79, 0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,
+	0x65, 0x71, 0x74, 0x2e, 0x70, 0x6f, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, 
+	0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x78, 0x79, 
+	0x28, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x29, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 
+	0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x63, 0x72, 
+	0x65, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 
+	0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+	0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x72, 0x65, 0x71, 0x74, 0x0a,
 	0x65, 0x6e, 0x64, 0x0a,
 	0x0a,
@@ -757,6 +774,12 @@ const unsigned char http_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 
 	0x20, 0x22, 0x22, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 
 	0x6c, 0x73, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x73, 0x61, 0x79, 
+	0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x55, 0x52, 0x4c, 
+	0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x0a,
+	0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x72, 0x6c, 
+	0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x28, 0x72, 0x65, 0x71, 0x74, 0x2e, 0x75, 0x72, 0x6c, 
+	0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x3d, 
 	0x20, 0x75, 0x72, 0x6c, 0x2e, 0x70, 0x61, 0x72, 0x73, 0x65, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 
 	0x6e, 0x29, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x0a,
@@ -820,10 +843,7 @@ const unsigned char http_lua[] =
 	0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x46, 0x43, 0x20, 0x73, 0x61, 0x79, 
 	0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x55, 0x52, 0x4c, 
-	0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 
-	0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x0a,
-	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x20, 0x64, 0x6f, 0x20, 
-	0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a,
+	0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6e, 0x65, 0x77, 0x75, 0x72, 0x6c, 0x20, 0x3d, 
 	0x20, 0x75, 0x72, 0x6c, 0x2e, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x28, 0x72, 0x65, 0x71, 0x74, 
 	0x2e, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x0a,

+ 1 - 1
src/libraries/luasocket/libluasocket/inet.c

@@ -290,7 +290,7 @@ int inet_meth_getsockname(lua_State *L, p_socket ps, int family)
         return 2;
     }
     lua_pushstring(L, name);
-    lua_pushstring(L, port);
+    lua_pushinteger(L, (int) strtol(port, (char **) NULL, 10));
     switch (family) {
         case AF_INET: lua_pushliteral(L, "inet"); break;
         case AF_INET6: lua_pushliteral(L, "inet6"); break;

+ 1 - 1
src/libraries/luasocket/libluasocket/ltn12.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/libluasocket/luasocket.h

@@ -10,7 +10,7 @@
 /*-------------------------------------------------------------------------* \
 * Current socket library version
 \*-------------------------------------------------------------------------*/
-#define LUASOCKET_VERSION    "LuaSocket 3.0.0"
+#define LUASOCKET_VERSION    "LuaSocket 3.1.0"
 #define LUASOCKET_COPYRIGHT  "Copyright (C) 1999-2013 Diego Nehab"
 
 /*-------------------------------------------------------------------------*\

+ 2 - 2
src/libraries/luasocket/libluasocket/makefile

@@ -1,6 +1,6 @@
 # luasocket src/makefile
 #
-# Definitions in this section can be overriden on the command line or in the
+# Definitions in this section can be overridden on the command line or in the
 # environment.
 #
 # These are equivalent:
@@ -272,7 +272,7 @@ SOCKET_win64=wsocket.obj
 #
 SO=$(SO_$(PLAT))
 O=$(O_$(PLAT))
-SOCKET_V=3.0.0
+SOCKET_V=3.1.0
 MIME_V=1.0.3
 SOCKET_SO=socket-$(SOCKET_V).$(SO)
 MIME_SO=mime-$(MIME_V).$(SO)

+ 1 - 1
src/libraries/luasocket/libluasocket/mbox.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/libluasocket/mime.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 28 - 1
src/libraries/luasocket/libluasocket/options.c

@@ -54,6 +54,33 @@ int opt_meth_getoption(lua_State *L, p_opt opt, p_socket ps)
     return opt->func(L, ps);
 }
 
+/*------------------------------------------------------*/
+/* binds socket to network interface */
+int opt_set_bindtodevice(lua_State *L, p_socket ps)
+{
+#ifndef SO_BINDTODEVICE
+    return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
+#else
+    const char *dev = luaL_checkstring(L, 3);
+    return opt_set(L, ps, SOL_SOCKET, SO_BINDTODEVICE, (char*)dev, strlen(dev)+1);
+#endif
+}
+
+int opt_get_bindtodevice(lua_State *L, p_socket ps)
+{
+#ifndef SO_BINDTODEVICE
+    return luaL_error(L, "SO_BINDTODEVICE is not supported on this operating system");
+#else
+    char dev[IFNAMSIZ];
+    int len = sizeof(dev);
+    int err = opt_get(L, ps, SOL_SOCKET, SO_BINDTODEVICE, &dev, &len);
+    if (err)
+        return err;
+    lua_pushstring(L, dev);
+    return 1;
+#endif
+}
+
 /*------------------------------------------------------*/
 /* enables reuse of local address */
 int opt_set_reuseaddr(lua_State *L, p_socket ps)
@@ -190,7 +217,7 @@ int opt_set_send_buf_size(lua_State *L, p_socket ps)
 	return opt_setint(L, ps, SOL_SOCKET, SO_SNDBUF);
 }
 
-// /*------------------------------------------------------*/
+/*------------------------------------------------------*/
 
 #ifdef TCP_FASTOPEN
 int opt_set_tcp_fastopen(lua_State *L, p_socket ps)

+ 3 - 0
src/libraries/luasocket/libluasocket/options.h

@@ -53,6 +53,9 @@ int opt_get_tcp_keepintvl(lua_State *L, p_socket ps);
 int opt_set_tcp_defer_accept(lua_State *L, p_socket ps);
 #endif
 
+int opt_set_bindtodevice(lua_State *L, p_socket ps);
+int opt_get_bindtodevice(lua_State *L, p_socket ps);
+
 int opt_set_keepalive(lua_State *L, p_socket ps);
 int opt_get_keepalive(lua_State *L, p_socket ps);
 

+ 2 - 2
src/libraries/luasocket/libluasocket/smtp.lua

@@ -225,7 +225,7 @@ local function adjust_headers(mesgt)
     lower["date"] = lower["date"] or
         os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE)
     lower["x-mailer"] = lower["x-mailer"] or socket._VERSION
-    -- this can't be overriden
+    -- this can't be overridden
     lower["mime-version"] = "1.0"
     return lower
 end
@@ -253,4 +253,4 @@ _M.send = socket.protect(function(mailt)
     return s:close()
 end)
 
-return _M
+return _M

+ 2 - 2
src/libraries/luasocket/libluasocket/smtp.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -543,7 +543,7 @@ const unsigned char smtp_lua[] =
 	0x6c, 0x65, 0x72, 0x22, 0x5d, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x5f, 0x56, 
 	0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 
-	0x62, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x6e, 0x0a,
+	0x62, 0x65, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5b, 0x22, 0x6d, 0x69, 0x6d, 0x65, 0x2d, 0x76, 0x65, 
 	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x20, 0x3d, 0x20, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x0a,

+ 1 - 1
src/libraries/luasocket/libluasocket/socket.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 2 - 0
src/libraries/luasocket/libluasocket/tcp.c

@@ -71,6 +71,7 @@ static luaL_Reg tcp_methods[] = {
 
 /* socket option handlers */
 static t_opt optget[] = {
+    {"bindtodevice", opt_get_bindtodevice},
     {"keepalive",   opt_get_keepalive},
     {"reuseaddr",   opt_get_reuseaddr},
     {"reuseport",   opt_get_reuseport},
@@ -92,6 +93,7 @@ static t_opt optget[] = {
 };
 
 static t_opt optset[] = {
+    {"bindtodevice", opt_set_bindtodevice},
     {"keepalive",   opt_set_keepalive},
     {"reuseaddr",   opt_set_reuseaddr},
     {"reuseport",   opt_set_reuseport},

+ 1 - 1
src/libraries/luasocket/libluasocket/tp.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/libluasocket/url.lua

@@ -152,7 +152,7 @@ function _M.parse(url, default)
     url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
         function(s) parsed.scheme = s; return "" end)
     -- get authority
-    url = string.gsub(url, "^//([^/]*)", function(n)
+    url = string.gsub(url, "^//([^/%?#]*)", function(n)
         parsed.authority = n
         return ""
     end)

+ 4 - 3
src/libraries/luasocket/libluasocket/url.lua.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  * 
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -402,8 +402,9 @@ const unsigned char url_lua[] =
 	0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 
 	0x74, 0x79, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x67, 
-	0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x5e, 0x2f, 0x2f, 0x28, 0x5b, 0x5e, 0x2f, 0x5d, 
-	0x2a, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x29, 0x0a,
+	0x73, 0x75, 0x62, 0x28, 0x75, 0x72, 0x6c, 0x2c, 0x20, 0x22, 0x5e, 0x2f, 0x2f, 0x28, 0x5b, 0x5e, 0x2f, 0x25, 
+	0x3f, 0x23, 0x5d, 0x2a, 0x29, 0x22, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 
+	0x29, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x2e, 0x61, 0x75, 0x74, 
 	0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x6e, 0x0a,
 	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x22, 0x22, 0x0a,

+ 1 - 1
src/libraries/luasocket/libluasocket/usocket.c

@@ -236,7 +236,7 @@ int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,
     *sent = 0;
     if (*ps == SOCKET_INVALID) return IO_CLOSED;
     for ( ;; ) {
-        long put = (long) sendto(*ps, data, count, 0, addr, len); 
+        long put = (long) sendto(*ps, data, count, 0, addr, len);
         if (put >= 0) {
             *sent = put;
             return IO_DONE;

+ 2 - 0
src/libraries/luasocket/libluasocket/wsocket.c

@@ -262,6 +262,7 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got,
         if (err != WSAEWOULDBLOCK) {
             if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
             prev = err;
+            continue;
         }
         if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
     }
@@ -291,6 +292,7 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
         if (err != WSAEWOULDBLOCK) {
             if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
             prev = err;
+            continue;
         }
         if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
     }

+ 1 - 1
src/libraries/luasocket/luasocket.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/libraries/luasocket/luasocket.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 3 - 3
src/love.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -150,11 +150,11 @@ enum DoneAction
 static void print_usage()
 {
     // when editing this message, change it at boot.lua too
-    printf("LÖVE is an *awesome* framework you can use to make 2D games in Lua\n"
+    printf("LOVE is an *awesome* framework you can use to make 2D games in Lua\n"
         "https://love2d.org\n"
         "\n"
         "usage:\n"
-        "    love --version                  prints LÖVE version and quits\n"
+        "    love --version                  prints LOVE version and quits\n"
         "    love --help                     prints this message and quits\n"
         "    love path/to/gamedir            runs the game from the given directory which contains a main.lua file\n"
         "    love path/to/packagedgame.love  runs the packaged game from the provided .love file\n"

+ 5 - 1
src/modules/audio/Audio.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -68,6 +68,10 @@ void showRecordingPermissionMissingDialog()
 #endif
 }
 
+Audio::Audio(const char *name)
+	: Module(M_AUDIO, name)
+{}
+
 bool Audio::setMixWithSystem(bool mix)
 {
 #ifdef LOVE_IOS

+ 5 - 4
src/modules/audio/Audio.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages
@@ -101,9 +101,6 @@ public:
 
 	virtual ~Audio() {}
 
-	// Implements Module.
-	virtual ModuleType getModuleType() const { return M_AUDIO; }
-
 	virtual Source *newSource(love::sound::Decoder *decoder) = 0;
 	virtual Source *newSource(love::sound::SoundData *soundData) = 0;
 	virtual Source *newSource(int sampleRate, int bitDepth, int channels, int buffers) = 0;
@@ -312,6 +309,10 @@ public:
 	 */
 	virtual void setPlaybackDevice(const char *name);
 
+protected:
+
+	Audio(const char *name);
+
 private:
 
 	static StringMap<DistanceModel, DISTANCE_MAX_ENUM>::Entry distanceModelEntries[];

+ 1 - 1
src/modules/audio/Effect.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/Effect.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/Filter.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/Filter.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/RecordingDevice.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/RecordingDevice.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/Source.cpp

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

+ 1 - 1
src/modules/audio/Source.h

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2006-2023 LOVE Development Team
+ * Copyright (c) 2006-2024 LOVE Development Team
  *
  * This software is provided 'as-is', without any express or implied
  * warranty.  In no event will the authors be held liable for any damages

Some files were not shown because too many files changed in this diff