Skip to content

Commit 6ad13ee

Browse files
committed
LLVMCodeBuilder: Implement list clear
1 parent 8d0d24f commit 6ad13ee

File tree

6 files changed

+103
-0
lines changed

6 files changed

+103
-0
lines changed

src/dev/engine/internal/icodebuilder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ class ICodeBuilder
5656

5757
virtual void createVariableWrite(Variable *variable) = 0;
5858

59+
virtual void createListClear(List *list) = 0;
60+
5961
virtual void beginIfStatement() = 0;
6062
virtual void beginElseBranch() = 0;
6163
virtual void endIf() = 0;

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,13 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
477477
break;
478478
}
479479

480+
case LLVMInstruction::Type::ClearList: {
481+
assert(step.args.size() == 0);
482+
const LLVMListPtr &listPtr = m_listPtrs[step.workList];
483+
m_builder.CreateCall(resolve_list_clear(), listPtr.ptr);
484+
break;
485+
}
486+
480487
case LLVMInstruction::Type::Yield:
481488
if (!m_warp) {
482489
freeHeap();
@@ -932,6 +939,13 @@ void LLVMCodeBuilder::createVariableWrite(Variable *variable)
932939
m_variablePtrs[variable] = LLVMVariablePtr();
933940
}
934941

942+
void LLVMCodeBuilder::createListClear(List *list)
943+
{
944+
LLVMInstruction &ins = createOp(LLVMInstruction::Type::ClearList, Compiler::StaticType::Void, Compiler::StaticType::Void, 0);
945+
ins.workList = list;
946+
m_listPtrs[list] = LLVMListPtr();
947+
}
948+
935949
void LLVMCodeBuilder::beginIfStatement()
936950
{
937951
LLVMInstruction ins(LLVMInstruction::Type::BeginIf);
@@ -1822,6 +1836,12 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_value_lower()
18221836
return resolveFunction("value_lower", llvm::FunctionType::get(m_builder.getInt1Ty(), { valuePtr, valuePtr }, false));
18231837
}
18241838

1839+
llvm::FunctionCallee LLVMCodeBuilder::resolve_list_clear()
1840+
{
1841+
llvm::Type *listPtr = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
1842+
return resolveFunction("list_clear", llvm::FunctionType::get(m_builder.getInt1Ty(), { listPtr }, false));
1843+
}
1844+
18251845
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()
18261846
{
18271847
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ class LLVMCodeBuilder : public ICodeBuilder
6262

6363
void createVariableWrite(Variable *variable) override;
6464

65+
void createListClear(List *list) override;
66+
6567
void beginIfStatement() override;
6668
void beginElseBranch() override;
6769
void endIf() override;
@@ -132,6 +134,7 @@ class LLVMCodeBuilder : public ICodeBuilder
132134
llvm::FunctionCallee resolve_value_equals();
133135
llvm::FunctionCallee resolve_value_greater();
134136
llvm::FunctionCallee resolve_value_lower();
137+
llvm::FunctionCallee resolve_list_clear();
135138
llvm::FunctionCallee resolve_strcasecmp();
136139

137140
Target *m_target = nullptr;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ struct LLVMInstruction
4242
Exp10,
4343
WriteVariable,
4444
ReadVariable,
45+
ClearList,
4546
Yield,
4647
BeginIf,
4748
BeginElse,

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <scratchcpp/sprite.h>
44
#include <scratchcpp/stage.h>
55
#include <scratchcpp/variable.h>
6+
#include <scratchcpp/list.h>
67
#include <dev/engine/internal/llvm/llvmcodebuilder.h>
78
#include <gmock/gmock.h>
89
#include <targetmock.h>
@@ -1899,6 +1900,80 @@ TEST_F(LLVMCodeBuilderTest, ReadVariable)
18991900
ASSERT_EQ(testing::internal::GetCapturedStdout(), expected);
19001901
}
19011902

1903+
TEST_F(LLVMCodeBuilderTest, ClearList)
1904+
{
1905+
EngineMock engine;
1906+
Stage stage;
1907+
Sprite sprite;
1908+
sprite.setEngine(&engine);
1909+
EXPECT_CALL(engine, stage()).WillRepeatedly(Return(&stage));
1910+
1911+
std::unordered_map<List *, std::string> strings;
1912+
1913+
auto globalList1 = std::make_shared<List>("", "");
1914+
auto globalList2 = std::make_shared<List>("", "");
1915+
auto globalList3 = std::make_shared<List>("", "");
1916+
stage.addList(globalList1);
1917+
stage.addList(globalList2);
1918+
stage.addList(globalList3);
1919+
1920+
auto localList1 = std::make_shared<List>("", "");
1921+
auto localList2 = std::make_shared<List>("", "");
1922+
auto localList3 = std::make_shared<List>("", "");
1923+
sprite.addList(localList1);
1924+
sprite.addList(localList2);
1925+
sprite.addList(localList3);
1926+
1927+
globalList1->append(1);
1928+
globalList1->append(2);
1929+
globalList1->append(3);
1930+
strings[globalList1.get()] = globalList1->toString();
1931+
1932+
globalList2->append("Lorem");
1933+
globalList2->append("ipsum");
1934+
globalList2->append(-4.52);
1935+
strings[globalList2.get()] = globalList2->toString();
1936+
1937+
globalList3->append(true);
1938+
globalList3->append(false);
1939+
globalList3->append(true);
1940+
strings[globalList3.get()] = globalList3->toString();
1941+
1942+
localList1->append("dolor");
1943+
localList1->append("sit");
1944+
localList1->append("amet");
1945+
strings[localList1.get()] = localList1->toString();
1946+
1947+
localList2->append(10);
1948+
localList2->append(9.8);
1949+
localList2->append(true);
1950+
strings[localList2.get()] = localList2->toString();
1951+
1952+
localList3->append("test");
1953+
localList3->append(1.2);
1954+
localList3->append(false);
1955+
strings[localList3.get()] = localList3->toString();
1956+
1957+
createBuilder(&sprite, true);
1958+
1959+
m_builder->createListClear(globalList1.get());
1960+
m_builder->createListClear(globalList3.get());
1961+
m_builder->createListClear(localList1.get());
1962+
m_builder->createListClear(localList2.get());
1963+
1964+
auto code = m_builder->finalize();
1965+
auto ctx = code->createExecutionContext(&sprite);
1966+
code->run(ctx.get());
1967+
1968+
ASSERT_TRUE(globalList1->empty());
1969+
ASSERT_EQ(globalList2->toString(), strings[globalList2.get()]);
1970+
ASSERT_TRUE(globalList3->empty());
1971+
1972+
ASSERT_TRUE(localList1->empty());
1973+
ASSERT_TRUE(localList2->empty());
1974+
ASSERT_EQ(localList3->toString(), strings[localList3.get()]);
1975+
}
1976+
19021977
TEST_F(LLVMCodeBuilderTest, Yield)
19031978
{
19041979
auto build = [this]() {

test/mocks/codebuildermock.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class CodeBuilderMock : public ICodeBuilder
4646

4747
MOCK_METHOD(void, createVariableWrite, (Variable *), (override));
4848

49+
MOCK_METHOD(void, createListClear, (List *), (override));
50+
4951
MOCK_METHOD(void, beginIfStatement, (), (override));
5052
MOCK_METHOD(void, beginElseBranch, (), (override));
5153
MOCK_METHOD(void, endIf, (), (override));

0 commit comments

Comments
 (0)