package com.oracle.truffle.js.nodes.intl;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
import com.oracle.truffle.js.nodes.access.PropertyGetNode;
import com.oracle.truffle.js.runtime.JSContext;
import com.oracle.truffle.js.runtime.builtins.intl.JSNumberFormat;
import com.oracle.truffle.js.runtime.objects.Undefined;
import com.oracle.truffle.js.runtime.util.IntlUtil;
public abstract class SetNumberFormatDigitOptionsNode extends JavaScriptBaseNode {
@Child GetNumberOptionNode getMinIntDigitsOption;
@Child PropertyGetNode getMinFracDigitsOption;
@Child PropertyGetNode getMaxFracDigitsOption;
@Child PropertyGetNode getMinSignificantDigitsOption;
@Child PropertyGetNode getMaxSignificantDigitsOption;
@Child DefaultNumberOptionNode getMnsdDNO;
@Child DefaultNumberOptionNode getMxsdDNO;
@Child DefaultNumberOptionNode getMnfdDNO;
@Child DefaultNumberOptionNode getMxfdDNO;
protected SetNumberFormatDigitOptionsNode(JSContext context) {
this.getMinIntDigitsOption = GetNumberOptionNode.create(context, IntlUtil.MINIMUM_INTEGER_DIGITS);
this.getMinFracDigitsOption = PropertyGetNode.create(IntlUtil.MINIMUM_FRACTION_DIGITS, context);
this.getMaxFracDigitsOption = PropertyGetNode.create(IntlUtil.MAXIMUM_FRACTION_DIGITS, context);
this.getMinSignificantDigitsOption = PropertyGetNode.create(IntlUtil.MINIMUM_SIGNIFICANT_DIGITS, context);
this.getMaxSignificantDigitsOption = PropertyGetNode.create(IntlUtil.MAXIMUM_SIGNIFICANT_DIGITS, context);
this.getMnsdDNO = DefaultNumberOptionNode.create();
this.getMxsdDNO = DefaultNumberOptionNode.create();
this.getMnfdDNO = DefaultNumberOptionNode.create();
this.getMxfdDNO = DefaultNumberOptionNode.create();
}
public static SetNumberFormatDigitOptionsNode create(JSContext context) {
return SetNumberFormatDigitOptionsNodeGen.create(context);
}
public abstract Object execute(JSNumberFormat.BasicInternalState intlObj, Object options, int mnfdDefault, int mxfdDefault, boolean compactNotation);
@Specialization
public Object setNumberFormatDigitOptions(JSNumberFormat.BasicInternalState intlObj, Object options, int mnfdDefault, int mxfdDefault, boolean compactNotation) {
int mnid = getMinIntDigitsOption.executeInt(options, 1, 21, 1);
Object mnfdValue = getMinFracDigitsOption.getValue(options);
Object mxfdValue = getMaxFracDigitsOption.getValue(options);
Object mnsdValue = getMinSignificantDigitsOption.getValue(options);
Object mxsdValue = getMaxSignificantDigitsOption.getValue(options);
intlObj.setMinimumIntegerDigits(mnid);
if (mnsdValue != Undefined.instance || mxsdValue != Undefined.instance) {
int mnsd = getMnsdDNO.executeInt(mnsdValue, 1, 21, 1);
int mxsd = getMxsdDNO.executeInt(mxsdValue, mnsd, 21, 21);
intlObj.setMinimumSignificantDigits(mnsd);
intlObj.setMaximumSignificantDigits(mxsd);
} else if (mnfdValue != Undefined.instance || mxfdValue != Undefined.instance) {
int mnfd = getMnfdDNO.executeInt(mnfdValue, 0, 20, mnfdDefault);
int mxfdActualDefualt = Math.max(mnfd, mxfdDefault);
int mxfd = getMxfdDNO.executeInt(mxfdValue, mnfd, 20, mxfdActualDefualt);
intlObj.setMinimumFractionDigits(mnfd);
intlObj.setMaximumFractionDigits(mxfd);
} else if (!compactNotation) {
intlObj.setMinimumFractionDigits(mnfdDefault);
intlObj.setMaximumFractionDigits(mxfdDefault);
}
return Undefined.instance;
}
}