在Nashorn中启用乐观类型的嵌套对象中出现奇怪的行为(属性设置为零)

Strange behavior (properties set to zero) in nested objects with optimistic types enabled in Nashorn

本文关键字:属性 设置 乐观 启用 Nashorn 类型 嵌套 对象      更新时间:2023-09-26

这是在JDK 8u102上。我看到一些奇怪的行为当乐观类型被设置为真时对象的某些属性被设置为零。下面是演示该行为的jjs脚本:

var config = {};
var creativeDetails = {
    fanpage_id: config.fanpage_id || "293867224112667",
    image_url: config.image_url || "http://some.url",
    title: config.title || "Ad Title",
    description: config.description || "Ad Description",
    link_description: config.link_description || "Link Description",
    call_to_action: config.call_to_action || "LEARN_MORE",
    destination_url: "http://some.url",
    link_body: config.link_body || "Link Body"
};
var linkData = {
    call_to_action: {
        type: creativeDetails.call_to_action,
        value:{
            link_caption: creativeDetails.link_description,
            link: creativeDetails.destination_url
        }
    },
    link: creativeDetails.destination_url,
    picture: creativeDetails.image_url,
    message: creativeDetails.description,
    name: creativeDetails.title
};
print(JSON.stringify(linkData, null, 4) + "'n");

在不带任何参数的jjs下运行此命令:

{
    "call_to_action": {
        "type": "LEARN_MORE",
        "value": {
            "link_caption": "Link Description",
            "link": "http://some.url"
        }
    },
    "link": "http://some.url",
    "picture": "http://some.url",
    "message": "Ad Description",
    "name": "Ad Title"
}

而与jjs --optimistic-types=true一起运行则得到:

{
    "call_to_action": {
        "type": "LEARN_MORE",
        "value": {
            "link_caption": "Link Description",
            "link": "http://some.url"
        }
    },
    "link": 0,
    "picture": 0,
    "message": 0,
    "name": 0
}

||表达式改为三元并没有改变其行为。然而,在初始化linkData对象之前,以任何方式引用creativeDetails对象的属性(例如,将其赋值给另一个变量或将其打印出来),最终会打印出预期的结果。

奇怪的是,嵌套对象得到了正确的值,而外部对象却没有。只有在使用有问题对象的属性初始化嵌套对象的属性时,才会出现这种行为。例如,下面的代码不会导致这个问题:

var linkData = {
    link: creativeDetails.destination_url,
    picture: creativeDetails.image_url,
    message: creativeDetails.description,
    name: creativeDetails.title
};

我知道Nashorn的乐观类型是通过假设某物的类型是int,然后逐步降级到Object来工作的。所以这可能与此有关,但我不确定这是如何发生的,或者为什么会发生。有人看到这种行为吗?

这是Nashorn的一个bug,现在已经解决了