@@ -164,28 +164,38 @@ LJLIB_CF(jit_prngstate)
164164
165165 /* We need to set new state using the input array. */
166166 if (L -> base < L -> top && !tvisnil (L -> base )) {
167- GCtab * t = lj_lib_checktab (L , 1 );
168167 PRNGState prng ;
169- int i = 1 , len = lj_tab_len (t );
168+ if (tvisnumber (L -> base )) {
169+ TValue * o = L -> base ;
170170
171- /* The input array must have at most 8 elements. */
172- if (len > 8 )
173- lj_err_arg (L , 1 , LJ_ERR_PRNGSTATE );
171+ if (!tvisint (o ) && ((double )(uint32_t )numV (o ) != numV (o )))
172+ lj_err_arg (L , 1 , LJ_ERR_PRNGSTATE );
174173
175- for (i = 1 ; i <= len ; i ++ ) {
176- cTValue * v = lj_tab_getint (t , i );
174+ prng .u [0 ] = numberVint (o );
175+ for (i = 1 ; i < 4 ; i ++ )
176+ prng .u [i ] = 0 ;
177+ } else {
178+ GCtab * t = lj_lib_checktab (L , 1 );
179+ int i = 1 , len = lj_tab_len (t );
177180
178- if (!tvisint (v ) && (!tvisnum (v ) || (double )(uint32_t )numV (v ) != numV (v )))
181+ /* The input array must have at most 8 elements. */
182+ if (len > 8 )
179183 lj_err_arg (L , 1 , LJ_ERR_PRNGSTATE );
180184
181- if (i & 1 )
182- prng . u [( i - 1 )/ 2 ] = numberVint ( v );
183- else
184- prng . u [( i - 1 )/ 2 ] = prng . u [( i - 1 )/ 2 ] | (( uint64_t ) numberVint (v ) << 32 );
185- }
185+ for (i = 1 ; i <= len ; i ++ ) {
186+ cTValue * v = lj_tab_getint ( t , i );
187+
188+ if (! tvisint ( v ) && (! tvisnum ( v ) || ( double )( uint32_t ) numV (v ) != numV ( v )))
189+ lj_err_arg ( L , 1 , LJ_ERR_PRNGSTATE );
186190
187- for (i /= 2 ; i < 4 ; i ++ )
188- prng .u [i ] = 0 ;
191+ if (i & 1 )
192+ prng .u [(i - 1 )/2 ] = numberVint (v );
193+ else
194+ prng .u [(i - 1 )/2 ] = prng .u [(i - 1 )/2 ] | ((uint64_t )numberVint (v ) << 32 );
195+ }
196+ for (i /= 2 ; i < 4 ; i ++ )
197+ prng .u [i ] = 0 ;
198+ }
189199
190200 /* Re-initialize the JIT prng. */
191201 J -> prng = prng ;
0 commit comments