bitescript 0.0.6 → 0.0.7

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/bitescript.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{bitescript}
5
- s.version = "0.0.6"
5
+ s.version = "0.0.7"
6
6
  s.authors = ["Charles Oliver Nutter", "Ryan Brown"]
7
7
  s.date = Time.now.strftime('YYYY-MM-DD')
8
8
  s.description = %q{BiteScript is a Ruby DSL for generating Java bytecode and classes.}
@@ -10,8 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.executables = ["bite", "bitec"]
11
11
  s.extra_rdoc_files = Dir['*.txt']
12
12
  s.files = Dir['{bin,examples,lib,nbproject,test}/**/*'] + Dir['{*.txt,*.gemspec,Rakefile}']
13
- puts s.files
14
- s.homepage = %q{http://kenai.com/projects/jvmscript}
13
+ s.homepage = %q{http://github.com/headius/bitescript}
15
14
  s.rdoc_options = ["--main", "README.txt"]
16
15
  s.require_paths = ["lib"]
17
16
  s.rubyforge_project = %q{jruby-extras}
Binary file
@@ -78,6 +78,9 @@ module BiteScript
78
78
  def find_retention(cls)
79
79
  if cls.kind_of?(BiteScript::ASM::ClassMirror)
80
80
  retention = cls.getDeclaredAnnotation('java.lang.annotation.Retention')
81
+ elsif cls.kind_of?(BiteScript::ASM::Type)
82
+ mirror = BiteScript::ASM::ClassMirror.for_name(cls.class_name) rescue nil
83
+ return find_retention(mirror) if mirror
81
84
  elsif Java::JavaClass === cls
82
85
  retention = cls.annotation(Retention.java_class)
83
86
  else
@@ -224,15 +227,12 @@ module BiteScript
224
227
  @interfaces = opts[:interfaces] || []
225
228
  @interface = opts[:interface]
226
229
  flags = Opcodes::ACC_SUPER
230
+ flags |= Opcodes::ACC_ABSTRACT if opts[:abstract]
227
231
  if @interface
228
232
  flags = Opcodes::ACC_INTERFACE | Opcodes::ACC_ABSTRACT
229
233
  end
230
234
 
231
235
  @class_writer = ClassWriter.new(ClassWriter::COMPUTE_MAXS)
232
- if ENV['BS_CHECK_CLASSES']
233
- @real_class_writer = @class_writer
234
- @class_writer = CheckClassAdapter.new(@class_writer)
235
- end
236
236
 
237
237
  interface_paths = []
238
238
  (@interfaces).each {|interface| interface_paths << path(interface)}
@@ -280,12 +280,15 @@ module BiteScript
280
280
  end
281
281
 
282
282
  def generate
283
+ bytes = @class_writer.to_byte_array
283
284
  if ENV['BS_CHECK_CLASSES']
284
- class_writer = @real_class_writer
285
- else
286
- class_writer = @class_writer
285
+ BiteScript::ASM::CheckClassAdapter.verify(
286
+ BiteScript::ASM::ClassReader.new(bytes),
287
+ JRuby.runtime.jruby_class_loader,
288
+ false,
289
+ java.io.PrintWriter.new(java.lang.System.out, true))
287
290
  end
288
- String.from_java_bytes(class_writer.to_byte_array)
291
+ String.from_java_bytes(bytes)
289
292
  end
290
293
 
291
294
  %w[public private protected].each do |modifier|
@@ -330,7 +333,28 @@ module BiteScript
330
333
  def static_init(&block)
331
334
  method(Opcodes::ACC_STATIC, "<clinit>", [void], [], &block)
332
335
  end
333
-
336
+
337
+ def build_method(name, visibility, static, exceptions, type, *args)
338
+ flags =
339
+ case visibility
340
+ when :public; Opcodes::ACC_PUBLIC
341
+ when :private; Opcodes::ACC_PRIVATE
342
+ when :protected; Opcodes::ACC_PROTECTED
343
+ end
344
+ flags |= Opcodes::ACC_STATIC if static
345
+ method(flags, name, [type, *args], exceptions)
346
+ end
347
+
348
+ def build_constructor(visibility, exceptions, *args)
349
+ flags =
350
+ case visibility
351
+ when :public; Opcodes::ACC_PUBLIC
352
+ when :private; Opcodes::ACC_PRIVATE
353
+ when :protected; Opcodes::ACC_PROTECTED
354
+ end
355
+ @constructor = method(flags, "<init>", [nil, *args], exceptions)
356
+ end
357
+
334
358
  def method(flags, name, signature, exceptions, &block)
335
359
  flags |= Opcodes::ACC_ABSTRACT if interface?
336
360
  mb = MethodBuilder.new(self, flags, name, exceptions, signature)
@@ -448,8 +472,8 @@ module BiteScript
448
472
  @next_local = 0
449
473
 
450
474
  @static = (modifiers & Opcodes::ACC_STATIC) != 0
451
- @start_label = labels[:start] = self.label
452
- @end_label = labels[:end] = self.label
475
+ @start_label = labels[:_start] = self.label
476
+ @end_label = labels[:_end] = self.label
453
477
  @exceptions = exceptions || []
454
478
  end
455
479
 
@@ -65,9 +65,7 @@ module BiteScript
65
65
  def ldc_float(value); method_visitor.visit_ldc_insn(java.lang.Float.new(value)); 1; end
66
66
  def ldc_double(value); method_visitor.visit_ldc_insn(java.lang.Double.new(value)); 2; end
67
67
  def ldc_class(value)
68
- value = value.java_class unless Java::JavaClass === value
69
- method_visitor.visit_ldc_insn(ASM::Type.get_type(value))
70
- 1
68
+ method_visitor.visit_ldc_insn(ASM::Type.get_type(ci(value)))
71
69
  end
72
70
  line = __LINE__; eval "
73
71
  def #{const_down}(value)
@@ -183,7 +181,7 @@ module BiteScript
183
181
  # type instructions
184
182
  line = __LINE__; eval "
185
183
  def #{const_down}(type)
186
- method_visitor.visit_type_insn(Opcodes::#{const_name}, path(type))
184
+ method_visitor.visit_type_insn(Opcodes::#{const_name}, tipath(type))
187
185
  #{OpcodeStackDeltas[const_name]}
188
186
  end
189
187
  ", b, __FILE__, line
@@ -1,3 +1,5 @@
1
+ require 'jruby'
2
+
1
3
  module BiteScript::ASM
2
4
  class EnumValue
3
5
  attr_reader :declaring_type, :name
@@ -180,10 +182,20 @@ module BiteScript::ASM
180
182
 
181
183
  def self.load(name_or_bytes)
182
184
  builder = BiteScript::ASM::ClassMirror::Builder.new
185
+ if name_or_bytes.kind_of?(String)
186
+ classname = name_or_bytes.tr('.', '/') + ".class"
187
+ stream = JRuby.runtime.jruby_class_loader.getResourceAsStream(
188
+ classname)
189
+ raise NameError, "Class '#{name_or_bytes}' not found." unless stream
190
+ name_or_bytes = stream
191
+ end
183
192
  BiteScript::ASM::ClassReader.new(name_or_bytes).accept(builder, 3)
184
193
  builder.mirror
185
194
  end
186
- alias for_name load
195
+
196
+ def self.for_name(name)
197
+ load(name)
198
+ end
187
199
 
188
200
  def getConstructor(*arg_types)
189
201
  @constructors[arg_types]
@@ -18,7 +18,18 @@ module BiteScript
18
18
  path.gsub('/', '.')
19
19
  end
20
20
  module_function :classname
21
-
21
+
22
+ def type_insn_path(cls)
23
+ descriptor = class_id(cls)
24
+ if descriptor[0, 1] == '['
25
+ descriptor
26
+ else
27
+ path(cls)
28
+ end
29
+ end
30
+ alias tipath type_insn_path
31
+ module_function :type_insn_path, :tipath
32
+
22
33
  def path(cls)
23
34
  case cls
24
35
  when Symbol
@@ -42,7 +53,7 @@ module BiteScript
42
53
  return "V"
43
54
  end
44
55
 
45
- if Module === cls
56
+ if Module === cls || Symbol === cls
46
57
  return "L#{path(cls)};"
47
58
  end
48
59
 
data/test/test_builder.rb CHANGED
@@ -60,7 +60,6 @@ class TestBuilder < Test::Unit::TestCase
60
60
  def test_sync_ops
61
61
  # TODO figure out what's wrong with this and add error cases
62
62
  assert_equal 'ok', try(JString) {
63
- after = label
64
63
  ldc 'ok'
65
64
  astore 0
66
65
  ldc 'ok'
@@ -70,14 +69,14 @@ class TestBuilder < Test::Unit::TestCase
70
69
  label :begin
71
70
  ldc 'ok'
72
71
  astore 1
73
- goto after
72
+ goto :after
74
73
  label :finally
75
74
  pop
76
75
  aload 0
77
76
  # monitorexit
78
77
  trycatch(:begin, :finally, :finally, nil)
79
- trycatch(:finally, :end, :finally, nil)
80
- after.set!
78
+ trycatch(:finally, :after, :finally, nil)
79
+ label :after
81
80
  aload 1
82
81
  areturn
83
82
  }
@@ -82,6 +82,8 @@ class TestBytecode < Test::Unit::TestCase
82
82
  assert_equal([:visit_ldc_insn, java.lang.Double.new(1)], @dummy.single {ldc(1.0)})
83
83
 
84
84
  assert_equal([:visit_ldc_insn, BiteScript::ASM::Type.get_type(System.java_class)], @dummy.single {ldc(System)})
85
+ type = BiteScript::ASM::Type.get_type('Lcom.example.Test;')
86
+ assert_equal([:visit_ldc_insn, type], @dummy.single {ldc(type)})
85
87
  end
86
88
 
87
89
  def test_int_insns
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 6
9
- version: 0.0.6
8
+ - 7
9
+ version: 0.0.7
10
10
  platform: ruby
11
11
  authors:
12
12
  - Charles Oliver Nutter
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-09 09:15:57.264000 -04:00
18
+ date: 2010-11-10 08:48:06.220000 +01:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -38,6 +38,7 @@ files:
38
38
  - bin/bitep
39
39
  - examples/fib.bs
40
40
  - examples/hello_world.bs
41
+ - examples/hello_world.class
41
42
  - examples/hello_world_macro.bs
42
43
  - examples/indy.bs
43
44
  - examples/mixed_bag.rb
@@ -64,7 +65,7 @@ files:
64
65
  - bitescript.gemspec
65
66
  - Rakefile
66
67
  has_rdoc: true
67
- homepage: http://kenai.com/projects/jvmscript
68
+ homepage: http://github.com/headius/bitescript
68
69
  licenses: []
69
70
 
70
71
  post_install_message: