tealrb 0.4.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/opcode_modules.rb +1 -1
- 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/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
|