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)
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)
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)])
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:
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:
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):
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)])
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)
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)
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):
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)])