orgasm 0.0.1a2 → 0.0.1a3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. data/bin/{disorgasm → ejaculate} +0 -0
  2. data/bin/swallow +0 -0
  3. data/lib/orgasm.rb +8 -2
  4. data/lib/orgasm/arch/i386.rb +27 -0
  5. data/lib/orgasm/{style.rb → arch/i386/base.rb} +4 -0
  6. data/lib/orgasm/{common → arch/i386/base}/address.rb +12 -19
  7. data/lib/orgasm/{common/unknown.rb → arch/i386/base/immediate.rb} +6 -10
  8. data/lib/orgasm/arch/i386/base/instruction.rb +41 -0
  9. data/lib/orgasm/arch/i386/base/register.rb +40 -0
  10. data/lib/orgasm/arch/i386/disassembler.rb +26 -154
  11. data/lib/orgasm/arch/i386/generator.rb +44 -0
  12. data/lib/orgasm/arch/i386/instructions.rb +150 -0
  13. data/lib/orgasm/arch/i386/instructions/dsl.rb +159 -0
  14. data/lib/orgasm/arch/i386/instructions/dsl/special.rb +75 -0
  15. data/lib/orgasm/arch/i386/instructions/instructions.rb +50 -0
  16. data/lib/orgasm/arch/i386/styles.rb +70 -0
  17. data/lib/orgasm/architecture.rb +103 -0
  18. data/lib/orgasm/assembler.rb +5 -16
  19. data/lib/orgasm/base.rb +50 -0
  20. data/lib/orgasm/{common/constant.rb → base/address.rb} +7 -6
  21. data/lib/orgasm/{common/register.rb → base/constant.rb} +11 -8
  22. data/lib/orgasm/base/instruction.rb +41 -0
  23. data/lib/orgasm/{common/instruction.rb → base/register.rb} +8 -8
  24. data/lib/orgasm/base/unknown.rb +36 -0
  25. data/lib/orgasm/disassembler.rb +25 -22
  26. data/lib/orgasm/disassembler/decoder.rb +26 -20
  27. data/lib/orgasm/{common/extensions.rb → extensions.rb} +12 -0
  28. data/lib/orgasm/generator.rb +46 -0
  29. data/lib/orgasm/generator/dsl.rb +60 -0
  30. data/lib/orgasm/piece.rb +49 -0
  31. data/lib/orgasm/styles.rb +64 -0
  32. data/lib/orgasm/styles/style.rb +55 -0
  33. data/lib/orgasm/version.rb +1 -1
  34. metadata +54 -14
  35. data/lib/orgasm/common.rb +0 -36
@@ -0,0 +1,60 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Orgasm; class Generator < Piece
21
+
22
+ class DSL < BasicObject
23
+ def initialize (&block)
24
+ @block = block
25
+ end
26
+
27
+ def execute (generator)
28
+ @generator = generator
29
+ @instructions = []
30
+
31
+ instance_eval &@block
32
+
33
+ @instructions
34
+ end
35
+
36
+ def method_missing (id, *args, &block)
37
+ if @generator.respond_to? id
38
+ return @generator.__send__ id, *args, &block
39
+ end
40
+
41
+ @instructions << if @generator.respond_to? :callback
42
+ @generator.callback id, *args, &block
43
+ else
44
+ @generator.for(::Orgasm::Instruction).call(id) {|i|
45
+ args.each {|arg|
46
+ i.parameters << case arg
47
+ when ::Symbol then @generator.for(::Orgasm::Register).call(arg)
48
+ when ::Array then @generator.for(::Orgasm::Address).call(arg)
49
+ when ::Integer then
50
+ if arg.frozen? then @generator.for(::Orgasm::Constant).call(arg)
51
+ else @generator.for(::Orgasm::Address).call(arg)
52
+ end
53
+ end
54
+ }
55
+ }
56
+ end
57
+ end
58
+ end
59
+
60
+ end; end
@@ -0,0 +1,49 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Orgasm
21
+
22
+ class Piece
23
+ attr_reader :arch
24
+
25
+ def initialize (arch, io=nil, &block)
26
+ @arch = arch
27
+
28
+ instance_eval io.read if io
29
+ instance_eval &block if block
30
+ end
31
+
32
+ def self.inherited (subclass)
33
+ subclass.class_eval {
34
+ define_method subclass.name[/([^:]+)$/].downcase do
35
+ self
36
+ end
37
+ }
38
+ end
39
+
40
+ def method_missing (id, *args, &block)
41
+ if @arch.respond_to? id
42
+ @arch.__send__ id, *args, &block
43
+ else
44
+ super
45
+ end
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,64 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ require 'orgasm/styles/style'
21
+
22
+ module Orgasm
23
+
24
+ class Styles < Piece
25
+ def initialize (*)
26
+ @styles = []
27
+
28
+ super
29
+ end
30
+
31
+ def style (*args, &block)
32
+ @styles << Style.new(*args, &block)
33
+ end
34
+
35
+ def use (name)
36
+ @current = @styles.find {|style|
37
+ style.names.member?(name)
38
+ }
39
+ end
40
+
41
+ def current
42
+ @current or use(@styles.first.name)
43
+ end
44
+
45
+ def extend (*things)
46
+ styles = self
47
+
48
+ things.flatten.compact.each {|thing|
49
+ thing.refine_method :to_s do |old, *|
50
+ begin
51
+ styles.apply(self) or old.call or inspect
52
+ rescue
53
+ old.call or inspect
54
+ end
55
+ end
56
+ }
57
+ end
58
+
59
+ def apply (thing)
60
+ current.apply(thing)
61
+ end
62
+ end
63
+
64
+ end
@@ -0,0 +1,55 @@
1
+ #--
2
+ # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
+ #
4
+ # This file is part of orgasm.
5
+ #
6
+ # orgasm is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published
8
+ # by the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # orgasm is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
+ #++
19
+
20
+ module Orgasm; class Styles < Piece
21
+
22
+ class Style
23
+ attr_reader :names
24
+
25
+ def initialize (*names)
26
+ @names = names
27
+ @for = {}
28
+
29
+ yield self
30
+ end
31
+
32
+ def for (klass, &block)
33
+ @for[klass] = block
34
+ end
35
+
36
+ def apply (thing)
37
+ callback = @for[thing.class] or @for.find {|(what, block)|
38
+ what.ancestors.member?(thing.class)
39
+ }.last
40
+
41
+ if callback
42
+ thing.instance_eval &callback
43
+ end
44
+ end
45
+
46
+ def name
47
+ names.first
48
+ end
49
+
50
+ def to_s
51
+ name
52
+ end
53
+ end
54
+
55
+ end; end
@@ -19,6 +19,6 @@
19
19
 
20
20
  module Orgasm
21
21
  def self.version
22
- '0.0.1a2'
22
+ '0.0.1a3'
23
23
  end
24
24
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: orgasm
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 5
5
- version: 0.0.1a2
5
+ version: 0.0.1a3
6
6
  platform: ruby
7
7
  authors:
8
8
  - meh.
@@ -10,13 +10,35 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-20 00:00:00 Z
14
- dependencies: []
15
-
13
+ date: 2011-07-21 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: memoized
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: refining
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id002
16
37
  description:
17
38
  email: meh@paranoici.org
18
39
  executables:
19
- - disorgasm
40
+ - swallow
41
+ - ejaculate
20
42
  extensions: []
21
43
 
22
44
  extra_rdoc_files: []
@@ -24,22 +46,40 @@ extra_rdoc_files: []
24
46
  files:
25
47
  - lib/orgasm/format/elf.rb
26
48
  - lib/orgasm/format/pe.rb
49
+ - lib/orgasm/base.rb
50
+ - lib/orgasm/base/register.rb
51
+ - lib/orgasm/base/unknown.rb
52
+ - lib/orgasm/base/address.rb
53
+ - lib/orgasm/base/constant.rb
54
+ - lib/orgasm/base/instruction.rb
55
+ - lib/orgasm/arch/i386.rb
56
+ - lib/orgasm/arch/i386/base.rb
57
+ - lib/orgasm/arch/i386/instructions/instructions.rb
58
+ - lib/orgasm/arch/i386/instructions/dsl/special.rb
59
+ - lib/orgasm/arch/i386/instructions/dsl.rb
60
+ - lib/orgasm/arch/i386/base/register.rb
61
+ - lib/orgasm/arch/i386/base/immediate.rb
62
+ - lib/orgasm/arch/i386/base/address.rb
63
+ - lib/orgasm/arch/i386/base/instruction.rb
64
+ - lib/orgasm/arch/i386/instructions.rb
65
+ - lib/orgasm/arch/i386/generator.rb
66
+ - lib/orgasm/arch/i386/styles.rb
27
67
  - lib/orgasm/arch/i386/disassembler.rb
68
+ - lib/orgasm/generator/dsl.rb
28
69
  - lib/orgasm/assembler.rb
70
+ - lib/orgasm/extensions.rb
29
71
  - lib/orgasm/version.rb
30
- - lib/orgasm/common/register.rb
31
- - lib/orgasm/common/unknown.rb
32
- - lib/orgasm/common/address.rb
33
- - lib/orgasm/common/extensions.rb
34
- - lib/orgasm/common/constant.rb
35
- - lib/orgasm/common/instruction.rb
36
- - lib/orgasm/style.rb
72
+ - lib/orgasm/generator.rb
73
+ - lib/orgasm/architecture.rb
74
+ - lib/orgasm/styles.rb
75
+ - lib/orgasm/styles/style.rb
37
76
  - lib/orgasm/disassembler.rb
38
77
  - lib/orgasm/disassembler/decoder.rb
39
78
  - lib/orgasm/format.rb
40
- - lib/orgasm/common.rb
79
+ - lib/orgasm/piece.rb
41
80
  - lib/orgasm.rb
42
- - bin/disorgasm
81
+ - bin/swallow
82
+ - bin/ejaculate
43
83
  homepage: http://github.com/meh/orgasm
44
84
  licenses: []
45
85
 
@@ -1,36 +0,0 @@
1
- #--
2
- # Copyleft meh. [http://meh.paranoid.pk | meh@paranoici.org]
3
- #
4
- # This file is part of orgasm.
5
- #
6
- # orgasm is free software: you can redistribute it and/or modify
7
- # it under the terms of the GNU Affero General Public License as published
8
- # by the Free Software Foundation, either version 3 of the License, or
9
- # (at your option) any later version.
10
- #
11
- # orgasm is distributed in the hope that it will be useful,
12
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- # GNU Affero General Public License for more details.
15
- #
16
- # You should have received a copy of the GNU Affero General Public License
17
- # along with orgasm. If not, see <http://www.gnu.org/licenses/>.
18
- #++
19
-
20
- require 'orgasm/common/extensions'
21
-
22
- require 'orgasm/common/unknown'
23
- require 'orgasm/common/instruction'
24
- require 'orgasm/common/address'
25
- require 'orgasm/common/register'
26
- require 'orgasm/common/constant'
27
-
28
- module Orgasm
29
-
30
- def self.object? (value)
31
- [Unknown, Instruction, Address, Register, Constant].any? {|klass|
32
- value.is_a?(klass)
33
- } && value
34
- end
35
-
36
- end