opal 0.3.41 → 0.3.42
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/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +2 -5
- data/Rakefile +41 -3
- data/bin/opal +33 -0
- data/lib/opal.rb +2 -12
- data/lib/opal/core_ext.rb +5 -0
- data/lib/opal/grammar.rb +2207 -2138
- data/lib/opal/grammar.y +21 -0
- data/lib/opal/grammar_helpers.rb +360 -0
- data/lib/opal/lexer.rb +55 -401
- data/lib/opal/lexer_scope.rb +28 -0
- data/lib/opal/parser.rb +155 -171
- data/lib/opal/target_scope.rb +257 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +6 -2
- data/opal/opal-parser.js.erb +3 -2
- data/opal/opal.rb +20 -18
- data/opal/opal/array.rb +21 -12
- data/opal/opal/basic_object.rb +2 -1
- data/opal/opal/boolean.rb +3 -0
- data/opal/opal/browser_loader.js +57 -0
- data/opal/opal/class.rb +51 -13
- data/opal/opal/date.rb +1 -20
- data/opal/opal/enumerable.rb +66 -33
- data/opal/opal/error.rb +2 -0
- data/opal/opal/hash.rb +1 -1
- data/opal/opal/kernel.rb +14 -3
- data/opal/opal/nil_class.rb +4 -0
- data/opal/opal/proc.rb +9 -1
- data/opal/opal/racc.rb +2 -2
- data/opal/opal/regexp.rb +1 -1
- data/opal/opal/runtime.js +14 -4
- data/opal/opal/string.rb +21 -4
- data/opal/opal/time.rb +27 -0
- data/spec/core/array/allocate_spec.rb +7 -1
- data/spec/core/array/append_spec.rb +18 -3
- data/spec/core/array/array_spec.rb +7 -0
- data/spec/core/array/assoc_spec.rb +23 -8
- data/spec/core/array/at_spec.rb +23 -3
- data/spec/core/array/choice_spec.rb +20 -0
- data/spec/core/array/clear_spec.rb +45 -4
- data/spec/core/array/combination_spec.rb +55 -0
- data/spec/core/array/compact_spec.rb +72 -1
- data/spec/core/array/constructor_spec.rb +13 -2
- data/spec/core/array/count_spec.rb +15 -7
- data/spec/core/array/delete_at_spec.rb +44 -1
- data/spec/core/array/delete_if_spec.rb +52 -2
- data/spec/core/array/delete_spec.rb +83 -2
- data/spec/core/array/drop_spec.rb +24 -16
- data/spec/core/array/drop_while_spec.rb +17 -0
- data/spec/core/array/each_index_spec.rb +11 -1
- data/spec/core/array/each_spec.rb +20 -2
- data/spec/core/array/empty_spec.rb +4 -1
- data/spec/core/array/eql_spec.rb +14 -0
- data/spec/core/array/fetch_spec.rb +31 -2
- data/spec/core/array/find_index_spec.rb +8 -0
- data/spec/core/array/first_spec.rb +45 -8
- data/spec/core/array/fixtures/classes.rb +538 -0
- data/spec/core/array/flatten_spec.rb +200 -7
- data/spec/core/array/frozen_spec.rb +32 -0
- data/spec/core/array/include_spec.rb +16 -1
- data/spec/core/array/index_spec.rb +5 -25
- data/spec/core/array/insert_spec.rb +37 -3
- data/spec/core/array/inspect_spec.rb +6 -12
- data/spec/core/array/intersection_spec.rb +55 -4
- data/spec/core/array/join_spec.rb +29 -4
- data/spec/core/array/keep_if_spec.rb +13 -6
- data/spec/core/array/last_spec.rb +35 -1
- data/spec/core/array/length_spec.rb +7 -4
- data/spec/core/array/map_spec.rb +9 -47
- data/spec/core/array/minus_spec.rb +68 -4
- data/spec/core/array/multiply_spec.rb +138 -6
- data/spec/core/array/new_spec.rb +92 -3
- data/spec/core/array/ntimes_spec.rb +26 -0
- data/spec/core/array/plus_spec.rb +48 -2
- data/spec/core/array/pop_spec.rb +159 -39
- data/spec/core/array/push_spec.rb +29 -1
- data/spec/core/array/rassoc_spec.rb +31 -2
- data/spec/core/array/reject_spec.rb +89 -2
- data/spec/core/array/replace_spec.rb +7 -29
- data/spec/core/array/reverse_each_spec.rb +25 -1
- data/spec/core/array/reverse_spec.rb +53 -1
- data/spec/core/array/rindex_spec.rb +55 -5
- data/spec/core/array/select_spec.rb +35 -8
- data/spec/core/array/shared/collect.rb +0 -0
- data/spec/core/array/shared/enumeratorize.rb +12 -0
- data/spec/core/array/shared/eql.rb +95 -0
- data/spec/core/array/shared/index.rb +37 -0
- data/spec/core/array/shared/inspect.rb +3 -0
- data/spec/core/array/shared/join.rb +7 -0
- data/spec/core/array/shared/keep_if.rb +0 -0
- data/spec/core/array/shared/length.rb +0 -0
- data/spec/core/array/shared/replace.rb +0 -0
- data/spec/core/array/shared/slice.rb +0 -0
- data/spec/core/array/shift_spec.rb +132 -23
- data/spec/core/array/shuffle_spec.rb +82 -6
- data/spec/core/array/size_spec.rb +7 -4
- data/spec/core/array/slice_spec.rb +132 -1
- data/spec/core/array/sort_spec.rb +263 -14
- data/spec/core/array/take_spec.rb +24 -16
- data/spec/core/array/take_while_spec.rb +14 -10
- data/spec/core/array/to_a_spec.rb +18 -1
- data/spec/core/array/to_ary_spec.rb +15 -1
- data/spec/core/array/try_convert_spec.rb +39 -2
- data/spec/core/array/uniq_spec.rb +148 -3
- data/spec/core/array/unshift_spec.rb +36 -1
- data/spec/core/array/zip_spec.rb +36 -1
- data/spec/core/class/new_spec.rb +8 -6
- data/spec/core/enumerable/all_spec.rb +37 -9
- data/spec/core/enumerable/any_spec.rb +45 -7
- data/spec/core/enumerable/collect_spec.rb +4 -1
- data/spec/core/enumerable/count_spec.rb +4 -1
- data/spec/core/enumerable/detect_spec.rb +2 -2
- data/spec/core/enumerable/drop_spec.rb +4 -1
- data/spec/core/enumerable/drop_while_spec.rb +4 -1
- data/spec/core/enumerable/each_slice_spec.rb +2 -1
- data/spec/core/enumerable/each_with_index_spec.rb +4 -1
- data/spec/core/enumerable/each_with_object_spec.rb +4 -1
- data/spec/core/enumerable/entries_spec.rb +4 -1
- data/spec/core/enumerable/find_all_spec.rb +4 -1
- data/spec/core/enumerable/find_index_spec.rb +4 -1
- data/spec/core/enumerable/find_spec.rb +5 -2
- data/spec/core/enumerable/first_spec.rb +4 -1
- data/spec/core/enumerable/fixtures/classes.rb +198 -2
- data/spec/core/enumerable/grep_spec.rb +4 -1
- data/spec/core/enumerable/take_spec.rb +4 -1
- data/spec/core/enumerable/to_a_spec.rb +4 -1
- data/spec/core/false/and_spec.rb +11 -0
- data/spec/core/false/inspect_spec.rb +7 -0
- data/spec/core/false/or_spec.rb +11 -0
- data/spec/core/false/to_s_spec.rb +7 -0
- data/spec/core/false/xor_spec.rb +11 -0
- data/spec/core/kernel/rand_spec.rb +5 -5
- data/spec/core/module/const_get_spec.rb +4 -4
- data/spec/core/module/fixtures/classes.rb +434 -0
- data/spec/core/module/method_defined_spec.rb +49 -0
- data/spec/core/module/module_function_spec.rb +28 -0
- data/spec/core/nil/and_spec.rb +3 -1
- data/spec/core/nil/dup_spec.rb +7 -0
- data/spec/core/nil/inspect_spec.rb +3 -1
- data/spec/core/nil/nil_spec.rb +3 -1
- data/spec/core/nil/or_spec.rb +4 -2
- data/spec/core/nil/to_a_spec.rb +3 -1
- data/spec/core/nil/to_f_spec.rb +3 -1
- data/spec/core/nil/to_i_spec.rb +3 -1
- data/spec/core/nil/to_s_spec.rb +3 -1
- data/spec/core/nil/xor_spec.rb +4 -2
- data/spec/core/string/element_reference_spec.rb +14 -1
- data/spec/core/string/fixtures/classes.rb +0 -0
- data/spec/core/true/and_spec.rb +11 -0
- data/spec/core/true/inspect_spec.rb +7 -0
- data/spec/core/true/or_spec.rb +11 -0
- data/spec/core/true/to_s_spec.rb +7 -0
- data/spec/core/true/xor_spec.rb +11 -0
- data/spec/{core → core_ext}/array/element_reference_spec.rb +0 -0
- data/spec/{core → core_ext}/array/equal_value_spec.rb +0 -0
- data/spec/{core → core_ext}/array/fill_spec.rb +0 -0
- data/spec/{core → core_ext}/array/reduce_spec.rb +0 -0
- data/spec/core_ext/basic_object/send_spec.rb +3 -3
- data/spec/{core → core_ext}/boolean/singleton_class_spec.rb +0 -0
- data/spec/{core → core_ext}/boolean/to_json_spec.rb +0 -0
- data/spec/core_ext/class/_inherited_spec.rb +3 -3
- data/spec/core_ext/class/proc_methods_spec.rb +2 -2
- data/spec/core_ext/class/singleton_methods_spec.rb +8 -8
- data/spec/core_ext/method_missing_spec.rb +3 -3
- data/spec/core_ext/native/method_missing_spec.rb +3 -2
- data/spec/core_ext/native/to_native_spec.rb +3 -2
- data/spec/{core → core_ext}/nil/to_json_spec.rb +0 -0
- data/spec/date.rb +0 -0
- data/spec/fileutils.rb +0 -0
- data/spec/filters/ancestors.rb +4 -0
- data/spec/filters/array_delete.rb +3 -0
- data/spec/filters/array_fetch.rb +3 -0
- data/spec/filters/array_first.rb +3 -0
- data/spec/filters/array_flatten.rb +14 -0
- data/spec/filters/array_intersection.rb +5 -0
- data/spec/filters/array_join.rb +6 -0
- data/spec/filters/array_subclasses.rb +4 -0
- data/spec/filters/block_args.rb +3 -0
- data/spec/filters/coerce_integer.rb +9 -0
- data/spec/filters/frozen.rb +4 -0
- data/spec/filters/mocks.rb +3 -0
- data/spec/filters/should_receive.rb +4 -0
- data/spec/filters/tainted.rb +7 -0
- data/spec/fixtures/class.rb +124 -0
- data/spec/fixtures/class_variables.rb +0 -0
- data/spec/fixtures/constants.rb +0 -0
- data/spec/grammar/alias_spec.rb +1 -1
- data/spec/grammar/def_spec.rb +1 -0
- data/spec/grammar/lvar_spec.rb +1 -2
- data/spec/grammar/nth_ref_spec.rb +13 -0
- data/spec/grammar/sclass_spec.rb +6 -7
- data/spec/grammar/str_spec.rb +4 -4
- data/spec/grammar/string_spec.rb +8 -0
- data/spec/grammar/xstr_spec.rb +4 -4
- data/spec/iconv.rb +0 -0
- data/spec/language/alias_spec.rb +140 -3
- data/spec/language/and_spec.rb +14 -7
- data/spec/language/array_spec.rb +57 -5
- data/spec/language/block_spec.rb +466 -49
- data/spec/language/break_spec.rb +294 -44
- data/spec/language/case_spec.rb +151 -3
- data/spec/language/class_spec.rb +196 -0
- data/spec/language/class_variable_spec.rb +56 -0
- data/spec/language/def_spec.rb +507 -4
- data/spec/language/defined_spec.rb +19 -7
- data/spec/language/ensure_spec.rb +26 -39
- data/spec/language/execution_spec.rb +15 -0
- data/spec/language/fixtures/array.rb +11 -0
- data/spec/language/fixtures/block.rb +57 -0
- data/spec/language/fixtures/break.rb +240 -0
- data/spec/language/fixtures/ensure.rb +72 -0
- data/spec/language/fixtures/literal_lambda.rb +7 -0
- data/spec/language/fixtures/metaclass.rb +33 -0
- data/spec/language/fixtures/module.rb +24 -0
- data/spec/language/fixtures/next.rb +78 -12
- data/spec/language/fixtures/return.rb +118 -0
- data/spec/language/fixtures/send.rb +110 -0
- data/spec/language/fixtures/send_1.9.rb +22 -0
- data/spec/language/fixtures/super.rb +308 -0
- data/spec/language/fixtures/variables.rb +58 -0
- data/spec/language/fixtures/yield.rb +5 -0
- data/spec/language/for_spec.rb +192 -0
- data/spec/language/hash_spec.rb +29 -5
- data/spec/language/if_spec.rb +90 -9
- data/spec/language/literal_lambda_spec.rb +1 -47
- data/spec/language/loop_spec.rb +39 -2
- data/spec/language/metaclass_spec.rb +151 -5
- data/spec/language/module_spec.rb +56 -0
- data/spec/language/next_spec.rb +370 -12
- data/spec/language/not_spec.rb +55 -0
- data/spec/language/numbers_spec.rb +56 -0
- data/spec/language/or_spec.rb +31 -3
- data/spec/language/order_spec.rb +79 -0
- data/spec/language/precedence_spec.rb +483 -0
- data/spec/language/proc_spec.rb +249 -21
- data/spec/language/redo_spec.rb +67 -0
- data/spec/language/rescue_spec.rb +121 -0
- data/spec/language/retry_spec.rb +56 -0
- data/spec/language/return_spec.rb +281 -0
- data/spec/language/send_spec.rb +141 -48
- data/spec/language/singleton_class_spec.rb +1 -1
- data/spec/language/string_spec.rb +11 -0
- data/spec/language/super_spec.rb +213 -133
- data/spec/language/symbol_spec.rb +2 -1
- data/spec/language/undef_spec.rb +3 -1
- data/spec/language/unless_spec.rb +6 -2
- data/spec/language/until_spec.rb +102 -3
- data/spec/language/variables_spec.rb +1212 -16
- data/spec/language/versions/array_1.9.rb +39 -0
- data/spec/language/versions/case_1.9.rb +20 -0
- data/spec/language/versions/hash_1.9.rb +18 -0
- data/spec/language/versions/literal_lambda_1.9.rb +143 -0
- data/spec/language/versions/not_1.9.rb +22 -0
- data/spec/language/versions/send_1.9.rb +241 -0
- data/spec/language/versions/symbol_1.9.rb +15 -0
- data/spec/language/versions/variables_1.9.rb +8 -0
- data/spec/language/while_spec.rb +70 -5
- data/spec/language/yield_spec.rb +32 -6
- data/spec/mspec/guards/block_device.rb +0 -0
- data/spec/mspec/guards/endian.rb +0 -0
- data/spec/mspec/helpers/environment.rb +0 -0
- data/spec/mspec/helpers/language_version.rb +0 -0
- data/spec/mspec/helpers/tmp.rb +0 -0
- data/spec/ospec/filter.rb +32 -0
- data/spec/ospec/main.rb.erb +18 -0
- data/spec/ospec/phantom.rb +97 -0
- data/spec/ospec/runner.rb +95 -0
- data/spec/ospec/sprockets.js +40 -0
- data/spec/pp.rb +3 -0
- data/spec/rbconfig.rb +5 -0
- data/spec/spec_helper.rb +53 -26
- data/spec/yaml.rb +0 -0
- metadata +275 -31
- data/config.ru +0 -8
- data/lib/opal/processor.rb +0 -47
- data/lib/opal/scope.rb +0 -236
- data/lib/opal/server.rb +0 -94
- data/spec/core/boolean/and_spec.rb +0 -17
- data/spec/core/boolean/inspect_spec.rb +0 -9
- data/spec/core/boolean/or_spec.rb +0 -17
- data/spec/core/boolean/to_s_spec.rb +0 -9
- data/spec/core/boolean/xor_spec.rb +0 -17
@@ -0,0 +1,257 @@
|
|
1
|
+
module Opal
|
2
|
+
# Instances of TargetScope are used by the parser when a new scope is
|
3
|
+
# being processed. It is used to keep track of used variables,
|
4
|
+
# temp variables and ivars so they can be processed and output
|
5
|
+
# along with the scope implementation.
|
6
|
+
class TargetScope
|
7
|
+
|
8
|
+
# Every scope can have a parent scope
|
9
|
+
attr_accessor :parent
|
10
|
+
|
11
|
+
# The class or module name if this scope is a class scope
|
12
|
+
attr_accessor :name
|
13
|
+
|
14
|
+
# The given block name for a def scope
|
15
|
+
attr_accessor :block_name
|
16
|
+
|
17
|
+
attr_reader :scope_name
|
18
|
+
attr_reader :ivars
|
19
|
+
|
20
|
+
attr_reader :type
|
21
|
+
|
22
|
+
attr_accessor :defines_defn
|
23
|
+
attr_accessor :defines_defs
|
24
|
+
|
25
|
+
# One of - :class, :module, :top, :iter, :def
|
26
|
+
attr_accessor :mid
|
27
|
+
|
28
|
+
# true if singleton def, false otherwise
|
29
|
+
attr_accessor :defs
|
30
|
+
|
31
|
+
# used by modules to know what methods to donate to includees
|
32
|
+
attr_reader :methods
|
33
|
+
|
34
|
+
# uses parents super method
|
35
|
+
attr_accessor :uses_super
|
36
|
+
|
37
|
+
# @param [Symbol] type the scope type (:class, :module, :iter, :def, :top)
|
38
|
+
# @param [Opal::Parser] parser a parser instance used to create this scope
|
39
|
+
def initialize(type, parser)
|
40
|
+
@parser = parser
|
41
|
+
@type = type
|
42
|
+
@locals = []
|
43
|
+
@temps = []
|
44
|
+
@args = []
|
45
|
+
@ivars = []
|
46
|
+
@parent = nil
|
47
|
+
@queue = []
|
48
|
+
@unique = "a"
|
49
|
+
@while_stack = []
|
50
|
+
|
51
|
+
@defines_defs = false
|
52
|
+
@defines_defn = false
|
53
|
+
|
54
|
+
@methods = []
|
55
|
+
|
56
|
+
@uses_block = false
|
57
|
+
|
58
|
+
# used by classes to store all ivars used in direct def methods
|
59
|
+
@proto_ivars = []
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns true if this scope is a class/module body scope
|
63
|
+
def class_scope?
|
64
|
+
@type == :class or @type == :module
|
65
|
+
end
|
66
|
+
|
67
|
+
# Returns true if this is strictly a class scope
|
68
|
+
def class?
|
69
|
+
@type == :class
|
70
|
+
end
|
71
|
+
|
72
|
+
# True if this is a module scope
|
73
|
+
def module?
|
74
|
+
@type == :module
|
75
|
+
end
|
76
|
+
|
77
|
+
def sclass?
|
78
|
+
@type == :sclass
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns true if this is a top scope (main file body)
|
82
|
+
def top?
|
83
|
+
@type == :top
|
84
|
+
end
|
85
|
+
|
86
|
+
# True if a block/iter scope
|
87
|
+
def iter?
|
88
|
+
@type == :iter
|
89
|
+
end
|
90
|
+
|
91
|
+
# Is this a normal def method directly inside a class? This is
|
92
|
+
# used for optimizing ivars as we can set them to nil in the
|
93
|
+
# class body
|
94
|
+
def def_in_class?
|
95
|
+
!@defs && @type == :def && @parent && @parent.class?
|
96
|
+
end
|
97
|
+
|
98
|
+
# Inside a class or module scope, the javascript variable name returned
|
99
|
+
# by this function points to the classes' prototype. This is the target
|
100
|
+
# to where methods are actually added inside a class body.
|
101
|
+
def proto
|
102
|
+
"def"
|
103
|
+
end
|
104
|
+
|
105
|
+
# A scope donates its methods if it is a module, or the core Object
|
106
|
+
# class. Modules donate their methods to classes or objects they are
|
107
|
+
# included in. Object donates methods to bridged classes whose native
|
108
|
+
# prototypes do not actually inherit from Opal.Object.prototype.
|
109
|
+
def should_donate?
|
110
|
+
@type == :module or @name.to_s == 'Object'
|
111
|
+
end
|
112
|
+
|
113
|
+
##
|
114
|
+
# Vars to use inside each scope
|
115
|
+
def to_vars
|
116
|
+
vars = @locals.map { |l| "#{l} = nil" }
|
117
|
+
vars.push(*@temps)
|
118
|
+
current_self = @parser.current_self
|
119
|
+
|
120
|
+
iv = ivars.map do |ivar|
|
121
|
+
"if (#{current_self}#{ivar} == null) #{current_self}#{ivar} = nil;\n"
|
122
|
+
end
|
123
|
+
|
124
|
+
indent = @parser.parser_indent
|
125
|
+
res = vars.empty? ? '' : "var #{vars.join ', '};"
|
126
|
+
str = ivars.empty? ? res : "#{res}\n#{indent}#{iv.join indent}"
|
127
|
+
|
128
|
+
if class? and !@proto_ivars.empty?
|
129
|
+
pvars = @proto_ivars.map { |i| "#{proto}#{i}"}.join(' = ')
|
130
|
+
"%s\n%s%s = nil;" % [str, indent, pvars]
|
131
|
+
else
|
132
|
+
str
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Generates code for this module to donate methods
|
137
|
+
def to_donate_methods
|
138
|
+
if should_donate? and !@methods.empty?
|
139
|
+
"%s;#{@name}._donate([%s]);" % [@parser.parser_indent, @methods.map(&:inspect).join(', ')]
|
140
|
+
else
|
141
|
+
""
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def add_ivar(ivar)
|
146
|
+
if def_in_class?
|
147
|
+
@parent.add_proto_ivar ivar
|
148
|
+
else
|
149
|
+
@ivars << ivar unless @ivars.include? ivar
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def add_proto_ivar(ivar)
|
154
|
+
@proto_ivars << ivar unless @proto_ivars.include? ivar
|
155
|
+
end
|
156
|
+
|
157
|
+
def add_arg(arg)
|
158
|
+
@args << arg unless @args.include? arg
|
159
|
+
end
|
160
|
+
|
161
|
+
def add_local(local)
|
162
|
+
return if has_local? local
|
163
|
+
|
164
|
+
@locals << local
|
165
|
+
end
|
166
|
+
|
167
|
+
def has_local?(local)
|
168
|
+
return true if @locals.include? local or @args.include? local
|
169
|
+
return @parent.has_local?(local) if @parent and @type == :iter
|
170
|
+
|
171
|
+
false
|
172
|
+
end
|
173
|
+
|
174
|
+
def add_temp(*tmps)
|
175
|
+
@temps.push(*tmps)
|
176
|
+
end
|
177
|
+
|
178
|
+
def has_temp?(tmp)
|
179
|
+
@temps.include? tmp
|
180
|
+
end
|
181
|
+
|
182
|
+
def new_temp
|
183
|
+
return @queue.pop unless @queue.empty?
|
184
|
+
|
185
|
+
tmp = "_#{@unique}"
|
186
|
+
@unique = @unique.succ
|
187
|
+
@temps << tmp
|
188
|
+
tmp
|
189
|
+
end
|
190
|
+
|
191
|
+
def queue_temp(name)
|
192
|
+
@queue << name
|
193
|
+
end
|
194
|
+
|
195
|
+
def push_while
|
196
|
+
info = {}
|
197
|
+
@while_stack.push info
|
198
|
+
info
|
199
|
+
end
|
200
|
+
|
201
|
+
def pop_while
|
202
|
+
@while_stack.pop
|
203
|
+
end
|
204
|
+
|
205
|
+
def in_while?
|
206
|
+
!@while_stack.empty?
|
207
|
+
end
|
208
|
+
|
209
|
+
def uses_block!
|
210
|
+
if @type == :iter && @parent
|
211
|
+
@parent.uses_block!
|
212
|
+
else
|
213
|
+
@uses_block = true
|
214
|
+
identify!
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def identify!
|
219
|
+
return @identity if @identity
|
220
|
+
|
221
|
+
@identity = @parser.unique_temp
|
222
|
+
@parent.add_temp @identity if @parent
|
223
|
+
|
224
|
+
@identity
|
225
|
+
end
|
226
|
+
|
227
|
+
def identity
|
228
|
+
@identity
|
229
|
+
end
|
230
|
+
|
231
|
+
def get_super_chain
|
232
|
+
chain, scope, defn, mid = [], self, 'null', 'null'
|
233
|
+
|
234
|
+
while scope
|
235
|
+
if scope.type == :iter
|
236
|
+
chain << scope.identify!
|
237
|
+
scope = scope.parent if scope.parent
|
238
|
+
|
239
|
+
elsif scope.type == :def
|
240
|
+
defn = scope.identify!
|
241
|
+
mid = "'$#{scope.mid}'"
|
242
|
+
break
|
243
|
+
|
244
|
+
else
|
245
|
+
break
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
[chain, defn, mid]
|
250
|
+
end
|
251
|
+
|
252
|
+
def uses_block?
|
253
|
+
@uses_block
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
data/lib/opal/version.rb
CHANGED
data/opal.gemspec
CHANGED
@@ -12,7 +12,11 @@ Gem::Specification.new do |s|
|
|
12
12
|
|
13
13
|
s.files = `git ls-files`.split("\n")
|
14
14
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
|
-
s.require_paths = ['lib']
|
15
|
+
s.require_paths = ['lib']
|
16
16
|
|
17
|
-
s.
|
17
|
+
s.add_dependency 'rake'
|
18
|
+
s.add_dependency 'racc'
|
19
|
+
s.add_dependency 'opal-sprockets'
|
20
|
+
|
21
|
+
s.add_development_dependency 'mspec', '1.5.18'
|
18
22
|
end
|
data/opal/opal-parser.js.erb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
<% require_asset 'opal/browser_loader' %>
|
1
2
|
<% require_asset 'opal/racc' %>
|
2
3
|
<% require_asset 'opal/strscan' %>
|
3
4
|
|
4
5
|
// We need (some) of the libs from our real ruby parser (not in sprockets load path)
|
5
|
-
<% %w(opal/grammar opal/lexer opal/parser opal/
|
6
|
-
|
6
|
+
<% %w(opal/grammar opal/lexer opal/parser opal/target_scope opal/core_ext opal/lexer_scope opal/grammar_helpers opal/parser opal).each do |f| %>
|
7
|
+
<%= Opal.parse File.read(File.join Opal.core_dir, '..', 'lib', "#{f}.rb") %>
|
7
8
|
<% end %>
|
data/opal/opal.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
1
|
+
#= require opal/runtime
|
2
|
+
#= require opal/class
|
3
|
+
#= require opal/basic_object
|
4
|
+
#= require opal/kernel
|
5
|
+
#= require opal/nil_class
|
6
|
+
#= require opal/boolean
|
7
|
+
#= require opal/error
|
8
|
+
#= require opal/regexp
|
9
|
+
#= require opal/comparable
|
10
|
+
#= require opal/enumerable
|
11
|
+
#= require opal/array
|
12
|
+
#= require opal/hash
|
13
|
+
#= require opal/string
|
14
|
+
#= require opal/numeric
|
15
|
+
#= require opal/proc
|
16
|
+
#= require opal/range
|
17
|
+
#= require opal/time
|
18
|
+
#= require opal/json
|
19
19
|
|
20
20
|
# regexp matches
|
21
21
|
$~ = nil
|
@@ -23,6 +23,8 @@ $~ = nil
|
|
23
23
|
# split lines
|
24
24
|
$/ = "\n"
|
25
25
|
|
26
|
+
$stderr = $stdout = Object.new
|
27
|
+
|
26
28
|
RUBY_ENGINE = 'opal'
|
27
29
|
RUBY_PLATFORM = 'opal'
|
28
30
|
|
data/opal/opal/array.rb
CHANGED
@@ -421,7 +421,7 @@ class Array < `Array`
|
|
421
421
|
return block(original);
|
422
422
|
}
|
423
423
|
|
424
|
-
#{ raise "Array#fetch" };
|
424
|
+
#{ raise IndexError, "Array#fetch" };
|
425
425
|
}
|
426
426
|
end
|
427
427
|
|
@@ -536,7 +536,7 @@ class Array < `Array`
|
|
536
536
|
index += #{self}.length + 1;
|
537
537
|
|
538
538
|
if (index < 0) {
|
539
|
-
#{ raise "#{index} is out of bounds" };
|
539
|
+
#{ raise IndexError, "#{index} is out of bounds" };
|
540
540
|
}
|
541
541
|
}
|
542
542
|
if (index > #{self}.length) {
|
@@ -606,12 +606,25 @@ class Array < `Array`
|
|
606
606
|
def last(count = undefined)
|
607
607
|
%x{
|
608
608
|
var length = #{self}.length;
|
609
|
-
|
609
|
+
|
610
|
+
if (count === nil || typeof(count) == 'string') {
|
611
|
+
#{ raise TypeError, "no implicit conversion to integer" };
|
612
|
+
}
|
613
|
+
|
614
|
+
if (typeof(count) == 'object') {
|
615
|
+
if (typeof(count['$to_int']) == 'function') {
|
616
|
+
count = count['$to_int']();
|
617
|
+
}
|
618
|
+
else {
|
619
|
+
#{ raise TypeError, "no implicit conversion to integer" };
|
620
|
+
}
|
621
|
+
}
|
622
|
+
|
610
623
|
if (count == null) {
|
611
624
|
return length === 0 ? nil : #{self}[length - 1];
|
612
625
|
}
|
613
626
|
else if (count < 0) {
|
614
|
-
#{ raise "negative count given" };
|
627
|
+
#{ raise ArgumentError, "negative count given" };
|
615
628
|
}
|
616
629
|
|
617
630
|
if (count > length) {
|
@@ -705,16 +718,12 @@ class Array < `Array`
|
|
705
718
|
}
|
706
719
|
end
|
707
720
|
|
708
|
-
|
709
|
-
|
710
|
-
def reverse!
|
711
|
-
%x{
|
712
|
-
#{self}.splice(0);
|
713
|
-
#{self}.push.apply(#{self}, #{reverse});
|
714
|
-
return #{self};
|
715
|
-
}
|
721
|
+
def reverse
|
722
|
+
`#{self}.slice(0).reverse()`
|
716
723
|
end
|
717
724
|
|
725
|
+
alias_native :reverse!, :reverse
|
726
|
+
|
718
727
|
def reverse_each(&block)
|
719
728
|
reverse.each &block
|
720
729
|
|
data/opal/opal/basic_object.rb
CHANGED
@@ -11,10 +11,11 @@ class BasicObject
|
|
11
11
|
var func = #{self}['$' + symbol]
|
12
12
|
|
13
13
|
if (func) {
|
14
|
-
if (block !== nil) {
|
14
|
+
if (block !== nil) { func._p = block; }
|
15
15
|
return func.apply(#{self}, args);
|
16
16
|
}
|
17
17
|
|
18
|
+
if (block !== nil) { #{self}.$method_missing._p = block; }
|
18
19
|
return #{self}.$method_missing.apply(#{self}, [symbol].concat(args));
|
19
20
|
}
|
20
21
|
end
|
data/opal/opal/boolean.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
1
|
+
(function() {
|
2
|
+
// quick exit if not insde browser
|
3
|
+
if (typeof(window) === 'undefined' || typeof(document) === 'undefined') {
|
4
|
+
return;
|
5
|
+
}
|
6
|
+
|
7
|
+
function findRubyScripts() {
|
8
|
+
var all = document.getElementsByTagName('script');
|
9
|
+
for (var i = 0, script; i < all.length; i++) {
|
10
|
+
script = all[i];
|
11
|
+
if (script.type === 'text/ruby') {
|
12
|
+
if (script.src) {
|
13
|
+
request(script.src, function(result) {
|
14
|
+
runRuby(result);
|
15
|
+
});
|
16
|
+
}
|
17
|
+
else {
|
18
|
+
runRuby(script.innerHTML);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
else if (script.type === 'text/erb') {
|
22
|
+
runERB(script.innerHTML);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
function runRuby(source) {
|
28
|
+
var js = Opal.Opal.Parser.$new().$parse(source);
|
29
|
+
eval(js);
|
30
|
+
}
|
31
|
+
|
32
|
+
function request(url, callback) {
|
33
|
+
var xhr = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
|
34
|
+
xhr.open('GET', url, true);
|
35
|
+
if ('overrideMimeType' in xhr) {
|
36
|
+
xhr.overrideMimeType('text/plain');
|
37
|
+
}
|
38
|
+
xhr.onreadystatechange = function() {
|
39
|
+
if (xhr.readyState === 4) {
|
40
|
+
if (xhr.status === 0 || xhr.status === 200) {
|
41
|
+
callback(xhr.responseText);
|
42
|
+
}
|
43
|
+
else {
|
44
|
+
throw new Error('Could not load ruby at: ' + url);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
};
|
48
|
+
xhr.send(null);
|
49
|
+
}
|
50
|
+
|
51
|
+
if (window.addEventListener) {
|
52
|
+
window.addEventListener('DOMContentLoaded', findRubyScripts, false);
|
53
|
+
}
|
54
|
+
else {
|
55
|
+
window.attachEvent('onload', findRubyScripts);
|
56
|
+
}
|
57
|
+
})();
|