Skip to content

Commit 18b4093

Browse files
committed
LLVMCodeBuilder: Fix non-raw value to unknown type conversion
1 parent 6167217 commit 18b4093

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2256,6 +2256,9 @@ llvm::Value *LLVMCodeBuilder::castValue(LLVMRegister *reg, Compiler::StaticType
22562256
return nullptr;
22572257
}
22582258

2259+
case Compiler::StaticType::Unknown:
2260+
return createValue(reg);
2261+
22592262
default:
22602263
assert(false);
22612264
return nullptr;

test/llvm/llvmcodebuilder_test.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,6 +2106,56 @@ TEST_F(LLVMCodeBuilderTest, ReadVariable)
21062106
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
21072107
}
21082108

2109+
TEST_F(LLVMCodeBuilderTest, CastNonRawValueToUnknownType)
2110+
{
2111+
Stage stage;
2112+
Sprite sprite;
2113+
sprite.setEngine(&m_engine);
2114+
EXPECT_CALL(m_engine, stage()).WillRepeatedly(Return(&stage));
2115+
2116+
auto var = std::make_shared<Variable>("", "", 87);
2117+
stage.addVariable(var);
2118+
2119+
createBuilder(&sprite, true);
2120+
2121+
// Unknown type
2122+
CompilerValue *v = m_builder->addVariableValue(var.get());
2123+
m_builder->addFunctionCall("test_print_unknown", Compiler::StaticType::Void, { Compiler::StaticType::Unknown }, { v });
2124+
2125+
// Number
2126+
v = m_builder->addConstValue(23.5);
2127+
m_builder->createVariableWrite(var.get(), v);
2128+
v = m_builder->addVariableValue(var.get());
2129+
m_builder->addFunctionCall("test_print_unknown", Compiler::StaticType::Void, { Compiler::StaticType::Unknown }, { v });
2130+
2131+
// String
2132+
v = m_builder->addConstValue("Hello world");
2133+
m_builder->createVariableWrite(var.get(), v);
2134+
v = m_builder->addVariableValue(var.get());
2135+
m_builder->addFunctionCall("test_print_unknown", Compiler::StaticType::Void, { Compiler::StaticType::Unknown }, { v });
2136+
2137+
// Bool
2138+
v = m_builder->addConstValue(true);
2139+
m_builder->createVariableWrite(var.get(), v);
2140+
v = m_builder->addVariableValue(var.get());
2141+
m_builder->addFunctionCall("test_print_unknown", Compiler::StaticType::Void, { Compiler::StaticType::Unknown }, { v });
2142+
2143+
std::string expected;
2144+
expected += var->value().toString() + '\n';
2145+
expected += "23.5\n";
2146+
expected += "Hello world\n";
2147+
expected += "true\n";
2148+
2149+
auto code = m_builder->finalize();
2150+
Script script(&sprite, nullptr, nullptr);
2151+
script.setCode(code);
2152+
Thread thread(&sprite, nullptr, &script);
2153+
auto ctx = code->createExecutionContext(&thread);
2154+
testing::internal::CaptureStdout();
2155+
code->run(ctx.get());
2156+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
2157+
}
2158+
21092159
TEST_F(LLVMCodeBuilderTest, ClearList)
21102160
{
21112161
Stage stage;

0 commit comments

Comments
 (0)