@@ -32,34 +32,42 @@ use crate::values::set::refs::SetRef;
32
32
use crate :: values:: set:: value:: SetData ;
33
33
use crate :: values:: typing:: StarlarkIter ;
34
34
use crate :: values:: Heap ;
35
+ use crate :: values:: UnpackValue ;
35
36
use crate :: values:: Value ;
36
37
use crate :: values:: ValueOfUnchecked ;
37
38
38
39
enum SetFromValue < ' v > {
39
40
Set ( SmallSet < Value < ' v > > ) ,
41
+ Ref ( SetRef < ' v > ) ,
40
42
}
41
43
42
44
impl < ' v > SetFromValue < ' v > {
43
45
fn from_value (
44
46
value : ValueOfUnchecked < ' v , StarlarkIter < Value < ' v > > > ,
45
47
heap : & ' v Heap ,
46
48
) -> crate :: Result < Self > {
47
- let mut set = SmallSet :: default ( ) ;
48
- for elem in value. get ( ) . iterate ( heap) ? {
49
- set. insert_hashed ( elem. get_hashed ( ) ?) ;
49
+ if let Some ( v) = SetRef :: unpack_value_opt ( value. get ( ) ) {
50
+ Ok ( SetFromValue :: Ref ( v) )
51
+ } else {
52
+ let mut set = SmallSet :: default ( ) ;
53
+ for elem in value. get ( ) . iterate ( heap) ? {
54
+ set. insert_hashed ( elem. get_hashed ( ) ?) ;
55
+ }
56
+ Ok ( SetFromValue :: Set ( set) )
50
57
}
51
- Ok ( SetFromValue :: Set ( set) )
52
58
}
53
59
54
60
fn get ( & self ) -> & SmallSet < Value < ' v > > {
55
61
match self {
56
62
SetFromValue :: Set ( set) => set,
63
+ SetFromValue :: Ref ( set) => & set. aref . content ,
57
64
}
58
65
}
59
66
60
67
fn into_set ( self ) -> SmallSet < Value < ' v > > {
61
68
match self {
62
69
SetFromValue :: Set ( set) => set,
70
+ SetFromValue :: Ref ( set) => set. aref . content . clone ( ) ,
63
71
}
64
72
}
65
73
@@ -118,7 +126,6 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
118
126
#[ starlark( require=pos) ] other : ValueOfUnchecked < ' v , StarlarkIter < Value < ' v > > > ,
119
127
heap : & ' v Heap ,
120
128
) -> starlark:: Result < SetData < ' v > > {
121
- //TODO(romanp) check if other is set
122
129
let other_set = SetFromValue :: from_value ( other, heap) ?;
123
130
let mut data = SetData :: default ( ) ;
124
131
if other_set. is_empty ( ) {
@@ -146,7 +153,6 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
146
153
#[ starlark( require=pos) ] other : ValueOfUnchecked < ' v , StarlarkIter < Value < ' v > > > ,
147
154
heap : & ' v Heap ,
148
155
) -> starlark:: Result < SetData < ' v > > {
149
- //TODO(romanp) check if other is set
150
156
let other_set = SetFromValue :: from_value ( other, heap) ?;
151
157
152
158
if other_set. is_empty ( ) {
@@ -307,8 +313,6 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
307
313
#[ starlark( require=pos) ] other : ValueOfUnchecked < ' v , StarlarkIter < Value < ' v > > > ,
308
314
heap : & ' v Heap ,
309
315
) -> starlark:: Result < SetData < ' v > > {
310
- //TODO(romanp) check if other is set
311
-
312
316
if this. aref . content . is_empty ( ) {
313
317
other. get ( ) . iterate ( heap) ?;
314
318
return Ok ( SetData :: default ( ) ) ;
@@ -372,7 +376,6 @@ pub(crate) fn set_methods(builder: &mut MethodsBuilder) {
372
376
other. get ( ) . iterate ( heap) ?;
373
377
return Ok ( true ) ;
374
378
}
375
- //TODO(romanp): check if other is already a set
376
379
let rhs = SetFromValue :: from_value ( other, heap) ?;
377
380
if rhs. is_empty ( ) {
378
381
return Ok ( false ) ;
0 commit comments