opal 0.9.0.beta1 → 0.9.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +39 -20
- data/CONTRIBUTING.md +8 -16
- data/lib/opal/compiler.rb +5 -0
- data/lib/opal/nodes/def.rb +10 -3
- data/lib/opal/nodes/definitions.rb +14 -3
- data/lib/opal/paths.rb +21 -4
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +1 -1
- data/opal/corelib/basic_object.rb +9 -9
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/enumerable.rb +79 -2
- data/opal/corelib/error.rb +18 -0
- data/opal/corelib/helpers.rb +2 -8
- data/opal/corelib/kernel.rb +7 -7
- data/opal/corelib/module.rb +10 -10
- data/opal/corelib/number.rb +1 -1
- data/opal/corelib/regexp.rb +31 -30
- data/opal/corelib/string.rb +1 -1
- data/opal/corelib/struct.rb +8 -10
- data/opal/corelib/time.rb +4 -2
- data/opal/corelib/unsupported.rb +2 -2
- data/spec/filters/bugs/enumerable.rb +0 -19
- data/spec/filters/bugs/exception.rb +0 -4
- data/spec/filters/bugs/language.rb +7 -5
- data/spec/filters/bugs/module.rb +18 -19
- data/spec/filters/bugs/regexp.rb +0 -3
- data/spec/filters/bugs/set.rb +0 -8
- data/spec/filters/bugs/struct.rb +2 -2
- data/spec/filters/unsupported/bignum.rb +1 -0
- data/spec/filters/unsupported/language.rb +7 -0
- data/spec/lib/compiler_spec.rb +5 -0
- data/spec/lib/parser/undef_spec.rb +4 -0
- data/spec/lib/paths_spec.rb +11 -0
- data/spec/lib/spec_helper.rb +1 -1
- data/spec/opal/core/arity_spec.rb +142 -0
- data/spec/rubyspecs +1 -0
- data/stdlib/json.rb +13 -8
- data/stdlib/native.rb +1 -1
- data/stdlib/observer.rb +1 -1
- data/stdlib/ostruct.rb +1 -1
- data/stdlib/set.rb +33 -0
- data/tasks/testing.rake +8 -7
- metadata +7 -3
data/opal/corelib/error.rb
CHANGED
@@ -112,3 +112,21 @@ class UncaughtThrowError < ArgumentError
|
|
112
112
|
super("uncaught throw #{@sym.inspect}")
|
113
113
|
end
|
114
114
|
end
|
115
|
+
|
116
|
+
class NameError
|
117
|
+
attr_reader :name
|
118
|
+
|
119
|
+
def initialize(message, name=nil)
|
120
|
+
super message
|
121
|
+
@name = name
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class NoMethodError
|
126
|
+
attr_reader :args
|
127
|
+
|
128
|
+
def initialize(message, name, args=[])
|
129
|
+
super message, name
|
130
|
+
@args = args
|
131
|
+
end
|
132
|
+
end
|
data/opal/corelib/helpers.rb
CHANGED
@@ -108,15 +108,9 @@ module Opal
|
|
108
108
|
name = Opal.coerce_to!(name, String, :to_str)
|
109
109
|
|
110
110
|
unless `/^@[a-zA-Z_][a-zA-Z0-9_]*?$/.test(name)`
|
111
|
-
raise NameError
|
111
|
+
raise NameError.new("'#{name}' is not allowed as an instance variable name", name)
|
112
112
|
end
|
113
113
|
|
114
114
|
name
|
115
|
-
end
|
116
|
-
|
117
|
-
def self.valid_method_name?(method_name)
|
118
|
-
method_name = Opal.coerce_to!(method_name, String, :to_str)
|
119
|
-
|
120
|
-
`/^[a-zA-Z_][a-zA-Z0-9_]*?$/.test(method_name)`
|
121
|
-
end
|
115
|
+
end
|
122
116
|
end
|
data/opal/corelib/kernel.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Kernel
|
2
2
|
def method_missing(symbol, *args, &block)
|
3
|
-
raise NoMethodError
|
3
|
+
raise NoMethodError.new("undefined method `#{symbol}' for #{inspect}", symbol, args)
|
4
4
|
end
|
5
5
|
|
6
6
|
def =~(obj)
|
@@ -35,7 +35,7 @@ module Kernel
|
|
35
35
|
var meth = self['$' + name];
|
36
36
|
|
37
37
|
if (!meth || meth.$$stub) {
|
38
|
-
#{raise NameError
|
38
|
+
#{raise NameError.new("undefined method `#{name}' for class `#{self.class}'", name)};
|
39
39
|
}
|
40
40
|
|
41
41
|
return #{Method.new(self, `meth`, name)};
|
@@ -993,7 +993,7 @@ module Kernel
|
|
993
993
|
$stderr.puts(*strs) unless $VERBOSE.nil? || strs.empty?
|
994
994
|
end
|
995
995
|
|
996
|
-
def raise(exception = undefined, string = nil)
|
996
|
+
def raise(exception = undefined, string = nil, _backtrace = nil)
|
997
997
|
%x{
|
998
998
|
if (exception == null && #$! !== nil) {
|
999
999
|
throw #$!;
|
@@ -1010,16 +1010,16 @@ module Kernel
|
|
1010
1010
|
}
|
1011
1011
|
else if (#{exception.kind_of?(Exception)}) {
|
1012
1012
|
// exception is fine
|
1013
|
-
}
|
1013
|
+
}
|
1014
1014
|
else {
|
1015
1015
|
exception = #{TypeError.new 'exception class/object expected'};
|
1016
1016
|
}
|
1017
|
-
|
1017
|
+
|
1018
1018
|
if (#$! !== nil) {
|
1019
1019
|
Opal.exceptions.push(#$!);
|
1020
1020
|
}
|
1021
|
-
|
1022
|
-
#$! = exception;
|
1021
|
+
|
1022
|
+
#$! = exception;
|
1023
1023
|
|
1024
1024
|
throw exception;
|
1025
1025
|
}
|
data/opal/corelib/module.rb
CHANGED
@@ -180,10 +180,10 @@ class Module
|
|
180
180
|
|
181
181
|
def class_variable_get(name)
|
182
182
|
name = Opal.coerce_to!(name, String, :to_str)
|
183
|
-
raise NameError
|
183
|
+
raise NameError.new('class vars should start with @@', name) if `name.length < 3 || name.slice(0,2) !== '@@'`
|
184
184
|
%x{
|
185
185
|
var value = Opal.cvars[name.slice(2)];
|
186
|
-
#{raise NameError
|
186
|
+
#{raise NameError.new('uninitialized class variable @@a in', name) if `value == null`}
|
187
187
|
return value;
|
188
188
|
}
|
189
189
|
end
|
@@ -204,7 +204,7 @@ class Module
|
|
204
204
|
# check for constant within current scope
|
205
205
|
# if inherit is true or self is Object, will also check ancestors
|
206
206
|
def const_defined?(name, inherit = true)
|
207
|
-
raise NameError
|
207
|
+
raise NameError.new("wrong constant name #{name}", name) unless name =~ /^[A-Z]\w*$/
|
208
208
|
|
209
209
|
%x{
|
210
210
|
var scopes = [self.$$scope];
|
@@ -234,7 +234,7 @@ class Module
|
|
234
234
|
return name.split('::').inject(self) { |o, c| o.const_get(c) }
|
235
235
|
end
|
236
236
|
|
237
|
-
raise NameError
|
237
|
+
raise NameError.new("wrong constant name #{name}", name) unless `/^[A-Z]\w*$/.test(name)`
|
238
238
|
|
239
239
|
%x{
|
240
240
|
var scopes = [self.$$scope];
|
@@ -272,11 +272,11 @@ class Module
|
|
272
272
|
}
|
273
273
|
}
|
274
274
|
|
275
|
-
raise NameError
|
275
|
+
raise NameError.new("uninitialized constant #{self}::#{name}", name)
|
276
276
|
end
|
277
277
|
|
278
278
|
def const_set(name, value)
|
279
|
-
raise NameError
|
279
|
+
raise NameError.new("wrong constant name #{name}", name) unless name =~ /^[A-Z]\w*$/
|
280
280
|
|
281
281
|
begin
|
282
282
|
name = name.to_str
|
@@ -374,7 +374,7 @@ class Module
|
|
374
374
|
var meth = self.$$proto['$' + name];
|
375
375
|
|
376
376
|
if (!meth || meth.$$stub) {
|
377
|
-
#{raise NameError
|
377
|
+
#{raise NameError.new("undefined method `#{name}' for class `#{self.name}'", name)};
|
378
378
|
}
|
379
379
|
|
380
380
|
return #{UnboundMethod.new(self, `meth`, name)};
|
@@ -452,16 +452,16 @@ class Module
|
|
452
452
|
|
453
453
|
alias class_eval module_eval
|
454
454
|
|
455
|
-
def module_exec(&block)
|
455
|
+
def module_exec(*args, &block)
|
456
456
|
%x{
|
457
457
|
if (block === nil) {
|
458
|
-
|
458
|
+
#{raise LocalJumpError, 'no block given'}
|
459
459
|
}
|
460
460
|
|
461
461
|
var block_self = block.$$s, result;
|
462
462
|
|
463
463
|
block.$$s = null;
|
464
|
-
result = block.apply(self,
|
464
|
+
result = block.apply(self, args);
|
465
465
|
block.$$s = block_self;
|
466
466
|
|
467
467
|
return result;
|
data/opal/corelib/number.rb
CHANGED
@@ -298,7 +298,7 @@ class Number < Numeric
|
|
298
298
|
|
299
299
|
def bit_length
|
300
300
|
unless Integer === self
|
301
|
-
raise NoMethodError
|
301
|
+
raise NoMethodError.new("undefined method `bit_length` for #{self}:Float", 'bit_length')
|
302
302
|
end
|
303
303
|
|
304
304
|
%x{
|
data/opal/corelib/regexp.rb
CHANGED
@@ -7,6 +7,12 @@ class Regexp < `RegExp`
|
|
7
7
|
`def.$$is_regexp = true`
|
8
8
|
|
9
9
|
class << self
|
10
|
+
def allocate
|
11
|
+
allocated = super
|
12
|
+
`#{allocated}.uninitialized = true`
|
13
|
+
allocated
|
14
|
+
end
|
15
|
+
|
10
16
|
def escape(string)
|
11
17
|
%x{
|
12
18
|
return string.replace(/([-[\]\/{}()*+?.^$\\| ])/g, '\\$1')
|
@@ -102,7 +108,7 @@ class Regexp < `RegExp`
|
|
102
108
|
end
|
103
109
|
|
104
110
|
def ===(string)
|
105
|
-
`#{match(string)} !== nil`
|
111
|
+
`#{match(Opal.coerce_to?(string, String, :to_str))} !== nil`
|
106
112
|
end
|
107
113
|
|
108
114
|
def =~(string)
|
@@ -117,6 +123,10 @@ class Regexp < `RegExp`
|
|
117
123
|
|
118
124
|
def match(string, pos = undefined, &block)
|
119
125
|
%x{
|
126
|
+
if (self.uninitialized) {
|
127
|
+
#{raise TypeError, 'uninitialized Regexp'}
|
128
|
+
}
|
129
|
+
|
120
130
|
if (pos === undefined) {
|
121
131
|
pos = 0;
|
122
132
|
} else {
|
@@ -136,8 +146,16 @@ class Regexp < `RegExp`
|
|
136
146
|
}
|
137
147
|
}
|
138
148
|
|
139
|
-
|
140
|
-
var
|
149
|
+
var source = self.source;
|
150
|
+
var flags = 'g';
|
151
|
+
// m flag + a . in Ruby will match white space, but in JS, it only matches beginning/ending of lines, so we get the equivalent here
|
152
|
+
if (self.multiline) {
|
153
|
+
source = source.replace('.', "[\\s\\S]");
|
154
|
+
flags += 'm';
|
155
|
+
}
|
156
|
+
|
157
|
+
// global RegExp maintains state, so not using self/this
|
158
|
+
var md, re = new RegExp(source, flags + (self.ignoreCase ? 'i' : ''));
|
141
159
|
|
142
160
|
while (true) {
|
143
161
|
md = re.exec(string);
|
@@ -162,36 +180,19 @@ class Regexp < `RegExp`
|
|
162
180
|
end
|
163
181
|
|
164
182
|
def options
|
165
|
-
# https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags
|
166
|
-
# we need the flags and source does not give us that
|
183
|
+
# Flags would be nice to use with this, but still experimental - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags
|
167
184
|
%x{
|
168
|
-
|
169
|
-
as_string = self.toString();
|
170
|
-
if (as_string == "/(?:)/") {
|
185
|
+
if (self.uninitialized) {
|
171
186
|
#{raise TypeError, 'uninitialized Regexp'}
|
187
|
+
}
|
188
|
+
var result = 0;
|
189
|
+
// should be supported in IE6 according to https://msdn.microsoft.com/en-us/library/7f5z26w4(v=vs.94).aspx
|
190
|
+
if (self.multiline) {
|
191
|
+
result |= #{MULTILINE};
|
172
192
|
}
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
if (text_flags == null) {
|
177
|
-
return result;
|
178
|
-
}
|
179
|
-
// first match contains all of our flags
|
180
|
-
text_flags = text_flags[0];
|
181
|
-
for (var i=0; i < text_flags.length; i++) {
|
182
|
-
text_flag = text_flags[i];
|
183
|
-
switch(text_flag) {
|
184
|
-
case 'i':
|
185
|
-
result |= #{IGNORECASE};
|
186
|
-
break;
|
187
|
-
case 'm':
|
188
|
-
result |= #{MULTILINE};
|
189
|
-
break;
|
190
|
-
default:
|
191
|
-
#{raise "RegExp flag #{`text_flag`} does not have a match in Ruby"}
|
192
|
-
}
|
193
|
-
}
|
194
|
-
|
193
|
+
if (self.ignoreCase) {
|
194
|
+
result |= #{IGNORECASE};
|
195
|
+
}
|
195
196
|
return result;
|
196
197
|
}
|
197
198
|
end
|
data/opal/corelib/string.rb
CHANGED
@@ -455,7 +455,7 @@ class String < `String`
|
|
455
455
|
def gsub(pattern, replacement = undefined, &block)
|
456
456
|
%x{
|
457
457
|
if (replacement === undefined && block === nil) {
|
458
|
-
#{
|
458
|
+
return #{enum_for :gsub, pattern};
|
459
459
|
}
|
460
460
|
|
461
461
|
var result = '', match_data = nil, index = 0, match, _replacement;
|
data/opal/corelib/struct.rb
CHANGED
@@ -37,15 +37,13 @@ class Struct
|
|
37
37
|
|
38
38
|
members << name
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
self[name]
|
43
|
-
end
|
44
|
-
|
45
|
-
define_method "#{name}=" do |value|
|
46
|
-
self[name] = value
|
47
|
-
end
|
40
|
+
define_method name do
|
41
|
+
self[name]
|
48
42
|
end
|
43
|
+
|
44
|
+
define_method "#{name}=" do |value|
|
45
|
+
self[name] = value
|
46
|
+
end
|
49
47
|
end
|
50
48
|
|
51
49
|
def self.members
|
@@ -85,7 +83,7 @@ class Struct
|
|
85
83
|
|
86
84
|
name = members[name]
|
87
85
|
elsif String === name
|
88
|
-
raise NameError
|
86
|
+
raise NameError.new("no member '#{name}' in struct", name) unless members.include?(name.to_sym)
|
89
87
|
else
|
90
88
|
raise TypeError, "no implicit conversion of #{name.class} into Integer"
|
91
89
|
end
|
@@ -101,7 +99,7 @@ class Struct
|
|
101
99
|
|
102
100
|
name = members[name]
|
103
101
|
elsif String === name
|
104
|
-
raise NameError
|
102
|
+
raise NameError.new("no member '#{name}' in struct", name) unless members.include?(name.to_sym)
|
105
103
|
else
|
106
104
|
raise TypeError, "no implicit conversion of #{name.class} into Integer"
|
107
105
|
end
|
data/opal/corelib/time.rb
CHANGED
@@ -159,7 +159,8 @@ class Time < `Date`
|
|
159
159
|
}
|
160
160
|
end
|
161
161
|
|
162
|
-
def self.local(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil)
|
162
|
+
def self.local(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil, _dummy1 = nil, _dummy2 = nil, _dummy3 = nil)
|
163
|
+
# The _dummy args are there only because the MRI version accepts up to 10 arguments
|
163
164
|
%x{
|
164
165
|
var args, result;
|
165
166
|
|
@@ -189,7 +190,8 @@ class Time < `Date`
|
|
189
190
|
}
|
190
191
|
end
|
191
192
|
|
192
|
-
def self.gm(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil)
|
193
|
+
def self.gm(year, month = nil, day = nil, hour = nil, min = nil, sec = nil, millisecond = nil, _dummy1 = nil, _dummy2 = nil, _dummy3 = nil)
|
194
|
+
# The _dummy args are there only because the MRI version accepts up to 10 arguments
|
193
195
|
%x{
|
194
196
|
var args, result;
|
195
197
|
|
data/opal/corelib/unsupported.rb
CHANGED
@@ -1,29 +1,10 @@
|
|
1
1
|
opal_filter "Enumerable" do
|
2
|
-
fails "Enumerable#cycle passed a number n as an argument raises an ArgumentError if more arguments are passed"
|
3
|
-
fails "Enumerable#each_cons gathers whole arrays as elements when each yields multiple"
|
4
|
-
fails "Enumerable#each_cons passes element groups to the block"
|
5
|
-
fails "Enumerable#each_cons raises an ArgumentError if there is not a single parameter > 0"
|
6
|
-
fails "Enumerable#each_cons tries to convert n to an Integer using #to_int"
|
7
|
-
fails "Enumerable#each_cons when no block is given Enumerable with no size when no block is given returned Enumerator size returns nil"
|
8
|
-
fails "Enumerable#each_cons when no block is given Enumerable with size returned Enumerator size returns 0 when the argument is larger than self"
|
9
|
-
fails "Enumerable#each_cons when no block is given Enumerable with size returned Enumerator size returns 0 when the enum is empty"
|
10
|
-
fails "Enumerable#each_cons when no block is given Enumerable with size returned Enumerator size returns enum size - each_cons argument + 1"
|
11
|
-
fails "Enumerable#each_cons when no block is given returns an enumerator"
|
12
|
-
fails "Enumerable#each_cons works when n is >= full length"
|
13
|
-
fails "Enumerable#each_cons yields only as much as needed"
|
14
2
|
fails "Enumerable#each_entry Enumerable with no size when no block is given returned Enumerator size returns nil"
|
15
3
|
fails "Enumerable#each_entry Enumerable with size when no block is given returned Enumerator size returns the enumerable size"
|
16
4
|
fails "Enumerable#each_entry passes extra arguments to #each"
|
17
5
|
fails "Enumerable#each_entry passes through the values yielded by #each_with_index"
|
18
6
|
fails "Enumerable#each_entry returns an enumerator if no block"
|
19
7
|
fails "Enumerable#each_entry yields multiple arguments as an array"
|
20
|
-
fails "Enumerable#first raises a RangeError when passed a Bignum"
|
21
|
-
fails "Enumerable#minmax gathers whole arrays as elements when each yields multiple"
|
22
|
-
fails "Enumerable#minmax min should return the minimum element"
|
23
|
-
fails "Enumerable#minmax raises a NoMethodError for elements without #<=>"
|
24
|
-
fails "Enumerable#minmax raises an ArgumentError when elements are incomparable"
|
25
|
-
fails "Enumerable#minmax returns the minimum when using a block rule"
|
26
|
-
fails "Enumerable#minmax returns [nil, nil] for an empty Enumerable"
|
27
8
|
fails "Enumerable#minmax_by Enumerable with no size when no block is given returned Enumerator size returns nil"
|
28
9
|
fails "Enumerable#minmax_by Enumerable with size when no block is given returned Enumerator size returns the enumerable size"
|
29
10
|
fails "Enumerable#minmax_by gathers whole arrays as elements when each yields multiple"
|
@@ -36,12 +36,8 @@ opal_filter "Exception" do
|
|
36
36
|
fails "Exception#set_backtrace raises a TypeError when the Array contains a Symbol"
|
37
37
|
fails "Exception#set_backtrace raises a TypeError when the array contains nil"
|
38
38
|
fails "IOError is a superclass of EOFError"
|
39
|
-
fails "NameError.new NameError.new should take optional name argument"
|
40
|
-
fails "NoMethodError#args returns an array with the same elements as passed to the method"
|
41
|
-
fails "NoMethodError#args returns an empty array if the caller method had no arguments"
|
42
39
|
fails "NoMethodError#message for an protected method match /protected method/"
|
43
40
|
fails "NoMethodError#message for private method match /private method/"
|
44
|
-
fails "NoMethodError.new allows passing method args"
|
45
41
|
fails "rescueing SignalException raises a SignalException when sent a signal"
|
46
42
|
fails "SignalException.new raises an exception for an optional argument with a signal name"
|
47
43
|
fails "SignalException.new raises an exception with an invalid signal name"
|
@@ -54,6 +54,8 @@ opal_filter "language" do
|
|
54
54
|
fails "A singleton class raises a TypeError for symbols"
|
55
55
|
fails "An ensure block inside a begin block is executed even when a symbol is thrown in it's corresponding begin block"
|
56
56
|
fails "An ensure block inside a method is executed even when a symbol is thrown in the method"
|
57
|
+
fails "Assigning an anonymous module to a constant sets the name of contained modules when assigning a toplevel anonymous module"
|
58
|
+
fails "Assigning an anonymous module to a constant sets the name of the module"
|
57
59
|
fails "calling methods on the metaclass calls a method defined on the metaclass of the metaclass"
|
58
60
|
fails "Class methods of a singleton class for a class include class methods of Class"
|
59
61
|
fails "Class methods of a singleton class for a class include instance methods of the singleton class of Class"
|
@@ -67,7 +69,10 @@ opal_filter "language" do
|
|
67
69
|
fails "Operators * / % are left-associative"
|
68
70
|
fails "self in a metaclass body (class << obj) raises a TypeError for numbers"
|
69
71
|
fails "self in a metaclass body (class << obj) raises a TypeError for symbols"
|
72
|
+
fails "The __FILE__ pseudo-variable equals the absolute path of a file loaded by a relative path" # we can't clear $LOADED_FEATURES, should be treated as readonly
|
73
|
+
fails "The __FILE__ pseudo-variable equals the absolute path of a file loaded by an absolute path" # we can't clear $LOADED_FEATURES, should be treated as readonly
|
70
74
|
fails "The alias keyword is not allowed against Fixnum or String instances"
|
75
|
+
fails "The alias keyword on top level defines the alias on Object"
|
71
76
|
fails "The alias keyword operates on methods defined via attr, attr_reader, and attr_accessor"
|
72
77
|
fails "The alias keyword operates on methods with splat arguments defined in a superclass using text block for class eval"
|
73
78
|
fails "The alias keyword operates on the object's metaclass when used in instance_eval"
|
@@ -77,6 +82,7 @@ opal_filter "language" do
|
|
77
82
|
fails "The BEGIN keyword runs in a shared scope"
|
78
83
|
fails "The BEGIN keyword runs multiple begins in FIFO order"
|
79
84
|
fails "The defined? keyword for a scoped constant does not call .const_missing if the constant is not defined"
|
85
|
+
fails "The defined? keyword for a scoped constant returns nil when a constant is defined on top-level but not on the module"
|
80
86
|
fails "The defined? keyword for a scoped constant returns nil when an undefined constant is scoped to a defined constant"
|
81
87
|
fails "The defined? keyword for a simple constant does not call Object.const_missing if the constant is not defined"
|
82
88
|
fails "The defined? keyword for a simple constant returns 'constant' for a constant defined in an included module"
|
@@ -84,8 +90,8 @@ opal_filter "language" do
|
|
84
90
|
fails "The defined? keyword for a simple constant returns 'constant' when the constant is defined"
|
85
91
|
fails "The defined? keyword for a simple constant returns nil when the constant is not defined"
|
86
92
|
fails "The defined? keyword for a top-level scoped constant returns nil when an undefined constant is scoped to a defined constant"
|
87
|
-
fails "The defined? keyword for an expression returns nil for an expression with != and an undefined method"
|
88
93
|
fails "The defined? keyword for an expression returns nil for an expression with !~ and an undefined method"
|
94
|
+
fails "The defined? keyword for an expression returns nil for an expression with != and an undefined method"
|
89
95
|
fails "The defined? keyword for an expression returns nil for an expression with == and an undefined method"
|
90
96
|
fails "The defined? keyword for an expression with logical connectives does not propagate an exception raised by a method in a 'not' expression"
|
91
97
|
fails "The defined? keyword for an expression with logical connectives returns nil for an expression with '!' and an undefined method"
|
@@ -150,8 +156,6 @@ opal_filter "language" do
|
|
150
156
|
fails "The super keyword without explicit arguments passes optional arguments that have a default value"
|
151
157
|
fails "The super keyword without explicit arguments passes optional arguments that have a non-default value but were modified"
|
152
158
|
fails "The super keyword without explicit arguments passes rest arguments including any modifications"
|
153
|
-
# can be removed when https://github.com/opal/opal/pull/1153 is merged
|
154
|
-
fails "The undef keyword allows undefining multiple methods at a time"
|
155
159
|
fails "The unpacking splat operator (*) unpacks arguments as if they were listed statically"
|
156
160
|
fails "The until expression restarts the current iteration without reevaluating condition with redo"
|
157
161
|
fails "The until modifier restarts the current iteration without reevaluating condition with redo"
|
@@ -159,6 +163,4 @@ opal_filter "language" do
|
|
159
163
|
fails "The until modifier with begin .. end block restart the current iteration without reevaluting condition with redo"
|
160
164
|
fails "The until modifier with begin .. end block runs block at least once (even if the expression is true)"
|
161
165
|
fails "The until modifier with begin .. end block skips to end of body with next"
|
162
|
-
fails "The __FILE__ pseudo-variable equals the absolute path of a file loaded by a relative path" # we can't clear $LOADED_FEATURES, should be treated as readonly
|
163
|
-
fails "The __FILE__ pseudo-variable equals the absolute path of a file loaded by an absolute path" # we can't clear $LOADED_FEATURES, should be treated as readonly
|
164
166
|
end
|