Skip to content

Commit 385a27c

Browse files
author
Daniel Kroening
committed
use static_members in Java frontend
An instance of static fields for Java classes. The Java-specific extension enables tracking static fields that are final.
1 parent 55c89cb commit 385a27c

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

jbmc/src/java_bytecode/java_bytecode_convert_class.cpp

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -677,10 +677,37 @@ void java_bytecode_convert_classt::convert(
677677
else
678678
field_type = *java_type_from_string(f.descriptor);
679679

680+
// determine access
681+
irep_idt access;
682+
683+
if(f.is_private)
684+
access = ID_private;
685+
else if(f.is_protected)
686+
access = ID_protected;
687+
else if(f.is_public)
688+
access = ID_public;
689+
else
690+
access = ID_default;
691+
692+
auto &class_type = to_java_class_type(class_symbol.type);
693+
680694
// is this a static field?
681695
if(f.is_static)
682696
{
683-
// Create the symbol; we won't add to the struct type.
697+
const irep_idt field_identifier =
698+
id2string(class_symbol.name) + "." + id2string(f.name);
699+
700+
class_type.static_members().emplace_back();
701+
auto &component = class_type.static_members().back();
702+
703+
component.set_name(field_identifier);
704+
component.set_base_name(f.name);
705+
component.set_pretty_name(f.name);
706+
component.set_access(access);
707+
component.set_is_final(f.is_final);
708+
component.type() = field_type;
709+
710+
// Create the symbol
684711
symbolt new_symbol;
685712

686713
new_symbol.is_static_lifetime=true;
@@ -740,26 +767,15 @@ void java_bytecode_convert_classt::convert(
740767
}
741768
else
742769
{
743-
auto &class_type = to_java_class_type(class_symbol.type);
744-
745770
class_type.components().emplace_back();
746771
auto &component = class_type.components().back();
747772

748773
component.set_name(f.name);
749774
component.set_base_name(f.name);
750775
component.set_pretty_name(f.name);
751-
component.type()=field_type;
752-
753-
if(f.is_private)
754-
component.set_access(ID_private);
755-
else if(f.is_protected)
756-
component.set_access(ID_protected);
757-
else if(f.is_public)
758-
component.set_access(ID_public);
759-
else
760-
component.set_access(ID_default);
761-
776+
component.set_access(access);
762777
component.set_is_final(f.is_final);
778+
component.type() = field_type;
763779

764780
// Load annotations
765781
if(!f.annotations.empty())

jbmc/src/java_bytecode/java_types.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,19 @@ class java_class_typet:public class_typet
155155
class_typet::get_component(component_name));
156156
}
157157

158+
using static_membert = componentt;
159+
using static_memberst = std::vector<componentt>;
160+
161+
const static_memberst &static_members() const
162+
{
163+
return (const static_memberst &)class_typet::static_members();
164+
}
165+
166+
static_memberst &static_members()
167+
{
168+
return (static_memberst &)class_typet::static_members();
169+
}
170+
158171
const irep_idt &get_access() const
159172
{
160173
return get(ID_access);

0 commit comments

Comments
 (0)