tealrb 0.3.0 → 0.5.0
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.
- checksums.yaml +4 -4
- data/lib/tealrb/contract.rb +27 -22
- data/lib/tealrb/if_block.rb +1 -2
- data/lib/tealrb/opcode_modules.rb +23 -14
- data/lib/tealrb/rewriters.rb +3 -1
- data/lib/tealrb/scratch.rb +38 -0
- data/lib/tealrb.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94e31d86149bd0b29c7f7a08f2cabd94866246808315a3f70e8ac8fc35ea4e8e
|
4
|
+
data.tar.gz: e63533e3a902192d6425594109ea5a5e72b92eeea5f45956dc73ad093a05ceee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a5c009da5923b564565b8c78f6e62bd75e17bcac9c19d2ae883d7a789a02ddbefc2e28732b0a278d1b8c868a0728f6ecd81d5cb29eaffc8e2b4a3f808c7acd0
|
7
|
+
data.tar.gz: f9310e249ad33ed5199628483916d7e4299da7dbbf76b294cf8fc22d9c6223a58f63135d7ef24d985c3773d3b89a17acffb59bcf9d1cd89c2984be234afdf4c4
|
data/lib/tealrb/contract.rb
CHANGED
@@ -69,6 +69,7 @@ module TEALrb
|
|
69
69
|
# sets the `#pragma version`, defines teal methods, and defines subroutines
|
70
70
|
def initialize
|
71
71
|
@teal = TEAL.new ["#pragma version #{self.class.version}"]
|
72
|
+
@scratch = Scratch.new(@teal)
|
72
73
|
|
73
74
|
self.class.subroutines.each_key do |name|
|
74
75
|
define_singleton_method(name) do |*_args|
|
@@ -92,18 +93,8 @@ module TEALrb
|
|
92
93
|
def define_teal_method(name, definition)
|
93
94
|
@teal.set_as_current
|
94
95
|
|
95
|
-
new_source =
|
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
|
96
|
+
new_source = generate_method_source(name, definition)
|
105
97
|
|
106
|
-
new_source = "#{pre_string.string}#{new_source}"
|
107
98
|
define_singleton_method(name) do |*_args|
|
108
99
|
eval_tealrb(new_source, debug_context: "teal method: #{name}")
|
109
100
|
end
|
@@ -130,18 +121,9 @@ module TEALrb
|
|
130
121
|
comment_content = "#{name}(#{comment_params})"
|
131
122
|
comment(comment_content, inline: true)
|
132
123
|
|
133
|
-
new_source =
|
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
|
124
|
+
new_source = generate_method_source(name, definition)
|
125
|
+
new_source = "#{new_source}retsub"
|
143
126
|
|
144
|
-
new_source = "#{pre_string.string}#{new_source}retsub"
|
145
127
|
eval_tealrb(new_source, debug_context: "subroutine: #{name}")
|
146
128
|
|
147
129
|
nil
|
@@ -189,6 +171,29 @@ module TEALrb
|
|
189
171
|
|
190
172
|
private
|
191
173
|
|
174
|
+
def generate_method_source(name, definition)
|
175
|
+
new_source = rewrite(definition.source, method_rewriter: true)
|
176
|
+
|
177
|
+
pre_string = StringIO.new
|
178
|
+
|
179
|
+
scratch_names = []
|
180
|
+
definition.parameters.reverse.each_with_index do |param, _i|
|
181
|
+
param_name = param.last
|
182
|
+
scratch_name = [name, param_name].map(&:to_s).join(': ')
|
183
|
+
scratch_names << scratch_name
|
184
|
+
|
185
|
+
pre_string.puts "@scratch.store('#{scratch_name}')"
|
186
|
+
pre_string.puts "#{param_name} = -> { @scratch['#{scratch_name}'] }"
|
187
|
+
end
|
188
|
+
|
189
|
+
post_string = StringIO.new
|
190
|
+
scratch_names.each do |n|
|
191
|
+
post_string.puts "@scratch.delete '#{n}'"
|
192
|
+
end
|
193
|
+
|
194
|
+
"#{pre_string.string}#{new_source}#{post_string.string}"
|
195
|
+
end
|
196
|
+
|
192
197
|
def rewrite_with_rewriter(string, rewriter)
|
193
198
|
process_source = RuboCop::ProcessedSource.new(string, RUBY_VERSION[/\d\.\d/].to_f)
|
194
199
|
rewriter.new.rewrite(process_source)
|
data/lib/tealrb/if_block.rb
CHANGED
@@ -6,7 +6,7 @@ module TEALrb
|
|
6
6
|
attr_accessor :id
|
7
7
|
end
|
8
8
|
|
9
|
-
@id = {}
|
9
|
+
@id = {}.compare_by_identity
|
10
10
|
|
11
11
|
def initialize(teal, _cond, &blk)
|
12
12
|
self.class.id[teal] ||= 0
|
@@ -15,7 +15,6 @@ module TEALrb
|
|
15
15
|
@id = self.class.id[@teal]
|
16
16
|
@end_label = "if#{@id}_end:"
|
17
17
|
|
18
|
-
@id = self.class.id[@teal]
|
19
18
|
self.class.id[@teal] += 1
|
20
19
|
|
21
20
|
@teal << "bz if#{@id}_else0"
|
@@ -664,31 +664,40 @@ module TEALrb
|
|
664
664
|
end
|
665
665
|
end
|
666
666
|
|
667
|
-
class
|
667
|
+
class TxnaField
|
668
668
|
include Opcodes
|
669
|
-
include TxnFields
|
670
669
|
|
671
|
-
def initialize(index)
|
672
|
-
@
|
670
|
+
def initialize(field, index = nil)
|
671
|
+
@field = field
|
672
|
+
@teal = TEALrb::TEAL.current[Thread.current]
|
673
|
+
txna(field, index) if index
|
673
674
|
end
|
674
675
|
|
675
|
-
def
|
676
|
+
def [](index)
|
676
677
|
@teal = TEALrb::TEAL.current[Thread.current]
|
677
|
-
txna field,
|
678
|
+
txna @field, index
|
678
679
|
end
|
679
680
|
end
|
680
681
|
|
681
682
|
module Txna
|
682
|
-
|
683
|
-
|
683
|
+
def self.application_args(index = nil)
|
684
|
+
TxnaField.new('ApplicationArgs', index)
|
685
|
+
end
|
684
686
|
|
685
|
-
def self.
|
686
|
-
|
687
|
-
txna field, index
|
687
|
+
def self.accounts(index = nil)
|
688
|
+
TxnaField.new('Accounts', index)
|
688
689
|
end
|
689
690
|
|
690
|
-
def self.
|
691
|
-
|
691
|
+
def self.assets(index = nil)
|
692
|
+
TxnaField.new('Assets', index)
|
693
|
+
end
|
694
|
+
|
695
|
+
def self.applications(index = nil)
|
696
|
+
TxnaField.new('Applications', index)
|
697
|
+
end
|
698
|
+
|
699
|
+
def self.logs(index = nil)
|
700
|
+
TxnaField.new('Logs', index)
|
692
701
|
end
|
693
702
|
end
|
694
703
|
|
@@ -712,7 +721,7 @@ module TEALrb
|
|
712
721
|
|
713
722
|
module AppArgs
|
714
723
|
def self.[](index)
|
715
|
-
Txna.application_args
|
724
|
+
Txna.application_args[index]
|
716
725
|
end
|
717
726
|
end
|
718
727
|
end
|
data/lib/tealrb/rewriters.rb
CHANGED
@@ -66,7 +66,8 @@ module TEALrb
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def on_ivar(node)
|
69
|
-
insert_after(node.loc.name, '.call') unless ['@teal', '@teal_methods', '@subroutines'
|
69
|
+
insert_after(node.loc.name, '.call') unless ['@teal', '@teal_methods', '@subroutines',
|
70
|
+
'@scratch'].include? node.source
|
70
71
|
super
|
71
72
|
end
|
72
73
|
end
|
@@ -116,6 +117,7 @@ module TEALrb
|
|
116
117
|
|
117
118
|
def on_ivar(node)
|
118
119
|
@skips = 2 if node.source == '@teal_methods'
|
120
|
+
@skips = 1 if node.source == '@scratch'
|
119
121
|
end
|
120
122
|
|
121
123
|
def on_send(node)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TEALrb
|
4
|
+
class Scratch
|
5
|
+
def initialize(teal)
|
6
|
+
@teal = teal
|
7
|
+
@open_slots = (0..256).to_a
|
8
|
+
@named_slots = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](key)
|
12
|
+
@teal << "load #{@named_slots[key]} // #{key}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def []=(key, _value)
|
16
|
+
store(key)
|
17
|
+
end
|
18
|
+
|
19
|
+
def store(key)
|
20
|
+
@teal << "store #{@named_slots[key] ||= @open_slots.shift} // #{key}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def delete(key)
|
24
|
+
@open_slots << @named_slots.delete(key)
|
25
|
+
end
|
26
|
+
|
27
|
+
def reserve(slot)
|
28
|
+
name = @named_slots.key(slot)
|
29
|
+
raise ArgumentError, "Attempted to reserve a slot (#{slot}) that corresponds to a named slot (#{name})" if name
|
30
|
+
|
31
|
+
@open_slots.delete slot
|
32
|
+
end
|
33
|
+
|
34
|
+
def unreserve(slot)
|
35
|
+
@open_slots << slot
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/tealrb.rb
CHANGED
@@ -9,6 +9,7 @@ require_relative 'tealrb/opcodes'
|
|
9
9
|
require_relative 'tealrb/opcode_modules'
|
10
10
|
require_relative 'tealrb/rewriters'
|
11
11
|
require_relative 'tealrb/if_block'
|
12
|
+
require_relative 'tealrb/scratch'
|
12
13
|
require_relative 'tealrb/contract'
|
13
14
|
require_relative 'tealrb/cmd_line/teal2tealrb'
|
14
15
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tealrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Polny
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-05-
|
11
|
+
date: 2022-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: method_source
|
@@ -152,6 +152,7 @@ files:
|
|
152
152
|
- lib/tealrb/opcodes.rb
|
153
153
|
- lib/tealrb/patches.rb
|
154
154
|
- lib/tealrb/rewriters.rb
|
155
|
+
- lib/tealrb/scratch.rb
|
155
156
|
homepage: https://github.com/joe-p/tealrb
|
156
157
|
licenses:
|
157
158
|
- MIT
|