bitescript 0.0.1 → 0.0.2
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.
- data/History.txt +6 -0
- data/Rakefile +0 -5
- data/lib/bitescript/builder.rb +74 -17
- data/lib/bitescript.rb +1 -1
- data/test/test_builder.rb +31 -1
- data/test/test_java_class.rb +51 -44
- metadata +8 -6
data/History.txt
CHANGED
data/Rakefile
CHANGED
data/lib/bitescript/builder.rb
CHANGED
@@ -91,19 +91,41 @@ module BiteScript
|
|
91
91
|
end
|
92
92
|
fb
|
93
93
|
end
|
94
|
-
|
95
|
-
def
|
96
|
-
|
97
|
-
|
98
|
-
|
94
|
+
|
95
|
+
def define_class(class_name, opts, &block)
|
96
|
+
pkg = opts[:package] || @package.dup || []
|
97
|
+
|
98
|
+
class_name = pkg.empty? ? class_name : "#{pkg.join('/')}/#{class_name}"
|
99
|
+
class_builder = ClassBuilder.new(self, class_name, @file_name, opts)
|
100
|
+
@class_builders[class_name] ||= class_builder # TODO Is this really what we want?
|
99
101
|
|
100
102
|
if block_given?
|
101
|
-
|
103
|
+
if block.arity == 1
|
104
|
+
block.call(class_builder)
|
105
|
+
else
|
106
|
+
class_builder.instance_eval(&block)
|
107
|
+
end
|
102
108
|
else
|
103
109
|
return class_builder
|
104
110
|
end
|
105
111
|
end
|
106
112
|
|
113
|
+
def public_class(class_name, superclass = java.lang.Object, *interfaces, &block)
|
114
|
+
define_class(class_name, :visibility => :public, :superclass => superclass, :interfaces => interfaces, &block)
|
115
|
+
end
|
116
|
+
|
117
|
+
def protected_class(class_name, superclass = java.lang.Object, *interfaces, &block)
|
118
|
+
define_class(class_name, :visibility => :protected, :superclass => superclass, :interfaces => interfaces, &block)
|
119
|
+
end
|
120
|
+
|
121
|
+
def private_class(class_name, superclass = java.lang.Object, *interfaces, &block)
|
122
|
+
define_class(class_name, :visibility => :private, :superclass => superclass, :interfaces => interfaces, &block)
|
123
|
+
end
|
124
|
+
|
125
|
+
def default_class(class_name, superclass = java.lang.Object, *interfaces, &block)
|
126
|
+
define_class(class_name, :visibility => :default, :superclass => superclass, :interfaces => interfaces, &block)
|
127
|
+
end
|
128
|
+
|
107
129
|
def generate
|
108
130
|
@class_builders.each do |class_name, class_builder|
|
109
131
|
class_file = "#{class_name.gsub('.', '/')}.class"
|
@@ -117,15 +139,26 @@ module BiteScript
|
|
117
139
|
end
|
118
140
|
|
119
141
|
def package(*names)
|
120
|
-
|
142
|
+
return @package unless names.size > 0
|
143
|
+
|
144
|
+
packages = unpack_packages(*names)
|
145
|
+
@package.concat(packages)
|
146
|
+
yield
|
147
|
+
@package = @package[0..(packages.size - 1)]
|
148
|
+
end
|
149
|
+
|
150
|
+
def package=(name)
|
151
|
+
@package = unpack_packages(name)
|
152
|
+
end
|
153
|
+
|
154
|
+
def unpack_packages(*names)
|
155
|
+
package = []
|
121
156
|
names.each do |name_maybe_dotted|
|
122
157
|
name_maybe_dotted.split(/\./).each do |name|
|
123
|
-
|
124
|
-
@package.push name
|
158
|
+
package.push name
|
125
159
|
end
|
126
160
|
end
|
127
|
-
|
128
|
-
elements.times {@package.pop}
|
161
|
+
package
|
129
162
|
end
|
130
163
|
|
131
164
|
def method?
|
@@ -156,16 +189,32 @@ module BiteScript
|
|
156
189
|
attr_accessor :imports
|
157
190
|
attr_accessor :fields
|
158
191
|
|
159
|
-
def initialize(file_builder, class_name, file_name,
|
192
|
+
def initialize(file_builder, class_name, file_name, opts)
|
160
193
|
@parent = file_builder
|
161
194
|
@class_name = class_name
|
162
|
-
@superclass = superclass
|
195
|
+
@superclass = opts[:superclass] || Object
|
163
196
|
|
164
197
|
@class_writer = ClassWriter.new(ClassWriter::COMPUTE_MAXS)
|
165
198
|
|
166
199
|
interface_paths = []
|
167
|
-
interfaces.each {|interface| interface_paths << path(interface)}
|
168
|
-
|
200
|
+
(opts[:interfaces] || []).each {|interface| interface_paths << path(interface)}
|
201
|
+
|
202
|
+
visibility = case (opts[:visibility] && opts[:visibility].to_sym)
|
203
|
+
when nil
|
204
|
+
Opcodes::ACC_PUBLIC # NOTE Not specified means public -- must explicitly ask for default
|
205
|
+
when :default
|
206
|
+
0
|
207
|
+
when :public
|
208
|
+
Opcodes::ACC_PUBLIC
|
209
|
+
when :private
|
210
|
+
Opcodes::ACC_PRIVATE
|
211
|
+
when :protected
|
212
|
+
Opcodes::ACC_PROTECTED
|
213
|
+
else
|
214
|
+
raise "Unknown visibility: #{opts[:visibility]}"
|
215
|
+
end
|
216
|
+
|
217
|
+
@class_writer.visit(BiteScript.bytecode_version, visibility | Opcodes::ACC_SUPER, class_name, nil, path(superclass), interface_paths.to_java(:string))
|
169
218
|
@class_writer.visit_source(file_name, nil)
|
170
219
|
|
171
220
|
@constructor = nil
|
@@ -254,7 +303,11 @@ module BiteScript
|
|
254
303
|
|
255
304
|
if block_given?
|
256
305
|
mb.start
|
257
|
-
|
306
|
+
if block.arity == 1
|
307
|
+
block.call(mb)
|
308
|
+
else
|
309
|
+
mb.instance_eval(&block)
|
310
|
+
end
|
258
311
|
mb.stop
|
259
312
|
end
|
260
313
|
|
@@ -360,7 +413,11 @@ module BiteScript
|
|
360
413
|
def self.build(class_builder, modifiers, name, signature, &block)
|
361
414
|
mb = MethodBuilder.new(class_builder, modifiers, name, signature)
|
362
415
|
mb.start
|
363
|
-
|
416
|
+
if block.arity == 1
|
417
|
+
block.call(mb)
|
418
|
+
else
|
419
|
+
mb.instance_eval(&block)
|
420
|
+
end
|
364
421
|
mb.stop
|
365
422
|
end
|
366
423
|
|
data/lib/bitescript.rb
CHANGED
data/test/test_builder.rb
CHANGED
@@ -29,7 +29,6 @@ class TestBuilder < Test::Unit::TestCase
|
|
29
29
|
|
30
30
|
def load_and_construct(name, class_builder)
|
31
31
|
class_bytes = class_builder.generate
|
32
|
-
File.open(name + ".class", 'w') {|f| f.write(class_bytes)}
|
33
32
|
cls = JRuby.runtime.jruby_class_loader.define_class(name, class_bytes.to_java_bytes)
|
34
33
|
|
35
34
|
cls.new_instance
|
@@ -426,4 +425,35 @@ class TestBuilder < Test::Unit::TestCase
|
|
426
425
|
anno = method.annotation(JRubyMethod.java_class)
|
427
426
|
assert anno
|
428
427
|
end
|
428
|
+
|
429
|
+
def test_package_equals
|
430
|
+
@builder.package = "org.jruby"
|
431
|
+
cb = @builder.public_class(@class_name, @builder.object);
|
432
|
+
dummy_constructor(cb)
|
433
|
+
obj = load_and_construct("org.jruby.#{@class_name}", cb);
|
434
|
+
|
435
|
+
assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
|
436
|
+
end
|
437
|
+
|
438
|
+
def test_package_builder_list
|
439
|
+
obj = nil
|
440
|
+
@builder.package "org", "jruby" do
|
441
|
+
cb = @builder.public_class(@class_name, @builder.object);
|
442
|
+
dummy_constructor(cb)
|
443
|
+
obj = load_and_construct("org.jruby.#{@class_name}", cb);
|
444
|
+
end
|
445
|
+
|
446
|
+
assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
|
447
|
+
end
|
448
|
+
|
449
|
+
def test_package_builder_string
|
450
|
+
obj = nil
|
451
|
+
@builder.package "org.jruby" do
|
452
|
+
cb = @builder.public_class(@class_name, @builder.object);
|
453
|
+
dummy_constructor(cb)
|
454
|
+
obj = load_and_construct("org.jruby.#{@class_name}", cb);
|
455
|
+
end
|
456
|
+
|
457
|
+
assert_equal "org.jruby.#{@class_name}", obj.class.java_class.to_s
|
458
|
+
end
|
429
459
|
end
|
data/test/test_java_class.rb
CHANGED
@@ -4,55 +4,62 @@ require 'test/unit'
|
|
4
4
|
require 'bitescript'
|
5
5
|
|
6
6
|
class TestJavaClass < Test::Unit::TestCase
|
7
|
-
|
8
|
-
cls = java.lang.String.java_class
|
7
|
+
['public', 'protected', 'private', 'default'].each do |visibility|
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
line = __LINE__; eval "
|
10
|
+
def test_constructor_on_#{visibility}_class
|
11
|
+
cls = java.lang.String.java_class
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
assert_equal [], cons1.parameter_types
|
16
|
-
assert_equal [java.lang.String.java_class], cons2.parameter_types
|
13
|
+
cons1 = cls.constructor()
|
14
|
+
cons2 = cls.constructor(java.lang.String.java_class)
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
assert_not_nil cons1
|
17
|
+
assert_not_nil cons2
|
18
|
+
assert_equal [], cons1.parameter_types
|
19
|
+
assert_equal [java.lang.String.java_class], cons2.parameter_types
|
21
20
|
|
22
|
-
|
23
|
-
|
21
|
+
cls = BiteScript::FileBuilder.new('x').#{visibility}_class('y')
|
22
|
+
cls.public_constructor()
|
23
|
+
cls.public_constructor(java.lang.String.java_class)
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
cons1 = cls.constructor()
|
26
|
+
cons2 = cls.constructor(java.lang.String.java_class)
|
27
|
+
|
28
|
+
assert_not_nil cons1
|
29
|
+
assert_not_nil cons2
|
30
|
+
assert_equal [], cons1.parameter_types
|
31
|
+
assert_equal [java.lang.String.java_class], cons2.parameter_types
|
32
|
+
end
|
33
|
+
", binding, __FILE__, line
|
34
|
+
|
35
|
+
line = __LINE__; eval "
|
36
|
+
def test_java_method_on_#{visibility}_class
|
37
|
+
cls = java.lang.String.java_class
|
38
|
+
|
39
|
+
m1 = cls.java_method('toString')
|
40
|
+
m2 = cls.java_method('equals', java.lang.Object.java_class)
|
41
|
+
|
42
|
+
assert_not_nil m1
|
43
|
+
assert_not_nil m2
|
44
|
+
assert_equal java.lang.String.java_class, m1.return_type
|
45
|
+
assert_equal Java::boolean.java_class, m2.return_type
|
46
|
+
assert_equal [], m1.parameter_types
|
47
|
+
assert_equal [java.lang.Object.java_class], m2.parameter_types
|
48
|
+
|
49
|
+
cls = BiteScript::FileBuilder.new('x').#{visibility}_class('y')
|
50
|
+
cls.public_method('toString', java.lang.String.java_class)
|
51
|
+
cls.public_method('equals', Java::boolean.java_class, java.lang.Object.java_class)
|
30
52
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
assert_equal [java.lang.Object.java_class], m2.parameter_types
|
43
|
-
|
44
|
-
cls = BiteScript::FileBuilder.new('x').public_class('y')
|
45
|
-
cls.public_method('toString', java.lang.String.java_class)
|
46
|
-
cls.public_method('equals', Java::boolean.java_class, java.lang.Object.java_class)
|
47
|
-
|
48
|
-
m1 = cls.java_method('toString')
|
49
|
-
m2 = cls.java_method('equals', java.lang.Object.java_class)
|
50
|
-
|
51
|
-
assert_not_nil m1
|
52
|
-
assert_not_nil m2
|
53
|
-
assert_equal java.lang.String.java_class, m1.return_type
|
54
|
-
assert_equal Java::boolean.java_class, m2.return_type
|
55
|
-
assert_equal [], m1.parameter_types
|
56
|
-
assert_equal [java.lang.Object.java_class], m2.parameter_types
|
53
|
+
m1 = cls.java_method('toString')
|
54
|
+
m2 = cls.java_method('equals', java.lang.Object.java_class)
|
55
|
+
|
56
|
+
assert_not_nil m1
|
57
|
+
assert_not_nil m2
|
58
|
+
assert_equal java.lang.String.java_class, m1.return_type
|
59
|
+
assert_equal Java::boolean.java_class, m2.return_type
|
60
|
+
assert_equal [], m1.parameter_types
|
61
|
+
assert_equal [java.lang.Object.java_class], m2.parameter_types
|
62
|
+
end
|
63
|
+
", binding, __FILE__, line
|
57
64
|
end
|
58
65
|
end
|
metadata
CHANGED
@@ -22,13 +22,15 @@ name: bitescript
|
|
22
22
|
rdoc_options:
|
23
23
|
- --main
|
24
24
|
- README.txt
|
25
|
-
autorequire:
|
26
25
|
rubyforge_project: jruby-extras
|
26
|
+
autorequire:
|
27
|
+
licenses: []
|
28
|
+
|
27
29
|
executables:
|
28
30
|
- bite
|
29
31
|
- bitec
|
30
32
|
description: BiteScript is a Ruby DSL for generating Java bytecode and classes.
|
31
|
-
specification_version:
|
33
|
+
specification_version: 3
|
32
34
|
default_executable:
|
33
35
|
files:
|
34
36
|
- History.txt
|
@@ -59,12 +61,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
61
|
version:
|
60
62
|
extensions: []
|
61
63
|
|
62
|
-
rubygems_version: 1.3.
|
64
|
+
rubygems_version: 1.3.3
|
63
65
|
requirements: []
|
64
66
|
|
65
67
|
authors:
|
66
68
|
- charles.nutter@sun.comCharles Oliver Nutter
|
67
|
-
date: 2009-
|
69
|
+
date: 2009-05-14 05:00:00 +00:00
|
68
70
|
platform: ruby
|
69
71
|
test_files:
|
70
72
|
- test/test_bitescript.rb
|
@@ -73,7 +75,7 @@ test_files:
|
|
73
75
|
- test/test_java_class.rb
|
74
76
|
- test/test_signature.rb
|
75
77
|
version: !ruby/object:Gem::Version
|
76
|
-
version: 0.0.
|
78
|
+
version: 0.0.2
|
77
79
|
require_paths:
|
78
80
|
- lib
|
79
81
|
dependencies:
|
@@ -82,7 +84,7 @@ dependencies:
|
|
82
84
|
requirements:
|
83
85
|
- - '>='
|
84
86
|
- !ruby/object:Gem::Version
|
85
|
-
version: 1.
|
87
|
+
version: 1.12.1
|
86
88
|
version:
|
87
89
|
type: :development
|
88
90
|
version_requirement:
|