Skip to content

Commit

Permalink
fix dynamic variable address tracking and conversion of non ints to int
Browse files Browse the repository at this point in the history
  • Loading branch information
Dakror committed Dec 14, 2023
1 parent 54c4e7b commit a47a099
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
25 changes: 24 additions & 1 deletion Source/Core/DataExpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ enum class Instruction {
EventFnc = 'E', // DataModel.EventCallback(D, A); S -= R;
Assign = 'A', // DataModel.SetVariable(D, R)
DynamicVariable = 'Y', // DataModel.GetVariable(DataModel.ParseAddress(R)) (Looks up a variable by path in R)
CastToInt = 'I' // R = (int)R
// clang-format on
};

Expand Down Expand Up @@ -275,6 +276,18 @@ class DataParser {
program_states.pop_back();
}

bool Address(const String& name)
{
DataAddress address = expression_interface.ParseAddress(name);
if (address.empty())
{
return false;
}

variable_addresses.push_back(std::move(address));
return true;
}

private:
void VariableGetSet(const String& name, bool is_assignment)
{
Expand Down Expand Up @@ -629,6 +642,7 @@ namespace Parse {
{
parser.Next();
String prefix = address_prefix;

prefix.push_back('[');

parser.PushState();
Expand All @@ -649,6 +663,7 @@ namespace Parse {
parser.Push();

Expression(parser);
parser.Emit(Instruction::CastToInt);
parser.Push();

parser.Match(']');
Expand Down Expand Up @@ -719,6 +734,9 @@ namespace Parse {
}
else
{
// add the root of a variable expression as dependency into the address list
parser.Address(name);

parser.DiscardState();
parser.Emit(Instruction::DynamicVariable, Variant());
}
Expand Down Expand Up @@ -994,7 +1012,8 @@ class DataInterpreter {
break;
case Instruction::DynamicVariable:
{
auto address = expression_interface.ParseAddress(R.Get<String>());
auto str = R.Get<String>();
auto address = expression_interface.ParseAddress(str);
if (address.empty())
return Error("Variable address not found.");
R = expression_interface.GetValue(address);
Expand Down Expand Up @@ -1093,6 +1112,10 @@ class DataInterpreter {
else
return Error("Variable address not found.");
}
case Instruction::CastToInt:
{
R = R.Get<int>();
}
break;
default: RMLUI_ERRORMSG("Instruction not implemented."); break;
}
Expand Down
7 changes: 7 additions & 0 deletions Tests/Source/UnitTests/DataBinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,6 +550,13 @@ TEST_CASE("databinding.dynamic_variables")
CHECK(document->QuerySelector("p:nth-child(4)")->GetInnerRML() == "c3");
CHECK(document->QuerySelector("p:nth-child(5)")->GetInnerRML() == "c3");

*globals.i1 = 0;
context->GetDataModel("basics").GetModelHandle().DirtyVariable("i1");
TestsShell::RenderLoop();

CHECK(document->QuerySelector("p:nth-child(3)")->GetInnerRML() == "20");
CHECK(document->QuerySelector("p:nth-child(4)")->GetInnerRML() == "c2");

document->Close();

TestsShell::ShutdownShell();
Expand Down

0 comments on commit a47a099

Please sign in to comment.