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 =

Declared 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
  #java_signature = vm_signature.scan(/\[?[ZBCSIJFDV]|\[?L[^\;]*;/).map { |m| vm_to_java(m) }
end

Instance Attribute Details

#flagsObject (readonly)

Returns the value of attribute flags.



3
4
5
# File 'lib/java_dissassembler/method.rb', line 3

def flags
  @flags
end

#nameObject (readonly)

Returns the value of attribute name.



3
4
5
# File 'lib/java_dissassembler/method.rb', line 3

def name
  @name
end

#vm_signatureObject (readonly)

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

Returns:

  • (Boolean)


62
63
64
# File 'lib/java_dissassembler/method.rb', line 62

def is_abstract?
  (@flags & ACC_ABSTRACT) != 0
end

#is_bridge?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/java_dissassembler/method.rb', line 50

def is_bridge?
  (@flags & ACC_BRIDGE) != 0
end

#is_final?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/java_dissassembler/method.rb', line 42

def is_final?
  (@flags & ACC_FINAL) != 0
end

#is_native?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/java_dissassembler/method.rb', line 58

def is_native?
  (@flags & ACC_NATIVE) != 0
end

#is_private?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/java_dissassembler/method.rb', line 30

def is_private?
  (@flags & ACC_PRIVATE) != 0
end

#is_protected?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/java_dissassembler/method.rb', line 34

def is_protected?
  (@flags & ACC_PROTECTED) != 0
end

#is_public?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/java_dissassembler/method.rb', line 26

def is_public?
  (@flags & ACC_PUBLIC) != 0
end

#is_static?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/java_dissassembler/method.rb', line 38

def is_static?
  (@flags & ACC_STATIC) != 0
end

#is_strict?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/java_dissassembler/method.rb', line 66

def is_strict?
  (@flags & ACC_STRICT) != 0
end

#is_synchronized?Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/java_dissassembler/method.rb', line 46

def is_synchronized?
  (@flags & ACC_SYNCHRONIZED) != 0
end

#is_synthetic?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/java_dissassembler/method.rb', line 70

def is_synthetic?
  (@flags & ACC_SYNTHETIC) != 0
end

#is_varargs?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/java_dissassembler/method.rb', line 54

def is_varargs?
  (@flags & ACC_VARARGS) != 0
end

#java_paramsObject



100
101
102
# File 'lib/java_dissassembler/erb_helper.rb', line 100

def java_params
  java_signature.drop(1)
end

#java_return_typeObject



104
105
106
# File 'lib/java_dissassembler/erb_helper.rb', line 104

def java_return_type
  java_signature.at(0)
end

#java_signatureObject

private



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

JNI Call Java from C/C++



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_typeObject



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

JNI Call C from Java



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_callObject



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_paramsObject



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_typeObject



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_valueObject



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_paramsObject



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