opal 0.6.3 → 0.7.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.spectator +2 -0
- data/.spectator-mspec +3 -0
- data/.travis.yml +8 -11
- data/CHANGELOG.md +33 -0
- data/CONTRIBUTING.md +8 -43
- data/Gemfile +15 -4
- data/Guardfile +77 -0
- data/README.md +15 -9
- data/Rakefile +36 -12
- data/benchmarks/operators.rb +11 -0
- data/bin/opal +10 -13
- data/bin/opal-build +4 -4
- data/bin/opal-mspec +10 -0
- data/bin/opal-repl +4 -3
- data/examples/sinatra/Gemfile +1 -1
- data/examples/sinatra/config.ru +3 -3
- data/lib/mspec/opal/main.rb.erb +2 -2
- data/lib/mspec/opal/rake_task.rb +31 -24
- data/lib/mspec/opal/runner.rb +18 -1
- data/lib/mspec/opal/sprockets.js +17 -0
- data/lib/opal.rb +1 -34
- data/lib/opal/builder.rb +92 -58
- data/lib/opal/builder_processors.rb +165 -0
- data/lib/opal/cli.rb +85 -144
- data/lib/opal/cli_options.rb +136 -90
- data/lib/opal/cli_runners.rb +10 -0
- data/lib/opal/cli_runners/nodejs.rb +56 -0
- data/lib/opal/cli_runners/phantom.js +35 -0
- data/lib/opal/cli_runners/phantomjs.rb +28 -0
- data/lib/opal/cli_runners/server.rb +54 -0
- data/lib/opal/compiler.rb +35 -16
- data/lib/opal/erb.rb +29 -15
- data/lib/opal/hike_path_finder.rb +18 -0
- data/lib/opal/nodes.rb +1 -0
- data/lib/opal/nodes/call.rb +107 -26
- data/lib/opal/nodes/call_special.rb +31 -6
- data/lib/opal/nodes/class.rb +2 -2
- data/lib/opal/nodes/constants.rb +5 -20
- data/lib/opal/nodes/def.rb +4 -4
- data/lib/opal/nodes/defined.rb +3 -3
- data/lib/opal/nodes/definitions.rb +1 -1
- data/lib/opal/nodes/for.rb +35 -0
- data/lib/opal/nodes/helpers.rb +2 -2
- data/lib/opal/nodes/iter.rb +3 -3
- data/lib/opal/nodes/literal.rb +10 -2
- data/lib/opal/nodes/masgn.rb +2 -2
- data/lib/opal/nodes/module.rb +2 -2
- data/lib/opal/nodes/scope.rb +1 -0
- data/lib/opal/nodes/singleton_class.rb +2 -2
- data/lib/opal/nodes/super.rb +2 -2
- data/lib/opal/nodes/top.rb +30 -3
- data/lib/opal/parser.rb +15 -1
- data/lib/opal/parser/grammar.rb +2571 -2452
- data/lib/opal/parser/grammar.y +37 -5
- data/lib/opal/parser/keywords.rb +2 -0
- data/lib/opal/parser/lexer.rb +21 -11
- data/lib/opal/path_reader.rb +28 -0
- data/lib/opal/paths.rb +38 -0
- data/lib/opal/source_map.rb +32 -15
- data/lib/opal/sprockets/environment.rb +9 -2
- data/lib/opal/sprockets/erb.rb +1 -2
- data/lib/opal/sprockets/path_reader.rb +34 -0
- data/lib/opal/sprockets/processor.rb +40 -39
- data/lib/opal/sprockets/server.rb +47 -33
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +10 -5
- data/opal/README.md +6 -0
- data/opal/corelib/array.rb +36 -4
- data/opal/corelib/array/inheritance.rb +6 -6
- data/opal/corelib/basic_object.rb +9 -9
- data/opal/corelib/boolean.rb +1 -1
- data/opal/corelib/class.rb +12 -12
- data/opal/corelib/dir.rb +20 -0
- data/opal/corelib/enumerable.rb +42 -42
- data/opal/corelib/enumerator.rb +1 -1
- data/opal/corelib/error.rb +2 -2
- data/opal/corelib/file.rb +56 -0
- data/opal/corelib/hash.rb +5 -5
- data/opal/corelib/helpers.rb +3 -3
- data/opal/corelib/io.rb +13 -10
- data/opal/corelib/kernel.rb +44 -68
- data/opal/corelib/method.rb +1 -1
- data/opal/corelib/module.rb +89 -114
- data/opal/corelib/nil_class.rb +1 -1
- data/opal/corelib/numeric.rb +27 -23
- data/opal/corelib/proc.rb +5 -5
- data/opal/corelib/range.rb +8 -4
- data/opal/corelib/regexp.rb +5 -5
- data/opal/corelib/runtime.js +589 -272
- data/opal/corelib/string.rb +52 -37
- data/opal/corelib/string/inheritance.rb +5 -5
- data/opal/corelib/time.rb +102 -52
- data/opal/corelib/variables.rb +3 -3
- data/opal/opal.rb +2 -0
- data/package.json +9 -0
- data/spec/filters/bugs/array.rb +0 -6
- data/spec/filters/bugs/language.rb +4 -0
- data/spec/filters/bugs/numeric.rb +7 -6
- data/spec/filters/bugs/opal.rb +2 -0
- data/spec/filters/bugs/regexp.rb +4 -0
- data/spec/filters/bugs/string.rb +0 -7
- data/spec/filters/bugs/stringscanner.rb +4 -1
- data/spec/filters/unsupported/private_methods.rb +2 -0
- data/spec/lib/builder_processors_spec.rb +27 -0
- data/spec/lib/builder_spec.rb +66 -0
- data/spec/{cli → lib}/cli_spec.rb +60 -5
- data/spec/{cli → lib}/compiler_spec.rb +66 -5
- data/spec/{cli → lib}/dependency_resolver_spec.rb +1 -1
- data/spec/lib/fixtures/no_requires.rb +1 -0
- data/spec/{cli → lib}/fixtures/opal_file.rb +0 -0
- data/spec/lib/fixtures/require_tree_test.rb +3 -0
- data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
- data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
- data/spec/lib/fixtures/requires.rb +7 -0
- data/spec/{cli → lib}/fixtures/sprockets_file.js.rb +0 -0
- data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
- data/spec/lib/hike_path_finder_spec.rb +23 -0
- data/spec/{cli → lib}/lexer_spec.rb +1 -1
- data/spec/{cli → lib}/parser/alias_spec.rb +1 -1
- data/spec/{cli → lib}/parser/and_spec.rb +1 -1
- data/spec/{cli → lib}/parser/attrasgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/begin_spec.rb +1 -1
- data/spec/{cli → lib}/parser/block_spec.rb +1 -1
- data/spec/{cli → lib}/parser/break_spec.rb +1 -1
- data/spec/{cli → lib}/parser/call_spec.rb +1 -1
- data/spec/{cli → lib}/parser/class_spec.rb +1 -1
- data/spec/{cli → lib}/parser/comments_spec.rb +1 -1
- data/spec/{cli → lib}/parser/def_spec.rb +1 -1
- data/spec/{cli → lib}/parser/if_spec.rb +1 -1
- data/spec/{cli → lib}/parser/iter_spec.rb +1 -1
- data/spec/{cli → lib}/parser/lambda_spec.rb +1 -1
- data/spec/{cli → lib}/parser/literal_spec.rb +1 -1
- data/spec/{cli → lib}/parser/masgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/module_spec.rb +1 -1
- data/spec/{cli → lib}/parser/not_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn1_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn2_spec.rb +1 -1
- data/spec/{cli → lib}/parser/or_spec.rb +1 -1
- data/spec/{cli → lib}/parser/return_spec.rb +1 -1
- data/spec/{cli → lib}/parser/sclass_spec.rb +1 -1
- data/spec/{cli → lib}/parser/string_spec.rb +8 -1
- data/spec/{cli → lib}/parser/super_spec.rb +1 -1
- data/spec/lib/parser/unary_spec.rb +48 -0
- data/spec/{cli → lib}/parser/undef_spec.rb +1 -1
- data/spec/{cli → lib}/parser/unless_spec.rb +1 -1
- data/spec/{cli → lib}/parser/variables_spec.rb +1 -1
- data/spec/{cli → lib}/parser/while_spec.rb +1 -1
- data/spec/{cli → lib}/parser/yield_spec.rb +1 -1
- data/spec/lib/path_reader_spec.rb +24 -0
- data/spec/lib/shared/path_finder_shared.rb +19 -0
- data/spec/lib/shared/path_reader_shared.rb +31 -0
- data/spec/lib/spec_helper.rb +9 -0
- data/spec/lib/sprockets/environment_spec.rb +30 -0
- data/spec/{cli → lib}/sprockets/erb_spec.rb +1 -1
- data/spec/lib/sprockets/path_reader_spec.rb +25 -0
- data/spec/{cli → lib}/sprockets/processor_spec.rb +9 -2
- data/spec/lib/sprockets/server_spec.rb +20 -0
- data/spec/opal/compiler/irb_spec.rb +11 -11
- data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
- data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
- data/spec/opal/core/kernel/respond_to_spec.rb +2 -2
- data/spec/opal/core/runtime/method_missing_spec.rb +19 -0
- data/spec/opal/core/source_map_spec.rb +2 -2
- data/spec/opal/core/string_spec.rb +11 -0
- data/spec/opal/stdlib/erb/erb_spec.rb +0 -1
- data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
- data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
- data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
- data/spec/rubyspecs +54 -11
- data/spec/spec_helper.rb +18 -3
- data/spec/support/mspec_rspec_adapter.rb +33 -0
- data/spec/{cli/spec_helper.rb → support/parser_helpers.rb} +10 -10
- data/stdlib/README.md +3 -0
- data/stdlib/benchmark.rb +10 -0
- data/stdlib/date.rb +2 -2
- data/stdlib/dir.rb +1 -5
- data/stdlib/file.rb +1 -7
- data/stdlib/json.rb +10 -1
- data/stdlib/native.rb +5 -5
- data/stdlib/nodejs.rb +5 -0
- data/stdlib/nodejs/dir.rb +13 -0
- data/stdlib/nodejs/file.rb +98 -0
- data/stdlib/nodejs/fileutils.rb +26 -0
- data/stdlib/nodejs/io.rb +2 -0
- data/stdlib/nodejs/irb.rb +45 -0
- data/stdlib/nodejs/process.rb +16 -0
- data/stdlib/nodejs/require.rb +32 -0
- data/stdlib/nodejs/rubygems.rb +68 -0
- data/stdlib/nodejs/runtime.rb +25 -0
- data/stdlib/nodejs/yaml.rb +11 -0
- data/stdlib/opal-parser.rb +1 -2
- data/stdlib/opal-source-maps.rb +2 -0
- data/stdlib/phantomjs.rb +8 -0
- data/stdlib/process.rb +10 -0
- data/stdlib/promise.rb +12 -4
- data/stdlib/set.rb +27 -0
- data/stdlib/source_map.rb +5 -63
- data/stdlib/source_map/map.rb +220 -0
- data/stdlib/source_map/mapping.rb +26 -0
- data/stdlib/source_map/offset.rb +88 -0
- data/stdlib/source_map/version.rb +3 -0
- data/stdlib/source_map/vlq.rb +77 -101
- data/stdlib/sourcemap.rb +1 -0
- data/stdlib/strscan.rb +7 -1
- data/stdlib/template.rb +1 -1
- data/stdlib/thread.rb +147 -7
- metadata +238 -104
- data/lib/mspec/opal/mspec_fixes.rb +0 -87
- data/spec/cli/sprockets/environment_spec.rb +0 -14
- data/spec/filters/bugs/symbol.rb +0 -5
- data/spec/opal/core/kernel/warn_spec.rb +0 -83
- data/spec/opal/core/language/numbers_spec.rb +0 -60
- data/stdlib/opal-source-maps.js.erb +0 -2
- data/stdlib/source_map/generator.rb +0 -251
- data/stdlib/source_map/parser.rb +0 -102
data/lib/opal/erb.rb
CHANGED
@@ -3,29 +3,42 @@ require 'opal/compiler'
|
|
3
3
|
module Opal
|
4
4
|
module ERB
|
5
5
|
def self.compile(source, file_name = '(erb)')
|
6
|
-
Compiler.new
|
6
|
+
Compiler.new(source, file_name).compile
|
7
7
|
end
|
8
8
|
|
9
9
|
class Compiler
|
10
|
-
def
|
10
|
+
def initialize(source, file_name = '(erb)')
|
11
11
|
@source, @file_name, @result = source, file_name, source
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
def prepared_source
|
15
|
+
@prepared_source ||= begin
|
16
|
+
source = @source
|
17
|
+
source = fix_quotes(source)
|
18
|
+
source = find_contents(source)
|
19
|
+
source = find_code(source)
|
20
|
+
source = wrap_compiled(source)
|
21
|
+
source = require_erb(source)
|
22
|
+
source
|
23
|
+
end
|
24
|
+
end
|
17
25
|
|
18
|
-
|
26
|
+
def compile
|
27
|
+
Opal.compile prepared_source
|
19
28
|
end
|
20
29
|
|
21
|
-
def fix_quotes
|
22
|
-
|
30
|
+
def fix_quotes(result)
|
31
|
+
result.gsub '"', '\\"'
|
23
32
|
end
|
24
33
|
|
25
34
|
BLOCK_EXPR = /\s+(do|\{)(\s*\|[^|]*\|)?\s*\Z/
|
26
35
|
|
27
|
-
def
|
28
|
-
|
36
|
+
def require_erb(result)
|
37
|
+
'require "erb";'+result
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_contents(result)
|
41
|
+
result.gsub(/<%=([\s\S]+?)%>/) do
|
29
42
|
inner = $1.gsub(/\\'/, "'").gsub(/\\"/, '"')
|
30
43
|
|
31
44
|
if inner =~ BLOCK_EXPR
|
@@ -36,14 +49,15 @@ module Opal
|
|
36
49
|
end
|
37
50
|
end
|
38
51
|
|
39
|
-
def find_code
|
40
|
-
|
52
|
+
def find_code(result)
|
53
|
+
result.gsub(/<%([\s\S]+?)%>/) do
|
41
54
|
"\")\n#{ $1 }\noutput_buffer.append(\""
|
42
55
|
end
|
43
56
|
end
|
44
57
|
|
45
|
-
def wrap_compiled
|
46
|
-
|
58
|
+
def wrap_compiled(result)
|
59
|
+
path = @file_name.sub(/\.opalerb$/, '')
|
60
|
+
result = "Template.new('#{path}') do |output_buffer|\noutput_buffer.append(\"#{result}\")\noutput_buffer.join\nend\n"
|
47
61
|
end
|
48
62
|
end
|
49
63
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'hike'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Opal
|
5
|
+
class HikePathFinder < Hike::Trail
|
6
|
+
def initialize(paths = Opal.paths)
|
7
|
+
super()
|
8
|
+
append_paths(*paths)
|
9
|
+
append_extensions '.js', '.js.rb', '.rb', '.opalerb'
|
10
|
+
end
|
11
|
+
|
12
|
+
def find path
|
13
|
+
pathname = Pathname(path)
|
14
|
+
return path if pathname.absolute? and pathname.exist?
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/opal/nodes.rb
CHANGED
data/lib/opal/nodes/call.rb
CHANGED
@@ -9,22 +9,34 @@ module Opal
|
|
9
9
|
|
10
10
|
children :recvr, :meth, :arglist, :iter
|
11
11
|
|
12
|
-
SPECIALS =
|
12
|
+
SPECIALS = {}
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
# Operators that get optimized by compiler
|
15
|
+
OPERATORS = { :+ => :plus, :- => :minus, :* => :times, :/ => :divide,
|
16
|
+
:< => :lt, :<= => :le, :> => :gt, :>= => :ge }
|
17
|
+
|
18
|
+
def self.add_special(name, options = {}, &handler)
|
19
|
+
SPECIALS[name] = options
|
16
20
|
define_method("handle_#{name}", &handler)
|
17
21
|
end
|
18
22
|
|
19
23
|
def compile
|
20
|
-
#
|
21
|
-
|
24
|
+
# handle some methods specially
|
25
|
+
handle_special
|
26
|
+
|
27
|
+
# some special methods need to skip compilation
|
28
|
+
return unless compile_default?
|
22
29
|
|
23
30
|
compiler.method_calls << meth.to_sym
|
24
31
|
|
25
32
|
# if trying to access an lvar in irb mode
|
26
33
|
return compile_irb_var if using_irb?
|
27
34
|
|
35
|
+
default_compile
|
36
|
+
end
|
37
|
+
|
38
|
+
def default_compile
|
39
|
+
|
28
40
|
mid = mid_to_jsid meth.to_s
|
29
41
|
|
30
42
|
splat = arglist[1..-1].any? { |a| a.first == :splat }
|
@@ -35,8 +47,8 @@ module Opal
|
|
35
47
|
block = iter
|
36
48
|
end
|
37
49
|
|
38
|
-
|
39
|
-
tmprecv = scope.new_temp if splat ||
|
50
|
+
blktmp = scope.new_temp if block
|
51
|
+
tmprecv = scope.new_temp if splat || blktmp
|
40
52
|
|
41
53
|
# must do this after assigning temp variables
|
42
54
|
block = expr(block) if block
|
@@ -44,7 +56,7 @@ module Opal
|
|
44
56
|
recv_code = recv(recv_sexp)
|
45
57
|
call_recv = s(:js_tmp, tmprecv || recv_code)
|
46
58
|
|
47
|
-
if
|
59
|
+
if blktmp and !splat
|
48
60
|
arglist.insert 1, call_recv
|
49
61
|
end
|
50
62
|
|
@@ -56,26 +68,30 @@ module Opal
|
|
56
68
|
push recv_code, mid
|
57
69
|
end
|
58
70
|
|
59
|
-
if
|
60
|
-
unshift "(#{
|
61
|
-
push ", #{
|
71
|
+
if blktmp
|
72
|
+
unshift "(#{blktmp} = "
|
73
|
+
push ", #{blktmp}.$$p = ", block, ", #{blktmp})"
|
62
74
|
end
|
63
75
|
|
64
76
|
if splat
|
65
77
|
push ".apply(", (tmprecv || recv_code), ", ", args, ")"
|
66
|
-
elsif
|
78
|
+
elsif blktmp
|
67
79
|
push ".call(", args, ")"
|
68
80
|
else
|
69
81
|
push "(", args, ")"
|
70
82
|
end
|
71
83
|
|
72
|
-
scope.queue_temp
|
84
|
+
scope.queue_temp blktmp if blktmp
|
73
85
|
end
|
74
86
|
|
75
87
|
def recv_sexp
|
76
88
|
recvr || s(:self)
|
77
89
|
end
|
78
90
|
|
91
|
+
def attr_assignment?
|
92
|
+
@assignment ||= meth.to_s =~ /^[\da-z]+\=$/i
|
93
|
+
end
|
94
|
+
|
79
95
|
# Used to generate the code to use this sexp as an ivar var reference
|
80
96
|
def compile_irb_var
|
81
97
|
with_temp do |tmp|
|
@@ -85,6 +101,19 @@ module Opal
|
|
85
101
|
end
|
86
102
|
end
|
87
103
|
|
104
|
+
def compile_assignment
|
105
|
+
with_temp do |args_tmp|
|
106
|
+
with_temp do |recv_tmp|
|
107
|
+
args = expr(arglist)
|
108
|
+
mid = mid_to_jsid meth.to_s
|
109
|
+
push "((#{args_tmp} = [", args, "]), "+
|
110
|
+
"#{recv_tmp} = ", recv(recv_sexp), ", ",
|
111
|
+
recv_tmp, mid, ".apply(#{recv_tmp}, #{args_tmp}), "+
|
112
|
+
"#{args_tmp}[#{args_tmp}.length-1])"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
88
117
|
# a variable reference in irb mode in top scope might be a var ref,
|
89
118
|
# or it might be a method call
|
90
119
|
def using_irb?
|
@@ -95,53 +124,105 @@ module Opal
|
|
95
124
|
# this method. If this method returns nil, then the method will continue
|
96
125
|
# to be generated by CallNode.
|
97
126
|
def handle_special
|
127
|
+
@compile_default = true
|
128
|
+
|
98
129
|
if SPECIALS.include? meth
|
99
|
-
|
100
|
-
|
101
|
-
return true
|
102
|
-
end
|
130
|
+
@compile_default = false
|
131
|
+
__send__("handle_#{meth}")
|
103
132
|
elsif RuntimeHelpers.compatible?(recvr, meth, arglist)
|
133
|
+
@compile_default = false
|
104
134
|
push(RuntimeHelpers.new(@sexp, @level, @compiler).compile)
|
105
|
-
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def compile_default!
|
139
|
+
@compile_default = true
|
140
|
+
end
|
141
|
+
|
142
|
+
def compile_default?
|
143
|
+
@compile_default
|
144
|
+
end
|
145
|
+
|
146
|
+
OPERATORS.each do |operator, name|
|
147
|
+
add_special(operator.to_sym) do
|
148
|
+
if compiler.inline_operators?
|
149
|
+
compiler.operator_helpers << operator.to_sym
|
150
|
+
lhs, rhs = expr(recvr), expr(arglist[1])
|
151
|
+
|
152
|
+
push fragment("$rb_#{name}(")
|
153
|
+
push lhs
|
154
|
+
push fragment(", ")
|
155
|
+
push rhs
|
156
|
+
push fragment(")")
|
157
|
+
else
|
158
|
+
compile_default!
|
159
|
+
end
|
106
160
|
end
|
107
161
|
end
|
108
162
|
|
109
163
|
add_special :require do
|
164
|
+
compile_default!
|
110
165
|
str = DependencyResolver.new(compiler, arglist[1]).resolve
|
111
166
|
compiler.requires << str unless str.nil?
|
112
|
-
|
167
|
+
push fragment('')
|
168
|
+
end
|
169
|
+
|
170
|
+
add_special :require_relative do
|
171
|
+
arg = arglist[1]
|
172
|
+
file = compiler.file
|
173
|
+
if arg[0] == :str
|
174
|
+
dir = File.dirname(file)
|
175
|
+
compiler.requires << File.expand_path(arg[1], dir)
|
176
|
+
end
|
177
|
+
push fragment("self.$require(#{file.inspect}+ '/../' + ")
|
178
|
+
push process(arglist)
|
179
|
+
push fragment(')')
|
113
180
|
end
|
114
181
|
|
115
182
|
add_special :autoload do
|
116
183
|
if scope.class_scope?
|
184
|
+
compile_default!
|
117
185
|
str = DependencyResolver.new(compiler, arglist[2]).resolve
|
118
186
|
compiler.requires << str unless str.nil?
|
119
|
-
fragment
|
187
|
+
push fragment('')
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
add_special :require_tree do
|
192
|
+
arg = arglist[1]
|
193
|
+
if arg[0] == :str
|
194
|
+
dir = File.dirname(compiler.file)
|
195
|
+
relative_path = arg[1]
|
196
|
+
full_path = Pathname(dir).join(relative_path).cleanpath.to_s
|
197
|
+
compiler.required_trees << full_path
|
198
|
+
arg[1] = full_path
|
120
199
|
end
|
200
|
+
compile_default!
|
201
|
+
push fragment('')
|
121
202
|
end
|
122
203
|
|
123
204
|
add_special :block_given? do
|
124
|
-
compiler.handle_block_given_call @sexp
|
205
|
+
push compiler.handle_block_given_call @sexp
|
125
206
|
end
|
126
207
|
|
127
208
|
add_special :__callee__ do
|
128
209
|
if scope.def?
|
129
|
-
fragment scope.mid.to_s.inspect
|
210
|
+
push fragment scope.mid.to_s.inspect
|
130
211
|
else
|
131
|
-
fragment 'nil'
|
212
|
+
push fragment 'nil'
|
132
213
|
end
|
133
214
|
end
|
134
215
|
|
135
216
|
add_special :__method__ do
|
136
217
|
if scope.def?
|
137
|
-
fragment scope.mid.to_s.inspect
|
218
|
+
push fragment scope.mid.to_s.inspect
|
138
219
|
else
|
139
|
-
fragment 'nil'
|
220
|
+
push fragment 'nil'
|
140
221
|
end
|
141
222
|
end
|
142
223
|
|
143
224
|
add_special :debugger do
|
144
|
-
fragment 'debugger'
|
225
|
+
push fragment 'debugger'
|
145
226
|
end
|
146
227
|
|
147
228
|
class DependencyResolver
|
@@ -1,17 +1,29 @@
|
|
1
1
|
require 'opal/nodes/base'
|
2
|
+
require 'opal/nodes/call'
|
2
3
|
|
3
4
|
module Opal
|
4
5
|
module Nodes
|
5
6
|
# recv.mid = rhs
|
6
7
|
# s(:recv, :mid=, s(:arglist, rhs))
|
7
|
-
class AttrAssignNode <
|
8
|
+
class AttrAssignNode < CallNode
|
8
9
|
handle :attrasgn
|
9
10
|
|
10
|
-
children :recvr, :
|
11
|
+
children :recvr, :meth, :arglist
|
11
12
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
13
|
+
def default_compile
|
14
|
+
# Skip, for now, if the method has square brackets: []=
|
15
|
+
return super if meth.to_s !~ /^\w+=$/
|
16
|
+
|
17
|
+
with_temp do |args_tmp|
|
18
|
+
with_temp do |recv_tmp|
|
19
|
+
args = expr(arglist)
|
20
|
+
mid = mid_to_jsid meth.to_s
|
21
|
+
push "((#{args_tmp} = [", args, "]), "+
|
22
|
+
"#{recv_tmp} = ", recv(recv_sexp), ", ",
|
23
|
+
recv_tmp, mid, ".apply(#{recv_tmp}, #{args_tmp}), "+
|
24
|
+
"#{args_tmp}[#{args_tmp}.length-1])"
|
25
|
+
end
|
26
|
+
end
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
@@ -39,7 +51,7 @@ module Opal
|
|
39
51
|
sexp = s(:or, recvr, rhs)
|
40
52
|
push expr(sexp)
|
41
53
|
end
|
42
|
-
end
|
54
|
+
end
|
43
55
|
|
44
56
|
# a &&= rhs
|
45
57
|
# s(:op_asgn_and, s(:lvar, :a), s(:lasgn, a:, rhs))
|
@@ -98,6 +110,19 @@ module Opal
|
|
98
110
|
end
|
99
111
|
end
|
100
112
|
end
|
113
|
+
|
114
|
+
def compile_and
|
115
|
+
with_temp do |a| # args
|
116
|
+
with_temp do |r| # recv
|
117
|
+
aref = s(:call, s(:js_tmp, r), :[], s(:arglist, s(:js_tmp, a)))
|
118
|
+
aset = s(:call, s(:js_tmp, r), :[]=, s(:arglist, s(:js_tmp, a), rhs))
|
119
|
+
andop = s(:and, aref, aset)
|
120
|
+
|
121
|
+
push "(#{a} = ", expr(first_arg), ", #{r} = ", expr(lhs)
|
122
|
+
push ", ", expr(andop), ")"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
101
126
|
end
|
102
127
|
|
103
128
|
# lhs.b += rhs
|
data/lib/opal/nodes/class.rb
CHANGED
data/lib/opal/nodes/constants.rb
CHANGED
@@ -10,12 +10,8 @@ module Opal
|
|
10
10
|
def compile
|
11
11
|
if name == :DATA and compiler.eof_content
|
12
12
|
push("$__END__")
|
13
|
-
elsif compiler.const_missing?
|
14
|
-
with_temp do |tmp|
|
15
|
-
push "((#{tmp} = $scope.#{name}) == null ? $opal.cm('#{name}') : #{tmp})"
|
16
|
-
end
|
17
13
|
else
|
18
|
-
push "$scope
|
14
|
+
push "$scope.get('#{name}')"
|
19
15
|
end
|
20
16
|
end
|
21
17
|
end
|
@@ -51,17 +47,9 @@ module Opal
|
|
51
47
|
children :base, :name
|
52
48
|
|
53
49
|
def compile
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
push expr(base)
|
58
|
-
push ")._scope).#{name} == null ? #{tmp}.cm('#{name}') : "
|
59
|
-
push "#{tmp}.#{name})"
|
60
|
-
end
|
61
|
-
else
|
62
|
-
push expr(base)
|
63
|
-
wrap '(', ")._scope.#{name}"
|
64
|
-
end
|
50
|
+
push "(("
|
51
|
+
push expr(base)
|
52
|
+
push ").$$scope.get('#{name}'))"
|
65
53
|
end
|
66
54
|
end
|
67
55
|
|
@@ -71,10 +59,7 @@ module Opal
|
|
71
59
|
children :name
|
72
60
|
|
73
61
|
def compile
|
74
|
-
|
75
|
-
push "((#{tmp} = $opal.Object._scope.#{name}) == null ? "
|
76
|
-
push "$opal.cm('#{name}') : #{tmp})"
|
77
|
-
end
|
62
|
+
push "Opal.get('#{name}')"
|
78
63
|
end
|
79
64
|
end
|
80
65
|
|