49fdd23d58
* Move secureApi to shell * Extract isTestnet test * Use mobx + subscriptions for status * Re-add status indicator * Add lerna * Move intial packages to js/packages * Move 3rdparty/{email,sms}-verification to correct location * Move package.json & README to library src * Move tests for library packages * Move views & dapps to packages * Move i18n to root * Move shell to actual src (main app) * Remove ~ references * Change ~ to root (explicit imports) * Finalise convert of ~ * Move views into dapps as well * Move dapps to packages/ * Fix references * Update css * Update test spec locations * Update tests * Case fix * Skip flakey tests * Update enzyme * Skip previously ignored tests * Allow empty api for hw * Re-add theme for embed
148 lines
3.7 KiB
JavaScript
148 lines
3.7 KiB
JavaScript
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
|
// This file is part of Parity.
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/* global WebAssembly */
|
|
|
|
import wasmBuffer from './ethkey.wasm.js';
|
|
|
|
const NOOP = () => {};
|
|
|
|
// WASM memory setup
|
|
const WASM_PAGE_SIZE = 65536;
|
|
const STATIC_BASE = 1024;
|
|
const STATICTOP = STATIC_BASE + WASM_PAGE_SIZE * 2;
|
|
const STACK_BASE = align(STATICTOP + 16);
|
|
const STACKTOP = STACK_BASE;
|
|
const TOTAL_STACK = 5 * 1024 * 1024;
|
|
const TOTAL_MEMORY = 16777216;
|
|
const STACK_MAX = STACK_BASE + TOTAL_STACK;
|
|
const DYNAMIC_BASE = STACK_MAX + 64;
|
|
const DYNAMICTOP_PTR = STACK_MAX;
|
|
|
|
function mockWebAssembly () {
|
|
function throwWasmError () {
|
|
throw new Error('Missing WebAssembly support');
|
|
}
|
|
|
|
// Simple mock replacement
|
|
return {
|
|
Memory: class { buffer = new ArrayBuffer(2048) },
|
|
Table: class {},
|
|
Module: class {},
|
|
Instance: class {
|
|
exports = {
|
|
'_input_ptr': () => 0,
|
|
'_secret_ptr': () => 0,
|
|
'_public_ptr': () => 0,
|
|
'_address_ptr': () => 0,
|
|
'_ecpointg': NOOP,
|
|
'_brain': throwWasmError,
|
|
'_verify_secret': throwWasmError
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
const { Memory, Table, Module, Instance } = typeof WebAssembly !== 'undefined' ? WebAssembly : mockWebAssembly();
|
|
|
|
const wasmMemory = new Memory({
|
|
initial: TOTAL_MEMORY / WASM_PAGE_SIZE,
|
|
maximum: TOTAL_MEMORY / WASM_PAGE_SIZE
|
|
});
|
|
|
|
const wasmTable = new Table({
|
|
initial: 8,
|
|
maximum: 8,
|
|
element: 'anyfunc'
|
|
});
|
|
|
|
// TypedArray views into the memory
|
|
const wasmMemoryU8 = new Uint8Array(wasmMemory.buffer);
|
|
const wasmMemoryU32 = new Uint32Array(wasmMemory.buffer);
|
|
|
|
// Keep DYNAMIC_BASE in memory
|
|
wasmMemoryU32[DYNAMICTOP_PTR >> 2] = align(DYNAMIC_BASE);
|
|
|
|
function align (mem) {
|
|
const ALIGN_SIZE = 16;
|
|
|
|
return (Math.ceil(mem / ALIGN_SIZE) * ALIGN_SIZE) | 0;
|
|
}
|
|
|
|
export function slice (ptr, len) {
|
|
return wasmMemoryU8.subarray(ptr, ptr + len);
|
|
}
|
|
|
|
// Required by emscripten
|
|
function abort (what) {
|
|
throw new Error(what || 'WASM abort');
|
|
}
|
|
|
|
// Required by emscripten
|
|
function abortOnCannotGrowMemory () {
|
|
abort(`Cannot enlarge memory arrays.`);
|
|
}
|
|
|
|
// Required by emscripten
|
|
function enlargeMemory () {
|
|
abortOnCannotGrowMemory();
|
|
}
|
|
|
|
// Required by emscripten
|
|
function getTotalMemory () {
|
|
return TOTAL_MEMORY;
|
|
}
|
|
|
|
// Required by emscripten - used to perform memcpy on large data
|
|
function memcpy (dest, src, len) {
|
|
wasmMemoryU8.set(wasmMemoryU8.subarray(src, src + len), dest);
|
|
|
|
return dest;
|
|
}
|
|
|
|
// Synchronously compile WASM from the buffer
|
|
const module = new Module(wasmBuffer);
|
|
|
|
// Instantiated WASM module
|
|
const instance = new Instance(module, {
|
|
global: {},
|
|
env: {
|
|
DYNAMICTOP_PTR,
|
|
STACKTOP,
|
|
STACK_MAX,
|
|
abort,
|
|
enlargeMemory,
|
|
getTotalMemory,
|
|
abortOnCannotGrowMemory,
|
|
___lock: NOOP,
|
|
___syscall6: () => 0,
|
|
___setErrNo: (no) => no,
|
|
_abort: abort,
|
|
___syscall140: () => 0,
|
|
_emscripten_memcpy_big: memcpy,
|
|
___syscall54: () => 0,
|
|
___unlock: NOOP,
|
|
_llvm_trap: abort,
|
|
___syscall146: () => 0,
|
|
'memory': wasmMemory,
|
|
'table': wasmTable,
|
|
tableBase: 0,
|
|
memoryBase: STATIC_BASE
|
|
}
|
|
});
|
|
|
|
export const extern = instance.exports;
|