Skip to content

Commit 0ef6a2b

Browse files
committed
LLVMCodeBuilder: Use random number generator from execution context
1 parent f782936 commit 0ef6a2b

File tree

5 files changed

+19
-41
lines changed

5 files changed

+19
-41
lines changed

src/dev/engine/internal/llvm/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ target_sources(scratchcpp
1616
llvmtypes.cpp
1717
llvmtypes.h
1818
llvmfunctions.cpp
19-
llvmfunctions.h
2019
llvmexecutablecode.cpp
2120
llvmexecutablecode.h
2221
llvmexecutioncontext.cpp

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

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
201201
if (reg1->type() == Compiler::StaticType::Bool && reg2->type() == Compiler::StaticType::Bool) {
202202
llvm::Value *bool1 = castValue(arg1.second, Compiler::StaticType::Bool);
203203
llvm::Value *bool2 = castValue(arg2.second, Compiler::StaticType::Bool);
204-
step.functionReturnReg->value = m_builder.CreateCall(resolve_llvm_random_bool(), { bool1, bool2 });
204+
step.functionReturnReg->value = m_builder.CreateCall(resolve_llvm_random_bool(), { executionContextPtr, bool1, bool2 });
205205
} else {
206206
llvm::Constant *inf = llvm::ConstantFP::getInfinity(m_builder.getDoubleTy(), false);
207207
llvm::Value *num1 = removeNaN(castValue(arg1.second, Compiler::StaticType::Number));
@@ -212,11 +212,11 @@ std::shared_ptr<ExecutableCode> LLVMCodeBuilder::finalize()
212212

213213
// NOTE: The random function will be called even in edge cases where it isn't needed, but they're rare, so it shouldn't be an issue
214214
if (reg1->type() == Compiler::StaticType::Number && reg2->type() == Compiler::StaticType::Number)
215-
step.functionReturnReg->value = m_builder.CreateSelect(isInfOrNaN, sum, m_builder.CreateCall(resolve_llvm_random_double(), { num1, num2 }));
215+
step.functionReturnReg->value = m_builder.CreateSelect(isInfOrNaN, sum, m_builder.CreateCall(resolve_llvm_random_double(), { executionContextPtr, num1, num2 }));
216216
else {
217217
llvm::Value *value1 = createValue(reg1);
218218
llvm::Value *value2 = createValue(reg2);
219-
step.functionReturnReg->value = m_builder.CreateSelect(isInfOrNaN, sum, m_builder.CreateCall(resolve_llvm_random(), { value1, value2 }));
219+
step.functionReturnReg->value = m_builder.CreateSelect(isInfOrNaN, sum, m_builder.CreateCall(resolve_llvm_random(), { executionContextPtr, value1, value2 }));
220220
}
221221
}
222222

@@ -2373,18 +2373,21 @@ llvm::FunctionCallee LLVMCodeBuilder::resolve_list_to_string()
23732373

23742374
llvm::FunctionCallee LLVMCodeBuilder::resolve_llvm_random()
23752375
{
2376+
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
23762377
llvm::Type *valuePtr = m_valueDataType->getPointerTo();
2377-
return resolveFunction("llvm_random", llvm::FunctionType::get(m_builder.getDoubleTy(), { valuePtr, valuePtr }, false));
2378+
return resolveFunction("llvm_random", llvm::FunctionType::get(m_builder.getDoubleTy(), { pointerType, valuePtr, valuePtr }, false));
23782379
}
23792380

23802381
llvm::FunctionCallee LLVMCodeBuilder::resolve_llvm_random_double()
23812382
{
2382-
return resolveFunction("llvm_random_double", llvm::FunctionType::get(m_builder.getDoubleTy(), { m_builder.getDoubleTy(), m_builder.getDoubleTy() }, false));
2383+
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
2384+
return resolveFunction("llvm_random_double", llvm::FunctionType::get(m_builder.getDoubleTy(), { pointerType, m_builder.getDoubleTy(), m_builder.getDoubleTy() }, false));
23832385
}
23842386

23852387
llvm::FunctionCallee LLVMCodeBuilder::resolve_llvm_random_bool()
23862388
{
2387-
return resolveFunction("llvm_random_bool", llvm::FunctionType::get(m_builder.getDoubleTy(), { m_builder.getInt1Ty(), m_builder.getInt1Ty() }, false));
2389+
llvm::Type *pointerType = llvm::PointerType::get(llvm::Type::getInt8Ty(m_ctx), 0);
2390+
return resolveFunction("llvm_random_bool", llvm::FunctionType::get(m_builder.getDoubleTy(), { pointerType, m_builder.getInt1Ty(), m_builder.getInt1Ty() }, false));
23882391
}
23892392

23902393
llvm::FunctionCallee LLVMCodeBuilder::resolve_strcasecmp()

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

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,27 @@
11
// SPDX-License-Identifier: Apache-2.0
22

33
#include <scratchcpp/value_functions.h>
4-
5-
#include "llvmfunctions.h"
6-
#include "../../../../engine/internal/randomgenerator.h"
4+
#include <scratchcpp/dev/executioncontext.h>
5+
#include <scratchcpp/irandomgenerator.h>
76

87
namespace libscratchcpp
98
{
109

1110
extern "C"
1211
{
13-
double llvm_random(ValueData *from, ValueData *to)
12+
double llvm_random(ExecutionContext *ctx, ValueData *from, ValueData *to)
1413
{
15-
if (!llvm_rng)
16-
llvm_rng = RandomGenerator::instance().get();
17-
18-
return value_isInt(from) && value_isInt(to) ? llvm_rng->randint(value_toLong(from), value_toLong(to)) : llvm_rng->randintDouble(value_toDouble(from), value_toDouble(to));
14+
return value_isInt(from) && value_isInt(to) ? ctx->rng()->randint(value_toLong(from), value_toLong(to)) : ctx->rng()->randintDouble(value_toDouble(from), value_toDouble(to));
1915
}
2016

21-
double llvm_random_double(double from, double to)
17+
double llvm_random_double(ExecutionContext *ctx, double from, double to)
2218
{
23-
if (!llvm_rng)
24-
llvm_rng = RandomGenerator::instance().get();
25-
26-
return value_doubleIsInt(from) && value_doubleIsInt(to) ? llvm_rng->randint(from, to) : llvm_rng->randintDouble(from, to);
19+
return value_doubleIsInt(from) && value_doubleIsInt(to) ? ctx->rng()->randint(from, to) : ctx->rng()->randintDouble(from, to);
2720
}
2821

29-
double llvm_random_bool(bool from, bool to)
22+
double llvm_random_bool(ExecutionContext *ctx, bool from, bool to)
3023
{
31-
if (!llvm_rng)
32-
llvm_rng = RandomGenerator::instance().get();
33-
34-
return llvm_rng->randint(from, to);
24+
return ctx->rng()->randint(from, to);
3525
}
3626
}
3727

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

Lines changed: 0 additions & 11 deletions
This file was deleted.

test/dev/llvm/llvmcodebuilder_test.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include <scratchcpp/value.h>
22
#include <scratchcpp/dev/executablecode.h>
3+
#include <scratchcpp/dev/executioncontext.h>
34
#include <scratchcpp/script.h>
45
#include <scratchcpp/thread.h>
56
#include <scratchcpp/sprite.h>
67
#include <scratchcpp/stage.h>
78
#include <scratchcpp/variable.h>
89
#include <scratchcpp/list.h>
910
#include <dev/engine/internal/llvm/llvmcodebuilder.h>
10-
#include <dev/engine/internal/llvm/llvmfunctions.h>
1111
#include <gmock/gmock.h>
1212
#include <targetmock.h>
1313
#include <enginemock.h>
@@ -260,6 +260,7 @@ class LLVMCodeBuilderTest : public testing::Test
260260
script.setCode(code);
261261
Thread thread(&m_target, nullptr, &script);
262262
auto ctx = code->createExecutionContext(&thread);
263+
ctx->setRng(&m_rng);
263264

264265
testing::internal::CaptureStdout();
265266
code->run(ctx.get());
@@ -638,8 +639,6 @@ TEST_F(LLVMCodeBuilderTest, Divide)
638639

639640
TEST_F(LLVMCodeBuilderTest, Random)
640641
{
641-
llvm_rng = &m_rng;
642-
643642
EXPECT_CALL(m_rng, randint(-45, 12)).Times(3).WillRepeatedly(Return(-18));
644643
runOpTest(OpType::Random, -45, 12);
645644

@@ -716,8 +715,6 @@ TEST_F(LLVMCodeBuilderTest, Random)
716715
runOpTest(OpType::Random, -inf, -inf, -inf);
717716
runOpTest(OpType::Random, inf, -inf, nan);
718717
runOpTest(OpType::Random, -inf, inf, nan);
719-
720-
llvm_rng = nullptr;
721718
}
722719

723720
TEST_F(LLVMCodeBuilderTest, EqualComparison)

0 commit comments

Comments
 (0)