From ac14c2a4dbfd73533737df86da071f5949f6c4d9 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Thu, 27 Oct 2016 23:00:18 -0700 Subject: [PATCH] ircd::js: Add generator state class. --- include/ircd/js/generator.h | 90 +++++++++++++++++++++++++++++++++++++ include/ircd/js/js.h | 1 + ircd/js.cc | 5 +++ 3 files changed, 96 insertions(+) create mode 100644 include/ircd/js/generator.h diff --git a/include/ircd/js/generator.h b/include/ircd/js/generator.h new file mode 100644 index 000000000..89f8e0d40 --- /dev/null +++ b/include/ircd/js/generator.h @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2016 Charybdis Development Team + * Copyright (C) 2016 Jason Volk + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once +#define HAVE_IRCD_JS_GENERATOR_H + +namespace ircd { +namespace js { + +struct generator +{ + heap_object state; + heap_object last; + + bool done() const; + template value next(args&&...); + template value _throw(args&&...); + template value _return(args&&...); + + generator(object::handle state); + generator(object state); + generator() = default; +}; + +inline +generator::generator(object state) +:state{state} +{ +} + +inline +generator::generator(object::handle state) +:state{state} +{ +} + +template +value +generator::_return(args&&... a) +{ + function func(get(state, "return")); + last = func(state, std::forward(a)...); + return has(last, "value")? get(last, "value") : value{}; +} + +template +value +generator::_throw(args&&... a) +{ + function func(get(state, "throw")); + last = func(state, std::forward(a)...); + return has(last, "value")? get(last, "value") : value{}; +} + +template +value +generator::next(args&&... a) +{ + function func(get(state, "next")); + last = func(state, std::forward(a)...); + return has(last, "value")? get(last, "value") : value{}; +} + +inline bool +generator::done() +const +{ + return bool(get(last, "done")); +} + +} // namespace js +} // namespace ircd diff --git a/include/ircd/js/js.h b/include/ircd/js/js.h index 4f37ad318..bdb5daad3 100644 --- a/include/ircd/js/js.h +++ b/include/ircd/js/js.h @@ -86,3 +86,4 @@ inline JSVersion version(const char *const &v) { return JS_StringToVersion(v); #include "args.h" #include "trap.h" #include "trap_function.h" +#include "generator.h" diff --git a/ircd/js.cc b/ircd/js.cc index 31c9fb26a..921d0fee3 100644 --- a/ircd/js.cc +++ b/ircd/js.cc @@ -138,6 +138,11 @@ js::ReportOutOfMemory(ExclusiveContext *const c) // ircd/js/js.h - With 3rd party (JSAPI) symbols // +/////////////////////////////////////////////////////////////////////////////// +// +// ircd/js/generator.h +// + /////////////////////////////////////////////////////////////////////////////// // // ircd/js/trap_function.h