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); }
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; }
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; }
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; }