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
->fval
;
64 out_val
->i8
= in_val
->dval
;
67 case PSI_T_LONG_DOUBLE
:
68 out_val
->i8
= in_val
->ldval
;
80 out_val
->u8
= in_val
->i8
;
83 out_val
->u8
= in_val
->u8
;
86 out_val
->u8
= in_val
->i16
;
89 out_val
->u8
= in_val
->u16
;
92 out_val
->u8
= in_val
->i32
;
95 out_val
->u8
= in_val
->u32
;
98 out_val
->u8
= in_val
->i64
;
101 out_val
->u8
= in_val
->u64
;
104 out_val
->u8
= in_val
->fval
;
107 out_val
->u8
= in_val
->dval
;
109 # if HAVE_LONG_DOUBLE
110 case PSI_T_LONG_DOUBLE
:
111 out_val
->u8
= in_val
->ldval
;
123 out_val
->i16
= in_val
->i8
;
126 out_val
->i16
= in_val
->u8
;
129 out_val
->i16
= in_val
->i16
;
132 out_val
->i16
= in_val
->u16
;
135 out_val
->i16
= in_val
->i32
;
138 out_val
->i16
= in_val
->u32
;
141 out_val
->i16
= in_val
->i64
;
144 out_val
->i16
= in_val
->u64
;
147 out_val
->i16
= in_val
->fval
;
150 out_val
->i16
= in_val
->dval
;
152 # if HAVE_LONG_DOUBLE
153 case PSI_T_LONG_DOUBLE
:
154 out_val
->i16
= in_val
->ldval
;
166 out_val
->u16
= in_val
->i8
;
169 out_val
->u16
= in_val
->u8
;
172 out_val
->u16
= in_val
->i16
;
175 out_val
->u16
= in_val
->u16
;
178 out_val
->u16
= in_val
->i32
;
181 out_val
->u16
= in_val
->u32
;
184 out_val
->u16
= in_val
->i64
;
187 out_val
->u16
= in_val
->u64
;
190 out_val
->u16
= in_val
->fval
;
193 out_val
->u16
= in_val
->dval
;
195 # if HAVE_LONG_DOUBLE
196 case PSI_T_LONG_DOUBLE
:
197 out_val
->u16
= in_val
->ldval
;
209 out_val
->i32
= in_val
->i8
;
212 out_val
->i32
= in_val
->u8
;
215 out_val
->i32
= in_val
->i16
;
218 out_val
->i32
= in_val
->u16
;
221 out_val
->i32
= in_val
->i32
;
224 out_val
->i32
= in_val
->u32
;
227 out_val
->i32
= in_val
->i64
;
230 out_val
->i32
= in_val
->u64
;
233 out_val
->i32
= in_val
->fval
;
236 out_val
->i32
= in_val
->dval
;
238 # if HAVE_LONG_DOUBLE
239 case PSI_T_LONG_DOUBLE
:
240 out_val
->i32
= in_val
->ldval
;
252 out_val
->u32
= in_val
->i8
;
255 out_val
->u32
= in_val
->u8
;
258 out_val
->u32
= in_val
->i16
;
261 out_val
->u32
= in_val
->u16
;
264 out_val
->u32
= in_val
->i32
;
267 out_val
->u32
= in_val
->u32
;
270 out_val
->u32
= in_val
->i64
;
273 out_val
->u32
= in_val
->u64
;
276 out_val
->u32
= in_val
->fval
;
279 out_val
->u32
= in_val
->dval
;
281 # if HAVE_LONG_DOUBLE
282 case PSI_T_LONG_DOUBLE
:
283 out_val
->u32
= in_val
->ldval
;
295 out_val
->i64
= in_val
->i8
;
298 out_val
->i64
= in_val
->u8
;
301 out_val
->i64
= in_val
->i16
;
304 out_val
->i64
= in_val
->u16
;
307 out_val
->i64
= in_val
->i32
;
310 out_val
->i64
= in_val
->u32
;
313 out_val
->i64
= in_val
->i64
;
316 out_val
->i64
= in_val
->u64
;
319 out_val
->i64
= in_val
->fval
;
322 out_val
->i64
= in_val
->dval
;
324 # if HAVE_LONG_DOUBLE
325 case PSI_T_LONG_DOUBLE
:
326 out_val
->i64
= in_val
->ldval
;
338 out_val
->u64
= in_val
->i8
;
341 out_val
->u64
= in_val
->u8
;
344 out_val
->u64
= in_val
->i16
;
347 out_val
->u64
= in_val
->u16
;
350 out_val
->u64
= in_val
->i32
;
353 out_val
->u64
= in_val
->u32
;
356 out_val
->u64
= in_val
->i64
;
359 out_val
->u64
= in_val
->u64
;
362 out_val
->u64
= in_val
->fval
;
365 out_val
->u64
= in_val
->dval
;
367 # if HAVE_LONG_DOUBLE
368 case PSI_T_LONG_DOUBLE
:
369 out_val
->u64
= in_val
->ldval
;
381 out_val
->fval
= in_val
->i8
;
384 out_val
->fval
= in_val
->u8
;
387 out_val
->fval
= in_val
->i16
;
390 out_val
->fval
= in_val
->u16
;
393 out_val
->fval
= in_val
->i32
;
396 out_val
->fval
= in_val
->u32
;
399 out_val
->fval
= in_val
->i64
;
402 out_val
->fval
= in_val
->u64
;
405 out_val
->fval
= in_val
->fval
;
408 out_val
->fval
= in_val
->dval
;
410 # if HAVE_LONG_DOUBLE
411 case PSI_T_LONG_DOUBLE
:
412 out_val
->fval
= in_val
->ldval
;
424 out_val
->dval
= in_val
->i8
;
427 out_val
->dval
= in_val
->u8
;
430 out_val
->dval
= in_val
->i16
;
433 out_val
->dval
= in_val
->u16
;
436 out_val
->dval
= in_val
->i32
;
439 out_val
->dval
= in_val
->u32
;
442 out_val
->dval
= in_val
->i64
;
445 out_val
->dval
= in_val
->u64
;
448 out_val
->dval
= in_val
->fval
;
451 out_val
->dval
= in_val
->dval
;
453 # if HAVE_LONG_DOUBLE
454 case PSI_T_LONG_DOUBLE
:
455 out_val
->dval
= in_val
->ldval
;
465 case PSI_T_LONG_DOUBLE
:
468 out_val
->ldval
= in_val
->i8
;
471 out_val
->ldval
= in_val
->u8
;
474 out_val
->ldval
= in_val
->i16
;
477 out_val
->ldval
= in_val
->u16
;
480 out_val
->ldval
= in_val
->i32
;
483 out_val
->ldval
= in_val
->u32
;
486 out_val
->ldval
= in_val
->i64
;
489 out_val
->ldval
= in_val
->u64
;
492 out_val
->ldval
= in_val
->fval
;
495 out_val
->ldval
= in_val
->dval
;
497 # if HAVE_LONG_DOUBLE
498 case PSI_T_LONG_DOUBLE
:
499 out_val
->ldval
= in_val
->ldval
;