summaryrefslogtreecommitdiff
path: root/libtnsl/src/reflect
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2021-11-23 13:05:49 -0500
committerKyle Gunger <kgunger12@gmail.com>2021-11-23 13:05:49 -0500
commit5eeec21759dc49252ebbcdb5e0d9336f68d0a51e (patch)
treef3b5b759a1f68962a77608e816bbc5d2702ac78b /libtnsl/src/reflect
parent6444b3faef696b044d391b98151ebeb90eb3bb7f (diff)
Some changes, plus a logo.
Diffstat (limited to 'libtnsl/src/reflect')
-rw-r--r--libtnsl/src/reflect/dispatch.tnsl (renamed from libtnsl/src/reflect/dynamic.tnsl)0
-rw-r--r--libtnsl/src/reflect/lib.tnsl26
-rw-r--r--libtnsl/src/reflect/method.tnsl20
-rw-r--r--libtnsl/src/reflect/reflect.tnsl6
-rw-r--r--libtnsl/src/reflect/static.tnsl20
-rw-r--r--libtnsl/src/reflect/type.tnsl74
-rw-r--r--libtnsl/src/reflect/virtual.tnsl144
7 files changed, 175 insertions, 115 deletions
diff --git a/libtnsl/src/reflect/dynamic.tnsl b/libtnsl/src/reflect/dispatch.tnsl
index d346464..d346464 100644
--- a/libtnsl/src/reflect/dynamic.tnsl
+++ b/libtnsl/src/reflect/dispatch.tnsl
diff --git a/libtnsl/src/reflect/lib.tnsl b/libtnsl/src/reflect/lib.tnsl
deleted file mode 100644
index 0688e6f..0000000
--- a/libtnsl/src/reflect/lib.tnsl
+++ /dev/null
@@ -1,26 +0,0 @@
-/##
- Copyright 2021 Kyle Gunger
-
- Dual licensed under the CDDL 1.0 and BSD 3-Clause licenses.
-
- This file may only be used in accordance with one of the two
- licenses. You should have received a copy of each license with
- the source code. In the event that you did not recieve a copy
- of the licenses, they may be found at the following URLs:
-
- CDDL 1.0:
- https://opensource.org/licenses/CDDL-1.0
-
- BSD 3-Clause:
- https://opensource.org/licenses/BSD-3-Clause
-
- THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO
- WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE
- EXPRESS OR IMPLIED
-#/
-
-: extern const {}_library _LIB_TABLE
-
-; raw struct _library {
-
-} \ No newline at end of file
diff --git a/libtnsl/src/reflect/method.tnsl b/libtnsl/src/reflect/method.tnsl
deleted file mode 100644
index d346464..0000000
--- a/libtnsl/src/reflect/method.tnsl
+++ /dev/null
@@ -1,20 +0,0 @@
-/##
- Copyright 2021 Kyle Gunger
-
- Dual licensed under the CDDL 1.0 and BSD 3-Clause licenses.
-
- This file may only be used in accordance with one of the two
- licenses. You should have received a copy of each license with
- the source code. In the event that you did not recieve a copy
- of the licenses, they may be found at the following URLs:
-
- CDDL 1.0:
- https://opensource.org/licenses/CDDL-1.0
-
- BSD 3-Clause:
- https://opensource.org/licenses/BSD-3-Clause
-
- THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO
- WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE
- EXPRESS OR IMPLIED
-#/ \ No newline at end of file
diff --git a/libtnsl/src/reflect/reflect.tnsl b/libtnsl/src/reflect/reflect.tnsl
index 3c1d583..b3640c2 100644
--- a/libtnsl/src/reflect/reflect.tnsl
+++ b/libtnsl/src/reflect/reflect.tnsl
@@ -24,4 +24,10 @@
Type and method resolution, reflection and other required methods such as is
#; export module reflect
+ /: import
+ "type.tnsl"
+ "virtual.tnsl"
+ "resolver.tnsl"
+ "dispatch.tnsl"
+ :/
;/ \ No newline at end of file
diff --git a/libtnsl/src/reflect/static.tnsl b/libtnsl/src/reflect/static.tnsl
deleted file mode 100644
index d346464..0000000
--- a/libtnsl/src/reflect/static.tnsl
+++ /dev/null
@@ -1,20 +0,0 @@
-/##
- Copyright 2021 Kyle Gunger
-
- Dual licensed under the CDDL 1.0 and BSD 3-Clause licenses.
-
- This file may only be used in accordance with one of the two
- licenses. You should have received a copy of each license with
- the source code. In the event that you did not recieve a copy
- of the licenses, they may be found at the following URLs:
-
- CDDL 1.0:
- https://opensource.org/licenses/CDDL-1.0
-
- BSD 3-Clause:
- https://opensource.org/licenses/BSD-3-Clause
-
- THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO
- WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE
- EXPRESS OR IMPLIED
-#/ \ No newline at end of file
diff --git a/libtnsl/src/reflect/type.tnsl b/libtnsl/src/reflect/type.tnsl
index b36dfc5..7a19b7d 100644
--- a/libtnsl/src/reflect/type.tnsl
+++ b/libtnsl/src/reflect/type.tnsl
@@ -20,53 +20,21 @@
#/
/## tnsl.reflect._type
- Header data which prefixes all non-raw structs.
+ Header data which non-raw structs point to.
Upper limits for classes and libs defined here:
- - Max 2^32 libraries
- - Max 2^16 classes per library
+ - Max 2^16 libraries
+ - Max 2^16 modules/sub-modules per library
+ - Max 2^16 classes per module
- Max 2^8 Generics per class
#/
-; raw struct _type(uint8 N) {
- uint32
- _lib_index,
+; raw struct _type() {
uint16
- _type_index,
+ _library_id,
+ _module_id,
+ _type_id,
- {N}_type
- _generic_list
-}
-
-/## tnsl.reflect._method
- Metadata for methods (can be decoded from library
- symbol tables). Limits for methods defined here:
- - Max 2^8 inputs
- - Max 2^8 outputs
-#/
-; raw struct _method(uint8 I, O) {
- ~{}charp
- name,
-
- {I}_type
- inputs,
- {O}_type
- outputs,
-
- ~void
- address
-}
-
-/## tnsl.reflect._member
- Metadata about struct members
-#/
-; raw struct _member {
- ~{}charp
- name,
-
- uint
- offset,
-
- _type
- _member_type
+ {uint8}_type
+ _generics
}
/## tnsl.reflect._type_addresses
@@ -74,22 +42,30 @@
in a class
#/
; raw struct _type_addresses {
- ~{}uint
- _offsets,
- _super_offsets,
-
~{}_type
_supers,
+
+ ~{}uint
+ _super_offsets,
~{}_method
- _methods
+ _methods,
+
+ ~{}_member
+ _members
}
/; method _type
- /; _is (_type_header base)
+ /; _is (_type base) [bool]
+ ;/
+
+ /; inline _get (_type t, ~void s, _member m) [~void]
+ ;/
+
+ /; inline raw _call (_type t, ~void s, _method m, ~void p)
;/
- /; _get_method ()
+ /; _offset (_type cast) [uint]
;/
;/ \ No newline at end of file
diff --git a/libtnsl/src/reflect/virtual.tnsl b/libtnsl/src/reflect/virtual.tnsl
new file mode 100644
index 0000000..8891905
--- /dev/null
+++ b/libtnsl/src/reflect/virtual.tnsl
@@ -0,0 +1,144 @@
+/##
+ Copyright 2021 Kyle Gunger
+
+ Dual licensed under the CDDL 1.0 and BSD 3-Clause licenses.
+
+ This file may only be used in accordance with one of the two
+ licenses. You should have received a copy of each license with
+ the source code. In the event that you did not recieve a copy
+ of the licenses, they may be found at the following URLs:
+
+ CDDL 1.0:
+ https://opensource.org/licenses/CDDL-1.0
+
+ BSD 3-Clause:
+ https://opensource.org/licenses/BSD-3-Clause
+
+ THIS SOFTWARE/SOURCE CODE IS PROVIDED "AS IS" WITH NO
+ WARRANTY, GUARANTEE, OR CLAIM OF FITNESS FOR ANY PURPOSE
+ EXPRESS OR IMPLIED
+#/
+
+/## _LIB_TABLE
+ The array of library export trees.
+
+ Convention:
+ - index 0 is always reserved for language-specific types + libtnsl
+ - index 0 module 0 represents the fundimental in-built types like int
+#/
+: extern const {}~library _LIB_TABLE
+
+; raw struct library {
+ # Version
+ uint16
+ major,
+ minor,
+ patch
+
+ ~sym_node
+ root_node
+}
+
+/## tnsl.reflect._method
+ Metadata for methods (can be decoded from library
+ symbol tables). Limits for methods defined here:
+ - Max 2^8 inputs
+ - Max 2^8 outputs
+#/
+; raw struct _method {
+ {uint8}charp
+ name,
+
+ {uint8}~_type
+ inputs,
+ outputs,
+
+ ~void
+ address
+}
+
+/## tnsl.reflect._member
+ Metadata about struct members
+#/
+; raw struct _member {
+ {uint8}charp
+ name,
+
+ _type
+ member_type,
+
+ uint
+ byte_offset
+}
+
+/## tnsl.reflect.sym_node
+ Represents a module in a symbol tree
+#/
+; raw struct sym_node {
+ {uint8}charp
+ name,
+
+ uint16
+ id,
+
+ {}~sym_node
+ sub_modules,
+
+ {}~sym_type
+ sub_types
+}
+
+/## tnsl.reflect.sym_type
+ Represents a type in a symbol tree
+#/
+; raw struct sym_type {
+ {uint8}charp
+ name,
+
+ {uint8}~sym_type
+ super_types,
+
+}
+
+###############################
+# Traverse the Library Tree #
+###############################
+
+/; get_sym_node (~sym_node root, uint16 mod_id) [~sym_node]
+ /;loop (root != null)
+ /; loop (uint16 sub = 0; sub < len `root.sub_modules) [sub++]
+ /; if (mod_id < `root.sub_modules{sub}.id)
+ /; if (sub == 0)
+ ; return null
+ ;/
+ ;root = `root.sub_modules{sub - 1}
+ ; continue 1
+ ;; else if (mod_id == `root.sub_modules{sub}.id)
+ ; return `root.sub_modules{sub}
+ ;/
+ ;/
+
+ ; break
+ ;/
+
+ ; return null
+;/
+
+/; get_sym_node (uint16 lib_id, mod_id) [~sym_node]
+
+ ;~library lib = _LIB_TABLE{lib_id}
+
+ ;return get_sym_node(`lib.root_node, mod_id)
+;/
+
+/; get_sym_type(uint16 lib_id, mod_id, typ_id) [~sym_type]
+
+ ;~library lib = _LIB_TABLE{lib_id}
+ ;~sym_node mod = get_sym_node(`lib.root_node, mod_id)
+
+ ;return `mod.sub_types{typ_id}
+;/
+
+/; get_sym_type(`const {}charp path) [~sym_type]
+
+;/ \ No newline at end of file