furnace-avm2 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- furnace-avm2 (0.0.4)
5
- furnace (>= 0.0.4)
4
+ furnace-avm2 (0.0.8)
5
+ furnace (>= 0.0.5)
6
6
  trollop
7
7
 
8
8
  GEM
@@ -24,6 +24,8 @@ EOS
24
24
  opt :output, "Output file", :type => :string
25
25
  opt :verbose, "Be verbose", :default => false
26
26
 
27
+ opt :threads, "Use <i> threads for processing", :default => 1
28
+
27
29
  opt :only, "Only operate on methods <i+>", :type => :ints, :short => '-O'
28
30
  opt :except, "Operate on all methods except <i+>", :type => :ints, :short => '-E'
29
31
  opt :grep, "Search <s> in method names", :type => :string, :short => '-G'
@@ -104,7 +106,7 @@ threads = []
104
106
  bodies = abc.method_bodies.dup
105
107
  mutex = Mutex.new
106
108
 
107
- 5.times do
109
+ opts[:threads].times do
108
110
  threads << Thread.new do
109
111
  loop do
110
112
  body = mutex.synchronize { bodies.pop }
@@ -129,8 +131,10 @@ mutex = Mutex.new
129
131
  end
130
132
 
131
133
  if opts[:ast]
132
- ast, = body.build_ast
134
+ ast, = body.code_to_ast
135
+ puts "Method #{body.method_idx}"
133
136
  puts ast.to_sexp
137
+ puts
134
138
  end
135
139
 
136
140
  if opts[:cfg]
@@ -143,7 +147,7 @@ mutex = Mutex.new
143
147
  disasm[body, true] if opts[:disasm_after]
144
148
  rescue Exception => e
145
149
  if opts[:collect]
146
- #puts "Failure at method body idx=#{body.method_idx}: #{e.class} (#{e.message}) at #{e.backtrace.first}."
150
+ puts "Failure at method body idx=#{body.method_idx}: #{e.class} (#{e.message}) at #{e.backtrace.first}."
147
151
  failed << body.method_idx
148
152
  else
149
153
  raise e
@@ -169,7 +173,9 @@ end
169
173
  if opts[:collect] && failed.any?
170
174
  puts "To skip #{failed.count} failed methods, append this command-line argument:"
171
175
  puts " --except #{failed.join " "}"
172
- elsif opts[:output]
176
+ end
177
+
178
+ if opts[:output]
173
179
  File.open(opts[:output], "w") do |file|
174
180
  abc.write(file)
175
181
  end
@@ -15,15 +15,15 @@ module Furnace::AVM2::ABC
15
15
  def resolve!
16
16
  sequence = @parent.code
17
17
 
18
- @from = sequence.opcode_at(@from_offset)
19
- @to = sequence.opcode_at(@to_offset)
20
- @target = sequence.opcode_at(@target_offset)
18
+ @from = sequence.opcode_at(from_offset)
19
+ @to = sequence.opcode_at(to_offset)
20
+ @target = sequence.opcode_at(target_offset)
21
21
  end
22
22
 
23
23
  def lookup!
24
- @from_offset = @from.offset
25
- @to_offset = @to.offset
26
- @target_offset = @target.offset
24
+ self.from_offset = @from.offset
25
+ self.to_offset = @to.offset
26
+ self.target_offset = @target.offset
27
27
  end
28
28
  end
29
29
  end
@@ -28,6 +28,10 @@ module Furnace::AVM2::ABC
28
28
  root.klasses[root.instances.index(self)]
29
29
  end
30
30
 
31
+ def initializer_body
32
+ root.method_bodies.find { |body| body.method_idx == initializer_idx }
33
+ end
34
+
31
35
  def to_astlet
32
36
  if interface?
33
37
  root = AST::Node.new(:interface)
@@ -6,6 +6,10 @@ module Furnace::AVM2::ABC
6
6
 
7
7
  abc_array_of :trait, :nested, :class => TraitInfo
8
8
 
9
+ def initializer_body
10
+ root.method_bodies.find { |body| body.method_idx == initializer_idx }
11
+ end
12
+
9
13
  def to_astlet
10
14
  root = AST::Node.new(:klass)
11
15
 
@@ -38,9 +38,9 @@ module Furnace::AVM2::ABC
38
38
  when :UInt
39
39
  AST::Node.new(:integer, [ root.constant_pool.uints[value_idx - 1] ])
40
40
  when :Double
41
- AST::Node.new(:integer, [ root.constant_pool.doubles[value_idx - 1] ])
41
+ AST::Node.new(:double, [ root.constant_pool.doubles[value_idx - 1] ])
42
42
  when :Utf8
43
- AST::Node.new(:integer, [ root.constant_pool.strings[value_idx - 1] ])
43
+ AST::Node.new(:string, [ root.constant_pool.strings[value_idx - 1] ])
44
44
  when :True
45
45
  AST::Node.new(:true)
46
46
  when :False
@@ -26,7 +26,13 @@ module Furnace::AVM2::ABC
26
26
  end
27
27
  end
28
28
 
29
- def each(&block)
29
+ def each
30
+ parse if @raw_code
31
+
32
+ super
33
+ end
34
+
35
+ def map
30
36
  parse if @raw_code
31
37
 
32
38
  super
@@ -176,6 +182,10 @@ module Furnace::AVM2::ABC
176
182
  each do |element|
177
183
  element.resolve! if element.respond_to? :resolve!
178
184
  end
185
+
186
+ exceptions.each do |exception|
187
+ exception.resolve!
188
+ end
179
189
  end
180
190
 
181
191
  def lookup!
@@ -1,3 +1,3 @@
1
1
  module Furnace::AVM2
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: furnace-avm2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-04 00:00:00.000000000 Z
12
+ date: 2012-02-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: furnace
16
- requirement: &76444700 !ruby/object:Gem::Requirement
16
+ requirement: &79381650 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.0.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *76444700
24
+ version_requirements: *79381650
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: trollop
27
- requirement: &76444490 !ruby/object:Gem::Requirement
27
+ requirement: &79380920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *76444490
35
+ version_requirements: *79380920
36
36
  description: furnace-avm2 allows one to load, modify and write back Flash ActionScript3
37
37
  bytecode. It can also decompile it.
38
38
  email: