package com.oracle.truffle.js.runtime.builtins;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.js.builtins.BooleanPrototypeBuiltins;
import com.oracle.truffle.js.runtime.Errors;
import com.oracle.truffle.js.runtime.JSContext;
import com.oracle.truffle.js.runtime.JSException;
import com.oracle.truffle.js.runtime.JSRealm;
import com.oracle.truffle.js.runtime.JSRuntime;
import com.oracle.truffle.js.runtime.objects.JSObjectUtil;
import com.oracle.truffle.js.runtime.objects.JSShape;
public final class JSBoolean extends JSPrimitive implements JSConstructorFactory.Default {
public static final String TYPE_NAME = "boolean";
public static final String CLASS_NAME = "Boolean";
public static final String PROTOTYPE_NAME = "Boolean.prototype";
public static final String TRUE_NAME = "true";
public static final String FALSE_NAME = "false";
public static final JSBoolean INSTANCE = new JSBoolean();
private JSBoolean() {
}
public static DynamicObject create(JSContext context, boolean value) {
DynamicObject obj = JSBooleanObject.create(context.getRealm(), context.getBooleanFactory(), value);
assert isJSBoolean(obj);
return context.trackAllocation(obj);
}
@Override
public DynamicObject createPrototype(JSRealm realm, DynamicObject ctor) {
JSContext ctx = realm.getContext();
Shape protoShape = JSShape.createPrototypeShape(realm.getContext(), INSTANCE, realm.getObjectPrototype());
DynamicObject booleanPrototype = JSBooleanObject.create(protoShape, false);
JSObjectUtil.setOrVerifyPrototype(ctx, booleanPrototype, realm.getObjectPrototype());
JSObjectUtil.putConstructorProperty(ctx, booleanPrototype, ctor);
JSObjectUtil.putFunctionsFromContainer(realm, booleanPrototype, BooleanPrototypeBuiltins.BUILTINS);
return booleanPrototype;
}
@Override
public Shape makeInitialShape(JSContext context, DynamicObject prototype) {
Shape initialShape = JSObjectUtil.getProtoChildShape(prototype, INSTANCE, context);
return initialShape;
}
public static JSConstructor createConstructor(JSRealm realm) {
return INSTANCE.createConstructorAndPrototype(realm);
}
public static boolean valueOf(DynamicObject obj) {
assert isJSBoolean(obj);
return ((JSBooleanObject) obj).getBooleanValue();
}
public static boolean isJSBoolean(Object obj) {
return obj instanceof JSBooleanObject;
}
@Override
public String getClassName() {
return CLASS_NAME;
}
@Override
public String getClassName(DynamicObject object) {
return getClassName();
}
@Override
public String getBuiltinToStringTag(DynamicObject object) {
return getClassName(object);
}
@TruffleBoundary
public static JSException noBooleanError() {
throw Errors.createTypeError("not a Boolean object");
}
@TruffleBoundary
@Override
public String toDisplayStringImpl(DynamicObject obj, int depth, boolean allowSideEffects, JSContext context) {
if (context.isOptionNashornCompatibilityMode()) {
return "[Boolean " + valueOf(obj) + "]";
} else {
boolean primitiveValue = JSBoolean.valueOf(obj);
return JSRuntime.objectToConsoleString(obj, getBuiltinToStringTag(obj), depth,
new String[]{JSRuntime.PRIMITIVE_VALUE}, new Object[]{primitiveValue}, allowSideEffects);
}
}
@Override
public DynamicObject getIntrinsicDefaultProto(JSRealm realm) {
return realm.getBooleanPrototype();
}
}