BREAKING: rm YogaNode parameter from YogaLogger#log
Summary: In D17439957, I noted that YogaLogger#log throws a NoMethodFoundException when called from C++ b/c C++ and Java's signatures of that method don't match. C++ uses YogaNodeJNIBase for the first param, Java uses YogaNode. Both my attempts to fix this failed. Attempt #1 - Make Java use YogaNodeJNIBase. This doesn't work because the :java-interface target includes YogaLogger but not YogaNodeJNIBase. Moving YogaLogger to the impl target doesn't work either b/c other files in :java-interface reference YogaLogger. Attempt #2 - Make C++ use YogaNode. This doesn't work b/c we try to call the log method with objects of fbjni type YogaNodeJNIBase. This would be fine in Java since YogaNodeJNIBase extends YogaNode. But fbjni's typing isn't advanced enough to know this, so the Yoga C++ fails to compile. At this point, I was wondering what the value of having this param in the log function at all was. None of the implementations in our codebase use it today. It might be easier to just remove it all together. This also removes a bug with YGNodePrint where we pass a null layout context that eventually causes a SIG_ABRT when we use it to try to find a YogaNode to pass to this function. (https://fburl.com/diffusion/ssw9h8lv). Reviewed By: amir-shalem Differential Revision: D17470379 fbshipit-source-id: 8fc2d95505971a52af2399a9fbb60b63f27f0ec2
This commit is contained in:
committed by
Facebook Github Bot
parent
f1baf8336b
commit
f00116c3a6
@@ -15,5 +15,5 @@ import com.facebook.proguard.annotations.DoNotStrip;
|
|||||||
@DoNotStrip
|
@DoNotStrip
|
||||||
public interface YogaLogger {
|
public interface YogaLogger {
|
||||||
@DoNotStrip
|
@DoNotStrip
|
||||||
void log(YogaNode node, YogaLogLevel level, String message);
|
void log(YogaLogLevel level, String message);
|
||||||
}
|
}
|
||||||
|
@@ -311,13 +311,10 @@ static int YGJNILogFunc(
|
|||||||
auto jloggerPtr =
|
auto jloggerPtr =
|
||||||
static_cast<global_ref<JYogaLogger>*>(YGConfigGetContext(config));
|
static_cast<global_ref<JYogaLogger>*>(YGConfigGetContext(config));
|
||||||
if (jloggerPtr != nullptr) {
|
if (jloggerPtr != nullptr) {
|
||||||
if (auto obj = YGNodeJobject(node, layoutContext)) {
|
(*jloggerPtr)
|
||||||
(*jloggerPtr)
|
->log(
|
||||||
->log(
|
JYogaLogLevel::fromInt(level),
|
||||||
obj,
|
Environment::current()->NewStringUTF(buffer.data()));
|
||||||
JYogaLogLevel::fromInt(level),
|
|
||||||
Environment::current()->NewStringUTF(buffer.data()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@@ -33,12 +33,10 @@ facebook::jni::local_ref<JYogaLogLevel> JYogaLogLevel::fromInt(jint logLevel) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JYogaLogger::log(
|
void JYogaLogger::log(
|
||||||
facebook::jni::alias_ref<JYogaNode> node,
|
|
||||||
facebook::jni::alias_ref<JYogaLogLevel> logLevel,
|
facebook::jni::alias_ref<JYogaLogLevel> logLevel,
|
||||||
jstring message) {
|
jstring message) {
|
||||||
static auto javaMethod =
|
static auto javaMethod =
|
||||||
javaClassLocal()
|
javaClassLocal()->getMethod<void(alias_ref<JYogaLogLevel>, jstring)>(
|
||||||
->getMethod<void(
|
"log");
|
||||||
alias_ref<JYogaNode>, alias_ref<JYogaLogLevel>, jstring)>("log");
|
javaMethod(self(), logLevel, message);
|
||||||
javaMethod(self(), node, logLevel, message);
|
|
||||||
}
|
}
|
||||||
|
@@ -28,10 +28,7 @@ struct JYogaLogLevel : public facebook::jni::JavaClass<JYogaLogLevel> {
|
|||||||
struct JYogaLogger : public facebook::jni::JavaClass<JYogaLogger> {
|
struct JYogaLogger : public facebook::jni::JavaClass<JYogaLogger> {
|
||||||
static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogger;";
|
static constexpr auto kJavaDescriptor = "Lcom/facebook/yoga/YogaLogger;";
|
||||||
|
|
||||||
void log(
|
void log(facebook::jni::alias_ref<JYogaLogLevel>, jstring);
|
||||||
facebook::jni::alias_ref<JYogaNode>,
|
|
||||||
facebook::jni::alias_ref<JYogaLogLevel>,
|
|
||||||
jstring);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class PtrJNodeMap {
|
class PtrJNodeMap {
|
||||||
|
@@ -17,7 +17,7 @@ public class YogaLoggerTest {
|
|||||||
final YogaConfig config = YogaConfigFactory.create();
|
final YogaConfig config = YogaConfigFactory.create();
|
||||||
YogaLogger logger = new YogaLogger() {
|
YogaLogger logger = new YogaLogger() {
|
||||||
@Override
|
@Override
|
||||||
public void log(YogaNode yogaNode, YogaLogLevel level, String message) {
|
public void log(YogaLogLevel level, String message) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
config.setLogger(logger);
|
config.setLogger(logger);
|
||||||
|
Reference in New Issue
Block a user