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)])
@expose("vector->immutable-vector", [values_vector.W_Vector]) def vector2immutablevector(v): # FIXME: it should be immutable return v # FIXME: make that a parameter @expose("current-command-line-arguments", [], simple=False) def current_command_line_arguments(env, cont): from pycket.interpreter import return_value w_v = values_vector.W_Vector.fromelements( env.toplevel_env().commandline_arguments) return return_value(w_v, env, cont) # Unsafe pair ops @expose("unsafe-car", [subclass_unsafe(values.W_Cons)]) def unsafe_car(p): return p.car() @expose("unsafe-cdr", [subclass_unsafe(values.W_Cons)]) def unsafe_cdr(p): return p.cdr() @expose("path-string?", [values.W_Object]) def path_stringp(v): # FIXME: handle zeros in string return values.W_Bool.make( isinstance(v, values_string.W_String) or isinstance(v, values.W_Path)) @expose("complete-path?", [values.W_Object]) def complete_path(v):
@expose("box", [values.W_Object]) def box(v): return values.W_MBox(v) @expose("box-immutable", [values.W_Object]) def box_immutable(v): return values.W_IBox(v) @expose("unbox", [values.W_Box], simple=False) def unbox(b, env, cont): return b.unbox(env, cont) @expose("unsafe-unbox", [subclass_unsafe(values.W_Box)], simple=False) def unsafe_unbox(b, env, cont): return b.unbox(env, cont) @expose("set-box!", [values.W_Box, values.W_Object], simple=False) def set_box(box, v, env, cont): return box.set_box(v, env, cont) @expose("unsafe-set-box!", [subclass_unsafe(values.W_Box), values.W_Object], simple=False) def unsafe_set_box(box, v, env, cont): return box.set_box(v, 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),
@expose("bytes-length", [values.W_Bytes]) 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)
w_bytes = values.W_Bytes.from_charlist(w_str.as_charlist_utf8()) return values.W_Fixnum(w_bytes.length()) @expose("bytes-length", [values.W_Bytes]) 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):
return values.W_MutableBytes(val) @expose("bytes-length", [values.W_Bytes]) 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])
from pycket.prims import equal as eq_prims from pycket.prims.expose import default, expose, subclass_unsafe @expose("box", [values.W_Object]) def box(v): return values.W_MBox(v) @expose("box-immutable", [values.W_Object]) def box_immutable(v): return values.W_IBox(v) @expose("unbox", [values.W_Box], simple=False) def unbox(b, env, cont): return b.unbox(env, cont) @expose("unsafe-unbox", [subclass_unsafe(values.W_Box)], simple=False) def unsafe_unbox(b, env, cont): return b.unbox(env, cont) @expose("set-box!", [values.W_Box, values.W_Object], simple=False) def set_box(box, v, env, cont): return box.set_box(v, env, cont) @expose("unsafe-set-box!", [subclass_unsafe(values.W_Box), values.W_Object], simple=False) def unsafe_set_box(box, v, env, cont): return box.set_box(v, env, cont) # This implementation makes no guarantees about atomicity @expose("box-cas!", [values.W_MBox, values.W_Object, values.W_Object]) def box_cas(box, old, new): if eq_prims.eqp_logic(box.value, old):
def vector_to_list_read_cont(vector, idx, acc, env, cont, _vals): from pycket.interpreter import check_one_val, return_value val = check_one_val(_vals) acc = values.W_Cons.make(val, acc) return vector_to_list_loop(vector, idx - 1, acc, env, cont) # FIXME: make that a parameter @expose("current-command-line-arguments", [], simple=False) def current_command_line_arguments(env, cont): from pycket.interpreter import return_value w_v = values_vector.W_Vector.fromelements( env.toplevel_env().commandline_arguments) return return_value(w_v, env, cont) # Unsafe pair ops @expose("unsafe-car", [subclass_unsafe(values.W_Cons)]) def unsafe_car(p): return p.car() @expose("unsafe-cdr", [subclass_unsafe(values.W_Cons)]) def unsafe_cdr(p): return p.cdr() @expose("path-string?", [values.W_Object]) def path_stringp(v): # FIXME: handle zeros in string return values.W_Bool.make( isinstance(v, values_string.W_String) or isinstance(v, values.W_Path)) @expose("complete-path?", [values.W_Object]) def complete_path(v):
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)])