8000 Improve performance of generating JS class from Metadata by ammarahm-ed · Pull Request #1824 · NativeScript/android · GitHub
[go: up one dir, main page]

Skip to content

Improve performance of generating JS class from Metadata #1824

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Jan 19, 2025
Merged
Prev Previous commit
Next Next commit
fix: use copy constructors for metadata entry & method info
  • Loading branch information
ammarahm-ed committed Oct 7, 2024
commit 74f75d035d96e1aa61bfc6ae02c30f3acf0764b7
32 changes: 16 additions & 16 deletions test-app/runtime/src/main/cpp/FieldAccessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ Local<Value> FieldAccessor::GetJavaField(Isolate* isolate, const Local<Object>&

JniLocalRef targetJavaObject;

auto fieldMetadata = fieldData->metadata;
auto &fieldMetadata = fieldData->metadata;

const auto& fieldTypeName = fieldMetadata->getSig();
auto isStatic = fieldMetadata->isStatic;
const auto& fieldTypeName = fieldMetadata.getSig();
auto isStatic = fieldMetadata.isStatic;

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

if (isStatic) {
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
} else {
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
}
}

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

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

auto fieldMetadata = fieldData->metadata;
auto &fieldMetadata = fieldData->metadata;

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

JniLocalRef targetJavaObject;

const auto& fieldTypeName = fieldMetadata->getSig();
auto isStatic = fieldMetadata->isStatic;
const auto& fieldTypeName = fieldMetadata.getSig();
auto isStatic = fieldMetadata.isStatic;


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

if (isStatic) {
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
assert(fieldData->clazz != nullptr);
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
fieldData->fid = env.GetStaticFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
assert(fieldData->fid != nullptr);
} else {
fieldData->clazz = env.FindClass(fieldMetadata->getDeclaringType());
fieldData->clazz = env.FindClass(fieldMetadata.getDeclaringType());
assert(fieldData->clazz != nullptr);
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata->name, fieldJniSig);
fieldData->fid = env.GetFieldID(fieldData->clazz, fieldMetadata.name, fieldJniSig);
assert(fieldData->fid != nullptr);
}
}
Expand All @@ -230,7 +230,7 @@ void FieldAccessor::SetJavaField(Isolate* isolate, const Local<Object>& target,

if (targetJavaObject.IsNull()) {
stringstream ss;
ss << "Cannot access property '" << fieldMetadata->name.c_str() << "' because there is no corresponding Java object";
ss << "Cannot access property '" << fieldMetadata.name.c_str() << "' because there is no corresponding Java object";
throw NativeScriptException(ss.str());
}
}
Expand Down
5 changes: 2 additions & 3 deletions test-app/runtime/src/main/cpp/FieldCallbackData.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@

namespace tns {
struct FieldCallbackData {
FieldCallbackData(MetadataEntry *metadata)
FieldCallbackData(MetadataEntry metadata)
:
metadata(metadata), fid(nullptr), clazz(nullptr) {

}

MetadataEntry* metadata;
MetadataEntry metadata;
jfieldID fid;
jclass clazz;
};
Expand Down
16 changes: 9 additions & 7 deletions test-app/runtime/src/main/cpp/MetadataEntry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ std::string &MetadataEntry::getName() {
} else if (type == NodeType::StaticField) {
name = reader->ReadName(sfi->nameOffset);
} else if (type == NodeType::Method) {
name = mi->GetName();
name = mi.GetName();
}

return name;
Expand All @@ -38,9 +38,9 @@ std::string &MetadataEntry::getSig() {
} else if (type == NodeType::StaticField) {
sig = reader->ReadTypeName(sfi->nodeId);
} else if (type == NodeType::Method) {
uint8_t sigLength = mi->GetSignatureLength();
uint8_t sigLength = mi.GetSignatureLength();
if (sigLength > 0)
sig = mi->GetSignature();
sig = mi.GetSignature();

}

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

if (type == NodeType::Method) {
if (mi->GetSignatureLength() > 0) {
if (mi.GetSignatureLength() > 0) {
returnType = MetadataReader::ParseReturnType(this->getSig());
}
} else {
Expand All @@ -68,7 +68,7 @@ MethodReturnType MetadataEntry::getRetType() {
auto reader = MetadataNode::getMetadataReader();

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

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

if (type == NodeType::StaticField) {
declaringType = reader->ReadTypeName(sfi->declaringType);
} else if (type == NodeType::Method && isStatic) {
declaringType = mi.GetDeclaringType();
}

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

if (type == NodeType::Method) {
auto sigLength = mi->GetSignatureLength();
auto sigLength = mi.GetSignatureLength();
if (sigLength > 0) {
paramCount = sigLength - 1;
} else {
Expand Down Expand Up @@ -124,7 +126,7 @@ bool MetadataEntry::getIsResolved() {

auto reader = MetadataNode::getMetadataReader();
if (type == NodeType::Method) {
isResolved = mi->CheckIsResolved() == 1;
isResolved = mi.CheckIsResolved() == 1;
}

isResolvedSet = true;
Expand Down
56 changes: 46 additions & 10 deletions test-app/runtime/src/main/cpp/MetadataEntry.h
9E81
Original file line numberDiff line number Diff line change
Expand Up @@ -35,29 +35,65 @@ namespace tns {
class MetadataEntry {
public:

MetadataEntry(MetadataTreeNode* m_treeNode, NodeType nodeType);
MetadataEntry(MetadataTreeNode *m_treeNode, NodeType nodeType);

MetadataEntry(const MetadataEntry &other) = default;

MetadataEntry &operator=(const MetadataEntry &other) {
if (this != &other) {
treeNode = other.treeNode;
type = other.type;
isExtensionFunction = other.isExtensionFunction;
isStatic = other.isStatic;
isTypeMember = other.isTypeMember;
memberId = other.memberId;
clazz = other.clazz;
parsedSig = other.parsedSig;
mi = other.mi;
fi = other.fi;
sfi = other.sfi;
name = other.name;
sig = other.sig;
returnType = other.returnType;
retType = other.retType;
declaringType = other.declaringType;
paramCount = other.paramCount;
isFinal = other.isFinal;
isStatic = other.isResolved;
isResolvedSet = other.isResolvedSet;
isFinalSet = other.isFinalSet;
}
return *this;
}

std::string &getName();

std::string &getSig();

std::string &getReturnType();

std::string& getName();
std::string& getSig();
std::string& getReturnType();
MethodReturnType getRetType();
std::string& getDeclaringType();

std::string &getDeclaringType();

int getParamCount();

bool getIsFinal();

bool getIsResolved();

MetadataTreeNode* treeNode;
MetadataTreeNode *treeNode;
NodeType type;
bool isExtensionFunction;
bool isStatic;
bool isTypeMember;
void* memberId;
void *memberId;
jclass clazz;
std::vector<std::string> parsedSig;

MethodInfo* mi;
FieldInfo* fi;
StaticFieldInfo* sfi;
MethodInfo mi;
FieldInfo *fi;
StaticFieldInfo *sfi;

std::string name;
std::string sig;
Expand Down
17 changes: 17 additions & 0 deletions test-app/runtime/src/main/cpp/MetadataMethodInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,23 @@ namespace tns {
sizeMeasured(false), nameOffset(0), resolvedData(0),
declaringNodeId(0){
}

MethodInfo(const MethodInfo& other) = default;

MethodInfo& operator=(const MethodInfo& other) {
if (this != &other) {
isStatic = other.isStatic;
m_pData = other.m_pData;
m_pStartData = other.m_pStartData;
m_signatureLength = other.m_signatureLength;
sizeMeasured = other.sizeMeasured;
nameOffset = other.nameOffset;
resolvedData = other.resolvedData;
declaringNodeId = other.declaringNodeId;
nodeIds = other.nodeIds;
}
return *this;
}

std::string GetName();

Expand Down
Loading
0