diff options
author | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2011-02-27 01:36:59 +0100 |
commit | cead25f928ac606fc1a13882b818913aab3635a9 (patch) | |
tree | 92121b401f76f4b2891ebac0f710b0a921ce13b1 /src/lib_math.c | |
parent | c031d4b6a06eab94e8d9b837ec6dc257899a4ae1 (diff) | |
download | luajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.gz luajit-cead25f928ac606fc1a13882b818913aab3635a9.tar.bz2 luajit-cead25f928ac606fc1a13882b818913aab3635a9.zip |
DUALNUM: Handle integer type in x86/x64 interpreter and libraries.
Diffstat (limited to 'src/lib_math.c')
-rw-r--r-- | src/lib_math.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/lib_math.c b/src/lib_math.c index 46841e08..5843e2f5 100644 --- a/src/lib_math.c +++ b/src/lib_math.c | |||
@@ -21,12 +21,17 @@ | |||
21 | 21 | ||
22 | LJLIB_ASM(math_abs) LJLIB_REC(.) | 22 | LJLIB_ASM(math_abs) LJLIB_REC(.) |
23 | { | 23 | { |
24 | lj_lib_checknum(L, 1); | 24 | lj_lib_checknumber(L, 1); |
25 | return FFH_RETRY; | 25 | return FFH_RETRY; |
26 | } | 26 | } |
27 | LJLIB_ASM_(math_floor) LJLIB_REC(math_round IRFPM_FLOOR) | 27 | LJLIB_ASM_(math_floor) LJLIB_REC(math_round IRFPM_FLOOR) |
28 | LJLIB_ASM_(math_ceil) LJLIB_REC(math_round IRFPM_CEIL) | 28 | LJLIB_ASM_(math_ceil) LJLIB_REC(math_round IRFPM_CEIL) |
29 | LJLIB_ASM_(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT) | 29 | |
30 | LJLIB_ASM(math_sqrt) LJLIB_REC(math_unary IRFPM_SQRT) | ||
31 | { | ||
32 | lj_lib_checknum(L, 1); | ||
33 | return FFH_RETRY; | ||
34 | } | ||
30 | LJLIB_ASM_(math_log) LJLIB_REC(math_unary IRFPM_LOG) | 35 | LJLIB_ASM_(math_log) LJLIB_REC(math_unary IRFPM_LOG) |
31 | LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10) | 36 | LJLIB_ASM_(math_log10) LJLIB_REC(math_unary IRFPM_LOG10) |
32 | LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP) | 37 | LJLIB_ASM_(math_exp) LJLIB_REC(math_unary IRFPM_EXP) |
@@ -61,7 +66,7 @@ LJLIB_ASM_(math_fmod) | |||
61 | LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN) | 66 | LJLIB_ASM(math_min) LJLIB_REC(math_minmax IR_MIN) |
62 | { | 67 | { |
63 | int i = 0; | 68 | int i = 0; |
64 | do { lj_lib_checknum(L, ++i); } while (L->base+i < L->top); | 69 | do { lj_lib_checknumber(L, ++i); } while (L->base+i < L->top); |
65 | return FFH_RETRY; | 70 | return FFH_RETRY; |
66 | } | 71 | } |
67 | LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX) | 72 | LJLIB_ASM_(math_max) LJLIB_REC(math_minmax IR_MAX) |
@@ -137,13 +142,42 @@ LJLIB_CF(math_random) LJLIB_REC(.) | |||
137 | u.u64 = lj_math_random_step(rs); | 142 | u.u64 = lj_math_random_step(rs); |
138 | d = u.d - 1.0; | 143 | d = u.d - 1.0; |
139 | if (n > 0) { | 144 | if (n > 0) { |
145 | #if LJ_DUALNUM | ||
146 | int isint = 1; | ||
147 | double r1; | ||
148 | lj_lib_checknumber(L, 1); | ||
149 | if (tvisint(L->base)) { | ||
150 | r1 = (lua_Number)intV(L->base); | ||
151 | } else { | ||
152 | isint = 0; | ||
153 | r1 = numV(L->base); | ||
154 | } | ||
155 | #else | ||
140 | double r1 = lj_lib_checknum(L, 1); | 156 | double r1 = lj_lib_checknum(L, 1); |
157 | #endif | ||
141 | if (n == 1) { | 158 | if (n == 1) { |
142 | d = floor(d*r1) + 1.0; /* d is an int in range [1, r1] */ | 159 | d = floor(d*r1) + 1.0; /* d is an int in range [1, r1] */ |
143 | } else { | 160 | } else { |
161 | #if LJ_DUALNUM | ||
162 | double r2; | ||
163 | lj_lib_checknumber(L, 2); | ||
164 | if (tvisint(L->base+1)) { | ||
165 | r2 = (lua_Number)intV(L->base+1); | ||
166 | } else { | ||
167 | isint = 0; | ||
168 | r2 = numV(L->base+1); | ||
169 | } | ||
170 | #else | ||
144 | double r2 = lj_lib_checknum(L, 2); | 171 | double r2 = lj_lib_checknum(L, 2); |
172 | #endif | ||
145 | d = floor(d*(r2-r1+1.0)) + r1; /* d is an int in range [r1, r2] */ | 173 | d = floor(d*(r2-r1+1.0)) + r1; /* d is an int in range [r1, r2] */ |
146 | } | 174 | } |
175 | #if LJ_DUALNUM | ||
176 | if (isint) { | ||
177 | setintV(L->top-1, lj_num2int(d)); | ||
178 | return 1; | ||
179 | } | ||
180 | #endif | ||
147 | } /* else: d is a double in range [0, 1] */ | 181 | } /* else: d is a double in range [0, 1] */ |
148 | setnumV(L->top++, d); | 182 | setnumV(L->top++, d); |
149 | return 1; | 183 | return 1; |