package com.oracle.truffle.js.nodes.intl;
import com.oracle.truffle.api.dsl.Specialization;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
import com.oracle.truffle.js.nodes.access.PropertySetNode;
import com.oracle.truffle.js.runtime.JSContext;
import com.oracle.truffle.js.runtime.builtins.JSRegExp;
import com.oracle.truffle.js.runtime.objects.JSAttributes;
import com.oracle.truffle.js.runtime.util.TRegexUtil;
public abstract class CreateRegExpNode extends JavaScriptBaseNode {
@Child private TRegexUtil.InteropReadMemberNode readNamedCG = TRegexUtil.InteropReadMemberNode.create();
@Child private TRegexUtil.InteropIsNullNode isNamedCGNull = TRegexUtil.InteropIsNullNode.create();
@Child private PropertySetNode setLastIndex;
private final JSContext context;
protected CreateRegExpNode(JSContext context) {
this.context = context;
this.setLastIndex = PropertySetNode.createImpl(JSRegExp.LAST_INDEX, false, context, true, true, JSAttributes.notConfigurableNotEnumerableWritable());
}
public static CreateRegExpNode create(JSContext context) {
return CreateRegExpNodeGen.create(context);
}
public DynamicObject createRegExp(Object compiledRegex) {
return createRegExp(compiledRegex, true);
}
public DynamicObject createRegExp(Object compiledRegex, boolean legacyFeaturesEnabled) {
return execute(compiledRegex, legacyFeaturesEnabled);
}
protected abstract DynamicObject execute(Object compiledRegex, boolean legacyFeaturesEnabled);
@Specialization(guards = {"!hasNamedCG(compiledRegex)"})
protected DynamicObject createWithoutNamedCG(Object compiledRegex, boolean legacyFeaturesEnabled) {
DynamicObject reObj = JSRegExp.create(context, compiledRegex, null, legacyFeaturesEnabled);
setLastIndex.setValueInt(reObj, 0);
return reObj;
}
@Specialization(guards = {"hasNamedCG(compiledRegex)"})
protected DynamicObject createWithNamedCG(Object compiledRegex, boolean legacyFeaturesEnabled) {
Object namedCaptureGroups = readNamedCG.execute(compiledRegex, TRegexUtil.Props.CompiledRegex.GROUPS);
DynamicObject reObj = JSRegExp.create(context, compiledRegex, JSRegExp.buildGroupsFactory(context, namedCaptureGroups), legacyFeaturesEnabled);
setLastIndex.setValueInt(reObj, 0);
return reObj;
}
protected boolean hasNamedCG(Object compiledRegex) {
Object namedCaptureGroups = readNamedCG.execute(compiledRegex, TRegexUtil.Props.CompiledRegex.GROUPS);
return !isNamedCGNull.execute(namedCaptureGroups);
}
}