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 CHANGED
@@ -1,3 +1,9 @@
1
+ === 0.0.2 / 2009-05-14
2
+
3
+ * Improve use support for packages, make it more API-friendly
4
+ * Disable instance_eval when a block argument is requested
5
+ * Allow defining non-public classes
6
+
1
7
  === 0.0.1 / 2009-03-28
2
8
 
3
9
  * 1 major enhancement
data/Rakefile CHANGED
@@ -15,8 +15,3 @@ Hoe.new('bitescript', BiteScript::VERSION) do |p|
15
15
  end
16
16
 
17
17
  task :default => :test
18
-
19
- Rake::TestTask.new do |t|
20
- t.libs << "lib"
21
- t.test_files = FileList["test/**/*.rb"]
22
- end
@@ -91,19 +91,41 @@ module BiteScript
91
91
  end
92
92
  fb
93
93
  end
94
-
95
- def public_class(class_name, superclass = java.lang.Object, *interfaces, &block)
96
- class_name = @package.empty? ? class_name : "#{@package.join('/')}/#{class_name}"
97
- class_builder = ClassBuilder.new(self, class_name, @file_name, superclass, *interfaces)
98
- @class_builders[class_name] ||= class_builder
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
- class_builder.instance_eval(&block)
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
- elements = 0
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
- elements += 1
124
- @package.push name
158
+ package.push name
125
159
  end
126
160
  end
127
- yield
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, superclass = Object, *interfaces)
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
- @class_writer.visit(BiteScript.bytecode_version, Opcodes::ACC_PUBLIC | Opcodes::ACC_SUPER, class_name, nil, path(superclass), interface_paths.to_java(:string))
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
- mb.instance_eval(&block)
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
- mb.instance_eval(&block)
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
@@ -5,7 +5,7 @@ require 'bitescript/bytecode'
5
5
  require 'bitescript/builder'
6
6
 
7
7
  module BiteScript
8
- VERSION = '0.0.1'
8
+ VERSION = '0.0.2'
9
9
 
10
10
  include BiteScript::ASM
11
11
  JAVA1_4 = Opcodes::V1_4
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
@@ -4,55 +4,62 @@ require 'test/unit'
4
4
  require 'bitescript'
5
5
 
6
6
  class TestJavaClass < Test::Unit::TestCase
7
- def test_constructor
8
- cls = java.lang.String.java_class
7
+ ['public', 'protected', 'private', 'default'].each do |visibility|
9
8
 
10
- cons1 = cls.constructor()
11
- cons2 = cls.constructor(java.lang.String.java_class)
9
+ line = __LINE__; eval "
10
+ def test_constructor_on_#{visibility}_class
11
+ cls = java.lang.String.java_class
12
12
 
13
- assert_not_nil cons1
14
- assert_not_nil cons2
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
- cls = BiteScript::FileBuilder.new('x').public_class('y')
19
- cls.public_constructor()
20
- cls.public_constructor(java.lang.String.java_class)
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
- cons1 = cls.constructor()
23
- cons2 = cls.constructor(java.lang.String.java_class)
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
- assert_not_nil cons1
26
- assert_not_nil cons2
27
- assert_equal [], cons1.parameter_types
28
- assert_equal [java.lang.String.java_class], cons2.parameter_types
29
- end
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
- def test_java_method
32
- cls = java.lang.String.java_class
33
-
34
- m1 = cls.java_method("toString")
35
- m2 = cls.java_method("equals", java.lang.Object.java_class)
36
-
37
- assert_not_nil m1
38
- assert_not_nil m2
39
- assert_equal java.lang.String.java_class, m1.return_type
40
- assert_equal Java::boolean.java_class, m2.return_type
41
- assert_equal [], m1.parameter_types
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: 2
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.1
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-03-28 05:00:00 +00:00
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.1
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.11.0
87
+ version: 1.12.1
86
88
  version:
87
89
  type: :development
88
90
  version_requirement: