functionalscript 0.0.470 → 0.0.472
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/com/cpp/module.f.cjs +57 -15
- package/com/cpp/{com.hpp → nanocom.hpp} +7 -15
- package/com/cpp/test.f.cjs +14 -10
- package/com/cs/test.f.cjs +1 -1
- package/com/rust/test.f.cjs +6 -6
- package/com/test/cpp/main.cpp +12 -16
- package/com/test/cs/Program.cs +1 -1
- package/com/test/rust/src/lib.rs +1 -1
- package/com/types/testlib.f.cjs +1 -1
- package/package.json +1 -1
package/com/cpp/module.f.cjs
CHANGED
|
@@ -33,11 +33,33 @@ const resultVoid = types.result('void')
|
|
|
33
33
|
|
|
34
34
|
const namespace = text.curly('namespace')
|
|
35
35
|
|
|
36
|
+
/** @type {(id: string) => string} */
|
|
37
|
+
const comRef = id => `::nanocom::ref<${id}>`
|
|
38
|
+
|
|
39
|
+
/** @type {(id: string) => string} */
|
|
40
|
+
const ptr = id => `${id} const*`
|
|
41
|
+
|
|
42
|
+
/** @type {(id: string) => string} */
|
|
43
|
+
const ref = id => `${id} const&`
|
|
44
|
+
|
|
45
|
+
/** @type {(p: types.Field) => string} */
|
|
46
|
+
const paramName = ([name]) => name
|
|
47
|
+
|
|
48
|
+
const mapParamName = map(paramName)
|
|
49
|
+
|
|
50
|
+
const joinComma = join(', ')
|
|
51
|
+
|
|
36
52
|
/** @type {(name: string) => (lib: types.Library) => text.Block} */
|
|
37
53
|
const cpp = name => lib => {
|
|
38
54
|
|
|
39
|
-
/** @type {(t: types.Type) =>
|
|
40
|
-
const
|
|
55
|
+
/** @type {(t: types.Type) => string|undefined} */
|
|
56
|
+
const interface_ = t => {
|
|
57
|
+
if (!(t instanceof Array) || t.length !== 1) {
|
|
58
|
+
return undefined
|
|
59
|
+
}
|
|
60
|
+
const [name] = t
|
|
61
|
+
return lib[name].interface !== undefined ? name : undefined
|
|
62
|
+
}
|
|
41
63
|
|
|
42
64
|
/** @type {(i: (t: string) => string) => (t: types.Type) => string} */
|
|
43
65
|
const objectType = i => t => {
|
|
@@ -48,9 +70,9 @@ const cpp = name => lib => {
|
|
|
48
70
|
return i(id)
|
|
49
71
|
}
|
|
50
72
|
|
|
51
|
-
const type = objectType(
|
|
73
|
+
const type = objectType(comRef)
|
|
52
74
|
|
|
53
|
-
const resultType = objectType(
|
|
75
|
+
const resultType = objectType(ptr)
|
|
54
76
|
|
|
55
77
|
/** @type {(s: types.Field) => text.Item} */
|
|
56
78
|
const field = ([name, t]) => `${type(t)} ${name};`
|
|
@@ -64,20 +86,34 @@ const cpp = name => lib => {
|
|
|
64
86
|
const cppResult = resultVoid(resultType)
|
|
65
87
|
|
|
66
88
|
/** @type {(p: types.Field) => string} */
|
|
67
|
-
const param = ([name, t]) => `${objectType(
|
|
89
|
+
const param = ([name, t]) => `${objectType(ref)(t)} ${name}`
|
|
68
90
|
|
|
69
91
|
const mapParam = map(param)
|
|
70
92
|
|
|
71
|
-
/** @type {(
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
93
|
+
/** @type {(result: string) => (paramArrayStr: string) => (name: string) => text.Item} */
|
|
94
|
+
const methodHeader = result => paramArrayStr => name =>
|
|
95
|
+
`virtual ${result} ${name}${paramArrayStr} const noexcept = 0;`
|
|
96
|
+
|
|
97
|
+
/** @type {(m: types.Method) => readonly text.Item[]} */
|
|
98
|
+
const method = ([name, paramArray]) => {
|
|
99
|
+
const result = cppResult(paramArray)
|
|
100
|
+
const paramL = paramList(paramArray)
|
|
101
|
+
const paramArrayStr = `(${joinComma(mapParam(paramL))})`
|
|
102
|
+
const m = methodHeader(result)(paramArrayStr)
|
|
103
|
+
const resultName = interface_(paramArray._)
|
|
104
|
+
if (resultName === undefined) {
|
|
105
|
+
return [m(name)]
|
|
106
|
+
}
|
|
107
|
+
return [
|
|
108
|
+
m(`${name}_`),
|
|
109
|
+
`${comRef(resultName)} ${name}${paramArrayStr} const noexcept`,
|
|
110
|
+
'{',
|
|
111
|
+
[`return ::nanocom::move_to_ref(${name}_(${joinComma(mapParamName(paramL))}));`],
|
|
112
|
+
'}',
|
|
113
|
+
]
|
|
78
114
|
}
|
|
79
115
|
|
|
80
|
-
const mapMethod =
|
|
116
|
+
const mapMethod = flatMap(method)
|
|
81
117
|
|
|
82
118
|
/** @type {(i: types.Interface) => text.Block} */
|
|
83
119
|
const defInterface = ({ guid, interface: i }) => {
|
|
@@ -85,7 +121,7 @@ const cpp = name => lib => {
|
|
|
85
121
|
const lo = g.substring(0, 16);
|
|
86
122
|
const hi = g.substring(16);
|
|
87
123
|
return flat([
|
|
88
|
-
[`constexpr static ::
|
|
124
|
+
[`constexpr static ::nanocom::GUID const guid = ::nanocom::GUID(0x${lo}, 0x${hi});`],
|
|
89
125
|
mapMethod(entries(i))
|
|
90
126
|
])
|
|
91
127
|
}
|
|
@@ -93,7 +129,13 @@ const cpp = name => lib => {
|
|
|
93
129
|
/** @type {(kv: obj.Entry<types.Definition>) => text.Block} */
|
|
94
130
|
const def = ([name, d]) => d.interface === undefined
|
|
95
131
|
? struct(name)(defStruct(d))
|
|
96
|
-
: [
|
|
132
|
+
: [
|
|
133
|
+
`class ${name} : public ::nanocom::IUnknown`,
|
|
134
|
+
'{',
|
|
135
|
+
'public:',
|
|
136
|
+
defInterface(d),
|
|
137
|
+
'};'
|
|
138
|
+
]
|
|
97
139
|
|
|
98
140
|
/** @type {(kv: obj.Entry<types.Definition>) => text.Block} */
|
|
99
141
|
const forward = ([name]) => [`struct ${name};`]
|
|
@@ -5,17 +5,9 @@
|
|
|
5
5
|
#include <atomic>
|
|
6
6
|
#include <iostream>
|
|
7
7
|
|
|
8
|
-
#if defined(__aarch64__) || defined(__amd64__)
|
|
9
|
-
#define COM_STDCALL
|
|
10
|
-
#elif defined(__clang__)
|
|
11
|
-
#define COM_STDCALL __attribute__((stdcall))
|
|
12
|
-
#else
|
|
13
|
-
#define COM_STDCALL __stdcall
|
|
14
|
-
#endif
|
|
15
|
-
|
|
16
8
|
static_assert(sizeof(bool) == 1);
|
|
17
9
|
|
|
18
|
-
namespace
|
|
10
|
+
namespace nanocom
|
|
19
11
|
{
|
|
20
12
|
constexpr uint64_t byteswap(uint64_t v) noexcept
|
|
21
13
|
{
|
|
@@ -80,9 +72,9 @@ namespace com
|
|
|
80
72
|
class IUnknown
|
|
81
73
|
{
|
|
82
74
|
public:
|
|
83
|
-
virtual HRESULT
|
|
84
|
-
virtual ULONG
|
|
85
|
-
virtual ULONG
|
|
75
|
+
virtual HRESULT QueryInterface(GUID const &riid, IUnknown const **ppvObject) const noexcept = 0;
|
|
76
|
+
virtual ULONG AddRef() const noexcept = 0;
|
|
77
|
+
virtual ULONG Release() const noexcept = 0;
|
|
86
78
|
};
|
|
87
79
|
|
|
88
80
|
template <class I>
|
|
@@ -155,7 +147,7 @@ namespace com
|
|
|
155
147
|
}
|
|
156
148
|
|
|
157
149
|
private:
|
|
158
|
-
HRESULT
|
|
150
|
+
HRESULT QueryInterface(GUID const &riid, IUnknown const **const ppvObject) const noexcept override
|
|
159
151
|
{
|
|
160
152
|
// std::cout << "riid: " << riid << std::endl;
|
|
161
153
|
// std::cout << "iunknown: " << iunknown_guid << std::endl;
|
|
@@ -175,12 +167,12 @@ namespace com
|
|
|
175
167
|
return counter.fetch_add(1);
|
|
176
168
|
}
|
|
177
169
|
|
|
178
|
-
ULONG
|
|
170
|
+
ULONG AddRef() const noexcept override
|
|
179
171
|
{
|
|
180
172
|
return add_ref() + 1;
|
|
181
173
|
}
|
|
182
174
|
|
|
183
|
-
ULONG
|
|
175
|
+
ULONG Release() const noexcept override
|
|
184
176
|
{
|
|
185
177
|
auto const c = counter.fetch_sub(1) - 1;
|
|
186
178
|
if (c == 0)
|
package/com/cpp/test.f.cjs
CHANGED
|
@@ -17,19 +17,23 @@ const f = () =>
|
|
|
17
17
|
' };\n' +
|
|
18
18
|
' struct ManagedStruct\n' +
|
|
19
19
|
' {\n' +
|
|
20
|
-
' ::
|
|
20
|
+
' ::nanocom::ref<IMy> M;\n' +
|
|
21
21
|
' };\n' +
|
|
22
|
-
' class IMy : public ::
|
|
22
|
+
' class IMy : public ::nanocom::IUnknown\n' +
|
|
23
23
|
' {\n' +
|
|
24
24
|
' public:\n' +
|
|
25
|
-
' constexpr static ::
|
|
26
|
-
' virtual Slice
|
|
27
|
-
' virtual void
|
|
28
|
-
' virtual bool const*
|
|
29
|
-
' virtual void
|
|
30
|
-
' virtual bool
|
|
31
|
-
' virtual IMy const*
|
|
32
|
-
'
|
|
25
|
+
' constexpr static ::nanocom::GUID const guid = ::nanocom::GUID(0xC66FB2702D8049AD, 0xBB6E88C1F90B805D);\n' +
|
|
26
|
+
' virtual Slice GetSlice() const noexcept = 0;\n' +
|
|
27
|
+
' virtual void SetSlice(Slice slice) const noexcept = 0;\n' +
|
|
28
|
+
' virtual bool const* GetUnsafe() const noexcept = 0;\n' +
|
|
29
|
+
' virtual void SetUnsafe(Slice const* p, uint32_t size) const noexcept = 0;\n' +
|
|
30
|
+
' virtual bool Some(IMy const& p) const noexcept = 0;\n' +
|
|
31
|
+
' virtual IMy const* GetIMy_(uint16_t a, int16_t b) const noexcept = 0;\n' +
|
|
32
|
+
' ::nanocom::ref<IMy> GetIMy(uint16_t a, int16_t b) const noexcept\n' +
|
|
33
|
+
' {\n' +
|
|
34
|
+
' return ::nanocom::move_to_ref(GetIMy_(a, b));\n' +
|
|
35
|
+
' }\n' +
|
|
36
|
+
' virtual void SetManagedStruct(ManagedStruct a) const noexcept = 0;\n' +
|
|
33
37
|
' };\n' +
|
|
34
38
|
'}'
|
|
35
39
|
if (cpp !== e) { throw cpp }
|
package/com/cs/test.f.cjs
CHANGED
package/com/rust/test.f.cjs
CHANGED
|
@@ -23,7 +23,7 @@ module.exports = () => {
|
|
|
23
23
|
' pub GetUnsafe: unsafe extern "system" fn(this: &Object) -> *const bool,\n' +
|
|
24
24
|
' pub SetUnsafe: unsafe extern "system" fn(this: &Object, p: *const super::Slice, size: u32),\n' +
|
|
25
25
|
' pub Some: unsafe extern "system" fn(this: &Object, p: &super::IMy::Object) -> bool,\n' +
|
|
26
|
-
' pub GetIMy: unsafe extern "system" fn(this: &Object) -> super::IMy::Ref,\n' +
|
|
26
|
+
' pub GetIMy: unsafe extern "system" fn(this: &Object, a: u16, b: i16) -> super::IMy::Ref,\n' +
|
|
27
27
|
' pub SetManagedStruct: unsafe extern "system" fn(this: &Object, a: super::ManagedStruct),\n' +
|
|
28
28
|
' }\n' +
|
|
29
29
|
' impl nanocom::Interface for Interface {\n' +
|
|
@@ -35,7 +35,7 @@ module.exports = () => {
|
|
|
35
35
|
' fn GetUnsafe(&self) -> *const bool;\n' +
|
|
36
36
|
' fn SetUnsafe(&self, p: *const super::Slice, size: u32);\n' +
|
|
37
37
|
' fn Some(&self, p: &super::IMy::Object) -> bool;\n' +
|
|
38
|
-
' fn GetIMy(&self) -> super::IMy::Ref;\n' +
|
|
38
|
+
' fn GetIMy(&self, a: u16, b: i16) -> super::IMy::Ref;\n' +
|
|
39
39
|
' fn SetManagedStruct(&self, a: super::ManagedStruct);\n' +
|
|
40
40
|
' }\n' +
|
|
41
41
|
' impl Ex for Object {\n' +
|
|
@@ -54,8 +54,8 @@ module.exports = () => {
|
|
|
54
54
|
' fn Some(&self, p: &super::IMy::Object) -> bool {\n' +
|
|
55
55
|
' unsafe { (self.interface().Some)(self, p) }\n' +
|
|
56
56
|
' }\n' +
|
|
57
|
-
' fn GetIMy(&self) -> super::IMy::Ref {\n' +
|
|
58
|
-
' unsafe { (self.interface().GetIMy)(self) }\n' +
|
|
57
|
+
' fn GetIMy(&self, a: u16, b: i16) -> super::IMy::Ref {\n' +
|
|
58
|
+
' unsafe { (self.interface().GetIMy)(self, a, b) }\n' +
|
|
59
59
|
' }\n' +
|
|
60
60
|
' fn SetManagedStruct(&self, a: super::ManagedStruct) {\n' +
|
|
61
61
|
' unsafe { (self.interface().SetManagedStruct)(self, a) }\n' +
|
|
@@ -105,8 +105,8 @@ module.exports = () => {
|
|
|
105
105
|
' extern "system" fn Some(this: &Object, p: &super::IMy::Object) -> bool {\n' +
|
|
106
106
|
' unsafe { nanocom::CObject::from_object_unchecked(this) }.Some(p)\n' +
|
|
107
107
|
' }\n' +
|
|
108
|
-
' extern "system" fn GetIMy(this: &Object) -> super::IMy::Ref {\n' +
|
|
109
|
-
' unsafe { nanocom::CObject::from_object_unchecked(this) }.GetIMy()\n' +
|
|
108
|
+
' extern "system" fn GetIMy(this: &Object, a: u16, b: i16) -> super::IMy::Ref {\n' +
|
|
109
|
+
' unsafe { nanocom::CObject::from_object_unchecked(this) }.GetIMy(a, b)\n' +
|
|
110
110
|
' }\n' +
|
|
111
111
|
' extern "system" fn SetManagedStruct(this: &Object, a: super::ManagedStruct) {\n' +
|
|
112
112
|
' unsafe { nanocom::CObject::from_object_unchecked(this) }.SetManagedStruct(a)\n' +
|
package/com/test/cpp/main.cpp
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#include "../../cpp/
|
|
1
|
+
#include "../../cpp/nanocom.hpp"
|
|
2
2
|
#include "_result.hpp"
|
|
3
3
|
|
|
4
4
|
#ifdef _WIN32
|
|
@@ -16,10 +16,10 @@ extern "C" int c_get()
|
|
|
16
16
|
class Impl : public My::IMy
|
|
17
17
|
{
|
|
18
18
|
public:
|
|
19
|
-
My::Slice
|
|
19
|
+
My::Slice GetSlice() const noexcept override
|
|
20
20
|
{
|
|
21
21
|
}
|
|
22
|
-
void
|
|
22
|
+
void SetSlice(My::Slice slice) const noexcept override
|
|
23
23
|
{
|
|
24
24
|
std::cout
|
|
25
25
|
<< "SetSlice: "
|
|
@@ -28,24 +28,20 @@ public:
|
|
|
28
28
|
<< slice.Size
|
|
29
29
|
<< std::endl;
|
|
30
30
|
}
|
|
31
|
-
bool const *
|
|
31
|
+
bool const *GetUnsafe() const noexcept override
|
|
32
32
|
{
|
|
33
33
|
}
|
|
34
|
-
void
|
|
34
|
+
void SetUnsafe(My::Slice const *p, uint32_t size) const noexcept override
|
|
35
35
|
{
|
|
36
36
|
}
|
|
37
|
-
bool
|
|
37
|
+
bool Some(My::IMy const &p) const noexcept override
|
|
38
38
|
{
|
|
39
39
|
}
|
|
40
|
-
My::IMy const *
|
|
40
|
+
My::IMy const *GetIMy_(uint16_t a, int16_t b) const noexcept override
|
|
41
41
|
{
|
|
42
|
-
return ::
|
|
42
|
+
return ::nanocom::to_ref(*this).copy_to_raw();
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
{
|
|
46
|
-
return com::move_to_ref(GetIMy_());
|
|
47
|
-
}
|
|
48
|
-
void COM_STDCALL SetManagedStruct(My::ManagedStruct a) const noexcept override
|
|
44
|
+
void SetManagedStruct(My::ManagedStruct a) const noexcept override
|
|
49
45
|
{
|
|
50
46
|
}
|
|
51
47
|
~Impl()
|
|
@@ -58,12 +54,12 @@ DLL_EXPORT
|
|
|
58
54
|
extern "C" My::IMy const *c_my_create()
|
|
59
55
|
{
|
|
60
56
|
{
|
|
61
|
-
auto const x = ::
|
|
57
|
+
auto const x = ::nanocom::implementation<Impl>::create().copy_to_raw();
|
|
62
58
|
x->Release();
|
|
63
59
|
}
|
|
64
60
|
{
|
|
65
|
-
auto const x = ::
|
|
61
|
+
auto const x = ::nanocom::implementation<Impl>::create().upcast<My::IMy>();
|
|
66
62
|
x->SetSlice(My::Slice());
|
|
67
63
|
}
|
|
68
|
-
return ::
|
|
64
|
+
return ::nanocom::implementation<Impl>::create().copy_to_raw();
|
|
69
65
|
}
|
package/com/test/cs/Program.cs
CHANGED
package/com/test/rust/src/lib.rs
CHANGED
package/com/types/testlib.f.cjs
CHANGED