2d6f3f6dd3c2e7f9f5826f2f98ed17010426ed29
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
;
62 out_val
->i8
= in_val
->i128
;
68 out_val
->i8
= in_val
->u128
;
73 out_val
->i8
= in_val
->fval
;
76 out_val
->i8
= in_val
->dval
;
79 case PSI_T_LONG_DOUBLE
:
80 out_val
->i8
= in_val
->ldval
;
92 out_val
->u8
= in_val
->i8
;
95 out_val
->u8
= in_val
->u8
;
98 out_val
->u8
= in_val
->i16
;
101 out_val
->u8
= in_val
->u16
;
104 out_val
->u8
= in_val
->i32
;
107 out_val
->u8
= in_val
->u32
;
110 out_val
->u8
= in_val
->i64
;
113 out_val
->u8
= in_val
->u64
;
117 out_val
->u8
= in_val
->i128
;
123 out_val
->u8
= in_val
->u128
;
128 out_val
->u8
= in_val
->fval
;
131 out_val
->u8
= in_val
->dval
;
133 # if HAVE_LONG_DOUBLE
134 case PSI_T_LONG_DOUBLE
:
135 out_val
->u8
= in_val
->ldval
;
147 out_val
->i16
= in_val
->i8
;
150 out_val
->i16
= in_val
->u8
;
153 out_val
->i16
= in_val
->i16
;
156 out_val
->i16
= in_val
->u16
;
159 out_val
->i16
= in_val
->i32
;
162 out_val
->i16
= in_val
->u32
;
165 out_val
->i16
= in_val
->i64
;
168 out_val
->i16
= in_val
->u64
;
172 out_val
->i16
= in_val
->i128
;
178 out_val
->i16
= in_val
->u128
;
183 out_val
->i16
= in_val
->fval
;
186 out_val
->i16
= in_val
->dval
;
188 # if HAVE_LONG_DOUBLE
189 case PSI_T_LONG_DOUBLE
:
190 out_val
->i16
= in_val
->ldval
;
202 out_val
->u16
= in_val
->i8
;
205 out_val
->u16
= in_val
->u8
;
208 out_val
->u16
= in_val
->i16
;
211 out_val
->u16
= in_val
->u16
;
214 out_val
->u16
= in_val
->i32
;
217 out_val
->u16
= in_val
->u32
;
220 out_val
->u16
= in_val
->i64
;
223 out_val
->u16
= in_val
->u64
;
227 out_val
->u16
= in_val
->i128
;
233 out_val
->u16
= in_val
->u128
;
238 out_val
->u16
= in_val
->fval
;
241 out_val
->u16
= in_val
->dval
;
243 # if HAVE_LONG_DOUBLE
244 case PSI_T_LONG_DOUBLE
:
245 out_val
->u16
= in_val
->ldval
;
257 out_val
->i32
= in_val
->i8
;
260 out_val
->i32
= in_val
->u8
;
263 out_val
->i32
= in_val
->i16
;
266 out_val
->i32
= in_val
->u16
;
269 out_val
->i32
= in_val
->i32
;
272 out_val
->i32
= in_val
->u32
;
275 out_val
->i32
= in_val
->i64
;
278 out_val
->i32
= in_val
->u64
;
282 out_val
->i32
= in_val
->i128
;
288 out_val
->i32
= in_val
->u128
;
293 out_val
->i32
= in_val
->fval
;
296 out_val
->i32
= in_val
->dval
;
298 # if HAVE_LONG_DOUBLE
299 case PSI_T_LONG_DOUBLE
:
300 out_val
->i32
= in_val
->ldval
;
312 out_val
->u32
= in_val
->i8
;
315 out_val
->u32
= in_val
->u8
;
318 out_val
->u32
= in_val
->i16
;
321 out_val
->u32
= in_val
->u16
;
324 out_val
->u32
= in_val
->i32
;
327 out_val
->u32
= in_val
->u32
;
330 out_val
->u32
= in_val
->i64
;
333 out_val
->u32
= in_val
->u64
;
337 out_val
->u32
= in_val
->i128
;
343 out_val
->u32
= in_val
->u128
;
348 out_val
->u32
= in_val
->fval
;
351 out_val
->u32
= in_val
->dval
;
353 # if HAVE_LONG_DOUBLE
354 case PSI_T_LONG_DOUBLE
:
355 out_val
->u32
= in_val
->ldval
;
367 out_val
->i64
= in_val
->i8
;
370 out_val
->i64
= in_val
->u8
;
373 out_val
->i64
= in_val
->i16
;
376 out_val
->i64
= in_val
->u16
;
379 out_val
->i64
= in_val
->i32
;
382 out_val
->i64
= in_val
->u32
;
385 out_val
->i64
= in_val
->i64
;
388 out_val
->i64
= in_val
->u64
;
392 out_val
->i64
= in_val
->i128
;
398 out_val
->i64
= in_val
->u128
;
403 out_val
->i64
= in_val
->fval
;
406 out_val
->i64
= in_val
->dval
;
408 # if HAVE_LONG_DOUBLE
409 case PSI_T_LONG_DOUBLE
:
410 out_val
->i64
= in_val
->ldval
;
422 out_val
->u64
= in_val
->i8
;
425 out_val
->u64
= in_val
->u8
;
428 out_val
->u64
= in_val
->i16
;
431 out_val
->u64
= in_val
->u16
;
434 out_val
->u64
= in_val
->i32
;
437 out_val
->u64
= in_val
->u32
;
440 out_val
->u64
= in_val
->i64
;
443 out_val
->u64
= in_val
->u64
;
447 out_val
->u64
= in_val
->i128
;
453 out_val
->u64
= in_val
->u128
;
458 out_val
->u64
= in_val
->fval
;
461 out_val
->u64
= in_val
->dval
;
463 # if HAVE_LONG_DOUBLE
464 case PSI_T_LONG_DOUBLE
:
465 out_val
->u64
= in_val
->ldval
;
478 out_val
->i128
= in_val
->i8
;
481 out_val
->i128
= in_val
->u8
;
484 out_val
->i128
= in_val
->i16
;
487 out_val
->i128
= in_val
->u16
;
490 out_val
->i128
= in_val
->i32
;
493 out_val
->i128
= in_val
->u32
;
496 out_val
->i128
= in_val
->i64
;
499 out_val
->i128
= in_val
->u64
;
503 out_val
->i128
= in_val
->i128
;
509 out_val
->i128
= in_val
->u128
;
514 out_val
->i128
= in_val
->fval
;
517 out_val
->i128
= in_val
->dval
;
519 # if HAVE_LONG_DOUBLE
520 case PSI_T_LONG_DOUBLE
:
521 out_val
->i128
= in_val
->ldval
;
536 out_val
->u128
= in_val
->i8
;
539 out_val
->u128
= in_val
->u8
;
542 out_val
->u128
= in_val
->i16
;
545 out_val
->u128
= in_val
->u16
;
548 out_val
->u128
= in_val
->i32
;
551 out_val
->u128
= in_val
->u32
;
554 out_val
->u128
= in_val
->i64
;
557 out_val
->u128
= in_val
->u64
;
561 out_val
->u128
= in_val
->i128
;
567 out_val
->u128
= in_val
->u128
;
572 out_val
->u128
= in_val
->fval
;
575 out_val
->u128
= in_val
->dval
;
577 # if HAVE_LONG_DOUBLE
578 case PSI_T_LONG_DOUBLE
:
579 out_val
->u128
= in_val
->ldval
;
593 out_val
->fval
= in_val
->i8
;
596 out_val
->fval
= in_val
->u8
;
599 out_val
->fval
= in_val
->i16
;
602 out_val
->fval
= in_val
->u16
;
605 out_val
->fval
= in_val
->i32
;
608 out_val
->fval
= in_val
->u32
;
611 out_val
->fval
= in_val
->i64
;
614 out_val
->fval
= in_val
->u64
;
618 out_val
->fval
= in_val
->i128
;
624 out_val
->fval
= in_val
->u128
;
629 out_val
->fval
= in_val
->fval
;
632 out_val
->fval
= in_val
->dval
;
634 # if HAVE_LONG_DOUBLE
635 case PSI_T_LONG_DOUBLE
:
636 out_val
->fval
= in_val
->ldval
;
648 out_val
->dval
= in_val
->i8
;
651 out_val
->dval
= in_val
->u8
;
654 out_val
->dval
= in_val
->i16
;
657 out_val
->dval
= in_val
->u16
;
660 out_val
->dval
= in_val
->i32
;
663 out_val
->dval
= in_val
->u32
;
666 out_val
->dval
= in_val
->i64
;
669 out_val
->dval
= in_val
->u64
;
673 out_val
->dval
= in_val
->i128
;
679 out_val
->dval
= in_val
->u128
;
684 out_val
->dval
= in_val
->fval
;
687 out_val
->dval
= in_val
->dval
;
689 # if HAVE_LONG_DOUBLE
690 case PSI_T_LONG_DOUBLE
:
691 out_val
->dval
= in_val
->ldval
;
701 case PSI_T_LONG_DOUBLE
:
704 out_val
->ldval
= in_val
->i8
;
707 out_val
->ldval
= in_val
->u8
;
710 out_val
->ldval
= in_val
->i16
;
713 out_val
->ldval
= in_val
->u16
;
716 out_val
->ldval
= in_val
->i32
;
719 out_val
->ldval
= in_val
->u32
;
722 out_val
->ldval
= in_val
->i64
;
725 out_val
->ldval
= in_val
->u64
;
729 out_val
->ldval
= in_val
->i128
;
735 out_val
->ldval
= in_val
->u128
;
740 out_val
->ldval
= in_val
->fval
;
743 out_val
->ldval
= in_val
->dval
;
745 # if HAVE_LONG_DOUBLE
746 case PSI_T_LONG_DOUBLE
:
747 out_val
->ldval
= in_val
->ldval
;