@@ -6,7 +6,7 @@ use std::sync::Arc;
6
6
7
7
use crate :: gc:: root:: iterate_strong_roots;
8
8
use crate :: gc:: Address ;
9
- use crate :: mirror:: Str ;
9
+ use crate :: mirror:: { Array , Ref , Str } ;
10
10
use crate :: safepoint;
11
11
use crate :: shape:: Shape ;
12
12
use crate :: threads:: DoraThread ;
@@ -160,11 +160,12 @@ impl<'a> SnapshotGenerator<'a> {
160
160
161
161
edge_count += match shape. kind ( ) {
162
162
ShapeKind :: Class ( cls_id, type_params) => {
163
- self . process_class_object ( vm , address, * cls_id, type_params, shape)
163
+ self . process_class_object ( address, * cls_id, type_params, shape)
164
164
}
165
165
ShapeKind :: Array ( cls_id, type_params) => {
166
- self . process_array_object ( vm , address, * cls_id, type_params, shape)
166
+ self . process_array_object ( address, * cls_id, type_params, shape)
167
167
}
168
+ ShapeKind :: String => 0 ,
168
169
_ => 0 ,
169
170
} ;
170
171
@@ -200,6 +201,7 @@ impl<'a> SnapshotGenerator<'a> {
200
201
display_ty_array( & self . vm. program, type_params)
201
202
)
202
203
}
204
+ ShapeKind :: String => "String" . into ( ) ,
203
205
ShapeKind :: Lambda ( fct_id, type_params) => {
204
206
let fct = & self . vm . program . functions [ fct_id. 0 as usize ] ;
205
207
let params = fct
@@ -250,21 +252,20 @@ impl<'a> SnapshotGenerator<'a> {
250
252
251
253
fn process_class_object (
252
254
& mut self ,
253
- vm : & VM ,
254
255
address : Address ,
255
256
cls_id : ClassId ,
256
257
type_params : & BytecodeTypeArray ,
257
258
shape : & Shape ,
258
259
) -> usize {
259
260
let mut edge_count = 0 ;
260
- let class = vm. class ( cls_id) ;
261
+ let class = self . vm . class ( cls_id) ;
261
262
262
263
for ( field_idx, field) in class. fields . iter ( ) . enumerate ( ) {
263
- let ty = specialize_ty ( vm, None , field. ty . clone ( ) , type_params) ;
264
+ let ty = specialize_ty ( self . vm , None , field. ty . clone ( ) , type_params) ;
264
265
let field_offset = shape. fields [ field_idx] . offset ;
265
266
let field_addr = address. offset ( field_offset as usize ) ;
266
267
267
- let value_node_id = self . process_value ( field_addr, ty) ;
268
+ let value_node_id = self . process_value ( field_addr, & ty) ;
268
269
269
270
let field_name = if let Some ( name) = field. name . as_ref ( ) {
270
271
name. clone ( )
@@ -284,7 +285,7 @@ impl<'a> SnapshotGenerator<'a> {
284
285
edge_count
285
286
}
286
287
287
- fn process_value ( & mut self , value_address : Address , ty : BytecodeType ) -> NodeId {
288
+ fn process_value ( & mut self , value_address : Address , ty : & BytecodeType ) -> NodeId {
288
289
match ty {
289
290
BytecodeType :: Unit => self . ensure_value ( "()" . into ( ) ) ,
290
291
BytecodeType :: Bool => {
@@ -342,13 +343,34 @@ impl<'a> SnapshotGenerator<'a> {
342
343
343
344
fn process_array_object (
344
345
& mut self ,
345
- _vm : & VM ,
346
- _address : Address ,
346
+ address : Address ,
347
347
_cls_id : ClassId ,
348
- _type_params : & BytecodeTypeArray ,
349
- _shape : & Shape ,
348
+ type_params : & BytecodeTypeArray ,
349
+ shape : & Shape ,
350
350
) -> usize {
351
- 0
351
+ let mut edge_count = 0 ;
352
+ let array: Ref < Array < u8 > > = address. into ( ) ;
353
+ let length = array. len ( ) ;
354
+
355
+ assert_eq ! ( shape. instance_size( ) , 0 ) ;
356
+ let element_size = shape. element_size ( ) ;
357
+ let mut element_addr = array. data_address ( ) ;
358
+
359
+ assert_eq ! ( type_params. len( ) , 1 ) ;
360
+ let ty = type_params[ 0 ] . clone ( ) ;
361
+
362
+ for element_idx in 0 ..length {
363
+ let element_node_id = self . process_value ( element_addr, & ty) ;
364
+ self . add_edge ( Edge {
365
+ name_or_idx : element_idx,
366
+ to_node_index : element_node_id,
367
+ kind : EdgeKind :: Element ,
368
+ } ) ;
369
+ edge_count += 1 ;
370
+ element_addr = element_addr. offset ( element_size) ;
371
+ }
372
+
373
+ edge_count
352
374
}
353
375
354
376
fn add_edge ( & mut self , edge : Edge ) -> EdgeId {
0 commit comments