def test_builder(): def add(space, m, n): return space.newint(m + n) signature = ['space', int, int] builder = BuiltinFunctionBuilder(signature, add) assert builder.make_source() == """\ @unroll_safe def php_add(interp, args_w, w_this, thisclass): nb_args = len(args_w) space = interp.space if nb_args != 2: arguments_exactly(interp, fname, 2, nb_args, error_handler) nb_args = 2 # constant below arg0 = space w_arg = args_w[0].deref_unique() try: arg1 = w_arg.as_int_arg(space) except ConvertError: raise argument_not(interp, "long", fname, 1, w_arg.tp, error_handler) w_arg = args_w[1].deref_unique() try: arg2 = w_arg.as_int_arg(space) except ConvertError: raise argument_not(interp, "long", fname, 2, w_arg.tp, error_handler) return (arg0, arg1, arg2) """ def incr(space, a, increment=1): return space.newint(a + increment) signature = ['space', 'reference', Optional(int)] builder = BuiltinFunctionBuilder(signature, incr) expected = """\ @unroll_safe def php_incr(interp, args_w, w_this, thisclass): nb_args = len(args_w) space = interp.space if nb_args < 1: warn_at_least(space, fname, 1, nb_args) if nb_args > 2: warn_at_most(space, fname, 2, nb_args) arg2 = default2 arg0 = space w_arg = args_w[0] arg1 = check_reference(space, w_arg, fname) if nb_args > 1: w_arg = args_w[1].deref_unique() try: arg2 = w_arg.as_int_arg(space) except ConvertError: raise argument_not(interp, "long", fname, 2, w_arg.tp, error_handler) return (arg0, arg1, arg2) """ assert builder.make_source() == expected def foo(space, fname, ctx=None): pass signature = ['space', FilenameArg(False), Optional(Nullable(StreamContextArg(False)))] builder = BuiltinFunctionBuilder(signature, foo) assert builder.make_source() == """\
def _get_path(interp, this): return this.path def _set_handle(interp, this, w_value): assert isinstance(w_value, W_DirResource) this.handle = w_value def _get_handle(interp, this): return this.handle @wrap(['interp', str, Optional(StreamContextArg(None))]) def dir(interp, directory, w_ctx=None): space = interp.space if w_ctx: if not interp.space.is_resource(w_ctx): interp.warn("dir() expects parameter 2 to be resource, %s given" % interp.space.get_type_name(w_ctx.tp).lower()) return interp.space.w_Null if directory == '': return interp.space.w_False if not os.path.isdir(directory): warn_str = "dir(" + directory + \ "): failed to open dir: No such file or directory"
@wrap_method(['interp', ThisUnwrapper(W_SplFileInfo)], name='SplFileInfo::getLinkTarget', error_handler=handle_as_exception) def get_linktarget(interp, this): filename = this.file_name assert filename is not None try: return interp.space.wrap(os.readlink(filename)) except OSError, e: raise PHPException(k_RuntimeException.call_args( interp, [interp.space.wrap( "SplFileInfo::getLinkTarget(): %s" % os.strerror(e.errno))])) @wrap_method(['interp', ThisUnwrapper(W_SplFileInfo), Optional(str), Optional(bool), Optional(Nullable(StreamContextArg(None)))], name='SplFileInfo::openFile', error_handler=handle_as_exception) def openfile(interp, this, open_mode='r', use_include_path=False, w_ctx=None): if open_mode == '': raise PHPException(k_RuntimeException.call_args( interp, [interp.space.wrap( "SplFileInfo::openFile(): Invalid parameters")])) args = [interp.space.wrap(this.file_name), interp.space.wrap(open_mode), interp.space.wrap(use_include_path)] if w_ctx: if not interp.space.is_resource(w_ctx): raise PHPException(k_RuntimeException.call_args( interp, [interp.space.wrap( "SplFileInfo::openFile() expects " "parameter 3 to be resource, %s given"
""" Creates a pair of connected, indistinguishable socket streams""" raise NotImplementedError() def stream_socket_recvfrom(): """ Receives data from a socket, connected or not""" raise NotImplementedError() def stream_socket_sendto(): """ Sends a message to a socket, whether it is connected or not""" raise NotImplementedError() @wrap(['interp', str, Optional('reference'), Optional('reference'), Optional(int), Optional(StreamContextArg(None))]) def stream_socket_server(interp, local_socket, w_ref_errno=None, w_ref_errstr=None, flags=12, w_ctx=None): """ Create an Internet or Unix domain server socket ('STREAM_SERVER_BIND', 4), ('STREAM_SERVER_LISTEN', 8), """ r = urlsplit(local_socket) space = interp.space bind = flags & 4 != 0 listen = flags & 8 != 0 w_res = W_SocketResource(space, r.host, r.port, r.scheme) if bind: w_res.bind() if listen:
try: return interp.space.wrap(os.readlink(filename)) except OSError, e: raise PHPException( k_RuntimeException.call_args(interp, [ interp.space.wrap( "SplFileInfo::getLinkTarget(): %s" % os.strerror(e.errno)) ])) @wrap_method([ 'interp', ThisUnwrapper(W_SplFileInfo), Optional(str), Optional(bool), Optional(Nullable(StreamContextArg(None))) ], name='SplFileInfo::openFile', error_handler=handle_as_exception) def openfile(interp, this, open_mode='r', use_include_path=False, w_ctx=None): if open_mode == '': raise PHPException( k_RuntimeException.call_args(interp, [ interp.space.wrap( "SplFileInfo::openFile(): Invalid parameters") ])) args = [ interp.space.wrap(this.file_name), interp.space.wrap(open_mode), interp.space.wrap(use_include_path)
def stream_socket_recvfrom(): """ Receives data from a socket, connected or not""" raise NotImplementedError() def stream_socket_sendto(): """ Sends a message to a socket, whether it is connected or not""" raise NotImplementedError() @wrap([ 'interp', str, Optional('reference'), Optional('reference'), Optional(int), Optional(StreamContextArg(None)) ]) def stream_socket_server(interp, local_socket, w_ref_errno=None, w_ref_errstr=None, flags=12, w_ctx=None): """ Create an Internet or Unix domain server socket ('STREAM_SERVER_BIND', 4), ('STREAM_SERVER_LISTEN', 8), """ r = urlsplit(local_socket) space = interp.space bind = flags & 4 != 0 listen = flags & 8 != 0