iv-phonic 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|