Skip to content

Commit a2d016c

Browse files
committed
Merge pull request #14 from NativeScript/plamen5kov/refactoredMetadataReader
refactored metadata reader
2 parents 4c23052 + 2b40daa commit a2d016c

File tree

8 files changed

+243
-132
lines changed

8 files changed

+243
-132
lines changed

src/jni/Android.mk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ LOCAL_SRC_FILES := com_tns_Platform.cpp com_tns_JsDebugger.cpp \
3636
ArgConverter.cpp JsArgToArrayConverter.cpp JsArgConverter.cpp V8GlobalHelpers.cpp V8StringConstants.cpp \
3737
FieldAccessor.cpp ArrayElementAccessor.cpp \
3838
ExceptionUtil.cpp Util.cpp Logger.cpp \
39-
ObjectManager.cpp CastFunctions.cpp WeakRef.cpp
39+
ObjectManager.cpp CastFunctions.cpp WeakRef.cpp \
40+
MetadataMethodInfo.cpp
4041
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
4142
LOCAL_LDLIBS := -llog -landroid
4243
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)

src/jni/MetadataEntry.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace tns
2020
struct MetadataEntry
2121
{
2222
MetadataEntry()
23-
: isMember(false), name(std::string()), treeNode(nullptr), sig(std::string()), paramCount(0), isStatic(false), declaringType(std::string())
23+
: isTypeMember(false), name(std::string()), treeNode(nullptr), sig(std::string()), paramCount(0), isStatic(false), declaringType(std::string())
2424
{
2525
}
2626
MetadataTreeNode *treeNode;
@@ -31,10 +31,8 @@ namespace tns
3131
int paramCount;
3232
bool isStatic;
3333
bool isFinal;
34-
bool isMember;
34+
bool isTypeMember;
3535
};
3636
}
3737

38-
39-
4038
#endif /* METADATAENTRY_H_ */

src/jni/MetadataFieldInfo.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef METADATAFIELDINFO_H_
2+
#define METADATAFIELDINFO_H_
3+
4+
namespace tns
5+
{
6+
struct __attribute__ ((__packed__)) FieldInfo
7+
{
8+
FieldInfo()
9+
: nameOffset(0), nodeId(0), finalModifier(0)
10+
{
11+
}
12+
13+
uint32_t nameOffset;
14+
uint16_t nodeId;
15+
uint8_t finalModifier;
16+
};
17+
18+
struct __attribute__ ((__packed__)) StaticFieldInfo : FieldInfo
19+
{
20+
StaticFieldInfo()
21+
: FieldInfo(), declaringType(0)
22+
{
23+
}
24+
25+
uint16_t declaringType;
26+
};
27+
}
28+
29+
#endif /* METADATAFIELDINFO_H_ */

src/jni/MetadataMethodInfo.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include "MetadataMethodInfo.h"
2+
#include "MetadataReader.h"
3+
4+
using namespace tns;
5+
6+
std::string MethodInfo::GetName()
7+
{
8+
uint32_t nameOfffset = *reinterpret_cast<uint32_t*>(m_pData);
9+
string methodName = m_reader->ReadName(nameOfffset);
10+
m_pData += sizeof(uint32_t);
11+
12+
return methodName;
13+
}
14+
15+
uint16_t MethodInfo::GetSignatureLength()
16+
{
17+
m_signatureLength = *reinterpret_cast<uint16_t*>(m_pData);
18+
m_pData += sizeof(uint16_t);
19+
20+
return m_signatureLength;
21+
}
22+
23+
std::string MethodInfo::GetSignature() //use nodeId's to read the whole signature
24+
{
25+
uint16_t *nodeIdPtr = reinterpret_cast<uint16_t*>(m_pData);
26+
string signature = "(";
27+
string ret;
28+
for (int i=0; i< m_signatureLength; i++)
29+
{
30+
uint16_t nodeId = *nodeIdPtr++;
31+
string curArgTypeName = m_reader->ReadTypeName(nodeId);
32+
MetadataTreeNode *node = m_reader->GetNodeById(nodeId);
33+
34+
uint8_t nodeType = m_reader->GetNodeType(node);
35+
bool isRefType = m_reader->IsNodeTypeClass(nodeType) || m_reader->IsNodeTypeInterface(nodeType);
36+
if (i == 0)
37+
{
38+
if ((curArgTypeName[0] != '[') && isRefType)
39+
{
40+
ret.append("L");
41+
}
42+
ret.append(curArgTypeName);
43+
if ((curArgTypeName[0] != '[') && isRefType)
44+
{
45+
ret.append(";");
46+
}
47+
}
48+
else
49+
{
50+
if ((curArgTypeName[0] != '[') && isRefType)
51+
{
52+
signature.append("L");
53+
}
54+
signature.append(curArgTypeName);
55+
if ((curArgTypeName[0] != '[') && isRefType)
56+
{
57+
signature.append(";");
58+
}
59+
}
60+
}
61+
if (ret.empty())
62+
{
63+
ret = "V";
64+
}
65+
signature += ")" + ret;
66+
67+
int sizeofReadNodeIds = m_signatureLength * sizeof(uint16_t);
68+
m_pData += sizeofReadNodeIds;
69+
70+
return signature;
71+
}
72+
73+
std::string MethodInfo::GetDeclaringType()
74+
{
75+
uint16_t *declaringTypePtr = reinterpret_cast<uint16_t*>(m_pData);
76+
uint16_t nodeId = *declaringTypePtr;
77+
78+
string declTypeName = m_reader->ReadTypeName(nodeId);
79+
80+
m_pData += sizeof(uint16_t);
81+
82+
return declTypeName;
83+
}
84+
85+
int MethodInfo::GetSizeOfReadMethodInfo()
86+
{
87+
return m_pData - m_pStartData;
88+
}

src/jni/MetadataMethodInfo.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef METHODINFOSMARTPOINTER_H_
2+
#define METHODINFOSMARTPOINTER_H_
3+
4+
#include "MetadataReader.h"
5+
6+
#include <iostream>
7+
#include <string>
8+
#include <vector>
9+
10+
using namespace std;
11+
12+
namespace tns
13+
{
14+
class MethodInfo
15+
{
16+
public:
17+
MethodInfo(uint8_t *pValue, MetadataReader *reader)
18+
: m_pData(pValue), m_pStartData(pValue), m_reader(reader), m_signatureLength(0)
19+
{
20+
};
21+
22+
std::string GetName();
23+
uint16_t GetSignatureLength();
24+
std::string GetSignature();
25+
std::string GetDeclaringType();//used only for static methods
26+
27+
int GetSizeOfReadMethodInfo();
28+
29+
private:
30+
uint8_t *m_pData; //where we currently read
31+
uint8_t *m_pStartData; // pointer to the beginning
32+
uint16_t m_signatureLength;
33+
MetadataReader *m_reader;
34+
};
35+
}
36+
37+
38+
#endif /* METHODINFOSMARTPOINTER_H_ */

src/jni/MetadataNode.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,7 @@ void MetadataNode::GetterCallback(Local<String> property, const PropertyCallback
652652
{
653653
auto first = candidates.front();
654654

655-
if (first.isMember)
655+
if (first.isTypeMember)
656656
{
657657
if (first.type == NodeType::Method)
658658
{
@@ -1142,7 +1142,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithCustomMetada
11421142
case 'F':
11431143
case 'M':
11441144
entry.name = name;
1145-
entry.isMember = true;
1145+
entry.isTypeMember = true;
11461146
entry.type = (chKind == 'F') ? NodeType::Field : NodeType::Method;
11471147
entry.sig = signature;
11481148
entry.paramCount = paramCount;
@@ -1182,7 +1182,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
11821182
curPtr += sizeof(uint16_t);
11831183
for (int i = 0; i < instanceMethodCout; i++)
11841184
{
1185-
MetadataEntry entry = s_metadataReader.ReadInstanceMethodEntry(curPtr);
1185+
MetadataEntry entry = s_metadataReader.ReadInstanceMethodEntry(&curPtr);
11861186

11871187
if (entry.name == propName)
11881188
{
@@ -1196,7 +1196,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
11961196
curPtr += sizeof(uint16_t);
11971197
for (int i = 0; i < staticMethodCout; i++)
11981198
{
1199-
MetadataEntry entry = s_metadataReader.ReadStaticMethodEntry(curPtr);
1199+
MetadataEntry entry = s_metadataReader.ReadStaticMethodEntry(&curPtr);
12001200

12011201
if (entry.name == propName)
12021202
{
@@ -1211,14 +1211,14 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
12111211
extendEntry.name = "extend";
12121212
extendEntry.type = NodeType::Method;
12131213
extendEntry.treeNode = node->m_treeNode;
1214-
extendEntry.isMember = true;
1214+
extendEntry.isTypeMember = true;
12151215
candidates.push_back(extendEntry);
12161216

12171217
MetadataEntry extendsEntry;
12181218
extendsEntry.name = "extends";
12191219
extendsEntry.type = NodeType::Method;
12201220
extendsEntry.treeNode = node->m_treeNode;
1221-
extendsEntry.isMember = true;
1221+
extendsEntry.isTypeMember = true;
12221222
candidates.push_back(extendsEntry);
12231223
}
12241224

@@ -1227,7 +1227,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
12271227
curPtr += sizeof(uint16_t);
12281228
for (int i = 0; i < instanceFieldCout; i++)
12291229
{
1230-
MetadataEntry entry = s_metadataReader.ReadInstanceFieldEntry(curPtr);
1230+
MetadataEntry entry = s_metadataReader.ReadInstanceFieldEntry(&curPtr);
12311231

12321232
if (entry.name == propName)
12331233
{
@@ -1241,7 +1241,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
12411241
curPtr += sizeof(uint16_t);
12421242
for (int i = 0; i < staticFieldCout; i++)
12431243
{
1244-
MetadataEntry entry = s_metadataReader.ReadStaticFieldEntry(curPtr);
1244+
MetadataEntry entry = s_metadataReader.ReadStaticFieldEntry(&curPtr);
12451245

12461246
if (entry.name == propName)
12471247
{
@@ -1258,7 +1258,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForTypeWithoutCustomMet
12581258
classEntry.declaringType = node->m_name;
12591259
classEntry.type = NodeType::StaticField;
12601260
classEntry.treeNode = node->m_treeNode;
1261-
classEntry.isMember = true;
1261+
classEntry.isTypeMember = true;
12621262
classEntry.isStatic = true;
12631263
candidates.push_back(classEntry);
12641264
}
@@ -1306,7 +1306,7 @@ vector<MetadataEntry> MetadataNode::GetMetadataCandidatesForArray(MetadataNode *
13061306
classEntry.declaringType = node->m_name;
13071307
classEntry.type = NodeType::Field;
13081308
classEntry.treeNode = node->m_treeNode;
1309-
classEntry.isMember = true;
1309+
classEntry.isTypeMember = true;
13101310
candidates.push_back(classEntry);
13111311
}
13121312

0 commit comments

Comments
 (0)