Skip to content

Commit 74f75d0

Browse files
committed
fix: use copy constructors for metadata entry & method info
1 parent 7989454 commit 74f75d0

File tree

9 files changed

+204
-144
lines changed

9 files changed

+204
-144
lines changed

test-app/runtime/src/main/cpp/FieldAccessor.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>&
1919

2020
JniLocalRef targetJavaObject;
2121

22-
auto fieldMetadata = fieldData->metadata;
22+
auto &fieldMetadata = fieldData->metadata;
2323

24-
const auto& fieldTypeName = fieldMetadata->getSig();
25-
auto isStatic = fieldMetadata->isStatic;
24+
const auto& fieldTypeName = fieldMetadata.getSig();
25+
auto isStatic = fieldMetadata.isStatic;
2626

2727
auto isPrimitiveType = fieldTypeName.size() == 1;
2828
auto isFieldArray = fieldTypeName[0] == '[';
@@ -37,11 +37,11 @@ Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>&
3737
("L" + fieldTypeName + ";"));
3838

3939
if (isStatic) {
40-
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
41-
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
40+
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
41+
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
4242
} else {
43-
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
44-
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
43+
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
44+
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
4545
}
4646
}
4747

@@ -50,7 +50,7 @@ Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>&
5050

5151
if (targetJavaObject.IsNull()) {
5252
stringstream ss;
53-
ss << "Cannot access property '" << fieldMetadata->name.c_str() << "' because there is no corresponding Java object";
53+
ss << "Cannot access property '" << fieldMetadata.name.c_str() << "' because there is no corresponding Java object";
5454
throw NativeScriptException(ss.str());
5555
}
5656
}
@@ -188,16 +188,16 @@ Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>&
188188
void FieldAccessor::SetJavaField(Isolate* isolate, const Local<Object>& target, const Local<Value>& value, FieldCallbackData* fieldData) {
189189
JEnv env;
190190

191-
auto fieldMetadata = fieldData->metadata;
191+
auto &fieldMetadata = fieldData->metadata;
192192

193193
HandleScope handleScope(isolate);
194194
auto runtime = Runtime::GetRuntime(isolate);
195195
auto objectManager = runtime->GetObjectManager();
196196

197197
JniLocalRef targetJavaObject;
198198

199-
const auto& fieldTypeName = fieldMetadata->getSig();
200-
auto isStatic = fieldMetadata->isStatic;
199+
const auto& fieldTypeName = fieldMetadata.getSig();
200+
auto isStatic = fieldMetadata.isStatic;
201201

202202

203203
auto isPrimitiveType = fieldTypeName.size() == 1;
@@ -213,14 +213,14 @@ void FieldAccessor::SetJavaField(Isolate* isolate, const Local<Object>& target,
213213
("L" + fieldTypeName + ";"));
214214

215215
if (isStatic) {
216-
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
216+
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
217217
assert(fieldData->clazz != nullptr);
218-
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
218+
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
219219
assert(fieldData->fid != nullptr);
220220
} else {
221-
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
221+
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
222222
assert(fieldData->clazz != nullptr);
223-
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
223+
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
224224
assert(fieldData->fid != nullptr);
225225
}
226226
}
@@ -230,7 +230,7 @@ void FieldAccessor::SetJavaField(Isolate* isolate, const Local<Object>& target,
230230

231231
if (targetJavaObject.IsNull()) {
232232
stringstream ss;
233-
ss << "Cannot access property '" << fieldMetadata->name.c_str() << "' because there is no corresponding Java object";
233+
ss << "Cannot access property '" << fieldMetadata.name.c_str() << "' because there is no corresponding Java object";
234234
throw NativeScriptException(ss.str());
235235
}
236236
}

test-app/runtime/src/main/cpp/FieldCallbackData.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@
66

77
namespace tns {
88
struct FieldCallbackData {
9-
FieldCallbackData(MetadataEntry *metadata)
9+
FieldCallbackData(MetadataEntry metadata)
1010
:
1111
metadata(metadata), fid(nullptr), clazz(nullptr) {
12-
1312
}
1413

15-
MetadataEntry* metadata;
14+
MetadataEntry metadata;
1615
jfieldID fid;
1716
jclass clazz;
1817
};

test-app/runtime/src/main/cpp/MetadataEntry.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ std::string &MetadataEntry::getName() {
2222
} else if (type == NodeType::StaticField) {
2323
name = reader->ReadName(sfi->nameOffset);
2424
} else if (type == NodeType::Method) {
25-
name = mi->GetName();
25+
name = mi.GetName();
2626
}
2727

2828
return name;
@@ -38,9 +38,9 @@ std::string &MetadataEntry::getSig() {
3838
} else if (type == NodeType::StaticField) {
3939
sig = reader->ReadTypeName(sfi->nodeId);
4040
} else if (type == NodeType::Method) {
41-
uint8_t sigLength = mi->GetSignatureLength();
41+
uint8_t sigLength = mi.GetSignatureLength();
4242
if (sigLength > 0)
43-
sig = mi->GetSignature();
43+
sig = mi.GetSignature();
4444

4545
}
4646

@@ -53,7 +53,7 @@ std::string &MetadataEntry::getReturnType() {
5353
auto reader = MetadataNode::getMetadataReader();
5454

5555
if (type == NodeType::Method) {
56-
if (mi->GetSignatureLength() > 0) {
56+
if (mi.GetSignatureLength() > 0) {
5757
returnType = MetadataReader::ParseReturnType(this->getSig());
5858
}
5959
} else {
@@ -68,7 +68,7 @@ MethodReturnType MetadataEntry::getRetType() {
6868
auto reader = MetadataNode::getMetadataReader();
6969

7070
if (type == NodeType::Method && !this->getReturnType().empty()) {
71-
retType = MetadataReader::GetReturnType(this->getReturnType());
71+
retType = MetadataReader::GetReturnType(this->returnType);
7272
}
7373

7474
retTypeParsed = true;
@@ -83,6 +83,8 @@ std::string &MetadataEntry::getDeclaringType() {
8383

8484
if (type == NodeType::StaticField) {
8585
declaringType = reader->ReadTypeName(sfi->declaringType);
86+
} else if (type == NodeType::Method && isStatic) {
87+
declaringType = mi.GetDeclaringType();
8688
}
8789

8890
return declaringType;
@@ -94,7 +96,7 @@ int MetadataEntry::getParamCount() {
9496
auto reader = MetadataNode::getMetadataReader();
9597

9698
if (type == NodeType::Method) {
97-
auto sigLength = mi->GetSignatureLength();
99+
auto sigLength = mi.GetSignatureLength();
98100
if (sigLength > 0) {
99101
paramCount = sigLength - 1;
100102
} else {
@@ -124,7 +126,7 @@ bool MetadataEntry::getIsResolved() {
124126

125127
auto reader = MetadataNode::getMetadataReader();
126128
if (type == NodeType::Method) {
127-
isResolved = mi->CheckIsResolved() == 1;
129+
isResolved = mi.CheckIsResolved() == 1;
128130
}
129131

130132
isResolvedSet = true;

test-app/runtime/src/main/cpp/MetadataEntry.h

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,65 @@ namespace tns {
3535
class MetadataEntry {
3636
public:
3737

38-
MetadataEntry(MetadataTreeNode* m_treeNode, NodeType nodeType);
38+
MetadataEntry(MetadataTreeNode *m_treeNode, NodeType nodeType);
39+
40+
MetadataEntry(const MetadataEntry &other) = default;
41+
42+
MetadataEntry &operator=(const MetadataEntry &other) {
43+
if (this != &other) {
44+
treeNode = other.treeNode;
45+
type = other.type;
46+
isExtensionFunction = other.isExtensionFunction;
47+
isStatic = other.isStatic;
48+
isTypeMember = other.isTypeMember;
49+
memberId = other.memberId;
50+
clazz = other.clazz;
51+
parsedSig = other.parsedSig;
52+
mi = other.mi;
53+
fi = other.fi;
54+
sfi = other.sfi;
55+
name = other.name;
56+
sig = other.sig;
57+
returnType = other.returnType;
58+
retType = other.retType;
59+
declaringType = other.declaringType;
60+
paramCount = other.paramCount;
61+
isFinal = other.isFinal;
62+
isStatic = other.isResolved;
63+
isResolvedSet = other.isResolvedSet;
64+
isFinalSet = other.isFinalSet;
65+
}
66+
return *this;
67+
}
68+
69+
std::string &getName();
70+
71+
std::string &getSig();
72+
73+
std::string &getReturnType();
3974

40-
std::string& getName();
41-
std::string& getSig();
42-
std::string& getReturnType();
4375
MethodReturnType getRetType();
44-
std::string& getDeclaringType();
76+
77+
std::string &getDeclaringType();
78+
4579
int getParamCount();
80+
4681
bool getIsFinal();
82+
4783
bool getIsResolved();
4884

49-
MetadataTreeNode* treeNode;
85+
MetadataTreeNode *treeNode;
5086
NodeType type;
5187
bool isExtensionFunction;
5288
bool isStatic;
5389
bool isTypeMember;
54-
void* memberId;
90+
void *memberId;
5591
jclass clazz;
5692
std::vector<std::string> parsedSig;
5793

58-
MethodInfo* mi;
59-
FieldInfo* fi;
60-
StaticFieldInfo* sfi;
94+
MethodInfo mi;
95+
FieldInfo *fi;
96+
StaticFieldInfo *sfi;
6197

6298
std::string name;
6399
std::string sig;

test-app/runtime/src/main/cpp/MetadataMethodInfo.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,23 @@ namespace tns {
1616
sizeMeasured(false), nameOffset(0), resolvedData(0),
1717
declaringNodeId(0){
1818
}
19+
20+
MethodInfo(const MethodInfo& other) = default;
21+
22+
MethodInfo& operator=(const MethodInfo& other) {
23+
if (this != &other) {
24+
isStatic = other.isStatic;
25+
m_pData = other.m_pData;
26+
m_pStartData = other.m_pStartData;
27+
m_signatureLength = other.m_signatureLength;
28+
sizeMeasured = other.sizeMeasured;
29+
nameOffset = other.nameOffset;
30+
resolvedData = other.resolvedData;
31+
declaringNodeId = other.declaringNodeId;
32+
nodeIds = other.nodeIds;
33+
}
34+
return *this;
35+
}
1936

2037
std::string GetName();
2138

0 commit comments

Comments
 (0)