@@ -507,6 +507,35 @@ TEST_F(LLVMCodeBuilderTest, FunctionCalls)
507507 }
508508}
509509
510+ TEST_F (LLVMCodeBuilderTest, FunctionCallsWithPointers)
511+ {
512+ createBuilder (true );
513+
514+ int var = 12 ;
515+ CompilerValue *v = m_builder->addConstValue (&var);
516+ v = m_builder->addTargetFunctionCall (" test_function_1_ptr_arg_ret" , Compiler::StaticType::Pointer, { Compiler::StaticType::Pointer }, { v });
517+
518+ m_builder->addFunctionCall (" test_print_pointer" , Compiler::StaticType::Void, { Compiler::StaticType::Pointer }, { v });
519+
520+ auto code = m_builder->finalize ();
521+ Script script (&m_target, nullptr , nullptr );
522+ script.setCode (code);
523+ Thread thread (&m_target, nullptr , &script);
524+ auto ctx = code->createExecutionContext (&thread);
525+
526+ std::stringstream s;
527+ s << &m_target;
528+ std::string ptr = s.str ();
529+
530+ const std::string expected = " 1_arg_ret 12\n " + ptr + " \n " ;
531+
532+ EXPECT_CALL (m_target, isStage ());
533+ testing::internal::CaptureStdout ();
534+ code->run (ctx.get ());
535+ ASSERT_EQ (testing::internal::GetCapturedStdout (), expected);
536+ ASSERT_TRUE (code->isFinished (ctx.get ()));
537+ }
538+
510539TEST_F (LLVMCodeBuilderTest, ConstCasting)
511540{
512541 createBuilder (true );
@@ -6093,32 +6122,54 @@ TEST_F(LLVMCodeBuilderTest, Reporters)
60936122
60946123 auto code3 = m_builder->finalize ();
60956124
6096- Script script1 (&sprite, nullptr , nullptr );
6097- script1.setCode (code1);
6098- Thread thread1 (&sprite, nullptr , &script1);
6099- auto ctx = code1->createExecutionContext (&thread1);
6125+ // Reporter 4
6126+ createReporterBuilder (&sprite);
6127+ int pointee;
6128+ m_builder->addConstValue (&pointee);
6129+
6130+ auto code4 = m_builder->finalize ();
6131+
6132+ // Reporter 5
6133+ createReporterBuilder (&sprite);
6134+ v = m_builder->addConstValue (&pointee);
6135+ m_builder->addFunctionCall (" test_const_pointer" , Compiler::StaticType::Pointer, { Compiler::StaticType::Pointer }, { v });
6136+
6137+ auto code5 = m_builder->finalize ();
6138+
6139+ auto runReporter = [&sprite](std::shared_ptr<ExecutableCode> code) {
6140+ Script script (&sprite, nullptr , nullptr );
6141+ script.setCode (code);
6142+ Thread thread1 (&sprite, nullptr , &script);
6143+ auto ctx = code->createExecutionContext (&thread1);
6144+ return code->runReporter (ctx.get ());
6145+ };
61006146
6101- ValueData ret = code1->runReporter (ctx.get ());
6147+ // 1
6148+ ValueData ret = runReporter (code1);
61026149 ASSERT_TRUE (value_isNumber (&ret));
61036150 ASSERT_EQ (value_toDouble (&ret), -45.23 );
61046151 value_free (&ret);
61056152
6106- Script script2 (&sprite, nullptr , nullptr );
6107- script2.setCode (code2);
6108- Thread thread2 (&sprite, nullptr , &script2);
6109- ctx = code2->createExecutionContext (&thread2);
6110-
6111- ret = code2->runReporter (ctx.get ());
6153+ // 2
6154+ ret = runReporter (code2);
61126155 ASSERT_EQ (Value (ret).toString (), " test" );
61136156 value_free (&ret);
61146157
6115- Script script3 (&sprite, nullptr , nullptr );
6116- script3.setCode (code3);
6117- Thread thread3 (&sprite, nullptr , &script3);
6118- ctx = code3->createExecutionContext (&thread3);
6119-
6120- ret = code3->runReporter (ctx.get ());
6158+ // 3
6159+ ret = runReporter (code3);
61216160 var->setValue (" abc" ); // the string should be copied
61226161 ASSERT_EQ (Value (ret).toString (), " Hello world!" );
61236162 value_free (&ret);
6163+
6164+ // 4
6165+ ret = runReporter (code4);
6166+ ASSERT_TRUE (value_isPointer (&ret));
6167+ ASSERT_EQ (value_toPointer (&ret), &pointee);
6168+ value_free (&ret);
6169+
6170+ // 5
6171+ ret = runReporter (code5);
6172+ ASSERT_TRUE (value_isPointer (&ret));
6173+ ASSERT_EQ (value_toPointer (&ret), &pointee);
6174+ value_free (&ret);
61246175}
0 commit comments