mirror of
				https://github.com/bellard/quickjs.git
				synced 2025-05-29 01:49:18 +08:00 
			
		
		
		
	simplified js_bigint_from_float64()
This commit is contained in:
		
							parent
							
								
									7399069dc1
								
							
						
					
					
						commit
						131408fa07
					
				
							
								
								
									
										58
									
								
								quickjs.c
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								quickjs.c
									
									
									
									
									
								
							@ -10192,11 +10192,31 @@ static JSBigInt *js_bigint_new(JSContext *ctx, int len)
 | 
				
			|||||||
static JSBigInt *js_bigint_set_si(JSBigIntBuf *buf, js_slimb_t a)
 | 
					static JSBigInt *js_bigint_set_si(JSBigIntBuf *buf, js_slimb_t a)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    JSBigInt *r = (JSBigInt *)buf->big_int_buf;
 | 
					    JSBigInt *r = (JSBigInt *)buf->big_int_buf;
 | 
				
			||||||
 | 
					    r->header.ref_count = 0; /* fail safe */
 | 
				
			||||||
    r->len = 1;
 | 
					    r->len = 1;
 | 
				
			||||||
    r->tab[0] = a;
 | 
					    r->tab[0] = a;
 | 
				
			||||||
    return r;
 | 
					    return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static JSBigInt *js_bigint_set_si64(JSBigIntBuf *buf, int64_t a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if JS_LIMB_BITS == 64
 | 
				
			||||||
 | 
					    return js_bigint_set_si(buf, a);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    JSBigInt *r = (JSBigInt *)buf->big_int_buf;
 | 
				
			||||||
 | 
					    r->header.ref_count = 0; /* fail safe */
 | 
				
			||||||
 | 
					    if (a >= INT32_MIN && a <= INT32_MAX) {
 | 
				
			||||||
 | 
					        r->len = 1;
 | 
				
			||||||
 | 
					        r->tab[0] = a;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        r->len = 2;
 | 
				
			||||||
 | 
					        r->tab[0] = a;
 | 
				
			||||||
 | 
					        r->tab[1] = a >> JS_LIMB_BITS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return r;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* val must be a short big int */
 | 
					/* val must be a short big int */
 | 
				
			||||||
static JSBigInt *js_bigint_set_short(JSBigIntBuf *buf, JSValueConst val)
 | 
					static JSBigInt *js_bigint_set_short(JSBigIntBuf *buf, JSValueConst val)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -10862,7 +10882,7 @@ static JSBigInt *js_bigint_from_float64(JSContext *ctx, int *pres, double a1)
 | 
				
			|||||||
    int sgn, e, shift;
 | 
					    int sgn, e, shift;
 | 
				
			||||||
    uint64_t mant;
 | 
					    uint64_t mant;
 | 
				
			||||||
    JSBigIntBuf buf;
 | 
					    JSBigIntBuf buf;
 | 
				
			||||||
    JSBigInt *r, *r1;
 | 
					    JSBigInt *r;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    sgn = a >> 63;
 | 
					    sgn = a >> 63;
 | 
				
			||||||
    e = (a >> 52) & ((1 << 11) - 1);
 | 
					    e = (a >> 52) & ((1 << 11) - 1);
 | 
				
			||||||
@ -10895,40 +10915,12 @@ static JSBigInt *js_bigint_from_float64(JSContext *ctx, int *pres, double a1)
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        e -= 52;
 | 
					        e -= 52;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    if (sgn)
 | 
				
			||||||
 | 
					        mant = -mant;
 | 
				
			||||||
    /* the integer is mant*2^e */
 | 
					    /* the integer is mant*2^e */
 | 
				
			||||||
    r = (JSBigInt *)buf.big_int_buf;
 | 
					    r = js_bigint_set_si64(&buf, (int64_t)mant);
 | 
				
			||||||
#if JS_LIMB_BITS == 64
 | 
					 | 
				
			||||||
    r->len = 1;
 | 
					 | 
				
			||||||
    r->tab[0] = mant;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    if (mant <= INT32_MAX) {
 | 
					 | 
				
			||||||
        r->len = 1;
 | 
					 | 
				
			||||||
        r->tab[0] = mant;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        r->len = 2;
 | 
					 | 
				
			||||||
        r->tab[0] = mant;
 | 
					 | 
				
			||||||
        r->tab[1] = mant >> 32;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    /* XXX: optimize */
 | 
					 | 
				
			||||||
    if (sgn) {
 | 
					 | 
				
			||||||
        r = js_bigint_neg(ctx, r);
 | 
					 | 
				
			||||||
        if (!r)
 | 
					 | 
				
			||||||
            goto fail;
 | 
					 | 
				
			||||||
        r1 = js_bigint_shl(ctx, r, e);
 | 
					 | 
				
			||||||
        js_free(ctx, r);
 | 
					 | 
				
			||||||
        if (!r1)
 | 
					 | 
				
			||||||
            goto fail;
 | 
					 | 
				
			||||||
        r = r1;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        r = js_bigint_shl(ctx, r, e);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    *pres = 0;
 | 
					    *pres = 0;
 | 
				
			||||||
    return r;
 | 
					    return js_bigint_shl(ctx, r, e);
 | 
				
			||||||
 fail:
 | 
					 | 
				
			||||||
    *pres = 0;
 | 
					 | 
				
			||||||
    return NULL;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* return -1, 0, 1 or (2) (unordered) */
 | 
					/* return -1, 0, 1 or (2) (unordered) */
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user