Skip to content

Commit b0d2666

Browse files
committed
LLVMCodeBuilder: Implement list contains
1 parent c40db7f commit b0d2666

File tree

6 files changed

+113
-2
lines changed

6 files changed

+113
-2
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ICodeBuilder
2525
virtual void addListContents(List *list) = 0;
2626
virtual void addListItem(List *list) = 0;
2727
virtual void addListItemIndex(List *list) = 0;
28+
virtual void addListContains(List *list) = 0;
2829
virtual void addListSize(List *list) = 0;
2930

3031
virtual void createAdd() = 0;

src/dev/engine/internal/llvm/llvmcodebuilder.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,16 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
594594
assert(step.args.size() == 1);
595595
const auto &arg = step.args[0];
596596
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
597-
step.functionReturnReg->value = getListItemIndex(listPtr, arg.second, func);
597+
step.functionReturnReg->value = m_builder.CreateSIToFP(getListItemIndex(listPtr, arg.second, func), m_builder.getDoubleTy());
598+
break;
599+
}
600+
601+
case LLVMInstruction::Type::ListContainsItem: {
602+
assert(step.args.size() == 1);
603+
const auto &arg = step.args[0];
604+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
605+
llvm::Value *index = getListItemIndex(listPtr, arg.second, func);
606+
step.functionReturnReg->value = m_builder.CreateICmpSGT(index, llvm::ConstantInt::get(m_builder.getInt64Ty(), -1, true));
598607
break;
599608
}
600609

@@ -944,6 +953,13 @@ void LLVMCodeBuilder::addListItemIndex(List *list)
944953
m_listPtrs[list] = LLVMListPtr();
945954
}
946955

956+
void LLVMCodeBuilder::addListContains(List *list)
957+
{
958+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::ListContainsItem, Compiler::StaticType::Bool, Compiler::StaticType::Unknown, 1);
959+
ins.workList = list;
960+
m_listPtrs[list] = LLVMListPtr();
961+
}
962+
947963
void LLVMCodeBuilder::addListSize(List *list)
948964
{
949965
LLVMInstruction &ins = createOp(LLVMInstruction::Type::GetListSize, Compiler::StaticType::Number, {}, 0);
@@ -1814,7 +1830,7 @@ llvm::Value *LLVMCodeBuilder::getListItemIndex(const LLVMListPtr &listPtr, LLVMR
18141830
// nextBlock:
18151831
m_builder.SetInsertPoint(nextBlock);
18161832

1817-
return m_builder.CreateSIToFP(m_builder.CreateLoad(m_builder.getInt64Ty(), index), m_builder.getDoubleTy());
1833+
return m_builder.CreateLoad(m_builder.getInt64Ty(), index);
18181834
}
18191835

18201836
llvm::Value *LLVMCodeBuilder::createValue(LLVMRegisterPtr reg)

src/dev/engine/internal/llvm/llvmcodebuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class LLVMCodeBuilder : public ICodeBuilder
3131
void addListContents(List *list) override;
3232
void addListItem(List *list) override;
3333
void addListItemIndex(List *list) override;
34+
void addListContains(List *list) override;
3435
void addListSize(List *list) override;
3536

3637
void createAdd() override;

src/dev/engine/internal/llvm/llvminstruction.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct LLVMInstruction
5050
GetListItem,
5151
GetListSize,
5252
GetListItemIndex,
53+
ListContainsItem,
5354
Yield,
5455
BeginIf,
5556
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2395,6 +2395,97 @@ TEST_F(LLVMCodeBuilderTest, GetListItemIndex)
23952395
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor sit");
23962396
}
23972397

2398+
TEST_F(LLVMCodeBuilderTest, ListContainsItem)
2399+
{
2400+
EngineMock engine;
2401+
Stage stage;
2402+
Sprite sprite;
2403+
sprite.setEngine(&engine);
2404+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
2405+
2406+
auto globalList = std::make_shared<List>("", "");
2407+
stage.addList(globalList);
2408+
2409+
auto localList = std::make_shared<List>("", "");
2410+
sprite.addList(localList);
2411+
2412+
globalList->append(1);
2413+
globalList->append(2);
2414+
globalList->append(3);
2415+
2416+
localList->append("Lorem");
2417+
localList->append("ipsum");
2418+
localList->append("dolor");
2419+
localList->append("sit");
2420+
2421+
createBuilder(&sprite, true);
2422+
2423+
m_builder->addConstValue(2);
2424+
m_builder->addListContains(globalList.get());
2425+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2426+
2427+
m_builder->addConstValue(1);
2428+
m_builder->addListContains(globalList.get());
2429+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2430+
2431+
m_builder->addConstValue(0);
2432+
m_builder->addListContains(globalList.get());
2433+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2434+
2435+
m_builder->addConstValue(1);
2436+
m_builder->addConstValue("test");
2437+
m_builder->createListReplace(globalList.get());
2438+
2439+
m_builder->addConstValue(2);
2440+
m_builder->addListContains(globalList.get());
2441+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2442+
2443+
m_builder->addConstValue(1);
2444+
m_builder->addListContains(globalList.get());
2445+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2446+
2447+
m_builder->addConstValue("test");
2448+
m_builder->addListContains(globalList.get());
2449+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2450+
2451+
m_builder->addConstValue("abc");
2452+
m_builder->addListContains(globalList.get());
2453+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2454+
2455+
m_builder->addConstValue("doLor");
2456+
m_builder->addListContains(localList.get());
2457+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2458+
2459+
m_builder->addConstValue(true);
2460+
m_builder->addListContains(localList.get());
2461+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2462+
2463+
m_builder->addConstValue("site");
2464+
m_builder->addListContains(localList.get());
2465+
m_builder->addFunctionCall("test_print_string", Compiler::StaticType::Void, { Compiler::StaticType::String });
2466+
2467+
static const std::string expected =
2468+
"true\n"
2469+
"true\n"
2470+
"false\n"
2471+
"false\n"
2472+
"true\n"
2473+
"true\n"
2474+
"false\n"
2475+
"true\n"
2476+
"false\n"
2477+
"false\n";
2478+
2479+
auto code = m_builder->finalize();
2480+
auto ctx = code->createExecutionContext(&sprite);
2481+
testing::internal::CaptureStdout();
2482+
code->run(ctx.get());
2483+
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
2484+
2485+
ASSERT_EQ(globalList->toString(), "1 test 3");
2486+
ASSERT_EQ(localList->toString(), "Lorem ipsum dolor sit");
2487+
}
2488+
23982489
TEST_F(LLVMCodeBuilderTest, Yield)
23992490
{
24002491
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class CodeBuilderMock : public ICodeBuilder
1515
MOCK_METHOD(void, addListContents, (List *), (override));
1616
MOCK_METHOD(void, addListItem, (List *), (override));
1717
MOCK_METHOD(void, addListItemIndex, (List *), (override));
18+
MOCK_METHOD(void, addListContains, (List *), (override));
1819
MOCK_METHOD(void, addListSize, (List *), (override));
1920

2021
MOCK_METHOD(void, createAdd, (), (override));

0 commit comments

Comments
 (0)