@@ -107,6 +107,12 @@ class java_object_factoryt
107
107
update_in_placet,
108
108
const source_locationt &location);
109
109
110
+ void gen_nondet_enum_init (
111
+ code_blockt &assignments,
112
+ const exprt &expr,
113
+ const java_class_typet &java_class_type,
114
+ const source_locationt &location);
115
+
110
116
void gen_nondet_init (
111
117
code_blockt &assignments,
112
118
const exprt &expr,
@@ -408,46 +414,7 @@ void java_object_factoryt::gen_pointer_target_init(
408
414
}
409
415
if (target_class_type.get_base (" java::java.lang.Enum" ))
410
416
{
411
- // We nondet-initialize enums to be equal to one of the constants defined
412
- // for their type:
413
- // int i = nondet(int)
414
- // assume(0 < = i < $VALUES.length)
415
- // expr = $VALUES[i]
416
- // where $VALUES is a variable generated by the Java compiler that stores
417
- // the array that is returned by Enum.values().
418
-
419
- const irep_idt &class_name = target_class_type.get_name ();
420
- const irep_idt values_name = id2string (class_name) + " .$VALUES" ;
421
- INVARIANT (
422
- ns.get_symbol_table ().has_symbol (values_name),
423
- " The $VALUES array (populated by clinit_wrapper) should be in the "
424
- " symbol table" );
425
- const symbolt &values = ns.lookup (values_name);
426
-
427
- // Access members (length and data) of $VALUES array
428
- dereference_exprt deref_expr (values.symbol_expr ());
429
- const auto &deref_struct_type =
430
- to_struct_type (ns.follow (deref_expr.type ()));
431
- PRECONDITION (is_valid_java_array (deref_struct_type));
432
- const auto &comps = deref_struct_type.components ();
433
- const member_exprt length_expr (deref_expr, " length" , comps[1 ].type ());
434
- const member_exprt enum_array_expr =
435
- member_exprt (deref_expr, " data" , comps[2 ].type ());
436
-
437
- const symbol_exprt &index_expr = gen_nondet_int_init (
438
- assignments,
439
- " enum_index_init" ,
440
- from_integer (0 , java_int_type ()),
441
- minus_exprt (length_expr, from_integer (1 , java_int_type ())),
442
- location);
443
-
444
- // Generate statement using pointer arithmetic to access array element:
445
- // expr = (expr.type())*(enum_array_expr + index_expr);
446
- plus_exprt plus (enum_array_expr, index_expr);
447
- const dereference_exprt arraycellref (
448
- plus, enum_array_expr.type ().subtype ());
449
- code_assignt enum_assign (expr, typecast_exprt (arraycellref, expr.type ()));
450
- assignments.add (enum_assign);
417
+ gen_nondet_enum_init (assignments, expr, target_class_type, location);
451
418
return ;
452
419
}
453
420
}
@@ -1492,6 +1459,51 @@ void java_object_factoryt::gen_nondet_array_init(
1492
1459
assignments.move_to_operands (init_done_label);
1493
1460
}
1494
1461
1462
+ // / We nondet-initialize enums to be equal to one of the constants defined
1463
+ // / for their type:
1464
+ // / int i = nondet(int);
1465
+ // / assume(0 < = i < $VALUES.length);
1466
+ // / expr = $VALUES[i];
1467
+ // / where $VALUES is a variable generated by the Java compiler that stores
1468
+ // / the array that is returned by Enum.values().
1469
+ void java_object_factoryt::gen_nondet_enum_init (
1470
+ code_blockt &assignments,
1471
+ const exprt &expr,
1472
+ const java_class_typet &java_class_type,
1473
+ const source_locationt &location)
1474
+ {
1475
+ const irep_idt &class_name = java_class_type.get_name ();
1476
+ const irep_idt values_name = id2string (class_name) + " .$VALUES" ;
1477
+ INVARIANT (
1478
+ ns.get_symbol_table ().has_symbol (values_name),
1479
+ " The $VALUES array (populated by clinit_wrapper) should be in the "
1480
+ " symbol table" );
1481
+ const symbolt &values = ns.lookup (values_name);
1482
+
1483
+ // Access members (length and data) of $VALUES array
1484
+ dereference_exprt deref_expr (values.symbol_expr ());
1485
+ const auto &deref_struct_type = to_struct_type (ns.follow (deref_expr.type ()));
1486
+ PRECONDITION (is_valid_java_array (deref_struct_type));
1487
+ const auto &comps = deref_struct_type.components ();
1488
+ const member_exprt length_expr (deref_expr, " length" , comps[1 ].type ());
1489
+ const member_exprt enum_array_expr =
1490
+ member_exprt (deref_expr, " data" , comps[2 ].type ());
1491
+
1492
+ const symbol_exprt &index_expr = gen_nondet_int_init (
1493
+ assignments,
1494
+ " enum_index_init" ,
1495
+ from_integer (0 , java_int_type ()),
1496
+ minus_exprt (length_expr, from_integer (1 , java_int_type ())),
1497
+ location);
1498
+
1499
+ // Generate statement using pointer arithmetic to access array element:
1500
+ // expr = (expr.type())*(enum_array_expr + index_expr);
1501
+ plus_exprt plus (enum_array_expr, index_expr);
1502
+ const dereference_exprt arraycellref (plus);
1503
+ code_assignt enum_assign (expr, typecast_exprt (arraycellref, expr.type ()));
1504
+ assignments.add (enum_assign);
1505
+ }
1506
+
1495
1507
// / Add code_declt instructions to `init_code` for every non-static symbol
1496
1508
// / in `symbols_created`
1497
1509
// / \param symbols_created: list of symbols
0 commit comments