fastruby 0.0.11 → 0.0.12

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.
@@ -727,7 +727,7 @@ module FastRuby
727
727
  plocals = (void*)pframe->plocals;
728
728
 
729
729
  if (FIX2LONG(plocals->block_function_address) == 0) {
730
- rb_raise(rb_eLocalJumpError, \"no block given\");
730
+ #{_raise("rb_eLocalJumpError", "no block given")};
731
731
  } else {
732
732
  return ((VALUE(*)(int,VALUE*,VALUE,VALUE))FIX2LONG(plocals->block_function_address))(#{tree.size-1}, block_args, FIX2LONG(plocals->block_function_param), (VALUE)pframe);
733
733
  }
@@ -808,9 +808,7 @@ module FastRuby
808
808
  target_frame_ = (void*)FIX2LONG(plocals->call_frame);
809
809
 
810
810
  if (target_frame_ == 0) {
811
- pframe->thread_data->exception = #{literal_value LocalJumpError.exception};
812
- longjmp(pframe->jmp,FASTRUBY_TAG_RAISE);
813
- return Qnil;
811
+ #{_raise("rb_eLocalJumpError","illegal break")};
814
812
  }
815
813
 
816
814
  plocals->call_frame = LONG2FIX(0);
@@ -829,9 +827,7 @@ module FastRuby
829
827
  target_frame_ = (void*)FIX2LONG(plocals->call_frame);
830
828
 
831
829
  if (target_frame_ == 0) {
832
- pframe->thread_data->exception = rb_funcall(rb_eLocalJumpError, #{intern_num :exception},0);
833
- longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
834
- return Qnil;
830
+ #{_raise("rb_eLocalJumpError","illegal retry")};
835
831
  }
836
832
 
837
833
  target_frame_->targetted = 1;
@@ -846,11 +842,7 @@ module FastRuby
846
842
  return Qnil;
847
843
  "
848
844
  else
849
- inline_block "
850
- pframe->thread_data->exception = #{literal_value LocalJumpError.exception};
851
- longjmp(pframe->jmp,FASTRUBY_TAG_RAISE);
852
- return Qnil;
853
- "
845
+ _raise("rb_eLocalJumpError","illegal redo");
854
846
  end
855
847
  end
856
848
 
@@ -862,12 +854,7 @@ module FastRuby
862
854
  return Qnil;
863
855
  "
864
856
  else
865
- inline_block("
866
- pframe->thread_data->exception = #{literal_value LocalJumpError.exception};
867
- longjmp(pframe->jmp,FASTRUBY_TAG_RAISE);
868
- return Qnil;
869
- ")
870
-
857
+ _raise("rb_eLocalJumpError","illegal next");
871
858
  end
872
859
  end
873
860
 
@@ -1541,7 +1528,11 @@ module FastRuby
1541
1528
  end
1542
1529
 
1543
1530
  def to_c_gvar(tree)
1544
- "rb_gvar_get((struct global_entry*)#{global_entry(tree[1])})"
1531
+ if (tree[1] == :$!)
1532
+ "pframe->thread_data->exception"
1533
+ else
1534
+ "rb_gvar_get((struct global_entry*)#{global_entry(tree[1])})"
1535
+ end
1545
1536
  end
1546
1537
 
1547
1538
  def to_c_gasgn(tree)
@@ -1570,8 +1561,7 @@ module FastRuby
1570
1561
  return rb_const_get_from(klass, #{intern_num tree[2]});
1571
1562
  break;
1572
1563
  default:
1573
- rb_raise(rb_eTypeError, \"%s is not a class/module\",
1574
- RSTRING(rb_obj_as_string(klass))->ptr);
1564
+ #{_raise("rb_eTypeError","not a class/module")};
1575
1565
  break;
1576
1566
  }
1577
1567
  }
@@ -1589,15 +1579,17 @@ module FastRuby
1589
1579
  if klass
1590
1580
 
1591
1581
  verify_type_function = proc { |name| "
1592
- static VALUE #{name}(VALUE arg) {
1593
- if (CLASS_OF(arg)!=#{literal_value klass}) rb_raise(#{literal_value FastRuby::TypeMismatchAssignmentException}, \"Illegal assignment at runtime (type mismatch)\");
1582
+ static VALUE #{name}(VALUE arg, void* pframe ) {
1583
+ if (CLASS_OF(arg)!=#{literal_value klass}) {
1584
+ #{_raise(literal_value(FastRuby::TypeMismatchAssignmentException), "Illegal assignment at runtime (type mismatch)")};
1585
+ }
1594
1586
  return arg;
1595
1587
  }
1596
1588
  "
1597
1589
  }
1598
1590
 
1599
1591
 
1600
- "_lvar_assing(&#{locals_accessor}#{tree[1]}, #{anonymous_function(&verify_type_function)}(#{to_c tree[2]}))"
1592
+ "_lvar_assing(&#{locals_accessor}#{tree[1]}, #{anonymous_function(&verify_type_function)}(#{to_c tree[2]},pframe))"
1601
1593
  else
1602
1594
  "_lvar_assing(&#{locals_accessor}#{tree[1]},#{to_c tree[2]})"
1603
1595
  end
@@ -1664,24 +1656,60 @@ module FastRuby
1664
1656
  end
1665
1657
  else
1666
1658
  resbody_tree = tree[2]
1667
- else_tree = tree[3]
1659
+ else_tree = nil
1660
+ if tree[-1]
1661
+ if tree[-1][0] != :resbody
1662
+ else_tree = tree[-1]
1663
+ end
1664
+ end
1665
+
1666
+ catch_condition_array = []
1667
+ lasgn_code = ""
1668
+ resbody_code = to_c(resbody_tree[2])
1669
+
1670
+ rescue_code = ""
1671
+
1672
+ tree[1..-1].each do |resbody_tree|
1673
+ next if resbody_tree[0] != :resbody
1674
+
1675
+ if resbody_tree[1].size == 1
1676
+ resbody_tree[1][1] = [:const, :Exception]
1677
+ end
1678
+
1679
+ if resbody_tree[1].last[0] == :lasgn
1680
+ lasgn_code = to_c(resbody_tree[1].last)
1681
+ end
1682
+
1683
+ resbody_tree[1][1..-1].each do |xtree|
1684
+ if xtree[0] != :lasgn
1685
+ trapcode = "rb_eException";
1686
+
1687
+ if xtree
1688
+ trapcode = to_c(xtree)
1689
+ end
1690
+
1691
+ catch_condition_array << "(rb_obj_is_kind_of(frame.thread_data->exception,#{trapcode}) == Qtrue)"
1692
+ end
1693
+ end
1694
+
1695
+ rescue_code << "
1696
+ if (aux == FASTRUBY_TAG_RAISE) {
1697
+ if (#{catch_condition_array.join(" || ")})
1698
+ {
1699
+ // trap exception
1700
+ frame.targetted = 1;
1701
+
1702
+ #{lasgn_code};
1668
1703
 
1669
- trapcode = "rb_eException";
1670
- if resbody_tree[1][1]
1671
- trapcode = to_c(resbody_tree[1][1])
1704
+ #{resbody_code};
1705
+ }
1706
+ }
1707
+ "
1672
1708
  end
1673
1709
 
1674
1710
  frame_call(
1675
1711
  frame(to_c(tree[1])+";","
1676
- if (aux == FASTRUBY_TAG_RAISE) {
1677
- if (rb_obj_is_kind_of(frame.thread_data->exception,#{trapcode}) == Qtrue)
1678
- {
1679
- // trap exception
1680
- frame.targetted = 1;
1681
-
1682
- #{to_c(resbody_tree[2])};
1683
- }
1684
- }
1712
+ #{rescue_code}
1685
1713
  ", else_tree ? to_c(else_tree) : nil, 1)
1686
1714
 
1687
1715
  )
@@ -1699,6 +1727,31 @@ module FastRuby
1699
1727
  end
1700
1728
  end
1701
1729
 
1730
+ def _raise(class_tree, message_tree = nil)
1731
+ class_tree = to_c class_tree unless class_tree.instance_of? String
1732
+
1733
+ if message_tree.instance_of? String
1734
+ message_tree = "rb_str_new2(#{message_tree.inspect})"
1735
+ else
1736
+ message_tree = to_c message_tree
1737
+ end
1738
+
1739
+ if message_tree
1740
+ return inline_block("
1741
+ pframe->thread_data->exception = rb_funcall(#{class_tree}, #{intern_num :exception},1,#{message_tree});
1742
+ longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
1743
+ return Qnil;
1744
+ ")
1745
+ else
1746
+ return inline_block("
1747
+ pframe->thread_data->exception = rb_funcall(#{class_tree}, #{intern_num :exception},0);
1748
+ longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
1749
+ return Qnil;
1750
+ ")
1751
+ end
1752
+
1753
+ end
1754
+
1702
1755
  def to_c_call(tree, repass_var = nil)
1703
1756
  directive_code = directive(tree)
1704
1757
  if directive_code
@@ -1710,12 +1763,7 @@ module FastRuby
1710
1763
  elsif tree[2] == :raise
1711
1764
  # raise code
1712
1765
  args = tree[3]
1713
-
1714
- return inline_block("
1715
- pframe->thread_data->exception = rb_funcall(#{to_c args[1]}, #{intern_num :exception},0);
1716
- longjmp(pframe->jmp, FASTRUBY_TAG_RAISE);
1717
- return Qnil;
1718
- ")
1766
+ return _raise(args[1],args[2])
1719
1767
  end
1720
1768
 
1721
1769
  recv = tree[1]
data/lib/fastruby.rb CHANGED
@@ -33,6 +33,6 @@ module FastRuby
33
33
  FastRuby.fastruby_script_path = File.expand_path(__FILE__)
34
34
  FastRuby.fastruby_load_path = File.expand_path(File.dirname(__FILE__))
35
35
 
36
- VERSION = "0.0.11" unless defined? FastRuby::VERSION
36
+ VERSION = "0.0.12" unless defined? FastRuby::VERSION
37
37
  end
38
38
 
@@ -281,6 +281,4 @@ describe FastRuby, "fastruby" do
281
281
  basic_unhandled_exception("3", "RuntimeError")
282
282
  basic_unhandled_exception("4", "StandardError")
283
283
  basic_unhandled_exception("5", "Errno::ENOENT")
284
-
285
-
286
284
  end
@@ -0,0 +1,86 @@
1
+ require "fastruby"
2
+
3
+ describe FastRuby, "fastruby" do
4
+
5
+ it "should trap 'no block given" do
6
+ fastruby "
7
+ class LLJ1
8
+ attr_accessor :a
9
+
10
+ def bar
11
+ yield
12
+ end
13
+
14
+ def foo
15
+ bar # this will raise LocalJumpError
16
+ ensure
17
+ @a = 1
18
+ end
19
+ end
20
+ "
21
+
22
+ llj1 = LLJ1.new
23
+
24
+ lambda {
25
+ llj1.foo
26
+ }.should raise_error(LocalJumpError)
27
+
28
+ llj1.a.should be == 1
29
+ end
30
+
31
+
32
+ it "should trap 'TypeError" do
33
+ fastruby "
34
+ class LLJ2
35
+ attr_accessor :a
36
+
37
+ def bar
38
+ 4::X
39
+ end
40
+
41
+ def foo
42
+ bar # this will raise TypeError
43
+ ensure
44
+ @a = 1
45
+ end
46
+ end
47
+ "
48
+
49
+ llj2 = LLJ2.new
50
+
51
+ lambda {
52
+ llj2.foo
53
+ }.should raise_error(TypeError)
54
+
55
+ llj2.a.should be == 1
56
+ end
57
+
58
+ it "should trap FastRuby::TypeMismatchAssignmentException" do
59
+ fastruby "
60
+ class LLJ3
61
+ attr_accessor :a
62
+
63
+ def bar
64
+ a = 0
65
+ lvar_type(a,Fixnum)
66
+ a = 'wrong value'
67
+ end
68
+
69
+ def foo
70
+ bar # this will raise FastRuby::TypeMismatchAssignmentException
71
+ ensure
72
+ @a = 1
73
+ end
74
+ end
75
+ ", :validate_lvar_types => true
76
+
77
+ llj3 = LLJ3.new
78
+
79
+ lambda {
80
+ llj3.foo
81
+ }.should raise_error(FastRuby::TypeMismatchAssignmentException)
82
+
83
+ llj3.a.should be == 1
84
+ end
85
+
86
+ end
@@ -60,9 +60,9 @@ describe FastRuby, "fastruby" do
60
60
  end
61
61
  "
62
62
 
63
- l = eval(random_name).new
64
- l.foo.should be == 222
65
- end
63
+ l = eval(random_name).new
64
+ l.foo.should be == 222
65
+ end
66
66
 
67
67
  def self.argumentless_rescue(exceptionname)
68
68
  fastruby "
@@ -86,4 +86,78 @@ describe FastRuby, "fastruby" do
86
86
 
87
87
  argumentless_rescue("RuntimeError")
88
88
 
89
+ it "should read exception into local" do
90
+ fastruby "
91
+ class ::LLX1
92
+ def foo
93
+ begin
94
+ raise Exception,'message'
95
+ rescue Exception => a
96
+ end
97
+
98
+ a
99
+ end
100
+ end
101
+ "
102
+
103
+ llx1 = ::LLX1.new
104
+ llx1.foo.message.should be == "message"
105
+ end
106
+
107
+ it "should read exception into local with traps of two exceptions" do
108
+ fastruby "
109
+ class ::LLX2
110
+ def foo
111
+ begin
112
+ raise RuntimeError,'message2'
113
+ rescue LocalJumpError, RuntimeError => b
114
+ end
115
+
116
+ b
117
+ end
118
+ end
119
+ "
120
+
121
+ llx2 = ::LLX2.new
122
+ llx2.foo.message.should be == "message2"
123
+ end
124
+
125
+ it "should trap exception with multiple rescue clauses" do
126
+ fastruby "
127
+ class ::LLX3
128
+ def foo
129
+ begin
130
+ raise RuntimeError,'message2'
131
+ rescue LocalJumpError
132
+ rescue RuntimeError => b
133
+ end
134
+
135
+ b
136
+ end
137
+ end
138
+ "
139
+
140
+ llx3 = ::LLX3.new
141
+ llx3.foo.message.should be == "message2"
142
+ end
143
+
144
+ it "should trap exception with multiple rescue clauses 2" do
145
+ fastruby "
146
+ class ::LLX4
147
+ def foo
148
+ begin
149
+ raise LocalJumpError,'message2'
150
+ rescue LocalJumpError => a
151
+ rescue RuntimeError
152
+ end
153
+
154
+ a
155
+ end
156
+ end
157
+ "
158
+
159
+ llx4 = ::LLX4.new
160
+ llx4.foo.message.should be == "message2"
161
+ end
162
+
89
163
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastruby
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 11
10
- version: 0.0.11
9
+ - 12
10
+ version: 0.0.12
11
11
  platform: ruby
12
12
  authors:
13
13
  - Dario Seminara
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-02 00:00:00 -03:00
18
+ date: 2011-10-06 00:00:00 -03:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -79,6 +79,8 @@ files:
79
79
  - lib/fastruby/sexp_extension.rb
80
80
  - lib/fastruby/translator.rb
81
81
  - lib/fastruby/object.rb
82
+ - lib/fastruby/translator/iter.rb
83
+ - lib/fastruby/translator/call.rb
82
84
  - lib/fastruby/fastruby_sexp.rb
83
85
  - lib/fastruby/method_extension.rb
84
86
  - lib/fastruby/cache/cache.rb
@@ -100,6 +102,7 @@ files:
100
102
  - spec/exception/syntaxis_spec.rb
101
103
  - spec/exception/base_spec.rb
102
104
  - spec/exception/ensure_spec.rb
105
+ - spec/exception/internal_ex_spec.rb
103
106
  - spec/block_spec.rb
104
107
  - spec/flow_control/case_spec.rb
105
108
  - spec/flow_control/for_spec.rb