Example #1
0
def make_fixedtype_cmps(name, methname):
    methname = "arith_%s_same" % methname
    def do(a, b):
        return values.W_Bool.make(getattr(a, methname)(b))
    do.__name__ = "fl_" + methname
    expose("fl" + name, [values.W_Flonum] * 2, simple=True)(do)
    expose("unsafe-fl" + name, [unsafe(values.W_Flonum)] * 2, simple=True)(do)

    def do(a, b):
        return values.W_Bool.make(getattr(a, methname)(b))
    do.__name__ = "fx_" + methname
    expose("fx" + name, [values.W_Fixnum] * 2, simple=True)(do)
    expose("unsafe-fx" + name, [unsafe(values.W_Fixnum)] * 2, simple=True)(do)
Example #2
0
def make_fixedtype_cmps(name, methname):
    methname = "arith_%s_same" % methname
    def do(a, b):
        return values.W_Bool.make(getattr(a, methname)(b))
    do.__name__ = "fl_" + methname
    expose("fl" + name, [values.W_Flonum] * 2, simple=True)(do)
    expose("unsafe-fl" + name, [unsafe(values.W_Flonum)] * 2, simple=True)(do)

    def do(a, b):
        return values.W_Bool.make(getattr(a, methname)(b))
    do.__name__ = "fx_" + methname
    expose("fx" + name, [values.W_Fixnum] * 2, simple=True)(do)
    expose("unsafe-fx" + name, [unsafe(values.W_Fixnum)] * 2, simple=True)(do)
Example #3
0
                                      default(values.W_List, values.w_null),
                                      default(values.W_Object, values.w_false)])
def mk_stp(sym, guard, supers, _can_imp):
    can_imp = False
    if guard is values.W_Symbol.make("can-impersonate"):
        guard = values.w_false
        can_imp = True
    if _can_imp is not values.w_false:
        can_imp = True
    prop = values_struct.W_StructProperty(sym, guard, supers, can_imp)
    return values.Values.make([prop,
                               values_struct.W_StructPropertyPredicate(prop),
                               values_struct.W_StructPropertyAccessor(prop)])

# Unsafe struct ops
@expose("unsafe-struct-ref", [values.W_Object, unsafe(values.W_Fixnum)])
def unsafe_struct_ref(v, k):
    v = imp.get_base_object(v)
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value <= v.struct_type().total_field_cnt
    return v._ref(k.value)

@expose("unsafe-struct-set!", [values.W_Object, unsafe(values.W_Fixnum),
    values.W_Object])
def unsafe_struct_set(v, k, val):
    while isinstance(v, imp.W_ChpStruct) or isinstance(v, imp.W_ImpStruct):
        v = v.inner
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value < v.struct_type().total_field_cnt
    return v._set(k.value, val)
Example #4
0
def goto_vector_copy_loop(src, src_start, src_end, dest, dest_start, next, env, cont, _vals):
    return vector_copy_loop(
            src, src_start, src_end, dest, dest_start, next, env, cont)

@continuation
def vector_copy_cont_get(src, src_start, src_end, dest, dest_start, i, env, cont, _vals):
    from pycket.interpreter import check_one_val
    val  = check_one_val(_vals)
    idx  = values.W_Fixnum(i.value + dest_start)
    next = values.W_Fixnum(i.value + 1)
    return dest.vector_set(idx, val, env,
                goto_vector_copy_loop(src, src_start, src_end,
                    dest, dest_start, next, env, cont))

# FIXME: Chaperones
@expose("unsafe-vector-ref", [subclass_unsafe(values.W_MVector), unsafe(values.W_Fixnum)], simple=False)
def unsafe_vector_ref(v, i, env, cont):
    from pycket.interpreter import return_value
    if isinstance(v, imp.W_ImpVector) or isinstance(v, imp.W_ChpVector):
        return v.vector_ref(i, env, cont)
    else:
        assert type(v) is values_vector.W_Vector
        val = i.value
        assert val >= 0
        return return_value(v.unsafe_ref(val), env, cont)

@expose("unsafe-flvector-ref", [unsafe(values_vector.W_FlVector), unsafe(values.W_Fixnum)])
def unsafe_flvector_ref(v, i):
    return v.unsafe_ref(i.value)

@expose("unsafe-vector*-ref", [unsafe(values_vector.W_Vector), unsafe(values.W_Fixnum)])
Example #5
0
    def do(a, b):
        return values.W_Bool.make(getattr(a, methname)(b))
    do.__name__ = "fx_" + methname
    expose("fx" + name, [values.W_Fixnum] * 2, simple=True)(do)
    expose("unsafe-fx" + name, [unsafe(values.W_Fixnum)] * 2, simple=True)(do)

for args in [
    ("<",  "lt"),
    ("<=", "le"),
    (">",  "gt"),
    (">=", "ge"),
    ("=",  "eq"),
    ]:
    make_fixedtype_cmps(*args)

@expose("unsafe-flsqrt", [unsafe(values.W_Flonum)])
def flsqrt(f):
    return f.arith_sqrt()

@expose("add1", [values.W_Number])
def add1(v):
    return v.arith_add(values.W_Fixnum.ONE)

@expose("atan", [values.W_Number, default(values.W_Number, None)])
def atan(y, x):
    if x is not None:
        # FIXME: signs determine the quadrant of the result
        # and care about NaNs and precision
        if x.arith_zerop() is values.w_false:
            z = y.arith_div(x)
        else:
Example #6
0
    do.__name__ = "fx_" + methname
    expose("fx" + name, [values.W_Fixnum] * 2, simple=True)(do)
    expose("unsafe-fx" + name, [unsafe(values.W_Fixnum)] * 2, simple=True)(do)


for args in [
    ("<", "lt"),
    ("<=", "le"),
    (">", "gt"),
    (">=", "ge"),
    ("=", "eq"),
]:
    make_fixedtype_cmps(*args)


@expose("unsafe-flsqrt", [unsafe(values.W_Flonum)])
def flsqrt(f):
    return f.arith_sqrt()


@expose("add1", [values.W_Number])
def add1(v):
    return v.arith_add(values.W_Fixnum.ONE)


@expose("atan", [values.W_Number, default(values.W_Number, None)])
def atan(y, x):
    if x is not None:
        # FIXME: signs determine the quadrant of the result
        # and care about NaNs and precision
        if x.arith_zerop() is values.w_false:
Example #7
0
    return s.ref(n.value)


@expose("bytes-set!", [values.W_Bytes, values.W_Fixnum, values.W_Fixnum])
def bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)


@expose("unsafe-bytes-length", [subclass_unsafe(values.W_Bytes)])
def unsafe_bytes_length(s1):
    return values.W_Fixnum(len(s1.value))


@expose("unsafe-bytes-ref",
        [subclass_unsafe(values.W_Bytes),
         unsafe(values.W_Fixnum)])
def unsafe_bytes_ref(s, n):
    return s.ref(n.value)


@expose("unsafe-bytes-set!", [
    unsafe(values.W_MutableBytes),
    unsafe(values.W_Fixnum),
    unsafe(values.W_Fixnum)
])
def unsafe_bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)


@expose("list->bytes", [values.W_List])
def list_to_bytes(w_list):
Example #8
0
def vector_copy_cont_get(src, src_start, src_end, dest, dest_start, i, env,
                         cont, _vals):
    from pycket.interpreter import check_one_val
    val = check_one_val(_vals)
    idx = i + dest_start
    next = i + 1
    return dest.vector_set(
        idx, val, env,
        goto_vector_copy_loop(src, src_start, src_end, dest, dest_start, next,
                              env, cont))


# FIXME: Chaperones
@expose("unsafe-vector-ref",
        [subclass_unsafe(values.W_MVector),
         unsafe(values.W_Fixnum)],
        simple=False)
def unsafe_vector_ref(v, i, env, cont):
    from pycket.interpreter import return_value
    if isinstance(v, imp.W_ImpVector) or isinstance(v, imp.W_ChpVector):
        return v.vector_ref(i.value, env, cont)
    else:
        assert type(v) is values_vector.W_Vector
        val = i.value
        assert val >= 0
        return return_value(v.unsafe_ref(val), env, cont)


@expose("unsafe-flvector-ref",
        [unsafe(values_vector.W_FlVector),
         unsafe(values.W_Fixnum)])
Example #9
0
    can_imp = False
    if guard is w_can_impersonate:
        guard = values.w_false
        can_imp = True
    if _can_imp is not values.w_false:
        can_imp = True
    prop = values_struct.W_StructProperty(sym, guard, supers, can_imp)
    return values.Values.make([
        prop,
        values_struct.W_StructPropertyPredicate(prop),
        values_struct.W_StructPropertyAccessor(prop)
    ])


# Unsafe struct ops
@expose("unsafe-struct-ref", [values.W_Object, unsafe(values.W_Fixnum)])
def unsafe_struct_ref(v, k):
    v = imp.get_base_object(v)
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value <= v.struct_type().total_field_cnt
    return v._ref(k.value)


@expose("unsafe-struct-set!",
        [values.W_Object,
         unsafe(values.W_Fixnum), values.W_Object])
def unsafe_struct_set(v, k, val):
    v = imp.get_base_object(v)
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value < v.struct_type().total_field_cnt
    return v._set(k.value, val)
Example #10
0
                                      default(values.W_List, values.w_null),
                                      default(values.W_Object, values.w_false)])
def mk_stp(sym, guard, supers, _can_imp):
    can_imp = False
    if guard is values.W_Symbol.make("can-impersonate"):
        guard = values.w_false
        can_imp = True
    if _can_imp is not values.w_false:
        can_imp = True
    prop = values_struct.W_StructProperty(sym, guard, supers, can_imp)
    return values.Values.make([prop,
                               values_struct.W_StructPropertyPredicate(prop),
                               values_struct.W_StructPropertyAccessor(prop)])

# Unsafe struct ops
@expose("unsafe-struct-ref", [values.W_Object, unsafe(values.W_Fixnum)])
def unsafe_struct_ref(v, k):
    v = imp.get_base_object(v)
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value <= v.struct_type().total_field_cnt
    return v._ref(k.value)

@expose("unsafe-struct-set!", [values.W_Object, unsafe(values.W_Fixnum),
    values.W_Object])
def unsafe_struct_set(v, k, val):
    while isinstance(v, imp.W_ChpStruct) or isinstance(v, imp.W_ImpStruct):
        v = v.inner
    assert isinstance(v, values_struct.W_Struct)
    assert 0 <= k.value < v.struct_type().total_field_cnt
    return v._set(k.value, val)
Example #11
0
def bytes_length(s1):
    return values.W_Fixnum(s1.length())

@expose("bytes-ref", [values.W_Bytes, values.W_Fixnum])
def bytes_ref(s, n):
    return s.ref(n.value)

@expose("bytes-set!", [values.W_Bytes, values.W_Fixnum, values.W_Fixnum])
def bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)

@expose("unsafe-bytes-length", [subclass_unsafe(values.W_Bytes)])
def unsafe_bytes_length(s1):
    return values.W_Fixnum(s1.length())

@expose("unsafe-bytes-ref", [subclass_unsafe(values.W_Bytes), unsafe(values.W_Fixnum)])
def unsafe_bytes_ref(s, n):
    return s.ref(n.value)

@expose("unsafe-bytes-set!", [unsafe(values.W_MutableBytes),
                              unsafe(values.W_Fixnum),
                              unsafe(values.W_Fixnum)])
def unsafe_bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)

@expose("bytes-fill!", [values.W_Bytes, values.W_Fixnum])
def string_fill(s, c):
    if s.immutable():
        raise SchemeException("bytes-fill!: given immutable bytes")
    for i in range(s.length()):
        s.set(i, c.value)
Example #12
0
File: string.py Project: 8l/pycket
def bytes_length(s1):
    return values.W_Fixnum(len(s1.value))

@expose("bytes-ref", [values.W_Bytes, values.W_Fixnum])
def bytes_ref(s, n):
    return s.ref(n.value)

@expose("bytes-set!", [values.W_Bytes, values.W_Fixnum, values.W_Fixnum])
def bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)

@expose("unsafe-bytes-length", [subclass_unsafe(values.W_Bytes)])
def unsafe_bytes_length(s1):
    return values.W_Fixnum(len(s1.value))

@expose("unsafe-bytes-ref", [subclass_unsafe(values.W_Bytes), unsafe(values.W_Fixnum)])
def unsafe_bytes_ref(s, n):
    return s.ref(n.value)

@expose("unsafe-bytes-set!", [unsafe(values.W_MutableBytes),
                              unsafe(values.W_Fixnum),
                              unsafe(values.W_Fixnum)])
def unsafe_bytes_set_bang(s, n, v):
    return s.set(n.value, v.value)


@expose("list->bytes", [values.W_List])
def list_to_bytes(w_list):
    l = values.from_list(w_list)
    ll = [' '] * len(l)
    for (i,x) in enumerate(l):
Example #13
0
def goto_vector_copy_loop(src, src_start, src_end, dest, dest_start, next, env, cont, _vals):
    return vector_copy_loop(
            src, src_start, src_end, dest, dest_start, next, env, cont)

@continuation
def vector_copy_cont_get(src, src_start, src_end, dest, dest_start, i, env, cont, _vals):
    from pycket.interpreter import check_one_val
    val  = check_one_val(_vals)
    idx  = i + dest_start
    next = i + 1
    return dest.vector_set(idx, val, env,
                goto_vector_copy_loop(src, src_start, src_end,
                    dest, dest_start, next, env, cont))

# FIXME: Chaperones
@expose("unsafe-vector-ref", [subclass_unsafe(values.W_MVector), unsafe(values.W_Fixnum)], simple=False)
def unsafe_vector_ref(v, i, env, cont):
    from pycket.interpreter import return_value
    if isinstance(v, imp.W_ImpVector) or isinstance(v, imp.W_ChpVector):
        return v.vector_ref(i.value, env, cont)
    else:
        assert type(v) is values_vector.W_Vector
        val = i.value
        assert val >= 0
        return return_value(v.unsafe_ref(val), env, cont)

@expose("unsafe-flvector-ref", [unsafe(values_vector.W_FlVector), unsafe(values.W_Fixnum)])
def unsafe_flvector_ref(v, i):
    return v.unsafe_ref(i.value)

@expose("unsafe-vector*-ref", [unsafe(values_vector.W_Vector), unsafe(values.W_Fixnum)])