C0 code coverage information
Generated on Wed Aug 01 14:04:25 -0300 2007 with rcov 0.8.0
Code reported as executed by Ruby looks like this...
and this: this line is also marked as covered.
Lines considered as run by rcov, but not reported by Ruby, look like this,
and this: these lines were inferred by rcov (using simple heuristics).
Finally, here's a line marked as not executed.
| Name |
Total lines |
Lines of code |
Total coverage |
Code coverage |
|
lib/class_file.rb
|
169
|
124
|
|
|
1 require 'validator'
2 require 'access_flags'
3 require 'logger'
4 require 'constant_pool'
5 require 'common'
6 require 'java'
7 require 'visitor'
8
9 module YAJD
10
11 # TODO refactor the code. it's a mess.
12
13 # TODO make sure all the classes' attributes representing the structs of the java class have the same names as the spec
14
15 # TODO at this point all I do is read the class file, I should add all the checks the spec says.
16
17 #TODO do the checks about combination of access flags
18
19 class ClassFile
20 MAGIC = 0xCAFEBABE
21
22 attr_reader :magic, :minor_version, :major_version
23 attr_reader :constant_pool, :this_class, :access_flags, :super_class,
24 :interfaces, :fields, :attributes
25 alias :pool :constant_pool
26
27 # method 'methods' already exists
28 def java_methods
29 @methods
30 end
31
32 def initialize(f)
def initialize(f)
8 test/tc_bytecodes.rb:35 in 'TestBytecodes#test_bytecodes'
2 test/tc_jdk.rb:79 in 'TestJdk#check_jdk'
33 if f.is_a?(String)
34 File.open(f) { |file| read(file) }
File.open(f) { |file| read(file) }
8 YAJD::ClassFile#read at lib/class_file.rb:126
35 else
36 read(f)
read(f)
2 YAJD::ClassFile#read at lib/class_file.rb:126
37 end
38 end
39
40 def validate
def validate
2 test/tc_jdk.rb:81 in 'TestJdk#check_jdk'
41 #TODO validate version number?
42 pool.validate
pool.validate
2 YAJD::ConstantPool::Pool#validate at lib/constant_pool.rb:34
43 validate_access_flags
validate_access_flags
2 YAJD::Validator#validate_access_flags at lib/validator.rb:5
44 validate_classes
validate_classes
2 YAJD::Validator#validate_classes at lib/validator.rb:8
45 validate_interfaces
validate_interfaces
2 YAJD::Validator#validate_interfaces at lib/validator.rb:11
46 validate_fields
validate_fields
2 YAJD::Validator#validate_fields at lib/validator.rb:14
47 validate_methods
validate_methods
2 YAJD::Validator#validate_methods at lib/validator.rb:17
48 validate_attributes
validate_attributes
2 YAJD::Validator#validate_attributes at lib/validator.rb:20
49 end
50
51 def version
def version
2 test/tc_jdk.rb:80 in 'TestJdk#check_jdk'
52 major_version + minor_version / 10
53 end
54
55 def attributes_count
56 @attributes.size
57 end
58
59 def methods_count
60 @methods.size
61 end
62
63 def interfaces_count
64 @interfaces.size
65 end
66
67 def fields_count
68 @fields.size
69 end
70
71 def to_s
72 <<END
73 magic: 0x#{@magic.to_s(16).upcase}
74 version: #{@major_version}.#{@minor_version} (major.minor)
75 this: #{@this_class}
76 super: #{@super_class}
77 interfaces: #{@interfaces}
78 END
79 end
80
81 def this
def this
8 test/tc_bytecodes.rb:39 in 'TestBytecodes#test_bytecodes'
82 @constant_pool.at(@this_class)
@constant_pool.at(@this_class)
8 YAJD::ConstantPool::Pool#at at lib/constant_pool.rb:42
83 end
84
85 def to_javap
def to_javap
8 test/tc_bytecodes.rb:37 in 'TestBytecodes#test_bytecodes'
2 test/tc_jdk.rb:57 in 'TestJdk#assert_javap'
86 visitor = Visitor::Javap.create
visitor = Visitor::Javap.create
10 #<Class:YAJD::Visitor::Javap>#create at lib/visitor/javap.rb:12
87 accept(visitor)
accept(visitor)
10 YAJD::ClassFile#accept at lib/class_file.rb:91
88 visitor.dump
visitor.dump
10 YAJD::Visitor::Javap::JavapVisitor#dump at lib/visitor/javap.rb:40
89 end
90
91 def accept(visitor)
def accept(visitor)
10 lib/class_file.rb:87 in 'YAJD::ClassFile#to_javap'
92 visitor.visit(self)
visitor.visit(self)
10 YAJD::Visitor::Javap::JavapVisitor#visit at lib/visitor/javap.rb:23
93 @fields.accept(visitor)
@fields.accept(visitor)
10 Array#accept at lib/ext/array.rb:2
94 @methods.accept(visitor)
@methods.accept(visitor)
10 Array#accept at lib/ext/array.rb:2
95 end
96
97 def inner_classes
def inner_classes
10 lib/visitor/javap/class_file.rb:63 in 'YAJD::Visitor::Javap::ClassFileVisitor#class_info'
98 #TODO this is repeated several times
99 @attributes.find { |attr| attr.is_a?(Attributes::InnerClassesInfo) }
100 end
101
102 def deprecated?
def deprecated?
10 lib/visitor/javap/class_file.rb:56 in 'YAJD::Visitor::Javap::ClassFileVisitor#class_info'
103 #TODO this is repeated several times
104 attr = @attributes.find { |attr| attr.is_a?(Attributes::DeprecatedInfo) }
105 not attr.nil?
106 end
107
108 # Returns the source filename from which this class was compiled.
109 def source_file
def source_file
10 lib/visitor/javap/class_file.rb:51 in 'YAJD::Visitor::Javap::ClassFileVisitor#class_info'
10 lib/visitor/javap/class_file.rb:97 in 'YAJD::Visitor::Javap::ClassFileVisitor#source_file'
110 #TODO this is repeated several times
111 attr = @attributes.find { |attr| attr.is_a?(Attributes::SourceFileInfo) }
112 unless attr.nil?
113 attr.source_file
attr.source_file
18 YAJD::Attributes::SourceFileInfo#source_file at lib/attributes/source_file.rb:17
114 end
115 end
116
117 # if this class is the root of the class hierarchy (i.e.: java.lang.Object)
118 def is_root?
def is_root?
10 lib/visitor/javap/class_file.rb:28 in 'YAJD::Visitor::Javap::ClassFileVisitor#class_signature'
119 @super_class == 0
120 end
121
122 protected
123
124 include Validator
125
126 def read(f)
def read(f)
8 lib/class_file.rb:34 in 'YAJD::ClassFile#initialize'
2 lib/class_file.rb:36 in 'YAJD::ClassFile#initialize'
127 read_magic(f)
read_magic(f)
10 YAJD::ClassFile#read_magic at lib/class_file.rb:151
128 read_version(f)
read_version(f)
10 YAJD::ClassFile#read_version at lib/class_file.rb:157
129 read_constant_pool(f)
read_constant_pool(f)
10 YAJD::ClassFile#read_constant_pool at lib/class_file.rb:163
130 YAJD::logger.info { 'reading access flags' }
YAJD::logger.info { 'reading access flags' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
131 @access_flags = f.read_u2
@access_flags = f.read_u2
10 File#read_u2 at lib/ext/file.rb:10
132 YAJD::logger.info { 'reading this' }
YAJD::logger.info { 'reading this' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
133 @this_class = f.read_u2
@this_class = f.read_u2
10 File#read_u2 at lib/ext/file.rb:10
134 YAJD::logger.info { 'reading super' }
YAJD::logger.info { 'reading super' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
135 @super_class = f.read_u2
@super_class = f.read_u2
10 File#read_u2 at lib/ext/file.rb:10
136 YAJD::logger.info { 'reading interfaces' }
YAJD::logger.info { 'reading interfaces' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
137 @interfaces = f.read_list { |f| f.read_u2 }
@interfaces = f.read_list { |f| f.read_u2 }
10 File#read_list at lib/ext/file.rb:22
5 File#read_u2 at lib/ext/file.rb:10
138 YAJD::logger.info { 'reading fields' }
YAJD::logger.info { 'reading fields' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
139 @fields = f.read_list { |f| FieldInfo.new(self, @this_class, pool, f) }
@fields = f.read_list { |f| FieldInfo.new(self, @this_class, pool, f) }
302 YAJD::CommonInfo#initialize at lib/common.rb:19
10 File#read_list at lib/ext/file.rb:22
140 YAJD::logger.info { 'reading methods' }
YAJD::logger.info { 'reading methods' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
141 @methods = f.read_list { |f| MethodInfo.new(self, @this_class, pool, f) }
@methods = f.read_list { |f| MethodInfo.new(self, @this_class, pool, f) }
248 YAJD::CommonInfo#initialize at lib/common.rb:19
10 File#read_list at lib/ext/file.rb:22
142 YAJD::logger.info { 'reading attributes' }
YAJD::logger.info { 'reading attributes' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
143 @attributes = f.read_list { |f| Attributes.factory(pool, self, f) }
@attributes = f.read_list { |f| Attributes.factory(pool, self, f) }
12 #<Class:YAJD::Attributes>#factory at lib/attributes/attribute.rb:7
10 File#read_list at lib/ext/file.rb:22
144
145 #TODO check why I wrote this :O
146 # raise 'More data than expected!' unless f.read.nil?
147
148 self
149 end
150
151 def read_magic(f)
def read_magic(f)
10 lib/class_file.rb:127 in 'YAJD::ClassFile#read'
152 YAJD::logger.info { 'reading magic' }
YAJD::logger.info { 'reading magic' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
153 @magic = f.read_u4
@magic = f.read_u4
10 File#read_u4 at lib/ext/file.rb:15
154 raise "unknown magic! (#{magic.to_s(16)})" unless magic == MAGIC
155 end
156
157 def read_version(f)
def read_version(f)
10 lib/class_file.rb:128 in 'YAJD::ClassFile#read'
158 YAJD::logger.info { 'reading version' }
YAJD::logger.info { 'reading version' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
159 @minor_version = f.read_u2
@minor_version = f.read_u2
10 File#read_u2 at lib/ext/file.rb:10
160 @major_version = f.read_u2
@major_version = f.read_u2
10 File#read_u2 at lib/ext/file.rb:10
161 end
162
163 def read_constant_pool(f)
def read_constant_pool(f)
10 lib/class_file.rb:129 in 'YAJD::ClassFile#read'
164 YAJD::logger.info { 'reading constant pool' }
YAJD::logger.info { 'reading constant pool' }
10 Logger#info at /usr/lib/ruby/1.8/logger.rb:373
10 #<Class:YAJD>#logger at lib/yajd.rb:20
165 @constant_pool = ConstantPool::Pool.new(f)
@constant_pool = ConstantPool::Pool.new(f)
10 YAJD::ConstantPool::Pool#initialize at lib/constant_pool.rb:13
166 end
167 end
168
169 end
Generated using the rcov code coverage analysis tool for Ruby version 0.8.0.