From 9cd55d2b0f04d27babb66783b889f616aba844d4 Mon Sep 17 00:00:00 2001 From: Pradeep Gangatharan Date: Tue, 16 Dec 2025 16:20:03 +0530 Subject: [PATCH] update documentation --- Build/build.bat | 4 +- Documentation/IDL.md | 128 ++++++++++++++++++++++++++++++++++--------- README.md | 13 +++-- 3 files changed, 112 insertions(+), 33 deletions(-) diff --git a/Build/build.bat b/Build/build.bat index 91fce019..e67622d5 100644 --- a/Build/build.bat +++ b/Build/build.bat @@ -11,7 +11,7 @@ echo "Build act.win64.exe" go build -o ..\act.win64.exe %Sources% echo "Patching properties of act.win64.exe" -..\build\verpatch ..\act.win64.exe /high /va 1.8.0 /pv "1.8.0-develop" /s copyright "(c) 2018-2019 ACT Developers" /s desc "ACT is a code generator for software components" /s productName "Automatic Component Toolkit" +..\build\verpatch ..\act.win64.exe /high /va 1.8.1 /pv "1.8.1-develop" /s copyright "(c) 2018-2019 ACT Developers" /s desc "ACT is a code generator for software components" /s productName "Automatic Component Toolkit" set GOOS=windows set GOARCH=386 @@ -19,7 +19,7 @@ echo "Build act.win32.exe" go build -o ..\act.win32.exe %Sources% echo "Patching properties of act.win32.exe" -..\build\verpatch ..\act.win32.exe /high /va 1.8.0 /pv "1.8.0-develop" /s copyright "(c) 2018-2019 ACT Developers" /s desc "ACT is a code generator for software components" /s productName "Automatic Component Toolkit" +..\build\verpatch ..\act.win32.exe /high /va 1.8.1 /pv "1.8.1-develop" /s copyright "(c) 2018-2019 ACT Developers" /s desc "ACT is a code generator for software components" /s productName "Automatic Component Toolkit" set GOOS=linux set GOARCH=amd64 diff --git a/Documentation/IDL.md b/Documentation/IDL.md index 2a9b8447..723b57bd 100644 --- a/Documentation/IDL.md +++ b/Documentation/IDL.md @@ -4,7 +4,7 @@ -| **Version** | 1.6.0 | +| **Version** | 1.8.1 | | --- | --- | ## Disclaimer @@ -78,7 +78,7 @@ Element **\** of type **CT\_Component** | copyright | **xs:string** | required | | The legal copyright holder. | | basename | **ST\_BaseName** | required | | The basename will be used as prefix for generated filenames and all sorts of identifiers in the generated source code. | | version | **ST\_Version** | required | | The semantic version of this component. | -| year | **ST\_Year** | optional | the current year | The year associcated with the copyright. | +| year | **ST\_Year** | optional | the current year | The year associated with the copyright. | | @anyAttribute | | | | | It is RECOMMENDED that components generated with ACT follow the [semantic versioning scheme](https://semver.org/). @@ -101,11 +101,17 @@ The names of the \-, \-, \- and \-elements MU Element **\** of type **CT\_ImportComponent** ![element importcomponent](images/element_importcomponent.png) +##### Attributes +| Name | Type | Use | Default | Annotation | +| --- | --- | --- | --- | --- | +| uri | **xs:string** | optional | | The relative location of another ACT-IDL-file. | +| namespace | **ST\_NameSpace** | optional | | The namespace of the imported component. | + The \ element defines the namespace and the relative location of another ACT-IDL-file and is the mechanism that allows injecting another ACT-component into the ACT-component at hand. The `namespace` attribute of the \ element MUST match the `namespace` of the \ element within the file at location of the `uri` attribute. -The `class`es, `functiontype`s, `struct`s and `enum`s of the importend component with will be available as `param`s of methods in this ACT-component. +The `class`es, `functiontype`s, `struct`s and `enum`s of the imported component will be available as `param`s of methods in this ACT-component. To use an entity with name `Y` from another ACT component (with namespace `X`) as `class` of a `param` in this ACT component set the `class`-attribute to `class="X:Y"`. To be able to inject a component `Inner` into a component `Outer`, component `Inner` must define the `symbollookupmethod` in its global section and component `Outer` must define the `injectionmethod`. @@ -147,6 +153,8 @@ Element **\** of type **CT\_ImplementationsList** The CT\_ImplementationsList type contains a list of [implementation](#7-export) elements. The \ elements in the \ element determine the languages for which implementation stubs will be generated. +>**Note:** Currently, only `Cpp` (C++) and `Pascal` are supported for implementations. Other languages listed in [ST\_Language](#189-language) are not yet supported for generating implementation stubs. + ## 7. Export Element **\**
@@ -164,10 +172,12 @@ of type **CT\_Export** ##### Attributes | Name | Type | Use | Default | Annotation | | --- | --- | --- | --- | --- | -| language | **ST\_Language** | required | | The programming langugage of this export. | +| language | **ST\_Language** | required | | The programming language of this export. | | indentation | **ST\_Indentation** | optional | 4spaces | Which string should be used to denote a single level of indentation in the generated source code files. | -| stubidentifier | **ST\_StubIdentifier** | optional | "" | Generated sources files of this export will follow the naming schme "...${BaseName}_${stubidentifier}...". Only used in \ right now. | -| classidentifier | **ST\_ClassIdentifier** | optional | "" | Generated classes of this export will follow the naming schme "...${ClassIdentifier}_${ClassName}...". The only binding that supports this are the C++-bindings.| +| stubidentifier | **ST\_StubIdentifier** | optional | "" | Generated sources files of this export will follow the naming scheme "...${BaseName}_${stubidentifier}...". Only used in \ right now. | +| classidentifier | **ST\_ClassIdentifier** | optional | "" | Generated classes of this export will follow the naming scheme "...${ClassIdentifier}_${ClassName}...". The only binding that supports this are the C++-bindings. | +| documentation | **xs:string** | optional | | Specifies the documentation format to generate. Currently only "sphinx" is supported for C++ bindings. | +| version | **xs:string** | optional | | Specifies a version string for this binding. For Java bindings, this attribute is used to specify the Java version: "8" or "1.8" for Java 8, "9" or "1.9" for Java 9. If not specified for Java bindings, the default is Java 9. | ## 8. Global Element **\** of type **CT\_Global** @@ -178,16 +188,17 @@ Element **\** of type **CT\_Global** | Name | Type | Use | Default | Annotation | | --- | --- | --- | --- | --- | | baseclassname | **ST\_Name** | required | | Specifies the name of a class that is the base class for all classes of the generated component. | +| stringoutclassname | **ST\_Name** | optional | | Specifies the name of a class (or its parent hierarchy) that enables string output parameter caching. When specified, methods in classes derived from this class that return strings can use caching to improve performance. If omitted, string output caching is disabled. | | acquiremethod | **ST\_Name** | required | | Specifies the name of the method used to acquire ownership of a class instance owned by the generated component. | | releasemethod | **ST\_Name** | required | | Specifies the name of the method used to release ownership of a class instance owned by the generated component. | | errormethod | **ST\_Name** | required | | Specifies the name of the method used to query the last error that occured during the call of class's method. | | versionmethod | **ST\_Name** | required | | Specifies the name of the method used to obtain the major, minor and micro version of the component. | -| prereleasemethod | **ST\_Name** | required | | Specifies the name of the method used to obtain the prerelease information of the component. | +| prereleasemethod | **ST\_Name** | optional | | Specifies the name of the method used to obtain the prerelease information of the component. | | classtypeidmethod | **ST\_Name** | required | | Specifies the name of the method in base class used to get class type id of an object. | | buildinfomethod | **ST\_Name** | optional | | Specifies the name of the method used to obtain the build information of the component. | | injectionmethod | **ST\_Name** | optional | | Specifies the name of the method used to inject the symbollookupmethod another ACT component into this component at runtime. | | symbollookupmethod | **ST\_Name** | optional | | Specifies the name of the method that returns the address of a given symbol exported by this component. | -| journalmethod | **ST\_Name** | optional | | Specifies the name of the method used to set the journal file. If ommitted, journalling will not be built into the component. | +| journalmethod | **ST\_Name** | optional | | Specifies the name of the method used to set the journal file. If omitted, journalling will not be built into the component. | The \ element contains a list of [method](#10-function-type) elements that define the exported global functions of the component and defines special methods of the component. The names of the \ elements MUST be unique within the \ element. @@ -197,10 +208,10 @@ This class will be the base class for all classes of the generated component. The `acquiremethod`- and `releasemethod`-attributes must each be the name of a \ within the \ element of a component that has exactly one parameter with `type="class"`, `class="BaseClass"` and `pass="in"`. The `versionmethod`-attribute must be the name of a \ within the \ element of a component that has exactly three parameters. The three parameters MUST be of type `type="uint32"` and `pass="out"`. -The `prereleasemethod`-attribute is optional an can be the name of a \ within the \ element of a component that has two parameters. +The `prereleasemethod`-attribute is optional and can be the name of a \ within the \ element of a component that has two parameters. The first parameter MUST be of type `type="bool"` and `pass="return"`, the second parameter MUST be of type `type="string"` and `pass="out"`. -The `classtypeidmethod`- must be the name of a \ within baseclassname \ element of a component that has exactly one parameter with `type="uint64"` and `pass="return"`. -The `buildinfomethod`-attribute is optional an can be the name of a \ within the \ element of a component that has two parameters. +The `classtypeidmethod`-attribute must be the name of a \ within the baseclassname \ element of a component that has exactly one parameter with `type="uint64"` and `pass="return"`. +The `buildinfomethod`-attribute is optional and can be the name of a \ within the \ element of a component that has two parameters. The first parameter MUST be of type `type="bool"` and `pass="return"`, the second parameter MUST be of type `type="string"` and `pass="out"`. The `errormethod`-attribute must be the name of a \ within the \ element of a method that has exactly three parameters: @@ -210,7 +221,7 @@ The `errormethod`-attribute must be the name of a \ within the \ If the `injectionmethod` attribute is given, it must be the name of a \ within the \ element of a method that has exactly two parameters with `type="string"` and `pass="in"` and `type="pointer"` and `pass="in"`. -If the `symbollookupmethod` attribute is given, it must be the name of a \ within the \ element of a method that has exactly one parameter with `type="pointer"` and `pass="return"`. The implemntation of this method is fully autogenerated and returns the address of another internal lookup method. This internal lookup method in turn is similar to a `GetProcAddress`- or `dlsym`-method: given the name of a method in this component, it provides the address of a method in this component with this name. The return value of the `symbollookupmethod` is usually passed into the `injectionmethod` of another component. +If the `symbollookupmethod` attribute is given, it must be the name of a \ within the \ element of a method that has exactly one parameter with `type="pointer"` and `pass="return"`. The implementation of this method is fully autogenerated and returns the address of another internal lookup method. This internal lookup method in turn is similar to a `GetProcAddress`- or `dlsym`-method: given the name of a method in this component, it provides the address of a method in this component with this name. The return value of the `symbollookupmethod` is usually passed into the `injectionmethod` of another component. If the `journalmethod` attribute is given, it must be the name of a \ within the \ element of a method that has exactly one parameter with `type="string"` and `pass="in"`. @@ -225,6 +236,7 @@ Element **\** of type **CT\_Class** | name | **ST\_Name** | required | | The name of this class. | | parent | **ST\_Name** | optional | | The name of the parent class of this class. | | description | **ST\_Description** | optional | | A description of this class. | +| threadsafetyoption | **xs:string** | optional | "none" | Specifies the thread safety level for this class. Valid values are: `none` (no thread safety), `soft` (locks only when strings are returned), `strict` (locks on every method call). Child classes cannot have a less strict option than their parent. If not specified, inherits from parent or defaults to `none`. | The \ element contains a list of [method](#10-function-type) elements that define the exported member functions of this class. The names of the \ elements MUST be unique in this list. @@ -250,7 +262,10 @@ of Complex type **CT\_FunctionType** | Name | Type | Use | Default | Annotation | | --- | --- | --- | --- | --- | | name | **ST\_Name** | required | | The name of this function type. | -| description | **ST\_Description** | required | | A description of this function type. | +| description | **ST\_ErrorDescription** | optional | | A description of this function type. | + +>**Note:** The \ element (used within \ and \) also supports the following additional attribute: +>- `disablestringoutcache`: **xs:boolean** (optional, default: `false`): When set to `true`, disables string output parameter caching for this method, even if the class is part of the string output class hierarchy defined by `stringoutclassname` in the \ element. The CT\_FunctionType-type describes the signature of a function in the interface. Each element of type CT\_FunctionType contains a list of [param](#11-param) elements. @@ -270,8 +285,8 @@ Element **\** of type **CT\_Param** | name | **ST\_Name** | required | | The name of this parameter. | | pass | **ST\_Pass** | required | | Specifies whether the parameter is passed "in", "out" or as "return"-value of the enclosing functiontype. | | type | **ST\_Type** | required | | The type of this parameter. | -| class | **ST\_Name** | optional | | Required if the type is an [**ST\_ComposedType**](#173-composedtype) | -| description | **ST\_Description** | optional | | A description of this enumerated type. | +| class | **ST\_NameSpacedClassName** | optional | | Required if the type is an [**ST\_ComposedType**](#183-composedtype). For imported components, use the format "Namespace:ClassName" to reference a class from another component. | +| description | **ST\_Description** | optional | | A description of this parameter. | ## 12. Enum @@ -333,9 +348,9 @@ Element **\** of type **CT\_Member** | columns | **xs:positiveInteger** | optional | 1 | The number of columns of this member. | | description | **ST\_Description** | optional | | A description of this member. | -The \ element defines a member (or "field") within a struct. Only [**ST\_ScalarType**](#172-scalartype) is allowed within structs. -By default, the member defines a single value of its type within the enclusing struct. One- or two-dimensional arrays of fixed size can be -defined by setting the rows and colums attributes to the desired size of the array. +The \ element defines a member (or "field") within a struct. Only [**ST\_ScalarType**](#182-scalartype) is allowed within structs. +By default, the member defines a single value of its type within the enclosing struct. One- or two-dimensional arrays of fixed size can be +defined by setting the rows and columns attributes to the desired size of the array. ## 16. Errors @@ -360,7 +375,7 @@ Element **\** of type **CT\_Error** | --- | --- | --- | --- | --- | | name | **ST\_ErrorName** | required | | The name of this error. | | code | **xs:positiveInteger** | required | | The numerical error code of this error. | -| description | **ST\_ErrorDescription** | otpional | | A short description of this error. | +| description | **ST\_ErrorDescription** | optional | | A short description of this error. | ## 18. Simple Types @@ -373,12 +388,12 @@ For now, please look the up in the [ACT.xsd](../Source/ACT.xsd). Supported types are: - `bool`: denotes a boolean value (`true` or `false`). Although this can be encoded in a single bit, the thin C89-layer APIs generated by ACT will use an unsigned 8 bit value (a `uint8` in ACT terms) to encode a boolean value. -A numerical value of `0` encodes `false`, all oher values encode `true`. +A numerical value of `0` encodes `false`, all other values encode `true`. Implementations and bindings should use the definition of a boolean value that is native to the respective language of the implementation or binding. - `uint8`, `uint16`, `uint32`, `uint64`: -An _unsigned_ integer vaules ranging from 0 - 28-1, 0 - 216-1, 0 - 232-1, 0 - 264-1, respectively. +An _unsigned_ integer values ranging from 0 - 28-1, 0 - 216-1, 0 - 232-1, 0 - 264-1, respectively. - `int8`, `int16`, `int32`, `int64`: -A _signed_ integer vaules ranging from -27 - 27-1, -215 - 215-1, +A _signed_ integer values ranging from -27 - 27-1, -215 - 215-1, -231 - 231-1, -263 - 263-1, respectively. - `pointer`: An address in memory without knowledge of the kind of data that resides there. In C++, this corresponds to a `void*`. @@ -406,22 +421,83 @@ A subset of scalar or integral of ST\_Type: ### 18.3 ComposedType A subset of more complex types, or types composed of other ST\_Types: -`string`, `enum`, `basicarray`, `enumarray`, `structarray`, `class`, `functiontype` +`string`, `enum`, `basicarray`, `enumarray`, `structarray`, `class`, `optionalclass`, `functiontype` + +**Note:** `handle` is also included in ST\_ComposedType for backwards compatibility, but it is equivalent to `class` and will be removed in a future version. ### 18.4 Name +Type **ST\_Name** is a string that MUST match the pattern `[A-Z][a-zA-Z0-9_]{0,63}`. It is used for names of classes, structs, enums, methods, parameters, members, and options. Names MUST start with an uppercase letter and may contain letters, digits, and underscores. + ### 18.5 Description +Type **ST\_Description** is a string that MUST match the pattern `[a-zA-Z][a-zA-Z0-9_\\/+\-:,.=!?()'; |]*`. It is used to provide human-readable descriptions for various elements. Descriptions MUST start with a letter and may contain letters, digits, and various punctuation characters. + ### 18.6 ErrorName +Type **ST\_ErrorName** is a string that MUST match the pattern `[A-Z][A-Z0-9_]*`. It is used for error names. Error names MUST be in uppercase and may contain uppercase letters, digits, and underscores. + ### 18.7 ErrorDescription +Type **ST\_ErrorDescription** is a string that MUST match the pattern `[a-zA-Z][a-zA-Z0-9_+\-:,.=!/ ]*`. It is used to provide short descriptions for errors. Error descriptions MUST start with a letter and may contain letters, digits, and various punctuation characters. + ### 18.8 Pass +Type **ST\_Pass** is an enumeration with the following values: +- `in`: The parameter is passed into the function. +- `out`: The parameter is passed out of the function (the function writes to it). +- `return`: The parameter is the return value of the function. + ### 18.9 Language +Type **ST\_Language** is an enumeration that specifies the programming language for bindings or implementations. Supported values are: +- `C`: C language binding +- `Cpp`: C++ language binding +- `CDynamic`: C language binding with dynamic linking +- `CppDynamic`: C++ language binding with dynamic linking +- `Python`: Python language binding +- `Pascal`: Pascal language binding +- `Fortran`: Fortran language binding (not yet supported for implementations) +- `Node`: Node.js language binding +- `Go`: Go language binding +- `CSharp`: C# language binding +- `Java`: Java language binding (supports Java 8 and Java 9; requires `version` attribute to specify "8", "1.8", "9", or "1.9"; defaults to Java 9 if not specified) +- `WASM`: JavaScript bindings through WebAssembly (generates WebAssembly bindings using Emscripten that can be used from JavaScript/TypeScript) +- `Cppwasmtime`: C++ bindings for WebAssembly using wasmtime (generates both host and guest bindings for wasmtime-based WebAssembly modules) + +>**Note:** The XSD schema file (ACT.xsd) currently only enumerates `C`, `Cpp`, `CDynamic`, `CppDynamic`, `Python`, `Pascal`, `Fortran`, `Node`, `Go`, and `CSharp` in the ST_Language type definition. However, the codebase supports `Java`, `WASM`, and `Cppwasmtime` through the `@anyAttribute` mechanism, which allows additional language values beyond those explicitly defined in the schema. These additional languages are fully supported and documented here. + ### 18.10 Indentation +Type **ST\_Indentation** is an enumeration that specifies the indentation style for generated source code files. Supported values are: +- `1spaces`, `2spaces`, `3spaces`, `4spaces`, `5spaces`, `6spaces`, `7spaces`, `8spaces`: Specifies the number of spaces for a single indentation level. +- `tabs`: Uses tab characters for indentation. + +The default value is `4spaces`. + ### 18.11 Year +Type **ST\_Year** is a positive integer that MUST be greater than 1900 and less than 2147483648. It represents the year associated with the copyright. + ### 18.12 Version +Type **ST\_Version** is a string that MUST match the pattern `([0-9]+\.[0-9]+\.[0-9])(\-[a-zA-Z0-9.\-]+)?(\+[a-zA-Z0-9.\-]+)?`. It follows the semantic versioning scheme (see https://semver.org/): +- Major, minor, and micro version numbers are required (e.g., `1.2.3`). +- Pre-release information MAY be included (e.g., `1.2.3-alpha`). +- Build information MAY be included (e.g., `1.2.3+20130313144700`). + ### 18.13 Stub Identifier +Type **ST\_StubIdentifier** is a string that MUST match the pattern `[A-Za-z0-9_]{0,63}`. It is used to customize the naming scheme for generated source files in implementations. When specified, generated source files will follow the naming scheme "...${BaseName}_${stubidentifier}...". + ### 18.14 Class Identifier -### 18.16 NameSpace -### 18.15 Library Name -### 18.16 Base Name +Type **ST\_ClassIdentifier** is a string that MUST either be empty (`""`) or match the pattern `[A-Z][A-Za-z0-9_]{0,63}`. It is used to customize the naming scheme for generated classes. When specified, generated classes will follow the naming scheme "...${ClassIdentifier}_${ClassName}...". Currently, only C++ bindings support this attribute. + +### 18.15 NameSpace +Type **ST\_NameSpace** is a string that MUST match the pattern `[A-Z][a-zA-Z0-9_]{0,63}`. It specifies the namespace for the component's functionality. Namespaces MUST start with an uppercase letter and may contain letters, digits, and underscores. + +### 18.16 Library Name +Type **ST\_LibraryName** is a string that MUST match the pattern `[a-zA-Z][a-zA-Z0-9_+\-:,.=!/ ]*`. It specifies the name of the component and MAY contain spaces and various punctuation characters. + +### 18.17 Base Name +Type **ST\_BaseName** is a string that MUST match the pattern `[a-zA-Z][a-zA-Z0-9_\-.]*`. It is used as a prefix for generated filenames and all sorts of identifiers in the generated source code. Base names MUST start with a letter and may contain letters, digits, underscores, hyphens, and dots. + +### 18.18 NameSpaced Class Name +Type **ST\_NameSpacedClassName** is a string that MUST match the pattern `^(([A-Z][a-zA-Z0-9_]{0,63}):){0,1}([a-zA-Z0-9_]{0,64})`. It is used for the `class` attribute of parameters to reference classes, structs, enums, or function types. The format allows: +- A simple class name: `ClassName` +- A namespaced class name from an imported component: `Namespace:ClassName` + +When referencing entities from imported components, use the format `Namespace:EntityName` where `Namespace` is the namespace of the imported component and `EntityName` is the name of the class, struct, enum, or function type. # Appendix A. XSD Schema of ACT-IDL diff --git a/README.md b/README.md index ff2e6af4..85848e8c 100644 --- a/README.md +++ b/README.md @@ -47,13 +47,15 @@ A consumer of your component only needs to include the language binding relevant You are probably best of starting of with our extensive [Tutorial](Examples/Primes/Tutorial.md). -Alternatively to 1) build ACT from source ([master](../../tree/master) for a released vesion, [develop](../../tree/develop) for the latest developments): +Alternatively to 1) build ACT from source ([master](../../tree/master) for a released version, [develop](../../tree/develop) for the latest developments): 1. Install go https://golang.org/doc/install 2. Build automaticcomponenttoolkit.go:
`Build\build.bat` on Windows or
`Build\build.sh` on Unix ## Language Support -ACT supports generation of bindings or implementation stubs for C++, C, Pascal, Golang, NodeJS and Python3. However, not all features of the IDL are yet supported by the individual binding or implementation language: +ACT supports generation of bindings or implementation stubs for C++, C, Pascal, Golang, NodeJS, Python3, Java (versions 8 and 9), C#, JavaScript (via WebAssembly/WASM), and C++ wasmtime bindings. However, not all features of the IDL are yet supported by the individual binding or implementation language: + +>**Note:** For Java bindings, specify the Java version using the `version` attribute: "8" or "1.8" for Java 8, "9" or "1.9" for Java 9. If not specified, Java 9 is the default. #### Feature Matrix: Bindings | Binding | Status | Operating Systems | class | scalar type | struct | enumeration | string | basicarray | structarray | Callbacks | Error Message Propagation | Injection | API Documentation | @@ -66,9 +68,10 @@ ACT supports generation of bindings or implementation stubs for C++, C, Pascal, | Python3 | ![](Documentation/images/Tick.png) complete (but not very pythonic) | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | + | + | - | | Golang | ![](Documentation/images/Tick.png) mature | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | + | + | - | | NodeJS | ![](Documentation/images/O.png) partial support | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | ? | ? | - | + | - | - | -| C# | ![](Documentation/images/O.png) experimental | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | - | - | - | + | - | - | -| Java | ![](Documentation/images/Tick.png) experimental | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | + | + | - | -| PHP | ![](Documentation/images/X.png) not implemented | Win, Linux, MacOS | - | - | - | - | - | - | - | - | - | - | - | +| C# | ![](Documentation/images/O.png) experimental | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | - | + | - | - | +| Java | ![](Documentation/images/Tick.png) experimental (Java 8/9) | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | + | + | - | +| WASM (JavaScript) | ![](Documentation/images/O.png) experimental | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | - | + | - | - | +| C++ wasmtime | ![](Documentation/images/O.png) experimental | Win, Linux, MacOS | in,return | in,out,return | in,out,return | in,out,return | in,out,return | in,out | in,out | in | + | - | - | #### Feature Matrix: Implementation Stubs | Implementation | Status | Operating Systems | class | scalar type | struct | enumeration | string | basicarray | structarray | Callbacks | Journaling | Error Message Propagation | Injection |