@@ -360,6 +360,48 @@ inline java_method_typet &to_java_method_type(typet &type)
360
360
return static_cast <java_method_typet &>(type);
361
361
}
362
362
363
+ // / This is a specialization of reference_typet.
364
+ // / The subtype is guaranteed to be a struct_tag_typet.
365
+ class java_reference_typet : public reference_typet
366
+ {
367
+ public:
368
+ explicit java_reference_typet (
369
+ const struct_tag_typet &_subtype,
370
+ std::size_t _width)
371
+ : reference_typet(_subtype, _width)
372
+ {
373
+ }
374
+
375
+ struct_tag_typet &subtype ()
376
+ {
377
+ return static_cast <struct_tag_typet &>(reference_typet::subtype ());
378
+ }
379
+
380
+ const struct_tag_typet &subtype () const
381
+ {
382
+ return static_cast <const struct_tag_typet &>(reference_typet::subtype ());
383
+ }
384
+ };
385
+
386
+ template <>
387
+ inline bool can_cast_type<java_reference_typet>(const typet &type)
388
+ {
389
+ return type.id () == ID_pointer &&
390
+ to_type_with_subtype (type).subtype ().id () == ID_struct_tag;
391
+ }
392
+
393
+ inline const java_reference_typet &to_java_reference_type (const typet &type)
394
+ {
395
+ PRECONDITION (can_cast_type<java_reference_typet>(type));
396
+ return static_cast <const java_reference_typet &>(type);
397
+ }
398
+
399
+ inline java_reference_typet &to_java_reference_type (typet &type)
400
+ {
401
+ PRECONDITION (can_cast_type<java_reference_typet>(type));
402
+ return static_cast <java_reference_typet &>(type);
403
+ }
404
+
363
405
signedbv_typet java_int_type ();
364
406
signedbv_typet java_long_type ();
365
407
signedbv_typet java_short_type ();
0 commit comments