Class: Java::Method
- Inherits:
-
Annotatable
show all
- Defined in:
- lib/java_dissassembler/method.rb,
lib/java_dissassembler/erb_helper.rb
Constant Summary
collapse
- ACC_PUBLIC =
Declared public; may be accessed from outside its package.
0x0001
- ACC_PRIVATE =
Declared private; accessible only within the defining class.
0x0002
- ACC_PROTECTED =
Declared protected; may be accessed within subclasses.
0x0004
- ACC_STATIC =
0x0008
- ACC_FINAL =
Declared final; must not be overridden (§5.4.5).
0x0010
- ACC_SYNCHRONIZED =
Declared synchronized; invocation is wrapped by a monitor use.
0x0020
- ACC_BRIDGE =
A bridge method, generated by the compiler.
0x0040
- ACC_VARARGS =
Declared with variable number of arguments.
0x0080
- ACC_NATIVE =
Declared native; implemented in a language other than Java.
0x0100
- ACC_ABSTRACT =
Declared abstract; no implementation is provided.
0x0400
- ACC_STRICT =
Declared strictfp; floating-point mode is FP-strict.
0x0800
- ACC_SYNTHETIC =
Declared synthetic; not present in the source code.
0x1000
Instance Attribute Summary collapse
Attributes inherited from Annotatable
#annotations
Instance Method Summary
collapse
Methods inherited from Annotatable
#get_annotation, #has_annotation?
Constructor Details
#initialize(flags, name, vm_signature, annotations) ⇒ Method
Returns a new instance of Method.
18
19
20
21
22
23
24
|
# File 'lib/java_dissassembler/method.rb', line 18
def initialize(flags, name, vm_signature, annotations)
super(annotations)
@flags = flags
@name = name
@vm_signature = vm_signature
end
|
Instance Attribute Details
#flags ⇒ Object
Returns the value of attribute flags.
3
4
5
|
# File 'lib/java_dissassembler/method.rb', line 3
def flags
@flags
end
|
#name ⇒ Object
Returns the value of attribute name.
3
4
5
|
# File 'lib/java_dissassembler/method.rb', line 3
def name
@name
end
|
#vm_signature ⇒ Object
Returns the value of attribute vm_signature.
3
4
5
|
# File 'lib/java_dissassembler/method.rb', line 3
def vm_signature
@vm_signature
end
|
Instance Method Details
#is_abstract? ⇒ Boolean
62
63
64
|
# File 'lib/java_dissassembler/method.rb', line 62
def is_abstract?
(@flags & ACC_ABSTRACT) != 0
end
|
#is_bridge? ⇒ Boolean
50
51
52
|
# File 'lib/java_dissassembler/method.rb', line 50
def is_bridge?
(@flags & ACC_BRIDGE) != 0
end
|
#is_final? ⇒ Boolean
42
43
44
|
# File 'lib/java_dissassembler/method.rb', line 42
def is_final?
(@flags & ACC_FINAL) != 0
end
|
#is_native? ⇒ Boolean
58
59
60
|
# File 'lib/java_dissassembler/method.rb', line 58
def is_native?
(@flags & ACC_NATIVE) != 0
end
|
#is_private? ⇒ Boolean
30
31
32
|
# File 'lib/java_dissassembler/method.rb', line 30
def is_private?
(@flags & ACC_PRIVATE) != 0
end
|
#is_protected? ⇒ Boolean
34
35
36
|
# File 'lib/java_dissassembler/method.rb', line 34
def is_protected?
(@flags & ACC_PROTECTED) != 0
end
|
#is_public? ⇒ Boolean
26
27
28
|
# File 'lib/java_dissassembler/method.rb', line 26
def is_public?
(@flags & ACC_PUBLIC) != 0
end
|
#is_static? ⇒ Boolean
38
39
40
|
# File 'lib/java_dissassembler/method.rb', line 38
def is_static?
(@flags & ACC_STATIC) != 0
end
|
#is_strict? ⇒ Boolean
66
67
68
|
# File 'lib/java_dissassembler/method.rb', line 66
def is_strict?
(@flags & ACC_STRICT) != 0
end
|
#is_synchronized? ⇒ Boolean
46
47
48
|
# File 'lib/java_dissassembler/method.rb', line 46
def is_synchronized?
(@flags & ACC_SYNCHRONIZED) != 0
end
|
#is_synthetic? ⇒ Boolean
70
71
72
|
# File 'lib/java_dissassembler/method.rb', line 70
def is_synthetic?
(@flags & ACC_SYNTHETIC) != 0
end
|
#is_varargs? ⇒ Boolean
54
55
56
|
# File 'lib/java_dissassembler/method.rb', line 54
def is_varargs?
(@flags & ACC_VARARGS) != 0
end
|
#java_params ⇒ Object
100
101
102
|
# File 'lib/java_dissassembler/erb_helper.rb', line 100
def java_params
java_signature.drop(1)
end
|
#java_return_type ⇒ Object
104
105
106
|
# File 'lib/java_dissassembler/erb_helper.rb', line 104
def java_return_type
java_signature.at(0)
end
|
#java_signature ⇒ Object
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
# File 'lib/java_dissassembler/erb_helper.rb', line 118
def java_signature
types = vm_signature.scan(/(\[?([ZBCSIJFDV]|L[^;]*;))/).map do |match|
is_array = match[0].start_with? "["
val = vm_to_java(match[0])
if is_array
val << "[]"
val[1..-1]
else
val
end
end
back = types.pop
types.unshift(back)
end
|
#java_to_c(java_type) ⇒ Object
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
# File 'lib/java_dissassembler/erb_helper.rb', line 149
def java_to_c(java_type)
case java_type
when "boolean" then "bool"
when "byte" then "byte"
when "char" then "char"
when "short" then "short"
when "int" then "int"
when "long" then "long"
when "float" then "float"
when "double" then "double"
when "java.lang.String" then "const char*"
when "void" then "void"
else "jobject" end
end
|
#java_to_jni(java_type) ⇒ Object
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
# File 'lib/java_dissassembler/erb_helper.rb', line 164
def java_to_jni(java_type)
case java_type
when "boolean" then "jboolean"
when "byte" then "jbyte"
when "char" then "jchar"
when "short" then "jshort"
when "int" then "jint"
when "long" then "jlong"
when "float" then "jfloat"
when "double" then "jdouble"
when "java.lang.String" then "jstring"
when "void" then raise "Cannot convert `void' to JNI type"
else "jobject" end
end
|
#jni_c_parameters(prefix = "param") ⇒ Object
6
7
8
9
10
11
12
|
# File 'lib/java_dissassembler/erb_helper.rb', line 6
def jni_c_parameters(prefix = "param")
cparams = Array.new
java_params.each_with_index do |param, i|
cparams << "#{java_to_c(param)} #{prefix}#{i}"
end
cparams
end
|
#jni_c_return_type ⇒ Object
14
15
16
|
# File 'lib/java_dissassembler/erb_helper.rb', line 14
def jni_c_return_type
java_to_c(java_return_type)
end
|
#jni_convert_c_to_jni(prefix = "param") ⇒ Object
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/java_dissassembler/erb_helper.rb', line 23
def jni_convert_c_to_jni(prefix = "param")
conversions = Array.new
java_params.each_with_index do |param, i|
case param
when "java.lang.String"
conversions << "jstring jni#{prefix}#{i} = env->NewStringUTF(#{prefix}#{i})"
end
end
conversions
end
|
#jni_convert_jni_to_c(prefix = "param") ⇒ Object
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/java_dissassembler/erb_helper.rb', line 61
def jni_convert_jni_to_c(prefix = "param")
conversions = Array.new
java_params.each_with_index do |param, i|
case param
when "java.lang.String"
conversions << "const char* c#{prefix}#{i} = env->GetStringUTFChars(#{prefix}#{i}, nullptr /* iscopy */)"
end
end
conversions
end
|
#jni_mangled_name(klass_name, is_override) ⇒ Object
49
50
51
52
53
|
# File 'lib/java_dissassembler/erb_helper.rb', line 49
def jni_mangled_name(klass_name, is_override)
mangled_name = mangle(name)
mangled_name << "__#{mangle(vm_signature_params)}" if is_override and not vm_signature_params.empty?
"Java_#{klass_name.gsub(".", "_")}_#{mangled_name}"
end
|
#jni_method_call ⇒ Object
34
35
36
|
# File 'lib/java_dissassembler/erb_helper.rb', line 34
def jni_method_call
"Call#{is_static? ? "Static" : ""}#{java_return_type.capitalize}Method"
end
|
#jni_method_call_parameters(prefix = "param") ⇒ Object
38
39
40
41
42
43
44
45
|
# File 'lib/java_dissassembler/erb_helper.rb', line 38
def jni_method_call_parameters(prefix = "param")
java_params.enum_for(:each_with_index).map do |param, i|
case param
when "java.lang.String" then "jni#{prefix}#{i}"
else "#{prefix}#{i}"
end
end
end
|
#jni_native_method_converted_parameters(prefix = "param") ⇒ Object
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'lib/java_dissassembler/erb_helper.rb', line 72
def jni_native_method_converted_parameters(prefix = "param")
conversions = Array.new
java_params.each_with_index do |param, i|
case param
when "java.lang.String"
conversions << "c#{prefix}#{i}"
else
conversions << "#{prefix}#{i}"
end
end
conversions
end
|
#jni_native_method_parameters(prefix = "param") ⇒ Object
55
56
57
58
59
|
# File 'lib/java_dissassembler/erb_helper.rb', line 55
def jni_native_method_parameters(prefix = "param")
native_method_parameters = ["JNIEnv* env"]
native_method_parameters << (is_static? ? "jobject caller" : "jclass klass")
native_method_parameters + java_params.enum_for(:each_with_index).map { |param,i| "#{java_to_jni(param)} #{prefix}#{i}" }
end
|
#jni_params ⇒ Object
108
109
110
|
# File 'lib/java_dissassembler/erb_helper.rb', line 108
def jni_params
java_params.map { |java_type| java_to_jni(java_type) }
end
|
#jni_release_converted_to_c(prefix = "param") ⇒ Object
85
86
87
88
89
90
91
92
93
94
|
# File 'lib/java_dissassembler/erb_helper.rb', line 85
def jni_release_converted_to_c(prefix = "param")
releases = Array.new
java_params.each_with_index do |param, i|
case param
when "java.lang.String"
releases << "env->ReleaseStringUTFChars(#{prefix}#{i}, c#{prefix}#{i})"
end
end
releases
end
|
#jni_return_type ⇒ Object
18
19
20
21
|
# File 'lib/java_dissassembler/erb_helper.rb', line 18
def jni_return_type
return "" if java_return_type == "void"
java_to_jni(java_return_type)
end
|
#jni_return_value ⇒ Object
112
113
114
|
# File 'lib/java_dissassembler/erb_helper.rb', line 112
def jni_return_value
java_to_jni(java_return_type)
end
|
#mangle(str) ⇒ Object
180
181
182
183
184
185
186
187
188
189
190
191
|
# File 'lib/java_dissassembler/erb_helper.rb', line 180
def mangle(str)
mangled_name = str.gsub("_", "_1")
.gsub(";", "_2")
.gsub("[", "_3")
.gsub("/", "_")
mangled_name.codepoints.map do |codepoint|
case
when codepoint <= 0xFF then codepoint.chr
else "_0#{"%04x" % codepoint}"
end
end.join
end
|
#vm_signature_params ⇒ Object
96
97
98
|
# File 'lib/java_dissassembler/erb_helper.rb', line 96
def vm_signature_params
vm_signature.match(/^\(([^\)]*)\)/)[1]
end
|
#vm_to_java(vm_type) ⇒ Object
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
# File 'lib/java_dissassembler/erb_helper.rb', line 133
def vm_to_java(vm_type)
case vm_type
when "Z" then "boolean"
when "B" then "byte"
when "C" then "char"
when "S" then "short"
when "I" then "int"
when "J" then "long"
when "F" then "float"
when "D" then "double"
when "V" then "void"
else
vm_type.gsub("L", "").gsub(";", "").gsub("/", ".")
end
end
|