Skip to content

Commit 48fbbaa

Browse files
committed
begin work on variadic functions
1 parent af049d6 commit 48fbbaa

File tree

11 files changed

+61
-6
lines changed

11 files changed

+61
-6
lines changed

core-test/src/index.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import { StackLayout, Application, Label } from "../core/index.js";
44

55
Application.run({
66
create: () => {
7+
setTimeout(() => {
8+
alert("Hello World!");
9+
}, 1000);
10+
711
const stackLayout = new StackLayout();
8-
stackLayout.backgroundColor = "yellow";
9-
stackLayout.width = 300;
10-
stackLayout.height = 300;
12+
stackLayout.backgroundColor = "white";
1113

1214
const label = new Label();
1315
label.text = "Hello World!";

metadata/include/IR.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class TypeSpec {
5959
// kTypeCallback, kTypeFunctionPointer
6060
std::vector<TypeSpec> callbackArgs;
6161
std::shared_ptr<TypeSpec> callbackReturn;
62+
bool isVariadic = false;
6263

6364
// kTypeObject, kTypeInstanceObject, kTypeAnyObject
6465
std::string className;

metadata/include/Metadata.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ enum MDTypeKind : uint8_t {
7575

7676
enum MDTypeFlag : uint8_t {
7777
mdTypeFlagNext = 1 << 7,
78-
mdTypeFlagReserved = 1 << 6,
78+
mdTypeFlagVariadic = 1 << 6,
7979
};
8080

8181
enum MDVariableEvalKind : uint8_t {

metadata/include/MetadataWriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct MDUnion {
7474
struct MDSignature {
7575
MDTypeInfo *returnType;
7676
std::vector<MDTypeInfo *> arguments;
77+
bool isVariadic;
7778
};
7879

7980
struct MDFunction {

metadata/metadata.macos.nsmd

542 Bytes
Binary file not shown.

metadata/src/MetadataWriter/Function.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ void MDMetadataWriter::write(FunctionDecl &decl) {
1212
for (auto param : decl.parameters) {
1313
mdSignature->arguments.push_back(getTypeInfo(param.type));
1414
}
15+
mdSignature->isVariadic = decl.isVariadic;
1516

1617
MDSignatureResolvable res{mdSignature, &mdFunction->signature};
1718
signatureResolvables.emplace_back(res);
@@ -38,10 +39,13 @@ void MDSignatureSerde::serialize(MDSignature *value, void *data) {
3839
auto typeInfoSerde = MDTypeInfoSerde();
3940
auto returnTypeSize = typeInfoSerde.size(value->returnType);
4041
typeInfoSerde.serialize(value->returnType, data);
42+
MDTypeKind *data_kind = (MDTypeKind *)data;
4143
if (value->arguments.size() > 0) {
42-
MDTypeKind *data_kind = (MDTypeKind *)data;
4344
data_kind[0] = (MDTypeKind)(value->returnType->kind | mdTypeFlagNext);
4445
}
46+
if (value->isVariadic) {
47+
data_kind[0] = (MDTypeKind)(value->returnType->kind | mdTypeFlagVariadic);
48+
}
4549
ptr_add(&data, returnTypeSize);
4650
// Arguments
4751
size_t argumentsSize = value->arguments.size();
@@ -64,6 +68,9 @@ std::string MDSignatureSerde::encode(MDSignature *signature) {
6468
for (auto arg : signature->arguments) {
6569
result += typeInfoSerde.encode(arg);
6670
}
71+
if (signature->isVariadic) {
72+
result += "...";
73+
}
6774
return result;
6875
}
6976

metadata/src/MetadataWriter/Member.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ MDMember *MDMetadataWriter::memberFromDecl(MemberDecl &decl) {
2020

2121
MDSignature *mdSignature = new MDSignature();
2222
mdSignature->returnType = info;
23+
mdSignature->isVariadic = false;
2324
MDSignatureResolvable res{mdSignature, &member->getterSignature};
2425
signatureResolvables.emplace_back(res);
2526

@@ -28,6 +29,7 @@ MDMember *MDMetadataWriter::memberFromDecl(MemberDecl &decl) {
2829
mdSetterSignature->arguments.push_back(info);
2930
mdSetterSignature->returnType = new MDTypeInfo();
3031
mdSetterSignature->returnType->kind = mdTypeVoid;
32+
mdSetterSignature->isVariadic = false;
3133

3234
MDSignatureResolvable setterRes{mdSetterSignature,
3335
&member->setterSignature};
@@ -57,6 +59,7 @@ MDMember *MDMetadataWriter::memberFromDecl(MemberDecl &decl) {
5759
for (auto param : decl.parameters) {
5860
mdSignature->arguments.push_back(getTypeInfo(param.type));
5961
}
62+
mdSignature->isVariadic = decl.isVariadic;
6063
MDSignatureResolvable res{mdSignature, &member->signature};
6164
signatureResolvables.emplace_back(res);
6265
break;

metadata/src/MetadataWriter/TypeSpec.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ MDTypeInfo *MDMetadataWriter::getTypeInfo(TypeSpec &type) {
7474
sig->arguments.emplace_back(getTypeInfo(arg));
7575
}
7676
sig->returnType = getTypeInfo(*type.callbackReturn);
77+
sig->isVariadic = type.isVariadic;
7778
info->kind = mdTypeBlock;
7879
MDSignatureResolvable res{sig, &info->signatureOffset};
7980
signatureResolvables.emplace_back(res);
@@ -87,6 +88,7 @@ MDTypeInfo *MDMetadataWriter::getTypeInfo(TypeSpec &type) {
8788
sig->arguments.emplace_back(getTypeInfo(arg));
8889
}
8990
sig->returnType = getTypeInfo(*type.callbackReturn);
91+
sig->isVariadic = type.isVariadic;
9092
info->kind = mdTypeFunctionPointer;
9193
MDSignatureResolvable res{sig, &info->signatureOffset};
9294
signatureResolvables.emplace_back(res);

src/Class.mm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@
7777

7878
NAPI_FUNCTION(registerClass) {
7979
NAPI_CALLBACK_BEGIN(1)
80+
81+
// In case no arguments are passed, we just return the NativeObject class.
82+
// This is to support both @NativeClass and @NativeClass() syntaxes.
83+
// Maybe we should support more in future like
84+
// @NativeClass(NSApplicationDelegate).
85+
if (argc == 0) {
86+
napi_value func;
87+
napi_create_function(env, "NativeClass", NAPI_AUTO_LENGTH, JS_registerClass,
88+
nullptr, &func);
89+
return func;
90+
}
91+
8092
auto bridgeData = ObjCBridgeData::InstanceData(env);
8193
bridgeData->registerClass(env, argv[0]);
8294
return nullptr;

src/TypeConv.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1422,7 +1422,7 @@ void toNative(napi_env env, napi_value value, void *result, bool *shouldFree,
14221422
uint8_t opaquePointers) {
14231423
auto kind = reader->getTypeKind(*offset);
14241424
bool next = kind & mdTypeFlagNext;
1425-
kind = (MDTypeKind)(kind & ~mdTypeFlagNext);
1425+
kind = (MDTypeKind)((kind & ~mdTypeFlagNext) & ~mdTypeFlagVariadic);
14261426
*offset += sizeof(MDTypeKind);
14271427

14281428
switch (kind) {

0 commit comments

Comments
 (0)