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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -20
  3. data/CONTRIBUTING.md +8 -16
  4. data/lib/opal/compiler.rb +5 -0
  5. data/lib/opal/nodes/def.rb +10 -3
  6. data/lib/opal/nodes/definitions.rb +14 -3
  7. data/lib/opal/paths.rb +21 -4
  8. data/lib/opal/version.rb +1 -1
  9. data/opal/corelib/array.rb +1 -1
  10. data/opal/corelib/basic_object.rb +9 -9
  11. data/opal/corelib/constants.rb +2 -2
  12. data/opal/corelib/enumerable.rb +79 -2
  13. data/opal/corelib/error.rb +18 -0
  14. data/opal/corelib/helpers.rb +2 -8
  15. data/opal/corelib/kernel.rb +7 -7
  16. data/opal/corelib/module.rb +10 -10
  17. data/opal/corelib/number.rb +1 -1
  18. data/opal/corelib/regexp.rb +31 -30
  19. data/opal/corelib/string.rb +1 -1
  20. data/opal/corelib/struct.rb +8 -10
  21. data/opal/corelib/time.rb +4 -2
  22. data/opal/corelib/unsupported.rb +2 -2
  23. data/spec/filters/bugs/enumerable.rb +0 -19
  24. data/spec/filters/bugs/exception.rb +0 -4
  25. data/spec/filters/bugs/language.rb +7 -5
  26. data/spec/filters/bugs/module.rb +18 -19
  27. data/spec/filters/bugs/regexp.rb +0 -3
  28. data/spec/filters/bugs/set.rb +0 -8
  29. data/spec/filters/bugs/struct.rb +2 -2
  30. data/spec/filters/unsupported/bignum.rb +1 -0
  31. data/spec/filters/unsupported/language.rb +7 -0
  32. data/spec/lib/compiler_spec.rb +5 -0
  33. data/spec/lib/parser/undef_spec.rb +4 -0
  34. data/spec/lib/paths_spec.rb +11 -0
  35. data/spec/lib/spec_helper.rb +1 -1
  36. data/spec/opal/core/arity_spec.rb +142 -0
  37. data/spec/rubyspecs +1 -0
  38. data/stdlib/json.rb +13 -8
  39. data/stdlib/native.rb +1 -1
  40. data/stdlib/observer.rb +1 -1
  41. data/stdlib/ostruct.rb +1 -1
  42. data/stdlib/set.rb +33 -0
  43. data/tasks/testing.rake +8 -7
  44. metadata +7 -3
@@ -5,8 +5,8 @@ opal_filter "Module" do
5
5
  fails "Module#<= raises a TypeError if the argument is not a class/module"
6
6
  fails "Module#<= returns nil if self is not related to the given module"
7
7
  fails "Module#<= returns true if self is a subclass of, the same as or includes the given module"
8
- fails "Module#<=> returns +1 if self is a superclas of or included by the given module"
9
8
  fails "Module#<=> returns -1 if self is a subclass of or includes the given module"
9
+ fails "Module#<=> returns +1 if self is a superclas of or included by the given module"
10
10
  fails "Module#=== returns true when the given Object's class includes self or when the given Object is extended by self"
11
11
  fails "Module#> raises a TypeError if the argument is not a class/module"
12
12
  fails "Module#> returns false if self is a subclass of or includes the given module"
@@ -58,12 +58,6 @@ opal_filter "Module" do
58
58
  fails "Module#class_eval resolves constants in the receiver's scope"
59
59
  fails "Module#class_eval uses the optional filename and lineno parameters for error messages"
60
60
  fails "Module#class_exec defines method in the receiver's scope"
61
- fails "Module#class_exec passes arguments to the block"
62
- fails "Module#class_exec raises a LocalJumpError when no block is given"
63
- fails "Module#class_variables does not return class variables defined in extended modules"
64
- fails "Module#class_variables returns an Array of Symbols of class variable names defined in a metaclass"
65
- fails "Module#class_variables returns an Array with names of class variables defined in metaclasses"
66
- fails "Module#class_variables returns an Array with the names of class variables of self"
67
61
  fails "Module#class_variable_defined? converts a non string/symbol/fixnum name to string using to_str"
68
62
  fails "Module#class_variable_defined? raises a TypeError when the given names can't be converted to strings using to_str"
69
63
  fails "Module#class_variable_defined? returns false if a class variables with the given name is defined in an extended module"
@@ -74,13 +68,10 @@ opal_filter "Module" do
74
68
  fails "Module#class_variable_defined? returns true if the class variable is defined in a metaclass"
75
69
  fails "Module#class_variable_get returns the value of a class variable with the given name defined in an included module"
76
70
  fails "Module#class_variable_set sets the value of a class variable with the given name defined in an included module"
77
- fails "Module#constants doesn't returns inherited constants when passed false"
78
- fails "Module#constants doesn't returns inherited constants when passed nil"
79
- fails "Module#constants includes names of constants defined after a module is included"
80
- fails "Module#constants returns all constants including inherited when passed some object"
81
- fails "Module#constants returns all constants including inherited when passed true"
82
- fails "Module#constants returns an array of Symbol names of all constants defined in the module and all included modules"
83
- fails "Module#constants returns only public constants"
71
+ fails "Module#class_variables does not return class variables defined in extended modules"
72
+ fails "Module#class_variables returns an Array of Symbols of class variable names defined in a metaclass"
73
+ fails "Module#class_variables returns an Array with names of class variables defined in metaclasses"
74
+ fails "Module#class_variables returns an Array with the names of class variables of self"
84
75
  fails "Module#const_get accepts a toplevel scope qualifier"
85
76
  fails "Module#const_get calls #to_str to convert the given name to a String"
86
77
  fails "Module#const_get does not search the singleton class of a Class or Module"
@@ -92,9 +83,18 @@ opal_filter "Module" do
92
83
  fails "Module#const_get with dynamically assigned constants searches a module included in the superclass"
93
84
  fails "Module#const_get with dynamically assigned constants searches the superclass chain"
94
85
  fails "Module#const_missing raises NameError and does not include toplevel Object"
86
+ fails "Module#constants doesn't returns inherited constants when passed false"
87
+ fails "Module#constants doesn't returns inherited constants when passed nil"
88
+ fails "Module#constants includes names of constants defined after a module is included"
89
+ fails "Module#constants returns all constants including inherited when passed some object"
90
+ fails "Module#constants returns all constants including inherited when passed true"
91
+ fails "Module#constants returns an array of Symbol names of all constants defined in the module and all included modules"
92
+ fails "Module#constants returns only public constants"
95
93
  fails "Module#define_method does not change the arity check style of the original proc"
96
94
  fails "Module#define_method passed { } creates a method that raises an ArgumentError when passed one argument"
97
95
  fails "Module#define_method passed { } creates a method that raises an ArgumentError when passed two arguments"
96
+ fails "Module#define_method passed { || } creates a method that raises an ArgumentError when passed one argument"
97
+ fails "Module#define_method passed { || } creates a method that raises an ArgumentError when passed two arguments"
98
98
  fails "Module#define_method passed { |a, *b| } creates a method that raises an ArgumentError when passed zero arguments"
99
99
  fails "Module#define_method passed { |a, b, *c| } creates a method that raises an ArgumentError when passed one argument and a block"
100
100
  fails "Module#define_method passed { |a, b, *c| } creates a method that raises an ArgumentError when passed one argument"
@@ -106,8 +106,6 @@ opal_filter "Module" do
106
106
  fails "Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed two arguments"
107
107
  fails "Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed zero arguments and a block"
108
108
  fails "Module#define_method passed { |a| } creates a method that raises an ArgumentError when passed zero arguments"
109
- fails "Module#define_method passed { || } creates a method that raises an ArgumentError when passed one argument"
110
- fails "Module#define_method passed { || } creates a method that raises an ArgumentError when passed two arguments"
111
109
  fails "Module#define_method raises a TypeError when a Method from a singleton class is defined on another class"
112
110
  fails "Module#define_method raises a TypeError when a Method from one class is defined on an unrelated class"
113
111
  fails "Module#define_method raises a TypeError when an UnboundMethod from a child class is defined on a parent class"
@@ -149,8 +147,6 @@ opal_filter "Module" do
149
147
  fails "Module#module_eval resolves constants in the receiver's scope"
150
148
  fails "Module#module_eval uses the optional filename and lineno parameters for error messages"
151
149
  fails "Module#module_exec defines method in the receiver's scope"
152
- fails "Module#module_exec passes arguments to the block"
153
- fails "Module#module_exec raises a LocalJumpError when no block is given"
154
150
  fails "Module#module_function as a toggle (no arguments) in a Module body affects evaled method definitions also even when outside the eval itself"
155
151
  fails "Module#module_function as a toggle (no arguments) in a Module body does not affect module_evaled method definitions also if outside the eval itself"
156
152
  fails "Module#module_function as a toggle (no arguments) in a Module body doesn't affect definitions when inside an eval even if the definitions are outside of it"
@@ -183,15 +179,18 @@ opal_filter "Module" do
183
179
  fails "Module#prepend reports the prepended module as the unbound method owner"
184
180
  fails "Module#prepend returns the class it's included into"
185
181
  fails "Module#prepend sees an instance of a prepended class as kind of the prepended module"
182
+ fails "Module#prepend supports super when the module is prepended into a singleton class with a class super"
186
183
  fails "Module#prepend supports super when the module is prepended into a singleton class"
187
184
  fails "Module#prepend throws a NoMethodError when there is no more superclass"
188
185
  fails "Module#prepend works with subclasses"
189
- fails "Module#prepended is invoked when self is prepended to another module or class"
190
186
  fails "Module#prepend_features copies own tainted status to the given module"
191
187
  fails "Module#prepend_features copies own untrusted status to the given module"
192
188
  fails "Module#prepend_features gets called when self is included in another module/class"
193
189
  fails "Module#prepend_features on Class raises a TypeError if calling after rebinded to Class"
194
190
  fails "Module#prepend_features raises an ArgumentError on a cyclic prepend"
191
+ fails "Module#prepended is invoked when self is prepended to another module or class"
192
+ fails "Module#private without arguments within a closure sets the visibility outside the closure"
193
+ fails "Module#protected without arguments within a closure sets the visibility outside the closure"
195
194
  fails "Module#remove_class_variable raises a NameError when an uninitialized class variable is given"
196
195
  fails "Module#remove_class_variable raises a NameError when passed a symbol with no leading @"
197
196
  fails "Module#remove_class_variable raises a NameError when passed a symbol with one leading @"
@@ -1,5 +1,4 @@
1
1
  opal_filter "regular_expressions" do
2
- fails "Regexp#=== returns false if the other value cannot be coerced to a string"
3
2
  fails "Regexp#hash is based on the text and options of Regexp"
4
3
  fails "Regexp#hash returns the same value for two Regexps differing only in the /n option"
5
4
  fails "Regexp#initialize is a private method"
@@ -12,8 +11,6 @@ opal_filter "regular_expressions" do
12
11
  fails "Regexp#inspect escapes 2 slashes in a row properly"
13
12
  fails "Regexp#inspect returns a formatted string that would eval to the same regexp"
14
13
  fails "Regexp#inspect returns options in the order 'mixn'"
15
- fails "Regexp#match raises a TypeError on an uninitialized Regexp"
16
- fails "Regexp#options returns 0 for a Regexp literal without options"
17
14
  fails "Regexp#source returns the original string of the pattern"
18
15
  fails "Regexp#to_s deals properly with the two types of lookahead groups"
19
16
  fails "Regexp#to_s returns a string in (?xxx:yyy) notation"
@@ -27,10 +27,6 @@ opal_filter "Set" do
27
27
  fails "Set#merge raises an ArgumentError when passed a non-Enumerable"
28
28
  fails "Set#pretty_print passes the 'pretty print' representation of self to the pretty print writer"
29
29
  fails "Set#pretty_print_cycle passes the 'pretty print' representation of a self-referencing Set to the pretty print writer"
30
- fails "Set#proper_subset? raises an ArgumentError when passed a non-Set"
31
- fails "Set#proper_subset? returns true if passed a Set that self is a proper subset of"
32
- fails "Set#proper_superset? raises an ArgumentError when passed a non-Set"
33
- fails "Set#proper_superset? returns true if passed a Set that self is a proper superset of"
34
30
  fails "Set#reject! deletes every element from self for which the passed block returns true"
35
31
  fails "Set#reject! returns an Enumerator when passed no block"
36
32
  fails "Set#reject! returns nil when self was not modified"
@@ -41,10 +37,6 @@ opal_filter "Set" do
41
37
  fails "Set#select! returns nil when self was not modified"
42
38
  fails "Set#select! returns self when self was modified"
43
39
  fails "Set#select! yields every element of self"
44
- fails "Set#subset? raises an ArgumentError when passed a non-Set"
45
- fails "Set#subset? returns true if passed a Set that is equal to self or self is a subset of"
46
- fails "Set#superset? raises an ArgumentError when passed a non-Set"
47
- fails "Set#superset? returns true if passed a Set that equals self or self is a proper superset of"
48
40
  fails "Set#^ raises an ArgumentError when passed a non-Enumerable"
49
41
  fails "Set#^ returns a new Set containing elements that are not in both self and the passed Enumberable"
50
42
  end
@@ -11,9 +11,9 @@ opal_filter "Struct" do
11
11
  fails "Struct.new does not create a constant with symbol as first argument"
12
12
  fails "Struct.new fails with invalid constant name as first argument"
13
13
  fails "Struct.new fails with too many arguments"
14
+ fails "Struct.new on subclasses creates a constant in subclass' namespace"
15
+ fails "Struct.new on subclasses fails with too many arguments"
14
16
  fails "Struct.new raises a TypeError if object doesn't respond to to_sym"
15
17
  fails "Struct.new raises a TypeError if object is not a Symbol"
16
- fails "Struct.new on subclasses fails with too many arguments"
17
- fails "Struct.new on subclasses creates a constant in subclass' namespace"
18
18
  fails "Struct.new with a block passes same struct class to the block"
19
19
  end
@@ -8,6 +8,7 @@ opal_filter "Bignum" do
8
8
  fails "Complex#rect returns an Array"
9
9
  fails "Complex#rect returns the imaginary part of self as the last element"
10
10
  fails "Complex#rect returns the real part of self as the first element"
11
+ fails "Enumerable#first raises a RangeError when passed a Bignum"
11
12
  fails "Fixnum#& returns self bitwise AND a Bignum"
12
13
  fails "Fixnum#& returns self bitwise AND other"
13
14
  fails "Fixnum#* overflows to Bignum when the result does not fit in Fixnum"
@@ -6,6 +6,13 @@ opal_filter "language" do
6
6
  fails "Magic comment is case-insensitive"
7
7
  fails "Magic comment must be at the first line"
8
8
  fails "Magic comment must be the first token of the line"
9
+ fails "Regexps with modifers supports /x (extended syntax)"
10
+ fails "Regexps with modifers supports /o (once)"
11
+ fails "Regexps with modifers invokes substitutions for /o only once"
12
+ fails "Regexps with modifers supports modifier combinations"
13
+ fails "Regexps with modifers supports (?imx-imx) (inline modifiers)"
14
+ fails "Regexps with modifers supports (?imx-imx:expr) (scoped inline modifiers)"
15
+ fails "Regexps with modifers supports ASII/Unicode modifiers"
9
16
  fails "The defined? keyword for pseudo-variables returns 'expression' for __ENCODING__"
10
17
  fails "The defined? keyword when called with a method name having a module as receiver returns nil if the method is private"
11
18
  fails "The defined? keyword when called with a method name having a module as receiver returns nil if the method is protected"
@@ -51,6 +51,11 @@ describe Opal::Compiler do
51
51
  expect_compiled("Object").to include("Object")
52
52
  expect_compiled("Array").to include("Array")
53
53
  end
54
+
55
+ it "should compile undef calls" do
56
+ expect_compiled("undef a").to include("Opal.udef(self, '$a')")
57
+ expect_compiled("undef a,b").to match(/Opal.udef\(self, '\$a'\);.*return Opal.udef\(self, '\$b'\);/m)
58
+ end
54
59
 
55
60
  describe "class names" do
56
61
  it "generates a named function for class using $ prefix" do
@@ -12,4 +12,8 @@ describe "The undef keyword" do
12
12
  it "can take symbols or fitems" do
13
13
  parsed("undef :foo").should == [:undef, [:sym, :foo]]
14
14
  end
15
+
16
+ it "can take multiple symbols" do
17
+ parsed("undef :a, :b").should == [:undef, [:sym, :a], [:sym, :b]]
18
+ end
15
19
  end
@@ -0,0 +1,11 @@
1
+ require 'lib/spec_helper'
2
+
3
+ describe 'Opal.use_gem' do
4
+ it 'adds require_paths of a gem to Opal paths' do
5
+ Opal.use_gem 'sprockets'
6
+ # Will fail if GEM_HOME has "sprockets" in the path, that's ok.
7
+ added_sprockets_paths = Opal.paths.grep /sprockets/
8
+ expect(added_sprockets_paths.size).to eq(1)
9
+ expect(added_sprockets_paths.first).to match(%r{/sprockets-[\d\.]+/lib$})
10
+ end
11
+ end
@@ -5,7 +5,7 @@ RSpec.configure do |config|
5
5
  config.run_all_when_everything_filtered = true
6
6
  config.filter_run :focus
7
7
  config.order = 'random'
8
- config.before { Opal.instance_variable_set('@paths', nil) }
8
+ config.before { Opal.reset_paths! }
9
9
  config.before { Opal::Config.reset! if defined? Opal::Config }
10
10
  config.before { Opal::Processor.reset_cache_key! if defined? Opal::Processor }
11
11
  end
@@ -0,0 +1,142 @@
1
+ # This spec has been copied over from rubyspec and modified to avoid the use
2
+ # of instance_eval with a String argument and also because some syntaxes are
3
+ # not suppoted yet by Opal (e.g. def a(b, *c, d)).
4
+
5
+ require 'spec_helper'
6
+
7
+ describe "UnboundMethod#arity" do
8
+ context "returns zero" do
9
+
10
+ def self.evaluate_in_module message, &block
11
+ it message do
12
+ Module.new do
13
+ def self.arity_of(method_name)
14
+ instance_method(method_name).arity
15
+ end
16
+ end.class_eval(&block)
17
+ end
18
+ end
19
+
20
+ evaluate_in_module "for m()" do
21
+ arity_of(def m() end).should == 0
22
+ end
23
+
24
+ evaluate_in_module "for n(&b)" do
25
+ arity_of(def n(&b) end).should == 0
26
+ end
27
+ end
28
+
29
+ context "returns positive values," do
30
+ evaluate_in_module "the number of args for simple args" do
31
+ arity_of(def m(a) end).should == 1
32
+ arity_of(def n(a, b) end).should == 2
33
+ arity_of(def o(a, b, c) end).should == 3
34
+ arity_of(def p(a, b, c, d) end).should == 4
35
+ end
36
+
37
+ ruby_version_is "2.1" do
38
+ evaluate_in_module "1 for kwargs" do
39
+ arity_of(def m(a:) end).should == 1
40
+ arity_of(def n(a:, b:) end).should == 1
41
+ arity_of(def o(a: 1, b:, c:, d: 2) end).should == 1
42
+ end
43
+
44
+ evaluate_in_module __LINE__ do
45
+ arity_of(def m(a, b:) end).should == 2
46
+ arity_of(def n(a, b:, &l) end).should == 2
47
+ end
48
+
49
+ evaluate_in_module __LINE__ do
50
+ arity_of(def m(a, b, c:, d: 1) end).should == 3
51
+ arity_of(def n(a, b, c:, d: 1, **k, &l) end).should == 3
52
+ end
53
+ end
54
+ end
55
+
56
+ context "returns negative values" do
57
+ # evaluate_in_module __LINE__ do
58
+ # arity_of(def m(a=1) end).should == -1
59
+ # arity_of(def n(a=1, b=2) end).should == -1
60
+ # end
61
+ #
62
+ # evaluate_in_module __LINE__ do
63
+ # arity_of(def m(a, b=1) end).should == -2
64
+ # arity_of(def n(a, b, c=1, d=2) end).should == -3
65
+ # end
66
+ #
67
+ # evaluate_in_module __LINE__ do
68
+ # arity_of(def m(a=1, *b) end).should == -1
69
+ # arity_of(def n(a=1, b=2, *c) end).should == -1
70
+ # end
71
+ #
72
+ # evaluate_in_module __LINE__ do
73
+ # arity_of(def m(*) end).should == -1
74
+ # arity_of(def n(*a) end).should == -1
75
+ # end
76
+ #
77
+ # evaluate_in_module __LINE__ do
78
+ # arity_of(def m(a, *) end).should == -2
79
+ # arity_of(def n(a, *b) end).should == -2
80
+ # arity_of(def o(a, b, *c) end).should == -3
81
+ # arity_of(def p(a, b, c, *d) end).should == -4
82
+ # end
83
+ #
84
+ # evaluate_in_module __LINE__ do
85
+ # arity_of(def m(*a, b) end).should == -2
86
+ # arity_of(def n(*a, b, c) end).should == -3
87
+ # arity_of(def o(*a, b, c, d) end).should == -4
88
+ # end
89
+ #
90
+ # evaluate_in_module __LINE__ do
91
+ # arity_of(def m(a, *b, c) end).should == -3
92
+ # arity_of(def n(a, b, *c, d, e) end).should == -5
93
+ # end
94
+ #
95
+ # evaluate_in_module __LINE__ do
96
+ # arity_of(def m(a, b=1, c=2, *d, e, f) end).should == -4
97
+ # arity_of(def n(a, b, c=1, *d, e, f, g) end).should == -6
98
+ # end
99
+
100
+ # ruby_version_is "2.1" do
101
+ # evaluate_in_module __LINE__ do
102
+ # arity_of(def m(a: 1) end).should == -1
103
+ # arity_of(def n(a: 1, b: 2) end).should == -1
104
+ # end
105
+ # end
106
+ #
107
+ # evaluate_in_module __LINE__ do
108
+ # arity_of(def m(a=1, b: 2) end).should == -1
109
+ # # arity_of(def n(*a, b: 1) end).should == -1
110
+ # arity_of(def o(a=1, b: 2) end).should == -1
111
+ # # arity_of(def p(a=1, *b, c: 2, &l) end).should == -1
112
+ # end
113
+
114
+ ruby_version_is "2.1" do
115
+ # evaluate_in_module __LINE__ do
116
+ # arity_of(def m(**k, &l) end).should == -1
117
+ # arity_of(def n(*a, **k) end).should == -1
118
+ # arity_of(def o(a: 1, b: 2, **k) end).should == -1
119
+ # end
120
+ #
121
+ # evaluate_in_module __LINE__ do
122
+ # arity_of(def m(a=1, *b, c:, d: 2, **k, &l) end).should == -2
123
+ # end
124
+ #
125
+ # evaluate_in_module __LINE__ do
126
+ # arity_of(def m(a, b=1, *c, d, e:, f: 2, **k, &l) end).should == -4
127
+ # arity_of(def n(a, b=1, *c, d:, e:, f: 2, **k, &l) end).should == -3
128
+ # arity_of(def o(a=0, b=1, *c, d, e:, f: 2, **k, &l) end).should == -3
129
+ # arity_of(def p(a=0, b=1, *c, d:, e:, f: 2, **k, &l) end).should == -2
130
+ # end
131
+ end
132
+ end
133
+
134
+ # context "for a Method generated by respond_to_missing?" do
135
+ # it "returns -1" do
136
+ # obj = mock("method arity respond_to_missing")
137
+ # obj.should_receive(:respond_to_missing?).and_return(true)
138
+ #
139
+ # obj.method(:m).unbind.arity.should == -1
140
+ # end
141
+ # end
142
+ end
data/spec/rubyspecs CHANGED
@@ -125,6 +125,7 @@ rubyspec/language
125
125
  !rubyspec/language/predefined_spec
126
126
  !rubyspec/language/proc_spec
127
127
  !rubyspec/language/regexp_spec
128
+ rubyspec/language/regexp/modifiers_spec
128
129
  !rubyspec/language/return_spec
129
130
  !rubyspec/language/send_spec
130
131
  !rubyspec/language/string_spec
data/stdlib/json.rb CHANGED
@@ -4,6 +4,8 @@ module JSON
4
4
  $hasOwn = Opal.hasOwnProperty;
5
5
 
6
6
  function to_opal(value, options) {
7
+ var klass, arr, hash, i, ii, k;
8
+
7
9
  switch (typeof value) {
8
10
  case 'string':
9
11
  return value;
@@ -21,25 +23,24 @@ module JSON
21
23
  if (!value) return nil;
22
24
 
23
25
  if (value.$$is_array) {
24
- var arr = #{`options.array_class`.new};
26
+ arr = #{`options.array_class`.new};
25
27
 
26
- for (var i = 0, ii = value.length; i < ii; i++) {
28
+ for (i = 0, ii = value.length; i < ii; i++) {
27
29
  #{`arr`.push(`to_opal(value[i], options)`)};
28
30
  }
29
31
 
30
32
  return arr;
31
33
  }
32
34
  else {
33
- var hash = #{`options.object_class`.new};
35
+ hash = #{`options.object_class`.new};
34
36
 
35
- for (var k in value) {
37
+ for (k in value) {
36
38
  if ($hasOwn.call(value, k)) {
37
39
  #{`hash`[`k`] = `to_opal(value[k], options)`};
38
40
  }
39
41
  }
40
42
 
41
- var klass;
42
- if ((klass = #{`hash`[JSON.create_id]}) != nil) {
43
+ if (!options.parse && (klass = #{`hash`[JSON.create_id]}) != nil) {
43
44
  klass = Opal.get(klass);
44
45
  return #{`klass`.json_create(`hash`)};
45
46
  }
@@ -47,7 +48,7 @@ module JSON
47
48
  return hash;
48
49
  }
49
50
  }
50
- }
51
+ }
51
52
  };
52
53
  }
53
54
 
@@ -66,13 +67,17 @@ module JSON
66
67
  end
67
68
 
68
69
  def self.parse(source, options = {})
69
- from_object(`$parse(source)`, options)
70
+ from_object(`$parse(source)`, options.merge(parse: true))
70
71
  end
71
72
 
72
73
  def self.parse!(source, options = {})
73
74
  parse(source, options)
74
75
  end
75
76
 
77
+ def self.load(source, options = {})
78
+ from_object(`$parse(source)`, options)
79
+ end
80
+
76
81
  # Raw js object => opal object
77
82
  def self.from_object(js_object, options = {})
78
83
  options[:object_class] ||= Hash
data/stdlib/native.rb CHANGED
@@ -601,7 +601,7 @@ class Class
601
601
  %x{
602
602
  var aliased = #{self}.$$proto['$' + #{existing_mid}];
603
603
  if (!aliased) {
604
- #{raise NameError, "undefined method `#{existing_mid}' for class `#{inspect}'"};
604
+ #{raise NameError.new("undefined method `#{existing_mid}' for class `#{inspect}'", exiting_mid)};
605
605
  }
606
606
  #{self}.$$proto[#{new_jsid}] = aliased;
607
607
  }
data/stdlib/observer.rb CHANGED
@@ -126,7 +126,7 @@ module Observable
126
126
  def add_observer(observer, func=:update)
127
127
  @observer_peers = {} unless defined? @observer_peers
128
128
  unless observer.respond_to? func
129
- raise NoMethodError, "observer does not respond to `#{func.to_s}'"
129
+ raise NoMethodError.new("observer does not respond to `#{func.to_s}'", func.to_s)
130
130
  end
131
131
  @observer_peers[observer] = func
132
132
  end