1 /*******************************************************************************
2 Copyright (c) 2016, Michael Wallner <mike@php.net>.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *******************************************************************************/
26 #include "php_psi_stdinc.h"
31 static inline void psi_calc_cast(token_t in_type
, impl_val
*in_val
, token_t out_type
, impl_val
*out_val
)
37 out_val
->i8
= in_val
->i8
;
40 out_val
->i8
= in_val
->u8
;
43 out_val
->i8
= in_val
->i16
;
46 out_val
->i8
= in_val
->u16
;
49 out_val
->i8
= in_val
->i32
;
52 out_val
->i8
= in_val
->u32
;
55 out_val
->i8
= in_val
->i64
;
58 out_val
->i8
= in_val
->u64
;
61 out_val
->i8
= in_val
->i128
;
64 out_val
->i8
= in_val
->u128
;
67 out_val
->i8
= in_val
->fval
;
70 out_val
->i8
= in_val
->dval
;
73 case PSI_T_LONG_DOUBLE
:
74 out_val
->i8
= in_val
->ldval
;
86 out_val
->u8
= in_val
->i8
;
89 out_val
->u8
= in_val
->u8
;
92 out_val
->u8
= in_val
->i16
;
95 out_val
->u8
= in_val
->u16
;
98 out_val
->u8
= in_val
->i32
;
101 out_val
->u8
= in_val
->u32
;
104 out_val
->u8
= in_val
->i64
;
107 out_val
->u8
= in_val
->u64
;
110 out_val
->u8
= in_val
->i128
;
113 out_val
->u8
= in_val
->u128
;
116 out_val
->u8
= in_val
->fval
;
119 out_val
->u8
= in_val
->dval
;
121 # if HAVE_LONG_DOUBLE
122 case PSI_T_LONG_DOUBLE
:
123 out_val
->u8
= in_val
->ldval
;
135 out_val
->i16
= in_val
->i8
;
138 out_val
->i16
= in_val
->u8
;
141 out_val
->i16
= in_val
->i16
;
144 out_val
->i16
= in_val
->u16
;
147 out_val
->i16
= in_val
->i32
;
150 out_val
->i16
= in_val
->u32
;
153 out_val
->i16
= in_val
->i64
;
156 out_val
->i16
= in_val
->u64
;
159 out_val
->i16
= in_val
->i128
;
162 out_val
->i16
= in_val
->u128
;
165 out_val
->i16
= in_val
->fval
;
168 out_val
->i16
= in_val
->dval
;
170 # if HAVE_LONG_DOUBLE
171 case PSI_T_LONG_DOUBLE
:
172 out_val
->i16
= in_val
->ldval
;
184 out_val
->u16
= in_val
->i8
;
187 out_val
->u16
= in_val
->u8
;
190 out_val
->u16
= in_val
->i16
;
193 out_val
->u16
= in_val
->u16
;
196 out_val
->u16
= in_val
->i32
;
199 out_val
->u16
= in_val
->u32
;
202 out_val
->u16
= in_val
->i64
;
205 out_val
->u16
= in_val
->u64
;
208 out_val
->u16
= in_val
->i128
;
211 out_val
->u16
= in_val
->u128
;
214 out_val
->u16
= in_val
->fval
;
217 out_val
->u16
= in_val
->dval
;
219 # if HAVE_LONG_DOUBLE
220 case PSI_T_LONG_DOUBLE
:
221 out_val
->u16
= in_val
->ldval
;
233 out_val
->i32
= in_val
->i8
;
236 out_val
->i32
= in_val
->u8
;
239 out_val
->i32
= in_val
->i16
;
242 out_val
->i32
= in_val
->u16
;
245 out_val
->i32
= in_val
->i32
;
248 out_val
->i32
= in_val
->u32
;
251 out_val
->i32
= in_val
->i64
;
254 out_val
->i32
= in_val
->u64
;
257 out_val
->i32
= in_val
->i128
;
260 out_val
->i32
= in_val
->u128
;
263 out_val
->i32
= in_val
->fval
;
266 out_val
->i32
= in_val
->dval
;
268 # if HAVE_LONG_DOUBLE
269 case PSI_T_LONG_DOUBLE
:
270 out_val
->i32
= in_val
->ldval
;
282 out_val
->u32
= in_val
->i8
;
285 out_val
->u32
= in_val
->u8
;
288 out_val
->u32
= in_val
->i16
;
291 out_val
->u32
= in_val
->u16
;
294 out_val
->u32
= in_val
->i32
;
297 out_val
->u32
= in_val
->u32
;
300 out_val
->u32
= in_val
->i64
;
303 out_val
->u32
= in_val
->u64
;
306 out_val
->u32
= in_val
->i128
;
309 out_val
->u32
= in_val
->u128
;
312 out_val
->u32
= in_val
->fval
;
315 out_val
->u32
= in_val
->dval
;
317 # if HAVE_LONG_DOUBLE
318 case PSI_T_LONG_DOUBLE
:
319 out_val
->u32
= in_val
->ldval
;
331 out_val
->i64
= in_val
->i8
;
334 out_val
->i64
= in_val
->u8
;
337 out_val
->i64
= in_val
->i16
;
340 out_val
->i64
= in_val
->u16
;
343 out_val
->i64
= in_val
->i32
;
346 out_val
->i64
= in_val
->u32
;
349 out_val
->i64
= in_val
->i64
;
352 out_val
->i64
= in_val
->u64
;
355 out_val
->i64
= in_val
->i128
;
358 out_val
->i64
= in_val
->u128
;
361 out_val
->i64
= in_val
->fval
;
364 out_val
->i64
= in_val
->dval
;
366 # if HAVE_LONG_DOUBLE
367 case PSI_T_LONG_DOUBLE
:
368 out_val
->i64
= in_val
->ldval
;
380 out_val
->u64
= in_val
->i8
;
383 out_val
->u64
= in_val
->u8
;
386 out_val
->u64
= in_val
->i16
;
389 out_val
->u64
= in_val
->u16
;
392 out_val
->u64
= in_val
->i32
;
395 out_val
->u64
= in_val
->u32
;
398 out_val
->u64
= in_val
->i64
;
401 out_val
->u64
= in_val
->u64
;
404 out_val
->u64
= in_val
->i128
;
407 out_val
->u64
= in_val
->u128
;
410 out_val
->u64
= in_val
->fval
;
413 out_val
->u64
= in_val
->dval
;
415 # if HAVE_LONG_DOUBLE
416 case PSI_T_LONG_DOUBLE
:
417 out_val
->u64
= in_val
->ldval
;
429 out_val
->i128
= in_val
->i8
;
432 out_val
->i128
= in_val
->u8
;
435 out_val
->i128
= in_val
->i16
;
438 out_val
->i128
= in_val
->u16
;
441 out_val
->i128
= in_val
->i32
;
444 out_val
->i128
= in_val
->u32
;
447 out_val
->i128
= in_val
->i64
;
450 out_val
->i128
= in_val
->u64
;
453 out_val
->i128
= in_val
->i128
;
456 out_val
->i128
= in_val
->u128
;
459 out_val
->i128
= in_val
->fval
;
462 out_val
->i128
= in_val
->dval
;
464 # if HAVE_LONG_DOUBLE
465 case PSI_T_LONG_DOUBLE
:
466 out_val
->i128
= in_val
->ldval
;
478 out_val
->u128
= in_val
->i8
;
481 out_val
->u128
= in_val
->u8
;
484 out_val
->u128
= in_val
->i16
;
487 out_val
->u128
= in_val
->u16
;
490 out_val
->u128
= in_val
->i32
;
493 out_val
->u128
= in_val
->u32
;
496 out_val
->u128
= in_val
->i64
;
499 out_val
->u128
= in_val
->u64
;
502 out_val
->u128
= in_val
->i128
;
505 out_val
->u128
= in_val
->u128
;
508 out_val
->u128
= in_val
->fval
;
511 out_val
->u128
= in_val
->dval
;
513 # if HAVE_LONG_DOUBLE
514 case PSI_T_LONG_DOUBLE
:
515 out_val
->u128
= in_val
->ldval
;
527 out_val
->fval
= in_val
->i8
;
530 out_val
->fval
= in_val
->u8
;
533 out_val
->fval
= in_val
->i16
;
536 out_val
->fval
= in_val
->u16
;
539 out_val
->fval
= in_val
->i32
;
542 out_val
->fval
= in_val
->u32
;
545 out_val
->fval
= in_val
->i64
;
548 out_val
->fval
= in_val
->u64
;
551 out_val
->fval
= in_val
->i128
;
554 out_val
->fval
= in_val
->u128
;
557 out_val
->fval
= in_val
->fval
;
560 out_val
->fval
= in_val
->dval
;
562 # if HAVE_LONG_DOUBLE
563 case PSI_T_LONG_DOUBLE
:
564 out_val
->fval
= in_val
->ldval
;
576 out_val
->dval
= in_val
->i8
;
579 out_val
->dval
= in_val
->u8
;
582 out_val
->dval
= in_val
->i16
;
585 out_val
->dval
= in_val
->u16
;
588 out_val
->dval
= in_val
->i32
;
591 out_val
->dval
= in_val
->u32
;
594 out_val
->dval
= in_val
->i64
;
597 out_val
->dval
= in_val
->u64
;
600 out_val
->dval
= in_val
->i128
;
603 out_val
->dval
= in_val
->u128
;
606 out_val
->dval
= in_val
->fval
;
609 out_val
->dval
= in_val
->dval
;
611 # if HAVE_LONG_DOUBLE
612 case PSI_T_LONG_DOUBLE
:
613 out_val
->dval
= in_val
->ldval
;
623 case PSI_T_LONG_DOUBLE
:
626 out_val
->ldval
= in_val
->i8
;
629 out_val
->ldval
= in_val
->u8
;
632 out_val
->ldval
= in_val
->i16
;
635 out_val
->ldval
= in_val
->u16
;
638 out_val
->ldval
= in_val
->i32
;
641 out_val
->ldval
= in_val
->u32
;
644 out_val
->ldval
= in_val
->i64
;
647 out_val
->ldval
= in_val
->u64
;
650 out_val
->ldval
= in_val
->i128
;
653 out_val
->ldval
= in_val
->u128
;
656 out_val
->ldval
= in_val
->fval
;
659 out_val
->ldval
= in_val
->dval
;
661 # if HAVE_LONG_DOUBLE
662 case PSI_T_LONG_DOUBLE
:
663 out_val
->ldval
= in_val
->ldval
;