tealrb 0.4.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa3ecdb5dd00d5242fc4606722bc6d6c80625f0dd042fe8a64aaec481fe4bb6d
4
- data.tar.gz: 59ddc597857e55d7b0d6187325d0ff76e3e049403fcdf1ede00f2b3a9a1c2eaf
3
+ metadata.gz: 94ca888a944ccee0517d5e543498570af448a9eb3ea1ba74d3d3261ffc4b86f0
4
+ data.tar.gz: 54ac7826a7af43fb82fa17cf010a2ce869511546067f7a151181b86d3445b0bf
5
5
  SHA512:
6
- metadata.gz: 3757a7177af88cef08ab3c780fde484210dc5c2a9667a6733815b72b5dfef2e1aeaa176c65ab48be5010cf973c40c1af04b33e3516f14a8bc818a58f5972776b
7
- data.tar.gz: b508d5fa005be7eaf3adf738542c38a053240ccfa73d0de0c2b6410a0ad4358d7a31e90d2899d35aeafc1407955ae5f0ab96ae8083ec1b0aabaf7ffbcd937547
6
+ metadata.gz: 4f986ae5a4e3c37460142951923c3908ec95b58d0d91f695a49a07f8e8eee062499d496b185e1f2eafec8ed2020ca9d83a4c8c50c97531a8a67e26057e7bb794
7
+ data.tar.gz: c73f78d20f1c76ccc41e42450f713b14dc42049d8d44ee1498c59e38cda3e7699e4f1e655932f5b86c68d707d1a1abba7d59fc5c92244552236bb2a472a3d4c2
@@ -6,6 +6,7 @@ module TEALrb
6
6
  include Opcodes
7
7
  include ABI
8
8
  include Rewriters
9
+ include MaybeOps
9
10
 
10
11
  attr_reader :teal
11
12
 
@@ -69,6 +70,8 @@ module TEALrb
69
70
  # sets the `#pragma version`, defines teal methods, and defines subroutines
70
71
  def initialize
71
72
  @teal = TEAL.new ["#pragma version #{self.class.version}"]
73
+ IfBlock.id = 0
74
+ @scratch = Scratch.new
72
75
 
73
76
  self.class.subroutines.each_key do |name|
74
77
  define_singleton_method(name) do |*_args|
@@ -85,25 +88,18 @@ module TEALrb
85
88
  end
86
89
  end
87
90
 
91
+ # return the input without transpiling to TEAL
92
+ def rb(input)
93
+ input
94
+ end
95
+
88
96
  # defines a method that is transpiled to TEAL
89
97
  # @param name [Symbol] name of the method
90
98
  # @param definition [Lambda, Proc, UnboundMethod] the method definition
91
99
  # @return [nil]
92
100
  def define_teal_method(name, definition)
93
- @teal.set_as_current
94
-
95
- new_source = rewrite(definition.source, method_rewriter: true)
96
-
97
- pre_string = StringIO.new
98
-
99
- definition.parameters.reverse.each_with_index do |param, i|
100
- param_name = param.last
101
- pre_string.puts "store #{200 + i}"
102
- pre_string.puts "comment('#{param_name}', inline: true)"
103
- pre_string.puts "#{param_name} = -> { load #{200 + i}; comment('#{param_name}', inline: true) }"
104
- end
101
+ new_source = generate_method_source(name, definition)
105
102
 
106
- new_source = "#{pre_string.string}#{new_source}"
107
103
  define_singleton_method(name) do |*_args|
108
104
  eval_tealrb(new_source, debug_context: "teal method: #{name}")
109
105
  end
@@ -116,13 +112,11 @@ module TEALrb
116
112
  # @param definition [Lambda, Proc, UnboundMethod] the method definition
117
113
  # @return [nil]
118
114
  def define_subroutine(name, definition)
119
- @teal.set_as_current
120
-
121
115
  define_singleton_method(name) do |*_args|
122
116
  callsub(name)
123
117
  end
124
118
 
125
- @teal << 'b main' unless @teal.include? 'b main'
119
+ TEAL.instance << 'b main' unless TEAL.instance.include? 'b main'
126
120
 
127
121
  label(name) # add teal label
128
122
 
@@ -130,18 +124,9 @@ module TEALrb
130
124
  comment_content = "#{name}(#{comment_params})"
131
125
  comment(comment_content, inline: true)
132
126
 
133
- new_source = rewrite(definition.source, method_rewriter: true)
134
-
135
- pre_string = StringIO.new
136
-
137
- definition.parameters.reverse.each_with_index do |param, i|
138
- param_name = param.last
139
- pre_string.puts "store #{200 + i}"
140
- pre_string.puts "comment('#{param_name}', inline: true)"
141
- pre_string.puts "#{param_name} = -> { load #{200 + i}; comment('#{param_name}', inline: true) }"
142
- end
127
+ new_source = generate_method_source(name, definition)
128
+ new_source = "#{new_source}retsub"
143
129
 
144
- new_source = "#{pre_string.string}#{new_source}retsub"
145
130
  eval_tealrb(new_source, debug_context: "subroutine: #{name}")
146
131
 
147
132
  nil
@@ -153,17 +138,17 @@ module TEALrb
153
138
  def comment(content, inline: false)
154
139
  content = " #{content}" unless content[0] == ' '
155
140
  if inline
156
- last_line = @teal.pop
157
- @teal << "#{last_line} //#{content}"
141
+ last_line = TEAL.instance.pop
142
+ TEAL.instance << "#{last_line} //#{content}"
158
143
  else
159
- @teal << "//#{content}"
144
+ TEAL.instance << "//#{content}"
160
145
  end
161
146
  end
162
147
 
163
148
  # inserts a string into TEAL source
164
149
  # @param string [String] the string to insert
165
150
  def placeholder(string)
166
- @teal << string
151
+ TEAL.instance << string
167
152
  end
168
153
 
169
154
  # the hash of the abi description
@@ -175,20 +160,41 @@ module TEALrb
175
160
  # @param string [String] string to transpile
176
161
  # @return [nil]
177
162
  def compile_string(string)
178
- @teal.set_as_current
179
163
  eval_tealrb(rewrite(string), debug_context: 'compile_string')
180
164
  nil
181
165
  end
182
166
 
183
167
  # transpiles #main
184
168
  def compile
185
- @teal.set_as_current
186
- @teal << 'main:' if @teal.include? 'b main'
169
+ TEAL.instance << 'main:' if TEAL.instance.include? 'b main'
187
170
  eval_tealrb(rewrite(method(:main).source, method_rewriter: true), debug_context: 'main')
188
171
  end
189
172
 
190
173
  private
191
174
 
175
+ def generate_method_source(name, definition)
176
+ new_source = rewrite(definition.source, method_rewriter: true)
177
+
178
+ pre_string = StringIO.new
179
+
180
+ scratch_names = []
181
+ definition.parameters.reverse.each_with_index do |param, _i|
182
+ param_name = param.last
183
+ scratch_name = [name, param_name].map(&:to_s).join(': ')
184
+ scratch_names << scratch_name
185
+
186
+ pre_string.puts "@scratch.store('#{scratch_name}')"
187
+ pre_string.puts "#{param_name} = -> { @scratch['#{scratch_name}'] }"
188
+ end
189
+
190
+ post_string = StringIO.new
191
+ scratch_names.each do |n|
192
+ post_string.puts "@scratch.delete '#{n}'"
193
+ end
194
+
195
+ "#{pre_string.string}#{new_source}#{post_string.string}"
196
+ end
197
+
192
198
  def rewrite_with_rewriter(string, rewriter)
193
199
  process_source = RuboCop::ProcessedSource.new(string, RUBY_VERSION[/\d\.\d/].to_f)
194
200
  rewriter.new.rewrite(process_source)
@@ -201,7 +207,7 @@ module TEALrb
201
207
  puts ''
202
208
  end
203
209
 
204
- [CommentRewriter, ComparisonRewriter, IfRewriter, OpRewriter, AssignRewriter].each do |rw|
210
+ [CommentRewriter, ComparisonRewriter, WhileRewriter, IfRewriter, OpRewriter, AssignRewriter].each do |rw|
205
211
  string = rewrite_with_rewriter(string, rw)
206
212
  end
207
213
 
@@ -217,7 +223,7 @@ module TEALrb
217
223
  end
218
224
 
219
225
  def eval_tealrb(s, debug_context:)
220
- pre_teal = Array.new @teal
226
+ pre_teal = Array.new TEAL.instance
221
227
 
222
228
  if self.class.debug
223
229
  puts "DEBUG: Evaluating the following code (#{debug_context}):"
@@ -229,7 +235,7 @@ module TEALrb
229
235
 
230
236
  if self.class.debug
231
237
  puts "DEBUG: Resulting TEAL (#{debug_context}):"
232
- puts Array.new(@teal) - pre_teal
238
+ puts Array.new(TEAL.instance) - pre_teal
233
239
  puts ''
234
240
  end
235
241
  rescue SyntaxError, StandardError => e
@@ -6,39 +6,38 @@ module TEALrb
6
6
  attr_accessor :id
7
7
  end
8
8
 
9
- @id = {}.compare_by_identity
9
+ @id = 0
10
10
 
11
- def initialize(teal, _cond, &blk)
12
- self.class.id[teal] ||= 0
13
- @teal = teal
11
+ def initialize(_cond, &blk)
12
+ self.class.id ||= 0
14
13
  @else_count = 0
15
- @id = self.class.id[@teal]
14
+ @id = self.class.id
16
15
  @end_label = "if#{@id}_end:"
17
16
 
18
- self.class.id[@teal] += 1
17
+ self.class.id += 1
19
18
 
20
- @teal << "bz if#{@id}_else0"
19
+ TEAL.instance << "bz if#{@id}_else0"
21
20
  blk.call
22
- @teal << "b if#{@id}_end"
23
- @teal << "if#{@id}_else0:"
24
- @teal << @end_label
21
+ TEAL.instance << "b if#{@id}_end"
22
+ TEAL.instance << "if#{@id}_else0:"
23
+ TEAL.instance << @end_label
25
24
  end
26
25
 
27
26
  def elsif(_cond, &blk)
28
27
  @else_count += 1
29
- @teal.delete @end_label
30
- @teal << "bz if#{@id}_else#{@else_count}"
28
+ TEAL.instance.delete @end_label
29
+ TEAL.instance << "bz if#{@id}_else#{@else_count}"
31
30
  blk.call
32
- @teal << "b if#{@id}_end"
33
- @teal << "if#{@id}_else#{@else_count}:"
34
- @teal << @end_label
31
+ TEAL.instance << "b if#{@id}_end"
32
+ TEAL.instance << "if#{@id}_else#{@else_count}:"
33
+ TEAL.instance << @end_label
35
34
  self
36
35
  end
37
36
 
38
37
  def else(&blk)
39
- @teal.delete @end_label
38
+ TEAL.instance.delete @end_label
40
39
  blk.call
41
- @teal << @end_label
40
+ TEAL.instance << @end_label
42
41
  end
43
42
  end
44
43
  end
@@ -33,7 +33,7 @@ module TEALrb
33
33
  private
34
34
 
35
35
  def txn_type_int(type)
36
- TEALrb::TEAL.current[Thread.current] << "int #{type}"
36
+ TEAL.instance << "int #{type}"
37
37
  end
38
38
  end
39
39
 
@@ -603,7 +603,6 @@ module TEALrb
603
603
  extend AppFields
604
604
 
605
605
  def self.opcode(field, app_id = nil)
606
- @teal = TEALrb::TEAL.current[Thread.current]
607
606
  app_params_get field, app_id
608
607
  end
609
608
  end
@@ -613,7 +612,6 @@ module TEALrb
613
612
  extend AssetFields
614
613
 
615
614
  def self.opcode(field, asset = nil)
616
- @teal = TEALrb::TEAL.current[Thread.current]
617
615
  asset_params_get field, asset
618
616
  end
619
617
  end
@@ -623,7 +621,6 @@ module TEALrb
623
621
  extend AccountFields
624
622
 
625
623
  def self.opcode(field, account = nil)
626
- @teal = TEALrb::TEAL.current[Thread.current]
627
624
  acct_params_get field, account
628
625
  end
629
626
  end
@@ -642,7 +639,6 @@ module TEALrb
642
639
  extend Opcodes
643
640
 
644
641
  def self.opcode(field, index)
645
- @teal = TEALrb::TEAL.current[Thread.current]
646
642
  gtxn index, field
647
643
  end
648
644
 
@@ -667,37 +663,34 @@ module TEALrb
667
663
  class TxnaField
668
664
  include Opcodes
669
665
 
670
- def initialize(field, index = nil)
666
+ def initialize(field)
671
667
  @field = field
672
- @teal = TEALrb::TEAL.current[Thread.current]
673
- txna(field, index) if index
674
668
  end
675
669
 
676
670
  def [](index)
677
- @teal = TEALrb::TEAL.current[Thread.current]
678
671
  txna @field, index
679
672
  end
680
673
  end
681
674
 
682
675
  module Txna
683
- def self.application_args(index = nil)
684
- TxnaField.new('ApplicationArgs', index)
676
+ def self.application_args
677
+ TxnaField.new('ApplicationArgs')
685
678
  end
686
679
 
687
- def self.accounts(index = nil)
688
- TxnaField.new('Accounts', index)
680
+ def self.accounts
681
+ TxnaField.new('Accounts')
689
682
  end
690
683
 
691
- def self.assets(index = nil)
692
- TxnaField.new('Assets', index)
684
+ def self.assets
685
+ TxnaField.new('Assets')
693
686
  end
694
687
 
695
- def self.applications(index = nil)
696
- TxnaField.new('Applications', index)
688
+ def self.applications
689
+ TxnaField.new('Applications')
697
690
  end
698
691
 
699
- def self.logs(index = nil)
700
- TxnaField.new('Logs', index)
692
+ def self.logs
693
+ TxnaField.new('Logs')
701
694
  end
702
695
  end
703
696
 
@@ -706,7 +699,6 @@ module TEALrb
706
699
  extend GlobalFields
707
700
 
708
701
  def self.opcode(field)
709
- @teal = TEALrb::TEAL.current[Thread.current]
710
702
  global field
711
703
  end
712
704
 
@@ -721,7 +713,55 @@ module TEALrb
721
713
 
722
714
  module AppArgs
723
715
  def self.[](index)
724
- Txna.application_args index
716
+ Txna.application_args[index]
717
+ end
718
+ end
719
+
720
+ module MaybeOps
721
+ include Opcodes
722
+
723
+ def app_param_exists?(field, _app_id = nil)
724
+ app_params_get field
725
+ swap
726
+ pop
727
+ end
728
+
729
+ def app_param_value(field, _app_id = nil)
730
+ app_params_get field
731
+ pop
732
+ end
733
+
734
+ def asset_param_exists?(field, _asset_id = nil)
735
+ asset_params_get field
736
+ swap
737
+ pop
738
+ end
739
+
740
+ def asset_param_value(field, _asset_id = nil)
741
+ asset_params_get field
742
+ pop
743
+ end
744
+
745
+ def app_local_ex_exists?(_account = nil, _applicaiton = nil, _key = nil)
746
+ app_local_get_ex
747
+ swap
748
+ pop
749
+ end
750
+
751
+ def app_local_ex_value(_account = nil, _applicaiton = nil, _key = nil)
752
+ app_local_get_ex
753
+ pop
754
+ end
755
+
756
+ def app_global_ex_exists?(_account = nil, _applicaiton = nil, _key = nil)
757
+ app_global_get_ex
758
+ swap
759
+ pop
760
+ end
761
+
762
+ def app_global_ex_value(_account = nil, _applicaiton = nil, _key = nil)
763
+ app_global_get_ex
764
+ pop
725
765
  end
726
766
  end
727
767
  end