| /* |
| * Copyright (C) 2016-2017 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. 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. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. |
| */ |
| |
| import * as utilities from 'utilities.js'; |
| |
| const _mapValues = from => { |
| let values = {}; |
| for (const key in from) |
| values[key] = from[key].value; |
| return values; |
| }; |
| |
| export const description = utilities.json("wasm.json"); |
| export const type = Object.keys(description.type); |
| const _typeSet = new Set(type); |
| export const isValidType = v => _typeSet.has(v); |
| export const typeValue = _mapValues(description.type); |
| const _valueTypeSet = new Set(description.value_type); |
| export const isValidValueType = v => _valueTypeSet.has(v); |
| const _blockTypeSet = new Set(description.block_type); |
| export const isValidBlockType = v => _blockTypeSet.has(v); |
| export const externalKindValue = _mapValues(description.external_kind); |
| export const sections = Object.keys(description.section); |
| export const sectionEncodingType = description.section[sections[0]].type; |
| |
| export function* opcodes(category = undefined) { |
| for (let op in description.opcode) |
| if (category !== undefined && description.opcode[op].category === category) |
| yield { name: op, opcode: description.opcode[op] }; |
| }; |
| export const memoryAccessInfo = op => { |
| // <-----------valueType-----------> <-------type-------><---------width--------> <--sign--> |
| const classify = /((?:i32)|(?:i64)|(?:f32)|(?:f64))\.((?:load)|(?:store))((?:8)|(?:16)|(?:32))?_?((?:s|u)?)/; |
| const found = op.name.match(classify); |
| const valueType = found[1]; |
| const type = found[2]; |
| const width = parseInt(found[3] ? found[3] : valueType.slice(1)); |
| const sign = (() => { |
| switch (found[4]) { |
| case "s": return "signed"; |
| case "u": return "unsigned"; |
| default: return "agnostic"; |
| } |
| })(); |
| return { valueType, type, width, sign }; |
| }; |
| |
| export const constForValueType = valueType => { |
| for (let op in description.opcode) |
| if (op.endsWith(".const") && description.opcode[op]["return"] == valueType) |
| return op; |
| throw new Error(`Implementation problem: no const type for ${valueType}`); |
| }; |
| |