tealrb 0.4.0 → 0.5.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: 94e31d86149bd0b29c7f7a08f2cabd94866246808315a3f70e8ac8fc35ea4e8e
4
+ data.tar.gz: e63533e3a902192d6425594109ea5a5e72b92eeea5f45956dc73ad093a05ceee
5
5
  SHA512:
6
- metadata.gz: 3757a7177af88cef08ab3c780fde484210dc5c2a9667a6733815b72b5dfef2e1aeaa176c65ab48be5010cf973c40c1af04b33e3516f14a8bc818a58f5972776b
7
- data.tar.gz: b508d5fa005be7eaf3adf738542c38a053240ccfa73d0de0c2b6410a0ad4358d7a31e90d2899d35aeafc1407955ae5f0ab96ae8083ec1b0aabaf7ffbcd937547
6
+ metadata.gz: 4a5c009da5923b564565b8c78f6e62bd75e17bcac9c19d2ae883d7a789a02ddbefc2e28732b0a278d1b8c868a0728f6ecd81d5cb29eaffc8e2b4a3f808c7acd0
7
+ data.tar.gz: f9310e249ad33ed5199628483916d7e4299da7dbbf76b294cf8fc22d9c6223a58f63135d7ef24d985c3773d3b89a17acffb59bcf9d1cd89c2984be234afdf4c4
@@ -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 = 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
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 = 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
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)
@@ -721,7 +721,7 @@ module TEALrb
721
721
 
722
722
  module AppArgs
723
723
  def self.[](index)
724
- Txna.application_args index
724
+ Txna.application_args[index]
725
725
  end
726
726
  end
727
727
  end
@@ -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'].include? node.source
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.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-16 00:00:00.000000000 Z
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