3928 changed files with 691446 additions and 50 deletions
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../acorn/bin/acorn" "$@" |
|||
else |
|||
exec node "$basedir/../acorn/bin/acorn" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\acorn\bin\acorn" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../acorn/bin/acorn" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../atob/bin/atob.js" "$@" |
|||
else |
|||
exec node "$basedir/../atob/bin/atob.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\atob\bin\atob.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../atob/bin/atob.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../atob/bin/atob.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../atob/bin/atob.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../atob/bin/atob.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../errno/cli.js" "$@" |
|||
else |
|||
exec node "$basedir/../errno/cli.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\errno\cli.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../errno/cli.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../errno/cli.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../errno/cli.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../errno/cli.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../json5/lib/cli.js" "$@" |
|||
else |
|||
exec node "$basedir/../json5/lib/cli.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\json5\lib\cli.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../json5/lib/cli.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../json5/lib/cli.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../json5/lib/cli.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../json5/lib/cli.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../miller-rabin/bin/miller-rabin" "$@" |
|||
else |
|||
exec node "$basedir/../miller-rabin/bin/miller-rabin" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\miller-rabin\bin\miller-rabin" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../miller-rabin/bin/miller-rabin" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../mkdirp/bin/cmd.js" "$@" |
|||
else |
|||
exec node "$basedir/../mkdirp/bin/cmd.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\mkdirp\bin\cmd.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../mkdirp/bin/cmd.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../mkdirp/bin/cmd.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../mkdirp/bin/cmd.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../mkdirp/bin/cmd.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../rimraf/bin.js" "$@" |
|||
else |
|||
exec node "$basedir/../rimraf/bin.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\rimraf\bin.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../rimraf/bin.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../rimraf/bin.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../rimraf/bin.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../rimraf/bin.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../semver/bin/semver" "$@" |
|||
else |
|||
exec node "$basedir/../semver/bin/semver" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\semver\bin\semver" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../semver/bin/semver" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../semver/bin/semver" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../semver/bin/semver" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../semver/bin/semver" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh
|
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../sha.js/bin.js" "$@" |
|||
else |
|||
exec node "$basedir/../sha.js/bin.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\sha.js\bin.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../sha.js/bin.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../sha.js/bin.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../sha.js/bin.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../sha.js/bin.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../terser/bin/terser" "$@" |
|||
else |
|||
exec node "$basedir/../terser/bin/terser" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\terser\bin\terser" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../terser/bin/terser" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../terser/bin/terser" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../terser/bin/terser" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../terser/bin/terser" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
@ -0,0 +1,12 @@ |
|||
#!/bin/sh |
|||
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") |
|||
|
|||
case `uname` in |
|||
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; |
|||
esac |
|||
|
|||
if [ -x "$basedir/node" ]; then |
|||
exec "$basedir/node" "$basedir/../webpack/bin/webpack.js" "$@" |
|||
else |
|||
exec node "$basedir/../webpack/bin/webpack.js" "$@" |
|||
fi |
@ -0,0 +1,17 @@ |
|||
@ECHO off |
|||
GOTO start |
|||
:find_dp0 |
|||
SET dp0=%~dp0 |
|||
EXIT /b |
|||
:start |
|||
SETLOCAL |
|||
CALL :find_dp0 |
|||
|
|||
IF EXIST "%dp0%\node.exe" ( |
|||
SET "_prog=%dp0%\node.exe" |
|||
) ELSE ( |
|||
SET "_prog=node" |
|||
SET PATHEXT=%PATHEXT:;.JS;=;% |
|||
) |
|||
|
|||
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\webpack\bin\webpack.js" %* |
@ -0,0 +1,28 @@ |
|||
#!/usr/bin/env pwsh |
|||
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent |
|||
|
|||
$exe="" |
|||
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { |
|||
# Fix case when both the Windows and Linux builds of Node |
|||
# are installed in the same directory |
|||
$exe=".exe" |
|||
} |
|||
$ret=0 |
|||
if (Test-Path "$basedir/node$exe") { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "$basedir/node$exe" "$basedir/../webpack/bin/webpack.js" $args |
|||
} else { |
|||
& "$basedir/node$exe" "$basedir/../webpack/bin/webpack.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} else { |
|||
# Support pipeline input |
|||
if ($MyInvocation.ExpectingInput) { |
|||
$input | & "node$exe" "$basedir/../webpack/bin/webpack.js" $args |
|||
} else { |
|||
& "node$exe" "$basedir/../webpack/bin/webpack.js" $args |
|||
} |
|||
$ret=$LASTEXITCODE |
|||
} |
|||
exit $ret |
File diff suppressed because it is too large
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) Microsoft Corporation. |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE |
@ -0,0 +1,15 @@ |
|||
# Installation |
|||
> `npm install --save @types/json-schema` |
|||
|
|||
# Summary |
|||
This package contains type definitions for json-schema (https://github.com/kriszyp/json-schema). |
|||
|
|||
# Details |
|||
Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/json-schema. |
|||
|
|||
### Additional Details |
|||
* Last updated: Tue, 07 Nov 2023 03:09:37 GMT |
|||
* Dependencies: none |
|||
|
|||
# Credits |
|||
These definitions were written by [Boris Cherny](https://github.com/bcherny), [Lucian Buzzo](https://github.com/lucianbuzzo), [Roland Groza](https://github.com/rolandjitsu), and [Jason Kwok](https://github.com/JasonHK). |
@ -0,0 +1,749 @@ |
|||
// ==================================================================================================
|
|||
// JSON Schema Draft 04
|
|||
// ==================================================================================================
|
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.1
|
|||
*/ |
|||
export type JSONSchema4TypeName = |
|||
| "string" //
|
|||
| "number" |
|||
| "integer" |
|||
| "boolean" |
|||
| "object" |
|||
| "array" |
|||
| "null" |
|||
| "any"; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-04#section-3.5
|
|||
*/ |
|||
export type JSONSchema4Type = |
|||
| string //
|
|||
| number |
|||
| boolean |
|||
| JSONSchema4Object |
|||
| JSONSchema4Array |
|||
| null; |
|||
|
|||
// Workaround for infinite type recursion
|
|||
export interface JSONSchema4Object { |
|||
[key: string]: JSONSchema4Type; |
|||
} |
|||
|
|||
// Workaround for infinite type recursion
|
|||
// https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
|
|||
export interface JSONSchema4Array extends Array<JSONSchema4Type> {} |
|||
|
|||
/** |
|||
* Meta schema |
|||
* |
|||
* Recommended values: |
|||
* - 'http://json-schema.org/schema#' |
|||
* - 'http://json-schema.org/hyper-schema#' |
|||
* - 'http://json-schema.org/draft-04/schema#' |
|||
* - 'http://json-schema.org/draft-04/hyper-schema#' |
|||
* - 'http://json-schema.org/draft-03/schema#' |
|||
* - 'http://json-schema.org/draft-03/hyper-schema#' |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5
|
|||
*/ |
|||
export type JSONSchema4Version = string; |
|||
|
|||
/** |
|||
* JSON Schema V4 |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-04
|
|||
*/ |
|||
export interface JSONSchema4 { |
|||
id?: string | undefined; |
|||
$ref?: string | undefined; |
|||
$schema?: JSONSchema4Version | undefined; |
|||
|
|||
/** |
|||
* This attribute is a string that provides a short description of the |
|||
* instance property. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.21
|
|||
*/ |
|||
title?: string | undefined; |
|||
|
|||
/** |
|||
* This attribute is a string that provides a full description of the of |
|||
* purpose the instance property. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.22
|
|||
*/ |
|||
description?: string | undefined; |
|||
|
|||
default?: JSONSchema4Type | undefined; |
|||
multipleOf?: number | undefined; |
|||
maximum?: number | undefined; |
|||
exclusiveMaximum?: boolean | undefined; |
|||
minimum?: number | undefined; |
|||
exclusiveMinimum?: boolean | undefined; |
|||
maxLength?: number | undefined; |
|||
minLength?: number | undefined; |
|||
pattern?: string | undefined; |
|||
|
|||
/** |
|||
* May only be defined when "items" is defined, and is a tuple of JSONSchemas. |
|||
* |
|||
* This provides a definition for additional items in an array instance |
|||
* when tuple definitions of the items is provided. This can be false |
|||
* to indicate additional items in the array are not allowed, or it can |
|||
* be a schema that defines the schema of the additional items. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.6
|
|||
*/ |
|||
additionalItems?: boolean | JSONSchema4 | undefined; |
|||
|
|||
/** |
|||
* This attribute defines the allowed items in an instance array, and |
|||
* MUST be a schema or an array of schemas. The default value is an |
|||
* empty schema which allows any value for items in the instance array. |
|||
* |
|||
* When this attribute value is a schema and the instance value is an |
|||
* array, then all the items in the array MUST be valid according to the |
|||
* schema. |
|||
* |
|||
* When this attribute value is an array of schemas and the instance |
|||
* value is an array, each position in the instance array MUST conform |
|||
* to the schema in the corresponding position for this array. This |
|||
* called tuple typing. When tuple typing is used, additional items are |
|||
* allowed, disallowed, or constrained by the "additionalItems" |
|||
* (Section 5.6) attribute using the same rules as |
|||
* "additionalProperties" (Section 5.4) for objects. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.5
|
|||
*/ |
|||
items?: JSONSchema4 | JSONSchema4[] | undefined; |
|||
|
|||
maxItems?: number | undefined; |
|||
minItems?: number | undefined; |
|||
uniqueItems?: boolean | undefined; |
|||
maxProperties?: number | undefined; |
|||
minProperties?: number | undefined; |
|||
|
|||
/** |
|||
* This attribute indicates if the instance must have a value, and not |
|||
* be undefined. This is false by default, making the instance |
|||
* optional. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.7
|
|||
*/ |
|||
required?: boolean | string[] | undefined; |
|||
|
|||
/** |
|||
* This attribute defines a schema for all properties that are not |
|||
* explicitly defined in an object type definition. If specified, the |
|||
* value MUST be a schema or a boolean. If false is provided, no |
|||
* additional properties are allowed beyond the properties defined in |
|||
* the schema. The default value is an empty schema which allows any |
|||
* value for additional properties. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.4
|
|||
*/ |
|||
additionalProperties?: boolean | JSONSchema4 | undefined; |
|||
|
|||
definitions?: { |
|||
[k: string]: JSONSchema4; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This attribute is an object with property definitions that define the |
|||
* valid values of instance object property values. When the instance |
|||
* value is an object, the property values of the instance object MUST |
|||
* conform to the property definitions in this object. In this object, |
|||
* each property definition's value MUST be a schema, and the property's |
|||
* name MUST be the name of the instance property that it defines. The |
|||
* instance property value MUST be valid according to the schema from |
|||
* the property definition. Properties are considered unordered, the |
|||
* order of the instance properties MAY be in any order. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.2
|
|||
*/ |
|||
properties?: { |
|||
[k: string]: JSONSchema4; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This attribute is an object that defines the schema for a set of |
|||
* property names of an object instance. The name of each property of |
|||
* this attribute's object is a regular expression pattern in the ECMA |
|||
* 262/Perl 5 format, while the value is a schema. If the pattern |
|||
* matches the name of a property on the instance object, the value of |
|||
* the instance's property MUST be valid against the pattern name's |
|||
* schema value. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.3
|
|||
*/ |
|||
patternProperties?: { |
|||
[k: string]: JSONSchema4; |
|||
} | undefined; |
|||
dependencies?: { |
|||
[k: string]: JSONSchema4 | string[]; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This provides an enumeration of all possible values that are valid |
|||
* for the instance property. This MUST be an array, and each item in |
|||
* the array represents a possible value for the instance value. If |
|||
* this attribute is defined, the instance value MUST be one of the |
|||
* values in the array in order for the schema to be valid. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.19
|
|||
*/ |
|||
enum?: JSONSchema4Type[] | undefined; |
|||
|
|||
/** |
|||
* A single type, or a union of simple types |
|||
*/ |
|||
type?: JSONSchema4TypeName | JSONSchema4TypeName[] | undefined; |
|||
|
|||
allOf?: JSONSchema4[] | undefined; |
|||
anyOf?: JSONSchema4[] | undefined; |
|||
oneOf?: JSONSchema4[] | undefined; |
|||
not?: JSONSchema4 | undefined; |
|||
|
|||
/** |
|||
* The value of this property MUST be another schema which will provide |
|||
* a base schema which the current schema will inherit from. The |
|||
* inheritance rules are such that any instance that is valid according |
|||
* to the current schema MUST be valid according to the referenced |
|||
* schema. This MAY also be an array, in which case, the instance MUST |
|||
* be valid for all the schemas in the array. A schema that extends |
|||
* another schema MAY define additional attributes, constrain existing |
|||
* attributes, or add other constraints. |
|||
* |
|||
* Conceptually, the behavior of extends can be seen as validating an |
|||
* instance against all constraints in the extending schema as well as |
|||
* the extended schema(s). |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.26
|
|||
*/ |
|||
extends?: string | string[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-zyp-json-schema-04#section-5.6
|
|||
*/ |
|||
[k: string]: any; |
|||
|
|||
format?: string | undefined; |
|||
} |
|||
|
|||
// ==================================================================================================
|
|||
// JSON Schema Draft 06
|
|||
// ==================================================================================================
|
|||
|
|||
export type JSONSchema6TypeName = |
|||
| "string" //
|
|||
| "number" |
|||
| "integer" |
|||
| "boolean" |
|||
| "object" |
|||
| "array" |
|||
| "null" |
|||
| "any"; |
|||
|
|||
export type JSONSchema6Type = |
|||
| string //
|
|||
| number |
|||
| boolean |
|||
| JSONSchema6Object |
|||
| JSONSchema6Array |
|||
| null; |
|||
|
|||
// Workaround for infinite type recursion
|
|||
export interface JSONSchema6Object { |
|||
[key: string]: JSONSchema6Type; |
|||
} |
|||
|
|||
// Workaround for infinite type recursion
|
|||
// https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
|
|||
export interface JSONSchema6Array extends Array<JSONSchema6Type> {} |
|||
|
|||
/** |
|||
* Meta schema |
|||
* |
|||
* Recommended values: |
|||
* - 'http://json-schema.org/schema#' |
|||
* - 'http://json-schema.org/hyper-schema#' |
|||
* - 'http://json-schema.org/draft-06/schema#' |
|||
* - 'http://json-schema.org/draft-06/hyper-schema#' |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5
|
|||
*/ |
|||
export type JSONSchema6Version = string; |
|||
|
|||
/** |
|||
* JSON Schema V6 |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01
|
|||
*/ |
|||
export type JSONSchema6Definition = JSONSchema6 | boolean; |
|||
export interface JSONSchema6 { |
|||
$id?: string | undefined; |
|||
$ref?: string | undefined; |
|||
$schema?: JSONSchema6Version | undefined; |
|||
|
|||
/** |
|||
* Must be strictly greater than 0. |
|||
* A numeric instance is valid only if division by this keyword's value results in an integer. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.1
|
|||
*/ |
|||
multipleOf?: number | undefined; |
|||
|
|||
/** |
|||
* Representing an inclusive upper limit for a numeric instance. |
|||
* This keyword validates only if the instance is less than or exactly equal to "maximum". |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.2
|
|||
*/ |
|||
maximum?: number | undefined; |
|||
|
|||
/** |
|||
* Representing an exclusive upper limit for a numeric instance. |
|||
* This keyword validates only if the instance is strictly less than (not equal to) to "exclusiveMaximum". |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.3
|
|||
*/ |
|||
exclusiveMaximum?: number | undefined; |
|||
|
|||
/** |
|||
* Representing an inclusive lower limit for a numeric instance. |
|||
* This keyword validates only if the instance is greater than or exactly equal to "minimum". |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.4
|
|||
*/ |
|||
minimum?: number | undefined; |
|||
|
|||
/** |
|||
* Representing an exclusive lower limit for a numeric instance. |
|||
* This keyword validates only if the instance is strictly greater than (not equal to) to "exclusiveMinimum". |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.5
|
|||
*/ |
|||
exclusiveMinimum?: number | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* A string instance is valid against this keyword if its length is less than, or equal to, the value of this keyword. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.6
|
|||
*/ |
|||
maxLength?: number | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* A string instance is valid against this keyword if its length is greater than, or equal to, the value of this keyword. |
|||
* Omitting this keyword has the same behavior as a value of 0. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.7
|
|||
*/ |
|||
minLength?: number | undefined; |
|||
|
|||
/** |
|||
* Should be a valid regular expression, according to the ECMA 262 regular expression dialect. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.8
|
|||
*/ |
|||
pattern?: string | undefined; |
|||
|
|||
/** |
|||
* This keyword determines how child instances validate for arrays, and does not directly validate the immediate instance itself. |
|||
* Omitting this keyword has the same behavior as an empty schema. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.9
|
|||
*/ |
|||
items?: JSONSchema6Definition | JSONSchema6Definition[] | undefined; |
|||
|
|||
/** |
|||
* This keyword determines how child instances validate for arrays, and does not directly validate the immediate instance itself. |
|||
* If "items" is an array of schemas, validation succeeds if every instance element |
|||
* at a position greater than the size of "items" validates against "additionalItems". |
|||
* Otherwise, "additionalItems" MUST be ignored, as the "items" schema |
|||
* (possibly the default value of an empty schema) is applied to all elements. |
|||
* Omitting this keyword has the same behavior as an empty schema. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.10
|
|||
*/ |
|||
additionalItems?: JSONSchema6Definition | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* An array instance is valid against "maxItems" if its size is less than, or equal to, the value of this keyword. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.11
|
|||
*/ |
|||
maxItems?: number | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* An array instance is valid against "maxItems" if its size is greater than, or equal to, the value of this keyword. |
|||
* Omitting this keyword has the same behavior as a value of 0. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.12
|
|||
*/ |
|||
minItems?: number | undefined; |
|||
|
|||
/** |
|||
* If this keyword has boolean value false, the instance validates successfully. |
|||
* If it has boolean value true, the instance validates successfully if all of its elements are unique. |
|||
* Omitting this keyword has the same behavior as a value of false. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.13
|
|||
*/ |
|||
uniqueItems?: boolean | undefined; |
|||
|
|||
/** |
|||
* An array instance is valid against "contains" if at least one of its elements is valid against the given schema. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.14
|
|||
*/ |
|||
contains?: JSONSchema6Definition | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* An object instance is valid against "maxProperties" if its number of properties is less than, or equal to, the value of this keyword. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.15
|
|||
*/ |
|||
maxProperties?: number | undefined; |
|||
|
|||
/** |
|||
* Must be a non-negative integer. |
|||
* An object instance is valid against "maxProperties" if its number of properties is greater than, |
|||
* or equal to, the value of this keyword. |
|||
* Omitting this keyword has the same behavior as a value of 0. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.16
|
|||
*/ |
|||
minProperties?: number | undefined; |
|||
|
|||
/** |
|||
* Elements of this array must be unique. |
|||
* An object instance is valid against this keyword if every item in the array is the name of a property in the instance. |
|||
* Omitting this keyword has the same behavior as an empty array. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.17
|
|||
*/ |
|||
required?: string[] | undefined; |
|||
|
|||
/** |
|||
* This keyword determines how child instances validate for objects, and does not directly validate the immediate instance itself. |
|||
* Validation succeeds if, for each name that appears in both the instance and as a name within this keyword's value, |
|||
* the child instance for that name successfully validates against the corresponding schema. |
|||
* Omitting this keyword has the same behavior as an empty object. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.18
|
|||
*/ |
|||
properties?: { |
|||
[k: string]: JSONSchema6Definition; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This attribute is an object that defines the schema for a set of property names of an object instance. |
|||
* The name of each property of this attribute's object is a regular expression pattern in the ECMA 262, while the value is a schema. |
|||
* If the pattern matches the name of a property on the instance object, the value of the instance's property |
|||
* MUST be valid against the pattern name's schema value. |
|||
* Omitting this keyword has the same behavior as an empty object. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.19
|
|||
*/ |
|||
patternProperties?: { |
|||
[k: string]: JSONSchema6Definition; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This attribute defines a schema for all properties that are not explicitly defined in an object type definition. |
|||
* If specified, the value MUST be a schema or a boolean. |
|||
* If false is provided, no additional properties are allowed beyond the properties defined in the schema. |
|||
* The default value is an empty schema which allows any value for additional properties. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.20
|
|||
*/ |
|||
additionalProperties?: JSONSchema6Definition | undefined; |
|||
|
|||
/** |
|||
* This keyword specifies rules that are evaluated if the instance is an object and contains a certain property. |
|||
* Each property specifies a dependency. |
|||
* If the dependency value is an array, each element in the array must be unique. |
|||
* Omitting this keyword has the same behavior as an empty object. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.21
|
|||
*/ |
|||
dependencies?: { |
|||
[k: string]: JSONSchema6Definition | string[]; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* Takes a schema which validates the names of all properties rather than their values. |
|||
* Note the property name that the schema is testing will always be a string. |
|||
* Omitting this keyword has the same behavior as an empty schema. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.22
|
|||
*/ |
|||
propertyNames?: JSONSchema6Definition | undefined; |
|||
|
|||
/** |
|||
* This provides an enumeration of all possible values that are valid |
|||
* for the instance property. This MUST be an array, and each item in |
|||
* the array represents a possible value for the instance value. If |
|||
* this attribute is defined, the instance value MUST be one of the |
|||
* values in the array in order for the schema to be valid. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.23
|
|||
*/ |
|||
enum?: JSONSchema6Type[] | undefined; |
|||
|
|||
/** |
|||
* More readable form of a one-element "enum" |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.24
|
|||
*/ |
|||
const?: JSONSchema6Type | undefined; |
|||
|
|||
/** |
|||
* A single type, or a union of simple types |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.25
|
|||
*/ |
|||
type?: JSONSchema6TypeName | JSONSchema6TypeName[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.26
|
|||
*/ |
|||
allOf?: JSONSchema6Definition[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.27
|
|||
*/ |
|||
anyOf?: JSONSchema6Definition[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.28
|
|||
*/ |
|||
oneOf?: JSONSchema6Definition[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.29
|
|||
*/ |
|||
not?: JSONSchema6Definition | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-7.1
|
|||
*/ |
|||
definitions?: { |
|||
[k: string]: JSONSchema6Definition; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* This attribute is a string that provides a short description of the instance property. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-7.2
|
|||
*/ |
|||
title?: string | undefined; |
|||
|
|||
/** |
|||
* This attribute is a string that provides a full description of the of purpose the instance property. |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-7.2
|
|||
*/ |
|||
description?: string | undefined; |
|||
|
|||
/** |
|||
* This keyword can be used to supply a default JSON value associated with a particular schema. |
|||
* It is RECOMMENDED that a default value be valid against the associated schema. |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-7.3
|
|||
*/ |
|||
default?: JSONSchema6Type | undefined; |
|||
|
|||
/** |
|||
* Array of examples with no validation effect the value of "default" is usable as an example without repeating it under this keyword |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-7.4
|
|||
*/ |
|||
examples?: JSONSchema6Type[] | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-8
|
|||
*/ |
|||
format?: string | undefined; |
|||
} |
|||
|
|||
// ==================================================================================================
|
|||
// JSON Schema Draft 07
|
|||
// ==================================================================================================
|
|||
// https://tools.ietf.org/html/draft-handrews-json-schema-validation-01
|
|||
// --------------------------------------------------------------------------------------------------
|
|||
|
|||
/** |
|||
* Primitive type |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
|
|||
*/ |
|||
export type JSONSchema7TypeName = |
|||
| "string" //
|
|||
| "number" |
|||
| "integer" |
|||
| "boolean" |
|||
| "object" |
|||
| "array" |
|||
| "null"; |
|||
|
|||
/** |
|||
* Primitive type |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1.1
|
|||
*/ |
|||
export type JSONSchema7Type = |
|||
| string //
|
|||
| number |
|||
| boolean |
|||
| JSONSchema7Object |
|||
| JSONSchema7Array |
|||
| null; |
|||
|
|||
// Workaround for infinite type recursion
|
|||
export interface JSONSchema7Object { |
|||
[key: string]: JSONSchema7Type; |
|||
} |
|||
|
|||
// Workaround for infinite type recursion
|
|||
// https://github.com/Microsoft/TypeScript/issues/3496#issuecomment-128553540
|
|||
export interface JSONSchema7Array extends Array<JSONSchema7Type> {} |
|||
|
|||
/** |
|||
* Meta schema |
|||
* |
|||
* Recommended values: |
|||
* - 'http://json-schema.org/schema#' |
|||
* - 'http://json-schema.org/hyper-schema#' |
|||
* - 'http://json-schema.org/draft-07/schema#' |
|||
* - 'http://json-schema.org/draft-07/hyper-schema#' |
|||
* |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-5
|
|||
*/ |
|||
export type JSONSchema7Version = string; |
|||
|
|||
/** |
|||
* JSON Schema v7 |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01
|
|||
*/ |
|||
export type JSONSchema7Definition = JSONSchema7 | boolean; |
|||
export interface JSONSchema7 { |
|||
$id?: string | undefined; |
|||
$ref?: string | undefined; |
|||
$schema?: JSONSchema7Version | undefined; |
|||
$comment?: string | undefined; |
|||
|
|||
/** |
|||
* @see https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-00#section-8.2.4
|
|||
* @see https://datatracker.ietf.org/doc/html/draft-bhutton-json-schema-validation-00#appendix-A
|
|||
*/ |
|||
$defs?: { |
|||
[key: string]: JSONSchema7Definition; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.1
|
|||
*/ |
|||
type?: JSONSchema7TypeName | JSONSchema7TypeName[] | undefined; |
|||
enum?: JSONSchema7Type[] | undefined; |
|||
const?: JSONSchema7Type | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.2
|
|||
*/ |
|||
multipleOf?: number | undefined; |
|||
maximum?: number | undefined; |
|||
exclusiveMaximum?: number | undefined; |
|||
minimum?: number | undefined; |
|||
exclusiveMinimum?: number | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.3
|
|||
*/ |
|||
maxLength?: number | undefined; |
|||
minLength?: number | undefined; |
|||
pattern?: string | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.4
|
|||
*/ |
|||
items?: JSONSchema7Definition | JSONSchema7Definition[] | undefined; |
|||
additionalItems?: JSONSchema7Definition | undefined; |
|||
maxItems?: number | undefined; |
|||
minItems?: number | undefined; |
|||
uniqueItems?: boolean | undefined; |
|||
contains?: JSONSchema7Definition | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5
|
|||
*/ |
|||
maxProperties?: number | undefined; |
|||
minProperties?: number | undefined; |
|||
required?: string[] | undefined; |
|||
properties?: { |
|||
[key: string]: JSONSchema7Definition; |
|||
} | undefined; |
|||
patternProperties?: { |
|||
[key: string]: JSONSchema7Definition; |
|||
} | undefined; |
|||
additionalProperties?: JSONSchema7Definition | undefined; |
|||
dependencies?: { |
|||
[key: string]: JSONSchema7Definition | string[]; |
|||
} | undefined; |
|||
propertyNames?: JSONSchema7Definition | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.6
|
|||
*/ |
|||
if?: JSONSchema7Definition | undefined; |
|||
then?: JSONSchema7Definition | undefined; |
|||
else?: JSONSchema7Definition | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.7
|
|||
*/ |
|||
allOf?: JSONSchema7Definition[] | undefined; |
|||
anyOf?: JSONSchema7Definition[] | undefined; |
|||
oneOf?: JSONSchema7Definition[] | undefined; |
|||
not?: JSONSchema7Definition | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-7
|
|||
*/ |
|||
format?: string | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-8
|
|||
*/ |
|||
contentMediaType?: string | undefined; |
|||
contentEncoding?: string | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9
|
|||
*/ |
|||
definitions?: { |
|||
[key: string]: JSONSchema7Definition; |
|||
} | undefined; |
|||
|
|||
/** |
|||
* @see https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-10
|
|||
*/ |
|||
title?: string | undefined; |
|||
description?: string | undefined; |
|||
default?: JSONSchema7Type | undefined; |
|||
readOnly?: boolean | undefined; |
|||
writeOnly?: boolean | undefined; |
|||
examples?: JSONSchema7Type | undefined; |
|||
} |
|||
|
|||
export interface ValidationResult { |
|||
valid: boolean; |
|||
errors: ValidationError[]; |
|||
} |
|||
|
|||
export interface ValidationError { |
|||
property: string; |
|||
message: string; |
|||
} |
|||
|
|||
/** |
|||
* To use the validator call JSONSchema.validate with an instance object and an optional schema object. |
|||
* If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating), |
|||
* that schema will be used to validate and the schema parameter is not necessary (if both exist, |
|||
* both validations will occur). |
|||
*/ |
|||
export function validate(instance: {}, schema: JSONSchema4 | JSONSchema6 | JSONSchema7): ValidationResult; |
|||
|
|||
/** |
|||
* The checkPropertyChange method will check to see if an value can legally be in property with the given schema |
|||
* This is slightly different than the validate method in that it will fail if the schema is readonly and it will |
|||
* not check for self-validation, it is assumed that the passed in value is already internally valid. |
|||
*/ |
|||
export function checkPropertyChange( |
|||
value: any, |
|||
schema: JSONSchema4 | JSONSchema6 | JSONSchema7, |
|||
property: string, |
|||
): ValidationResult; |
|||
|
|||
/** |
|||
* This checks to ensure that the result is valid and will throw an appropriate error message if it is not. |
|||
*/ |
|||
export function mustBeValid(result: ValidationResult): void; |
@ -0,0 +1,40 @@ |
|||
{ |
|||
"name": "@types/json-schema", |
|||
"version": "7.0.15", |
|||
"description": "TypeScript definitions for json-schema", |
|||
"homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/json-schema", |
|||
"license": "MIT", |
|||
"contributors": [ |
|||
{ |
|||
"name": "Boris Cherny", |
|||
"githubUsername": "bcherny", |
|||
"url": "https://github.com/bcherny" |
|||
}, |
|||
{ |
|||
"name": "Lucian Buzzo", |
|||
"githubUsername": "lucianbuzzo", |
|||
"url": "https://github.com/lucianbuzzo" |
|||
}, |
|||
{ |
|||
"name": "Roland Groza", |
|||
"githubUsername": "rolandjitsu", |
|||
"url": "https://github.com/rolandjitsu" |
|||
}, |
|||
{ |
|||
"name": "Jason Kwok", |
|||
"githubUsername": "JasonHK", |
|||
"url": "https://github.com/JasonHK" |
|||
} |
|||
], |
|||
"main": "", |
|||
"types": "index.d.ts", |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", |
|||
"directory": "types/json-schema" |
|||
}, |
|||
"scripts": {}, |
|||
"dependencies": {}, |
|||
"typesPublisherContentHash": "79984fd70cd25c3f7d72b84368778c763c89728ea0073832d745d4691b705257", |
|||
"typeScriptVersion": "4.5" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,167 @@ |
|||
# @webassemblyjs/ast |
|||
|
|||
> AST utils for webassemblyjs |
|||
|
|||
## Installation |
|||
|
|||
```sh |
|||
yarn add @webassemblyjs/ast |
|||
``` |
|||
|
|||
## Usage |
|||
|
|||
### Traverse |
|||
|
|||
```js |
|||
import { traverse } from "@webassemblyjs/ast"; |
|||
|
|||
traverse(ast, { |
|||
Module(path) { |
|||
console.log(path.node); |
|||
} |
|||
}); |
|||
``` |
|||
|
|||
### Instruction signatures |
|||
|
|||
```js |
|||
import { signatures } from "@webassemblyjs/ast"; |
|||
|
|||
console.log(signatures); |
|||
``` |
|||
|
|||
### Path methods |
|||
|
|||
- `findParent: NodeLocator` |
|||
- `replaceWith: Node => void` |
|||
- `remove: () => void` |
|||
- `insertBefore: Node => void` |
|||
- `insertAfter: Node => void` |
|||
- `stop: () => void` |
|||
|
|||
### AST utils |
|||
|
|||
- function `module(id, fields, metadata)` |
|||
- function `moduleMetadata(sections, functionNames, localNames)` |
|||
- function `moduleNameMetadata(value)` |
|||
- function `functionNameMetadata(value, index)` |
|||
- function `localNameMetadata(value, localIndex, functionIndex)` |
|||
- function `binaryModule(id, blob)` |
|||
- function `quoteModule(id, string)` |
|||
- function `sectionMetadata(section, startOffset, size, vectorOfSize)` |
|||
- function `loopInstruction(label, resulttype, instr)` |
|||
- function `instruction(id, args, namedArgs)` |
|||
- function `objectInstruction(id, object, args, namedArgs)` |
|||
- function `ifInstruction(testLabel, test, result, consequent, alternate)` |
|||
- function `stringLiteral(value)` |
|||
- function `numberLiteralFromRaw(value, raw)` |
|||
- function `longNumberLiteral(value, raw)` |
|||
- function `floatLiteral(value, nan, inf, raw)` |
|||
- function `elem(table, offset, funcs)` |
|||
- function `indexInFuncSection(index)` |
|||
- function `valtypeLiteral(name)` |
|||
- function `typeInstruction(id, functype)` |
|||
- function `start(index)` |
|||
- function `globalType(valtype, mutability)` |
|||
- function `leadingComment(value)` |
|||
- function `blockComment(value)` |
|||
- function `data(memoryIndex, offset, init)` |
|||
- function `global(globalType, init, name)` |
|||
- function `table(elementType, limits, name, elements)` |
|||
- function `memory(limits, id)` |
|||
- function `funcImportDescr(id, signature)` |
|||
- function `moduleImport(module, name, descr)` |
|||
- function `moduleExportDescr(exportType, id)` |
|||
- function `moduleExport(name, descr)` |
|||
- function `limit(min, max)` |
|||
- function `signature(params, results)` |
|||
- function `program(body)` |
|||
- function `identifier(value, raw)` |
|||
- function `blockInstruction(label, instr, result)` |
|||
- function `callInstruction(index, instrArgs)` |
|||
- function `callIndirectInstruction(signature, intrs)` |
|||
- function `byteArray(values)` |
|||
- function `func(name, signature, body, isExternal, metadata)` |
|||
- Constant`isModule` |
|||
- Constant`isModuleMetadata` |
|||
- Constant`isModuleNameMetadata` |
|||
- Constant`isFunctionNameMetadata` |
|||
- Constant`isLocalNameMetadata` |
|||
- Constant`isBinaryModule` |
|||
- Constant`isQuoteModule` |
|||
- Constant`isSectionMetadata` |
|||
- Constant`isLoopInstruction` |
|||
- Constant`isInstruction` |
|||
- Constant`isObjectInstruction` |
|||
- Constant`isIfInstruction` |
|||
- Constant`isStringLiteral` |
|||
- Constant`isNumberLiteral` |
|||
- Constant`isLongNumberLiteral` |
|||
- Constant`isFloatLiteral` |
|||
- Constant`isElem` |
|||
- Constant`isIndexInFuncSection` |
|||
- Constant`isValtypeLiteral` |
|||
- Constant`isTypeInstruction` |
|||
- Constant`isStart` |
|||
- Constant`isGlobalType` |
|||
- Constant`isLeadingComment` |
|||
- Constant`isBlockComment` |
|||
- Constant`isData` |
|||
- Constant`isGlobal` |
|||
- Constant`isTable` |
|||
- Constant`isMemory` |
|||
- Constant`isFuncImportDescr` |
|||
- Constant`isModuleImport` |
|||
- Constant`isModuleExportDescr` |
|||
- Constant`isModuleExport` |
|||
- Constant`isLimit` |
|||
- Constant`isSignature` |
|||
- Constant`isProgram` |
|||
- Constant`isIdentifier` |
|||
- Constant`isBlockInstruction` |
|||
- Constant`isCallInstruction` |
|||
- Constant`isCallIndirectInstruction` |
|||
- Constant`isByteArray` |
|||
- Constant`isFunc` |
|||
- Constant`assertModule` |
|||
- Constant`assertModuleMetadata` |
|||
- Constant`assertModuleNameMetadata` |
|||
- Constant`assertFunctionNameMetadata` |
|||
- Constant`assertLocalNameMetadata` |
|||
- Constant`assertBinaryModule` |
|||
- Constant`assertQuoteModule` |
|||
- Constant`assertSectionMetadata` |
|||
- Constant`assertLoopInstruction` |
|||
- Constant`assertInstruction` |
|||
- Constant`assertObjectInstruction` |
|||
- Constant`assertIfInstruction` |
|||
- Constant`assertStringLiteral` |
|||
- Constant`assertNumberLiteral` |
|||
- Constant`assertLongNumberLiteral` |
|||
- Constant`assertFloatLiteral` |
|||
- Constant`assertElem` |
|||
- Constant`assertIndexInFuncSection` |
|||
- Constant`assertValtypeLiteral` |
|||
- Constant`assertTypeInstruction` |
|||
- Constant`assertStart` |
|||
- Constant`assertGlobalType` |
|||
- Constant`assertLeadingComment` |
|||
- Constant`assertBlockComment` |
|||
- Constant`assertData` |
|||
- Constant`assertGlobal` |
|||
- Constant`assertTable` |
|||
- Constant`assertMemory` |
|||
- Constant`assertFuncImportDescr` |
|||
- Constant`assertModuleImport` |
|||
- Constant`assertModuleExportDescr` |
|||
- Constant`assertModuleExport` |
|||
- Constant`assertLimit` |
|||
- Constant`assertSignature` |
|||
- Constant`assertProgram` |
|||
- Constant`assertIdentifier` |
|||
- Constant`assertBlockInstruction` |
|||
- Constant`assertCallInstruction` |
|||
- Constant`assertCallIndirectInstruction` |
|||
- Constant`assertByteArray` |
|||
- Constant`assertFunc` |
|||
|
@ -0,0 +1,10 @@ |
|||
export function cloneNode(n) { |
|||
// $FlowIgnore
|
|||
var newObj = {}; |
|||
|
|||
for (var k in n) { |
|||
newObj[k] = n[k]; |
|||
} |
|||
|
|||
return newObj; |
|||
} |
@ -0,0 +1,663 @@ |
|||
var definitions = {}; |
|||
|
|||
function defineType(typeName, metadata) { |
|||
definitions[typeName] = metadata; |
|||
} |
|||
|
|||
defineType("Module", { |
|||
spec: { |
|||
wasm: "https://webassembly.github.io/spec/core/binary/modules.html#binary-module", |
|||
wat: "https://webassembly.github.io/spec/core/text/modules.html#text-module" |
|||
}, |
|||
doc: "A module consists of a sequence of sections (termed fields in the text format).", |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
fields: { |
|||
array: true, |
|||
type: "Node" |
|||
}, |
|||
metadata: { |
|||
optional: true, |
|||
type: "ModuleMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
sections: { |
|||
array: true, |
|||
type: "SectionMetadata" |
|||
}, |
|||
functionNames: { |
|||
optional: true, |
|||
array: true, |
|||
type: "FunctionNameMetadata" |
|||
}, |
|||
localNames: { |
|||
optional: true, |
|||
array: true, |
|||
type: "ModuleMetadata" |
|||
}, |
|||
producers: { |
|||
optional: true, |
|||
array: true, |
|||
type: "ProducersSectionMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FunctionNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
index: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LocalNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
localIndex: { |
|||
type: "number" |
|||
}, |
|||
functionIndex: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BinaryModule", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
blob: { |
|||
array: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("QuoteModule", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
string: { |
|||
array: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("SectionMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
section: { |
|||
type: "SectionName" |
|||
}, |
|||
startOffset: { |
|||
type: "number" |
|||
}, |
|||
size: { |
|||
type: "NumberLiteral" |
|||
}, |
|||
vectorOfSize: { |
|||
comment: "Size of the vector in the section (if any)", |
|||
type: "NumberLiteral" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducersSectionMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
producers: { |
|||
array: true, |
|||
type: "ProducerMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducerMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
language: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
}, |
|||
processedBy: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
}, |
|||
sdk: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducerMetadataVersionedName", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
version: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
/* |
|||
Instructions |
|||
*/ |
|||
|
|||
defineType("LoopInstruction", { |
|||
unionType: ["Node", "Block", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "loop" |
|||
}, |
|||
label: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
resulttype: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
}, |
|||
instr: { |
|||
array: true, |
|||
type: "Instruction" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Instr", { |
|||
unionType: ["Node", "Expression", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
type: "string" |
|||
}, |
|||
object: { |
|||
optional: true, |
|||
type: "Valtype" |
|||
}, |
|||
args: { |
|||
array: true, |
|||
type: "Expression" |
|||
}, |
|||
namedArgs: { |
|||
optional: true, |
|||
type: "Object" |
|||
} |
|||
} |
|||
}); |
|||
defineType("IfInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "if" |
|||
}, |
|||
testLabel: { |
|||
comment: "only for WAST", |
|||
type: "Identifier" |
|||
}, |
|||
test: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
result: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
}, |
|||
consequent: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
alternate: { |
|||
array: true, |
|||
type: "Instruction" |
|||
} |
|||
} |
|||
}); |
|||
/* |
|||
Concrete value types |
|||
*/ |
|||
|
|||
defineType("StringLiteral", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("NumberLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "number" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LongNumberLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "LongNumber" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FloatLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "number" |
|||
}, |
|||
nan: { |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
inf: { |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Elem", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
table: { |
|||
type: "Index" |
|||
}, |
|||
offset: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
funcs: { |
|||
array: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("IndexInFuncSection", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
index: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ValtypeLiteral", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
name: { |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("TypeInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "Index" |
|||
}, |
|||
functype: { |
|||
type: "Signature" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Start", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
index: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("GlobalType", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
valtype: { |
|||
type: "Valtype" |
|||
}, |
|||
mutability: { |
|||
type: "Mutability" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LeadingComment", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BlockComment", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Data", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
memoryIndex: { |
|||
type: "Memidx" |
|||
}, |
|||
offset: { |
|||
type: "Instruction" |
|||
}, |
|||
init: { |
|||
type: "ByteArray" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Global", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
globalType: { |
|||
type: "GlobalType" |
|||
}, |
|||
init: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
name: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Table", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
elementType: { |
|||
type: "TableElementType" |
|||
}, |
|||
limits: { |
|||
assertNodeType: true, |
|||
type: "Limit" |
|||
}, |
|||
name: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
elements: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Memory", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
limits: { |
|||
type: "Limit" |
|||
}, |
|||
id: { |
|||
maybe: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FuncImportDescr", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
id: { |
|||
type: "Identifier" |
|||
}, |
|||
signature: { |
|||
type: "Signature" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleImport", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
module: { |
|||
type: "string" |
|||
}, |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
descr: { |
|||
type: "ImportDescr" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleExportDescr", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
exportType: { |
|||
type: "ExportDescrType" |
|||
}, |
|||
id: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleExport", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
descr: { |
|||
type: "ModuleExportDescr" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Limit", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
min: { |
|||
type: "number" |
|||
}, |
|||
max: { |
|||
optional: true, |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Signature", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
params: { |
|||
array: true, |
|||
type: "FuncParam" |
|||
}, |
|||
results: { |
|||
array: true, |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Program", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
body: { |
|||
array: true, |
|||
type: "Node" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Identifier", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
raw: { |
|||
optional: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BlockInstruction", { |
|||
unionType: ["Node", "Block", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "block" |
|||
}, |
|||
label: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
instr: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
result: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("CallInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "call" |
|||
}, |
|||
index: { |
|||
type: "Index" |
|||
}, |
|||
instrArgs: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Expression" |
|||
}, |
|||
numeric: { |
|||
type: "Index", |
|||
optional: true |
|||
} |
|||
} |
|||
}); |
|||
defineType("CallIndirectInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "call_indirect" |
|||
}, |
|||
signature: { |
|||
type: "SignatureOrTypeRef" |
|||
}, |
|||
intrs: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Expression" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ByteArray", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
values: { |
|||
array: true, |
|||
type: "Byte" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Func", { |
|||
unionType: ["Node", "Block"], |
|||
fields: { |
|||
name: { |
|||
maybe: true, |
|||
type: "Index" |
|||
}, |
|||
signature: { |
|||
type: "SignatureOrTypeRef" |
|||
}, |
|||
body: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
isExternal: { |
|||
comment: "means that it has been imported from the outside js", |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
metadata: { |
|||
optional: true, |
|||
type: "FuncMetadata" |
|||
} |
|||
} |
|||
}); |
|||
/** |
|||
* Intrinsics |
|||
*/ |
|||
|
|||
defineType("InternalBrUnless", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("InternalGoto", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("InternalCallExtern", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); // function bodies are terminated by an `end` instruction but are missing a
|
|||
// return instruction
|
|||
//
|
|||
// Since we can't inject a new instruction we are injecting a new instruction.
|
|||
|
|||
defineType("InternalEndAndReturn", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: {} |
|||
}); |
|||
module.exports = definitions; |
@ -0,0 +1,6 @@ |
|||
export * from "./nodes"; |
|||
export { numberLiteralFromRaw, withLoc, withRaw, funcParam, indexLiteral, memIndexLiteral, instruction, objectInstruction } from "./node-helpers.js"; |
|||
export { traverse } from "./traverse"; |
|||
export { signatures } from "./signatures"; |
|||
export * from "./utils"; |
|||
export { cloneNode } from "./clone"; |
@ -0,0 +1,84 @@ |
|||
import { parse32F, parse64F, parse32I, parse64I, parseU32, isNanLiteral, isInfLiteral } from "@webassemblyjs/wast-parser"; |
|||
import { longNumberLiteral, floatLiteral, numberLiteral, instr } from "./nodes"; |
|||
export function numberLiteralFromRaw(rawValue) { |
|||
var instructionType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "i32"; |
|||
var original = rawValue; // Remove numeric separators _
|
|||
|
|||
if (typeof rawValue === "string") { |
|||
rawValue = rawValue.replace(/_/g, ""); |
|||
} |
|||
|
|||
if (typeof rawValue === "number") { |
|||
return numberLiteral(rawValue, String(original)); |
|||
} else { |
|||
switch (instructionType) { |
|||
case "i32": |
|||
{ |
|||
return numberLiteral(parse32I(rawValue), String(original)); |
|||
} |
|||
|
|||
case "u32": |
|||
{ |
|||
return numberLiteral(parseU32(rawValue), String(original)); |
|||
} |
|||
|
|||
case "i64": |
|||
{ |
|||
return longNumberLiteral(parse64I(rawValue), String(original)); |
|||
} |
|||
|
|||
case "f32": |
|||
{ |
|||
return floatLiteral(parse32F(rawValue), isNanLiteral(rawValue), isInfLiteral(rawValue), String(original)); |
|||
} |
|||
// f64
|
|||
|
|||
default: |
|||
{ |
|||
return floatLiteral(parse64F(rawValue), isNanLiteral(rawValue), isInfLiteral(rawValue), String(original)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
export function instruction(id) { |
|||
var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; |
|||
var namedArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
|||
return instr(id, undefined, args, namedArgs); |
|||
} |
|||
export function objectInstruction(id, object) { |
|||
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; |
|||
var namedArgs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; |
|||
return instr(id, object, args, namedArgs); |
|||
} |
|||
/** |
|||
* Decorators |
|||
*/ |
|||
|
|||
export function withLoc(n, end, start) { |
|||
var loc = { |
|||
start: start, |
|||
end: end |
|||
}; |
|||
n.loc = loc; |
|||
return n; |
|||
} |
|||
export function withRaw(n, raw) { |
|||
n.raw = raw; |
|||
return n; |
|||
} |
|||
export function funcParam(valtype, id) { |
|||
return { |
|||
id: id, |
|||
valtype: valtype |
|||
}; |
|||
} |
|||
export function indexLiteral(value) { |
|||
// $FlowIgnore
|
|||
var x = numberLiteralFromRaw(value, "u32"); |
|||
return x; |
|||
} |
|||
export function memIndexLiteral(value) { |
|||
// $FlowIgnore
|
|||
var x = numberLiteralFromRaw(value, "u32"); |
|||
return x; |
|||
} |
@ -0,0 +1,137 @@ |
|||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } |
|||
|
|||
function findParent(_ref, cb) { |
|||
var parentPath = _ref.parentPath; |
|||
|
|||
if (parentPath == null) { |
|||
throw new Error("node is root"); |
|||
} |
|||
|
|||
var currentPath = parentPath; |
|||
|
|||
while (cb(currentPath) !== false) { |
|||
// Hit the root node, stop
|
|||
// $FlowIgnore
|
|||
if (currentPath.parentPath == null) { |
|||
return null; |
|||
} // $FlowIgnore
|
|||
|
|||
|
|||
currentPath = currentPath.parentPath; |
|||
} |
|||
|
|||
return currentPath.node; |
|||
} |
|||
|
|||
function insertBefore(context, newNode) { |
|||
return insert(context, newNode); |
|||
} |
|||
|
|||
function insertAfter(context, newNode) { |
|||
return insert(context, newNode, 1); |
|||
} |
|||
|
|||
function insert(_ref2, newNode) { |
|||
var node = _ref2.node, |
|||
inList = _ref2.inList, |
|||
parentPath = _ref2.parentPath, |
|||
parentKey = _ref2.parentKey; |
|||
var indexOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; |
|||
|
|||
if (!inList) { |
|||
throw new Error('inList' + " error: " + ("insert can only be used for nodes that are within lists" || "unknown")); |
|||
} |
|||
|
|||
if (!(parentPath != null)) { |
|||
throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
var parentList = parentPath.node[parentKey]; |
|||
var indexInList = parentList.findIndex(function (n) { |
|||
return n === node; |
|||
}); |
|||
parentList.splice(indexInList + indexOffset, 0, newNode); |
|||
} |
|||
|
|||
function remove(_ref3) { |
|||
var node = _ref3.node, |
|||
parentKey = _ref3.parentKey, |
|||
parentPath = _ref3.parentPath; |
|||
|
|||
if (!(parentPath != null)) { |
|||
throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
var parentNode = parentPath.node; // $FlowIgnore
|
|||
|
|||
var parentProperty = parentNode[parentKey]; |
|||
|
|||
if (Array.isArray(parentProperty)) { |
|||
// $FlowIgnore
|
|||
parentNode[parentKey] = parentProperty.filter(function (n) { |
|||
return n !== node; |
|||
}); |
|||
} else { |
|||
// $FlowIgnore
|
|||
delete parentNode[parentKey]; |
|||
} |
|||
|
|||
node._deleted = true; |
|||
} |
|||
|
|||
function stop(context) { |
|||
context.shouldStop = true; |
|||
} |
|||
|
|||
function replaceWith(context, newNode) { |
|||
// $FlowIgnore
|
|||
var parentNode = context.parentPath.node; // $FlowIgnore
|
|||
|
|||
var parentProperty = parentNode[context.parentKey]; |
|||
|
|||
if (Array.isArray(parentProperty)) { |
|||
var indexInList = parentProperty.findIndex(function (n) { |
|||
return n === context.node; |
|||
}); |
|||
parentProperty.splice(indexInList, 1, newNode); |
|||
} else { |
|||
// $FlowIgnore
|
|||
parentNode[context.parentKey] = newNode; |
|||
} |
|||
|
|||
context.node._deleted = true; |
|||
context.node = newNode; |
|||
} // bind the context to the first argument of node operations
|
|||
|
|||
|
|||
function bindNodeOperations(operations, context) { |
|||
var keys = Object.keys(operations); |
|||
var boundOperations = {}; |
|||
keys.forEach(function (key) { |
|||
boundOperations[key] = operations[key].bind(null, context); |
|||
}); |
|||
return boundOperations; |
|||
} |
|||
|
|||
function createPathOperations(context) { |
|||
// $FlowIgnore
|
|||
return bindNodeOperations({ |
|||
findParent: findParent, |
|||
replaceWith: replaceWith, |
|||
remove: remove, |
|||
insertBefore: insertBefore, |
|||
insertAfter: insertAfter, |
|||
stop: stop |
|||
}, context); |
|||
} |
|||
|
|||
export function createPath(context) { |
|||
var path = _extends({}, context); // $FlowIgnore
|
|||
|
|||
|
|||
Object.assign(path, createPathOperations(path)); // $FlowIgnore
|
|||
|
|||
return path; |
|||
} |
@ -0,0 +1,915 @@ |
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
// THIS FILE IS AUTOGENERATED
|
|||
// see scripts/generateNodeUtils.js
|
|||
function isTypeOf(t) { |
|||
return function (n) { |
|||
return n.type === t; |
|||
}; |
|||
} |
|||
|
|||
function assertTypeOf(t) { |
|||
return function (n) { |
|||
return function () { |
|||
if (!(n.type === t)) { |
|||
throw new Error('n.type === t' + " error: " + (undefined || "unknown")); |
|||
} |
|||
}(); |
|||
}; |
|||
} |
|||
|
|||
export function module(id, fields, metadata) { |
|||
if (id !== null && id !== undefined) { |
|||
if (!(typeof id === "string")) { |
|||
throw new Error('typeof id === "string"' + " error: " + ("Argument id must be of type string, given: " + _typeof(id) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (!(_typeof(fields) === "object" && typeof fields.length !== "undefined")) { |
|||
throw new Error('typeof fields === "object" && typeof fields.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Module", |
|||
id: id, |
|||
fields: fields |
|||
}; |
|||
|
|||
if (typeof metadata !== "undefined") { |
|||
node.metadata = metadata; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function moduleMetadata(sections, functionNames, localNames, producers) { |
|||
if (!(_typeof(sections) === "object" && typeof sections.length !== "undefined")) { |
|||
throw new Error('typeof sections === "object" && typeof sections.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (functionNames !== null && functionNames !== undefined) { |
|||
if (!(_typeof(functionNames) === "object" && typeof functionNames.length !== "undefined")) { |
|||
throw new Error('typeof functionNames === "object" && typeof functionNames.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (localNames !== null && localNames !== undefined) { |
|||
if (!(_typeof(localNames) === "object" && typeof localNames.length !== "undefined")) { |
|||
throw new Error('typeof localNames === "object" && typeof localNames.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (producers !== null && producers !== undefined) { |
|||
if (!(_typeof(producers) === "object" && typeof producers.length !== "undefined")) { |
|||
throw new Error('typeof producers === "object" && typeof producers.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "ModuleMetadata", |
|||
sections: sections |
|||
}; |
|||
|
|||
if (typeof functionNames !== "undefined" && functionNames.length > 0) { |
|||
node.functionNames = functionNames; |
|||
} |
|||
|
|||
if (typeof localNames !== "undefined" && localNames.length > 0) { |
|||
node.localNames = localNames; |
|||
} |
|||
|
|||
if (typeof producers !== "undefined" && producers.length > 0) { |
|||
node.producers = producers; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function moduleNameMetadata(value) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ModuleNameMetadata", |
|||
value: value |
|||
}; |
|||
return node; |
|||
} |
|||
export function functionNameMetadata(value, index) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof index === "number")) { |
|||
throw new Error('typeof index === "number"' + " error: " + ("Argument index must be of type number, given: " + _typeof(index) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "FunctionNameMetadata", |
|||
value: value, |
|||
index: index |
|||
}; |
|||
return node; |
|||
} |
|||
export function localNameMetadata(value, localIndex, functionIndex) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof localIndex === "number")) { |
|||
throw new Error('typeof localIndex === "number"' + " error: " + ("Argument localIndex must be of type number, given: " + _typeof(localIndex) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof functionIndex === "number")) { |
|||
throw new Error('typeof functionIndex === "number"' + " error: " + ("Argument functionIndex must be of type number, given: " + _typeof(functionIndex) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "LocalNameMetadata", |
|||
value: value, |
|||
localIndex: localIndex, |
|||
functionIndex: functionIndex |
|||
}; |
|||
return node; |
|||
} |
|||
export function binaryModule(id, blob) { |
|||
if (id !== null && id !== undefined) { |
|||
if (!(typeof id === "string")) { |
|||
throw new Error('typeof id === "string"' + " error: " + ("Argument id must be of type string, given: " + _typeof(id) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (!(_typeof(blob) === "object" && typeof blob.length !== "undefined")) { |
|||
throw new Error('typeof blob === "object" && typeof blob.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "BinaryModule", |
|||
id: id, |
|||
blob: blob |
|||
}; |
|||
return node; |
|||
} |
|||
export function quoteModule(id, string) { |
|||
if (id !== null && id !== undefined) { |
|||
if (!(typeof id === "string")) { |
|||
throw new Error('typeof id === "string"' + " error: " + ("Argument id must be of type string, given: " + _typeof(id) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (!(_typeof(string) === "object" && typeof string.length !== "undefined")) { |
|||
throw new Error('typeof string === "object" && typeof string.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "QuoteModule", |
|||
id: id, |
|||
string: string |
|||
}; |
|||
return node; |
|||
} |
|||
export function sectionMetadata(section, startOffset, size, vectorOfSize) { |
|||
if (!(typeof startOffset === "number")) { |
|||
throw new Error('typeof startOffset === "number"' + " error: " + ("Argument startOffset must be of type number, given: " + _typeof(startOffset) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "SectionMetadata", |
|||
section: section, |
|||
startOffset: startOffset, |
|||
size: size, |
|||
vectorOfSize: vectorOfSize |
|||
}; |
|||
return node; |
|||
} |
|||
export function producersSectionMetadata(producers) { |
|||
if (!(_typeof(producers) === "object" && typeof producers.length !== "undefined")) { |
|||
throw new Error('typeof producers === "object" && typeof producers.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ProducersSectionMetadata", |
|||
producers: producers |
|||
}; |
|||
return node; |
|||
} |
|||
export function producerMetadata(language, processedBy, sdk) { |
|||
if (!(_typeof(language) === "object" && typeof language.length !== "undefined")) { |
|||
throw new Error('typeof language === "object" && typeof language.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(processedBy) === "object" && typeof processedBy.length !== "undefined")) { |
|||
throw new Error('typeof processedBy === "object" && typeof processedBy.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(sdk) === "object" && typeof sdk.length !== "undefined")) { |
|||
throw new Error('typeof sdk === "object" && typeof sdk.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ProducerMetadata", |
|||
language: language, |
|||
processedBy: processedBy, |
|||
sdk: sdk |
|||
}; |
|||
return node; |
|||
} |
|||
export function producerMetadataVersionedName(name, version) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + ("Argument name must be of type string, given: " + _typeof(name) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof version === "string")) { |
|||
throw new Error('typeof version === "string"' + " error: " + ("Argument version must be of type string, given: " + _typeof(version) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ProducerMetadataVersionedName", |
|||
name: name, |
|||
version: version |
|||
}; |
|||
return node; |
|||
} |
|||
export function loopInstruction(label, resulttype, instr) { |
|||
if (!(_typeof(instr) === "object" && typeof instr.length !== "undefined")) { |
|||
throw new Error('typeof instr === "object" && typeof instr.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "LoopInstruction", |
|||
id: "loop", |
|||
label: label, |
|||
resulttype: resulttype, |
|||
instr: instr |
|||
}; |
|||
return node; |
|||
} |
|||
export function instr(id, object, args, namedArgs) { |
|||
if (!(typeof id === "string")) { |
|||
throw new Error('typeof id === "string"' + " error: " + ("Argument id must be of type string, given: " + _typeof(id) || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(args) === "object" && typeof args.length !== "undefined")) { |
|||
throw new Error('typeof args === "object" && typeof args.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Instr", |
|||
id: id, |
|||
args: args |
|||
}; |
|||
|
|||
if (typeof object !== "undefined") { |
|||
node.object = object; |
|||
} |
|||
|
|||
if (typeof namedArgs !== "undefined" && Object.keys(namedArgs).length !== 0) { |
|||
node.namedArgs = namedArgs; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function ifInstruction(testLabel, test, result, consequent, alternate) { |
|||
if (!(_typeof(test) === "object" && typeof test.length !== "undefined")) { |
|||
throw new Error('typeof test === "object" && typeof test.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(consequent) === "object" && typeof consequent.length !== "undefined")) { |
|||
throw new Error('typeof consequent === "object" && typeof consequent.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(alternate) === "object" && typeof alternate.length !== "undefined")) { |
|||
throw new Error('typeof alternate === "object" && typeof alternate.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "IfInstruction", |
|||
id: "if", |
|||
testLabel: testLabel, |
|||
test: test, |
|||
result: result, |
|||
consequent: consequent, |
|||
alternate: alternate |
|||
}; |
|||
return node; |
|||
} |
|||
export function stringLiteral(value) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "StringLiteral", |
|||
value: value |
|||
}; |
|||
return node; |
|||
} |
|||
export function numberLiteral(value, raw) { |
|||
if (!(typeof value === "number")) { |
|||
throw new Error('typeof value === "number"' + " error: " + ("Argument value must be of type number, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof raw === "string")) { |
|||
throw new Error('typeof raw === "string"' + " error: " + ("Argument raw must be of type string, given: " + _typeof(raw) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "NumberLiteral", |
|||
value: value, |
|||
raw: raw |
|||
}; |
|||
return node; |
|||
} |
|||
export function longNumberLiteral(value, raw) { |
|||
if (!(typeof raw === "string")) { |
|||
throw new Error('typeof raw === "string"' + " error: " + ("Argument raw must be of type string, given: " + _typeof(raw) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "LongNumberLiteral", |
|||
value: value, |
|||
raw: raw |
|||
}; |
|||
return node; |
|||
} |
|||
export function floatLiteral(value, nan, inf, raw) { |
|||
if (!(typeof value === "number")) { |
|||
throw new Error('typeof value === "number"' + " error: " + ("Argument value must be of type number, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
if (nan !== null && nan !== undefined) { |
|||
if (!(typeof nan === "boolean")) { |
|||
throw new Error('typeof nan === "boolean"' + " error: " + ("Argument nan must be of type boolean, given: " + _typeof(nan) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (inf !== null && inf !== undefined) { |
|||
if (!(typeof inf === "boolean")) { |
|||
throw new Error('typeof inf === "boolean"' + " error: " + ("Argument inf must be of type boolean, given: " + _typeof(inf) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
if (!(typeof raw === "string")) { |
|||
throw new Error('typeof raw === "string"' + " error: " + ("Argument raw must be of type string, given: " + _typeof(raw) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "FloatLiteral", |
|||
value: value, |
|||
raw: raw |
|||
}; |
|||
|
|||
if (nan === true) { |
|||
node.nan = true; |
|||
} |
|||
|
|||
if (inf === true) { |
|||
node.inf = true; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function elem(table, offset, funcs) { |
|||
if (!(_typeof(offset) === "object" && typeof offset.length !== "undefined")) { |
|||
throw new Error('typeof offset === "object" && typeof offset.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(funcs) === "object" && typeof funcs.length !== "undefined")) { |
|||
throw new Error('typeof funcs === "object" && typeof funcs.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Elem", |
|||
table: table, |
|||
offset: offset, |
|||
funcs: funcs |
|||
}; |
|||
return node; |
|||
} |
|||
export function indexInFuncSection(index) { |
|||
var node = { |
|||
type: "IndexInFuncSection", |
|||
index: index |
|||
}; |
|||
return node; |
|||
} |
|||
export function valtypeLiteral(name) { |
|||
var node = { |
|||
type: "ValtypeLiteral", |
|||
name: name |
|||
}; |
|||
return node; |
|||
} |
|||
export function typeInstruction(id, functype) { |
|||
var node = { |
|||
type: "TypeInstruction", |
|||
id: id, |
|||
functype: functype |
|||
}; |
|||
return node; |
|||
} |
|||
export function start(index) { |
|||
var node = { |
|||
type: "Start", |
|||
index: index |
|||
}; |
|||
return node; |
|||
} |
|||
export function globalType(valtype, mutability) { |
|||
var node = { |
|||
type: "GlobalType", |
|||
valtype: valtype, |
|||
mutability: mutability |
|||
}; |
|||
return node; |
|||
} |
|||
export function leadingComment(value) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "LeadingComment", |
|||
value: value |
|||
}; |
|||
return node; |
|||
} |
|||
export function blockComment(value) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "BlockComment", |
|||
value: value |
|||
}; |
|||
return node; |
|||
} |
|||
export function data(memoryIndex, offset, init) { |
|||
var node = { |
|||
type: "Data", |
|||
memoryIndex: memoryIndex, |
|||
offset: offset, |
|||
init: init |
|||
}; |
|||
return node; |
|||
} |
|||
export function global(globalType, init, name) { |
|||
if (!(_typeof(init) === "object" && typeof init.length !== "undefined")) { |
|||
throw new Error('typeof init === "object" && typeof init.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Global", |
|||
globalType: globalType, |
|||
init: init, |
|||
name: name |
|||
}; |
|||
return node; |
|||
} |
|||
export function table(elementType, limits, name, elements) { |
|||
if (!(limits.type === "Limit")) { |
|||
throw new Error('limits.type === "Limit"' + " error: " + ("Argument limits must be of type Limit, given: " + limits.type || "unknown")); |
|||
} |
|||
|
|||
if (elements !== null && elements !== undefined) { |
|||
if (!(_typeof(elements) === "object" && typeof elements.length !== "undefined")) { |
|||
throw new Error('typeof elements === "object" && typeof elements.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "Table", |
|||
elementType: elementType, |
|||
limits: limits, |
|||
name: name |
|||
}; |
|||
|
|||
if (typeof elements !== "undefined" && elements.length > 0) { |
|||
node.elements = elements; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function memory(limits, id) { |
|||
var node = { |
|||
type: "Memory", |
|||
limits: limits, |
|||
id: id |
|||
}; |
|||
return node; |
|||
} |
|||
export function funcImportDescr(id, signature) { |
|||
var node = { |
|||
type: "FuncImportDescr", |
|||
id: id, |
|||
signature: signature |
|||
}; |
|||
return node; |
|||
} |
|||
export function moduleImport(module, name, descr) { |
|||
if (!(typeof module === "string")) { |
|||
throw new Error('typeof module === "string"' + " error: " + ("Argument module must be of type string, given: " + _typeof(module) || "unknown")); |
|||
} |
|||
|
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + ("Argument name must be of type string, given: " + _typeof(name) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ModuleImport", |
|||
module: module, |
|||
name: name, |
|||
descr: descr |
|||
}; |
|||
return node; |
|||
} |
|||
export function moduleExportDescr(exportType, id) { |
|||
var node = { |
|||
type: "ModuleExportDescr", |
|||
exportType: exportType, |
|||
id: id |
|||
}; |
|||
return node; |
|||
} |
|||
export function moduleExport(name, descr) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + ("Argument name must be of type string, given: " + _typeof(name) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ModuleExport", |
|||
name: name, |
|||
descr: descr |
|||
}; |
|||
return node; |
|||
} |
|||
export function limit(min, max) { |
|||
if (!(typeof min === "number")) { |
|||
throw new Error('typeof min === "number"' + " error: " + ("Argument min must be of type number, given: " + _typeof(min) || "unknown")); |
|||
} |
|||
|
|||
if (max !== null && max !== undefined) { |
|||
if (!(typeof max === "number")) { |
|||
throw new Error('typeof max === "number"' + " error: " + ("Argument max must be of type number, given: " + _typeof(max) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "Limit", |
|||
min: min |
|||
}; |
|||
|
|||
if (typeof max !== "undefined") { |
|||
node.max = max; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function signature(params, results) { |
|||
if (!(_typeof(params) === "object" && typeof params.length !== "undefined")) { |
|||
throw new Error('typeof params === "object" && typeof params.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (!(_typeof(results) === "object" && typeof results.length !== "undefined")) { |
|||
throw new Error('typeof results === "object" && typeof results.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Signature", |
|||
params: params, |
|||
results: results |
|||
}; |
|||
return node; |
|||
} |
|||
export function program(body) { |
|||
if (!(_typeof(body) === "object" && typeof body.length !== "undefined")) { |
|||
throw new Error('typeof body === "object" && typeof body.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "Program", |
|||
body: body |
|||
}; |
|||
return node; |
|||
} |
|||
export function identifier(value, raw) { |
|||
if (!(typeof value === "string")) { |
|||
throw new Error('typeof value === "string"' + " error: " + ("Argument value must be of type string, given: " + _typeof(value) || "unknown")); |
|||
} |
|||
|
|||
if (raw !== null && raw !== undefined) { |
|||
if (!(typeof raw === "string")) { |
|||
throw new Error('typeof raw === "string"' + " error: " + ("Argument raw must be of type string, given: " + _typeof(raw) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "Identifier", |
|||
value: value |
|||
}; |
|||
|
|||
if (typeof raw !== "undefined") { |
|||
node.raw = raw; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function blockInstruction(label, instr, result) { |
|||
if (!(_typeof(instr) === "object" && typeof instr.length !== "undefined")) { |
|||
throw new Error('typeof instr === "object" && typeof instr.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "BlockInstruction", |
|||
id: "block", |
|||
label: label, |
|||
instr: instr, |
|||
result: result |
|||
}; |
|||
return node; |
|||
} |
|||
export function callInstruction(index, instrArgs, numeric) { |
|||
if (instrArgs !== null && instrArgs !== undefined) { |
|||
if (!(_typeof(instrArgs) === "object" && typeof instrArgs.length !== "undefined")) { |
|||
throw new Error('typeof instrArgs === "object" && typeof instrArgs.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "CallInstruction", |
|||
id: "call", |
|||
index: index |
|||
}; |
|||
|
|||
if (typeof instrArgs !== "undefined" && instrArgs.length > 0) { |
|||
node.instrArgs = instrArgs; |
|||
} |
|||
|
|||
if (typeof numeric !== "undefined") { |
|||
node.numeric = numeric; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function callIndirectInstruction(signature, intrs) { |
|||
if (intrs !== null && intrs !== undefined) { |
|||
if (!(_typeof(intrs) === "object" && typeof intrs.length !== "undefined")) { |
|||
throw new Error('typeof intrs === "object" && typeof intrs.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "CallIndirectInstruction", |
|||
id: "call_indirect", |
|||
signature: signature |
|||
}; |
|||
|
|||
if (typeof intrs !== "undefined" && intrs.length > 0) { |
|||
node.intrs = intrs; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function byteArray(values) { |
|||
if (!(_typeof(values) === "object" && typeof values.length !== "undefined")) { |
|||
throw new Error('typeof values === "object" && typeof values.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "ByteArray", |
|||
values: values |
|||
}; |
|||
return node; |
|||
} |
|||
export function func(name, signature, body, isExternal, metadata) { |
|||
if (!(_typeof(body) === "object" && typeof body.length !== "undefined")) { |
|||
throw new Error('typeof body === "object" && typeof body.length !== "undefined"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
if (isExternal !== null && isExternal !== undefined) { |
|||
if (!(typeof isExternal === "boolean")) { |
|||
throw new Error('typeof isExternal === "boolean"' + " error: " + ("Argument isExternal must be of type boolean, given: " + _typeof(isExternal) || "unknown")); |
|||
} |
|||
} |
|||
|
|||
var node = { |
|||
type: "Func", |
|||
name: name, |
|||
signature: signature, |
|||
body: body |
|||
}; |
|||
|
|||
if (isExternal === true) { |
|||
node.isExternal = true; |
|||
} |
|||
|
|||
if (typeof metadata !== "undefined") { |
|||
node.metadata = metadata; |
|||
} |
|||
|
|||
return node; |
|||
} |
|||
export function internalBrUnless(target) { |
|||
if (!(typeof target === "number")) { |
|||
throw new Error('typeof target === "number"' + " error: " + ("Argument target must be of type number, given: " + _typeof(target) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "InternalBrUnless", |
|||
target: target |
|||
}; |
|||
return node; |
|||
} |
|||
export function internalGoto(target) { |
|||
if (!(typeof target === "number")) { |
|||
throw new Error('typeof target === "number"' + " error: " + ("Argument target must be of type number, given: " + _typeof(target) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "InternalGoto", |
|||
target: target |
|||
}; |
|||
return node; |
|||
} |
|||
export function internalCallExtern(target) { |
|||
if (!(typeof target === "number")) { |
|||
throw new Error('typeof target === "number"' + " error: " + ("Argument target must be of type number, given: " + _typeof(target) || "unknown")); |
|||
} |
|||
|
|||
var node = { |
|||
type: "InternalCallExtern", |
|||
target: target |
|||
}; |
|||
return node; |
|||
} |
|||
export function internalEndAndReturn() { |
|||
var node = { |
|||
type: "InternalEndAndReturn" |
|||
}; |
|||
return node; |
|||
} |
|||
export var isModule = isTypeOf("Module"); |
|||
export var isModuleMetadata = isTypeOf("ModuleMetadata"); |
|||
export var isModuleNameMetadata = isTypeOf("ModuleNameMetadata"); |
|||
export var isFunctionNameMetadata = isTypeOf("FunctionNameMetadata"); |
|||
export var isLocalNameMetadata = isTypeOf("LocalNameMetadata"); |
|||
export var isBinaryModule = isTypeOf("BinaryModule"); |
|||
export var isQuoteModule = isTypeOf("QuoteModule"); |
|||
export var isSectionMetadata = isTypeOf("SectionMetadata"); |
|||
export var isProducersSectionMetadata = isTypeOf("ProducersSectionMetadata"); |
|||
export var isProducerMetadata = isTypeOf("ProducerMetadata"); |
|||
export var isProducerMetadataVersionedName = isTypeOf("ProducerMetadataVersionedName"); |
|||
export var isLoopInstruction = isTypeOf("LoopInstruction"); |
|||
export var isInstr = isTypeOf("Instr"); |
|||
export var isIfInstruction = isTypeOf("IfInstruction"); |
|||
export var isStringLiteral = isTypeOf("StringLiteral"); |
|||
export var isNumberLiteral = isTypeOf("NumberLiteral"); |
|||
export var isLongNumberLiteral = isTypeOf("LongNumberLiteral"); |
|||
export var isFloatLiteral = isTypeOf("FloatLiteral"); |
|||
export var isElem = isTypeOf("Elem"); |
|||
export var isIndexInFuncSection = isTypeOf("IndexInFuncSection"); |
|||
export var isValtypeLiteral = isTypeOf("ValtypeLiteral"); |
|||
export var isTypeInstruction = isTypeOf("TypeInstruction"); |
|||
export var isStart = isTypeOf("Start"); |
|||
export var isGlobalType = isTypeOf("GlobalType"); |
|||
export var isLeadingComment = isTypeOf("LeadingComment"); |
|||
export var isBlockComment = isTypeOf("BlockComment"); |
|||
export var isData = isTypeOf("Data"); |
|||
export var isGlobal = isTypeOf("Global"); |
|||
export var isTable = isTypeOf("Table"); |
|||
export var isMemory = isTypeOf("Memory"); |
|||
export var isFuncImportDescr = isTypeOf("FuncImportDescr"); |
|||
export var isModuleImport = isTypeOf("ModuleImport"); |
|||
export var isModuleExportDescr = isTypeOf("ModuleExportDescr"); |
|||
export var isModuleExport = isTypeOf("ModuleExport"); |
|||
export var isLimit = isTypeOf("Limit"); |
|||
export var isSignature = isTypeOf("Signature"); |
|||
export var isProgram = isTypeOf("Program"); |
|||
export var isIdentifier = isTypeOf("Identifier"); |
|||
export var isBlockInstruction = isTypeOf("BlockInstruction"); |
|||
export var isCallInstruction = isTypeOf("CallInstruction"); |
|||
export var isCallIndirectInstruction = isTypeOf("CallIndirectInstruction"); |
|||
export var isByteArray = isTypeOf("ByteArray"); |
|||
export var isFunc = isTypeOf("Func"); |
|||
export var isInternalBrUnless = isTypeOf("InternalBrUnless"); |
|||
export var isInternalGoto = isTypeOf("InternalGoto"); |
|||
export var isInternalCallExtern = isTypeOf("InternalCallExtern"); |
|||
export var isInternalEndAndReturn = isTypeOf("InternalEndAndReturn"); |
|||
export var isNode = function isNode(node) { |
|||
return isModule(node) || isModuleMetadata(node) || isModuleNameMetadata(node) || isFunctionNameMetadata(node) || isLocalNameMetadata(node) || isBinaryModule(node) || isQuoteModule(node) || isSectionMetadata(node) || isProducersSectionMetadata(node) || isProducerMetadata(node) || isProducerMetadataVersionedName(node) || isLoopInstruction(node) || isInstr(node) || isIfInstruction(node) || isStringLiteral(node) || isNumberLiteral(node) || isLongNumberLiteral(node) || isFloatLiteral(node) || isElem(node) || isIndexInFuncSection(node) || isValtypeLiteral(node) || isTypeInstruction(node) || isStart(node) || isGlobalType(node) || isLeadingComment(node) || isBlockComment(node) || isData(node) || isGlobal(node) || isTable(node) || isMemory(node) || isFuncImportDescr(node) || isModuleImport(node) || isModuleExportDescr(node) || isModuleExport(node) || isLimit(node) || isSignature(node) || isProgram(node) || isIdentifier(node) || isBlockInstruction(node) || isCallInstruction(node) || isCallIndirectInstruction(node) || isByteArray(node) || isFunc(node) || isInternalBrUnless(node) || isInternalGoto(node) || isInternalCallExtern(node) || isInternalEndAndReturn(node); |
|||
}; |
|||
export var isBlock = function isBlock(node) { |
|||
return isLoopInstruction(node) || isBlockInstruction(node) || isFunc(node); |
|||
}; |
|||
export var isInstruction = function isInstruction(node) { |
|||
return isLoopInstruction(node) || isInstr(node) || isIfInstruction(node) || isTypeInstruction(node) || isBlockInstruction(node) || isCallInstruction(node) || isCallIndirectInstruction(node); |
|||
}; |
|||
export var isExpression = function isExpression(node) { |
|||
return isInstr(node) || isStringLiteral(node) || isNumberLiteral(node) || isLongNumberLiteral(node) || isFloatLiteral(node) || isValtypeLiteral(node) || isIdentifier(node); |
|||
}; |
|||
export var isNumericLiteral = function isNumericLiteral(node) { |
|||
return isNumberLiteral(node) || isLongNumberLiteral(node) || isFloatLiteral(node); |
|||
}; |
|||
export var isImportDescr = function isImportDescr(node) { |
|||
return isGlobalType(node) || isTable(node) || isMemory(node) || isFuncImportDescr(node); |
|||
}; |
|||
export var isIntrinsic = function isIntrinsic(node) { |
|||
return isInternalBrUnless(node) || isInternalGoto(node) || isInternalCallExtern(node) || isInternalEndAndReturn(node); |
|||
}; |
|||
export var assertModule = assertTypeOf("Module"); |
|||
export var assertModuleMetadata = assertTypeOf("ModuleMetadata"); |
|||
export var assertModuleNameMetadata = assertTypeOf("ModuleNameMetadata"); |
|||
export var assertFunctionNameMetadata = assertTypeOf("FunctionNameMetadata"); |
|||
export var assertLocalNameMetadata = assertTypeOf("LocalNameMetadata"); |
|||
export var assertBinaryModule = assertTypeOf("BinaryModule"); |
|||
export var assertQuoteModule = assertTypeOf("QuoteModule"); |
|||
export var assertSectionMetadata = assertTypeOf("SectionMetadata"); |
|||
export var assertProducersSectionMetadata = assertTypeOf("ProducersSectionMetadata"); |
|||
export var assertProducerMetadata = assertTypeOf("ProducerMetadata"); |
|||
export var assertProducerMetadataVersionedName = assertTypeOf("ProducerMetadataVersionedName"); |
|||
export var assertLoopInstruction = assertTypeOf("LoopInstruction"); |
|||
export var assertInstr = assertTypeOf("Instr"); |
|||
export var assertIfInstruction = assertTypeOf("IfInstruction"); |
|||
export var assertStringLiteral = assertTypeOf("StringLiteral"); |
|||
export var assertNumberLiteral = assertTypeOf("NumberLiteral"); |
|||
export var assertLongNumberLiteral = assertTypeOf("LongNumberLiteral"); |
|||
export var assertFloatLiteral = assertTypeOf("FloatLiteral"); |
|||
export var assertElem = assertTypeOf("Elem"); |
|||
export var assertIndexInFuncSection = assertTypeOf("IndexInFuncSection"); |
|||
export var assertValtypeLiteral = assertTypeOf("ValtypeLiteral"); |
|||
export var assertTypeInstruction = assertTypeOf("TypeInstruction"); |
|||
export var assertStart = assertTypeOf("Start"); |
|||
export var assertGlobalType = assertTypeOf("GlobalType"); |
|||
export var assertLeadingComment = assertTypeOf("LeadingComment"); |
|||
export var assertBlockComment = assertTypeOf("BlockComment"); |
|||
export var assertData = assertTypeOf("Data"); |
|||
export var assertGlobal = assertTypeOf("Global"); |
|||
export var assertTable = assertTypeOf("Table"); |
|||
export var assertMemory = assertTypeOf("Memory"); |
|||
export var assertFuncImportDescr = assertTypeOf("FuncImportDescr"); |
|||
export var assertModuleImport = assertTypeOf("ModuleImport"); |
|||
export var assertModuleExportDescr = assertTypeOf("ModuleExportDescr"); |
|||
export var assertModuleExport = assertTypeOf("ModuleExport"); |
|||
export var assertLimit = assertTypeOf("Limit"); |
|||
export var assertSignature = assertTypeOf("Signature"); |
|||
export var assertProgram = assertTypeOf("Program"); |
|||
export var assertIdentifier = assertTypeOf("Identifier"); |
|||
export var assertBlockInstruction = assertTypeOf("BlockInstruction"); |
|||
export var assertCallInstruction = assertTypeOf("CallInstruction"); |
|||
export var assertCallIndirectInstruction = assertTypeOf("CallIndirectInstruction"); |
|||
export var assertByteArray = assertTypeOf("ByteArray"); |
|||
export var assertFunc = assertTypeOf("Func"); |
|||
export var assertInternalBrUnless = assertTypeOf("InternalBrUnless"); |
|||
export var assertInternalGoto = assertTypeOf("InternalGoto"); |
|||
export var assertInternalCallExtern = assertTypeOf("InternalCallExtern"); |
|||
export var assertInternalEndAndReturn = assertTypeOf("InternalEndAndReturn"); |
|||
export var unionTypesMap = { |
|||
Module: ["Node"], |
|||
ModuleMetadata: ["Node"], |
|||
ModuleNameMetadata: ["Node"], |
|||
FunctionNameMetadata: ["Node"], |
|||
LocalNameMetadata: ["Node"], |
|||
BinaryModule: ["Node"], |
|||
QuoteModule: ["Node"], |
|||
SectionMetadata: ["Node"], |
|||
ProducersSectionMetadata: ["Node"], |
|||
ProducerMetadata: ["Node"], |
|||
ProducerMetadataVersionedName: ["Node"], |
|||
LoopInstruction: ["Node", "Block", "Instruction"], |
|||
Instr: ["Node", "Expression", "Instruction"], |
|||
IfInstruction: ["Node", "Instruction"], |
|||
StringLiteral: ["Node", "Expression"], |
|||
NumberLiteral: ["Node", "NumericLiteral", "Expression"], |
|||
LongNumberLiteral: ["Node", "NumericLiteral", "Expression"], |
|||
FloatLiteral: ["Node", "NumericLiteral", "Expression"], |
|||
Elem: ["Node"], |
|||
IndexInFuncSection: ["Node"], |
|||
ValtypeLiteral: ["Node", "Expression"], |
|||
TypeInstruction: ["Node", "Instruction"], |
|||
Start: ["Node"], |
|||
GlobalType: ["Node", "ImportDescr"], |
|||
LeadingComment: ["Node"], |
|||
BlockComment: ["Node"], |
|||
Data: ["Node"], |
|||
Global: ["Node"], |
|||
Table: ["Node", "ImportDescr"], |
|||
Memory: ["Node", "ImportDescr"], |
|||
FuncImportDescr: ["Node", "ImportDescr"], |
|||
ModuleImport: ["Node"], |
|||
ModuleExportDescr: ["Node"], |
|||
ModuleExport: ["Node"], |
|||
Limit: ["Node"], |
|||
Signature: ["Node"], |
|||
Program: ["Node"], |
|||
Identifier: ["Node", "Expression"], |
|||
BlockInstruction: ["Node", "Block", "Instruction"], |
|||
CallInstruction: ["Node", "Instruction"], |
|||
CallIndirectInstruction: ["Node", "Instruction"], |
|||
ByteArray: ["Node"], |
|||
Func: ["Node", "Block"], |
|||
InternalBrUnless: ["Node", "Intrinsic"], |
|||
InternalGoto: ["Node", "Intrinsic"], |
|||
InternalCallExtern: ["Node", "Intrinsic"], |
|||
InternalEndAndReturn: ["Node", "Intrinsic"] |
|||
}; |
|||
export var nodeAndUnionTypes = ["Module", "ModuleMetadata", "ModuleNameMetadata", "FunctionNameMetadata", "LocalNameMetadata", "BinaryModule", "QuoteModule", "SectionMetadata", "ProducersSectionMetadata", "ProducerMetadata", "ProducerMetadataVersionedName", "LoopInstruction", "Instr", "IfInstruction", "StringLiteral", "NumberLiteral", "LongNumberLiteral", "FloatLiteral", "Elem", "IndexInFuncSection", "ValtypeLiteral", "TypeInstruction", "Start", "GlobalType", "LeadingComment", "BlockComment", "Data", "Global", "Table", "Memory", "FuncImportDescr", "ModuleImport", "ModuleExportDescr", "ModuleExport", "Limit", "Signature", "Program", "Identifier", "BlockInstruction", "CallInstruction", "CallIndirectInstruction", "ByteArray", "Func", "InternalBrUnless", "InternalGoto", "InternalCallExtern", "InternalEndAndReturn", "Node", "Block", "Instruction", "Expression", "NumericLiteral", "ImportDescr", "Intrinsic"]; |
@ -0,0 +1,199 @@ |
|||
function sign(input, output) { |
|||
return [input, output]; |
|||
} |
|||
|
|||
var u32 = "u32"; |
|||
var i32 = "i32"; |
|||
var i64 = "i64"; |
|||
var f32 = "f32"; |
|||
var f64 = "f64"; |
|||
|
|||
var vector = function vector(t) { |
|||
var vecType = [t]; // $FlowIgnore
|
|||
|
|||
vecType.vector = true; |
|||
return vecType; |
|||
}; |
|||
|
|||
var controlInstructions = { |
|||
unreachable: sign([], []), |
|||
nop: sign([], []), |
|||
// block ?
|
|||
// loop ?
|
|||
// if ?
|
|||
// if else ?
|
|||
br: sign([u32], []), |
|||
br_if: sign([u32], []), |
|||
br_table: sign(vector(u32), []), |
|||
return: sign([], []), |
|||
call: sign([u32], []), |
|||
call_indirect: sign([u32], []) |
|||
}; |
|||
var parametricInstructions = { |
|||
drop: sign([], []), |
|||
select: sign([], []) |
|||
}; |
|||
var variableInstructions = { |
|||
get_local: sign([u32], []), |
|||
set_local: sign([u32], []), |
|||
tee_local: sign([u32], []), |
|||
get_global: sign([u32], []), |
|||
set_global: sign([u32], []) |
|||
}; |
|||
var memoryInstructions = { |
|||
"i32.load": sign([u32, u32], [i32]), |
|||
"i64.load": sign([u32, u32], []), |
|||
"f32.load": sign([u32, u32], []), |
|||
"f64.load": sign([u32, u32], []), |
|||
"i32.load8_s": sign([u32, u32], [i32]), |
|||
"i32.load8_u": sign([u32, u32], [i32]), |
|||
"i32.load16_s": sign([u32, u32], [i32]), |
|||
"i32.load16_u": sign([u32, u32], [i32]), |
|||
"i64.load8_s": sign([u32, u32], [i64]), |
|||
"i64.load8_u": sign([u32, u32], [i64]), |
|||
"i64.load16_s": sign([u32, u32], [i64]), |
|||
"i64.load16_u": sign([u32, u32], [i64]), |
|||
"i64.load32_s": sign([u32, u32], [i64]), |
|||
"i64.load32_u": sign([u32, u32], [i64]), |
|||
"i32.store": sign([u32, u32], []), |
|||
"i64.store": sign([u32, u32], []), |
|||
"f32.store": sign([u32, u32], []), |
|||
"f64.store": sign([u32, u32], []), |
|||
"i32.store8": sign([u32, u32], []), |
|||
"i32.store16": sign([u32, u32], []), |
|||
"i64.store8": sign([u32, u32], []), |
|||
"i64.store16": sign([u32, u32], []), |
|||
"i64.store32": sign([u32, u32], []), |
|||
current_memory: sign([], []), |
|||
grow_memory: sign([], []) |
|||
}; |
|||
var numericInstructions = { |
|||
"i32.const": sign([i32], [i32]), |
|||
"i64.const": sign([i64], [i64]), |
|||
"f32.const": sign([f32], [f32]), |
|||
"f64.const": sign([f64], [f64]), |
|||
"i32.eqz": sign([i32], [i32]), |
|||
"i32.eq": sign([i32, i32], [i32]), |
|||
"i32.ne": sign([i32, i32], [i32]), |
|||
"i32.lt_s": sign([i32, i32], [i32]), |
|||
"i32.lt_u": sign([i32, i32], [i32]), |
|||
"i32.gt_s": sign([i32, i32], [i32]), |
|||
"i32.gt_u": sign([i32, i32], [i32]), |
|||
"i32.le_s": sign([i32, i32], [i32]), |
|||
"i32.le_u": sign([i32, i32], [i32]), |
|||
"i32.ge_s": sign([i32, i32], [i32]), |
|||
"i32.ge_u": sign([i32, i32], [i32]), |
|||
"i64.eqz": sign([i64], [i64]), |
|||
"i64.eq": sign([i64, i64], [i32]), |
|||
"i64.ne": sign([i64, i64], [i32]), |
|||
"i64.lt_s": sign([i64, i64], [i32]), |
|||
"i64.lt_u": sign([i64, i64], [i32]), |
|||
"i64.gt_s": sign([i64, i64], [i32]), |
|||
"i64.gt_u": sign([i64, i64], [i32]), |
|||
"i64.le_s": sign([i64, i64], [i32]), |
|||
"i64.le_u": sign([i64, i64], [i32]), |
|||
"i64.ge_s": sign([i64, i64], [i32]), |
|||
"i64.ge_u": sign([i64, i64], [i32]), |
|||
"f32.eq": sign([f32, f32], [i32]), |
|||
"f32.ne": sign([f32, f32], [i32]), |
|||
"f32.lt": sign([f32, f32], [i32]), |
|||
"f32.gt": sign([f32, f32], [i32]), |
|||
"f32.le": sign([f32, f32], [i32]), |
|||
"f32.ge": sign([f32, f32], [i32]), |
|||
"f64.eq": sign([f64, f64], [i32]), |
|||
"f64.ne": sign([f64, f64], [i32]), |
|||
"f64.lt": sign([f64, f64], [i32]), |
|||
"f64.gt": sign([f64, f64], [i32]), |
|||
"f64.le": sign([f64, f64], [i32]), |
|||
"f64.ge": sign([f64, f64], [i32]), |
|||
"i32.clz": sign([i32], [i32]), |
|||
"i32.ctz": sign([i32], [i32]), |
|||
"i32.popcnt": sign([i32], [i32]), |
|||
"i32.add": sign([i32, i32], [i32]), |
|||
"i32.sub": sign([i32, i32], [i32]), |
|||
"i32.mul": sign([i32, i32], [i32]), |
|||
"i32.div_s": sign([i32, i32], [i32]), |
|||
"i32.div_u": sign([i32, i32], [i32]), |
|||
"i32.rem_s": sign([i32, i32], [i32]), |
|||
"i32.rem_u": sign([i32, i32], [i32]), |
|||
"i32.and": sign([i32, i32], [i32]), |
|||
"i32.or": sign([i32, i32], [i32]), |
|||
"i32.xor": sign([i32, i32], [i32]), |
|||
"i32.shl": sign([i32, i32], [i32]), |
|||
"i32.shr_s": sign([i32, i32], [i32]), |
|||
"i32.shr_u": sign([i32, i32], [i32]), |
|||
"i32.rotl": sign([i32, i32], [i32]), |
|||
"i32.rotr": sign([i32, i32], [i32]), |
|||
"i64.clz": sign([i64], [i64]), |
|||
"i64.ctz": sign([i64], [i64]), |
|||
"i64.popcnt": sign([i64], [i64]), |
|||
"i64.add": sign([i64, i64], [i64]), |
|||
"i64.sub": sign([i64, i64], [i64]), |
|||
"i64.mul": sign([i64, i64], [i64]), |
|||
"i64.div_s": sign([i64, i64], [i64]), |
|||
"i64.div_u": sign([i64, i64], [i64]), |
|||
"i64.rem_s": sign([i64, i64], [i64]), |
|||
"i64.rem_u": sign([i64, i64], [i64]), |
|||
"i64.and": sign([i64, i64], [i64]), |
|||
"i64.or": sign([i64, i64], [i64]), |
|||
"i64.xor": sign([i64, i64], [i64]), |
|||
"i64.shl": sign([i64, i64], [i64]), |
|||
"i64.shr_s": sign([i64, i64], [i64]), |
|||
"i64.shr_u": sign([i64, i64], [i64]), |
|||
"i64.rotl": sign([i64, i64], [i64]), |
|||
"i64.rotr": sign([i64, i64], [i64]), |
|||
"f32.abs": sign([f32], [f32]), |
|||
"f32.neg": sign([f32], [f32]), |
|||
"f32.ceil": sign([f32], [f32]), |
|||
"f32.floor": sign([f32], [f32]), |
|||
"f32.trunc": sign([f32], [f32]), |
|||
"f32.nearest": sign([f32], [f32]), |
|||
"f32.sqrt": sign([f32], [f32]), |
|||
"f32.add": sign([f32, f32], [f32]), |
|||
"f32.sub": sign([f32, f32], [f32]), |
|||
"f32.mul": sign([f32, f32], [f32]), |
|||
"f32.div": sign([f32, f32], [f32]), |
|||
"f32.min": sign([f32, f32], [f32]), |
|||
"f32.max": sign([f32, f32], [f32]), |
|||
"f32.copysign": sign([f32, f32], [f32]), |
|||
"f64.abs": sign([f64], [f64]), |
|||
"f64.neg": sign([f64], [f64]), |
|||
"f64.ceil": sign([f64], [f64]), |
|||
"f64.floor": sign([f64], [f64]), |
|||
"f64.trunc": sign([f64], [f64]), |
|||
"f64.nearest": sign([f64], [f64]), |
|||
"f64.sqrt": sign([f64], [f64]), |
|||
"f64.add": sign([f64, f64], [f64]), |
|||
"f64.sub": sign([f64, f64], [f64]), |
|||
"f64.mul": sign([f64, f64], [f64]), |
|||
"f64.div": sign([f64, f64], [f64]), |
|||
"f64.min": sign([f64, f64], [f64]), |
|||
"f64.max": sign([f64, f64], [f64]), |
|||
"f64.copysign": sign([f64, f64], [f64]), |
|||
"i32.wrap/i64": sign([i64], [i32]), |
|||
"i32.trunc_s/f32": sign([f32], [i32]), |
|||
"i32.trunc_u/f32": sign([f32], [i32]), |
|||
"i32.trunc_s/f64": sign([f32], [i32]), |
|||
"i32.trunc_u/f64": sign([f64], [i32]), |
|||
"i64.extend_s/i32": sign([i32], [i64]), |
|||
"i64.extend_u/i32": sign([i32], [i64]), |
|||
"i64.trunc_s/f32": sign([f32], [i64]), |
|||
"i64.trunc_u/f32": sign([f32], [i64]), |
|||
"i64.trunc_s/f64": sign([f64], [i64]), |
|||
"i64.trunc_u/f64": sign([f64], [i64]), |
|||
"f32.convert_s/i32": sign([i32], [f32]), |
|||
"f32.convert_u/i32": sign([i32], [f32]), |
|||
"f32.convert_s/i64": sign([i64], [f32]), |
|||
"f32.convert_u/i64": sign([i64], [f32]), |
|||
"f32.demote/f64": sign([f64], [f32]), |
|||
"f64.convert_s/i32": sign([i32], [f64]), |
|||
"f64.convert_u/i32": sign([i32], [f64]), |
|||
"f64.convert_s/i64": sign([i64], [f64]), |
|||
"f64.convert_u/i64": sign([i64], [f64]), |
|||
"f64.promote/f32": sign([f32], [f64]), |
|||
"i32.reinterpret/f32": sign([f32], [i32]), |
|||
"i64.reinterpret/f64": sign([f64], [i64]), |
|||
"f32.reinterpret/i32": sign([i32], [f32]), |
|||
"f64.reinterpret/i64": sign([i64], [f64]) |
|||
}; |
|||
export var signatures = Object.assign({}, controlInstructions, parametricInstructions, variableInstructions, memoryInstructions, numericInstructions); |
@ -0,0 +1,76 @@ |
|||
var t = require("../../index"); // func and call_indirect instructions can either define a signature inline, or
|
|||
// reference a signature, e.g.
|
|||
//
|
|||
// ;; inline signature
|
|||
// (func (result i64)
|
|||
// (i64.const 2)
|
|||
// )
|
|||
// ;; signature reference
|
|||
// (type (func (result i64)))
|
|||
// (func (type 0)
|
|||
// (i64.const 2))
|
|||
// )
|
|||
//
|
|||
// this AST transform denormalises the type references, making all signatures within the module
|
|||
// inline.
|
|||
|
|||
|
|||
export function transform(ast) { |
|||
var typeInstructions = []; |
|||
t.traverse(ast, { |
|||
TypeInstruction: function TypeInstruction(_ref) { |
|||
var node = _ref.node; |
|||
typeInstructions.push(node); |
|||
} |
|||
}); |
|||
|
|||
if (!typeInstructions.length) { |
|||
return; |
|||
} |
|||
|
|||
function denormalizeSignature(signature) { |
|||
// signature referenced by identifier
|
|||
if (signature.type === "Identifier") { |
|||
var identifier = signature; |
|||
var typeInstruction = typeInstructions.find(function (t) { |
|||
return t.id.type === identifier.type && t.id.value === identifier.value; |
|||
}); |
|||
|
|||
if (!typeInstruction) { |
|||
throw new Error("A type instruction reference was not found ".concat(JSON.stringify(signature))); |
|||
} |
|||
|
|||
return typeInstruction.functype; |
|||
} // signature referenced by index
|
|||
|
|||
|
|||
if (signature.type === "NumberLiteral") { |
|||
var signatureRef = signature; |
|||
var _typeInstruction = typeInstructions[signatureRef.value]; |
|||
return _typeInstruction.functype; |
|||
} |
|||
|
|||
return signature; |
|||
} |
|||
|
|||
t.traverse(ast, { |
|||
Func: function (_Func) { |
|||
function Func(_x) { |
|||
return _Func.apply(this, arguments); |
|||
} |
|||
|
|||
Func.toString = function () { |
|||
return _Func.toString(); |
|||
}; |
|||
|
|||
return Func; |
|||
}(function (_ref2) { |
|||
var node = _ref2.node; |
|||
node.signature = denormalizeSignature(node.signature); |
|||
}), |
|||
CallIndirectInstruction: function CallIndirectInstruction(_ref3) { |
|||
var node = _ref3.node; |
|||
node.signature = denormalizeSignature(node.signature); |
|||
} |
|||
}); |
|||
} |
@ -0,0 +1,216 @@ |
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
import { isBlock, isFunc, isIdentifier, numberLiteralFromRaw, traverse } from "../../index"; |
|||
import { moduleContextFromModuleAST } from "@webassemblyjs/helper-module-context"; // FIXME(sven): do the same with all block instructions, must be more generic here
|
|||
|
|||
function newUnexpectedFunction(i) { |
|||
return new Error("unknown function at offset: " + i); |
|||
} |
|||
|
|||
export function transform(ast) { |
|||
var module; |
|||
traverse(ast, { |
|||
Module: function (_Module) { |
|||
function Module(_x) { |
|||
return _Module.apply(this, arguments); |
|||
} |
|||
|
|||
Module.toString = function () { |
|||
return _Module.toString(); |
|||
}; |
|||
|
|||
return Module; |
|||
}(function (path) { |
|||
module = path.node; |
|||
}) |
|||
}); |
|||
var moduleContext = moduleContextFromModuleAST(module); // Transform the actual instruction in function bodies
|
|||
|
|||
traverse(ast, { |
|||
Func: function (_Func) { |
|||
function Func(_x2) { |
|||
return _Func.apply(this, arguments); |
|||
} |
|||
|
|||
Func.toString = function () { |
|||
return _Func.toString(); |
|||
}; |
|||
|
|||
return Func; |
|||
}(function (path) { |
|||
transformFuncPath(path, moduleContext); |
|||
}), |
|||
Start: function (_Start) { |
|||
function Start(_x3) { |
|||
return _Start.apply(this, arguments); |
|||
} |
|||
|
|||
Start.toString = function () { |
|||
return _Start.toString(); |
|||
}; |
|||
|
|||
return Start; |
|||
}(function (path) { |
|||
var index = path.node.index; |
|||
|
|||
if (isIdentifier(index) === true) { |
|||
var offsetInModule = moduleContext.getFunctionOffsetByIdentifier(index.value); |
|||
|
|||
if (typeof offsetInModule === "undefined") { |
|||
throw newUnexpectedFunction(index.value); |
|||
} // Replace the index Identifier
|
|||
// $FlowIgnore: reference?
|
|||
|
|||
|
|||
path.node.index = numberLiteralFromRaw(offsetInModule); |
|||
} |
|||
}) |
|||
}); |
|||
} |
|||
|
|||
function transformFuncPath(funcPath, moduleContext) { |
|||
var funcNode = funcPath.node; |
|||
var signature = funcNode.signature; |
|||
|
|||
if (signature.type !== "Signature") { |
|||
throw new Error("Function signatures must be denormalised before execution"); |
|||
} |
|||
|
|||
var params = signature.params; // Add func locals in the context
|
|||
|
|||
params.forEach(function (p) { |
|||
return moduleContext.addLocal(p.valtype); |
|||
}); |
|||
traverse(funcNode, { |
|||
Instr: function (_Instr) { |
|||
function Instr(_x4) { |
|||
return _Instr.apply(this, arguments); |
|||
} |
|||
|
|||
Instr.toString = function () { |
|||
return _Instr.toString(); |
|||
}; |
|||
|
|||
return Instr; |
|||
}(function (instrPath) { |
|||
var instrNode = instrPath.node; |
|||
/** |
|||
* Local access |
|||
*/ |
|||
|
|||
if (instrNode.id === "get_local" || instrNode.id === "set_local" || instrNode.id === "tee_local") { |
|||
var _instrNode$args = _slicedToArray(instrNode.args, 1), |
|||
firstArg = _instrNode$args[0]; |
|||
|
|||
if (firstArg.type === "Identifier") { |
|||
var offsetInParams = params.findIndex(function (_ref) { |
|||
var id = _ref.id; |
|||
return id === firstArg.value; |
|||
}); |
|||
|
|||
if (offsetInParams === -1) { |
|||
throw new Error("".concat(firstArg.value, " not found in ").concat(instrNode.id, ": not declared in func params")); |
|||
} // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
|
|||
instrNode.args[0] = numberLiteralFromRaw(offsetInParams); |
|||
} |
|||
} |
|||
/** |
|||
* Global access |
|||
*/ |
|||
|
|||
|
|||
if (instrNode.id === "get_global" || instrNode.id === "set_global") { |
|||
var _instrNode$args2 = _slicedToArray(instrNode.args, 1), |
|||
_firstArg = _instrNode$args2[0]; |
|||
|
|||
if (isIdentifier(_firstArg) === true) { |
|||
var globalOffset = moduleContext.getGlobalOffsetByIdentifier( // $FlowIgnore: reference?
|
|||
_firstArg.value); |
|||
|
|||
if (typeof globalOffset === "undefined") { |
|||
// $FlowIgnore: reference?
|
|||
throw new Error("global ".concat(_firstArg.value, " not found in module")); |
|||
} // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
|
|||
instrNode.args[0] = numberLiteralFromRaw(globalOffset); |
|||
} |
|||
} |
|||
/** |
|||
* Labels lookup |
|||
*/ |
|||
|
|||
|
|||
if (instrNode.id === "br") { |
|||
var _instrNode$args3 = _slicedToArray(instrNode.args, 1), |
|||
_firstArg2 = _instrNode$args3[0]; |
|||
|
|||
if (isIdentifier(_firstArg2) === true) { |
|||
// if the labels is not found it is going to be replaced with -1
|
|||
// which is invalid.
|
|||
var relativeBlockCount = -1; // $FlowIgnore: reference?
|
|||
|
|||
instrPath.findParent(function (_ref2) { |
|||
var node = _ref2.node; |
|||
|
|||
if (isBlock(node)) { |
|||
relativeBlockCount++; // $FlowIgnore: reference?
|
|||
|
|||
var name = node.label || node.name; |
|||
|
|||
if (_typeof(name) === "object") { |
|||
// $FlowIgnore: isIdentifier ensures that
|
|||
if (name.value === _firstArg2.value) { |
|||
// Found it
|
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (isFunc(node)) { |
|||
return false; |
|||
} |
|||
}); // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
instrNode.args[0] = numberLiteralFromRaw(relativeBlockCount); |
|||
} |
|||
} |
|||
}), |
|||
|
|||
/** |
|||
* Func lookup |
|||
*/ |
|||
CallInstruction: function (_CallInstruction) { |
|||
function CallInstruction(_x5) { |
|||
return _CallInstruction.apply(this, arguments); |
|||
} |
|||
|
|||
CallInstruction.toString = function () { |
|||
return _CallInstruction.toString(); |
|||
}; |
|||
|
|||
return CallInstruction; |
|||
}(function (_ref3) { |
|||
var node = _ref3.node; |
|||
var index = node.index; |
|||
|
|||
if (isIdentifier(index) === true) { |
|||
var offsetInModule = moduleContext.getFunctionOffsetByIdentifier(index.value); |
|||
|
|||
if (typeof offsetInModule === "undefined") { |
|||
throw newUnexpectedFunction(index.value); |
|||
} // Replace the index Identifier
|
|||
// $FlowIgnore: reference?
|
|||
|
|||
|
|||
node.index = numberLiteralFromRaw(offsetInModule); |
|||
} |
|||
}) |
|||
}); |
|||
} |
@ -0,0 +1,96 @@ |
|||
import { createPath } from "./node-path"; |
|||
import { unionTypesMap, nodeAndUnionTypes } from "./nodes"; // recursively walks the AST starting at the given node. The callback is invoked for
|
|||
// and object that has a 'type' property.
|
|||
|
|||
function walk(context, callback) { |
|||
var stop = false; |
|||
|
|||
function innerWalk(context, callback) { |
|||
if (stop) { |
|||
return; |
|||
} |
|||
|
|||
var node = context.node; |
|||
|
|||
if (node === undefined) { |
|||
console.warn("traversing with an empty context"); |
|||
return; |
|||
} |
|||
|
|||
if (node._deleted === true) { |
|||
return; |
|||
} |
|||
|
|||
var path = createPath(context); |
|||
callback(node.type, path); |
|||
|
|||
if (path.shouldStop) { |
|||
stop = true; |
|||
return; |
|||
} |
|||
|
|||
Object.keys(node).forEach(function (prop) { |
|||
var value = node[prop]; |
|||
|
|||
if (value === null || value === undefined) { |
|||
return; |
|||
} |
|||
|
|||
var valueAsArray = Array.isArray(value) ? value : [value]; |
|||
valueAsArray.forEach(function (childNode) { |
|||
if (typeof childNode.type === "string") { |
|||
var childContext = { |
|||
node: childNode, |
|||
parentKey: prop, |
|||
parentPath: path, |
|||
shouldStop: false, |
|||
inList: Array.isArray(value) |
|||
}; |
|||
innerWalk(childContext, callback); |
|||
} |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
innerWalk(context, callback); |
|||
} |
|||
|
|||
var noop = function noop() {}; |
|||
|
|||
export function traverse(node, visitors) { |
|||
var before = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop; |
|||
var after = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : noop; |
|||
Object.keys(visitors).forEach(function (visitor) { |
|||
if (!nodeAndUnionTypes.includes(visitor)) { |
|||
throw new Error("Unexpected visitor ".concat(visitor)); |
|||
} |
|||
}); |
|||
var context = { |
|||
node: node, |
|||
inList: false, |
|||
shouldStop: false, |
|||
parentPath: null, |
|||
parentKey: null |
|||
}; |
|||
walk(context, function (type, path) { |
|||
if (typeof visitors[type] === "function") { |
|||
before(type, path); |
|||
visitors[type](path); |
|||
after(type, path); |
|||
} |
|||
|
|||
var unionTypes = unionTypesMap[type]; |
|||
|
|||
if (!unionTypes) { |
|||
throw new Error("Unexpected node type ".concat(type)); |
|||
} |
|||
|
|||
unionTypes.forEach(function (unionType) { |
|||
if (typeof visitors[unionType] === "function") { |
|||
before(unionType, path); |
|||
visitors[unionType](path); |
|||
after(unionType, path); |
|||
} |
|||
}); |
|||
}); |
|||
} |
@ -0,0 +1,265 @@ |
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
import { signatures } from "./signatures"; |
|||
import { traverse } from "./traverse"; |
|||
import constants from "@webassemblyjs/helper-wasm-bytecode"; |
|||
import { getSectionForNode } from "@webassemblyjs/helper-wasm-bytecode"; |
|||
export function isAnonymous(ident) { |
|||
return ident.raw === ""; |
|||
} |
|||
export function getSectionMetadata(ast, name) { |
|||
var section; |
|||
traverse(ast, { |
|||
SectionMetadata: function (_SectionMetadata) { |
|||
function SectionMetadata(_x) { |
|||
return _SectionMetadata.apply(this, arguments); |
|||
} |
|||
|
|||
SectionMetadata.toString = function () { |
|||
return _SectionMetadata.toString(); |
|||
}; |
|||
|
|||
return SectionMetadata; |
|||
}(function (_ref) { |
|||
var node = _ref.node; |
|||
|
|||
if (node.section === name) { |
|||
section = node; |
|||
} |
|||
}) |
|||
}); |
|||
return section; |
|||
} |
|||
export function getSectionMetadatas(ast, name) { |
|||
var sections = []; |
|||
traverse(ast, { |
|||
SectionMetadata: function (_SectionMetadata2) { |
|||
function SectionMetadata(_x2) { |
|||
return _SectionMetadata2.apply(this, arguments); |
|||
} |
|||
|
|||
SectionMetadata.toString = function () { |
|||
return _SectionMetadata2.toString(); |
|||
}; |
|||
|
|||
return SectionMetadata; |
|||
}(function (_ref2) { |
|||
var node = _ref2.node; |
|||
|
|||
if (node.section === name) { |
|||
sections.push(node); |
|||
} |
|||
}) |
|||
}); |
|||
return sections; |
|||
} |
|||
export function sortSectionMetadata(m) { |
|||
if (m.metadata == null) { |
|||
console.warn("sortSectionMetadata: no metadata to sort"); |
|||
return; |
|||
} // $FlowIgnore
|
|||
|
|||
|
|||
m.metadata.sections.sort(function (a, b) { |
|||
var aId = constants.sections[a.section]; |
|||
var bId = constants.sections[b.section]; |
|||
|
|||
if (typeof aId !== "number" || typeof bId !== "number") { |
|||
throw new Error("Section id not found"); |
|||
} |
|||
|
|||
return aId - bId; |
|||
}); |
|||
} |
|||
export function orderedInsertNode(m, n) { |
|||
assertHasLoc(n); |
|||
var didInsert = false; |
|||
|
|||
if (n.type === "ModuleExport") { |
|||
m.fields.push(n); |
|||
return; |
|||
} |
|||
|
|||
m.fields = m.fields.reduce(function (acc, field) { |
|||
var fieldEndCol = Infinity; |
|||
|
|||
if (field.loc != null) { |
|||
// $FlowIgnore
|
|||
fieldEndCol = field.loc.end.column; |
|||
} // $FlowIgnore: assertHasLoc ensures that
|
|||
|
|||
|
|||
if (didInsert === false && n.loc.start.column < fieldEndCol) { |
|||
didInsert = true; |
|||
acc.push(n); |
|||
} |
|||
|
|||
acc.push(field); |
|||
return acc; |
|||
}, []); // Handles empty modules or n is the last element
|
|||
|
|||
if (didInsert === false) { |
|||
m.fields.push(n); |
|||
} |
|||
} |
|||
export function assertHasLoc(n) { |
|||
if (n.loc == null || n.loc.start == null || n.loc.end == null) { |
|||
throw new Error("Internal failure: node (".concat(JSON.stringify(n.type), ") has no location information")); |
|||
} |
|||
} |
|||
export function getEndOfSection(s) { |
|||
assertHasLoc(s.size); |
|||
return s.startOffset + s.size.value + ( // $FlowIgnore
|
|||
s.size.loc.end.column - s.size.loc.start.column); |
|||
} |
|||
export function shiftLoc(node, delta) { |
|||
// $FlowIgnore
|
|||
node.loc.start.column += delta; // $FlowIgnore
|
|||
|
|||
node.loc.end.column += delta; |
|||
} |
|||
export function shiftSection(ast, node, delta) { |
|||
if (node.type !== "SectionMetadata") { |
|||
throw new Error("Can not shift node " + JSON.stringify(node.type)); |
|||
} |
|||
|
|||
node.startOffset += delta; |
|||
|
|||
if (_typeof(node.size.loc) === "object") { |
|||
shiftLoc(node.size, delta); |
|||
} // Custom sections doesn't have vectorOfSize
|
|||
|
|||
|
|||
if (_typeof(node.vectorOfSize) === "object" && _typeof(node.vectorOfSize.loc) === "object") { |
|||
shiftLoc(node.vectorOfSize, delta); |
|||
} |
|||
|
|||
var sectionName = node.section; // shift node locations within that section
|
|||
|
|||
traverse(ast, { |
|||
Node: function Node(_ref3) { |
|||
var node = _ref3.node; |
|||
var section = getSectionForNode(node); |
|||
|
|||
if (section === sectionName && _typeof(node.loc) === "object") { |
|||
shiftLoc(node, delta); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
export function signatureForOpcode(object, name) { |
|||
var opcodeName = name; |
|||
|
|||
if (object !== undefined && object !== "") { |
|||
opcodeName = object + "." + name; |
|||
} |
|||
|
|||
var sign = signatures[opcodeName]; |
|||
|
|||
if (sign == undefined) { |
|||
// TODO: Uncomment this when br_table and others has been done
|
|||
//throw new Error("Invalid opcode: "+opcodeName);
|
|||
return [object, object]; |
|||
} |
|||
|
|||
return sign[0]; |
|||
} |
|||
export function getUniqueNameGenerator() { |
|||
var inc = {}; |
|||
return function () { |
|||
var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "temp"; |
|||
|
|||
if (!(prefix in inc)) { |
|||
inc[prefix] = 0; |
|||
} else { |
|||
inc[prefix] = inc[prefix] + 1; |
|||
} |
|||
|
|||
return prefix + "_" + inc[prefix]; |
|||
}; |
|||
} |
|||
export function getStartByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (typeof n.loc === "undefined" || typeof n.loc.start === "undefined") { |
|||
throw new Error( // $FlowIgnore
|
|||
"Can not get byte offset without loc informations, node: " + String(n.id)); |
|||
} |
|||
|
|||
return n.loc.start.column; |
|||
} |
|||
export function getEndByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (typeof n.loc === "undefined" || typeof n.loc.end === "undefined") { |
|||
throw new Error("Can not get byte offset without loc informations, node: " + n.type); |
|||
} |
|||
|
|||
return n.loc.end.column; |
|||
} |
|||
export function getFunctionBeginingByteOffset(n) { |
|||
if (!(n.body.length > 0)) { |
|||
throw new Error('n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var _n$body = _slicedToArray(n.body, 1), |
|||
firstInstruction = _n$body[0]; |
|||
|
|||
return getStartByteOffset(firstInstruction); |
|||
} |
|||
export function getEndBlockByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (!(n.instr.length > 0 || n.body.length > 0)) { |
|||
throw new Error('n.instr.length > 0 || n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var lastInstruction; |
|||
|
|||
if (n.instr) { |
|||
// $FlowIgnore
|
|||
lastInstruction = n.instr[n.instr.length - 1]; |
|||
} |
|||
|
|||
if (n.body) { |
|||
// $FlowIgnore
|
|||
lastInstruction = n.body[n.body.length - 1]; |
|||
} |
|||
|
|||
if (!(_typeof(lastInstruction) === "object")) { |
|||
throw new Error('typeof lastInstruction === "object"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
return getStartByteOffset(lastInstruction); |
|||
} |
|||
export function getStartBlockByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (!(n.instr.length > 0 || n.body.length > 0)) { |
|||
throw new Error('n.instr.length > 0 || n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var fistInstruction; |
|||
|
|||
if (n.instr) { |
|||
// $FlowIgnore
|
|||
var _n$instr = _slicedToArray(n.instr, 1); |
|||
|
|||
fistInstruction = _n$instr[0]; |
|||
} |
|||
|
|||
if (n.body) { |
|||
// $FlowIgnore
|
|||
var _n$body2 = _slicedToArray(n.body, 1); |
|||
|
|||
fistInstruction = _n$body2[0]; |
|||
} |
|||
|
|||
if (!(_typeof(fistInstruction) === "object")) { |
|||
throw new Error('typeof fistInstruction === "object"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
return getStartByteOffset(fistInstruction); |
|||
} |
@ -0,0 +1,17 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.cloneNode = cloneNode; |
|||
|
|||
function cloneNode(n) { |
|||
// $FlowIgnore
|
|||
var newObj = {}; |
|||
|
|||
for (var k in n) { |
|||
newObj[k] = n[k]; |
|||
} |
|||
|
|||
return newObj; |
|||
} |
@ -0,0 +1,663 @@ |
|||
var definitions = {}; |
|||
|
|||
function defineType(typeName, metadata) { |
|||
definitions[typeName] = metadata; |
|||
} |
|||
|
|||
defineType("Module", { |
|||
spec: { |
|||
wasm: "https://webassembly.github.io/spec/core/binary/modules.html#binary-module", |
|||
wat: "https://webassembly.github.io/spec/core/text/modules.html#text-module" |
|||
}, |
|||
doc: "A module consists of a sequence of sections (termed fields in the text format).", |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
fields: { |
|||
array: true, |
|||
type: "Node" |
|||
}, |
|||
metadata: { |
|||
optional: true, |
|||
type: "ModuleMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
sections: { |
|||
array: true, |
|||
type: "SectionMetadata" |
|||
}, |
|||
functionNames: { |
|||
optional: true, |
|||
array: true, |
|||
type: "FunctionNameMetadata" |
|||
}, |
|||
localNames: { |
|||
optional: true, |
|||
array: true, |
|||
type: "ModuleMetadata" |
|||
}, |
|||
producers: { |
|||
optional: true, |
|||
array: true, |
|||
type: "ProducersSectionMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FunctionNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
index: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LocalNameMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
localIndex: { |
|||
type: "number" |
|||
}, |
|||
functionIndex: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BinaryModule", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
blob: { |
|||
array: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("QuoteModule", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "string" |
|||
}, |
|||
string: { |
|||
array: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("SectionMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
section: { |
|||
type: "SectionName" |
|||
}, |
|||
startOffset: { |
|||
type: "number" |
|||
}, |
|||
size: { |
|||
type: "NumberLiteral" |
|||
}, |
|||
vectorOfSize: { |
|||
comment: "Size of the vector in the section (if any)", |
|||
type: "NumberLiteral" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducersSectionMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
producers: { |
|||
array: true, |
|||
type: "ProducerMetadata" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducerMetadata", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
language: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
}, |
|||
processedBy: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
}, |
|||
sdk: { |
|||
type: "ProducerMetadataVersionedName", |
|||
array: true |
|||
} |
|||
} |
|||
}); |
|||
defineType("ProducerMetadataVersionedName", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
version: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
/* |
|||
Instructions |
|||
*/ |
|||
|
|||
defineType("LoopInstruction", { |
|||
unionType: ["Node", "Block", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "loop" |
|||
}, |
|||
label: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
resulttype: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
}, |
|||
instr: { |
|||
array: true, |
|||
type: "Instruction" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Instr", { |
|||
unionType: ["Node", "Expression", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
type: "string" |
|||
}, |
|||
object: { |
|||
optional: true, |
|||
type: "Valtype" |
|||
}, |
|||
args: { |
|||
array: true, |
|||
type: "Expression" |
|||
}, |
|||
namedArgs: { |
|||
optional: true, |
|||
type: "Object" |
|||
} |
|||
} |
|||
}); |
|||
defineType("IfInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "if" |
|||
}, |
|||
testLabel: { |
|||
comment: "only for WAST", |
|||
type: "Identifier" |
|||
}, |
|||
test: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
result: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
}, |
|||
consequent: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
alternate: { |
|||
array: true, |
|||
type: "Instruction" |
|||
} |
|||
} |
|||
}); |
|||
/* |
|||
Concrete value types |
|||
*/ |
|||
|
|||
defineType("StringLiteral", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("NumberLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "number" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LongNumberLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "LongNumber" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FloatLiteral", { |
|||
unionType: ["Node", "NumericLiteral", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "number" |
|||
}, |
|||
nan: { |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
inf: { |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
raw: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Elem", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
table: { |
|||
type: "Index" |
|||
}, |
|||
offset: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
funcs: { |
|||
array: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("IndexInFuncSection", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
index: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ValtypeLiteral", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
name: { |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("TypeInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
maybe: true, |
|||
type: "Index" |
|||
}, |
|||
functype: { |
|||
type: "Signature" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Start", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
index: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("GlobalType", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
valtype: { |
|||
type: "Valtype" |
|||
}, |
|||
mutability: { |
|||
type: "Mutability" |
|||
} |
|||
} |
|||
}); |
|||
defineType("LeadingComment", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BlockComment", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Data", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
memoryIndex: { |
|||
type: "Memidx" |
|||
}, |
|||
offset: { |
|||
type: "Instruction" |
|||
}, |
|||
init: { |
|||
type: "ByteArray" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Global", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
globalType: { |
|||
type: "GlobalType" |
|||
}, |
|||
init: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
name: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Table", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
elementType: { |
|||
type: "TableElementType" |
|||
}, |
|||
limits: { |
|||
assertNodeType: true, |
|||
type: "Limit" |
|||
}, |
|||
name: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
elements: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Memory", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
limits: { |
|||
type: "Limit" |
|||
}, |
|||
id: { |
|||
maybe: true, |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("FuncImportDescr", { |
|||
unionType: ["Node", "ImportDescr"], |
|||
fields: { |
|||
id: { |
|||
type: "Identifier" |
|||
}, |
|||
signature: { |
|||
type: "Signature" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleImport", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
module: { |
|||
type: "string" |
|||
}, |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
descr: { |
|||
type: "ImportDescr" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleExportDescr", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
exportType: { |
|||
type: "ExportDescrType" |
|||
}, |
|||
id: { |
|||
type: "Index" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ModuleExport", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
name: { |
|||
type: "string" |
|||
}, |
|||
descr: { |
|||
type: "ModuleExportDescr" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Limit", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
min: { |
|||
type: "number" |
|||
}, |
|||
max: { |
|||
optional: true, |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Signature", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
params: { |
|||
array: true, |
|||
type: "FuncParam" |
|||
}, |
|||
results: { |
|||
array: true, |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Program", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
body: { |
|||
array: true, |
|||
type: "Node" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Identifier", { |
|||
unionType: ["Node", "Expression"], |
|||
fields: { |
|||
value: { |
|||
type: "string" |
|||
}, |
|||
raw: { |
|||
optional: true, |
|||
type: "string" |
|||
} |
|||
} |
|||
}); |
|||
defineType("BlockInstruction", { |
|||
unionType: ["Node", "Block", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "block" |
|||
}, |
|||
label: { |
|||
maybe: true, |
|||
type: "Identifier" |
|||
}, |
|||
instr: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
result: { |
|||
maybe: true, |
|||
type: "Valtype" |
|||
} |
|||
} |
|||
}); |
|||
defineType("CallInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "call" |
|||
}, |
|||
index: { |
|||
type: "Index" |
|||
}, |
|||
instrArgs: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Expression" |
|||
}, |
|||
numeric: { |
|||
type: "Index", |
|||
optional: true |
|||
} |
|||
} |
|||
}); |
|||
defineType("CallIndirectInstruction", { |
|||
unionType: ["Node", "Instruction"], |
|||
fields: { |
|||
id: { |
|||
constant: true, |
|||
type: "string", |
|||
value: "call_indirect" |
|||
}, |
|||
signature: { |
|||
type: "SignatureOrTypeRef" |
|||
}, |
|||
intrs: { |
|||
array: true, |
|||
optional: true, |
|||
type: "Expression" |
|||
} |
|||
} |
|||
}); |
|||
defineType("ByteArray", { |
|||
unionType: ["Node"], |
|||
fields: { |
|||
values: { |
|||
array: true, |
|||
type: "Byte" |
|||
} |
|||
} |
|||
}); |
|||
defineType("Func", { |
|||
unionType: ["Node", "Block"], |
|||
fields: { |
|||
name: { |
|||
maybe: true, |
|||
type: "Index" |
|||
}, |
|||
signature: { |
|||
type: "SignatureOrTypeRef" |
|||
}, |
|||
body: { |
|||
array: true, |
|||
type: "Instruction" |
|||
}, |
|||
isExternal: { |
|||
comment: "means that it has been imported from the outside js", |
|||
optional: true, |
|||
type: "boolean" |
|||
}, |
|||
metadata: { |
|||
optional: true, |
|||
type: "FuncMetadata" |
|||
} |
|||
} |
|||
}); |
|||
/** |
|||
* Intrinsics |
|||
*/ |
|||
|
|||
defineType("InternalBrUnless", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("InternalGoto", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); |
|||
defineType("InternalCallExtern", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: { |
|||
target: { |
|||
type: "number" |
|||
} |
|||
} |
|||
}); // function bodies are terminated by an `end` instruction but are missing a
|
|||
// return instruction
|
|||
//
|
|||
// Since we can't inject a new instruction we are injecting a new instruction.
|
|||
|
|||
defineType("InternalEndAndReturn", { |
|||
unionType: ["Node", "Intrinsic"], |
|||
fields: {} |
|||
}); |
|||
module.exports = definitions; |
@ -0,0 +1,118 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
var _exportNames = { |
|||
numberLiteralFromRaw: true, |
|||
withLoc: true, |
|||
withRaw: true, |
|||
funcParam: true, |
|||
indexLiteral: true, |
|||
memIndexLiteral: true, |
|||
instruction: true, |
|||
objectInstruction: true, |
|||
traverse: true, |
|||
signatures: true, |
|||
cloneNode: true |
|||
}; |
|||
Object.defineProperty(exports, "numberLiteralFromRaw", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.numberLiteralFromRaw; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "withLoc", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.withLoc; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "withRaw", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.withRaw; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "funcParam", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.funcParam; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "indexLiteral", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.indexLiteral; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "memIndexLiteral", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.memIndexLiteral; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "instruction", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.instruction; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "objectInstruction", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodeHelpers.objectInstruction; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "traverse", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _traverse.traverse; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "signatures", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _signatures.signatures; |
|||
} |
|||
}); |
|||
Object.defineProperty(exports, "cloneNode", { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _clone.cloneNode; |
|||
} |
|||
}); |
|||
|
|||
var _nodes = require("./nodes"); |
|||
|
|||
Object.keys(_nodes).forEach(function (key) { |
|||
if (key === "default" || key === "__esModule") return; |
|||
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; |
|||
Object.defineProperty(exports, key, { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _nodes[key]; |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
var _nodeHelpers = require("./node-helpers.js"); |
|||
|
|||
var _traverse = require("./traverse"); |
|||
|
|||
var _signatures = require("./signatures"); |
|||
|
|||
var _utils = require("./utils"); |
|||
|
|||
Object.keys(_utils).forEach(function (key) { |
|||
if (key === "default" || key === "__esModule") return; |
|||
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return; |
|||
Object.defineProperty(exports, key, { |
|||
enumerable: true, |
|||
get: function get() { |
|||
return _utils[key]; |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
var _clone = require("./clone"); |
@ -0,0 +1,107 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.numberLiteralFromRaw = numberLiteralFromRaw; |
|||
exports.instruction = instruction; |
|||
exports.objectInstruction = objectInstruction; |
|||
exports.withLoc = withLoc; |
|||
exports.withRaw = withRaw; |
|||
exports.funcParam = funcParam; |
|||
exports.indexLiteral = indexLiteral; |
|||
exports.memIndexLiteral = memIndexLiteral; |
|||
|
|||
var _wastParser = require("@webassemblyjs/wast-parser"); |
|||
|
|||
var _nodes = require("./nodes"); |
|||
|
|||
function numberLiteralFromRaw(rawValue) { |
|||
var instructionType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "i32"; |
|||
var original = rawValue; // Remove numeric separators _
|
|||
|
|||
if (typeof rawValue === "string") { |
|||
rawValue = rawValue.replace(/_/g, ""); |
|||
} |
|||
|
|||
if (typeof rawValue === "number") { |
|||
return (0, _nodes.numberLiteral)(rawValue, String(original)); |
|||
} else { |
|||
switch (instructionType) { |
|||
case "i32": |
|||
{ |
|||
return (0, _nodes.numberLiteral)((0, _wastParser.parse32I)(rawValue), String(original)); |
|||
} |
|||
|
|||
case "u32": |
|||
{ |
|||
return (0, _nodes.numberLiteral)((0, _wastParser.parseU32)(rawValue), String(original)); |
|||
} |
|||
|
|||
case "i64": |
|||
{ |
|||
return (0, _nodes.longNumberLiteral)((0, _wastParser.parse64I)(rawValue), String(original)); |
|||
} |
|||
|
|||
case "f32": |
|||
{ |
|||
return (0, _nodes.floatLiteral)((0, _wastParser.parse32F)(rawValue), (0, _wastParser.isNanLiteral)(rawValue), (0, _wastParser.isInfLiteral)(rawValue), String(original)); |
|||
} |
|||
// f64
|
|||
|
|||
default: |
|||
{ |
|||
return (0, _nodes.floatLiteral)((0, _wastParser.parse64F)(rawValue), (0, _wastParser.isNanLiteral)(rawValue), (0, _wastParser.isInfLiteral)(rawValue), String(original)); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
function instruction(id) { |
|||
var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; |
|||
var namedArgs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
|||
return (0, _nodes.instr)(id, undefined, args, namedArgs); |
|||
} |
|||
|
|||
function objectInstruction(id, object) { |
|||
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; |
|||
var namedArgs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; |
|||
return (0, _nodes.instr)(id, object, args, namedArgs); |
|||
} |
|||
/** |
|||
* Decorators |
|||
*/ |
|||
|
|||
|
|||
function withLoc(n, end, start) { |
|||
var loc = { |
|||
start: start, |
|||
end: end |
|||
}; |
|||
n.loc = loc; |
|||
return n; |
|||
} |
|||
|
|||
function withRaw(n, raw) { |
|||
n.raw = raw; |
|||
return n; |
|||
} |
|||
|
|||
function funcParam(valtype, id) { |
|||
return { |
|||
id: id, |
|||
valtype: valtype |
|||
}; |
|||
} |
|||
|
|||
function indexLiteral(value) { |
|||
// $FlowIgnore
|
|||
var x = numberLiteralFromRaw(value, "u32"); |
|||
return x; |
|||
} |
|||
|
|||
function memIndexLiteral(value) { |
|||
// $FlowIgnore
|
|||
var x = numberLiteralFromRaw(value, "u32"); |
|||
return x; |
|||
} |
@ -0,0 +1,144 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.createPath = createPath; |
|||
|
|||
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } |
|||
|
|||
function findParent(_ref, cb) { |
|||
var parentPath = _ref.parentPath; |
|||
|
|||
if (parentPath == null) { |
|||
throw new Error("node is root"); |
|||
} |
|||
|
|||
var currentPath = parentPath; |
|||
|
|||
while (cb(currentPath) !== false) { |
|||
// Hit the root node, stop
|
|||
// $FlowIgnore
|
|||
if (currentPath.parentPath == null) { |
|||
return null; |
|||
} // $FlowIgnore
|
|||
|
|||
|
|||
currentPath = currentPath.parentPath; |
|||
} |
|||
|
|||
return currentPath.node; |
|||
} |
|||
|
|||
function insertBefore(context, newNode) { |
|||
return insert(context, newNode); |
|||
} |
|||
|
|||
function insertAfter(context, newNode) { |
|||
return insert(context, newNode, 1); |
|||
} |
|||
|
|||
function insert(_ref2, newNode) { |
|||
var node = _ref2.node, |
|||
inList = _ref2.inList, |
|||
parentPath = _ref2.parentPath, |
|||
parentKey = _ref2.parentKey; |
|||
var indexOffset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; |
|||
|
|||
if (!inList) { |
|||
throw new Error('inList' + " error: " + ("insert can only be used for nodes that are within lists" || "unknown")); |
|||
} |
|||
|
|||
if (!(parentPath != null)) { |
|||
throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
var parentList = parentPath.node[parentKey]; |
|||
var indexInList = parentList.findIndex(function (n) { |
|||
return n === node; |
|||
}); |
|||
parentList.splice(indexInList + indexOffset, 0, newNode); |
|||
} |
|||
|
|||
function remove(_ref3) { |
|||
var node = _ref3.node, |
|||
parentKey = _ref3.parentKey, |
|||
parentPath = _ref3.parentPath; |
|||
|
|||
if (!(parentPath != null)) { |
|||
throw new Error('parentPath != null' + " error: " + ("Can not remove root node" || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
var parentNode = parentPath.node; // $FlowIgnore
|
|||
|
|||
var parentProperty = parentNode[parentKey]; |
|||
|
|||
if (Array.isArray(parentProperty)) { |
|||
// $FlowIgnore
|
|||
parentNode[parentKey] = parentProperty.filter(function (n) { |
|||
return n !== node; |
|||
}); |
|||
} else { |
|||
// $FlowIgnore
|
|||
delete parentNode[parentKey]; |
|||
} |
|||
|
|||
node._deleted = true; |
|||
} |
|||
|
|||
function stop(context) { |
|||
context.shouldStop = true; |
|||
} |
|||
|
|||
function replaceWith(context, newNode) { |
|||
// $FlowIgnore
|
|||
var parentNode = context.parentPath.node; // $FlowIgnore
|
|||
|
|||
var parentProperty = parentNode[context.parentKey]; |
|||
|
|||
if (Array.isArray(parentProperty)) { |
|||
var indexInList = parentProperty.findIndex(function (n) { |
|||
return n === context.node; |
|||
}); |
|||
parentProperty.splice(indexInList, 1, newNode); |
|||
} else { |
|||
// $FlowIgnore
|
|||
parentNode[context.parentKey] = newNode; |
|||
} |
|||
|
|||
context.node._deleted = true; |
|||
context.node = newNode; |
|||
} // bind the context to the first argument of node operations
|
|||
|
|||
|
|||
function bindNodeOperations(operations, context) { |
|||
var keys = Object.keys(operations); |
|||
var boundOperations = {}; |
|||
keys.forEach(function (key) { |
|||
boundOperations[key] = operations[key].bind(null, context); |
|||
}); |
|||
return boundOperations; |
|||
} |
|||
|
|||
function createPathOperations(context) { |
|||
// $FlowIgnore
|
|||
return bindNodeOperations({ |
|||
findParent: findParent, |
|||
replaceWith: replaceWith, |
|||
remove: remove, |
|||
insertBefore: insertBefore, |
|||
insertAfter: insertAfter, |
|||
stop: stop |
|||
}, context); |
|||
} |
|||
|
|||
function createPath(context) { |
|||
var path = _extends({}, context); // $FlowIgnore
|
|||
|
|||
|
|||
Object.assign(path, createPathOperations(path)); // $FlowIgnore
|
|||
|
|||
return path; |
|||
} |
File diff suppressed because it is too large
@ -0,0 +1,207 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.signatures = void 0; |
|||
|
|||
function sign(input, output) { |
|||
return [input, output]; |
|||
} |
|||
|
|||
var u32 = "u32"; |
|||
var i32 = "i32"; |
|||
var i64 = "i64"; |
|||
var f32 = "f32"; |
|||
var f64 = "f64"; |
|||
|
|||
var vector = function vector(t) { |
|||
var vecType = [t]; // $FlowIgnore
|
|||
|
|||
vecType.vector = true; |
|||
return vecType; |
|||
}; |
|||
|
|||
var controlInstructions = { |
|||
unreachable: sign([], []), |
|||
nop: sign([], []), |
|||
// block ?
|
|||
// loop ?
|
|||
// if ?
|
|||
// if else ?
|
|||
br: sign([u32], []), |
|||
br_if: sign([u32], []), |
|||
br_table: sign(vector(u32), []), |
|||
return: sign([], []), |
|||
call: sign([u32], []), |
|||
call_indirect: sign([u32], []) |
|||
}; |
|||
var parametricInstructions = { |
|||
drop: sign([], []), |
|||
select: sign([], []) |
|||
}; |
|||
var variableInstructions = { |
|||
get_local: sign([u32], []), |
|||
set_local: sign([u32], []), |
|||
tee_local: sign([u32], []), |
|||
get_global: sign([u32], []), |
|||
set_global: sign([u32], []) |
|||
}; |
|||
var memoryInstructions = { |
|||
"i32.load": sign([u32, u32], [i32]), |
|||
"i64.load": sign([u32, u32], []), |
|||
"f32.load": sign([u32, u32], []), |
|||
"f64.load": sign([u32, u32], []), |
|||
"i32.load8_s": sign([u32, u32], [i32]), |
|||
"i32.load8_u": sign([u32, u32], [i32]), |
|||
"i32.load16_s": sign([u32, u32], [i32]), |
|||
"i32.load16_u": sign([u32, u32], [i32]), |
|||
"i64.load8_s": sign([u32, u32], [i64]), |
|||
"i64.load8_u": sign([u32, u32], [i64]), |
|||
"i64.load16_s": sign([u32, u32], [i64]), |
|||
"i64.load16_u": sign([u32, u32], [i64]), |
|||
"i64.load32_s": sign([u32, u32], [i64]), |
|||
"i64.load32_u": sign([u32, u32], [i64]), |
|||
"i32.store": sign([u32, u32], []), |
|||
"i64.store": sign([u32, u32], []), |
|||
"f32.store": sign([u32, u32], []), |
|||
"f64.store": sign([u32, u32], []), |
|||
"i32.store8": sign([u32, u32], []), |
|||
"i32.store16": sign([u32, u32], []), |
|||
"i64.store8": sign([u32, u32], []), |
|||
"i64.store16": sign([u32, u32], []), |
|||
"i64.store32": sign([u32, u32], []), |
|||
current_memory: sign([], []), |
|||
grow_memory: sign([], []) |
|||
}; |
|||
var numericInstructions = { |
|||
"i32.const": sign([i32], [i32]), |
|||
"i64.const": sign([i64], [i64]), |
|||
"f32.const": sign([f32], [f32]), |
|||
"f64.const": sign([f64], [f64]), |
|||
"i32.eqz": sign([i32], [i32]), |
|||
"i32.eq": sign([i32, i32], [i32]), |
|||
"i32.ne": sign([i32, i32], [i32]), |
|||
"i32.lt_s": sign([i32, i32], [i32]), |
|||
"i32.lt_u": sign([i32, i32], [i32]), |
|||
"i32.gt_s": sign([i32, i32], [i32]), |
|||
"i32.gt_u": sign([i32, i32], [i32]), |
|||
"i32.le_s": sign([i32, i32], [i32]), |
|||
"i32.le_u": sign([i32, i32], [i32]), |
|||
"i32.ge_s": sign([i32, i32], [i32]), |
|||
"i32.ge_u": sign([i32, i32], [i32]), |
|||
"i64.eqz": sign([i64], [i64]), |
|||
"i64.eq": sign([i64, i64], [i32]), |
|||
"i64.ne": sign([i64, i64], [i32]), |
|||
"i64.lt_s": sign([i64, i64], [i32]), |
|||
"i64.lt_u": sign([i64, i64], [i32]), |
|||
"i64.gt_s": sign([i64, i64], [i32]), |
|||
"i64.gt_u": sign([i64, i64], [i32]), |
|||
"i64.le_s": sign([i64, i64], [i32]), |
|||
"i64.le_u": sign([i64, i64], [i32]), |
|||
"i64.ge_s": sign([i64, i64], [i32]), |
|||
"i64.ge_u": sign([i64, i64], [i32]), |
|||
"f32.eq": sign([f32, f32], [i32]), |
|||
"f32.ne": sign([f32, f32], [i32]), |
|||
"f32.lt": sign([f32, f32], [i32]), |
|||
"f32.gt": sign([f32, f32], [i32]), |
|||
"f32.le": sign([f32, f32], [i32]), |
|||
"f32.ge": sign([f32, f32], [i32]), |
|||
"f64.eq": sign([f64, f64], [i32]), |
|||
"f64.ne": sign([f64, f64], [i32]), |
|||
"f64.lt": sign([f64, f64], [i32]), |
|||
"f64.gt": sign([f64, f64], [i32]), |
|||
"f64.le": sign([f64, f64], [i32]), |
|||
"f64.ge": sign([f64, f64], [i32]), |
|||
"i32.clz": sign([i32], [i32]), |
|||
"i32.ctz": sign([i32], [i32]), |
|||
"i32.popcnt": sign([i32], [i32]), |
|||
"i32.add": sign([i32, i32], [i32]), |
|||
"i32.sub": sign([i32, i32], [i32]), |
|||
"i32.mul": sign([i32, i32], [i32]), |
|||
"i32.div_s": sign([i32, i32], [i32]), |
|||
"i32.div_u": sign([i32, i32], [i32]), |
|||
"i32.rem_s": sign([i32, i32], [i32]), |
|||
"i32.rem_u": sign([i32, i32], [i32]), |
|||
"i32.and": sign([i32, i32], [i32]), |
|||
"i32.or": sign([i32, i32], [i32]), |
|||
"i32.xor": sign([i32, i32], [i32]), |
|||
"i32.shl": sign([i32, i32], [i32]), |
|||
"i32.shr_s": sign([i32, i32], [i32]), |
|||
"i32.shr_u": sign([i32, i32], [i32]), |
|||
"i32.rotl": sign([i32, i32], [i32]), |
|||
"i32.rotr": sign([i32, i32], [i32]), |
|||
"i64.clz": sign([i64], [i64]), |
|||
"i64.ctz": sign([i64], [i64]), |
|||
"i64.popcnt": sign([i64], [i64]), |
|||
"i64.add": sign([i64, i64], [i64]), |
|||
"i64.sub": sign([i64, i64], [i64]), |
|||
"i64.mul": sign([i64, i64], [i64]), |
|||
"i64.div_s": sign([i64, i64], [i64]), |
|||
"i64.div_u": sign([i64, i64], [i64]), |
|||
"i64.rem_s": sign([i64, i64], [i64]), |
|||
"i64.rem_u": sign([i64, i64], [i64]), |
|||
"i64.and": sign([i64, i64], [i64]), |
|||
"i64.or": sign([i64, i64], [i64]), |
|||
"i64.xor": sign([i64, i64], [i64]), |
|||
"i64.shl": sign([i64, i64], [i64]), |
|||
"i64.shr_s": sign([i64, i64], [i64]), |
|||
"i64.shr_u": sign([i64, i64], [i64]), |
|||
"i64.rotl": sign([i64, i64], [i64]), |
|||
"i64.rotr": sign([i64, i64], [i64]), |
|||
"f32.abs": sign([f32], [f32]), |
|||
"f32.neg": sign([f32], [f32]), |
|||
"f32.ceil": sign([f32], [f32]), |
|||
"f32.floor": sign([f32], [f32]), |
|||
"f32.trunc": sign([f32], [f32]), |
|||
"f32.nearest": sign([f32], [f32]), |
|||
"f32.sqrt": sign([f32], [f32]), |
|||
"f32.add": sign([f32, f32], [f32]), |
|||
"f32.sub": sign([f32, f32], [f32]), |
|||
"f32.mul": sign([f32, f32], [f32]), |
|||
"f32.div": sign([f32, f32], [f32]), |
|||
"f32.min": sign([f32, f32], [f32]), |
|||
"f32.max": sign([f32, f32], [f32]), |
|||
"f32.copysign": sign([f32, f32], [f32]), |
|||
"f64.abs": sign([f64], [f64]), |
|||
"f64.neg": sign([f64], [f64]), |
|||
"f64.ceil": sign([f64], [f64]), |
|||
"f64.floor": sign([f64], [f64]), |
|||
"f64.trunc": sign([f64], [f64]), |
|||
"f64.nearest": sign([f64], [f64]), |
|||
"f64.sqrt": sign([f64], [f64]), |
|||
"f64.add": sign([f64, f64], [f64]), |
|||
"f64.sub": sign([f64, f64], [f64]), |
|||
"f64.mul": sign([f64, f64], [f64]), |
|||
"f64.div": sign([f64, f64], [f64]), |
|||
"f64.min": sign([f64, f64], [f64]), |
|||
"f64.max": sign([f64, f64], [f64]), |
|||
"f64.copysign": sign([f64, f64], [f64]), |
|||
"i32.wrap/i64": sign([i64], [i32]), |
|||
"i32.trunc_s/f32": sign([f32], [i32]), |
|||
"i32.trunc_u/f32": sign([f32], [i32]), |
|||
"i32.trunc_s/f64": sign([f32], [i32]), |
|||
"i32.trunc_u/f64": sign([f64], [i32]), |
|||
"i64.extend_s/i32": sign([i32], [i64]), |
|||
"i64.extend_u/i32": sign([i32], [i64]), |
|||
"i64.trunc_s/f32": sign([f32], [i64]), |
|||
"i64.trunc_u/f32": sign([f32], [i64]), |
|||
"i64.trunc_s/f64": sign([f64], [i64]), |
|||
"i64.trunc_u/f64": sign([f64], [i64]), |
|||
"f32.convert_s/i32": sign([i32], [f32]), |
|||
"f32.convert_u/i32": sign([i32], [f32]), |
|||
"f32.convert_s/i64": sign([i64], [f32]), |
|||
"f32.convert_u/i64": sign([i64], [f32]), |
|||
"f32.demote/f64": sign([f64], [f32]), |
|||
"f64.convert_s/i32": sign([i32], [f64]), |
|||
"f64.convert_u/i32": sign([i32], [f64]), |
|||
"f64.convert_s/i64": sign([i64], [f64]), |
|||
"f64.convert_u/i64": sign([i64], [f64]), |
|||
"f64.promote/f32": sign([f32], [f64]), |
|||
"i32.reinterpret/f32": sign([f32], [i32]), |
|||
"i64.reinterpret/f64": sign([f64], [i64]), |
|||
"f32.reinterpret/i32": sign([i32], [f32]), |
|||
"f64.reinterpret/i64": sign([i64], [f64]) |
|||
}; |
|||
var signatures = Object.assign({}, controlInstructions, parametricInstructions, variableInstructions, memoryInstructions, numericInstructions); |
|||
exports.signatures = signatures; |
@ -0,0 +1,83 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.transform = transform; |
|||
|
|||
var t = require("../../index"); // func and call_indirect instructions can either define a signature inline, or
|
|||
// reference a signature, e.g.
|
|||
//
|
|||
// ;; inline signature
|
|||
// (func (result i64)
|
|||
// (i64.const 2)
|
|||
// )
|
|||
// ;; signature reference
|
|||
// (type (func (result i64)))
|
|||
// (func (type 0)
|
|||
// (i64.const 2))
|
|||
// )
|
|||
//
|
|||
// this AST transform denormalises the type references, making all signatures within the module
|
|||
// inline.
|
|||
|
|||
|
|||
function transform(ast) { |
|||
var typeInstructions = []; |
|||
t.traverse(ast, { |
|||
TypeInstruction: function TypeInstruction(_ref) { |
|||
var node = _ref.node; |
|||
typeInstructions.push(node); |
|||
} |
|||
}); |
|||
|
|||
if (!typeInstructions.length) { |
|||
return; |
|||
} |
|||
|
|||
function denormalizeSignature(signature) { |
|||
// signature referenced by identifier
|
|||
if (signature.type === "Identifier") { |
|||
var identifier = signature; |
|||
var typeInstruction = typeInstructions.find(function (t) { |
|||
return t.id.type === identifier.type && t.id.value === identifier.value; |
|||
}); |
|||
|
|||
if (!typeInstruction) { |
|||
throw new Error("A type instruction reference was not found ".concat(JSON.stringify(signature))); |
|||
} |
|||
|
|||
return typeInstruction.functype; |
|||
} // signature referenced by index
|
|||
|
|||
|
|||
if (signature.type === "NumberLiteral") { |
|||
var signatureRef = signature; |
|||
var _typeInstruction = typeInstructions[signatureRef.value]; |
|||
return _typeInstruction.functype; |
|||
} |
|||
|
|||
return signature; |
|||
} |
|||
|
|||
t.traverse(ast, { |
|||
Func: function (_Func) { |
|||
function Func(_x) { |
|||
return _Func.apply(this, arguments); |
|||
} |
|||
|
|||
Func.toString = function () { |
|||
return _Func.toString(); |
|||
}; |
|||
|
|||
return Func; |
|||
}(function (_ref2) { |
|||
var node = _ref2.node; |
|||
node.signature = denormalizeSignature(node.signature); |
|||
}), |
|||
CallIndirectInstruction: function CallIndirectInstruction(_ref3) { |
|||
var node = _ref3.node; |
|||
node.signature = denormalizeSignature(node.signature); |
|||
} |
|||
}); |
|||
} |
@ -0,0 +1,225 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.transform = transform; |
|||
|
|||
var _index = require("../../index"); |
|||
|
|||
var _helperModuleContext = require("@webassemblyjs/helper-module-context"); |
|||
|
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
// FIXME(sven): do the same with all block instructions, must be more generic here
|
|||
function newUnexpectedFunction(i) { |
|||
return new Error("unknown function at offset: " + i); |
|||
} |
|||
|
|||
function transform(ast) { |
|||
var module; |
|||
(0, _index.traverse)(ast, { |
|||
Module: function (_Module) { |
|||
function Module(_x) { |
|||
return _Module.apply(this, arguments); |
|||
} |
|||
|
|||
Module.toString = function () { |
|||
return _Module.toString(); |
|||
}; |
|||
|
|||
return Module; |
|||
}(function (path) { |
|||
module = path.node; |
|||
}) |
|||
}); |
|||
var moduleContext = (0, _helperModuleContext.moduleContextFromModuleAST)(module); // Transform the actual instruction in function bodies
|
|||
|
|||
(0, _index.traverse)(ast, { |
|||
Func: function (_Func) { |
|||
function Func(_x2) { |
|||
return _Func.apply(this, arguments); |
|||
} |
|||
|
|||
Func.toString = function () { |
|||
return _Func.toString(); |
|||
}; |
|||
|
|||
return Func; |
|||
}(function (path) { |
|||
transformFuncPath(path, moduleContext); |
|||
}), |
|||
Start: function (_Start) { |
|||
function Start(_x3) { |
|||
return _Start.apply(this, arguments); |
|||
} |
|||
|
|||
Start.toString = function () { |
|||
return _Start.toString(); |
|||
}; |
|||
|
|||
return Start; |
|||
}(function (path) { |
|||
var index = path.node.index; |
|||
|
|||
if ((0, _index.isIdentifier)(index) === true) { |
|||
var offsetInModule = moduleContext.getFunctionOffsetByIdentifier(index.value); |
|||
|
|||
if (typeof offsetInModule === "undefined") { |
|||
throw newUnexpectedFunction(index.value); |
|||
} // Replace the index Identifier
|
|||
// $FlowIgnore: reference?
|
|||
|
|||
|
|||
path.node.index = (0, _index.numberLiteralFromRaw)(offsetInModule); |
|||
} |
|||
}) |
|||
}); |
|||
} |
|||
|
|||
function transformFuncPath(funcPath, moduleContext) { |
|||
var funcNode = funcPath.node; |
|||
var signature = funcNode.signature; |
|||
|
|||
if (signature.type !== "Signature") { |
|||
throw new Error("Function signatures must be denormalised before execution"); |
|||
} |
|||
|
|||
var params = signature.params; // Add func locals in the context
|
|||
|
|||
params.forEach(function (p) { |
|||
return moduleContext.addLocal(p.valtype); |
|||
}); |
|||
(0, _index.traverse)(funcNode, { |
|||
Instr: function (_Instr) { |
|||
function Instr(_x4) { |
|||
return _Instr.apply(this, arguments); |
|||
} |
|||
|
|||
Instr.toString = function () { |
|||
return _Instr.toString(); |
|||
}; |
|||
|
|||
return Instr; |
|||
}(function (instrPath) { |
|||
var instrNode = instrPath.node; |
|||
/** |
|||
* Local access |
|||
*/ |
|||
|
|||
if (instrNode.id === "get_local" || instrNode.id === "set_local" || instrNode.id === "tee_local") { |
|||
var _instrNode$args = _slicedToArray(instrNode.args, 1), |
|||
firstArg = _instrNode$args[0]; |
|||
|
|||
if (firstArg.type === "Identifier") { |
|||
var offsetInParams = params.findIndex(function (_ref) { |
|||
var id = _ref.id; |
|||
return id === firstArg.value; |
|||
}); |
|||
|
|||
if (offsetInParams === -1) { |
|||
throw new Error("".concat(firstArg.value, " not found in ").concat(instrNode.id, ": not declared in func params")); |
|||
} // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
|
|||
instrNode.args[0] = (0, _index.numberLiteralFromRaw)(offsetInParams); |
|||
} |
|||
} |
|||
/** |
|||
* Global access |
|||
*/ |
|||
|
|||
|
|||
if (instrNode.id === "get_global" || instrNode.id === "set_global") { |
|||
var _instrNode$args2 = _slicedToArray(instrNode.args, 1), |
|||
_firstArg = _instrNode$args2[0]; |
|||
|
|||
if ((0, _index.isIdentifier)(_firstArg) === true) { |
|||
var globalOffset = moduleContext.getGlobalOffsetByIdentifier( // $FlowIgnore: reference?
|
|||
_firstArg.value); |
|||
|
|||
if (typeof globalOffset === "undefined") { |
|||
// $FlowIgnore: reference?
|
|||
throw new Error("global ".concat(_firstArg.value, " not found in module")); |
|||
} // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
|
|||
instrNode.args[0] = (0, _index.numberLiteralFromRaw)(globalOffset); |
|||
} |
|||
} |
|||
/** |
|||
* Labels lookup |
|||
*/ |
|||
|
|||
|
|||
if (instrNode.id === "br") { |
|||
var _instrNode$args3 = _slicedToArray(instrNode.args, 1), |
|||
_firstArg2 = _instrNode$args3[0]; |
|||
|
|||
if ((0, _index.isIdentifier)(_firstArg2) === true) { |
|||
// if the labels is not found it is going to be replaced with -1
|
|||
// which is invalid.
|
|||
var relativeBlockCount = -1; // $FlowIgnore: reference?
|
|||
|
|||
instrPath.findParent(function (_ref2) { |
|||
var node = _ref2.node; |
|||
|
|||
if ((0, _index.isBlock)(node)) { |
|||
relativeBlockCount++; // $FlowIgnore: reference?
|
|||
|
|||
var name = node.label || node.name; |
|||
|
|||
if (_typeof(name) === "object") { |
|||
// $FlowIgnore: isIdentifier ensures that
|
|||
if (name.value === _firstArg2.value) { |
|||
// Found it
|
|||
return false; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if ((0, _index.isFunc)(node)) { |
|||
return false; |
|||
} |
|||
}); // Replace the Identifer node by our new NumberLiteral node
|
|||
|
|||
instrNode.args[0] = (0, _index.numberLiteralFromRaw)(relativeBlockCount); |
|||
} |
|||
} |
|||
}), |
|||
|
|||
/** |
|||
* Func lookup |
|||
*/ |
|||
CallInstruction: function (_CallInstruction) { |
|||
function CallInstruction(_x5) { |
|||
return _CallInstruction.apply(this, arguments); |
|||
} |
|||
|
|||
CallInstruction.toString = function () { |
|||
return _CallInstruction.toString(); |
|||
}; |
|||
|
|||
return CallInstruction; |
|||
}(function (_ref3) { |
|||
var node = _ref3.node; |
|||
var index = node.index; |
|||
|
|||
if ((0, _index.isIdentifier)(index) === true) { |
|||
var offsetInModule = moduleContext.getFunctionOffsetByIdentifier(index.value); |
|||
|
|||
if (typeof offsetInModule === "undefined") { |
|||
throw newUnexpectedFunction(index.value); |
|||
} // Replace the index Identifier
|
|||
// $FlowIgnore: reference?
|
|||
|
|||
|
|||
node.index = (0, _index.numberLiteralFromRaw)(offsetInModule); |
|||
} |
|||
}) |
|||
}); |
|||
} |
@ -0,0 +1,105 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.traverse = traverse; |
|||
|
|||
var _nodePath = require("./node-path"); |
|||
|
|||
var _nodes = require("./nodes"); |
|||
|
|||
// recursively walks the AST starting at the given node. The callback is invoked for
|
|||
// and object that has a 'type' property.
|
|||
function walk(context, callback) { |
|||
var stop = false; |
|||
|
|||
function innerWalk(context, callback) { |
|||
if (stop) { |
|||
return; |
|||
} |
|||
|
|||
var node = context.node; |
|||
|
|||
if (node === undefined) { |
|||
console.warn("traversing with an empty context"); |
|||
return; |
|||
} |
|||
|
|||
if (node._deleted === true) { |
|||
return; |
|||
} |
|||
|
|||
var path = (0, _nodePath.createPath)(context); |
|||
callback(node.type, path); |
|||
|
|||
if (path.shouldStop) { |
|||
stop = true; |
|||
return; |
|||
} |
|||
|
|||
Object.keys(node).forEach(function (prop) { |
|||
var value = node[prop]; |
|||
|
|||
if (value === null || value === undefined) { |
|||
return; |
|||
} |
|||
|
|||
var valueAsArray = Array.isArray(value) ? value : [value]; |
|||
valueAsArray.forEach(function (childNode) { |
|||
if (typeof childNode.type === "string") { |
|||
var childContext = { |
|||
node: childNode, |
|||
parentKey: prop, |
|||
parentPath: path, |
|||
shouldStop: false, |
|||
inList: Array.isArray(value) |
|||
}; |
|||
innerWalk(childContext, callback); |
|||
} |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
innerWalk(context, callback); |
|||
} |
|||
|
|||
var noop = function noop() {}; |
|||
|
|||
function traverse(node, visitors) { |
|||
var before = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : noop; |
|||
var after = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : noop; |
|||
Object.keys(visitors).forEach(function (visitor) { |
|||
if (!_nodes.nodeAndUnionTypes.includes(visitor)) { |
|||
throw new Error("Unexpected visitor ".concat(visitor)); |
|||
} |
|||
}); |
|||
var context = { |
|||
node: node, |
|||
inList: false, |
|||
shouldStop: false, |
|||
parentPath: null, |
|||
parentKey: null |
|||
}; |
|||
walk(context, function (type, path) { |
|||
if (typeof visitors[type] === "function") { |
|||
before(type, path); |
|||
visitors[type](path); |
|||
after(type, path); |
|||
} |
|||
|
|||
var unionTypes = _nodes.unionTypesMap[type]; |
|||
|
|||
if (!unionTypes) { |
|||
throw new Error("Unexpected node type ".concat(type)); |
|||
} |
|||
|
|||
unionTypes.forEach(function (unionType) { |
|||
if (typeof visitors[unionType] === "function") { |
|||
before(unionType, path); |
|||
visitors[unionType](path); |
|||
after(unionType, path); |
|||
} |
|||
}); |
|||
}); |
|||
} |
@ -0,0 +1,306 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.isAnonymous = isAnonymous; |
|||
exports.getSectionMetadata = getSectionMetadata; |
|||
exports.getSectionMetadatas = getSectionMetadatas; |
|||
exports.sortSectionMetadata = sortSectionMetadata; |
|||
exports.orderedInsertNode = orderedInsertNode; |
|||
exports.assertHasLoc = assertHasLoc; |
|||
exports.getEndOfSection = getEndOfSection; |
|||
exports.shiftLoc = shiftLoc; |
|||
exports.shiftSection = shiftSection; |
|||
exports.signatureForOpcode = signatureForOpcode; |
|||
exports.getUniqueNameGenerator = getUniqueNameGenerator; |
|||
exports.getStartByteOffset = getStartByteOffset; |
|||
exports.getEndByteOffset = getEndByteOffset; |
|||
exports.getFunctionBeginingByteOffset = getFunctionBeginingByteOffset; |
|||
exports.getEndBlockByteOffset = getEndBlockByteOffset; |
|||
exports.getStartBlockByteOffset = getStartBlockByteOffset; |
|||
|
|||
var _signatures = require("./signatures"); |
|||
|
|||
var _traverse = require("./traverse"); |
|||
|
|||
var _helperWasmBytecode = _interopRequireWildcard(require("@webassemblyjs/helper-wasm-bytecode")); |
|||
|
|||
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } |
|||
|
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
function isAnonymous(ident) { |
|||
return ident.raw === ""; |
|||
} |
|||
|
|||
function getSectionMetadata(ast, name) { |
|||
var section; |
|||
(0, _traverse.traverse)(ast, { |
|||
SectionMetadata: function (_SectionMetadata) { |
|||
function SectionMetadata(_x) { |
|||
return _SectionMetadata.apply(this, arguments); |
|||
} |
|||
|
|||
SectionMetadata.toString = function () { |
|||
return _SectionMetadata.toString(); |
|||
}; |
|||
|
|||
return SectionMetadata; |
|||
}(function (_ref) { |
|||
var node = _ref.node; |
|||
|
|||
if (node.section === name) { |
|||
section = node; |
|||
} |
|||
}) |
|||
}); |
|||
return section; |
|||
} |
|||
|
|||
function getSectionMetadatas(ast, name) { |
|||
var sections = []; |
|||
(0, _traverse.traverse)(ast, { |
|||
SectionMetadata: function (_SectionMetadata2) { |
|||
function SectionMetadata(_x2) { |
|||
return _SectionMetadata2.apply(this, arguments); |
|||
} |
|||
|
|||
SectionMetadata.toString = function () { |
|||
return _SectionMetadata2.toString(); |
|||
}; |
|||
|
|||
return SectionMetadata; |
|||
}(function (_ref2) { |
|||
var node = _ref2.node; |
|||
|
|||
if (node.section === name) { |
|||
sections.push(node); |
|||
} |
|||
}) |
|||
}); |
|||
return sections; |
|||
} |
|||
|
|||
function sortSectionMetadata(m) { |
|||
if (m.metadata == null) { |
|||
console.warn("sortSectionMetadata: no metadata to sort"); |
|||
return; |
|||
} // $FlowIgnore
|
|||
|
|||
|
|||
m.metadata.sections.sort(function (a, b) { |
|||
var aId = _helperWasmBytecode.default.sections[a.section]; |
|||
var bId = _helperWasmBytecode.default.sections[b.section]; |
|||
|
|||
if (typeof aId !== "number" || typeof bId !== "number") { |
|||
throw new Error("Section id not found"); |
|||
} |
|||
|
|||
return aId - bId; |
|||
}); |
|||
} |
|||
|
|||
function orderedInsertNode(m, n) { |
|||
assertHasLoc(n); |
|||
var didInsert = false; |
|||
|
|||
if (n.type === "ModuleExport") { |
|||
m.fields.push(n); |
|||
return; |
|||
} |
|||
|
|||
m.fields = m.fields.reduce(function (acc, field) { |
|||
var fieldEndCol = Infinity; |
|||
|
|||
if (field.loc != null) { |
|||
// $FlowIgnore
|
|||
fieldEndCol = field.loc.end.column; |
|||
} // $FlowIgnore: assertHasLoc ensures that
|
|||
|
|||
|
|||
if (didInsert === false && n.loc.start.column < fieldEndCol) { |
|||
didInsert = true; |
|||
acc.push(n); |
|||
} |
|||
|
|||
acc.push(field); |
|||
return acc; |
|||
}, []); // Handles empty modules or n is the last element
|
|||
|
|||
if (didInsert === false) { |
|||
m.fields.push(n); |
|||
} |
|||
} |
|||
|
|||
function assertHasLoc(n) { |
|||
if (n.loc == null || n.loc.start == null || n.loc.end == null) { |
|||
throw new Error("Internal failure: node (".concat(JSON.stringify(n.type), ") has no location information")); |
|||
} |
|||
} |
|||
|
|||
function getEndOfSection(s) { |
|||
assertHasLoc(s.size); |
|||
return s.startOffset + s.size.value + ( // $FlowIgnore
|
|||
s.size.loc.end.column - s.size.loc.start.column); |
|||
} |
|||
|
|||
function shiftLoc(node, delta) { |
|||
// $FlowIgnore
|
|||
node.loc.start.column += delta; // $FlowIgnore
|
|||
|
|||
node.loc.end.column += delta; |
|||
} |
|||
|
|||
function shiftSection(ast, node, delta) { |
|||
if (node.type !== "SectionMetadata") { |
|||
throw new Error("Can not shift node " + JSON.stringify(node.type)); |
|||
} |
|||
|
|||
node.startOffset += delta; |
|||
|
|||
if (_typeof(node.size.loc) === "object") { |
|||
shiftLoc(node.size, delta); |
|||
} // Custom sections doesn't have vectorOfSize
|
|||
|
|||
|
|||
if (_typeof(node.vectorOfSize) === "object" && _typeof(node.vectorOfSize.loc) === "object") { |
|||
shiftLoc(node.vectorOfSize, delta); |
|||
} |
|||
|
|||
var sectionName = node.section; // shift node locations within that section
|
|||
|
|||
(0, _traverse.traverse)(ast, { |
|||
Node: function Node(_ref3) { |
|||
var node = _ref3.node; |
|||
var section = (0, _helperWasmBytecode.getSectionForNode)(node); |
|||
|
|||
if (section === sectionName && _typeof(node.loc) === "object") { |
|||
shiftLoc(node, delta); |
|||
} |
|||
} |
|||
}); |
|||
} |
|||
|
|||
function signatureForOpcode(object, name) { |
|||
var opcodeName = name; |
|||
|
|||
if (object !== undefined && object !== "") { |
|||
opcodeName = object + "." + name; |
|||
} |
|||
|
|||
var sign = _signatures.signatures[opcodeName]; |
|||
|
|||
if (sign == undefined) { |
|||
// TODO: Uncomment this when br_table and others has been done
|
|||
//throw new Error("Invalid opcode: "+opcodeName);
|
|||
return [object, object]; |
|||
} |
|||
|
|||
return sign[0]; |
|||
} |
|||
|
|||
function getUniqueNameGenerator() { |
|||
var inc = {}; |
|||
return function () { |
|||
var prefix = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "temp"; |
|||
|
|||
if (!(prefix in inc)) { |
|||
inc[prefix] = 0; |
|||
} else { |
|||
inc[prefix] = inc[prefix] + 1; |
|||
} |
|||
|
|||
return prefix + "_" + inc[prefix]; |
|||
}; |
|||
} |
|||
|
|||
function getStartByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (typeof n.loc === "undefined" || typeof n.loc.start === "undefined") { |
|||
throw new Error( // $FlowIgnore
|
|||
"Can not get byte offset without loc informations, node: " + String(n.id)); |
|||
} |
|||
|
|||
return n.loc.start.column; |
|||
} |
|||
|
|||
function getEndByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (typeof n.loc === "undefined" || typeof n.loc.end === "undefined") { |
|||
throw new Error("Can not get byte offset without loc informations, node: " + n.type); |
|||
} |
|||
|
|||
return n.loc.end.column; |
|||
} |
|||
|
|||
function getFunctionBeginingByteOffset(n) { |
|||
if (!(n.body.length > 0)) { |
|||
throw new Error('n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var _n$body = _slicedToArray(n.body, 1), |
|||
firstInstruction = _n$body[0]; |
|||
|
|||
return getStartByteOffset(firstInstruction); |
|||
} |
|||
|
|||
function getEndBlockByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (!(n.instr.length > 0 || n.body.length > 0)) { |
|||
throw new Error('n.instr.length > 0 || n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var lastInstruction; |
|||
|
|||
if (n.instr) { |
|||
// $FlowIgnore
|
|||
lastInstruction = n.instr[n.instr.length - 1]; |
|||
} |
|||
|
|||
if (n.body) { |
|||
// $FlowIgnore
|
|||
lastInstruction = n.body[n.body.length - 1]; |
|||
} |
|||
|
|||
if (!(_typeof(lastInstruction) === "object")) { |
|||
throw new Error('typeof lastInstruction === "object"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
return getStartByteOffset(lastInstruction); |
|||
} |
|||
|
|||
function getStartBlockByteOffset(n) { |
|||
// $FlowIgnore
|
|||
if (!(n.instr.length > 0 || n.body.length > 0)) { |
|||
throw new Error('n.instr.length > 0 || n.body.length > 0' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var fistInstruction; |
|||
|
|||
if (n.instr) { |
|||
// $FlowIgnore
|
|||
var _n$instr = _slicedToArray(n.instr, 1); |
|||
|
|||
fistInstruction = _n$instr[0]; |
|||
} |
|||
|
|||
if (n.body) { |
|||
// $FlowIgnore
|
|||
var _n$body2 = _slicedToArray(n.body, 1); |
|||
|
|||
fistInstruction = _n$body2[0]; |
|||
} |
|||
|
|||
if (!(_typeof(fistInstruction) === "object")) { |
|||
throw new Error('typeof fistInstruction === "object"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
// $FlowIgnore
|
|||
return getStartByteOffset(fistInstruction); |
|||
} |
@ -0,0 +1,33 @@ |
|||
{ |
|||
"name": "@webassemblyjs/ast", |
|||
"version": "1.9.0", |
|||
"description": "AST utils for webassemblyjs", |
|||
"keywords": [ |
|||
"webassembly", |
|||
"javascript", |
|||
"ast" |
|||
], |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"author": "Sven Sauleau", |
|||
"license": "MIT", |
|||
"dependencies": { |
|||
"@webassemblyjs/helper-module-context": "1.9.0", |
|||
"@webassemblyjs/helper-wasm-bytecode": "1.9.0", |
|||
"@webassemblyjs/wast-parser": "1.9.0" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/xtuc/webassemblyjs.git" |
|||
}, |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"devDependencies": { |
|||
"@webassemblyjs/helper-test-framework": "1.9.0", |
|||
"array.prototype.flatmap": "^1.2.1", |
|||
"dump-exports": "^0.1.0", |
|||
"mamacro": "^0.0.7" |
|||
}, |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,219 @@ |
|||
const definitions = require("../src/definitions"); |
|||
const flatMap = require("array.prototype.flatmap"); |
|||
const { |
|||
typeSignature, |
|||
iterateProps, |
|||
mapProps, |
|||
filterProps, |
|||
unique |
|||
} = require("./util"); |
|||
|
|||
const stdout = process.stdout; |
|||
|
|||
const jsTypes = ["string", "number", "boolean"]; |
|||
|
|||
const quote = value => `"${value}"`; |
|||
|
|||
function params(fields) { |
|||
const optionalDefault = field => (field.default ? ` = ${field.default}` : ""); |
|||
return mapProps(fields) |
|||
.map(field => `${typeSignature(field)}${optionalDefault(field)}`) |
|||
.join(","); |
|||
} |
|||
|
|||
function assertParamType({ assertNodeType, array, name, type }) { |
|||
if (array) { |
|||
// TODO - assert contents of array?
|
|||
return `assert(typeof ${name} === "object" && typeof ${name}.length !== "undefined")\n`; |
|||
} else { |
|||
if (jsTypes.includes(type)) { |
|||
return `assert(
|
|||
typeof ${name} === "${type}", |
|||
"Argument ${name} must be of type ${type}, given: " + typeof ${name} |
|||
)`;
|
|||
} |
|||
|
|||
if (assertNodeType === true) { |
|||
return `assert(
|
|||
${name}.type === "${type}", |
|||
"Argument ${name} must be of type ${type}, given: " + ${name}.type |
|||
)`;
|
|||
} |
|||
|
|||
return ""; |
|||
} |
|||
} |
|||
|
|||
function assertParam(meta) { |
|||
const paramAssertion = assertParamType(meta); |
|||
|
|||
if (paramAssertion === "") { |
|||
return ""; |
|||
} |
|||
|
|||
if (meta.maybe || meta.optional) { |
|||
return ` |
|||
if (${meta.name} !== null && ${meta.name} !== undefined) { |
|||
${paramAssertion}; |
|||
} |
|||
`;
|
|||
} else { |
|||
return paramAssertion; |
|||
} |
|||
} |
|||
|
|||
function assertParams(fields) { |
|||
return mapProps(fields) |
|||
.map(assertParam) |
|||
.join("\n"); |
|||
} |
|||
|
|||
function buildObject(typeDef) { |
|||
const optionalField = meta => { |
|||
if (meta.array) { |
|||
// omit optional array properties if the constructor function was supplied
|
|||
// with an empty array
|
|||
return ` |
|||
if (typeof ${meta.name} !== "undefined" && ${meta.name}.length > 0) { |
|||
node.${meta.name} = ${meta.name}; |
|||
} |
|||
`;
|
|||
} else if (meta.type === "Object") { |
|||
// omit optional object properties if they have no keys
|
|||
return ` |
|||
if (typeof ${meta.name} !== "undefined" && Object.keys(${ |
|||
meta.name |
|||
}).length !== 0) { |
|||
node.${meta.name} = ${meta.name}; |
|||
} |
|||
`;
|
|||
} else if (meta.type === "boolean") { |
|||
// omit optional boolean properties if they are not true
|
|||
return ` |
|||
if (${meta.name} === true) { |
|||
node.${meta.name} = true; |
|||
} |
|||
`;
|
|||
} else { |
|||
return ` |
|||
if (typeof ${meta.name} !== "undefined") { |
|||
node.${meta.name} = ${meta.name}; |
|||
} |
|||
`;
|
|||
} |
|||
}; |
|||
|
|||
const fields = mapProps(typeDef.fields) |
|||
.filter(f => !f.optional && !f.constant) |
|||
.map(f => f.name); |
|||
|
|||
const constants = mapProps(typeDef.fields) |
|||
.filter(f => f.constant) |
|||
.map(f => `${f.name}: "${f.value}"`); |
|||
|
|||
return ` |
|||
const node: ${typeDef.flowTypeName || typeDef.name} = { |
|||
type: "${typeDef.name}", |
|||
${constants.concat(fields).join(",")} |
|||
} |
|||
|
|||
${mapProps(typeDef.fields) |
|||
.filter(f => f.optional) |
|||
.map(optionalField) |
|||
.join("")} |
|||
`;
|
|||
} |
|||
|
|||
function lowerCamelCase(name) { |
|||
return name.substring(0, 1).toLowerCase() + name.substring(1); |
|||
} |
|||
|
|||
function generate() { |
|||
stdout.write(` |
|||
// @flow
|
|||
|
|||
// THIS FILE IS AUTOGENERATED
|
|||
// see scripts/generateNodeUtils.js
|
|||
|
|||
import { assert } from "mamacro"; |
|||
|
|||
function isTypeOf(t: string) { |
|||
return (n: Node) => n.type === t; |
|||
} |
|||
|
|||
function assertTypeOf(t: string) { |
|||
return (n: Node) => assert(n.type === t); |
|||
} |
|||
`);
|
|||
|
|||
// Node builders
|
|||
iterateProps(definitions, typeDefinition => { |
|||
stdout.write(` |
|||
export function ${lowerCamelCase(typeDefinition.name)} ( |
|||
${params(filterProps(typeDefinition.fields, f => !f.constant))} |
|||
): ${typeDefinition.name} { |
|||
|
|||
${assertParams(filterProps(typeDefinition.fields, f => !f.constant))} |
|||
${buildObject(typeDefinition)} |
|||
|
|||
return node; |
|||
} |
|||
`);
|
|||
}); |
|||
|
|||
// Node testers
|
|||
iterateProps(definitions, typeDefinition => { |
|||
stdout.write(` |
|||
export const is${typeDefinition.name} = |
|||
isTypeOf("${typeDefinition.name}"); |
|||
`);
|
|||
}); |
|||
|
|||
// Node union type testers
|
|||
const unionTypes = unique( |
|||
flatMap(mapProps(definitions).filter(d => d.unionType), d => d.unionType) |
|||
); |
|||
unionTypes.forEach(unionType => { |
|||
stdout.write( |
|||
` |
|||
export const is${unionType} = (node: Node) => ` +
|
|||
mapProps(definitions) |
|||
.filter(d => d.unionType && d.unionType.includes(unionType)) |
|||
.map(d => `is${d.name}(node) `) |
|||
.join("||") + |
|||
";\n\n" |
|||
); |
|||
}); |
|||
|
|||
// Node assertion
|
|||
iterateProps(definitions, typeDefinition => { |
|||
stdout.write(` |
|||
export const assert${typeDefinition.name} = |
|||
assertTypeOf("${typeDefinition.name}"); |
|||
`);
|
|||
}); |
|||
|
|||
// a map from node type to its set of union types
|
|||
stdout.write( |
|||
` |
|||
export const unionTypesMap = {` +
|
|||
mapProps(definitions) |
|||
.filter(d => d.unionType) |
|||
.map(t => `"${t.name}": [${t.unionType.map(quote).join(",")}]\n`) + |
|||
`};
|
|||
` |
|||
); |
|||
|
|||
// an array of all node and union types
|
|||
stdout.write( |
|||
` |
|||
export const nodeAndUnionTypes = [` +
|
|||
mapProps(definitions) |
|||
.map(t => `"${t.name}"`) |
|||
.concat(unionTypes.map(quote)) |
|||
.join(",") + |
|||
`];` |
|||
); |
|||
} |
|||
|
|||
generate(); |
@ -0,0 +1,47 @@ |
|||
const definitions = require("../src/definitions"); |
|||
const flatMap = require("array.prototype.flatmap"); |
|||
const { typeSignature, mapProps, iterateProps, unique } = require("./util"); |
|||
|
|||
const stdout = process.stdout; |
|||
|
|||
function params(fields) { |
|||
return mapProps(fields) |
|||
.map(typeSignature) |
|||
.join(","); |
|||
} |
|||
|
|||
function generate() { |
|||
stdout.write(` |
|||
// @flow
|
|||
/* eslint no-unused-vars: off */ |
|||
|
|||
// THIS FILE IS AUTOGENERATED
|
|||
// see scripts/generateTypeDefinitions.js
|
|||
`);
|
|||
|
|||
// generate union types
|
|||
const unionTypes = unique( |
|||
flatMap(mapProps(definitions).filter(d => d.unionType), d => d.unionType) |
|||
); |
|||
unionTypes.forEach(unionType => { |
|||
stdout.write( |
|||
`type ${unionType} = ` + |
|||
mapProps(definitions) |
|||
.filter(d => d.unionType && d.unionType.includes(unionType)) |
|||
.map(d => d.name) |
|||
.join("|") + |
|||
";\n\n" |
|||
); |
|||
}); |
|||
|
|||
// generate the type definitions
|
|||
iterateProps(definitions, typeDef => { |
|||
stdout.write(`type ${typeDef.name} = {
|
|||
...BaseNode, |
|||
type: "${typeDef.name}", |
|||
${params(typeDef.fields)} |
|||
};\n\n`);
|
|||
}); |
|||
} |
|||
|
|||
generate(); |
@ -0,0 +1,38 @@ |
|||
function iterateProps(obj, iterator) { |
|||
Object.keys(obj).forEach(key => iterator({ ...obj[key], name: key })); |
|||
} |
|||
|
|||
function mapProps(obj) { |
|||
return Object.keys(obj).map(key => ({ ...obj[key], name: key })); |
|||
} |
|||
|
|||
function filterProps(obj, filter) { |
|||
const ret = {}; |
|||
Object.keys(obj).forEach(key => { |
|||
if (filter(obj[key])) { |
|||
ret[key] = obj[key]; |
|||
} |
|||
}); |
|||
return ret; |
|||
} |
|||
|
|||
function typeSignature(meta) { |
|||
const type = meta.array ? `Array<${meta.type}>` : meta.type; |
|||
if (meta.optional) { |
|||
return `${meta.name}?: ${type}`; |
|||
} else if (meta.maybe) { |
|||
return `${meta.name}: ?${type}`; |
|||
} else { |
|||
return `${meta.name}: ${type}`; |
|||
} |
|||
} |
|||
|
|||
const unique = items => Array.from(new Set(items)); |
|||
|
|||
module.exports = { |
|||
iterateProps, |
|||
mapProps, |
|||
filterProps, |
|||
typeSignature, |
|||
unique |
|||
}; |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2017 Mauro Bringolf |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,34 @@ |
|||
# Parser function for floating point hexadecimals |
|||
|
|||
[]() |
|||
[]() |
|||
[]() |
|||
|
|||
> A JavaScript function to parse floating point hexadecimals as defined by the [WebAssembly specification](https://webassembly.github.io/spec/core/text/values.html#text-hexfloat). |
|||
|
|||
## Usage |
|||
|
|||
```javascript |
|||
import parseHexFloat from '@webassemblyjs/floating-point-hex-parser' |
|||
|
|||
parseHexFloat('0x1p-1') // 0.5 |
|||
parseHexFloat('0x1.921fb54442d18p+2') // 6.283185307179586 |
|||
``` |
|||
|
|||
## Tests |
|||
|
|||
This module is tested in two ways. The first one is through a small set of test cases that can be found in [test/regular.test.js](https://github.com/maurobringolf/@webassemblyjs/floating-point-hex-parser/blob/master/test/regular.test.js). The second one is non-deterministic (sometimes called *fuzzing*): |
|||
|
|||
1. Generate a random IEEE754 double precision value `x`. |
|||
1. Compute its representation `y` in floating point hexadecimal format using the C standard library function `printf` since C supports this format. |
|||
1. Give both values to JS testcase and see if `parseHexFloat(y) === x`. |
|||
|
|||
By default one `npm test` run tests 100 random samples. If you want to do more, you can set the environment variable `FUZZ_AMOUNT` to whatever number of runs you'd like. Because it uses one child process for each sample, it is really slow though. For more details about the randomized tests see [the source](https://github.com/maurobringolf/@webassemblyjs/floating-point-hex-parser/tree/master/test/fuzzing). |
|||
|
|||
## Links |
|||
|
|||
* [maurobringolf.ch/2017/12/hexadecimal-floating-point-notation/](https://maurobringolf.ch/2017/12/hexadecimal-floating-point-notation/) |
|||
|
|||
* [github.com/xtuc/js-webassembly-interpreter/issues/32](https://github.com/xtuc/js-webassembly-interpreter/issues/32) |
|||
|
|||
* [github.com/WebAssembly/design/issues/292](https://github.com/WebAssembly/design/issues/292) |
@ -0,0 +1,42 @@ |
|||
export default function parse(input) { |
|||
input = input.toUpperCase(); |
|||
var splitIndex = input.indexOf("P"); |
|||
var mantissa, exponent; |
|||
|
|||
if (splitIndex !== -1) { |
|||
mantissa = input.substring(0, splitIndex); |
|||
exponent = parseInt(input.substring(splitIndex + 1)); |
|||
} else { |
|||
mantissa = input; |
|||
exponent = 0; |
|||
} |
|||
|
|||
var dotIndex = mantissa.indexOf("."); |
|||
|
|||
if (dotIndex !== -1) { |
|||
var integerPart = parseInt(mantissa.substring(0, dotIndex), 16); |
|||
var sign = Math.sign(integerPart); |
|||
integerPart = sign * integerPart; |
|||
var fractionLength = mantissa.length - dotIndex - 1; |
|||
var fractionalPart = parseInt(mantissa.substring(dotIndex + 1), 16); |
|||
var fraction = fractionLength > 0 ? fractionalPart / Math.pow(16, fractionLength) : 0; |
|||
|
|||
if (sign === 0) { |
|||
if (fraction === 0) { |
|||
mantissa = sign; |
|||
} else { |
|||
if (Object.is(sign, -0)) { |
|||
mantissa = -fraction; |
|||
} else { |
|||
mantissa = fraction; |
|||
} |
|||
} |
|||
} else { |
|||
mantissa = sign * (integerPart + fraction); |
|||
} |
|||
} else { |
|||
mantissa = parseInt(mantissa, 16); |
|||
} |
|||
|
|||
return mantissa * (splitIndex !== -1 ? Math.pow(2, exponent) : 1); |
|||
} |
@ -0,0 +1,49 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.default = parse; |
|||
|
|||
function parse(input) { |
|||
input = input.toUpperCase(); |
|||
var splitIndex = input.indexOf("P"); |
|||
var mantissa, exponent; |
|||
|
|||
if (splitIndex !== -1) { |
|||
mantissa = input.substring(0, splitIndex); |
|||
exponent = parseInt(input.substring(splitIndex + 1)); |
|||
} else { |
|||
mantissa = input; |
|||
exponent = 0; |
|||
} |
|||
|
|||
var dotIndex = mantissa.indexOf("."); |
|||
|
|||
if (dotIndex !== -1) { |
|||
var integerPart = parseInt(mantissa.substring(0, dotIndex), 16); |
|||
var sign = Math.sign(integerPart); |
|||
integerPart = sign * integerPart; |
|||
var fractionLength = mantissa.length - dotIndex - 1; |
|||
var fractionalPart = parseInt(mantissa.substring(dotIndex + 1), 16); |
|||
var fraction = fractionLength > 0 ? fractionalPart / Math.pow(16, fractionLength) : 0; |
|||
|
|||
if (sign === 0) { |
|||
if (fraction === 0) { |
|||
mantissa = sign; |
|||
} else { |
|||
if (Object.is(sign, -0)) { |
|||
mantissa = -fraction; |
|||
} else { |
|||
mantissa = fraction; |
|||
} |
|||
} |
|||
} else { |
|||
mantissa = sign * (integerPart + fraction); |
|||
} |
|||
} else { |
|||
mantissa = parseInt(mantissa, 16); |
|||
} |
|||
|
|||
return mantissa * (splitIndex !== -1 ? Math.pow(2, exponent) : 1); |
|||
} |
@ -0,0 +1,24 @@ |
|||
{ |
|||
"name": "@webassemblyjs/floating-point-hex-parser", |
|||
"scripts": { |
|||
"build-fuzzer": "[ -f ./test/fuzzing/parse.out ] || gcc ./test/fuzzing/parse.c -o ./test/fuzzing/parse.out -lm -Wall" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/xtuc/webassemblyjs.git" |
|||
}, |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"version": "1.9.0", |
|||
"description": "A function to parse floating point hexadecimal strings as defined by the WebAssembly specification", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"keywords": [ |
|||
"webassembly", |
|||
"floating-point" |
|||
], |
|||
"author": "Mauro Bringolf", |
|||
"license": "MIT", |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,47 @@ |
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } |
|||
|
|||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } |
|||
|
|||
export var RuntimeError = |
|||
/*#__PURE__*/ |
|||
function (_Error) { |
|||
_inherits(RuntimeError, _Error); |
|||
|
|||
function RuntimeError() { |
|||
_classCallCheck(this, RuntimeError); |
|||
|
|||
return _possibleConstructorReturn(this, (RuntimeError.__proto__ || Object.getPrototypeOf(RuntimeError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return RuntimeError; |
|||
}(Error); |
|||
export var CompileError = |
|||
/*#__PURE__*/ |
|||
function (_Error2) { |
|||
_inherits(CompileError, _Error2); |
|||
|
|||
function CompileError() { |
|||
_classCallCheck(this, CompileError); |
|||
|
|||
return _possibleConstructorReturn(this, (CompileError.__proto__ || Object.getPrototypeOf(CompileError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return CompileError; |
|||
}(Error); |
|||
export var LinkError = |
|||
/*#__PURE__*/ |
|||
function (_Error3) { |
|||
_inherits(LinkError, _Error3); |
|||
|
|||
function LinkError() { |
|||
_classCallCheck(this, LinkError); |
|||
|
|||
return _possibleConstructorReturn(this, (LinkError.__proto__ || Object.getPrototypeOf(LinkError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return LinkError; |
|||
}(Error); |
@ -0,0 +1,62 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.LinkError = exports.CompileError = exports.RuntimeError = void 0; |
|||
|
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } |
|||
|
|||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } |
|||
|
|||
var RuntimeError = |
|||
/*#__PURE__*/ |
|||
function (_Error) { |
|||
_inherits(RuntimeError, _Error); |
|||
|
|||
function RuntimeError() { |
|||
_classCallCheck(this, RuntimeError); |
|||
|
|||
return _possibleConstructorReturn(this, (RuntimeError.__proto__ || Object.getPrototypeOf(RuntimeError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return RuntimeError; |
|||
}(Error); |
|||
|
|||
exports.RuntimeError = RuntimeError; |
|||
|
|||
var CompileError = |
|||
/*#__PURE__*/ |
|||
function (_Error2) { |
|||
_inherits(CompileError, _Error2); |
|||
|
|||
function CompileError() { |
|||
_classCallCheck(this, CompileError); |
|||
|
|||
return _possibleConstructorReturn(this, (CompileError.__proto__ || Object.getPrototypeOf(CompileError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return CompileError; |
|||
}(Error); |
|||
|
|||
exports.CompileError = CompileError; |
|||
|
|||
var LinkError = |
|||
/*#__PURE__*/ |
|||
function (_Error3) { |
|||
_inherits(LinkError, _Error3); |
|||
|
|||
function LinkError() { |
|||
_classCallCheck(this, LinkError); |
|||
|
|||
return _possibleConstructorReturn(this, (LinkError.__proto__ || Object.getPrototypeOf(LinkError)).apply(this, arguments)); |
|||
} |
|||
|
|||
return LinkError; |
|||
}(Error); |
|||
|
|||
exports.LinkError = LinkError; |
@ -0,0 +1,13 @@ |
|||
{ |
|||
"name": "@webassemblyjs/helper-api-error", |
|||
"version": "1.9.0", |
|||
"description": "Common API errors", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"author": "Sven Sauleau", |
|||
"license": "MIT", |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,65 @@ |
|||
// this are dev dependencies
|
|||
var diff = require("jest-diff"); |
|||
|
|||
var _require = require("jest-diff/build/constants"), |
|||
NO_DIFF_MESSAGE = _require.NO_DIFF_MESSAGE; |
|||
|
|||
var _require2 = require("@webassemblyjs/wasm-parser"), |
|||
decode = _require2.decode; |
|||
|
|||
var oldConsoleLog = console.log; |
|||
export function compareArrayBuffers(l, r) { |
|||
/** |
|||
* Decode left |
|||
*/ |
|||
var bufferL = ""; |
|||
|
|||
console.log = function () { |
|||
for (var _len = arguments.length, texts = new Array(_len), _key = 0; _key < _len; _key++) { |
|||
texts[_key] = arguments[_key]; |
|||
} |
|||
|
|||
return bufferL += texts.join("") + "\n"; |
|||
}; |
|||
|
|||
try { |
|||
decode(l, { |
|||
dump: true |
|||
}); |
|||
} catch (e) { |
|||
console.error(bufferL); |
|||
console.error(e); |
|||
throw e; |
|||
} |
|||
/** |
|||
* Decode right |
|||
*/ |
|||
|
|||
|
|||
var bufferR = ""; |
|||
|
|||
console.log = function () { |
|||
for (var _len2 = arguments.length, texts = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
|||
texts[_key2] = arguments[_key2]; |
|||
} |
|||
|
|||
return bufferR += texts.join("") + "\n"; |
|||
}; |
|||
|
|||
try { |
|||
decode(r, { |
|||
dump: true |
|||
}); |
|||
} catch (e) { |
|||
console.error(bufferR); |
|||
console.error(e); |
|||
throw e; |
|||
} |
|||
|
|||
console.log = oldConsoleLog; |
|||
var out = diff(bufferL, bufferR); |
|||
|
|||
if (out !== null && out !== NO_DIFF_MESSAGE) { |
|||
throw new Error("\n" + out); |
|||
} |
|||
} |
@ -0,0 +1,67 @@ |
|||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } |
|||
|
|||
function concatUint8Arrays() { |
|||
for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) { |
|||
arrays[_key] = arguments[_key]; |
|||
} |
|||
|
|||
var totalLength = arrays.reduce(function (a, b) { |
|||
return a + b.length; |
|||
}, 0); |
|||
var result = new Uint8Array(totalLength); |
|||
var offset = 0; |
|||
|
|||
for (var _i = 0; _i < arrays.length; _i++) { |
|||
var arr = arrays[_i]; |
|||
|
|||
if (arr instanceof Uint8Array === false) { |
|||
throw new Error("arr must be of type Uint8Array"); |
|||
} |
|||
|
|||
result.set(arr, offset); |
|||
offset += arr.length; |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
export function overrideBytesInBuffer(buffer, startLoc, endLoc, newBytes) { |
|||
var beforeBytes = buffer.slice(0, startLoc); |
|||
var afterBytes = buffer.slice(endLoc, buffer.length); // replacement is empty, we can omit it
|
|||
|
|||
if (newBytes.length === 0) { |
|||
return concatUint8Arrays(beforeBytes, afterBytes); |
|||
} |
|||
|
|||
var replacement = Uint8Array.from(newBytes); |
|||
return concatUint8Arrays(beforeBytes, replacement, afterBytes); |
|||
} |
|||
export function makeBuffer() { |
|||
for (var _len2 = arguments.length, splitedBytes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
|||
splitedBytes[_key2] = arguments[_key2]; |
|||
} |
|||
|
|||
var bytes = [].concat.apply([], splitedBytes); |
|||
return new Uint8Array(bytes).buffer; |
|||
} |
|||
export function fromHexdump(str) { |
|||
var lines = str.split("\n"); // remove any leading left whitespace
|
|||
|
|||
lines = lines.map(function (line) { |
|||
return line.trim(); |
|||
}); |
|||
var bytes = lines.reduce(function (acc, line) { |
|||
var cols = line.split(" "); // remove the offset, left column
|
|||
|
|||
cols.shift(); |
|||
cols = cols.filter(function (x) { |
|||
return x !== ""; |
|||
}); |
|||
var bytes = cols.map(function (x) { |
|||
return parseInt(x, 16); |
|||
}); |
|||
acc.push.apply(acc, _toConsumableArray(bytes)); |
|||
return acc; |
|||
}, []); |
|||
return Buffer.from(bytes); |
|||
} |
@ -0,0 +1,73 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.compareArrayBuffers = compareArrayBuffers; |
|||
|
|||
// this are dev dependencies
|
|||
var diff = require("jest-diff"); |
|||
|
|||
var _require = require("jest-diff/build/constants"), |
|||
NO_DIFF_MESSAGE = _require.NO_DIFF_MESSAGE; |
|||
|
|||
var _require2 = require("@webassemblyjs/wasm-parser"), |
|||
decode = _require2.decode; |
|||
|
|||
var oldConsoleLog = console.log; |
|||
|
|||
function compareArrayBuffers(l, r) { |
|||
/** |
|||
* Decode left |
|||
*/ |
|||
var bufferL = ""; |
|||
|
|||
console.log = function () { |
|||
for (var _len = arguments.length, texts = new Array(_len), _key = 0; _key < _len; _key++) { |
|||
texts[_key] = arguments[_key]; |
|||
} |
|||
|
|||
return bufferL += texts.join("") + "\n"; |
|||
}; |
|||
|
|||
try { |
|||
decode(l, { |
|||
dump: true |
|||
}); |
|||
} catch (e) { |
|||
console.error(bufferL); |
|||
console.error(e); |
|||
throw e; |
|||
} |
|||
/** |
|||
* Decode right |
|||
*/ |
|||
|
|||
|
|||
var bufferR = ""; |
|||
|
|||
console.log = function () { |
|||
for (var _len2 = arguments.length, texts = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
|||
texts[_key2] = arguments[_key2]; |
|||
} |
|||
|
|||
return bufferR += texts.join("") + "\n"; |
|||
}; |
|||
|
|||
try { |
|||
decode(r, { |
|||
dump: true |
|||
}); |
|||
} catch (e) { |
|||
console.error(bufferR); |
|||
console.error(e); |
|||
throw e; |
|||
} |
|||
|
|||
console.log = oldConsoleLog; |
|||
var out = diff(bufferL, bufferR); |
|||
|
|||
if (out !== null && out !== NO_DIFF_MESSAGE) { |
|||
throw new Error("\n" + out); |
|||
} |
|||
} |
@ -0,0 +1,78 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.overrideBytesInBuffer = overrideBytesInBuffer; |
|||
exports.makeBuffer = makeBuffer; |
|||
exports.fromHexdump = fromHexdump; |
|||
|
|||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } |
|||
|
|||
function concatUint8Arrays() { |
|||
for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) { |
|||
arrays[_key] = arguments[_key]; |
|||
} |
|||
|
|||
var totalLength = arrays.reduce(function (a, b) { |
|||
return a + b.length; |
|||
}, 0); |
|||
var result = new Uint8Array(totalLength); |
|||
var offset = 0; |
|||
|
|||
for (var _i = 0; _i < arrays.length; _i++) { |
|||
var arr = arrays[_i]; |
|||
|
|||
if (arr instanceof Uint8Array === false) { |
|||
throw new Error("arr must be of type Uint8Array"); |
|||
} |
|||
|
|||
result.set(arr, offset); |
|||
offset += arr.length; |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
function overrideBytesInBuffer(buffer, startLoc, endLoc, newBytes) { |
|||
var beforeBytes = buffer.slice(0, startLoc); |
|||
var afterBytes = buffer.slice(endLoc, buffer.length); // replacement is empty, we can omit it
|
|||
|
|||
if (newBytes.length === 0) { |
|||
return concatUint8Arrays(beforeBytes, afterBytes); |
|||
} |
|||
|
|||
var replacement = Uint8Array.from(newBytes); |
|||
return concatUint8Arrays(beforeBytes, replacement, afterBytes); |
|||
} |
|||
|
|||
function makeBuffer() { |
|||
for (var _len2 = arguments.length, splitedBytes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
|||
splitedBytes[_key2] = arguments[_key2]; |
|||
} |
|||
|
|||
var bytes = [].concat.apply([], splitedBytes); |
|||
return new Uint8Array(bytes).buffer; |
|||
} |
|||
|
|||
function fromHexdump(str) { |
|||
var lines = str.split("\n"); // remove any leading left whitespace
|
|||
|
|||
lines = lines.map(function (line) { |
|||
return line.trim(); |
|||
}); |
|||
var bytes = lines.reduce(function (acc, line) { |
|||
var cols = line.split(" "); // remove the offset, left column
|
|||
|
|||
cols.shift(); |
|||
cols = cols.filter(function (x) { |
|||
return x !== ""; |
|||
}); |
|||
var bytes = cols.map(function (x) { |
|||
return parseInt(x, 16); |
|||
}); |
|||
acc.push.apply(acc, _toConsumableArray(bytes)); |
|||
return acc; |
|||
}, []); |
|||
return Buffer.from(bytes); |
|||
} |
@ -0,0 +1,24 @@ |
|||
{ |
|||
"name": "@webassemblyjs/helper-buffer", |
|||
"version": "1.9.0", |
|||
"description": "Buffer manipulation utility", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"scripts": { |
|||
"test": "echo \"Error: no test specified\" && exit 1" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/xtuc/webassemblyjs.git" |
|||
}, |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"author": "Sven Sauleau", |
|||
"license": "MIT", |
|||
"devDependencies": { |
|||
"@webassemblyjs/wasm-parser": "1.9.0", |
|||
"jest-diff": "^24.0.0" |
|||
}, |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,37 @@ |
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
import { print } from "@webassemblyjs/wast-printer"; |
|||
var SHOW_LINES_AROUND_POINTER = 5; |
|||
|
|||
function repeat(char, nb) { |
|||
return Array(nb).fill(char).join(""); |
|||
} // TODO(sven): allow arbitrary ast nodes
|
|||
|
|||
|
|||
export function codeFrameFromAst(ast, loc) { |
|||
return codeFrameFromSource(print(ast), loc); |
|||
} |
|||
export function codeFrameFromSource(source, loc) { |
|||
var start = loc.start, |
|||
end = loc.end; |
|||
var length = 1; |
|||
|
|||
if (_typeof(end) === "object") { |
|||
length = end.column - start.column + 1; |
|||
} |
|||
|
|||
return source.split("\n").reduce(function (acc, line, lineNbr) { |
|||
if (Math.abs(start.line - lineNbr) < SHOW_LINES_AROUND_POINTER) { |
|||
acc += line + "\n"; |
|||
} // Add a new line with the pointer padded left
|
|||
|
|||
|
|||
if (lineNbr === start.line - 1) { |
|||
acc += repeat(" ", start.column - 1); |
|||
acc += repeat("^", length); |
|||
acc += "\n"; |
|||
} |
|||
|
|||
return acc; |
|||
}, ""); |
|||
} |
@ -0,0 +1,47 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.codeFrameFromAst = codeFrameFromAst; |
|||
exports.codeFrameFromSource = codeFrameFromSource; |
|||
|
|||
var _wastPrinter = require("@webassemblyjs/wast-printer"); |
|||
|
|||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } |
|||
|
|||
var SHOW_LINES_AROUND_POINTER = 5; |
|||
|
|||
function repeat(char, nb) { |
|||
return Array(nb).fill(char).join(""); |
|||
} // TODO(sven): allow arbitrary ast nodes
|
|||
|
|||
|
|||
function codeFrameFromAst(ast, loc) { |
|||
return codeFrameFromSource((0, _wastPrinter.print)(ast), loc); |
|||
} |
|||
|
|||
function codeFrameFromSource(source, loc) { |
|||
var start = loc.start, |
|||
end = loc.end; |
|||
var length = 1; |
|||
|
|||
if (_typeof(end) === "object") { |
|||
length = end.column - start.column + 1; |
|||
} |
|||
|
|||
return source.split("\n").reduce(function (acc, line, lineNbr) { |
|||
if (Math.abs(start.line - lineNbr) < SHOW_LINES_AROUND_POINTER) { |
|||
acc += line + "\n"; |
|||
} // Add a new line with the pointer padded left
|
|||
|
|||
|
|||
if (lineNbr === start.line - 1) { |
|||
acc += repeat(" ", start.column - 1); |
|||
acc += repeat("^", length); |
|||
acc += "\n"; |
|||
} |
|||
|
|||
return acc; |
|||
}, ""); |
|||
} |
@ -0,0 +1,23 @@ |
|||
{ |
|||
"name": "@webassemblyjs/helper-code-frame", |
|||
"version": "1.9.0", |
|||
"description": "", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/xtuc/webassemblyjs.git" |
|||
}, |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"author": "Sven Sauleau", |
|||
"license": "MIT", |
|||
"dependencies": { |
|||
"@webassemblyjs/wast-printer": "1.9.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@webassemblyjs/ast": "1.9.0" |
|||
}, |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,101 @@ |
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } |
|||
|
|||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } |
|||
|
|||
var STOP = Symbol("STOP"); |
|||
|
|||
function makeTransition(regex, nextState) { |
|||
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, |
|||
_ref$n = _ref.n, |
|||
n = _ref$n === void 0 ? 1 : _ref$n, |
|||
allowedSeparator = _ref.allowedSeparator; |
|||
|
|||
return function (instance) { |
|||
if (allowedSeparator) { |
|||
if (instance.input[instance.ptr] === allowedSeparator) { |
|||
if (regex.test(instance.input.substring(instance.ptr - 1, instance.ptr))) { |
|||
// Consume the separator and stay in current state
|
|||
return [instance.currentState, 1]; |
|||
} else { |
|||
return [instance.terminatingState, 0]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (regex.test(instance.input.substring(instance.ptr, instance.ptr + n))) { |
|||
return [nextState, n]; |
|||
} |
|||
|
|||
return false; |
|||
}; |
|||
} |
|||
|
|||
function combineTransitions(transitions) { |
|||
return function () { |
|||
var match = false; |
|||
var currentTransitions = transitions[this.currentState] || []; |
|||
|
|||
for (var i = 0; i < currentTransitions.length; ++i) { |
|||
match = currentTransitions[i](this); |
|||
|
|||
if (match !== false) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
return match || [this.terminatingState, 0]; |
|||
}; |
|||
} |
|||
|
|||
var FSM = |
|||
/*#__PURE__*/ |
|||
function () { |
|||
function FSM(transitions, initialState) { |
|||
var terminatingState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : STOP; |
|||
|
|||
_classCallCheck(this, FSM); |
|||
|
|||
this.initialState = initialState; |
|||
this.terminatingState = terminatingState; |
|||
|
|||
if (terminatingState === STOP || !transitions[terminatingState]) { |
|||
transitions[terminatingState] = []; |
|||
} |
|||
|
|||
this.transitionFunction = combineTransitions.call(this, transitions); |
|||
} |
|||
|
|||
_createClass(FSM, [{ |
|||
key: "run", |
|||
value: function run(input) { |
|||
this.input = input; |
|||
this.ptr = 0; |
|||
this.currentState = this.initialState; |
|||
var value = ""; |
|||
var eatLength, nextState; |
|||
|
|||
while (this.currentState !== this.terminatingState && this.ptr < this.input.length) { |
|||
var _transitionFunction = this.transitionFunction(); |
|||
|
|||
var _transitionFunction2 = _slicedToArray(_transitionFunction, 2); |
|||
|
|||
nextState = _transitionFunction2[0]; |
|||
eatLength = _transitionFunction2[1]; |
|||
value += this.input.substring(this.ptr, this.ptr += eatLength); |
|||
this.currentState = nextState; |
|||
} |
|||
|
|||
return value; |
|||
} |
|||
}]); |
|||
|
|||
return FSM; |
|||
}(); |
|||
|
|||
export { makeTransition, FSM }; |
@ -0,0 +1,109 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.makeTransition = makeTransition; |
|||
exports.FSM = void 0; |
|||
|
|||
function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } |
|||
|
|||
function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } } |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } |
|||
|
|||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } |
|||
|
|||
var STOP = Symbol("STOP"); |
|||
|
|||
function makeTransition(regex, nextState) { |
|||
var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, |
|||
_ref$n = _ref.n, |
|||
n = _ref$n === void 0 ? 1 : _ref$n, |
|||
allowedSeparator = _ref.allowedSeparator; |
|||
|
|||
return function (instance) { |
|||
if (allowedSeparator) { |
|||
if (instance.input[instance.ptr] === allowedSeparator) { |
|||
if (regex.test(instance.input.substring(instance.ptr - 1, instance.ptr))) { |
|||
// Consume the separator and stay in current state
|
|||
return [instance.currentState, 1]; |
|||
} else { |
|||
return [instance.terminatingState, 0]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (regex.test(instance.input.substring(instance.ptr, instance.ptr + n))) { |
|||
return [nextState, n]; |
|||
} |
|||
|
|||
return false; |
|||
}; |
|||
} |
|||
|
|||
function combineTransitions(transitions) { |
|||
return function () { |
|||
var match = false; |
|||
var currentTransitions = transitions[this.currentState] || []; |
|||
|
|||
for (var i = 0; i < currentTransitions.length; ++i) { |
|||
match = currentTransitions[i](this); |
|||
|
|||
if (match !== false) { |
|||
break; |
|||
} |
|||
} |
|||
|
|||
return match || [this.terminatingState, 0]; |
|||
}; |
|||
} |
|||
|
|||
var FSM = |
|||
/*#__PURE__*/ |
|||
function () { |
|||
function FSM(transitions, initialState) { |
|||
var terminatingState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : STOP; |
|||
|
|||
_classCallCheck(this, FSM); |
|||
|
|||
this.initialState = initialState; |
|||
this.terminatingState = terminatingState; |
|||
|
|||
if (terminatingState === STOP || !transitions[terminatingState]) { |
|||
transitions[terminatingState] = []; |
|||
} |
|||
|
|||
this.transitionFunction = combineTransitions.call(this, transitions); |
|||
} |
|||
|
|||
_createClass(FSM, [{ |
|||
key: "run", |
|||
value: function run(input) { |
|||
this.input = input; |
|||
this.ptr = 0; |
|||
this.currentState = this.initialState; |
|||
var value = ""; |
|||
var eatLength, nextState; |
|||
|
|||
while (this.currentState !== this.terminatingState && this.ptr < this.input.length) { |
|||
var _transitionFunction = this.transitionFunction(); |
|||
|
|||
var _transitionFunction2 = _slicedToArray(_transitionFunction, 2); |
|||
|
|||
nextState = _transitionFunction2[0]; |
|||
eatLength = _transitionFunction2[1]; |
|||
value += this.input.substring(this.ptr, this.ptr += eatLength); |
|||
this.currentState = nextState; |
|||
} |
|||
|
|||
return value; |
|||
} |
|||
}]); |
|||
|
|||
return FSM; |
|||
}(); |
|||
|
|||
exports.FSM = FSM; |
@ -0,0 +1,13 @@ |
|||
{ |
|||
"name": "@webassemblyjs/helper-fsm", |
|||
"version": "1.9.0", |
|||
"description": "FSM implementation", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"author": "Mauro Bringolf", |
|||
"license": "ISC", |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,21 @@ |
|||
MIT License |
|||
|
|||
Copyright (c) 2018 Sven Sauleau <sven@sauleau.com> |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
@ -0,0 +1,378 @@ |
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } |
|||
|
|||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } |
|||
|
|||
// TODO(sven): add flow in here
|
|||
import { isSignature, isNumberLiteral } from "@webassemblyjs/ast"; |
|||
export function moduleContextFromModuleAST(m) { |
|||
var moduleContext = new ModuleContext(); |
|||
|
|||
if (!(m.type === "Module")) { |
|||
throw new Error('m.type === "Module"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
m.fields.forEach(function (field) { |
|||
switch (field.type) { |
|||
case "Start": |
|||
{ |
|||
moduleContext.setStart(field.index); |
|||
break; |
|||
} |
|||
|
|||
case "TypeInstruction": |
|||
{ |
|||
moduleContext.addType(field); |
|||
break; |
|||
} |
|||
|
|||
case "Func": |
|||
{ |
|||
moduleContext.addFunction(field); |
|||
break; |
|||
} |
|||
|
|||
case "Global": |
|||
{ |
|||
moduleContext.defineGlobal(field); |
|||
break; |
|||
} |
|||
|
|||
case "ModuleImport": |
|||
{ |
|||
switch (field.descr.type) { |
|||
case "GlobalType": |
|||
{ |
|||
moduleContext.importGlobal(field.descr.valtype, field.descr.mutability); |
|||
break; |
|||
} |
|||
|
|||
case "Memory": |
|||
{ |
|||
moduleContext.addMemory(field.descr.limits.min, field.descr.limits.max); |
|||
break; |
|||
} |
|||
|
|||
case "FuncImportDescr": |
|||
{ |
|||
moduleContext.importFunction(field.descr); |
|||
break; |
|||
} |
|||
|
|||
case "Table": |
|||
{ |
|||
// FIXME(sven): not implemented yet
|
|||
break; |
|||
} |
|||
|
|||
default: |
|||
throw new Error("Unsupported ModuleImport of type " + JSON.stringify(field.descr.type)); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case "Memory": |
|||
{ |
|||
moduleContext.addMemory(field.limits.min, field.limits.max); |
|||
break; |
|||
} |
|||
} |
|||
}); |
|||
return moduleContext; |
|||
} |
|||
/** |
|||
* Module context for type checking |
|||
*/ |
|||
|
|||
export var ModuleContext = |
|||
/*#__PURE__*/ |
|||
function () { |
|||
function ModuleContext() { |
|||
_classCallCheck(this, ModuleContext); |
|||
|
|||
this.funcs = []; |
|||
this.funcsOffsetByIdentifier = []; |
|||
this.types = []; |
|||
this.globals = []; |
|||
this.globalsOffsetByIdentifier = []; |
|||
this.mems = []; // Current stack frame
|
|||
|
|||
this.locals = []; |
|||
this.labels = []; |
|||
this.return = []; |
|||
this.debugName = "unknown"; |
|||
this.start = null; |
|||
} |
|||
/** |
|||
* Set start segment |
|||
*/ |
|||
|
|||
|
|||
_createClass(ModuleContext, [{ |
|||
key: "setStart", |
|||
value: function setStart(index) { |
|||
this.start = index.value; |
|||
} |
|||
/** |
|||
* Get start function |
|||
*/ |
|||
|
|||
}, { |
|||
key: "getStart", |
|||
value: function getStart() { |
|||
return this.start; |
|||
} |
|||
/** |
|||
* Reset the active stack frame |
|||
*/ |
|||
|
|||
}, { |
|||
key: "newContext", |
|||
value: function newContext(debugName, expectedResult) { |
|||
this.locals = []; |
|||
this.labels = [expectedResult]; |
|||
this.return = expectedResult; |
|||
this.debugName = debugName; |
|||
} |
|||
/** |
|||
* Functions |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addFunction", |
|||
value: function addFunction(func |
|||
/*: Func*/ |
|||
) { |
|||
// eslint-disable-next-line prefer-const
|
|||
var _ref = func.signature || {}, |
|||
_ref$params = _ref.params, |
|||
args = _ref$params === void 0 ? [] : _ref$params, |
|||
_ref$results = _ref.results, |
|||
result = _ref$results === void 0 ? [] : _ref$results; |
|||
|
|||
args = args.map(function (arg) { |
|||
return arg.valtype; |
|||
}); |
|||
this.funcs.push({ |
|||
args: args, |
|||
result: result |
|||
}); |
|||
|
|||
if (typeof func.name !== "undefined") { |
|||
this.funcsOffsetByIdentifier[func.name.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "importFunction", |
|||
value: function importFunction(funcimport) { |
|||
if (isSignature(funcimport.signature)) { |
|||
// eslint-disable-next-line prefer-const
|
|||
var _funcimport$signature = funcimport.signature, |
|||
args = _funcimport$signature.params, |
|||
result = _funcimport$signature.results; |
|||
args = args.map(function (arg) { |
|||
return arg.valtype; |
|||
}); |
|||
this.funcs.push({ |
|||
args: args, |
|||
result: result |
|||
}); |
|||
} else { |
|||
if (!isNumberLiteral(funcimport.signature)) { |
|||
throw new Error('isNumberLiteral(funcimport.signature)' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var typeId = funcimport.signature.value; |
|||
|
|||
if (!this.hasType(typeId)) { |
|||
throw new Error('this.hasType(typeId)' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var signature = this.getType(typeId); |
|||
this.funcs.push({ |
|||
args: signature.params.map(function (arg) { |
|||
return arg.valtype; |
|||
}), |
|||
result: signature.results |
|||
}); |
|||
} |
|||
|
|||
if (typeof funcimport.id !== "undefined") { |
|||
// imports are first, we can assume their index in the array
|
|||
this.funcsOffsetByIdentifier[funcimport.id.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "hasFunction", |
|||
value: function hasFunction(index) { |
|||
return typeof this.getFunction(index) !== "undefined"; |
|||
} |
|||
}, { |
|||
key: "getFunction", |
|||
value: function getFunction(index) { |
|||
if (typeof index !== "number") { |
|||
throw new Error("getFunction only supported for number index"); |
|||
} |
|||
|
|||
return this.funcs[index]; |
|||
} |
|||
}, { |
|||
key: "getFunctionOffsetByIdentifier", |
|||
value: function getFunctionOffsetByIdentifier(name) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
return this.funcsOffsetByIdentifier[name]; |
|||
} |
|||
/** |
|||
* Labels |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addLabel", |
|||
value: function addLabel(result) { |
|||
this.labels.unshift(result); |
|||
} |
|||
}, { |
|||
key: "hasLabel", |
|||
value: function hasLabel(index) { |
|||
return this.labels.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "getLabel", |
|||
value: function getLabel(index) { |
|||
return this.labels[index]; |
|||
} |
|||
}, { |
|||
key: "popLabel", |
|||
value: function popLabel() { |
|||
this.labels.shift(); |
|||
} |
|||
/** |
|||
* Locals |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasLocal", |
|||
value: function hasLocal(index) { |
|||
return typeof this.getLocal(index) !== "undefined"; |
|||
} |
|||
}, { |
|||
key: "getLocal", |
|||
value: function getLocal(index) { |
|||
return this.locals[index]; |
|||
} |
|||
}, { |
|||
key: "addLocal", |
|||
value: function addLocal(type) { |
|||
this.locals.push(type); |
|||
} |
|||
/** |
|||
* Types |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addType", |
|||
value: function addType(type) { |
|||
if (!(type.functype.type === "Signature")) { |
|||
throw new Error('type.functype.type === "Signature"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
this.types.push(type.functype); |
|||
} |
|||
}, { |
|||
key: "hasType", |
|||
value: function hasType(index) { |
|||
return this.types[index] !== undefined; |
|||
} |
|||
}, { |
|||
key: "getType", |
|||
value: function getType(index) { |
|||
return this.types[index]; |
|||
} |
|||
/** |
|||
* Globals |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasGlobal", |
|||
value: function hasGlobal(index) { |
|||
return this.globals.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "getGlobal", |
|||
value: function getGlobal(index) { |
|||
return this.globals[index].type; |
|||
} |
|||
}, { |
|||
key: "getGlobalOffsetByIdentifier", |
|||
value: function getGlobalOffsetByIdentifier(name) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
return this.globalsOffsetByIdentifier[name]; |
|||
} |
|||
}, { |
|||
key: "defineGlobal", |
|||
value: function defineGlobal(global |
|||
/*: Global*/ |
|||
) { |
|||
var type = global.globalType.valtype; |
|||
var mutability = global.globalType.mutability; |
|||
this.globals.push({ |
|||
type: type, |
|||
mutability: mutability |
|||
}); |
|||
|
|||
if (typeof global.name !== "undefined") { |
|||
this.globalsOffsetByIdentifier[global.name.value] = this.globals.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "importGlobal", |
|||
value: function importGlobal(type, mutability) { |
|||
this.globals.push({ |
|||
type: type, |
|||
mutability: mutability |
|||
}); |
|||
} |
|||
}, { |
|||
key: "isMutableGlobal", |
|||
value: function isMutableGlobal(index) { |
|||
return this.globals[index].mutability === "var"; |
|||
} |
|||
}, { |
|||
key: "isImmutableGlobal", |
|||
value: function isImmutableGlobal(index) { |
|||
return this.globals[index].mutability === "const"; |
|||
} |
|||
/** |
|||
* Memories |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasMemory", |
|||
value: function hasMemory(index) { |
|||
return this.mems.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "addMemory", |
|||
value: function addMemory(min, max) { |
|||
this.mems.push({ |
|||
min: min, |
|||
max: max |
|||
}); |
|||
} |
|||
}, { |
|||
key: "getMemory", |
|||
value: function getMemory(index) { |
|||
return this.mems[index]; |
|||
} |
|||
}]); |
|||
|
|||
return ModuleContext; |
|||
}(); |
@ -0,0 +1,389 @@ |
|||
"use strict"; |
|||
|
|||
Object.defineProperty(exports, "__esModule", { |
|||
value: true |
|||
}); |
|||
exports.moduleContextFromModuleAST = moduleContextFromModuleAST; |
|||
exports.ModuleContext = void 0; |
|||
|
|||
var _ast = require("@webassemblyjs/ast"); |
|||
|
|||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|||
|
|||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } |
|||
|
|||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } |
|||
|
|||
function moduleContextFromModuleAST(m) { |
|||
var moduleContext = new ModuleContext(); |
|||
|
|||
if (!(m.type === "Module")) { |
|||
throw new Error('m.type === "Module"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
m.fields.forEach(function (field) { |
|||
switch (field.type) { |
|||
case "Start": |
|||
{ |
|||
moduleContext.setStart(field.index); |
|||
break; |
|||
} |
|||
|
|||
case "TypeInstruction": |
|||
{ |
|||
moduleContext.addType(field); |
|||
break; |
|||
} |
|||
|
|||
case "Func": |
|||
{ |
|||
moduleContext.addFunction(field); |
|||
break; |
|||
} |
|||
|
|||
case "Global": |
|||
{ |
|||
moduleContext.defineGlobal(field); |
|||
break; |
|||
} |
|||
|
|||
case "ModuleImport": |
|||
{ |
|||
switch (field.descr.type) { |
|||
case "GlobalType": |
|||
{ |
|||
moduleContext.importGlobal(field.descr.valtype, field.descr.mutability); |
|||
break; |
|||
} |
|||
|
|||
case "Memory": |
|||
{ |
|||
moduleContext.addMemory(field.descr.limits.min, field.descr.limits.max); |
|||
break; |
|||
} |
|||
|
|||
case "FuncImportDescr": |
|||
{ |
|||
moduleContext.importFunction(field.descr); |
|||
break; |
|||
} |
|||
|
|||
case "Table": |
|||
{ |
|||
// FIXME(sven): not implemented yet
|
|||
break; |
|||
} |
|||
|
|||
default: |
|||
throw new Error("Unsupported ModuleImport of type " + JSON.stringify(field.descr.type)); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
|
|||
case "Memory": |
|||
{ |
|||
moduleContext.addMemory(field.limits.min, field.limits.max); |
|||
break; |
|||
} |
|||
} |
|||
}); |
|||
return moduleContext; |
|||
} |
|||
/** |
|||
* Module context for type checking |
|||
*/ |
|||
|
|||
|
|||
var ModuleContext = |
|||
/*#__PURE__*/ |
|||
function () { |
|||
function ModuleContext() { |
|||
_classCallCheck(this, ModuleContext); |
|||
|
|||
this.funcs = []; |
|||
this.funcsOffsetByIdentifier = []; |
|||
this.types = []; |
|||
this.globals = []; |
|||
this.globalsOffsetByIdentifier = []; |
|||
this.mems = []; // Current stack frame
|
|||
|
|||
this.locals = []; |
|||
this.labels = []; |
|||
this.return = []; |
|||
this.debugName = "unknown"; |
|||
this.start = null; |
|||
} |
|||
/** |
|||
* Set start segment |
|||
*/ |
|||
|
|||
|
|||
_createClass(ModuleContext, [{ |
|||
key: "setStart", |
|||
value: function setStart(index) { |
|||
this.start = index.value; |
|||
} |
|||
/** |
|||
* Get start function |
|||
*/ |
|||
|
|||
}, { |
|||
key: "getStart", |
|||
value: function getStart() { |
|||
return this.start; |
|||
} |
|||
/** |
|||
* Reset the active stack frame |
|||
*/ |
|||
|
|||
}, { |
|||
key: "newContext", |
|||
value: function newContext(debugName, expectedResult) { |
|||
this.locals = []; |
|||
this.labels = [expectedResult]; |
|||
this.return = expectedResult; |
|||
this.debugName = debugName; |
|||
} |
|||
/** |
|||
* Functions |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addFunction", |
|||
value: function addFunction(func |
|||
/*: Func*/ |
|||
) { |
|||
// eslint-disable-next-line prefer-const
|
|||
var _ref = func.signature || {}, |
|||
_ref$params = _ref.params, |
|||
args = _ref$params === void 0 ? [] : _ref$params, |
|||
_ref$results = _ref.results, |
|||
result = _ref$results === void 0 ? [] : _ref$results; |
|||
|
|||
args = args.map(function (arg) { |
|||
return arg.valtype; |
|||
}); |
|||
this.funcs.push({ |
|||
args: args, |
|||
result: result |
|||
}); |
|||
|
|||
if (typeof func.name !== "undefined") { |
|||
this.funcsOffsetByIdentifier[func.name.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "importFunction", |
|||
value: function importFunction(funcimport) { |
|||
if ((0, _ast.isSignature)(funcimport.signature)) { |
|||
// eslint-disable-next-line prefer-const
|
|||
var _funcimport$signature = funcimport.signature, |
|||
args = _funcimport$signature.params, |
|||
result = _funcimport$signature.results; |
|||
args = args.map(function (arg) { |
|||
return arg.valtype; |
|||
}); |
|||
this.funcs.push({ |
|||
args: args, |
|||
result: result |
|||
}); |
|||
} else { |
|||
if (!(0, _ast.isNumberLiteral)(funcimport.signature)) { |
|||
throw new Error('isNumberLiteral(funcimport.signature)' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var typeId = funcimport.signature.value; |
|||
|
|||
if (!this.hasType(typeId)) { |
|||
throw new Error('this.hasType(typeId)' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
var signature = this.getType(typeId); |
|||
this.funcs.push({ |
|||
args: signature.params.map(function (arg) { |
|||
return arg.valtype; |
|||
}), |
|||
result: signature.results |
|||
}); |
|||
} |
|||
|
|||
if (typeof funcimport.id !== "undefined") { |
|||
// imports are first, we can assume their index in the array
|
|||
this.funcsOffsetByIdentifier[funcimport.id.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "hasFunction", |
|||
value: function hasFunction(index) { |
|||
return typeof this.getFunction(index) !== "undefined"; |
|||
} |
|||
}, { |
|||
key: "getFunction", |
|||
value: function getFunction(index) { |
|||
if (typeof index !== "number") { |
|||
throw new Error("getFunction only supported for number index"); |
|||
} |
|||
|
|||
return this.funcs[index]; |
|||
} |
|||
}, { |
|||
key: "getFunctionOffsetByIdentifier", |
|||
value: function getFunctionOffsetByIdentifier(name) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
return this.funcsOffsetByIdentifier[name]; |
|||
} |
|||
/** |
|||
* Labels |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addLabel", |
|||
value: function addLabel(result) { |
|||
this.labels.unshift(result); |
|||
} |
|||
}, { |
|||
key: "hasLabel", |
|||
value: function hasLabel(index) { |
|||
return this.labels.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "getLabel", |
|||
value: function getLabel(index) { |
|||
return this.labels[index]; |
|||
} |
|||
}, { |
|||
key: "popLabel", |
|||
value: function popLabel() { |
|||
this.labels.shift(); |
|||
} |
|||
/** |
|||
* Locals |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasLocal", |
|||
value: function hasLocal(index) { |
|||
return typeof this.getLocal(index) !== "undefined"; |
|||
} |
|||
}, { |
|||
key: "getLocal", |
|||
value: function getLocal(index) { |
|||
return this.locals[index]; |
|||
} |
|||
}, { |
|||
key: "addLocal", |
|||
value: function addLocal(type) { |
|||
this.locals.push(type); |
|||
} |
|||
/** |
|||
* Types |
|||
*/ |
|||
|
|||
}, { |
|||
key: "addType", |
|||
value: function addType(type) { |
|||
if (!(type.functype.type === "Signature")) { |
|||
throw new Error('type.functype.type === "Signature"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
this.types.push(type.functype); |
|||
} |
|||
}, { |
|||
key: "hasType", |
|||
value: function hasType(index) { |
|||
return this.types[index] !== undefined; |
|||
} |
|||
}, { |
|||
key: "getType", |
|||
value: function getType(index) { |
|||
return this.types[index]; |
|||
} |
|||
/** |
|||
* Globals |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasGlobal", |
|||
value: function hasGlobal(index) { |
|||
return this.globals.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "getGlobal", |
|||
value: function getGlobal(index) { |
|||
return this.globals[index].type; |
|||
} |
|||
}, { |
|||
key: "getGlobalOffsetByIdentifier", |
|||
value: function getGlobalOffsetByIdentifier(name) { |
|||
if (!(typeof name === "string")) { |
|||
throw new Error('typeof name === "string"' + " error: " + (undefined || "unknown")); |
|||
} |
|||
|
|||
return this.globalsOffsetByIdentifier[name]; |
|||
} |
|||
}, { |
|||
key: "defineGlobal", |
|||
value: function defineGlobal(global |
|||
/*: Global*/ |
|||
) { |
|||
var type = global.globalType.valtype; |
|||
var mutability = global.globalType.mutability; |
|||
this.globals.push({ |
|||
type: type, |
|||
mutability: mutability |
|||
}); |
|||
|
|||
if (typeof global.name !== "undefined") { |
|||
this.globalsOffsetByIdentifier[global.name.value] = this.globals.length - 1; |
|||
} |
|||
} |
|||
}, { |
|||
key: "importGlobal", |
|||
value: function importGlobal(type, mutability) { |
|||
this.globals.push({ |
|||
type: type, |
|||
mutability: mutability |
|||
}); |
|||
} |
|||
}, { |
|||
key: "isMutableGlobal", |
|||
value: function isMutableGlobal(index) { |
|||
return this.globals[index].mutability === "var"; |
|||
} |
|||
}, { |
|||
key: "isImmutableGlobal", |
|||
value: function isImmutableGlobal(index) { |
|||
return this.globals[index].mutability === "const"; |
|||
} |
|||
/** |
|||
* Memories |
|||
*/ |
|||
|
|||
}, { |
|||
key: "hasMemory", |
|||
value: function hasMemory(index) { |
|||
return this.mems.length > index && index >= 0; |
|||
} |
|||
}, { |
|||
key: "addMemory", |
|||
value: function addMemory(min, max) { |
|||
this.mems.push({ |
|||
min: min, |
|||
max: max |
|||
}); |
|||
} |
|||
}, { |
|||
key: "getMemory", |
|||
value: function getMemory(index) { |
|||
return this.mems[index]; |
|||
} |
|||
}]); |
|||
|
|||
return ModuleContext; |
|||
}(); |
|||
|
|||
exports.ModuleContext = ModuleContext; |
@ -0,0 +1,27 @@ |
|||
{ |
|||
"name": "@webassemblyjs/helper-module-context", |
|||
"version": "1.9.0", |
|||
"description": "", |
|||
"main": "lib/index.js", |
|||
"module": "esm/index.js", |
|||
"scripts": { |
|||
"test": "echo \"Error: no test specified\" && exit 1" |
|||
}, |
|||
"repository": { |
|||
"type": "git", |
|||
"url": "https://github.com/xtuc/webassemblyjs.git" |
|||
}, |
|||
"dependencies": { |
|||
"@webassemblyjs/ast": "1.9.0" |
|||
}, |
|||
"devDependencies": { |
|||
"@webassemblyjs/wast-parser": "1.9.0", |
|||
"mamacro": "^0.0.7" |
|||
}, |
|||
"publishConfig": { |
|||
"access": "public" |
|||
}, |
|||
"author": "Sven Sauleau", |
|||
"license": "MIT", |
|||
"gitHead": "0440b420888c1f7701eb9762ec657775506b87d8" |
|||
} |
@ -0,0 +1,287 @@ |
|||
// TODO(sven): add flow in here
|
|||
|
|||
import { isSignature, isNumberLiteral } from "@webassemblyjs/ast"; |
|||
import { assert } from "mamacro"; |
|||
|
|||
export function moduleContextFromModuleAST(m) { |
|||
const moduleContext = new ModuleContext(); |
|||
|
|||
assert(m.type === "Module"); |
|||
|
|||
m.fields.forEach(field => { |
|||
switch (field.type) { |
|||
case "Start": { |
|||
moduleContext.setStart(field.index); |
|||
break; |
|||
} |
|||
case "TypeInstruction": { |
|||
moduleContext.addType(field); |
|||
break; |
|||
} |
|||
case "Func": { |
|||
moduleContext.addFunction(field); |
|||
break; |
|||
} |
|||
case "Global": { |
|||
moduleContext.defineGlobal(field); |
|||
break; |
|||
} |
|||
case "ModuleImport": { |
|||
switch (field.descr.type) { |
|||
case "GlobalType": { |
|||
moduleContext.importGlobal( |
|||
field.descr.valtype, |
|||
field.descr.mutability |
|||
); |
|||
break; |
|||
} |
|||
case "Memory": { |
|||
moduleContext.addMemory( |
|||
field.descr.limits.min, |
|||
field.descr.limits.max |
|||
); |
|||
break; |
|||
} |
|||
case "FuncImportDescr": { |
|||
moduleContext.importFunction(field.descr); |
|||
break; |
|||
} |
|||
|
|||
case "Table": { |
|||
// FIXME(sven): not implemented yet
|
|||
break; |
|||
} |
|||
|
|||
default: |
|||
throw new Error( |
|||
"Unsupported ModuleImport of type " + |
|||
JSON.stringify(field.descr.type) |
|||
); |
|||
} |
|||
break; |
|||
} |
|||
case "Memory": { |
|||
moduleContext.addMemory(field.limits.min, field.limits.max); |
|||
break; |
|||
} |
|||
} |
|||
}); |
|||
|
|||
return moduleContext; |
|||
} |
|||
|
|||
/** |
|||
* Module context for type checking |
|||
*/ |
|||
export class ModuleContext { |
|||
constructor() { |
|||
this.funcs = []; |
|||
this.funcsOffsetByIdentifier = []; |
|||
|
|||
this.types = []; |
|||
|
|||
this.globals = []; |
|||
this.globalsOffsetByIdentifier = []; |
|||
|
|||
this.mems = []; |
|||
|
|||
// Current stack frame
|
|||
this.locals = []; |
|||
this.labels = []; |
|||
this.return = []; |
|||
|
|||
this.debugName = "unknown"; |
|||
|
|||
this.start = null; |
|||
} |
|||
|
|||
/** |
|||
* Set start segment |
|||
*/ |
|||
setStart(index) { |
|||
this.start = index.value; |
|||
} |
|||
|
|||
/** |
|||
* Get start function |
|||
*/ |
|||
getStart() { |
|||
return this.start; |
|||
} |
|||
|
|||
/** |
|||
* Reset the active stack frame |
|||
*/ |
|||
newContext(debugName, expectedResult) { |
|||
this.locals = []; |
|||
this.labels = [expectedResult]; |
|||
this.return = expectedResult; |
|||
this.debugName = debugName; |
|||
} |
|||
|
|||
/** |
|||
* Functions |
|||
*/ |
|||
addFunction(func /*: Func*/) { |
|||
// eslint-disable-next-line prefer-const
|
|||
let { params: args = [], results: result = [] } = func.signature || {}; |
|||
|
|||
args = args.map(arg => arg.valtype); |
|||
|
|||
this.funcs.push({ args, result }); |
|||
|
|||
if (typeof func.name !== "undefined") { |
|||
this.funcsOffsetByIdentifier[func.name.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
|
|||
importFunction(funcimport) { |
|||
if (isSignature(funcimport.signature)) { |
|||
// eslint-disable-next-line prefer-const
|
|||
let { params: args, results: result } = funcimport.signature; |
|||
args = args.map(arg => arg.valtype); |
|||
|
|||
this.funcs.push({ args, result }); |
|||
} else { |
|||
assert(isNumberLiteral(funcimport.signature)); |
|||
|
|||
const typeId = funcimport.signature.value; |
|||
assert(this.hasType(typeId)); |
|||
|
|||
const signature = this.getType(typeId); |
|||
this.funcs.push({ |
|||
args: signature.params.map(arg => arg.valtype), |
|||
result: signature.results |
|||
}); |
|||
} |
|||
|
|||
if (typeof funcimport.id !== "undefined") { |
|||
// imports are first, we can assume their index in the array
|
|||
this.funcsOffsetByIdentifier[funcimport.id.value] = this.funcs.length - 1; |
|||
} |
|||
} |
|||
|
|||
hasFunction(index) { |
|||
return typeof this.getFunction(index) !== "undefined"; |
|||
} |
|||
|
|||
getFunction(index) { |
|||
if (typeof index !== "number") { |
|||
throw new Error("getFunction only supported for number index"); |
|||
} |
|||
|
|||
return this.funcs[index]; |
|||
} |
|||
|
|||
getFunctionOffsetByIdentifier(name) { |
|||
assert(typeof name === "string"); |
|||
|
|||
return this.funcsOffsetByIdentifier[name]; |
|||
} |
|||
|
|||
/** |
|||
* Labels |
|||
*/ |
|||
addLabel(result) { |
|||
this.labels.unshift(result); |
|||
} |
|||
|
|||
hasLabel(index) { |
|||
return this.labels.length > index && index >= 0; |
|||
} |
|||
|
|||
getLabel(index) { |
|||
return this.labels[index]; |
|||
} |
|||
|
|||
popLabel() { |
|||
this.labels.shift(); |
|||
} |
|||
|
|||
/** |
|||
* Locals |
|||
*/ |
|||
hasLocal(index) { |
|||
return typeof this.getLocal(index) !== "undefined"; |
|||
} |
|||
|
|||
getLocal(index) { |
|||
return this.locals[index]; |
|||
} |
|||
|
|||
addLocal(type) { |
|||
this.locals.push(type); |
|||
} |
|||
|
|||
/** |
|||
* Types |
|||
*/ |
|||
addType(type) { |
|||
assert(type.functype.type === "Signature"); |
|||
this.types.push(type.functype); |
|||
} |
|||
|
|||
hasType(index) { |
|||
return this.types[index] !== undefined; |
|||
} |
|||
|
|||
getType(index) { |
|||
return this.types[index]; |
|||
} |
|||
|
|||
/** |
|||
* Globals |
|||
*/ |
|||
hasGlobal(index) { |
|||
return this.globals.length > index && index >= 0; |
|||
} |
|||
|
|||
getGlobal(index) { |
|||
return this.globals[index].type; |
|||
} |
|||
|
|||
getGlobalOffsetByIdentifier(name) { |
|||
assert(typeof name === "string"); |
|||
|
|||
return this.globalsOffsetByIdentifier[name]; |
|||
} |
|||
|
|||
defineGlobal(global /*: Global*/) { |
|||
const type = global.globalType.valtype; |
|||
const mutability = global.globalType.mutability; |
|||
|
|||
this.globals.push({ type, mutability }); |
|||
|
|||
if (typeof global.name !== "undefined") { |
|||
this.globalsOffsetByIdentifier[global.name.value] = |
|||
this.globals.length - 1; |
|||
} |
|||
} |
|||
|
|||
importGlobal(type, mutability) { |
|||
this.globals.push({ type, mutability }); |
|||
} |
|||
|
|||
isMutableGlobal(index) { |
|||
return this.globals[index].mutability === "var"; |
|||
} |
|||
|
|||
isImmutableGlobal(index) { |
|||
return this.globals[index].mutability === "const"; |
|||
} |
|||
|
|||
/** |
|||
* Memories |
|||
*/ |
|||
hasMemory(index) { |
|||
return this.mems.length > index && index >= 0; |
|||
} |
|||
|
|||
addMemory(min, max) { |
|||
this.mems.push({ min, max }); |
|||
} |
|||
|
|||
getMemory(index) { |
|||
return this.mems[index]; |
|||
} |
|||
} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue