mirror of
https://github.com/tweag/asterius.git
synced 2024-09-11 08:55:32 +03:00
Remove hashable shims
This commit is contained in:
parent
ad42769975
commit
09e9a9f829
54
asterius/libc/fnv.c
Normal file
54
asterius/libc/fnv.c
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
Copyright Johan Tibell 2011
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* Neither the name of Johan Tibell nor the names of other
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* FNV-1 hash
|
||||
*
|
||||
* The FNV-1 hash description: http://isthe.com/chongo/tech/comp/fnv/
|
||||
* The FNV-1 hash is public domain: http://isthe.com/chongo/tech/comp/fnv/#public_domain
|
||||
*/
|
||||
long hashable_fnv_hash(const unsigned char* str, long len, long salt) {
|
||||
|
||||
unsigned long hash = salt;
|
||||
while (len--) {
|
||||
hash = (hash * 16777619) ^ *str++;
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
/* Used for ByteArray#s. We can't treat them like pointers in
|
||||
native Haskell, but we can in unsafe FFI calls.
|
||||
*/
|
||||
long hashable_fnv_hash_offset(const unsigned char* str, long offset, long len, long salt) {
|
||||
return hashable_fnv_hash(str + offset, len, salt);
|
||||
}
|
93
asterius/libc/getRandomBytes.c
Normal file
93
asterius/libc/getRandomBytes.c
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
Copyright Bryan O'Sullivan 2012
|
||||
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
* Neither the name of Johan Tibell nor the names of other
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "MachDeps.h"
|
||||
|
||||
int hashable_getRandomBytes(unsigned char *dest, int nbytes);
|
||||
|
||||
#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
|
||||
|
||||
#include <windows.h>
|
||||
#include <wincrypt.h>
|
||||
|
||||
int hashable_getRandomBytes(unsigned char *dest, int nbytes)
|
||||
{
|
||||
HCRYPTPROV hCryptProv;
|
||||
int ret;
|
||||
|
||||
if (!CryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
|
||||
CRYPT_VERIFYCONTEXT))
|
||||
return -1;
|
||||
|
||||
ret = CryptGenRandom(hCryptProv, (DWORD) nbytes, (BYTE *) dest) ? nbytes : -1;
|
||||
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
bail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Assumptions: /dev/urandom exists and does something sane, and does
|
||||
not block. */
|
||||
|
||||
int hashable_getRandomBytes(unsigned char *dest, int nbytes)
|
||||
{
|
||||
ssize_t off, nread;
|
||||
int fd;
|
||||
|
||||
fd = open("/dev/urandom", O_RDONLY);
|
||||
if (fd == -1)
|
||||
return -1;
|
||||
|
||||
for (off = 0; nbytes > 0; nbytes -= nread) {
|
||||
nread = read(fd, dest + off, nbytes);
|
||||
off += nread;
|
||||
if (nread == -1) {
|
||||
off = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bail:
|
||||
close(fd);
|
||||
|
||||
return off;
|
||||
}
|
||||
|
||||
#endif
|
@ -5,6 +5,18 @@ export class WASI {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_close`);
|
||||
}
|
||||
|
||||
fd_prestat_dir_name() {
|
||||
throw new WebAssembly.RuntimeError(
|
||||
`Unsupported wasi interface: fd_prestat_dir_name`
|
||||
);
|
||||
}
|
||||
|
||||
fd_prestat_get() {
|
||||
throw new WebAssembly.RuntimeError(
|
||||
`Unsupported wasi interface: fd_prestat_get`
|
||||
);
|
||||
}
|
||||
|
||||
fd_seek() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_seek`);
|
||||
}
|
||||
@ -12,4 +24,8 @@ export class WASI {
|
||||
fd_write() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_write`);
|
||||
}
|
||||
|
||||
proc_exit() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: proc_exit`);
|
||||
}
|
||||
}
|
||||
|
@ -5,6 +5,18 @@ export class WASI {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_close`);
|
||||
}
|
||||
|
||||
fd_prestat_dir_name() {
|
||||
throw new WebAssembly.RuntimeError(
|
||||
`Unsupported wasi interface: fd_prestat_dir_name`
|
||||
);
|
||||
}
|
||||
|
||||
fd_prestat_get() {
|
||||
throw new WebAssembly.RuntimeError(
|
||||
`Unsupported wasi interface: fd_prestat_get`
|
||||
);
|
||||
}
|
||||
|
||||
fd_seek() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_seek`);
|
||||
}
|
||||
@ -12,4 +24,8 @@ export class WASI {
|
||||
fd_write() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: fd_write`);
|
||||
}
|
||||
|
||||
proc_exit() {
|
||||
throw new WebAssembly.RuntimeError(`Unsupported wasi interface: proc_exit`);
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,6 @@ import Asterius.Builtins.CMath
|
||||
import Asterius.Builtins.Endianness
|
||||
import Asterius.Builtins.Env
|
||||
import Asterius.Builtins.Exports
|
||||
import Asterius.Builtins.Hashable
|
||||
import Asterius.Builtins.Math
|
||||
import Asterius.Builtins.Posix
|
||||
import Asterius.Builtins.Primitive
|
||||
@ -190,7 +189,6 @@ rtsAsteriusModule opts =
|
||||
<> sparksCBits
|
||||
<> schedulerCBits
|
||||
<> cmathCBits
|
||||
<> hashableCBits
|
||||
<> envCBits
|
||||
<> posixCBits
|
||||
<> sptCBits
|
||||
|
@ -1,33 +0,0 @@
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Asterius.Builtins.Hashable
|
||||
( hashableCBits,
|
||||
)
|
||||
where
|
||||
|
||||
import Asterius.EDSL
|
||||
import Asterius.Types
|
||||
|
||||
hashableCBits :: AsteriusModule
|
||||
hashableCBits = hashableFNVHash <> hashableFNVHashOffset
|
||||
|
||||
hashableFNVHash, hashableFNVHashOffset :: AsteriusModule
|
||||
hashableFNVHash = runEDSL "hashable_fnv_hash" $ do
|
||||
setReturnTypes [I64]
|
||||
[str, len, salt] <- params [I64, I64, I64]
|
||||
hash <- i64MutLocal
|
||||
putLVal hash salt
|
||||
i <- i64MutLocal
|
||||
putLVal i $ constI64 0
|
||||
whileLoop (getLVal i `ltUInt64` len) $ do
|
||||
putLVal hash $
|
||||
( getLVal hash
|
||||
`xorInt64` extendUInt32 (loadI8 (str `addInt64` getLVal i) 0)
|
||||
)
|
||||
`mulInt64` constI64 1099511628211
|
||||
putLVal i $ getLVal i `addInt64` constI64 1
|
||||
emit $ getLVal hash
|
||||
hashableFNVHashOffset = runEDSL "hashable_fnv_hash_offset" $ do
|
||||
setReturnTypes [I64]
|
||||
[str, offset', len, salt] <- params [I64, I64, I64, I64]
|
||||
call' "hashable_fnv_hash" [str `addInt64` offset', len, salt] I64 >>= emit
|
Loading…
Reference in New Issue
Block a user