opal 0.3.11 → 0.3.15

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.
Files changed (282) hide show
  1. data/.gitignore +13 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +20 -0
  4. data/README.md +11 -116
  5. data/Rakefile +126 -0
  6. data/bin/opal +1 -2
  7. data/docs/spec_runner.html +16 -0
  8. data/index.html +434 -0
  9. data/lib/opal.rb +14 -15
  10. data/lib/opal/builder.rb +46 -148
  11. data/lib/opal/command.rb +45 -115
  12. data/lib/opal/context.rb +139 -78
  13. data/lib/opal/dependency_builder.rb +34 -0
  14. data/lib/opal/environment.rb +92 -0
  15. data/lib/opal/parser/grammar.rb +4915 -0
  16. data/lib/opal/{parser.y → parser/grammar.y} +430 -284
  17. data/lib/opal/parser/lexer.rb +1329 -0
  18. data/lib/opal/parser/parser.rb +1460 -0
  19. data/lib/opal/parser/scope.rb +140 -0
  20. data/lib/opal/parser/sexp.rb +17 -0
  21. data/lib/opal/version.rb +2 -1
  22. data/opal.gemspec +23 -0
  23. data/opal.js +3149 -4162
  24. data/runtime/README.md +25 -0
  25. data/runtime/corelib/alpha.rb +10 -0
  26. data/runtime/corelib/array.rb +962 -0
  27. data/runtime/corelib/basic_object.rb +66 -0
  28. data/runtime/corelib/boolean.rb +44 -0
  29. data/runtime/corelib/class.rb +43 -0
  30. data/runtime/corelib/comparable.rb +25 -0
  31. data/runtime/corelib/complex.rb +2 -0
  32. data/runtime/corelib/dir.rb +29 -0
  33. data/runtime/corelib/enumerable.rb +316 -0
  34. data/runtime/corelib/enumerator.rb +80 -0
  35. data/runtime/corelib/error.rb +25 -0
  36. data/runtime/corelib/file.rb +80 -0
  37. data/runtime/corelib/hash.rb +503 -0
  38. data/runtime/corelib/io.rb +44 -0
  39. data/runtime/corelib/kernel.rb +237 -0
  40. data/runtime/corelib/load_order +29 -0
  41. data/runtime/corelib/match_data.rb +37 -0
  42. data/runtime/corelib/module.rb +171 -0
  43. data/runtime/corelib/native.rb +50 -0
  44. data/runtime/corelib/nil_class.rb +47 -0
  45. data/runtime/corelib/numeric.rb +219 -0
  46. data/runtime/corelib/object.rb +21 -0
  47. data/runtime/corelib/proc.rb +42 -0
  48. data/runtime/corelib/range.rb +38 -0
  49. data/runtime/corelib/rational.rb +16 -0
  50. data/runtime/corelib/regexp.rb +63 -0
  51. data/runtime/corelib/string.rb +185 -0
  52. data/runtime/corelib/struct.rb +97 -0
  53. data/runtime/corelib/time.rb +196 -0
  54. data/runtime/corelib/top_self.rb +7 -0
  55. data/runtime/gemlib/alpha.rb +5 -0
  56. data/runtime/gemlib/kernel.rb +17 -0
  57. data/runtime/gemlib/load_order +2 -0
  58. data/runtime/kernel/class.js +256 -0
  59. data/runtime/kernel/debug.js +42 -0
  60. data/runtime/kernel/init.js +114 -0
  61. data/runtime/kernel/load_order +5 -0
  62. data/runtime/kernel/loader.js +151 -0
  63. data/runtime/kernel/runtime.js +414 -0
  64. data/runtime/spec/README.md +34 -0
  65. data/runtime/spec/core/array/allocate_spec.rb +15 -0
  66. data/runtime/spec/core/array/append_spec.rb +31 -0
  67. data/runtime/spec/core/array/assoc_spec.rb +29 -0
  68. data/runtime/spec/core/array/at_spec.rb +38 -0
  69. data/runtime/spec/core/array/clear_spec.rb +22 -0
  70. data/runtime/spec/core/array/collect_spec.rb +3 -0
  71. data/runtime/spec/core/array/compact_spec.rb +42 -0
  72. data/runtime/spec/core/array/concat_spec.rb +21 -0
  73. data/runtime/spec/core/array/constructor_spec.rb +24 -0
  74. data/runtime/spec/core/array/count_spec.rb +11 -0
  75. data/runtime/spec/core/array/delete_at_spec.rb +31 -0
  76. data/runtime/spec/core/array/delete_if_spec.rb +24 -0
  77. data/runtime/spec/core/array/delete_spec.rb +26 -0
  78. data/runtime/spec/core/array/each_index_spec.rb +33 -0
  79. data/runtime/spec/core/array/each_spec.rb +11 -0
  80. data/runtime/spec/core/array/element_reference_spec.rb +136 -0
  81. data/runtime/spec/core/array/element_set_spec.rb +7 -0
  82. data/runtime/spec/core/array/empty_spec.rb +10 -0
  83. data/runtime/spec/core/array/eql_spec.rb +3 -0
  84. data/runtime/spec/core/array/equal_value_spec.rb +3 -0
  85. data/runtime/spec/core/array/fetch_spec.rb +26 -0
  86. data/runtime/spec/core/array/first_spec.rb +54 -0
  87. data/runtime/spec/core/array/fixtures/classes.rb +8 -0
  88. data/runtime/spec/core/array/flatten_spec.rb +41 -0
  89. data/runtime/spec/core/array/include_spec.rb +20 -0
  90. data/runtime/spec/core/array/insert_spec.rb +59 -0
  91. data/runtime/spec/core/array/last_spec.rb +57 -0
  92. data/runtime/spec/core/array/length_spec.rb +3 -0
  93. data/runtime/spec/core/array/map_spec.rb +3 -0
  94. data/runtime/spec/core/array/plus_spec.rb +16 -0
  95. data/runtime/spec/core/array/pop_spec.rb +79 -0
  96. data/runtime/spec/core/array/push_spec.rb +19 -0
  97. data/runtime/spec/core/array/rassoc_spec.rb +12 -0
  98. data/runtime/spec/core/array/reject_spec.rb +54 -0
  99. data/runtime/spec/core/array/replace_spec.rb +3 -0
  100. data/runtime/spec/core/array/reverse_each_spec.rb +18 -0
  101. data/runtime/spec/core/array/reverse_spec.rb +9 -0
  102. data/runtime/spec/core/array/shared/collect.rb +53 -0
  103. data/runtime/spec/core/array/shared/eql.rb +19 -0
  104. data/runtime/spec/core/array/shared/length.rb +6 -0
  105. data/runtime/spec/core/array/shared/replace.rb +31 -0
  106. data/runtime/spec/core/class/new_spec.rb +19 -0
  107. data/runtime/spec/core/enumerable/all_spec.rb +102 -0
  108. data/runtime/spec/core/enumerable/any_spec.rb +115 -0
  109. data/runtime/spec/core/enumerable/collect_spec.rb +3 -0
  110. data/runtime/spec/core/enumerable/count_spec.rb +29 -0
  111. data/runtime/spec/core/enumerable/detect_spec.rb +3 -0
  112. data/runtime/spec/core/enumerable/find_spec.rb +3 -0
  113. data/runtime/spec/core/enumerable/fixtures/classes.rb +26 -0
  114. data/runtime/spec/core/enumerable/shared/collect.rb +12 -0
  115. data/runtime/spec/core/enumerable/shared/entries.rb +7 -0
  116. data/runtime/spec/core/enumerable/shared/find.rb +49 -0
  117. data/runtime/spec/core/enumerable/to_a_spec.rb +7 -0
  118. data/runtime/spec/core/false/and_spec.rb +11 -0
  119. data/runtime/spec/core/false/inspect_spec.rb +7 -0
  120. data/runtime/spec/core/false/or_spec.rb +11 -0
  121. data/runtime/spec/core/false/to_s_spec.rb +7 -0
  122. data/runtime/spec/core/false/xor_spec.rb +11 -0
  123. data/runtime/spec/core/hash/allocate_spec.rb +15 -0
  124. data/runtime/spec/core/hash/assoc_spec.rb +29 -0
  125. data/runtime/spec/core/hash/clear_spec.rb +21 -0
  126. data/runtime/spec/core/hash/clone_spec.rb +12 -0
  127. data/runtime/spec/core/hash/default_spec.rb +6 -0
  128. data/runtime/spec/core/hash/delete_if_spec.rb +15 -0
  129. data/runtime/spec/core/hash/element_reference_spec.rb +16 -0
  130. data/runtime/spec/core/hash/element_set_spec.rb +8 -0
  131. data/runtime/spec/core/hash/new_spec.rb +13 -0
  132. data/runtime/spec/core/matchdata/to_a_spec.rb +7 -0
  133. data/runtime/spec/core/nil/and_spec.rb +12 -0
  134. data/runtime/spec/core/nil/inspect_spec.rb +8 -0
  135. data/runtime/spec/core/nil/nil_spec.rb +8 -0
  136. data/runtime/spec/core/nil/or_spec.rb +12 -0
  137. data/runtime/spec/core/nil/to_a_spec.rb +8 -0
  138. data/runtime/spec/core/nil/to_f_spec.rb +12 -0
  139. data/runtime/spec/core/nil/to_i_spec.rb +12 -0
  140. data/runtime/spec/core/nil/to_s_spec.rb +8 -0
  141. data/runtime/spec/core/nil/xor_spec.rb +12 -0
  142. data/runtime/spec/core/numeric/equal_value_spec.rb +11 -0
  143. data/runtime/spec/core/object/is_a_spec.rb +2 -0
  144. data/runtime/spec/core/object/shared/kind_of.rb +0 -0
  145. data/runtime/spec/core/regexp/match_spec.rb +23 -0
  146. data/runtime/spec/core/regexp/shared/match.rb +11 -0
  147. data/runtime/spec/core/symbol/to_proc_spec.rb +8 -0
  148. data/runtime/spec/core/true/and_spec.rb +11 -0
  149. data/runtime/spec/core/true/inspect_spec.rb +7 -0
  150. data/runtime/spec/core/true/or_spec.rb +11 -0
  151. data/runtime/spec/core/true/to_s_spec.rb +7 -0
  152. data/runtime/spec/core/true/xor_spec.rb +11 -0
  153. data/runtime/spec/language/alias_spec.rb +25 -0
  154. data/runtime/spec/language/and_spec.rb +62 -0
  155. data/runtime/spec/language/array_spec.rb +68 -0
  156. data/runtime/spec/language/block_spec.rb +105 -0
  157. data/runtime/spec/language/break_spec.rb +49 -0
  158. data/runtime/spec/language/case_spec.rb +165 -0
  159. data/runtime/spec/language/defined_spec.rb +80 -0
  160. data/runtime/spec/language/ensure_spec.rb +82 -0
  161. data/runtime/spec/language/fixtures/block.rb +19 -0
  162. data/runtime/spec/language/fixtures/break.rb +39 -0
  163. data/runtime/spec/language/fixtures/defined.rb +9 -0
  164. data/runtime/spec/language/fixtures/ensure.rb +37 -0
  165. data/runtime/spec/language/fixtures/next.rb +46 -0
  166. data/runtime/spec/language/fixtures/send.rb +36 -0
  167. data/runtime/spec/language/fixtures/super.rb +43 -0
  168. data/runtime/spec/language/hash_spec.rb +43 -0
  169. data/runtime/spec/language/if_spec.rb +278 -0
  170. data/runtime/spec/language/loop_spec.rb +32 -0
  171. data/runtime/spec/language/next_spec.rb +128 -0
  172. data/runtime/spec/language/or_spec.rb +65 -0
  173. data/runtime/spec/language/predefined_spec.rb +21 -0
  174. data/runtime/spec/language/regexp/interpolation_spec.rb +9 -0
  175. data/runtime/spec/language/regexp_spec.rb +7 -0
  176. data/runtime/spec/language/send_spec.rb +105 -0
  177. data/runtime/spec/language/string_spec.rb +4 -0
  178. data/runtime/spec/language/super_spec.rb +18 -0
  179. data/runtime/spec/language/symbol_spec.rb +41 -0
  180. data/runtime/spec/language/undef_spec.rb +16 -0
  181. data/runtime/spec/language/unless_spec.rb +44 -0
  182. data/runtime/spec/language/until_spec.rb +137 -0
  183. data/runtime/spec/language/variables_spec.rb +28 -0
  184. data/runtime/spec/language/versions/hash_1.9.rb +20 -0
  185. data/runtime/spec/language/while_spec.rb +175 -0
  186. data/runtime/spec/library/stringscanner/scan_spec.rb +36 -0
  187. data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +49 -0
  188. data/runtime/spec/opal/opal/defined_spec.rb +15 -0
  189. data/runtime/spec/opal/opal/function_spec.rb +11 -0
  190. data/runtime/spec/opal/opal/native_spec.rb +16 -0
  191. data/runtime/spec/opal/opal/null_spec.rb +10 -0
  192. data/runtime/spec/opal/opal/number_spec.rb +11 -0
  193. data/runtime/spec/opal/opal/object_spec.rb +16 -0
  194. data/runtime/spec/opal/opal/string_spec.rb +11 -0
  195. data/runtime/spec/opal/opal/typeof_spec.rb +9 -0
  196. data/runtime/spec/opal/opal/undefined_spec.rb +10 -0
  197. data/runtime/spec/opal/true/case_compare_spec.rb +12 -0
  198. data/runtime/spec/opal/true/class_spec.rb +10 -0
  199. data/runtime/spec/spec_helper.rb +25 -0
  200. data/runtime/stdlib/base64.rb +91 -0
  201. data/runtime/stdlib/date.rb +4 -0
  202. data/{stdlib → runtime/stdlib}/dev.rb +0 -0
  203. data/runtime/stdlib/forwardable.rb +33 -0
  204. data/runtime/stdlib/optparse.rb +0 -0
  205. data/runtime/stdlib/pp.rb +6 -0
  206. data/{stdlib → runtime/stdlib}/racc/parser.rb +0 -0
  207. data/runtime/stdlib/rbconfig.rb +0 -0
  208. data/runtime/stdlib/si.rb +17 -0
  209. data/runtime/stdlib/strscan.rb +53 -0
  210. data/runtime/stdlib/uri.rb +111 -0
  211. data/runtime/stdlib/uri/common.rb +1014 -0
  212. data/runtime/stdlib/uri/ftp.rb +261 -0
  213. data/runtime/stdlib/uri/generic.rb +1599 -0
  214. data/runtime/stdlib/uri/http.rb +106 -0
  215. data/runtime/stdlib/uri/https.rb +22 -0
  216. data/runtime/stdlib/uri/ldap.rb +260 -0
  217. data/runtime/stdlib/uri/ldaps.rb +20 -0
  218. data/runtime/stdlib/uri/mailto.rb +280 -0
  219. data/spec/builder/build_source_spec.rb +52 -0
  220. data/spec/builder/fixtures/build_source/adam.rb +0 -0
  221. data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
  222. data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  223. data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  224. data/spec/builder/fixtures/build_source/beynon.rb +0 -0
  225. data/spec/builder/fixtures/build_source/charles.js +0 -0
  226. data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
  227. data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
  228. data/spec/builder/fixtures/build_source/foo/x.js +0 -0
  229. data/spec/builder/fixtures/build_source/foo/y.js +0 -0
  230. data/spec/builder/output_path_spec.rb +50 -0
  231. data/spec/grammar/alias_spec.rb +26 -0
  232. data/spec/grammar/and_spec.rb +13 -0
  233. data/spec/grammar/array_spec.rb +22 -0
  234. data/spec/grammar/attrasgn_spec.rb +28 -0
  235. data/spec/grammar/begin_spec.rb +38 -0
  236. data/spec/grammar/block_spec.rb +12 -0
  237. data/spec/grammar/break_spec.rb +17 -0
  238. data/spec/grammar/call_spec.rb +58 -0
  239. data/spec/grammar/class_spec.rb +35 -0
  240. data/spec/grammar/const_spec.rb +13 -0
  241. data/spec/grammar/cvar_spec.rb +11 -0
  242. data/spec/grammar/def_spec.rb +60 -0
  243. data/spec/grammar/false_spec.rb +17 -0
  244. data/spec/grammar/file_spec.rb +7 -0
  245. data/spec/grammar/gvar_spec.rb +13 -0
  246. data/spec/grammar/hash_spec.rb +17 -0
  247. data/spec/grammar/iasgn_spec.rb +9 -0
  248. data/spec/grammar/if_spec.rb +26 -0
  249. data/spec/grammar/iter_spec.rb +59 -0
  250. data/spec/grammar/ivar_spec.rb +9 -0
  251. data/spec/grammar/lasgn_spec.rb +8 -0
  252. data/spec/grammar/line_spec.rb +8 -0
  253. data/spec/grammar/lvar_spec.rb +38 -0
  254. data/spec/grammar/module_spec.rb +27 -0
  255. data/spec/grammar/nil_spec.rb +17 -0
  256. data/spec/grammar/not_spec.rb +27 -0
  257. data/spec/grammar/op_asgn1_spec.rb +23 -0
  258. data/spec/grammar/op_asgn2_spec.rb +23 -0
  259. data/spec/grammar/or_spec.rb +13 -0
  260. data/spec/grammar/return_spec.rb +17 -0
  261. data/spec/grammar/sclass_spec.rb +20 -0
  262. data/spec/grammar/self_spec.rb +17 -0
  263. data/spec/grammar/str_spec.rb +96 -0
  264. data/spec/grammar/super_spec.rb +20 -0
  265. data/spec/grammar/true_spec.rb +17 -0
  266. data/spec/grammar/undef_spec.rb +15 -0
  267. data/spec/grammar/unless_spec.rb +13 -0
  268. data/spec/grammar/while_spec.rb +15 -0
  269. data/spec/grammar/xstr_spec.rb +116 -0
  270. data/spec/grammar/yield_spec.rb +20 -0
  271. data/spec/spec_helper.rb +9 -0
  272. metadata +346 -21
  273. data/lib/opal/bundle.rb +0 -34
  274. data/lib/opal/lexer.rb +0 -902
  275. data/lib/opal/nodes.rb +0 -2150
  276. data/lib/opal/parser.rb +0 -4894
  277. data/lib/opal/rake/bundle_task.rb +0 -63
  278. data/opal-parser.js +0 -8343
  279. data/stdlib/strscan.rb +0 -52
  280. data/templates/init/Rakefile +0 -7
  281. data/templates/init/index.html +0 -17
  282. data/templates/init/lib/__NAME__.rb +0 -2
@@ -0,0 +1,185 @@
1
+ class String
2
+ def self.new(str = '')
3
+ str.to_s
4
+ end
5
+
6
+ def <(other)
7
+ `this < other`
8
+ end
9
+
10
+ def <=(other)
11
+ `this <= other`
12
+ end
13
+
14
+ def >(other)
15
+ `this > other`
16
+ end
17
+
18
+ def >=(other)
19
+ `this >= other`
20
+ end
21
+
22
+ def +(other)
23
+ `this + other`
24
+ end
25
+
26
+ def [](index, length)
27
+ `this.substr(index, length)`
28
+ end
29
+
30
+ def ==(other)
31
+ `this.valueOf() === other.valueOf()`
32
+ end
33
+
34
+ def =~(other)
35
+ %x{
36
+ if (typeof other === 'string') {
37
+ raise(RubyTypeError, 'string given');
38
+ }
39
+
40
+ return #{other =~ self};
41
+ }
42
+ end
43
+
44
+ def <=>(other)
45
+ %x{
46
+ if (typeof other !== 'string') {
47
+ return nil;
48
+ }
49
+
50
+ return this > other ? 1 : (this < other ? -1 : 0);
51
+ }
52
+ end
53
+
54
+ def capitalize
55
+ `this.charAt(0).toUpperCase() + this.substr(1).toLowerCase()`
56
+ end
57
+
58
+ def casecmp(other)
59
+ %x{
60
+ if (typeof other !== 'string') {
61
+ return other;
62
+ }
63
+
64
+ var a = this.toLowerCase(),
65
+ b = other.toLowerCase();
66
+
67
+ return a > b ? 1 : (a < b ? -1 : 0);
68
+ }
69
+ end
70
+
71
+ def downcase
72
+ `this.toLowerCase()`
73
+ end
74
+
75
+ def end_with?(suffix)
76
+ `this.lastIndexOf(suffix) === this.length - suffix.length`
77
+ end
78
+
79
+ def empty?
80
+ `this.length === 0`
81
+ end
82
+
83
+ def gsub(pattern, replace = undefined, &block)
84
+ %x{
85
+ var re = pattern.toString();
86
+ re = re.substr(1, re.lastIndexOf('/') - 1);
87
+ re = new RegExp(re, 'g');
88
+
89
+ return #{sub re, replace, &block};
90
+ }
91
+ end
92
+
93
+ def hash
94
+ `this.toString()`
95
+ end
96
+
97
+ def include?(other)
98
+ `this.indexOf(other) !== -1`
99
+ end
100
+
101
+ def index(substr)
102
+ %x{
103
+ var result = this.indexOf(substr);
104
+ return result === -1 ? nil : result
105
+ }
106
+ end
107
+
108
+ def inspect
109
+ `string_inspect(this)`
110
+ end
111
+
112
+ def intern
113
+ self
114
+ end
115
+
116
+ def length
117
+ `this.length`
118
+ end
119
+
120
+ def lstrip
121
+ `this.replace(/^\s*/, '')`
122
+ end
123
+
124
+ def next
125
+ `String.fromCharCode(this.charCodeAt(0))`
126
+ end
127
+
128
+ def reverse
129
+ `this.split('').reverse().join('')`
130
+ end
131
+
132
+ def split(split, limit = undefined)
133
+ `this.split(split, limit)`
134
+ end
135
+
136
+ def start_with?(prefix)
137
+ `this.indexOf(prefix) === 0`
138
+ end
139
+
140
+ def sub(pattern, replace = undefined, &block)
141
+ %x{
142
+ if (block !== nil) {
143
+ return this.replace(pattern, function(str) {
144
+ return $yield.call($context, null, str);
145
+ });
146
+ }
147
+ else {
148
+ return this.replace(pattern, replace);
149
+ }
150
+ }
151
+ end
152
+
153
+ alias_method :succ, :next
154
+
155
+ def to_f
156
+ `parseFloat(this)`
157
+ end
158
+
159
+ def to_i(base = 10)
160
+ `parseInt(this, base)`
161
+ end
162
+
163
+ def to_native
164
+ `this.valueOf()`
165
+ end
166
+
167
+ def to_proc
168
+ %x{
169
+ var self = this;
170
+ return function(iter, arg) { return arg['m$' + self](); };
171
+ }
172
+ end
173
+
174
+ def to_s
175
+ `this.toString()`
176
+ end
177
+
178
+ alias_method :to_sym, :intern
179
+
180
+ def upcase
181
+ `this.toUpperCase()`
182
+ end
183
+ end
184
+
185
+ Symbol = String
@@ -0,0 +1,97 @@
1
+ class Struct
2
+ def self.new(name, *args)
3
+ return super unless self == Struct
4
+
5
+ if name.is_a?(String)
6
+ Struct.const_set(name, new(*args))
7
+ else
8
+ args.unshift name
9
+
10
+ Class.new(self) {
11
+ args.each { |name| define_struct_attribute name }
12
+ }
13
+ end
14
+ end
15
+
16
+ def self.define_struct_attribute(name)
17
+ members << name
18
+
19
+ define_method name do
20
+ instance_variable_get "@#{name}"
21
+ end
22
+
23
+ define_method "#{name}=" do |value|
24
+ instance_variable_set "@#{name}", value
25
+ end
26
+ end
27
+
28
+ def self.members
29
+ @members ||= []
30
+ end
31
+
32
+ include Enumerable
33
+
34
+ def initialize(*args)
35
+ members.each_with_index {|name, index|
36
+ instance_variable_set "@#{name}", args[index]
37
+ }
38
+ end
39
+
40
+ def members
41
+ self.class.members
42
+ end
43
+
44
+ def [](name)
45
+ if name.is_a?(Integer)
46
+ raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
47
+
48
+ name = members[name]
49
+ else
50
+ raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
51
+ end
52
+
53
+ instance_variable_get "@#{name}"
54
+ end
55
+
56
+ def []=(name, value)
57
+ if name.is_a?(Integer)
58
+ raise IndexError, "offset #{name} too large for struct(size:#{members.size})" if name >= members.size
59
+
60
+ name = members[name]
61
+ else
62
+ raise NameError, "no member '#{name}' in struct" unless members.include?(name.to_sym)
63
+ end
64
+
65
+ instance_variable_set "@#{name}", value
66
+ end
67
+
68
+ def each
69
+ return enum_for :each unless block_given?
70
+
71
+ members.each { |name| yield self[name] }
72
+ end
73
+
74
+ def each_pair
75
+ return enum_for :each_pair unless block_given?
76
+
77
+ members.each { |name| yield name, self[name] }
78
+ end
79
+
80
+ def eql?(other)
81
+ hash == other.hash || other.each_with_index.all? {|object, index|
82
+ self[members[index]] == object
83
+ }
84
+ end
85
+
86
+ def length
87
+ members.length
88
+ end
89
+
90
+ alias size length
91
+
92
+ def to_a
93
+ members.map { |name| self[name] }
94
+ end
95
+
96
+ alias values to_a
97
+ end
@@ -0,0 +1,196 @@
1
+ class Time
2
+ include Native
3
+ include Comparable
4
+
5
+ def self.at(seconds, frac = 0)
6
+ from_native(`new Date(seconds * 1000 + frac)`)
7
+ end
8
+
9
+ def self.now
10
+ from_native(`new Date()`)
11
+ end
12
+
13
+ def initialize(year = nil, month = nil, day = nil, hour = nil, min = nil, sec = nil, utc_offset = nil)
14
+ if year
15
+ super(`new Date(#{year.to_native}, #{month.to_native}, #{day.to_native}, #{hour.to_native}, #{min.to_native}, #{sec.to_native})`)
16
+ else
17
+ super(`new Date()`)
18
+ end
19
+ end
20
+
21
+ def +(other)
22
+ from_native(`new Date(#{to_f + other.to_f})`)
23
+ end
24
+
25
+ def -(other)
26
+ from_native(`new Date(#{to_f - other.to_f})`)
27
+ end
28
+
29
+ def <=>(other)
30
+ to_f <=> other.to_f
31
+ end
32
+
33
+ def asctime
34
+ raise NotImplementedError
35
+ end
36
+
37
+ alias ctime asctime
38
+
39
+ def day
40
+ `#@native.getDate()`
41
+ end
42
+
43
+ def dst?
44
+ raise NotImplementedError
45
+ end
46
+
47
+ def eql?(other)
48
+ other.is_a?(Time) && (self <=> other).zero?
49
+ end
50
+
51
+ def friday?
52
+ wday == 5
53
+ end
54
+
55
+ def getgm
56
+ raise NotImplementedError
57
+ end
58
+
59
+ def getlocal (*)
60
+ raise NotImplementedError
61
+ end
62
+
63
+ alias getutc getgm
64
+
65
+ def gmt?
66
+ raise NotImplementedError
67
+ end
68
+
69
+ def gmt_offset
70
+ raise NotImplementedError
71
+ end
72
+
73
+ def gmtime
74
+ raise NotImplementedError
75
+ end
76
+
77
+ alias gmtoff gmt_offset
78
+
79
+ def hour
80
+ `#@native.getHours()`
81
+ end
82
+
83
+ alias isdst dst?
84
+
85
+ def localtime (*)
86
+ raise NotImplementedError
87
+ end
88
+
89
+ alias mday day
90
+
91
+ def min
92
+ `#@native.getMinutes()`
93
+ end
94
+
95
+ def mon
96
+ `#@native.getMonth() + 1`
97
+ end
98
+
99
+ def monday?
100
+ wday == 1
101
+ end
102
+
103
+ alias month mon
104
+
105
+ def nsec
106
+ raise NotImplementedError
107
+ end
108
+
109
+ def round (*)
110
+ raise NotImplementedError
111
+ end
112
+
113
+ def saturday?
114
+ wday == 6
115
+ end
116
+
117
+ def sec
118
+ `#@native.getSeconds()`
119
+ end
120
+
121
+ def strftime (string)
122
+ raise NotImplementedError
123
+ end
124
+
125
+ def subsec
126
+ raise NotImplementedError
127
+ end
128
+
129
+ def sunday?
130
+ wday == 0
131
+ end
132
+
133
+ def thursday?
134
+ wday == 4
135
+ end
136
+
137
+ def to_a
138
+ raise NotImplementedError
139
+ end
140
+
141
+ def to_f
142
+ `#@native.getTime() / 1000`
143
+ end
144
+
145
+ def to_i
146
+ `parseInt(#@native.getTime() / 1000)`
147
+ end
148
+
149
+ def to_r
150
+ raise NotImplementedError
151
+ end
152
+
153
+ def to_s
154
+ raise NotImplementedError
155
+ end
156
+
157
+ def tuesday?
158
+ wday == 2
159
+ end
160
+
161
+ alias tv_nsec nsec
162
+
163
+ alias tv_sec to_i
164
+
165
+ def tv_usec
166
+ raise NotImplementedError
167
+ end
168
+
169
+ alias usec tv_usec
170
+
171
+ alias utc gmtime
172
+
173
+ alias utc? gmt?
174
+
175
+ alias utc_offset gmt_offset
176
+
177
+ def wday
178
+ `#@native.getDay()`
179
+ end
180
+
181
+ def wednesday?
182
+ wday == 3
183
+ end
184
+
185
+ def yday
186
+ raise NotImplementedError
187
+ end
188
+
189
+ def year
190
+ `#@native.getFullYear()`
191
+ end
192
+
193
+ def zone
194
+ raise NotImplementedError
195
+ end
196
+ end