@@ -67,62 +67,52 @@ using v8::Value;
67
67
} \
68
68
} while (0 )
69
69
70
- #define SQLITE_VALUE_TO_JS ( \
71
- from, unreachable_message, isolate, use_big_int_args, ...) \
72
- switch (sqlite3_##from##_type(__VA_ARGS__)) { \
73
- case SQLITE_INTEGER: { \
74
- sqlite3_int64 val = sqlite3_##from##_int64 (__VA_ARGS__); \
75
- if (use_big_int_args) { \
76
- return BigInt::New (isolate, val); \
77
- } else if (std::abs (val) <= kMaxSafeJsInteger ) { \
78
- return Number::New (isolate, val); \
79
- } else { \
80
- return MaybeLocal<Value>(); \
70
+ #define SQLITE_VALUE_TO_JS (from, isolate, use_big_int_args, result, ...) \
71
+ do { \
72
+ switch (sqlite3_##from##_type (__VA_ARGS__)) { \
73
+ case SQLITE_INTEGER: { \
74
+ sqlite3_int64 val = sqlite3_##from##_int64 (__VA_ARGS__); \
75
+ if (use_big_int_args) { \
76
+ result = BigInt::New (isolate, val); \
77
+ } else if (std::abs (val) <= kMaxSafeJsInteger ) { \
78
+ result = Number::New (isolate, val); \
79
+ } else { \
80
+ THROW_ERR_OUT_OF_RANGE (isolate, \
81
+ " Value is too large to be represented as a " \
82
+ " JavaScript number: %" PRId64, \
83
+ val); \
84
+ } \
85
+ break ; \
81
86
} \
82
- break ; \
83
- } \
84
- case SQLITE_FLOAT: { \
85
- return Number::New (isolate, sqlite3_##from##_double (__VA_ARGS__)); \
86
- break ; \
87
- } \
88
- case SQLITE_TEXT: { \
89
- const char * v = \
90
- reinterpret_cast <const char *>(sqlite3_##from##_text (__VA_ARGS__)); \
91
- return String::NewFromUtf8 (isolate, v).As <Value>(); \
92
- } \
93
- case SQLITE_NULL: \
94
- return Null (isolate); \
95
- case SQLITE_BLOB: { \
96
- size_t size = static_cast <size_t >(sqlite3_##from##_bytes (__VA_ARGS__)); \
97
- auto data = reinterpret_cast <const uint8_t *>( \
98
- sqlite3_##from##_blob (__VA_ARGS__)); \
99
- auto store = ArrayBuffer::NewBackingStore (isolate, size); \
100
- memcpy (store->Data (), data, size); \
101
- auto ab = ArrayBuffer::New (isolate, std::move (store)); \
102
- return Uint8Array::New (ab, 0 , size); \
87
+ case SQLITE_FLOAT: { \
88
+ result = Number::New (isolate, sqlite3_##from##_double (__VA_ARGS__)); \
89
+ break ; \
90
+ } \
91
+ case SQLITE_TEXT: { \
92
+ const char * v = \
93
+ reinterpret_cast <const char *>(sqlite3_##from##_text (__VA_ARGS__)); \
94
+ result = String::NewFromUtf8 (isolate, v).As <Value>(); \
95
+ break ; \
96
+ } \
97
+ case SQLITE_NULL: { \
98
+ result = Null (isolate); \
99
+ break ; \
100
+ } \
101
+ case SQLITE_BLOB: { \
102
+ size_t size = \
103
+ static_cast <size_t >(sqlite3_##from##_bytes (__VA_ARGS__)); \
104
+ auto data = reinterpret_cast <const uint8_t *>( \
105
+ sqlite3_##from##_blob (__VA_ARGS__)); \
106
+ auto store = ArrayBuffer::NewBackingStore (isolate, size); \
107
+ memcpy (store->Data (), data, size); \
108
+ auto ab = ArrayBuffer::New (isolate, std::move (store)); \
109
+ result = Uint8Array::New (ab, 0 , size); \
110
+ break ; \
111
+ } \
112
+ default : \
113
+ UNREACHABLE (" Bad SQLite value" ); \
103
114
} \
104
- default : \
105
- UNREACHABLE (unreachable_message); \
106
- }
107
-
108
- MaybeLocal<Value> SQLiteValueToJS (Isolate* isolate,
109
- bool use_big_int_args,
110
- sqlite3_value* sqlite_value) {
111
- SQLITE_VALUE_TO_JS (
112
- value, " Bad SQLite value" , isolate, use_big_int_args, sqlite_value);
113
- }
114
-
115
- MaybeLocal<Value> SQLiteValueToJS (Isolate* isolate,
116
- bool use_big_int_args,
117
- sqlite3_stmt* stmt,
118
- int column) {
119
- SQLITE_VALUE_TO_JS (column,
120
- " Bad SQLite column type" ,
121
- isolate,
122
- use_big_int_args,
123
- stmt,
124
- column);
125
- }
115
+ } while (0 )
126
116
127
117
inline MaybeLocal<Object> CreateSQLiteError (Isolate* isolate,
128
118
const char * message) {
@@ -413,17 +403,12 @@ void UserDefinedFunction::xFunc(sqlite3_context* ctx,
413
403
414
404
for (int i = 0 ; i < argc; ++i) {
415
405
sqlite3_value* value = argv[i];
416
- MaybeLocal<Value> js_val =
417
- SQLiteValueToJS (isolate, self->use_bigint_args_ , value);
418
-
406
+ MaybeLocal<Value> js_val = MaybeLocal<Value>();
407
+ SQLITE_VALUE_TO_JS (value, isolate, self->use_bigint_args_ , js_val, value);
419
408
if (js_val.IsEmpty ()) {
420
409
// Ignore the SQLite error because a JavaScript exception is pending.
421
410
self->db_ ->SetIgnoreNextSQLiteError (true );
422
411
sqlite3_result_error (ctx, " " , 0 );
423
- THROW_ERR_OUT_OF_RANGE (isolate,
424
- " Value is too large to be represented as a "
425
- " JavaScript number: %" PRId64,
426
- sqlite3_value_int64 (value));
427
412
return ;
428
413
}
429
414
@@ -1536,18 +1521,9 @@ bool StatementSync::BindValue(const Local<Value>& value, const int index) {
1536
1521
1537
1522
MaybeLocal<Value> StatementSync::ColumnToValue (const int column) {
1538
1523
Isolate* isolate = env ()->isolate ();
1539
- MaybeLocal<Value> js_val =
1540
- SQLiteValueToJS (isolate, use_big_ints_, statement_, column);
1541
-
1542
- if (js_val.IsEmpty ()) {
1543
- THROW_ERR_OUT_OF_RANGE (isolate,
1544
- " The value of column %d is too large to be "
1545
- " represented as a JavaScript number: %" PRId64,
1546
- column,
1547
- sqlite3_column_int64 (statement_, column));
1548
- return MaybeLocal<Value>();
1549
- }
1550
-
1524
+ MaybeLocal<Value> js_val = MaybeLocal<Value>();
1525
+ SQLITE_VALUE_TO_JS (
1526
+ column, isolate, use_big_ints_, js_val, statement_, column);
1551
1527
return js_val;
1552
1528
}
1553
1529
0 commit comments