summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-04-23 08:01:36 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-05-06 11:50:46 -0600
commita83c95e9f46ef695a55fc7a6911e11846da9903c (patch)
tree42abde5f3b34b239bb95e84200ea16ad4a4c562d
parentb3ee525e9e0d49485714770d898cf9c28769313a (diff)
Merge libobj into libmisc
-rw-r--r--CMakeLists.txt1
-rw-r--r--HACKING.md5
-rw-r--r--build-aux/measurestack/app_main.py9
-rw-r--r--build-aux/measurestack/app_plugins.py70
-rw-r--r--lib9p/core_gen/c.py4
-rw-r--r--lib9p/core_generated.c2
-rw-r--r--lib9p/srv_include/lib9p/srv.h2
-rw-r--r--libfmt/CMakeLists.txt2
-rw-r--r--libfmt/include/libfmt/fmt.h2
-rw-r--r--libfmt/libmisc.c10
-rw-r--r--libfmt/libobj.c17
-rw-r--r--libhw_cr/host_net.c2
-rw-r--r--libhw_cr/w5500.c2
-rw-r--r--libhw_generic/CMakeLists.txt1
-rw-r--r--libhw_generic/include/libhw/generic/alarmclock.h2
-rw-r--r--libhw_generic/include/libhw/generic/io.h2
-rw-r--r--libmisc/CMakeLists.txt2
-rw-r--r--libmisc/include/libmisc/obj.h (renamed from libobj/include/libobj/obj.h)12
-rw-r--r--libmisc/tests/test_obj.c (renamed from libobj/tests/test_obj.c)4
-rw-r--r--libmisc/tests/test_obj_nest.c (renamed from libobj/tests/test_nest.c)4
-rw-r--r--libobj/CMakeLists.txt13
l---------libobj/tests/test.h1
22 files changed, 60 insertions, 109 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3c5251d..659f530 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -124,7 +124,6 @@ function(add_lib_test arg_libname arg_testname)
endfunction()
add_subdirectory(libmisc)
-add_subdirectory(libobj)
add_subdirectory(libfmt)
add_subdirectory(libcr)
add_subdirectory(libcr_ipc)
diff --git a/HACKING.md b/HACKING.md
index 574f729..3403b45 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -9,9 +9,8 @@
Our own "flavor" of C: GNU C, plus making use of:
- - `libobj/`: For Go-like object-oriented programming
- - `libmisc/`: Low-level C programming utilities; sort of an augmented
- "libc"
+ - `libmisc/`: Low-level C programming utilities (including Go-like
+ object-oriented programming); sort of an augmented "libc"
Our own tiny cooperative-multitasking OS:
diff --git a/build-aux/measurestack/app_main.py b/build-aux/measurestack/app_main.py
index 7573146..c670325 100644
--- a/build-aux/measurestack/app_main.py
+++ b/build-aux/measurestack/app_main.py
@@ -27,8 +27,8 @@ def main(
# sbc-harness ####################################################
- libobj_plugin = app_plugins.LibObjPlugin(arg_c_fnames)
- lib9p_plugin = app_plugins.Lib9PPlugin(arg_base_dir, arg_c_fnames, libobj_plugin)
+ libmisc_plugin = app_plugins.LibMiscPlugin(arg_c_fnames)
+ lib9p_plugin = app_plugins.Lib9PPlugin(arg_base_dir, arg_c_fnames, libmisc_plugin)
def sbc_is_thread(name: QName) -> int:
if str(name).endswith("_cr") and name.base() != BaseName("lib9p_srv_read_cr"):
@@ -47,13 +47,12 @@ def main(
plugins += [
app_plugins.CmdPlugin(),
- libobj_plugin,
+ libmisc_plugin,
app_plugins.PicoFmtPlugin(arg_pico_platform),
- app_plugins.LibHWPlugin(arg_pico_platform, libobj_plugin),
+ app_plugins.LibHWPlugin(arg_pico_platform, libmisc_plugin),
app_plugins.LibCRPlugin(),
app_plugins.LibCRIPCPlugin(),
lib9p_plugin,
- app_plugins.LibMiscPlugin(),
]
# pico-sdk #######################################################
diff --git a/build-aux/measurestack/app_plugins.py b/build-aux/measurestack/app_plugins.py
index bbb0eae..ae2dba9 100644
--- a/build-aux/measurestack/app_plugins.py
+++ b/build-aux/measurestack/app_plugins.py
@@ -14,7 +14,6 @@ from .util import synthetic_node
# pylint: disable=unused-variable
__all__ = [
"CmdPlugin",
- "LibObjPlugin",
"LibHWPlugin",
"LibCRPlugin",
"LibCRIPCPlugin",
@@ -66,7 +65,7 @@ re_lo_implementation = re.compile(
re_call_objcall = re.compile(r"LO_CALL\((?P<obj>[^,]+), (?P<meth>[^,)]+)[,)].*")
-class LibObjPlugin:
+class LibMiscPlugin:
objcalls: dict[str, set[QName]] # method_name => {method_impls}
def __init__(self, arg_c_fnames: typing.Collection[str]) -> None:
@@ -120,7 +119,6 @@ class LibObjPlugin:
def indirect_callees(
self, loc: str, line: str
) -> tuple[typing.Collection[QName], bool] | None:
-
if "/3rd-party/" in loc:
return None
if m := re_call_objcall.fullmatch(line):
@@ -132,16 +130,29 @@ class LibObjPlugin:
return None
def skipmodels(self) -> dict[BaseName, analyze.SkipModel]:
- return {}
+ return {
+ BaseName("__assert_msg_fail"): analyze.SkipModel(
+ {BaseName("__assert_msg_fail")}, self._skipmodel___assert_msg_fail
+ ),
+ }
+
+ def _skipmodel___assert_msg_fail(
+ self, chain: typing.Sequence[QName], call: QName
+ ) -> bool:
+ if call.base() in [BaseName("__lm_printf"), BaseName("__lm_light_printf")]:
+ return any(
+ c.base() == BaseName("__assert_msg_fail") for c in reversed(chain[:-1])
+ )
+ return False
class LibHWPlugin:
pico_platform: str
- libobj: LibObjPlugin
+ libmisc: LibMiscPlugin
- def __init__(self, arg_pico_platform: str, libobj: LibObjPlugin) -> None:
+ def __init__(self, arg_pico_platform: str, libmisc: LibMiscPlugin) -> None:
self.pico_platform = arg_pico_platform
- self.libobj = libobj
+ self.libmisc = libmisc
def is_intrhandler(self, name: QName) -> bool:
return name.base() in [
@@ -175,11 +186,11 @@ class LibHWPlugin:
"io_readwritev",
]:
if f"{fn}(" in line:
- return self.libobj.indirect_callees(loc, f"LO_CALL(x, {fn[3:]})")
+ return self.libmisc.indirect_callees(loc, f"LO_CALL(x, {fn[3:]})")
if "io_read(" in line:
- return self.libobj.indirect_callees(loc, "LO_CALL(x, readv)")
+ return self.libmisc.indirect_callees(loc, "LO_CALL(x, readv)")
if "io_writev(" in line:
- return self.libobj.indirect_callees(loc, "LO_CALL(x, writev)")
+ return self.libmisc.indirect_callees(loc, "LO_CALL(x, writev)")
if "trigger->cb(trigger->cb_arg)" in line:
ret = [
QName("alarmclock_sleep_intrhandler"),
@@ -280,11 +291,11 @@ class Lib9PPlugin:
self,
arg_base_dir: str,
arg_c_fnames: typing.Collection[str],
- libobj_plugin: LibObjPlugin,
+ libmisc_plugin: LibMiscPlugin,
) -> None:
self.formatters = {
x.base()
- for x in libobj_plugin.objcalls["format"]
+ for x in libmisc_plugin.objcalls["format"]
if str(x.base()).startswith("lib9p_")
}
@@ -426,41 +437,6 @@ class Lib9PPlugin:
return False
-class LibMiscPlugin:
- def is_intrhandler(self, name: QName) -> bool:
- return False
-
- def init_array(self) -> typing.Collection[QName]:
- return []
-
- def extra_includes(self) -> typing.Collection[BaseName]:
- return []
-
- def extra_nodes(self) -> typing.Collection[Node]:
- return []
-
- def indirect_callees(
- self, loc: str, line: str
- ) -> tuple[typing.Collection[QName], bool] | None:
- return None
-
- def skipmodels(self) -> dict[BaseName, analyze.SkipModel]:
- return {
- BaseName("__assert_msg_fail"): analyze.SkipModel(
- {BaseName("__assert_msg_fail")}, self._skipmodel___assert_msg_fail
- ),
- }
-
- def _skipmodel___assert_msg_fail(
- self, chain: typing.Sequence[QName], call: QName
- ) -> bool:
- if call.base() in [BaseName("__lm_printf"), BaseName("__lm_light_printf")]:
- return any(
- c.base() == BaseName("__assert_msg_fail") for c in reversed(chain[:-1])
- )
- return False
-
-
class PicoFmtPlugin:
known_fct: dict[BaseName, BaseName]
diff --git a/lib9p/core_gen/c.py b/lib9p/core_gen/c.py
index c05e457..393766b 100644
--- a/lib9p/core_gen/c.py
+++ b/lib9p/core_gen/c.py
@@ -35,9 +35,9 @@ def gen_c(versions: set[str], typs: list[idl.UserType]) -> str:
#include "core_tables.h"
#include "core_utf8.h"
"""
- # libobj vtables ###########################################################
+ # libmisc/obj.h vtables ####################################################
ret += """
-/* libobj vtables *************************************************************/
+/* libmisc/obj.h vtables ******************************************************/
"""
for typ in typs:
ret += cutil.ifdef_push(1, c9util.ver_ifdef(typ.in_versions))
diff --git a/lib9p/core_generated.c b/lib9p/core_generated.c
index 3c2ee28..2532d12 100644
--- a/lib9p/core_generated.c
+++ b/lib9p/core_generated.c
@@ -12,7 +12,7 @@
#include "core_tables.h"
#include "core_utf8.h"
-/* libobj vtables *************************************************************/
+/* libmisc/obj.h vtables ******************************************************/
#if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_L || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_uninitialized
LO_IMPLEMENTATION_C(fmt_formatter, lib9p_tag_t, lib9p_tag, static);
LO_IMPLEMENTATION_C(fmt_formatter, lib9p_fid_t, lib9p_fid, static);
diff --git a/lib9p/srv_include/lib9p/srv.h b/lib9p/srv_include/lib9p/srv.h
index ca80e7b..c40c85a 100644
--- a/lib9p/srv_include/lib9p/srv.h
+++ b/lib9p/srv_include/lib9p/srv.h
@@ -12,8 +12,8 @@
#include <libcr_ipc/rpc.h>
#include <libhw/generic/net.h>
#include <libmisc/assert.h>
+#include <libmisc/obj.h>
#include <libmisc/private.h>
-#include <libobj/obj.h>
#include <lib9p/core.h>
diff --git a/libfmt/CMakeLists.txt b/libfmt/CMakeLists.txt
index f65d462..dc626f7 100644
--- a/libfmt/CMakeLists.txt
+++ b/libfmt/CMakeLists.txt
@@ -7,11 +7,9 @@ add_library(libfmt INTERFACE)
target_include_directories(libfmt PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_sources(libfmt INTERFACE
libmisc.c
- libobj.c
quote.c
)
target_link_libraries(libfmt INTERFACE
pico_fmt
libmisc
- libobj
)
diff --git a/libfmt/include/libfmt/fmt.h b/libfmt/include/libfmt/fmt.h
index 1b5bde1..692abf2 100644
--- a/libfmt/include/libfmt/fmt.h
+++ b/libfmt/include/libfmt/fmt.h
@@ -10,7 +10,7 @@
#include <pico/fmt_printf.h>
#include <pico/fmt_install.h>
-#include <libobj/obj.h>
+#include <libmisc/obj.h>
/**
* An object that implements fmt_formatter can be printed using
diff --git a/libfmt/libmisc.c b/libfmt/libmisc.c
index 803b281..134b9f0 100644
--- a/libfmt/libmisc.c
+++ b/libfmt/libmisc.c
@@ -61,3 +61,13 @@ int __lm_light_printf(const char *format, ...) {
va_end(va);
return ret;
}
+
+static void libfmt_conv_formatter(struct fmt_state *state) {
+ lo_interface fmt_formatter obj = va_arg(*state->args, lo_interface fmt_formatter);
+ LO_CALL(obj, format, state);
+}
+
+[[gnu::constructor]]
+static void libfmt_install_formatter(void) {
+ fmt_install('v', libfmt_conv_formatter);
+}
diff --git a/libfmt/libobj.c b/libfmt/libobj.c
deleted file mode 100644
index e4b833b..0000000
--- a/libfmt/libobj.c
+++ /dev/null
@@ -1,17 +0,0 @@
-/* libfmt/libobj.c - Integrate pico-fmt with libobj
- *
- * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com>
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-#include <libfmt/fmt.h>
-
-static void libfmt_conv_formatter(struct fmt_state *state) {
- lo_interface fmt_formatter obj = va_arg(*state->args, lo_interface fmt_formatter);
- LO_CALL(obj, format, state);
-}
-
-[[gnu::constructor]]
-static void libfmt_install_formatter(void) {
- fmt_install('v', libfmt_conv_formatter);
-}
diff --git a/libhw_cr/host_net.c b/libhw_cr/host_net.c
index 03cf7db..01f4370 100644
--- a/libhw_cr/host_net.c
+++ b/libhw_cr/host_net.c
@@ -22,7 +22,7 @@
#include <libmisc/alloc.h>
#include <libmisc/assert.h>
#include <libmisc/macro.h>
-#include <libobj/obj.h>
+#include <libmisc/obj.h>
#include <libhw/generic/alarmclock.h>
diff --git a/libhw_cr/w5500.c b/libhw_cr/w5500.c
index 2d6ac48..e676364 100644
--- a/libhw_cr/w5500.c
+++ b/libhw_cr/w5500.c
@@ -124,7 +124,7 @@ static const char *w5500_state_str(uint8_t state) {
}
}
-/* libobj *********************************************************************/
+/* libmisc/obj.h **************************************************************/
LO_IMPLEMENTATION_C(io_closer, struct _w5500_socket, w5500_tcplist, static);
LO_IMPLEMENTATION_C(net_stream_listener, struct _w5500_socket, w5500_tcplist, static);
diff --git a/libhw_generic/CMakeLists.txt b/libhw_generic/CMakeLists.txt
index 603f30b..602168b 100644
--- a/libhw_generic/CMakeLists.txt
+++ b/libhw_generic/CMakeLists.txt
@@ -7,7 +7,6 @@ add_library(libhw_generic INTERFACE)
target_include_directories(libhw_generic PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(libhw_generic INTERFACE
libmisc
- libobj
)
target_sources(libhw_generic INTERFACE
diff --git a/libhw_generic/include/libhw/generic/alarmclock.h b/libhw_generic/include/libhw/generic/alarmclock.h
index 39050c9..6ce2513 100644
--- a/libhw_generic/include/libhw/generic/alarmclock.h
+++ b/libhw_generic/include/libhw/generic/alarmclock.h
@@ -9,8 +9,8 @@
#include <stdint.h> /* for uint{n}_t and UINT{n}_C */
+#include <libmisc/obj.h>
#include <libmisc/private.h>
-#include <libobj/obj.h>
/* Useful constants ***********************************************************/
diff --git a/libhw_generic/include/libhw/generic/io.h b/libhw_generic/include/libhw/generic/io.h
index 62ddbb3..6adce8c 100644
--- a/libhw_generic/include/libhw/generic/io.h
+++ b/libhw_generic/include/libhw/generic/io.h
@@ -11,7 +11,7 @@
#include <stdint.h> /* for uintptr_t */
#include <sys/types.h> /* for ssize_t */
-#include <libobj/obj.h>
+#include <libmisc/obj.h>
/* structs ********************************************************************/
diff --git a/libmisc/CMakeLists.txt b/libmisc/CMakeLists.txt
index 1bce759..8c9fa57 100644
--- a/libmisc/CMakeLists.txt
+++ b/libmisc/CMakeLists.txt
@@ -20,5 +20,7 @@ add_lib_test(libmisc test_hash)
add_lib_test(libmisc test_log)
add_lib_test(libmisc test_macro)
add_lib_test(libmisc test_map)
+add_lib_test(libmisc test_obj)
+add_lib_test(libmisc test_obj_nest)
add_lib_test(libmisc test_private)
add_lib_test(libmisc test_rand)
diff --git a/libobj/include/libobj/obj.h b/libmisc/include/libmisc/obj.h
index 06b7298..76dde91 100644
--- a/libobj/include/libobj/obj.h
+++ b/libmisc/include/libmisc/obj.h
@@ -1,11 +1,11 @@
-/* libobj/obj.h - A simple Go-ish object system
+/* libmisc/obj.h - A simple Go-ish object system
*
* Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-#ifndef _LIBOBJ_OBJ_H_
-#define _LIBOBJ_OBJ_H_
+#ifndef _LIBMISC_OBJ_H_
+#define _LIBMISC_OBJ_H_
#include <libmisc/macro.h>
@@ -65,7 +65,7 @@
#define _LO_IFACE_VTABLE3_lo_func(_ARG_ret_type, _ARG_func_name, ...) _ARG_ret_type (*_ARG_func_name)(void * __VA_OPT__(,) __VA_ARGS__);
#define _LO_IFACE_VTABLE4(_tuple_typ, ...) _LO_IFACE_VTABLE4_##_tuple_typ(__VA_ARGS__)
-#define _LO_IFACE_VTABLE4_lo_nest(_ARG_child_iface_name) static_assert(0, "BUG: libobj cannot nest interfaces more than 4 deep");
+#define _LO_IFACE_VTABLE4_lo_nest(_ARG_child_iface_name) static_assert(0, "BUG: libmisc/obj.h cannot nest interfaces more than 4 deep");
#define _LO_IFACE_VTABLE4_lo_func(_ARG_ret_type, _ARG_func_name, ...) _ARG_ret_type (*_ARG_func_name)(void * __VA_OPT__(,) __VA_ARGS__);
#define _LO_IFACE_PROTO(_ARG_iface_name, _tuple_typ, ...) _LO_IFACE_PROTO_##_tuple_typ(_ARG_iface_name, __VA_ARGS__)
@@ -166,8 +166,8 @@
#define _LO_IMPL_VTABLE3_lo_func(_ARG_impl_name, _ARG_ret_type, _ARG_func_name, ...) ._ARG_func_name = (void*)_ARG_impl_name##_##_ARG_func_name,
#define _LO_IMPL_VTABLE4(_ARG_impl_name, _tuple_typ, ...) _LO_IMPL_VTABLE4_##_tuple_typ(_ARG_impl_name, __VA_ARGS__)
-#define _LO_IMPL_VTABLE4_lo_nest(_ARG_impl_name, _ARG_child_iface_name) static_assert(0, "BUG: libobj cannot nest interfaces more than 4 deep");
+#define _LO_IMPL_VTABLE4_lo_nest(_ARG_impl_name, _ARG_child_iface_name) static_assert(0, "BUG: libmisc/obj.h cannot nest interfaces more than 4 deep");
#define _LO_IMPL_VTABLE4_lo_func(_ARG_impl_name, _ARG_ret_type, _ARG_func_name, ...) ._ARG_func_name = (void*)_ARG_impl_name##_##_ARG_func_name,
-#endif /* _LIBOBJ_OBJ_H_ */
+#endif /* _LIBMISC_OBJ_H_ */
diff --git a/libobj/tests/test_obj.c b/libmisc/tests/test_obj.c
index d6861dc..687ad4e 100644
--- a/libobj/tests/test_obj.c
+++ b/libmisc/tests/test_obj.c
@@ -1,10 +1,10 @@
-/* libobj/tests/test_obj.c - Tests for <libobj/obj.h>
+/* libmisc/tests/test_obj.c - Tests for <libmisc/obj.h>
*
* Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
-#include <libobj/obj.h>
+#include <libmisc/obj.h>
#include "test.h"
diff --git a/libobj/tests/test_nest.c b/libmisc/tests/test_obj_nest.c
index f18b018..bb9d6de 100644
--- a/libobj/tests/test_nest.c
+++ b/libmisc/tests/test_obj_nest.c
@@ -1,4 +1,4 @@
-/* libobj/tests/test_nest.c - Tests for <libobj/obj.h>
+/* libmisc/tests/test_obj_nest.c - Tests for <libmisc/obj.h> nesting
*
* Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
@@ -6,7 +6,7 @@
#include <string.h> /* for memcpy() */
-#include <libobj/obj.h>
+#include <libmisc/obj.h>
#include "test.h"
diff --git a/libobj/CMakeLists.txt b/libobj/CMakeLists.txt
deleted file mode 100644
index f452e8a..0000000
--- a/libobj/CMakeLists.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# libobj/CMakeLists.txt - A simple Go-ish object system built on GCC -fplan9-extensions
-#
-# Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
-# SPDX-License-Identifier: AGPL-3.0-or-later
-
-add_library(libobj INTERFACE)
-target_include_directories(libobj PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
-target_link_libraries(libobj INTERFACE
- libmisc
-)
-
-add_lib_test(libobj test_obj)
-add_lib_test(libobj test_nest)
diff --git a/libobj/tests/test.h b/libobj/tests/test.h
deleted file mode 120000
index 2fb1bd5..0000000
--- a/libobj/tests/test.h
+++ /dev/null
@@ -1 +0,0 @@
-../../libmisc/tests/test.h \ No newline at end of file