@@ -29,6 +29,22 @@ pub struct JSWeakSet {
2929 pub values : Vec < std:: rc:: Weak < RefCell < JSObjectData > > > , // weak values
3030}
3131
32+ #[ derive( Clone , Debug ) ]
33+ pub struct JSGenerator {
34+ pub params : Vec < String > ,
35+ pub body : Vec < Statement > ,
36+ pub env : JSObjectDataPtr , // captured environment
37+ pub state : GeneratorState ,
38+ }
39+
40+ #[ derive( Clone , Debug ) ]
41+ pub enum GeneratorState {
42+ NotStarted ,
43+ Running { pc : usize , stack : Vec < Value > } , // program counter and value stack
44+ Suspended { pc : usize , stack : Vec < Value > } , // suspended at yield
45+ Completed ,
46+ }
47+
3248pub type JSObjectDataPtr = Rc < RefCell < JSObjectData > > ;
3349
3450#[ derive( Clone , Default ) ]
@@ -99,25 +115,27 @@ pub enum Value {
99115 String ( Vec < u16 > ) , // UTF-16 code units
100116 Boolean ( bool ) ,
101117 Undefined ,
102- Object ( JSObjectDataPtr ) , // Object with properties
103- Function ( String ) , // Function name
104- Closure ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // parameters, body, captured environment
105- AsyncClosure ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // parameters, body, captured environment
106- ClassDefinition ( Rc < ClassDefinition > ) , // Class definition
107- Getter ( Vec < Statement > , JSObjectDataPtr ) , // getter body, captured environment
108- Setter ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // setter parameter, body, captured environment
118+ Object ( JSObjectDataPtr ) , // Object with properties
119+ Function ( String ) , // Function name
120+ Closure ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // parameters, body, captured environment
121+ AsyncClosure ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // parameters, body, captured environment
122+ GeneratorFunction ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // parameters, body, captured environment
123+ ClassDefinition ( Rc < ClassDefinition > ) , // Class definition
124+ Getter ( Vec < Statement > , JSObjectDataPtr ) , // getter body, captured environment
125+ Setter ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) , // setter parameter, body, captured environment
109126 Property {
110127 // Property descriptor with getter/setter/value
111128 value : Option < Rc < RefCell < Value > > > ,
112129 getter : Option < ( Vec < Statement > , JSObjectDataPtr ) > ,
113130 setter : Option < ( Vec < String > , Vec < Statement > , JSObjectDataPtr ) > ,
114131 } ,
115- Promise ( Rc < RefCell < JSPromise > > ) , // Promise object
116- Symbol ( Rc < SymbolData > ) , // Symbol primitive with description
117- Map ( Rc < RefCell < JSMap > > ) , // Map object
118- Set ( Rc < RefCell < JSSet > > ) , // Set object
119- WeakMap ( Rc < RefCell < JSWeakMap > > ) , // WeakMap object
120- WeakSet ( Rc < RefCell < JSWeakSet > > ) , // WeakSet object
132+ Promise ( Rc < RefCell < JSPromise > > ) , // Promise object
133+ Symbol ( Rc < SymbolData > ) , // Symbol primitive with description
134+ Map ( Rc < RefCell < JSMap > > ) , // Map object
135+ Set ( Rc < RefCell < JSSet > > ) , // Set object
136+ WeakMap ( Rc < RefCell < JSWeakMap > > ) , // WeakMap object
137+ WeakSet ( Rc < RefCell < JSWeakSet > > ) , // WeakSet object
138+ Generator ( Rc < RefCell < JSGenerator > > ) , // Generator object
121139}
122140
123141impl std:: fmt:: Debug for Value {
@@ -132,6 +150,7 @@ impl std::fmt::Debug for Value {
132150 Value :: Function ( name) => write ! ( f, "Function({})" , name) ,
133151 Value :: Closure ( _, _, _) => write ! ( f, "Closure" ) ,
134152 Value :: AsyncClosure ( _, _, _) => write ! ( f, "AsyncClosure" ) ,
153+ Value :: GeneratorFunction ( _, _, _) => write ! ( f, "GeneratorFunction" ) ,
135154 Value :: ClassDefinition ( _) => write ! ( f, "ClassDefinition" ) ,
136155 Value :: Getter ( _, _) => write ! ( f, "Getter" ) ,
137156 Value :: Setter ( _, _, _) => write ! ( f, "Setter" ) ,
@@ -142,6 +161,7 @@ impl std::fmt::Debug for Value {
142161 Value :: Set ( s) => write ! ( f, "Set({:p})" , Rc :: as_ptr( s) ) ,
143162 Value :: WeakMap ( wm) => write ! ( f, "WeakMap({:p})" , Rc :: as_ptr( wm) ) ,
144163 Value :: WeakSet ( ws) => write ! ( f, "WeakSet({:p})" , Rc :: as_ptr( ws) ) ,
164+ Value :: Generator ( g) => write ! ( f, "Generator({:p})" , Rc :: as_ptr( g) ) ,
145165 }
146166 }
147167}
@@ -171,6 +191,7 @@ pub fn is_truthy(val: &Value) -> bool {
171191 Value :: Function ( _) => true ,
172192 Value :: Closure ( _, _, _) => true ,
173193 Value :: AsyncClosure ( _, _, _) => true ,
194+ Value :: GeneratorFunction ( _, _, _) => true ,
174195 Value :: ClassDefinition ( _) => true ,
175196 Value :: Getter ( _, _) => true ,
176197 Value :: Setter ( _, _, _) => true ,
@@ -181,6 +202,7 @@ pub fn is_truthy(val: &Value) -> bool {
181202 Value :: Set ( _) => true ,
182203 Value :: WeakMap ( _) => true ,
183204 Value :: WeakSet ( _) => true ,
205+ Value :: Generator ( _) => true ,
184206 }
185207}
186208
@@ -210,6 +232,7 @@ pub fn value_to_string(val: &Value) -> String {
210232 Value :: Function ( name) => format ! ( "function {}" , name) ,
211233 Value :: Closure ( _, _, _) => "function" . to_string ( ) ,
212234 Value :: AsyncClosure ( _, _, _) => "function" . to_string ( ) ,
235+ Value :: GeneratorFunction ( _, _, _) => "function" . to_string ( ) ,
213236 Value :: ClassDefinition ( _) => "class" . to_string ( ) ,
214237 Value :: Getter ( _, _) => "getter" . to_string ( ) ,
215238 Value :: Setter ( _, _, _) => "setter" . to_string ( ) ,
@@ -223,6 +246,7 @@ pub fn value_to_string(val: &Value) -> String {
223246 Value :: Set ( _) => "[object Set]" . to_string ( ) ,
224247 Value :: WeakMap ( _) => "[object WeakMap]" . to_string ( ) ,
225248 Value :: WeakSet ( _) => "[object WeakSet]" . to_string ( ) ,
249+ Value :: Generator ( _) => "[object Generator]" . to_string ( ) ,
226250 }
227251}
228252
@@ -310,7 +334,7 @@ pub fn value_to_sort_string(val: &Value) -> String {
310334 Value :: Undefined => "undefined" . to_string ( ) ,
311335 Value :: Object ( _) => "[object Object]" . to_string ( ) ,
312336 Value :: Function ( name) => format ! ( "[function {}]" , name) ,
313- Value :: Closure ( _, _, _) | Value :: AsyncClosure ( _, _, _) => "[function]" . to_string ( ) ,
337+ Value :: Closure ( _, _, _) | Value :: AsyncClosure ( _, _, _) | Value :: GeneratorFunction ( _ , _ , _ ) => "[function]" . to_string ( ) ,
314338 Value :: ClassDefinition ( _) => "[class]" . to_string ( ) ,
315339 Value :: Getter ( _, _) => "[getter]" . to_string ( ) ,
316340 Value :: Setter ( _, _, _) => "[setter]" . to_string ( ) ,
@@ -321,6 +345,7 @@ pub fn value_to_sort_string(val: &Value) -> String {
321345 Value :: Set ( _) => "[object Set]" . to_string ( ) ,
322346 Value :: WeakMap ( _) => "[object WeakMap]" . to_string ( ) ,
323347 Value :: WeakSet ( _) => "[object WeakSet]" . to_string ( ) ,
348+ Value :: Generator ( _) => "[object Generator]" . to_string ( ) ,
324349 }
325350}
326351
0 commit comments