iv-phonic 0.1.1 → 0.1.2
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/Manifest.txt +45 -0
- data/Rakefile +6 -1
- data/ext/include/iv/about.h +7 -0
- data/ext/include/iv/ast_factory.h +2 -1
- data/ext/include/iv/byteorder.h +20 -0
- data/ext/include/iv/dtoa.h +83 -2
- data/ext/include/iv/netlib-dtoa.h +4320 -0
- data/ext/include/iv/parser.h +35 -4
- data/ext/iv/phonic/README +34 -0
- data/ext/iv/phonic/SConscript +8 -0
- data/ext/iv/phonic/ast_fwd.h +16 -2
- data/ext/iv/phonic/cached-powers.h +119 -0
- data/ext/iv/phonic/checks.cc +57 -0
- data/ext/iv/phonic/checks.h +93 -0
- data/ext/iv/phonic/conversions.cc +123 -0
- data/ext/iv/phonic/conversions.h +41 -0
- data/ext/iv/phonic/creator.h +55 -53
- data/ext/iv/phonic/diy-fp.cc +58 -0
- data/ext/iv/phonic/diy-fp.h +117 -0
- data/ext/iv/phonic/double.h +169 -0
- data/ext/iv/phonic/dtoa.h +81 -0
- data/ext/iv/phonic/extconf.rb +1 -0
- data/ext/iv/phonic/factory.h +3 -1
- data/ext/iv/phonic/fast-dtoa.cc +505 -0
- data/ext/iv/phonic/fast-dtoa.h +58 -0
- data/ext/iv/phonic/globals.h +69 -0
- data/ext/iv/phonic/include-v8.h +59 -0
- data/ext/iv/phonic/platform.cc +111 -0
- data/ext/iv/phonic/platform.h +100 -0
- data/ext/iv/phonic/powers-ten.h +2461 -0
- data/ext/iv/phonic/utils.cc +91 -0
- data/ext/iv/phonic/utils.h +165 -0
- data/ext/iv/phonic/v8-dtoa.cc +79 -0
- data/ext/iv/phonic/v8.h +51 -0
- data/test/test_iv_phonic.rb +1 -1
- metadata +26 -1
@@ -0,0 +1,41 @@
|
|
1
|
+
// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
3
|
+
// modification, are permitted provided that the following conditions are
|
4
|
+
// met:
|
5
|
+
//
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
9
|
+
// copyright notice, this list of conditions and the following
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
11
|
+
// with the distribution.
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
13
|
+
// contributors may be used to endorse or promote products derived
|
14
|
+
// from this software without specific prior written permission.
|
15
|
+
//
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
|
28
|
+
#ifndef V8_CONVERSIONS_H_
|
29
|
+
#define V8_CONVERSIONS_H_
|
30
|
+
|
31
|
+
namespace v8 {
|
32
|
+
namespace internal {
|
33
|
+
|
34
|
+
// Converts a double to a string value according to ECMA-262 9.8.1.
|
35
|
+
// The buffer should be large enough for any floating point number.
|
36
|
+
// 100 characters is enough.
|
37
|
+
const char* DoubleToCString(double value, char* buffer, int buflen);
|
38
|
+
|
39
|
+
} } // namespace v8::internal
|
40
|
+
|
41
|
+
#endif // V8_CONVERSIONS_H_
|
data/ext/iv/phonic/creator.h
CHANGED
@@ -28,7 +28,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
28
28
|
|
29
29
|
void Visit(const Block* stmt) {
|
30
30
|
VALUE hash = rb_hash_new();
|
31
|
-
rb_hash_aset(hash, SYM("type"),
|
31
|
+
rb_hash_aset(hash, SYM("type"), SYM("Block"));
|
32
32
|
VALUE array = rb_ary_new();
|
33
33
|
for (Statements::const_iterator it = stmt->body().begin(),
|
34
34
|
last = stmt->body().end(); it != last; ++it) {
|
@@ -42,7 +42,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
42
42
|
|
43
43
|
void Visit(const FunctionStatement* stmt) {
|
44
44
|
VALUE hash = rb_hash_new();
|
45
|
-
rb_hash_aset(hash, SYM("type"),
|
45
|
+
rb_hash_aset(hash, SYM("type"), SYM("FunctionStatement"));
|
46
46
|
Visit(stmt->function());
|
47
47
|
rb_hash_aset(hash, SYM("body"), ret_);
|
48
48
|
SetLocation(hash, stmt);
|
@@ -51,7 +51,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
51
51
|
|
52
52
|
void Visit(const FunctionDeclaration* decl) {
|
53
53
|
VALUE hash = rb_hash_new();
|
54
|
-
rb_hash_aset(hash, SYM("type"),
|
54
|
+
rb_hash_aset(hash, SYM("type"), SYM("FunctionDeclaration"));
|
55
55
|
Visit(decl->function());
|
56
56
|
rb_hash_aset(hash, SYM("body"), ret_);
|
57
57
|
SetLocation(hash, decl);
|
@@ -60,7 +60,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
60
60
|
|
61
61
|
void Visit(const VariableStatement* stmt) {
|
62
62
|
VALUE hash = rb_hash_new();
|
63
|
-
rb_hash_aset(hash, SYM("type"),
|
63
|
+
rb_hash_aset(hash, SYM("type"), SYM("VariableStatement"));
|
64
64
|
rb_hash_aset(hash, SYM("const"), stmt->IsConst() ? Qtrue : Qfalse);
|
65
65
|
VALUE array = rb_ary_new();
|
66
66
|
for (Declarations::const_iterator it = stmt->decls().begin(),
|
@@ -75,7 +75,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
75
75
|
|
76
76
|
void Visit(const Declaration* decl) {
|
77
77
|
VALUE hash = rb_hash_new();
|
78
|
-
rb_hash_aset(hash, SYM("type"),
|
78
|
+
rb_hash_aset(hash, SYM("type"), SYM("Declaration"));
|
79
79
|
Visit(decl->name());
|
80
80
|
rb_hash_aset(hash, SYM("name"), ret_);
|
81
81
|
if (decl->expr()) {
|
@@ -88,14 +88,14 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
88
88
|
|
89
89
|
void Visit(const EmptyStatement* stmt) {
|
90
90
|
VALUE hash = rb_hash_new();
|
91
|
-
rb_hash_aset(hash, SYM("type"),
|
91
|
+
rb_hash_aset(hash, SYM("type"), SYM("EmptyStatement"));
|
92
92
|
SetLocation(hash, stmt);
|
93
93
|
ret_ = hash;
|
94
94
|
}
|
95
95
|
|
96
96
|
void Visit(const IfStatement* stmt) {
|
97
97
|
VALUE hash = rb_hash_new();
|
98
|
-
rb_hash_aset(hash, SYM("type"),
|
98
|
+
rb_hash_aset(hash, SYM("type"), SYM("IfStatement"));
|
99
99
|
stmt->cond()->Accept(this);
|
100
100
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
101
101
|
stmt->then_statement()->Accept(this);
|
@@ -110,7 +110,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
110
110
|
|
111
111
|
void Visit(const DoWhileStatement* stmt) {
|
112
112
|
VALUE hash = rb_hash_new();
|
113
|
-
rb_hash_aset(hash, SYM("type"),
|
113
|
+
rb_hash_aset(hash, SYM("type"), SYM("DoWhileStatement"));
|
114
114
|
stmt->cond()->Accept(this);
|
115
115
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
116
116
|
stmt->body()->Accept(this);
|
@@ -121,7 +121,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
121
121
|
|
122
122
|
void Visit(const WhileStatement* stmt) {
|
123
123
|
VALUE hash = rb_hash_new();
|
124
|
-
rb_hash_aset(hash, SYM("type"),
|
124
|
+
rb_hash_aset(hash, SYM("type"), SYM("WhileStatement"));
|
125
125
|
stmt->cond()->Accept(this);
|
126
126
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
127
127
|
stmt->body()->Accept(this);
|
@@ -132,7 +132,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
132
132
|
|
133
133
|
void Visit(const ForStatement* stmt) {
|
134
134
|
VALUE hash = rb_hash_new();
|
135
|
-
rb_hash_aset(hash, SYM("type"),
|
135
|
+
rb_hash_aset(hash, SYM("type"), SYM("ForStatement"));
|
136
136
|
if (stmt->init()) {
|
137
137
|
stmt->init()->Accept(this);
|
138
138
|
rb_hash_aset(hash, SYM("init"), ret_);
|
@@ -153,7 +153,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
153
153
|
|
154
154
|
void Visit(const ForInStatement* stmt) {
|
155
155
|
VALUE hash = rb_hash_new();
|
156
|
-
rb_hash_aset(hash, SYM("type"),
|
156
|
+
rb_hash_aset(hash, SYM("type"), SYM("ForInStatement"));
|
157
157
|
stmt->each()->Accept(this);
|
158
158
|
rb_hash_aset(hash, SYM("each"), ret_);
|
159
159
|
stmt->enumerable()->Accept(this);
|
@@ -166,7 +166,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
166
166
|
|
167
167
|
void Visit(const ContinueStatement* stmt) {
|
168
168
|
VALUE hash = rb_hash_new();
|
169
|
-
rb_hash_aset(hash, SYM("type"),
|
169
|
+
rb_hash_aset(hash, SYM("type"), SYM("ContinueStatement"));
|
170
170
|
if (stmt->label()) {
|
171
171
|
stmt->label()->Accept(this);
|
172
172
|
rb_hash_aset(hash, SYM("label"), ret_);
|
@@ -177,7 +177,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
177
177
|
|
178
178
|
void Visit(const BreakStatement* stmt) {
|
179
179
|
VALUE hash = rb_hash_new();
|
180
|
-
rb_hash_aset(hash, SYM("type"),
|
180
|
+
rb_hash_aset(hash, SYM("type"), SYM("BreakStatement"));
|
181
181
|
if (stmt->label()) {
|
182
182
|
stmt->label()->Accept(this);
|
183
183
|
rb_hash_aset(hash, SYM("label"), ret_);
|
@@ -188,7 +188,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
188
188
|
|
189
189
|
void Visit(const ReturnStatement* stmt) {
|
190
190
|
VALUE hash = rb_hash_new();
|
191
|
-
rb_hash_aset(hash, SYM("type"),
|
191
|
+
rb_hash_aset(hash, SYM("type"), SYM("ReturnStatement"));
|
192
192
|
stmt->expr()->Accept(this);
|
193
193
|
rb_hash_aset(hash, SYM("expr"), ret_);
|
194
194
|
SetLocation(hash, stmt);
|
@@ -197,7 +197,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
197
197
|
|
198
198
|
void Visit(const WithStatement* stmt) {
|
199
199
|
VALUE hash = rb_hash_new();
|
200
|
-
rb_hash_aset(hash, SYM("type"),
|
200
|
+
rb_hash_aset(hash, SYM("type"), SYM("WithStatement"));
|
201
201
|
stmt->context()->Accept(this);
|
202
202
|
rb_hash_aset(hash, SYM("context"), ret_);
|
203
203
|
stmt->body()->Accept(this);
|
@@ -208,7 +208,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
208
208
|
|
209
209
|
void Visit(const LabelledStatement* stmt) {
|
210
210
|
VALUE hash = rb_hash_new();
|
211
|
-
rb_hash_aset(hash, SYM("type"),
|
211
|
+
rb_hash_aset(hash, SYM("type"), SYM("LabelledStatement"));
|
212
212
|
stmt->label()->Accept(this);
|
213
213
|
rb_hash_aset(hash, SYM("label"), ret_);
|
214
214
|
stmt->body()->Accept(this);
|
@@ -219,7 +219,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
219
219
|
|
220
220
|
void Visit(const SwitchStatement* stmt) {
|
221
221
|
VALUE hash = rb_hash_new();
|
222
|
-
rb_hash_aset(hash, SYM("type"),
|
222
|
+
rb_hash_aset(hash, SYM("type"), SYM("SwitchStatement"));
|
223
223
|
stmt->expr()->Accept(this);
|
224
224
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
225
225
|
VALUE array = rb_ary_new();
|
@@ -235,10 +235,11 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
235
235
|
|
236
236
|
void Visit(const CaseClause* cl) {
|
237
237
|
VALUE hash = rb_hash_new();
|
238
|
+
rb_hash_aset(hash, SYM("type"), SYM("CaseClause"));
|
238
239
|
if (cl->IsDefault()) {
|
239
|
-
rb_hash_aset(hash, SYM("
|
240
|
+
rb_hash_aset(hash, SYM("kind"), SYM("Default"));
|
240
241
|
} else {
|
241
|
-
rb_hash_aset(hash, SYM("
|
242
|
+
rb_hash_aset(hash, SYM("kind"), SYM("Case"));
|
242
243
|
cl->expr()->Accept(this);
|
243
244
|
rb_hash_aset(hash, SYM("expr"), ret_);
|
244
245
|
}
|
@@ -255,28 +256,28 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
255
256
|
|
256
257
|
void Visit(const ThrowStatement* stmt) {
|
257
258
|
VALUE hash = rb_hash_new();
|
258
|
-
rb_hash_aset(hash, SYM("type"),
|
259
|
+
rb_hash_aset(hash, SYM("type"), SYM("ThrowStatement"));
|
259
260
|
SetLocation(hash, stmt);
|
260
261
|
ret_ = hash;
|
261
262
|
}
|
262
263
|
|
263
264
|
void Visit(const TryStatement* stmt) {
|
264
265
|
VALUE hash = rb_hash_new();
|
265
|
-
rb_hash_aset(hash, SYM("type"),
|
266
|
+
rb_hash_aset(hash, SYM("type"), SYM("TryStatement"));
|
266
267
|
SetLocation(hash, stmt);
|
267
268
|
ret_ = hash;
|
268
269
|
}
|
269
270
|
|
270
271
|
void Visit(const DebuggerStatement* stmt) {
|
271
272
|
VALUE hash = rb_hash_new();
|
272
|
-
rb_hash_aset(hash, SYM("type"),
|
273
|
+
rb_hash_aset(hash, SYM("type"), SYM("DebuggerStatement"));
|
273
274
|
SetLocation(hash, stmt);
|
274
275
|
ret_ = hash;
|
275
276
|
}
|
276
277
|
|
277
278
|
void Visit(const ExpressionStatement* stmt) {
|
278
279
|
VALUE hash = rb_hash_new();
|
279
|
-
rb_hash_aset(hash, SYM("type"),
|
280
|
+
rb_hash_aset(hash, SYM("type"), SYM("ExpressionStatement"));
|
280
281
|
stmt->expr()->Accept(this);
|
281
282
|
rb_hash_aset(hash, SYM("body"), ret_);
|
282
283
|
SetLocation(hash, stmt);
|
@@ -285,7 +286,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
285
286
|
|
286
287
|
void Visit(const Assignment* expr) {
|
287
288
|
VALUE hash = rb_hash_new();
|
288
|
-
rb_hash_aset(hash, SYM("type"),
|
289
|
+
rb_hash_aset(hash, SYM("type"), SYM("Assignment"));
|
289
290
|
rb_hash_aset(hash, SYM("op"),
|
290
291
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
291
292
|
expr->left()->Accept(this);
|
@@ -298,7 +299,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
298
299
|
|
299
300
|
void Visit(const BinaryOperation* expr) {
|
300
301
|
VALUE hash = rb_hash_new();
|
301
|
-
rb_hash_aset(hash, SYM("type"),
|
302
|
+
rb_hash_aset(hash, SYM("type"), SYM("BinaryOperation"));
|
302
303
|
rb_hash_aset(hash, SYM("op"),
|
303
304
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
304
305
|
expr->left()->Accept(this);
|
@@ -311,7 +312,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
311
312
|
|
312
313
|
void Visit(const ConditionalExpression* expr) {
|
313
314
|
VALUE hash = rb_hash_new();
|
314
|
-
rb_hash_aset(hash, SYM("type"),
|
315
|
+
rb_hash_aset(hash, SYM("type"), SYM("ConditionalExpression"));
|
315
316
|
expr->cond()->Accept(this);
|
316
317
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
317
318
|
expr->left()->Accept(this);
|
@@ -324,7 +325,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
324
325
|
|
325
326
|
void Visit(const UnaryOperation* expr) {
|
326
327
|
VALUE hash = rb_hash_new();
|
327
|
-
rb_hash_aset(hash, SYM("type"),
|
328
|
+
rb_hash_aset(hash, SYM("type"), SYM("UnaryOperation"));
|
328
329
|
rb_hash_aset(hash, SYM("op"),
|
329
330
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
330
331
|
expr->expr()->Accept(this);
|
@@ -335,7 +336,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
335
336
|
|
336
337
|
void Visit(const PostfixExpression* expr) {
|
337
338
|
VALUE hash = rb_hash_new();
|
338
|
-
rb_hash_aset(hash, SYM("type"),
|
339
|
+
rb_hash_aset(hash, SYM("type"), SYM("PostfixExpression"));
|
339
340
|
rb_hash_aset(hash, SYM("op"),
|
340
341
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
341
342
|
expr->expr()->Accept(this);
|
@@ -346,7 +347,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
346
347
|
|
347
348
|
void Visit(const StringLiteral* literal) {
|
348
349
|
VALUE hash = rb_hash_new();
|
349
|
-
rb_hash_aset(hash, SYM("type"),
|
350
|
+
rb_hash_aset(hash, SYM("type"), SYM("StringLiteral"));
|
350
351
|
const StringLiteral::value_type& str = literal->value();
|
351
352
|
rb_hash_aset(hash, SYM("value"),
|
352
353
|
Encoding::ConvertToDefaultInternal(
|
@@ -360,7 +361,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
360
361
|
|
361
362
|
void Visit(const NumberLiteral* literal) {
|
362
363
|
VALUE hash = rb_hash_new();
|
363
|
-
rb_hash_aset(hash, SYM("type"),
|
364
|
+
rb_hash_aset(hash, SYM("type"), SYM("NumberLiteral"));
|
364
365
|
rb_hash_aset(hash, SYM("value"), rb_float_new(literal->value()));
|
365
366
|
SetLocation(hash, literal);
|
366
367
|
ret_ = hash;
|
@@ -368,8 +369,15 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
368
369
|
|
369
370
|
void Visit(const Identifier* literal) {
|
370
371
|
VALUE hash = rb_hash_new();
|
371
|
-
rb_hash_aset(hash, SYM("type"),
|
372
|
+
rb_hash_aset(hash, SYM("type"), SYM("Identifier"));
|
372
373
|
const Identifier::value_type& str = literal->value();
|
374
|
+
if (literal->type() == core::Token::IDENTIFIER) {
|
375
|
+
rb_hash_aset(hash, SYM("kind"), SYM("Identifier"));
|
376
|
+
} else if (literal->type() == core::Token::NUMBER) {
|
377
|
+
rb_hash_aset(hash, SYM("kind"), SYM("Number"));
|
378
|
+
} else {
|
379
|
+
rb_hash_aset(hash, SYM("kind"), SYM("String"));
|
380
|
+
}
|
373
381
|
rb_hash_aset(hash, SYM("value"),
|
374
382
|
Encoding::ConvertToDefaultInternal(
|
375
383
|
rb_enc_str_new(
|
@@ -382,28 +390,28 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
382
390
|
|
383
391
|
void Visit(const ThisLiteral* literal) {
|
384
392
|
VALUE hash = rb_hash_new();
|
385
|
-
rb_hash_aset(hash, SYM("type"),
|
393
|
+
rb_hash_aset(hash, SYM("type"), SYM("ThisLiteral"));
|
386
394
|
SetLocation(hash, literal);
|
387
395
|
ret_ = hash;
|
388
396
|
}
|
389
397
|
|
390
398
|
void Visit(const NullLiteral* literal) {
|
391
399
|
VALUE hash = rb_hash_new();
|
392
|
-
rb_hash_aset(hash, SYM("type"),
|
400
|
+
rb_hash_aset(hash, SYM("type"), SYM("NullLiteral"));
|
393
401
|
SetLocation(hash, literal);
|
394
402
|
ret_ = hash;
|
395
403
|
}
|
396
404
|
|
397
405
|
void Visit(const TrueLiteral* literal) {
|
398
406
|
VALUE hash = rb_hash_new();
|
399
|
-
rb_hash_aset(hash, SYM("type"),
|
407
|
+
rb_hash_aset(hash, SYM("type"), SYM("TrueLiteral"));
|
400
408
|
SetLocation(hash, literal);
|
401
409
|
ret_ = hash;
|
402
410
|
}
|
403
411
|
|
404
412
|
void Visit(const FalseLiteral* literal) {
|
405
413
|
VALUE hash = rb_hash_new();
|
406
|
-
rb_hash_aset(hash, SYM("type"),
|
414
|
+
rb_hash_aset(hash, SYM("type"), SYM("FalseLiteral"));
|
407
415
|
SetLocation(hash, literal);
|
408
416
|
ret_ = hash;
|
409
417
|
}
|
@@ -411,13 +419,13 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
411
419
|
void Visit(const Undefined* literal) {
|
412
420
|
// Undefined has no location
|
413
421
|
VALUE hash = rb_hash_new();
|
414
|
-
rb_hash_aset(hash, SYM("type"),
|
422
|
+
rb_hash_aset(hash, SYM("type"), SYM("Undefined"));
|
415
423
|
ret_ = hash;
|
416
424
|
}
|
417
425
|
|
418
426
|
void Visit(const RegExpLiteral* literal) {
|
419
427
|
VALUE hash = rb_hash_new();
|
420
|
-
rb_hash_aset(hash, SYM("type"),
|
428
|
+
rb_hash_aset(hash, SYM("type"), SYM("RegExpLiteral"));
|
421
429
|
const RegExpLiteral::value_type& content = literal->value();
|
422
430
|
rb_hash_aset(hash, SYM("value"),
|
423
431
|
Encoding::ConvertToDefaultInternal(
|
@@ -438,7 +446,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
438
446
|
|
439
447
|
void Visit(const ArrayLiteral* literal) {
|
440
448
|
VALUE hash = rb_hash_new();
|
441
|
-
rb_hash_aset(hash, SYM("type"),
|
449
|
+
rb_hash_aset(hash, SYM("type"), SYM("ArrayLiteral"));
|
442
450
|
VALUE array = rb_ary_new();
|
443
451
|
for (Expressions::const_iterator it = literal->items().begin(),
|
444
452
|
last = literal->items().end(); it != last; ++it) {
|
@@ -453,28 +461,22 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
453
461
|
void Visit(const ObjectLiteral* literal) {
|
454
462
|
using std::tr1::get;
|
455
463
|
VALUE hash = rb_hash_new();
|
456
|
-
rb_hash_aset(hash, SYM("type"),
|
464
|
+
rb_hash_aset(hash, SYM("type"), SYM("ObjectLiteral"));
|
457
465
|
VALUE array = rb_ary_new();
|
458
466
|
for (ObjectLiteral::Properties::const_iterator it = literal->properties().begin(),
|
459
467
|
last = literal->properties().end(); it != last; ++it) {
|
460
468
|
VALUE item = rb_hash_new();
|
461
469
|
switch (get<0>(*it)) {
|
462
470
|
case ObjectLiteral::DATA:
|
463
|
-
rb_hash_aset(item,
|
464
|
-
SYM("type"),
|
465
|
-
rb_str_new_cstr("DataProperty"));
|
471
|
+
rb_hash_aset(item, SYM("kind"), SYM("Data"));
|
466
472
|
break;
|
467
473
|
|
468
474
|
case ObjectLiteral::SET:
|
469
|
-
rb_hash_aset(item,
|
470
|
-
SYM("type"),
|
471
|
-
rb_str_new_cstr("SetterProperty"));
|
475
|
+
rb_hash_aset(item, SYM("kind"), SYM("Setter"));
|
472
476
|
break;
|
473
477
|
|
474
478
|
case ObjectLiteral::GET:
|
475
|
-
rb_hash_aset(item,
|
476
|
-
SYM("type"),
|
477
|
-
rb_str_new_cstr("GetterProperty"));
|
479
|
+
rb_hash_aset(item, SYM("kind"), SYM("Getter"));
|
478
480
|
break;
|
479
481
|
}
|
480
482
|
get<1>(*it)->Accept(this);
|
@@ -494,7 +496,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
494
496
|
|
495
497
|
void Visit(const FunctionLiteral* literal) {
|
496
498
|
VALUE hash = rb_hash_new();
|
497
|
-
rb_hash_aset(hash, SYM("type"),
|
499
|
+
rb_hash_aset(hash, SYM("type"), SYM("FunctionLiteral"));
|
498
500
|
if (literal->name()) {
|
499
501
|
Visit(literal->name());
|
500
502
|
rb_hash_aset(hash, SYM("name"), ret_);
|
@@ -523,7 +525,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
523
525
|
|
524
526
|
void Visit(const IndexAccess* expr) {
|
525
527
|
VALUE hash = rb_hash_new();
|
526
|
-
rb_hash_aset(hash, SYM("type"),
|
528
|
+
rb_hash_aset(hash, SYM("type"), SYM("IndexAccess"));
|
527
529
|
expr->target()->Accept(this);
|
528
530
|
rb_hash_aset(hash, SYM("target"), ret_);
|
529
531
|
expr->key()->Accept(this);
|
@@ -534,7 +536,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
534
536
|
|
535
537
|
void Visit(const IdentifierAccess* expr) {
|
536
538
|
VALUE hash = rb_hash_new();
|
537
|
-
rb_hash_aset(hash, SYM("type"),
|
539
|
+
rb_hash_aset(hash, SYM("type"), SYM("IdentifierAccess"));
|
538
540
|
expr->target()->Accept(this);
|
539
541
|
rb_hash_aset(hash, SYM("target"), ret_);
|
540
542
|
Visit(expr->key());
|
@@ -545,7 +547,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
545
547
|
|
546
548
|
void Visit(const FunctionCall* call) {
|
547
549
|
VALUE hash = rb_hash_new();
|
548
|
-
rb_hash_aset(hash, SYM("type"),
|
550
|
+
rb_hash_aset(hash, SYM("type"), SYM("FunctionCall"));
|
549
551
|
call->target()->Accept(this);
|
550
552
|
rb_hash_aset(hash, SYM("target"), ret_);
|
551
553
|
VALUE args = rb_ary_new();
|
@@ -561,7 +563,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
561
563
|
|
562
564
|
void Visit(const ConstructorCall* call) {
|
563
565
|
VALUE hash = rb_hash_new();
|
564
|
-
rb_hash_aset(hash, SYM("type"),
|
566
|
+
rb_hash_aset(hash, SYM("type"), SYM("ConstructorCall"));
|
565
567
|
call->target()->Accept(this);
|
566
568
|
rb_hash_aset(hash, SYM("target"), ret_);
|
567
569
|
VALUE args = rb_ary_new();
|
@@ -0,0 +1,58 @@
|
|
1
|
+
// Copyright 2010 the V8 project authors. All rights reserved.
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
3
|
+
// modification, are permitted provided that the following conditions are
|
4
|
+
// met:
|
5
|
+
//
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
9
|
+
// copyright notice, this list of conditions and the following
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
11
|
+
// with the distribution.
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
13
|
+
// contributors may be used to endorse or promote products derived
|
14
|
+
// from this software without specific prior written permission.
|
15
|
+
//
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
|
28
|
+
#include "v8.h"
|
29
|
+
|
30
|
+
#include "diy-fp.h"
|
31
|
+
|
32
|
+
namespace v8 {
|
33
|
+
namespace internal {
|
34
|
+
|
35
|
+
void DiyFp::Multiply(const DiyFp& other) {
|
36
|
+
// Simply "emulates" a 128 bit multiplication.
|
37
|
+
// However: the resulting number only contains 64 bits. The least
|
38
|
+
// significant 64 bits are only used for rounding the most significant 64
|
39
|
+
// bits.
|
40
|
+
const uint64_t kM32 = 0xFFFFFFFFu;
|
41
|
+
uint64_t a = f_ >> 32;
|
42
|
+
uint64_t b = f_ & kM32;
|
43
|
+
uint64_t c = other.f_ >> 32;
|
44
|
+
uint64_t d = other.f_ & kM32;
|
45
|
+
uint64_t ac = a * c;
|
46
|
+
uint64_t bc = b * c;
|
47
|
+
uint64_t ad = a * d;
|
48
|
+
uint64_t bd = b * d;
|
49
|
+
uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);
|
50
|
+
// By adding 1U << 31 to tmp we round the final result.
|
51
|
+
// Halfway cases will be round up.
|
52
|
+
tmp += 1U << 31;
|
53
|
+
uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
|
54
|
+
e_ += other.e_ + 64;
|
55
|
+
f_ = result_f;
|
56
|
+
}
|
57
|
+
|
58
|
+
} } // namespace v8::internal
|