rVM 0.0.10 → 0.0.11
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.
- data/lib/rake/helpers/code_statistics.rb +167 -0
- data/lib/rvm/classes.rb +4 -0
- data/lib/rvm/classes/string.rb +1 -0
- data/lib/rvm/functions/array.rb +3 -0
- data/lib/rvm/functions/array/set_at.rb +0 -4
- data/lib/rvm/functions/collection/size.rb +2 -2
- data/lib/rvm/functions/logic/and.rb +1 -1
- data/lib/rvm/functions/logic/or.rb +2 -2
- data/lib/rvm/interpreter.rb +84 -44
- data/lib/rvm/languages/ecma.rb +581 -501
- data/spec/base/class_spec.rb +27 -0
- data/spec/base/function_spec.rb +25 -0
- data/spec/base/interpreter/assignment_spec.rb +22 -0
- data/spec/base/interpreter/condition_spec.rb +47 -0
- data/spec/base/interpreter/constant_spec.rb +31 -0
- data/spec/base/interpreter/enviroment_spec.rb +51 -0
- data/spec/base/interpreter/function_call_spec.rb +72 -0
- data/spec/base/interpreter/interpreter_spec.rb +11 -0
- data/spec/base/interpreter/parameter_spec.rb +24 -0
- data/spec/base/interpreter/sequence_spec.rb +20 -0
- data/spec/base/interpreter/variable_spec.rb +24 -0
- data/spec/base/plugin_spec.rb +10 -0
- data/spec/classes/atom/association_spec.rb +39 -0
- data/spec/classes/atom/block_spec.rb +27 -0
- data/spec/classes/atom/boolean_spec.rb +67 -0
- data/spec/classes/atom/error_spec.rb +43 -0
- data/spec/classes/atom/list_spec.rb +68 -0
- data/spec/classes/atom/number_spec.rb +132 -0
- data/spec/classes/atom/string_spec.rb +175 -0
- data/spec/functions/association/assoc_get_spec.rb +41 -0
- data/spec/functions/association/assoc_set_spec.rb +43 -0
- data/spec/functions/collection/get_spec.rb +12 -0
- data/spec/functions/collection/set_spec.rb +10 -0
- data/spec/functions/collection/size_spec.rb +10 -0
- data/spec/functions/list/split_spec.rb +47 -0
- data/spec/functions/string/ansi_spec.rb +44 -0
- data/spec/functions/string/capstr_spec.rb +42 -0
- data/spec/functions/string/center_spec.rb +49 -0
- data/spec/functions/string/ljust_spec.rb +49 -0
- data/spec/functions/string/regmatch_spec.rb +52 -0
- data/spec/functions/string/rjust_spec.rb +49 -0
- data/spec/languages/ecma_spec.rb +337 -0
- data/spec/languages/math/compiler_spec.rb +49 -0
- data/spec/languages/math/tokenizer_spec.rb +73 -0
- data/spec/languages/math/tree_spec.rb +153 -0
- metadata +42 -5
@@ -0,0 +1,167 @@
|
|
1
|
+
# From rails (http://rubyonrails.com)
|
2
|
+
#
|
3
|
+
# Improved by murphy
|
4
|
+
class CodeStatistics
|
5
|
+
|
6
|
+
TEST_TYPES = /\btest/i
|
7
|
+
|
8
|
+
# Create a new Code Statistic.
|
9
|
+
#
|
10
|
+
# Rakefile Example:
|
11
|
+
#
|
12
|
+
# desc 'Report code statistics (LOC) from the application'
|
13
|
+
# task :stats => :copy_files do
|
14
|
+
# require 'rake_helpers/code_statistics'
|
15
|
+
# CodeStatistics.new(
|
16
|
+
# ["Main", "lib"],
|
17
|
+
# ["Tests", "test"],
|
18
|
+
# ["Demos", "demo"]
|
19
|
+
# ).to_s
|
20
|
+
# end
|
21
|
+
def initialize(*pairs)
|
22
|
+
@pairs = pairs
|
23
|
+
@statistics = calculate_statistics
|
24
|
+
@total = if pairs.empty? then nil else calculate_total end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Print a textual table viewing the stats
|
28
|
+
#
|
29
|
+
# Intended for console output.
|
30
|
+
def print
|
31
|
+
print_header
|
32
|
+
@pairs.each { |name, path| print_line name, @statistics[name] }
|
33
|
+
print_splitter
|
34
|
+
|
35
|
+
if @total
|
36
|
+
print_line 'Total', @total
|
37
|
+
print_splitter
|
38
|
+
end
|
39
|
+
|
40
|
+
print_code_test_stats
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
DEFAULT_FILE_PATTERN = /\.rb$/
|
46
|
+
|
47
|
+
def calculate_statistics
|
48
|
+
@pairs.inject({}) do |stats, (name, path, pattern, is_ruby_code)|
|
49
|
+
pattern ||= DEFAULT_FILE_PATTERN
|
50
|
+
path = File.join path, '*.rb'
|
51
|
+
stats[name] = calculate_directory_statistics path, pattern, is_ruby_code
|
52
|
+
stats
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def calculate_directory_statistics directory, pattern = DEFAULT_FILE_PATTERN, is_ruby_code = true
|
57
|
+
is_ruby_code = true if is_ruby_code.nil?
|
58
|
+
stats = Hash.new 0
|
59
|
+
|
60
|
+
Dir[directory].each do |file_name|
|
61
|
+
puts "Scanning #{file_name}..." if $DEBUG
|
62
|
+
next unless file_name =~ pattern
|
63
|
+
|
64
|
+
lines = codelines = classes = modules = methods = 0
|
65
|
+
empty_lines = comment_lines = 0
|
66
|
+
in_comment_block = false
|
67
|
+
|
68
|
+
File.readlines(file_name).each do |line|
|
69
|
+
lines += 1
|
70
|
+
if line[/^\s*$/]
|
71
|
+
empty_lines += 1
|
72
|
+
elsif is_ruby_code
|
73
|
+
case line
|
74
|
+
when /^=end\b/
|
75
|
+
comment_lines += 1
|
76
|
+
in_comment_block = false
|
77
|
+
when in_comment_block
|
78
|
+
comment_lines += 1
|
79
|
+
when /^\s*class\b/: classes += 1
|
80
|
+
when /^\s*module\b/: modules += 1
|
81
|
+
when /^\s*def\b/: methods += 1
|
82
|
+
when /^\s*#/: comment_lines += 1
|
83
|
+
when /^=begin\b/
|
84
|
+
in_comment_block = false
|
85
|
+
comment_lines += 1
|
86
|
+
when /^__END__$/
|
87
|
+
in_comment_block = true
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
codelines = lines - comment_lines - empty_lines
|
93
|
+
|
94
|
+
stats[:lines] += lines
|
95
|
+
stats[:comments] += comment_lines
|
96
|
+
stats[:codelines] += codelines
|
97
|
+
stats[:classes] += classes
|
98
|
+
stats[:modules] += modules
|
99
|
+
stats[:methods] += methods
|
100
|
+
stats[:files] += 1
|
101
|
+
end
|
102
|
+
|
103
|
+
stats
|
104
|
+
end
|
105
|
+
|
106
|
+
def calculate_total
|
107
|
+
total = Hash.new 0
|
108
|
+
@statistics.each_value { |pair| pair.each { |k, v| total[k] += v } }
|
109
|
+
total
|
110
|
+
end
|
111
|
+
|
112
|
+
def calculate_code
|
113
|
+
code_loc = 0
|
114
|
+
@statistics.each { |k, v| code_loc += v[:codelines] unless k[TEST_TYPES] }
|
115
|
+
code_loc
|
116
|
+
end
|
117
|
+
|
118
|
+
def calculate_tests
|
119
|
+
test_loc = 0
|
120
|
+
@statistics.each { |k, v| test_loc += v[:codelines] if k[TEST_TYPES] }
|
121
|
+
test_loc
|
122
|
+
end
|
123
|
+
|
124
|
+
def print_header
|
125
|
+
print_splitter
|
126
|
+
puts "| T=Test Name | Files | Lines | LOC | Comments | Classes | Modules | Methods | M/C | LOC/M |"
|
127
|
+
print_splitter
|
128
|
+
end
|
129
|
+
|
130
|
+
def print_splitter
|
131
|
+
puts "+---------------------------+-------+-------+-------+----------+---------+---------+---------+-----+-------+"
|
132
|
+
end
|
133
|
+
|
134
|
+
def print_line name, statistics
|
135
|
+
m_over_c = (statistics[:methods] / (statistics[:classes] + statistics[:modules])) rescue m_over_c = 0
|
136
|
+
loc_over_m = (statistics[:codelines] / statistics[:methods]) - 2 rescue loc_over_m = 0
|
137
|
+
|
138
|
+
if name[TEST_TYPES]
|
139
|
+
name = "T #{name}"
|
140
|
+
else
|
141
|
+
name = " #{name}"
|
142
|
+
end
|
143
|
+
|
144
|
+
line = "| %-25s | %5d | %5d | %5d | %8d | %7d | %7d | %7d | %3d | %5d |" % (
|
145
|
+
[name, *statistics.values_at(:files, :lines, :codelines, :comments, :classes, :modules, :methods)] +
|
146
|
+
[m_over_c, loc_over_m] )
|
147
|
+
|
148
|
+
puts line
|
149
|
+
end
|
150
|
+
|
151
|
+
def print_code_test_stats
|
152
|
+
code = calculate_code
|
153
|
+
tests = calculate_tests
|
154
|
+
|
155
|
+
puts " Code LOC = #{code} Test LOC = #{tests} Code:Test Ratio = [1 : #{sprintf("%.2f", tests.to_f/code)}]"
|
156
|
+
puts ""
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
# Run a test script.
|
162
|
+
if $0 == __FILE__
|
163
|
+
$VERBOSE = true
|
164
|
+
CodeStatistics.new(
|
165
|
+
['This dir', File.dirname(__FILE__)]
|
166
|
+
).print
|
167
|
+
end
|
data/lib/rvm/classes.rb
CHANGED
@@ -59,6 +59,10 @@ module RVM
|
|
59
59
|
@variables ||= {:self => self, }
|
60
60
|
end
|
61
61
|
|
62
|
+
def is_true?
|
63
|
+
true
|
64
|
+
end
|
65
|
+
|
62
66
|
# This defines the type of the class, it defaults to :any
|
63
67
|
# it is important for tying and type conversion, as long as it
|
64
68
|
# behaves like a string, it can look like a sting ;)
|
data/lib/rvm/classes/string.rb
CHANGED
data/lib/rvm/functions/array.rb
CHANGED
@@ -3,13 +3,9 @@ module RVM
|
|
3
3
|
class SetAt < Function
|
4
4
|
def SetAt.execute params, env
|
5
5
|
if params.length == 3
|
6
|
-
p params
|
7
6
|
array = params.shift
|
8
7
|
pos = params.shift
|
9
8
|
value = params.shift
|
10
|
-
p array
|
11
|
-
p pos
|
12
|
-
p value
|
13
9
|
array[pos.to_i] = value
|
14
10
|
else
|
15
11
|
RVM::Classes[:error].new(1,"FUNCTION (#{self.class}) EXPECTS 3 ARGUMENTS BUT GOT #{params.length}")
|
@@ -7,12 +7,12 @@ module RVM
|
|
7
7
|
RVM::Classes::Association
|
8
8
|
]
|
9
9
|
def execute params, env
|
10
|
-
if COLLECTION_CLASSES.include?(this = env.read_var_val(:self)) and params.empty?
|
10
|
+
if COLLECTION_CLASSES.include?((this = env.read_var_val(:self)).class) and params.empty?
|
11
11
|
RVM::Classes[:number].new(this.size)
|
12
12
|
elsif params.length == 1
|
13
13
|
RVM::Classes[:number].new(params[0].size)
|
14
14
|
else
|
15
|
-
RVM::Classes[:error].new(1,"FUNCTION (#{self
|
15
|
+
RVM::Classes[:error].new(1,"FUNCTION (#{self}) EXPECTS 1 or 0 ARGUMENTS BUT GOT #{params.length}")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
def signature
|
data/lib/rvm/interpreter.rb
CHANGED
@@ -9,6 +9,13 @@ module RVM
|
|
9
9
|
#
|
10
10
|
module Interpreter
|
11
11
|
|
12
|
+
|
13
|
+
class Element
|
14
|
+
attr_accessor :pos
|
15
|
+
def initialize pos
|
16
|
+
@pos = pos
|
17
|
+
end
|
18
|
+
end
|
12
19
|
# This is a helper fuctio to quickly generate a empty enviorment.
|
13
20
|
def Interpreter.env aenv = {}
|
14
21
|
RVM::debug "Interpreter.env" if $DEBUG
|
@@ -22,22 +29,8 @@ module RVM
|
|
22
29
|
RVM::Interpreter::Constant.new(RVM::Classes[type].new(value), pos)
|
23
30
|
end
|
24
31
|
|
25
|
-
|
26
|
-
|
27
|
-
def initialize obj, var, writable = true
|
28
|
-
@obj = obj
|
29
|
-
@get = var.to_sym
|
30
|
-
@set = "#{var}=".to_sym
|
31
|
-
@writable = writable
|
32
|
-
end
|
33
|
-
def val= v
|
34
|
-
@obj.send(@set,v) if @writable
|
35
|
-
end
|
36
|
-
def val
|
37
|
-
@obj.send(@get)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
32
|
+
# This class is used to store the variable content to allow chross refferencing
|
33
|
+
# and passing variables upwards through different scopes.
|
41
34
|
class VariableStorage
|
42
35
|
attr_accessor :val
|
43
36
|
def initialize val = nil, writable = true, &block
|
@@ -50,6 +43,23 @@ module RVM
|
|
50
43
|
@val = v if @writable
|
51
44
|
@val
|
52
45
|
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# The callback storang is used to help publishing variables from a ruby
|
49
|
+
# class to the rVM, it will get and set the variables during runtime.
|
50
|
+
class VariableStorageCallback < VariableStorage
|
51
|
+
def initialize obj, var, writable = true
|
52
|
+
super(nil, writable)
|
53
|
+
@obj = obj
|
54
|
+
@get = var.to_sym
|
55
|
+
@set = "#{var}=".to_sym
|
56
|
+
end
|
57
|
+
def val= v
|
58
|
+
@obj.send(@set,v) if @writable
|
59
|
+
end
|
60
|
+
def val
|
61
|
+
@obj.send(@get)
|
62
|
+
end
|
53
63
|
end
|
54
64
|
|
55
65
|
# This class represents the enviroment, the memory so to say for the VM.
|
@@ -135,7 +145,7 @@ module RVM
|
|
135
145
|
end
|
136
146
|
# Defines a varialbe in the current scope, priviose variables are not
|
137
147
|
# changed
|
138
|
-
def
|
148
|
+
def declare k, v
|
139
149
|
@data[:locals][k] = VariableStorage.new(v)
|
140
150
|
end
|
141
151
|
|
@@ -182,18 +192,18 @@ module RVM
|
|
182
192
|
# is set to the object in which context we are!
|
183
193
|
#
|
184
194
|
# The class is stred in :class
|
185
|
-
class ObjectContext
|
195
|
+
class ObjectContext < Element
|
186
196
|
def initialize object, code, pos = nil
|
197
|
+
super(pos)
|
187
198
|
@object = object
|
188
199
|
@code = code
|
189
|
-
@pos = pos
|
190
200
|
end
|
191
201
|
|
192
202
|
def execute env
|
193
203
|
#The new
|
194
204
|
obj = @object.execute(env)
|
195
205
|
new_env = Interpreter::Enviroment.new({:functions => obj.functions, :locals => obj.variables}, env)
|
196
|
-
new_env.
|
206
|
+
new_env.declare(:self, obj)
|
197
207
|
@code.execute(new_env)
|
198
208
|
end
|
199
209
|
end
|
@@ -202,12 +212,12 @@ module RVM
|
|
202
212
|
#This sets a funciton on a Class (to be included in its objects)
|
203
213
|
#
|
204
214
|
#To define class functions use ObjectContext and define the function normaly, nifty isn't it?
|
205
|
-
class SetClassFunction
|
215
|
+
class SetClassFunction < Element
|
206
216
|
def initialize obj, name, function, pos = nil
|
217
|
+
super(pos)
|
207
218
|
@object = obj
|
208
219
|
@name = name
|
209
220
|
@function = function
|
210
|
-
@pos = pos
|
211
221
|
end
|
212
222
|
|
213
223
|
def execute env
|
@@ -221,11 +231,11 @@ module RVM
|
|
221
231
|
#
|
222
232
|
# Blocks are mostly used to handle tasks as not interfeeing
|
223
233
|
# With outer code.
|
224
|
-
class Block
|
234
|
+
class Block < Element
|
225
235
|
attr_reader :content
|
226
236
|
def initialize content, pos = nil
|
237
|
+
super(pos)
|
227
238
|
@content = content
|
228
|
-
@pos = pos
|
229
239
|
end
|
230
240
|
|
231
241
|
# When executed a temporary enviroment is created with the passed
|
@@ -239,7 +249,7 @@ module RVM
|
|
239
249
|
|
240
250
|
# This is a function definition used to write in the function libary
|
241
251
|
#
|
242
|
-
class FunctionDefinition
|
252
|
+
class FunctionDefinition < Element
|
243
253
|
|
244
254
|
# Initializes a new function definition
|
245
255
|
#
|
@@ -254,10 +264,10 @@ module RVM
|
|
254
264
|
# replaced when it is called a second time.
|
255
265
|
# When false a exception is thrown
|
256
266
|
def initialize name, body, override = true, pos = nil
|
267
|
+
super(pos)
|
257
268
|
@name = name
|
258
269
|
@body = body
|
259
270
|
@override = override
|
260
|
-
@pos = pos
|
261
271
|
end
|
262
272
|
|
263
273
|
def execute env
|
@@ -265,14 +275,14 @@ module RVM
|
|
265
275
|
raise "Function #{@name} already defined at #{@pos}!"
|
266
276
|
end
|
267
277
|
env.def_function(@name.execute(env),@body)
|
268
|
-
|
278
|
+
@body
|
269
279
|
end
|
270
280
|
end
|
271
281
|
|
272
282
|
|
273
283
|
# This is a loop. It is executed over and over again as long as
|
274
284
|
# the passed condition evaluates to a value that matches is_true?.
|
275
|
-
class Loop
|
285
|
+
class Loop < Element
|
276
286
|
# Initializes a new loop.
|
277
287
|
#
|
278
288
|
# condition:: is executed before each run of the loop. If it evaluates
|
@@ -280,15 +290,17 @@ module RVM
|
|
280
290
|
# exection ends.
|
281
291
|
# body:: For each itteration of the loop this is executed once.
|
282
292
|
def initialize(condition, body, pos = nil)
|
293
|
+
super(pos)
|
283
294
|
@condition = condition
|
284
295
|
@body = body
|
285
|
-
@pos = pos
|
286
296
|
end
|
287
297
|
|
288
298
|
def execute env
|
299
|
+
r = nil
|
289
300
|
while @condition.execute(env).is_true?
|
290
|
-
@body.execute(env)
|
301
|
+
r = @body.execute(env)
|
291
302
|
end
|
303
|
+
r
|
292
304
|
end
|
293
305
|
end
|
294
306
|
|
@@ -296,11 +308,11 @@ module RVM
|
|
296
308
|
# A constant, it evaluates to thevalue given and end the evaluation.
|
297
309
|
# Meaning that no further execution is done in this tree branch, so the
|
298
310
|
# value isn't evaluated.
|
299
|
-
class Constant
|
311
|
+
class Constant < Element
|
300
312
|
attr_reader :value
|
301
313
|
def initialize value, pos = nil
|
314
|
+
super(pos)
|
302
315
|
@value = value
|
303
|
-
@pos = pos
|
304
316
|
end
|
305
317
|
|
306
318
|
def data_type
|
@@ -342,7 +354,7 @@ module RVM
|
|
342
354
|
# * execute for the true case is called and it's result returned
|
343
355
|
# * if the result is false or is_true? is false:
|
344
356
|
# * execute is called for the false case and it's result is returned
|
345
|
-
class Condition
|
357
|
+
class Condition < Element
|
346
358
|
# Creates a new condition with the given parameters. The false_case can
|
347
359
|
# be ommitted.
|
348
360
|
#
|
@@ -351,10 +363,10 @@ module RVM
|
|
351
363
|
# * true_case - is only executed if value evalutes to true (is_true?)
|
352
364
|
# * false_case - is only executed if value evalutes to false (!is_true?)
|
353
365
|
def initialize value, true_case, false_case = nil, pos = nil
|
366
|
+
super(pos)
|
354
367
|
@value = value
|
355
368
|
@true_case = true_case
|
356
369
|
@false_case = false_case
|
357
|
-
@pos = pos
|
358
370
|
end
|
359
371
|
|
360
372
|
def data_type
|
@@ -382,11 +394,11 @@ module RVM
|
|
382
394
|
#
|
383
395
|
# Both the *name* and the *value* are evaluated before the assignment
|
384
396
|
# is done.
|
385
|
-
class Assignment
|
397
|
+
class Assignment < Element
|
386
398
|
def initialize name, value, pos = nil
|
399
|
+
super(pos)
|
387
400
|
@name = name
|
388
401
|
@value = value
|
389
|
-
@pos = pos
|
390
402
|
end
|
391
403
|
|
392
404
|
def data_type
|
@@ -399,14 +411,36 @@ module RVM
|
|
399
411
|
end
|
400
412
|
end
|
401
413
|
|
414
|
+
# A variable declarion that sets a local variable, it will redelcare
|
415
|
+
# the variable if declared in a privouse scope.
|
416
|
+
#
|
417
|
+
# Both the *name* and the *value* are evaluated before the assignment
|
418
|
+
# is done.
|
419
|
+
class Declaration < Element
|
420
|
+
def initialize name, value, pos = nil
|
421
|
+
super(pos)
|
422
|
+
@name = name
|
423
|
+
@value = value
|
424
|
+
end
|
425
|
+
|
426
|
+
def data_type
|
427
|
+
@value.data_type
|
428
|
+
end
|
429
|
+
|
430
|
+
def execute env
|
431
|
+
RVM::debug "Executing Assignment at #{@pos}..." if $DEBUG
|
432
|
+
env.declare(@name.execute(env).to_s,@value.execute(env)).val
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
402
436
|
# Reads the value of a variable in the enviroment.
|
403
437
|
#
|
404
438
|
# The *name* is evaluated before the variable is retrieved.
|
405
|
-
class Variable
|
439
|
+
class Variable < Element
|
406
440
|
def initialize name, pos = nil
|
441
|
+
super(pos)
|
407
442
|
@name = name
|
408
443
|
@type = :any
|
409
|
-
@pos = pos
|
410
444
|
end
|
411
445
|
|
412
446
|
# The type can only be tretrieved when the name is aconstant
|
@@ -429,11 +463,11 @@ module RVM
|
|
429
463
|
|
430
464
|
# This evauates to the parameter passed to the function call.
|
431
465
|
# The number of it is evaluated and typecasted to an interger.
|
432
|
-
class Parameter
|
466
|
+
class Parameter < Element
|
433
467
|
def initialize num, pos = nil
|
468
|
+
super(pos)
|
434
469
|
@num = num
|
435
470
|
@type = :any
|
436
|
-
@pos = pos
|
437
471
|
end
|
438
472
|
|
439
473
|
# The type can only be tretrieved when the num is aconstant
|
@@ -454,6 +488,11 @@ module RVM
|
|
454
488
|
# another.
|
455
489
|
# The type of the squence is equal to the last element of the sequence.
|
456
490
|
class Sequence < Array
|
491
|
+
attr_accessor :pos
|
492
|
+
def initialize src=[], pos = nil
|
493
|
+
super(src)
|
494
|
+
@pos = pos
|
495
|
+
end
|
457
496
|
def execute env
|
458
497
|
RVM::debug "Executing Sequence... #{inspect}" if $DEBUG
|
459
498
|
r = nil
|
@@ -478,6 +517,7 @@ module RVM
|
|
478
517
|
# The catching is handled bythe +RVM::Classes::Block+ class.
|
479
518
|
class ReturnException < Exception
|
480
519
|
attr_reader :val
|
520
|
+
attr_reader :pos
|
481
521
|
def initialize val, pos = nil
|
482
522
|
super()
|
483
523
|
@val = val
|
@@ -488,10 +528,10 @@ module RVM
|
|
488
528
|
# Represents the return statement, it throws a
|
489
529
|
# +ReturnException+ which can be caught to have the function
|
490
530
|
# or block return what they wish.
|
491
|
-
class Return
|
531
|
+
class Return < Element
|
492
532
|
def initialize val, pos = nil
|
533
|
+
super(pos)
|
493
534
|
@val = val
|
494
|
-
@pos = pos
|
495
535
|
end
|
496
536
|
|
497
537
|
def data_type
|
@@ -509,7 +549,7 @@ module RVM
|
|
509
549
|
#
|
510
550
|
# Arguments are only executed when the function does return true for
|
511
551
|
# execargs.
|
512
|
-
class FunctionCall
|
552
|
+
class FunctionCall < Element
|
513
553
|
attr_reader :arguments
|
514
554
|
attr_reader :function
|
515
555
|
# The constructor. *function* can either be a block object or a function
|
@@ -517,9 +557,9 @@ module RVM
|
|
517
557
|
#
|
518
558
|
# Arguments is a list of the arguments to the function.
|
519
559
|
def initialize function, arguments, pos = nil
|
560
|
+
super(pos)
|
520
561
|
@function = function
|
521
562
|
@arguments = arguments
|
522
|
-
@pos = pos
|
523
563
|
end
|
524
564
|
|
525
565
|
def data_type
|