• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

polserver / polserver / 25918451630

15 May 2026 12:43PM UTC coverage: 60.929% (+2.1%) from 58.859%
25918451630

push

github

turleypol
added dynamic property which returns a pointer of the object instead of
a copy like the current imp.
needed to be able to eg store a vector

43 of 61 new or added lines in 2 files covered. (70.49%)

14455 existing lines in 345 files now uncovered.

44695 of 73356 relevant lines covered (60.93%)

449621.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.94
/pol-core/bscript/compiler/optimizer/UnaryOperatorOptimizer.cpp
1
#include "UnaryOperatorOptimizer.h"
2

3
#include "bscript/compiler/ast/BooleanValue.h"
4
#include "bscript/compiler/ast/FloatValue.h"
5
#include "bscript/compiler/ast/IntegerValue.h"
6
#include "bscript/compiler/ast/MemberAccess.h"
7
#include "bscript/compiler/ast/MemberAssignmentByOperator.h"
8
#include "bscript/compiler/ast/UnaryOperator.h"
9
#include "bscript/compiler/ast/UninitializedValue.h"
10

11
namespace Pol::Bscript::Compiler
12
{
13
UnaryOperatorOptimizer::UnaryOperatorOptimizer( UnaryOperator& unary_operator )
9,254✔
14
    : unary_operator( unary_operator )
9,254✔
15
{
16
}
9,254✔
17

18
std::unique_ptr<Expression> UnaryOperatorOptimizer::optimize()
9,254✔
19
{
20
  unary_operator.operand().accept( *this );
9,254✔
21
  return std::move( optimized_result );
9,254✔
22
}
23

24
void UnaryOperatorOptimizer::visit_children( Node& ) {}
608✔
25

26
void UnaryOperatorOptimizer::visit_boolean_value( BooleanValue& bv )
12✔
27
{
28
  bool value;
29

30
  switch ( unary_operator.token_id )
12✔
31
  {
32
  case TOK_LOG_NOT:
12✔
33
    value = !bv.value;
12✔
34
    break;
12✔
35

36
  default:
×
37
    return;
×
38
  }
39

40
  // Logical-not returns 1/0 as BLong, ie. `!false` == `1`
41
  optimized_result = std::make_unique<IntegerValue>( bv.source_location, value );
12✔
42
}
43

44
void UnaryOperatorOptimizer::visit_float_value( FloatValue& fv )
30✔
45
{
46
  double value;
47

48
  switch ( unary_operator.token_id )
30✔
49
  {
50
  case TOK_LOG_NOT:
6✔
51
    value = fv.value == 0.0;
6✔
52
    break;
6✔
53
  case TOK_UNMINUS:
18✔
54
    value = -fv.value;
18✔
55
    break;
18✔
56
  case TOK_UNPLUSPLUS:
3✔
57
    value = fv.value + 1;
3✔
58
    break;
3✔
59
  case TOK_UNMINUSMINUS:
3✔
60
    value = fv.value - 1;
3✔
61
    break;
3✔
62

UNCOV
63
  default:
×
UNCOV
64
    return;
×
65
  }
66

67
  optimized_result = std::make_unique<FloatValue>( fv.source_location, value );
30✔
68
}
69

70
void UnaryOperatorOptimizer::visit_integer_value( IntegerValue& iv )
6,796✔
71
{
72
  int value;
73

74
  switch ( unary_operator.token_id )
6,796✔
75
  {
76
  case TOK_UNMINUS:
6,730✔
77
    value = -iv.value;
6,730✔
78
    break;
6,730✔
79
  case TOK_LOG_NOT:
18✔
80
    value = !iv.value;
18✔
81
    break;
18✔
82
  case TOK_BITWISE_NOT:
12✔
83
    value = static_cast<int>( ~static_cast<unsigned>( iv.value ) );
12✔
84
    break;
12✔
85
  case TOK_UNPLUSPLUS:
12✔
86
    value = iv.value + 1;
12✔
87
    break;
12✔
88
  case TOK_UNMINUSMINUS:
9✔
89
    value = iv.value - 1;
9✔
90
    break;
9✔
91

92
  default:
15✔
93
    return;
15✔
94
  }
95

96
  optimized_result = std::make_unique<IntegerValue>( iv.source_location, value );
6,781✔
97
}
98

99
void UnaryOperatorOptimizer::visit_member_access( MemberAccess& gm )
100✔
100
{
101
  if ( !gm.known_member )
100✔
102
    return;
69✔
103

104
  BTokenId new_token_id;
105
  switch ( unary_operator.token_id )
61✔
106
  {
107
  case TOK_UNPLUSPLUS:
11✔
108
    new_token_id = INS_SET_MEMBER_ID_UNPLUSPLUS;
11✔
109
    break;
11✔
110
  case TOK_UNMINUSMINUS:
14✔
111
    new_token_id = INS_SET_MEMBER_ID_UNMINUSMINUS;
14✔
112
    break;
14✔
113
  case TOK_UNPLUSPLUS_POST:
3✔
114
    new_token_id = INS_SET_MEMBER_ID_UNPLUSPLUS_POST;
3✔
115
    break;
3✔
116
  case TOK_UNMINUSMINUS_POST:
3✔
117
    new_token_id = INS_SET_MEMBER_ID_UNMINUSMINUS_POST;
3✔
118
    break;
3✔
119
  default:
30✔
120
    return;
30✔
121
  }
122

123
  bool consume = false;
31✔
124
  auto entity = gm.take_entity();
31✔
125
  optimized_result = std::make_unique<MemberAssignmentByOperator>(
31✔
126
      gm.source_location, consume, std::move( entity ), gm.name, new_token_id, *gm.known_member );
31✔
127
}
31✔
128

129
void UnaryOperatorOptimizer::visit_uninitialized_value( UninitializedValue& uninit )
9✔
130
{
131
  if ( unary_operator.token_id == TOK_LOG_NOT )
9✔
132
  {
133
    optimized_result = std::make_unique<IntegerValue>( uninit.source_location, 1 );
6✔
134
  }
135
}
9✔
136
}  // namespace Pol::Bscript::Compiler
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc