Esempio n. 1
0
void WASMModuleParser::getImportedValue(ExecState* exec, const String& importName, JSValue& value)
{
    FAIL_IF_FALSE(m_imports, "Accessing property of non-object.");
    Identifier identifier = Identifier::fromString(&m_vm, importName);
    PropertySlot slot(m_imports.get(), PropertySlot::InternalMethodType::Get);
    if (!m_imports->getPropertySlot(exec, identifier, slot))
        FAIL_WITH_MESSAGE("Can't find a property named \"" + importName + '"');
    FAIL_IF_FALSE(slot.isValue(), "\"" + importName + "\" is not a data property.");
    // We only retrieve data properties. So, this does not cause any user-observable effect.
    value = slot.getValue(exec, identifier);
}
Esempio n. 2
0
ContextExpression WASMFunctionParser::parseExpression(Context& context, WASMExpressionType expressionType)
{
    switch (expressionType) {
    case WASMExpressionType::I32:
        return parseExpressionI32(context);
    case WASMExpressionType::F32:
    case WASMExpressionType::F64:
    case WASMExpressionType::Void:
        // FIXME: Implement these instructions.
        FAIL_WITH_MESSAGE("Unsupported instruction.");
    default:
        ASSERT_NOT_REACHED();
    }
    return 0;
}
Esempio n. 3
0
ContextExpression WASMFunctionParser::parseExpressionI32(Context& context)
{
    bool hasImmediate;
    WASMOpExpressionI32 op;
    WASMOpExpressionI32WithImmediate opWithImmediate;
    uint8_t immediate;
    READ_OP_EXPRESSION_I32_OR_FAIL(hasImmediate, op, opWithImmediate, immediate, "Cannot read the int32 expression opcode.");
    if (!hasImmediate) {
        switch (op) {
        case WASMOpExpressionI32::Immediate:
            return parseImmediateExpressionI32(context);
        case WASMOpExpressionI32::ConstantPoolIndex:
        case WASMOpExpressionI32::GetLocal:
        case WASMOpExpressionI32::GetGlobal:
        case WASMOpExpressionI32::SetLocal:
        case WASMOpExpressionI32::SetGlobal:
        case WASMOpExpressionI32::SLoad8:
        case WASMOpExpressionI32::SLoadWithOffset8:
        case WASMOpExpressionI32::ULoad8:
        case WASMOpExpressionI32::ULoadWithOffset8:
        case WASMOpExpressionI32::SLoad16:
        case WASMOpExpressionI32::SLoadWithOffset16:
        case WASMOpExpressionI32::ULoad16:
        case WASMOpExpressionI32::ULoadWithOffset16:
        case WASMOpExpressionI32::Load32:
        case WASMOpExpressionI32::LoadWithOffset32:
        case WASMOpExpressionI32::Store8:
        case WASMOpExpressionI32::StoreWithOffset8:
        case WASMOpExpressionI32::Store16:
        case WASMOpExpressionI32::StoreWithOffset16:
        case WASMOpExpressionI32::Store32:
        case WASMOpExpressionI32::StoreWithOffset32:
        case WASMOpExpressionI32::CallInternal:
        case WASMOpExpressionI32::CallIndirect:
        case WASMOpExpressionI32::CallImport:
        case WASMOpExpressionI32::Conditional:
        case WASMOpExpressionI32::Comma:
        case WASMOpExpressionI32::FromF32:
        case WASMOpExpressionI32::FromF64:
        case WASMOpExpressionI32::Negate:
        case WASMOpExpressionI32::Add:
        case WASMOpExpressionI32::Sub:
        case WASMOpExpressionI32::Mul:
        case WASMOpExpressionI32::SDiv:
        case WASMOpExpressionI32::UDiv:
        case WASMOpExpressionI32::SMod:
        case WASMOpExpressionI32::UMod:
        case WASMOpExpressionI32::BitNot:
        case WASMOpExpressionI32::BitOr:
        case WASMOpExpressionI32::BitAnd:
        case WASMOpExpressionI32::BitXor:
        case WASMOpExpressionI32::LeftShift:
        case WASMOpExpressionI32::ArithmeticRightShift:
        case WASMOpExpressionI32::LogicalRightShift:
        case WASMOpExpressionI32::CountLeadingZeros:
        case WASMOpExpressionI32::LogicalNot:
        case WASMOpExpressionI32::EqualI32:
        case WASMOpExpressionI32::EqualF32:
        case WASMOpExpressionI32::EqualF64:
        case WASMOpExpressionI32::NotEqualI32:
        case WASMOpExpressionI32::NotEqualF32:
        case WASMOpExpressionI32::NotEqualF64:
        case WASMOpExpressionI32::SLessThanI32:
        case WASMOpExpressionI32::ULessThanI32:
        case WASMOpExpressionI32::LessThanF32:
        case WASMOpExpressionI32::LessThanF64:
        case WASMOpExpressionI32::SLessThanOrEqualI32:
        case WASMOpExpressionI32::ULessThanOrEqualI32:
        case WASMOpExpressionI32::LessThanOrEqualF32:
        case WASMOpExpressionI32::LessThanOrEqualF64:
        case WASMOpExpressionI32::SGreaterThanI32:
        case WASMOpExpressionI32::UGreaterThanI32:
        case WASMOpExpressionI32::GreaterThanF32:
        case WASMOpExpressionI32::GreaterThanF64:
        case WASMOpExpressionI32::SGreaterThanOrEqualI32:
        case WASMOpExpressionI32::UGreaterThanOrEqualI32:
        case WASMOpExpressionI32::GreaterThanOrEqualF32:
        case WASMOpExpressionI32::GreaterThanOrEqualF64:
        case WASMOpExpressionI32::SMin:
        case WASMOpExpressionI32::UMin:
        case WASMOpExpressionI32::SMax:
        case WASMOpExpressionI32::UMax:
        case WASMOpExpressionI32::Abs:
            // FIXME: Implement these instructions.
            FAIL_WITH_MESSAGE("Unsupported instruction.");
        default:
            ASSERT_NOT_REACHED();
        }
    } else {
        switch (opWithImmediate) {
        case WASMOpExpressionI32WithImmediate::Immediate:
            return parseImmediateExpressionI32(context, immediate);
        case WASMOpExpressionI32WithImmediate::ConstantPoolIndex:
        case WASMOpExpressionI32WithImmediate::GetLocal:
            // FIXME: Implement these instructions.
            FAIL_WITH_MESSAGE("Unsupported instruction.");
        default:
            ASSERT_NOT_REACHED();
        }
    }
    return 0;
}
Esempio n. 4
0
ContextStatement WASMFunctionParser::parseStatement(Context& context)
{
    bool hasImmediate;
    WASMOpStatement op;
    WASMOpStatementWithImmediate opWithImmediate;
    uint8_t immediate;
    READ_OP_STATEMENT_OR_FAIL(hasImmediate, op, opWithImmediate, immediate, "Cannot read the statement opcode.");
    if (!hasImmediate) {
        switch (op) {
        case WASMOpStatement::SetLocal:
            parseSetLocalStatement(context);
            break;
        case WASMOpStatement::Return:
            parseReturnStatement(context);
            break;
        case WASMOpStatement::Block:
            parseBlockStatement(context);
            break;
        case WASMOpStatement::If:
            parseIfStatement(context);
            break;
        case WASMOpStatement::IfElse:
            parseIfElseStatement(context);
            break;
        case WASMOpStatement::While:
            parseWhileStatement(context);
            break;
        case WASMOpStatement::Do:
            parseDoStatement(context);
            break;
        case WASMOpStatement::Label:
            parseLabelStatement(context);
            break;
        case WASMOpStatement::Break:
            parseBreakStatement(context);
            break;
        case WASMOpStatement::BreakLabel:
            parseBreakLabelStatement(context);
            break;
        case WASMOpStatement::Continue:
            parseContinueStatement(context);
            break;
        case WASMOpStatement::ContinueLabel:
            parseContinueLabelStatement(context);
            break;
        case WASMOpStatement::Switch:
            parseSwitchStatement(context);
            break;
        case WASMOpStatement::SetGlobal:
        case WASMOpStatement::I32Store8:
        case WASMOpStatement::I32StoreWithOffset8:
        case WASMOpStatement::I32Store16:
        case WASMOpStatement::I32StoreWithOffset16:
        case WASMOpStatement::I32Store32:
        case WASMOpStatement::I32StoreWithOffset32:
        case WASMOpStatement::F32Store:
        case WASMOpStatement::F32StoreWithOffset:
        case WASMOpStatement::F64Store:
        case WASMOpStatement::F64StoreWithOffset:
        case WASMOpStatement::CallInternal:
        case WASMOpStatement::CallIndirect:
        case WASMOpStatement::CallImport:
            // FIXME: Implement these instructions.
            FAIL_WITH_MESSAGE("Unsupported instruction.");
        default:
            ASSERT_NOT_REACHED();
        }
    } else {
        switch (opWithImmediate) {
        case WASMOpStatementWithImmediate::SetLocal:
            parseSetLocalStatement(context, immediate);
            break;
        case WASMOpStatementWithImmediate::SetGlobal:
            // FIXME: Implement this instruction.
            FAIL_WITH_MESSAGE("Unsupported instruction.");
        default:
            ASSERT_NOT_REACHED();
        }
    }
    return UNUSED;
}