diff --git a/cel_expr_python/cel_test.py b/cel_expr_python/cel_test.py index fd5c8ef..377dadd 100644 --- a/cel_expr_python/cel_test.py +++ b/cel_expr_python/cel_test.py @@ -885,6 +885,22 @@ def testProtoMessageToCelValueError(self): self.assertEqual(res.type(), cel.Type.ERROR) self.assertIn("Custom pool error", str(res.value())) + def testValueOutlivesExpression(self): + expr: cel.Expression = self.env.compile("'hello ' + 'world'") + val: cel.Value = expr.eval() + del expr + self.assertEqual(val.value(), "hello world") + + expr = self.env.compile("b'hello'") + val = expr.eval() + del expr + self.assertEqual(val.value(), b"hello") + + expr = self.env.compile("['a', 'b', 'c']") + val = expr.eval() + del expr + self.assertEqual(val.plain_value(), ["a", "b", "c"]) + class CompatibleNumber: diff --git a/cel_expr_python/py_cel_expression.cc b/cel_expr_python/py_cel_expression.cc index 41a645a..725c4ab 100644 --- a/cel_expr_python/py_cel_expression.cc +++ b/cel_expr_python/py_cel_expression.cc @@ -202,6 +202,7 @@ absl::StatusOr PyCelExpression::Eval( result, program->Evaluate(arena->GetArena(), *activation.GetActivation(), std::move(options))); + result = result.Clone(arena->GetArena()); } return PyCelValue(result, arena, std::move(env)); }