opal 0.3.43 → 0.3.44
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +19 -0
- data/README.md +1 -0
- data/Rakefile +29 -19
- data/examples/native/Gemfile +3 -0
- data/examples/native/README.md +17 -0
- data/examples/native/app/app.rb +38 -0
- data/examples/native/config.ru +8 -0
- data/examples/native/index.html.erb +12 -0
- data/lib/opal/lexer.rb +5 -1
- data/lib/opal/parser.rb +36 -10
- data/lib/opal/processor.rb +10 -9
- data/lib/opal/server.rb +17 -7
- data/lib/opal/target_scope.rb +2 -2
- data/lib/opal/version.rb +1 -1
- data/opal/opal-browser/script_loader.rb +8 -13
- data/opal/opal.rb +23 -5
- data/opal/opal/array.rb +128 -14
- data/opal/opal/boolean.rb +1 -1
- data/opal/opal/class.rb +92 -18
- data/opal/opal/enumerable.rb +90 -0
- data/opal/opal/error.rb +1 -1
- data/opal/opal/hash.rb +2 -2
- data/opal/opal/kernel.rb +3 -3
- data/opal/opal/numeric.rb +1 -1
- data/opal/opal/proc.rb +1 -1
- data/opal/opal/regexp.rb +31 -31
- data/opal/opal/runtime.js +181 -69
- data/opal/opal/string.rb +561 -40
- data/opal/opal/time.rb +1 -1
- data/opal/rbconfig.rb +17 -3
- data/opal/strscan.rb +41 -5
- data/spec/opal/class/new_spec.rb +27 -0
- data/spec/opal/native_spec.rb +127 -0
- data/spec/ospec/runner.rb +0 -2
- data/spec/parser/strscan/get_byte_spec.rb +29 -0
- data/spec/parser/strscan/skip_spec.rb +40 -0
- data/spec/rubyspec/core/array/each_spec.rb +1 -1
- data/spec/rubyspec/core/array/intersection_spec.rb +5 -0
- data/spec/rubyspec/core/array/max_spec.rb +32 -0
- data/spec/rubyspec/core/array/min_spec.rb +32 -0
- data/spec/rubyspec/core/array/minus_spec.rb +7 -5
- data/spec/rubyspec/core/array/multiply_spec.rb +1 -1
- data/spec/rubyspec/core/array/plus_spec.rb +1 -1
- data/spec/rubyspec/core/array/pop_spec.rb +1 -1
- data/spec/rubyspec/core/array/push_spec.rb +1 -1
- data/spec/rubyspec/core/array/rassoc_spec.rb +1 -1
- data/spec/rubyspec/core/array/reject_spec.rb +2 -2
- data/spec/rubyspec/core/array/reverse_each_spec.rb +2 -2
- data/spec/rubyspec/core/array/rindex_spec.rb +2 -2
- data/spec/rubyspec/core/array/select_spec.rb +1 -1
- data/spec/rubyspec/core/array/shift_spec.rb +1 -1
- data/spec/rubyspec/core/array/slice_spec.rb +1 -1
- data/spec/rubyspec/core/array/sort_spec.rb +15 -15
- data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
- data/spec/rubyspec/core/array/to_ary_spec.rb +1 -1
- data/spec/rubyspec/core/array/uniq_spec.rb +1 -1
- data/spec/rubyspec/core/array/unshift_spec.rb +1 -1
- data/spec/rubyspec/core/array/zip_spec.rb +1 -1
- data/spec/rubyspec/core/enumerable/select_spec.rb +4 -1
- data/spec/rubyspec/core/module/const_defined_spec.rb +86 -0
- data/spec/rubyspec/core/module/const_get_spec.rb +55 -3
- data/spec/rubyspec/core/module/const_set_spec.rb +2 -2
- data/spec/rubyspec/core/module/constants_spec.rb +49 -0
- data/spec/rubyspec/core/regexp/match_spec.rb +66 -1
- data/spec/rubyspec/core/string/center_spec.rb +71 -0
- data/spec/rubyspec/core/string/chomp_spec.rb +6 -1
- data/spec/rubyspec/core/string/clone_spec.rb +8 -0
- data/spec/rubyspec/core/string/dup_spec.rb +8 -0
- data/spec/rubyspec/core/string/end_with_spec.rb +5 -1
- data/spec/rubyspec/core/string/gsub_spec.rb +15 -1
- data/spec/rubyspec/core/string/lines_spec.rb +9 -0
- data/spec/rubyspec/core/string/ljust_spec.rb +17 -0
- data/spec/rubyspec/core/string/match_spec.rb +25 -3
- data/spec/rubyspec/core/string/rindex_spec.rb +50 -0
- data/spec/rubyspec/core/string/rjust_spec.rb +17 -0
- data/spec/rubyspec/core/string/scan_spec.rb +66 -0
- data/spec/rubyspec/core/string/sub_spec.rb +17 -1
- data/spec/rubyspec/core/string/tr_s_spec.rb +31 -0
- data/spec/rubyspec/core/string/tr_spec.rb +31 -0
- data/spec/rubyspec/fixtures/constants.rb +6 -0
- data/spec/rubyspec/language/class_spec.rb +4 -8
- data/spec/rubyspec/language/numbers_spec.rb +10 -4
- data/spec/rubyspec/language/predefined_spec.rb +69 -2
- data/spec/rubyspec/library/rbconfig/config_spec.rb +47 -0
- data/spec/rubyspec/spec_helper.rb +6 -0
- metadata +46 -25
- data/opal/opal-eventable.rb +0 -26
- data/opal/opal/native.rb +0 -115
- data/spec/opal/eventable_spec.rb +0 -75
- data/spec/opal/native/element_reference_spec.rb +0 -40
- data/spec/opal/native/equal_spec.rb +0 -17
- data/spec/opal/native/fixtures/classes.rb +0 -27
- data/spec/opal/native/global_spec.rb +0 -12
- data/spec/opal/native/initialize_spec.rb +0 -8
- data/spec/opal/native/method_missing_spec.rb +0 -53
- data/spec/opal/native/to_native_spec.rb +0 -8
- data/spec/rubyspec/core/string/demodulize_spec.rb +0 -10
- data/spec/rubyspec/core/string/underscore_spec.rb +0 -17
data/lib/opal/target_scope.rb
CHANGED
@@ -136,7 +136,7 @@ module Opal
|
|
136
136
|
# Generates code for this module to donate methods
|
137
137
|
def to_donate_methods
|
138
138
|
if should_donate? and !@methods.empty?
|
139
|
-
"%s
|
139
|
+
"%s;__opal.donate(#{@name}, [%s]);" % [@parser.parser_indent, @methods.map(&:inspect).join(', ')]
|
140
140
|
else
|
141
141
|
""
|
142
142
|
end
|
@@ -182,7 +182,7 @@ module Opal
|
|
182
182
|
def new_temp
|
183
183
|
return @queue.pop unless @queue.empty?
|
184
184
|
|
185
|
-
tmp = "
|
185
|
+
tmp = "$#{@unique}"
|
186
186
|
@unique = @unique.succ
|
187
187
|
@temps << tmp
|
188
188
|
tmp
|
data/lib/opal/version.rb
CHANGED
@@ -1,23 +1,18 @@
|
|
1
1
|
class BrowserScriptLoader
|
2
|
-
def initialize
|
3
|
-
@doc = Native.global.document
|
4
|
-
@win = Native.global
|
5
|
-
end
|
6
|
-
|
7
2
|
def run
|
8
3
|
handler = proc { find_scripts }
|
9
4
|
|
10
|
-
if
|
11
|
-
|
5
|
+
if $window.respond_to? :addEventListener
|
6
|
+
$window.addEventListener 'DOMContentLoaded', handler, false
|
12
7
|
else
|
13
|
-
|
8
|
+
$window.attachEvent 'onload', handler
|
14
9
|
end
|
15
10
|
end
|
16
11
|
|
17
12
|
def find_scripts
|
18
13
|
ruby_scripts.each do |script|
|
19
14
|
if src = script.src and src != ""
|
20
|
-
puts "Cannot currently load script
|
15
|
+
puts "Cannot currently load remote script: #{src}"
|
21
16
|
else
|
22
17
|
run_ruby script.innerHTML
|
23
18
|
end
|
@@ -25,16 +20,16 @@ class BrowserScriptLoader
|
|
25
20
|
end
|
26
21
|
|
27
22
|
def ruby_scripts
|
28
|
-
|
29
|
-
|
23
|
+
$document.getElementsByTagName('script').to_a.select { |s|
|
24
|
+
s.type == "text/ruby" }
|
30
25
|
end
|
31
26
|
|
32
27
|
def run_ruby str
|
33
|
-
|
28
|
+
$window.Opal.eval str
|
34
29
|
end
|
35
30
|
end
|
36
31
|
|
37
|
-
if
|
32
|
+
if $window and $document
|
38
33
|
BrowserScriptLoader.new.run
|
39
34
|
end
|
40
35
|
|
data/opal/opal.rb
CHANGED
@@ -17,18 +17,36 @@ require 'opal/proc'
|
|
17
17
|
require 'opal/range'
|
18
18
|
require 'opal/time'
|
19
19
|
require 'opal/json'
|
20
|
-
require 'opal/native'
|
21
20
|
|
22
21
|
# regexp matches
|
23
|
-
$~ = nil
|
22
|
+
$& = $~ = $` = $' = nil
|
23
|
+
|
24
|
+
# stub library path
|
25
|
+
$: = []
|
24
26
|
|
25
27
|
# split lines
|
26
|
-
$/
|
28
|
+
$/ = "\n"
|
27
29
|
|
28
|
-
|
30
|
+
# native globals
|
31
|
+
$global = `Opal.global`
|
32
|
+
$window = $global
|
33
|
+
$document = $window.document
|
34
|
+
|
35
|
+
ARGV = []
|
36
|
+
ARGF = Object.new
|
37
|
+
ENV = {}
|
38
|
+
TRUE = true
|
39
|
+
FALSE = false
|
40
|
+
NIL = nil
|
41
|
+
|
42
|
+
STDERR = $stderr = Object.new
|
43
|
+
STDIN = $stdin = Object.new
|
44
|
+
STDOUT = $stdout = Object.new
|
29
45
|
|
30
|
-
RUBY_ENGINE = 'opal'
|
31
46
|
RUBY_PLATFORM = 'opal'
|
47
|
+
RUBY_ENGINE = 'opal'
|
48
|
+
RUBY_VERSION = '1.9.3'
|
49
|
+
RUBY_RELEASE_DATE = '2013-05-02'
|
32
50
|
|
33
51
|
def to_s
|
34
52
|
'main'
|
data/opal/opal/array.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
class Array
|
1
|
+
class Array
|
2
2
|
include Enumerable
|
3
3
|
|
4
4
|
# Mark all javascript arrays as being valid ruby arrays
|
@@ -51,12 +51,18 @@ class Array < `Array`
|
|
51
51
|
|
52
52
|
for (var i = 0, length = #{self}.length; i < length; i++) {
|
53
53
|
var item = #{self}[i];
|
54
|
+
if (item._isString) {
|
55
|
+
item = item.toString();
|
56
|
+
}
|
54
57
|
|
55
58
|
if (!seen[item]) {
|
56
59
|
for (var j = 0, length2 = other.length; j < length2; j++) {
|
57
60
|
var item2 = other[j];
|
61
|
+
if (item2._isString) {
|
62
|
+
item2 = item2.toString();
|
63
|
+
}
|
58
64
|
|
59
|
-
if (
|
65
|
+
if (item === item2 && !seen[item]) {
|
60
66
|
seen[item] = true;
|
61
67
|
|
62
68
|
result.push(item);
|
@@ -90,7 +96,38 @@ class Array < `Array`
|
|
90
96
|
end
|
91
97
|
|
92
98
|
def -(other)
|
93
|
-
|
99
|
+
%x{
|
100
|
+
var a = #{self},
|
101
|
+
b = #{other},
|
102
|
+
tmp = [],
|
103
|
+
result = [];
|
104
|
+
|
105
|
+
if (typeof(b) == "object" && !(b instanceof Array)) {
|
106
|
+
if (b['$to_ary'] && typeof(b['$to_ary']) == "function") {
|
107
|
+
b = b['$to_ary']();
|
108
|
+
} else {
|
109
|
+
#{raise TypeError.new("can't convert to Array. Array#-") };
|
110
|
+
}
|
111
|
+
}else if ((typeof(b) != "object")) {
|
112
|
+
#{raise TypeError.new("can't convert to Array. Array#-") };
|
113
|
+
}
|
114
|
+
|
115
|
+
if (a.length == 0)
|
116
|
+
return [];
|
117
|
+
if (b.length == 0)
|
118
|
+
return a;
|
119
|
+
|
120
|
+
for(var i = 0, length = b.length; i < length; i++) {
|
121
|
+
tmp[b[i]] = true;
|
122
|
+
}
|
123
|
+
for(var i = 0, length = a.length; i < length; i++) {
|
124
|
+
if (!tmp[a[i]]) {
|
125
|
+
result.push(a[i]);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
return result;
|
130
|
+
}
|
94
131
|
end
|
95
132
|
|
96
133
|
def <<(object)
|
@@ -125,11 +162,25 @@ class Array < `Array`
|
|
125
162
|
return false;
|
126
163
|
}
|
127
164
|
|
128
|
-
for (var i = 0, length = #{self}.length; i < length; i++) {
|
165
|
+
for (var i = 0, length = #{self}.length, tmp1, tmp2; i < length; i++) {
|
166
|
+
tmp1 = #{self}[i];
|
167
|
+
tmp2 = #{other}[i];
|
168
|
+
|
169
|
+
//recursive
|
170
|
+
if ((typeof(tmp1.indexOf) == "function") &&
|
171
|
+
(typeof(tmp2.indexOf) == "function") &&
|
172
|
+
(tmp1.indexOf(tmp2) == tmp2.indexOf(tmp1))) {
|
173
|
+
if (tmp1.indexOf(tmp1) == tmp2.indexOf(tmp2)) {
|
174
|
+
continue;
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
129
178
|
if (!#{`#{self}[i]` == `other[i]`}) {
|
130
179
|
return false;
|
131
180
|
}
|
181
|
+
|
132
182
|
}
|
183
|
+
|
133
184
|
|
134
185
|
return true;
|
135
186
|
}
|
@@ -139,7 +190,7 @@ class Array < `Array`
|
|
139
190
|
%x{
|
140
191
|
var size = #{self}.length;
|
141
192
|
|
142
|
-
if (typeof index !== 'number') {
|
193
|
+
if (typeof index !== 'number' && !index._isNumber) {
|
143
194
|
if (index._isRange) {
|
144
195
|
var exclude = index.exclude;
|
145
196
|
length = index.end;
|
@@ -382,9 +433,19 @@ class Array < `Array`
|
|
382
433
|
def each(&block)
|
383
434
|
return enum_for :each unless block_given?
|
384
435
|
|
385
|
-
|
386
|
-
|
387
|
-
|
436
|
+
if block.arity > 0
|
437
|
+
%x{
|
438
|
+
for (var i = 0, length = #{self}.length; i < length; i++) {
|
439
|
+
if (block.apply(null, #{self}[i]._isArray ? #{self}[i] : [#{self}[i]]) === __breaker) return __breaker.$v;
|
440
|
+
}
|
441
|
+
}
|
442
|
+
else
|
443
|
+
%x{
|
444
|
+
for (var i = 0, length = #{self}.length; i < length; i++) {
|
445
|
+
#{yield `#{self}[i]`};
|
446
|
+
}
|
447
|
+
}
|
448
|
+
end
|
388
449
|
|
389
450
|
self
|
390
451
|
end
|
@@ -831,22 +892,75 @@ class Array < `Array`
|
|
831
892
|
def sort(&block)
|
832
893
|
%x{
|
833
894
|
var copy = #{self}.slice();
|
834
|
-
|
895
|
+
var t_arg_error = false;
|
896
|
+
var t_break = [];
|
897
|
+
|
835
898
|
if (block !== nil) {
|
836
|
-
|
899
|
+
var result = copy.sort(function(x, y) {
|
900
|
+
var result = block(x, y);
|
901
|
+
if (result === __breaker) {
|
902
|
+
t_break.push(__breaker.$v);
|
903
|
+
}
|
904
|
+
if (result === nil) {
|
905
|
+
t_arg_error = true;
|
906
|
+
}
|
907
|
+
if (result['$<=>'] && typeof(result['$<=>']) == "function") {
|
908
|
+
result = result['$<=>'](0);
|
909
|
+
}
|
910
|
+
if ([-1, 0, 1].indexOf(result) == -1) {
|
911
|
+
t_arg_error = true;
|
912
|
+
}
|
913
|
+
return result;
|
914
|
+
});
|
915
|
+
|
916
|
+
if (t_break.length > 0)
|
917
|
+
return t_break[0];
|
918
|
+
if (t_arg_error)
|
919
|
+
#{raise ArgumentError, "Array#sort"};
|
920
|
+
|
921
|
+
return result;
|
837
922
|
}
|
923
|
+
|
924
|
+
var result = copy.sort(function(a, b){
|
925
|
+
if (typeof(a) !== typeof(b)) {
|
926
|
+
t_arg_error = true;
|
927
|
+
}
|
928
|
+
|
929
|
+
if (a['$<=>'] && typeof(a['$<=>']) == "function") {
|
930
|
+
var result = a['$<=>'](b);
|
931
|
+
if (result === nil) {
|
932
|
+
t_arg_error = true;
|
933
|
+
}
|
934
|
+
return result;
|
935
|
+
}
|
936
|
+
if (a > b)
|
937
|
+
return 1;
|
938
|
+
if (a < b)
|
939
|
+
return -1;
|
940
|
+
return 0;
|
941
|
+
});
|
942
|
+
|
943
|
+
if (t_arg_error)
|
944
|
+
#{raise ArgumentError, "Array#sort"};
|
838
945
|
|
839
|
-
return
|
946
|
+
return result;
|
840
947
|
}
|
841
948
|
end
|
842
949
|
|
843
950
|
def sort!(&block)
|
844
951
|
%x{
|
952
|
+
var result;
|
845
953
|
if (block !== nil) {
|
846
|
-
|
954
|
+
//strangely
|
955
|
+
result = #{self}.slice().sort(block);
|
956
|
+
} else {
|
957
|
+
result = #{self}.slice()['$sort']();
|
847
958
|
}
|
848
|
-
|
849
|
-
|
959
|
+
#{self}.length = 0;
|
960
|
+
for(var i = 0; i < result.length; i++) {
|
961
|
+
#{self}.push(result[i]);
|
962
|
+
}
|
963
|
+
return #{self};
|
850
964
|
}
|
851
965
|
end
|
852
966
|
|
data/opal/opal/boolean.rb
CHANGED
data/opal/opal/class.rb
CHANGED
@@ -82,7 +82,7 @@ class Class
|
|
82
82
|
}
|
83
83
|
|
84
84
|
if (klass.$included_in) {
|
85
|
-
|
85
|
+
__opal.donate(klass, methods.slice(), true);
|
86
86
|
}
|
87
87
|
}
|
88
88
|
|
@@ -103,7 +103,7 @@ class Class
|
|
103
103
|
var func = function() { return this[name] };
|
104
104
|
|
105
105
|
if (cls._isSingleton) {
|
106
|
-
|
106
|
+
__opal.defs(proto, '$' + name, func);
|
107
107
|
}
|
108
108
|
else {
|
109
109
|
proto['$' + name] = func;
|
@@ -124,7 +124,7 @@ class Class
|
|
124
124
|
var func = function(value) { return this[name] = value; };
|
125
125
|
|
126
126
|
if (cls._isSingleton) {
|
127
|
-
|
127
|
+
__opal.defs(proto, '$' + name + '=', func);
|
128
128
|
}
|
129
129
|
else {
|
130
130
|
proto['$' + name + '='] = func;
|
@@ -137,19 +137,85 @@ class Class
|
|
137
137
|
|
138
138
|
alias attr attr_accessor
|
139
139
|
|
140
|
-
|
141
|
-
|
140
|
+
# when self is Module (or Class), implement 1st form:
|
141
|
+
# - global constants, classes and modules in global scope
|
142
|
+
# when self is not Module (or Class), implement 2nd form:
|
143
|
+
# - constants, classes and modules scoped to instance
|
144
|
+
def constants
|
145
|
+
%x{
|
146
|
+
var result = [];
|
147
|
+
var name_re = /^[A-Z][A-Za-z0-9_]+$/;
|
148
|
+
var scopes = [#{self}._scope];
|
149
|
+
var own_only;
|
150
|
+
if (#{self} === Opal.Class) {
|
151
|
+
own_only = false;
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
own_only = true;
|
155
|
+
var parent = #{self}._super;
|
156
|
+
while (parent !== Opal.Object) {
|
157
|
+
scopes.push(parent._scope);
|
158
|
+
parent = parent._super;
|
159
|
+
}
|
160
|
+
}
|
161
|
+
for (var i = 0, len = scopes.length; i < len; i++) {
|
162
|
+
var scope = scopes[i];
|
163
|
+
for (name in scope) {
|
164
|
+
if ((!own_only || scope.hasOwnProperty(name)) && name_re.test(name)) {
|
165
|
+
result.push(name);
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
return result;
|
171
|
+
}
|
142
172
|
end
|
143
173
|
|
144
|
-
|
174
|
+
# check for constant within current scope
|
175
|
+
# if inherit is true or self is Object, will also check ancestors
|
176
|
+
def const_defined?(name, inherit = true)
|
177
|
+
raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w+$/
|
145
178
|
%x{
|
146
|
-
|
179
|
+
scopes = [#{self}._scope];
|
180
|
+
if (inherit || #{self} === Opal.Object) {
|
181
|
+
var parent = #{self}._super;
|
182
|
+
while (parent !== Opal.BasicObject) {
|
183
|
+
scopes.push(parent._scope);
|
184
|
+
parent = parent._super;
|
185
|
+
}
|
186
|
+
}
|
147
187
|
|
148
|
-
|
149
|
-
|
188
|
+
for (var i = 0, len = scopes.length; i < len; i++) {
|
189
|
+
if (scopes[i].hasOwnProperty(name)) {
|
190
|
+
return true;
|
191
|
+
}
|
150
192
|
}
|
151
193
|
|
152
|
-
return
|
194
|
+
return false;
|
195
|
+
}
|
196
|
+
end
|
197
|
+
|
198
|
+
# check for constant within current scope
|
199
|
+
# if inherit is true or self is Object, will also check ancestors
|
200
|
+
def const_get(name, inherit = true)
|
201
|
+
raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w+$/
|
202
|
+
%x{
|
203
|
+
var scopes = [#{self}._scope];
|
204
|
+
if (inherit || #{self} == Opal.Object) {
|
205
|
+
var parent = #{self}._super;
|
206
|
+
while (parent !== Opal.BasicObject) {
|
207
|
+
scopes.push(parent._scope);
|
208
|
+
parent = parent._super;
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
for (var i = 0, len = scopes.length; i < len; i++) {
|
213
|
+
if (scopes[i].hasOwnProperty(name)) {
|
214
|
+
return scopes[i][name];
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
return #{const_missing name};
|
153
219
|
}
|
154
220
|
end
|
155
221
|
|
@@ -159,8 +225,7 @@ class Class
|
|
159
225
|
end
|
160
226
|
|
161
227
|
def const_set(name, value)
|
162
|
-
raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]
|
163
|
-
raise NameError, "wrong constant name #{name}" unless name =~ /^[\w_]+$/
|
228
|
+
raise NameError, "wrong constant name #{name}" unless name =~ /^[A-Z]\w+$/
|
164
229
|
begin
|
165
230
|
name = name.to_str
|
166
231
|
rescue
|
@@ -188,7 +253,7 @@ class Class
|
|
188
253
|
block._s = null;
|
189
254
|
|
190
255
|
#{self}.prototype[jsid] = block;
|
191
|
-
#{self}
|
256
|
+
__opal.donate(#{self}, [jsid]);
|
192
257
|
|
193
258
|
return nil;
|
194
259
|
}
|
@@ -283,12 +348,21 @@ class Class
|
|
283
348
|
|
284
349
|
def new(*args, &block)
|
285
350
|
%x{
|
286
|
-
|
287
|
-
|
351
|
+
if (#{self}.prototype.$initialize) {
|
352
|
+
var obj = new #{self};
|
353
|
+
obj._id = Opal.uid();
|
288
354
|
|
289
|
-
|
290
|
-
|
291
|
-
|
355
|
+
obj.$initialize._p = block;
|
356
|
+
obj.$initialize.apply(obj, args);
|
357
|
+
return obj;
|
358
|
+
}
|
359
|
+
else {
|
360
|
+
var cons = function() {};
|
361
|
+
cons.prototype = #{self}.prototype;
|
362
|
+
var obj = new cons;
|
363
|
+
#{self}.apply(obj, args);
|
364
|
+
return obj;
|
365
|
+
}
|
292
366
|
}
|
293
367
|
end
|
294
368
|
|