/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.runtime.objects; import static com.github.anba.es6draft.runtime.AbstractOperations.ToInt32; import static com.github.anba.es6draft.runtime.AbstractOperations.ToString; import static com.github.anba.es6draft.runtime.internal.Properties.createProperties; import com.github.anba.es6draft.runtime.ExecutionContext; import com.github.anba.es6draft.runtime.Realm; import com.github.anba.es6draft.runtime.internal.Initializable; import com.github.anba.es6draft.runtime.internal.Properties.Attributes; import com.github.anba.es6draft.runtime.internal.Properties.Prototype; import com.github.anba.es6draft.runtime.internal.Properties.Value; import com.github.anba.es6draft.runtime.types.Constructor; import com.github.anba.es6draft.runtime.types.Intrinsics; import com.github.anba.es6draft.runtime.types.Type; import com.github.anba.es6draft.runtime.types.builtins.BuiltinConstructor; /** * <h1>19 Fundamental Objects</h1><br> * <h2>19.5 Error Objects</h2> * <ul> * <li>19.5.5 Native Error Types Used in This Standard * <li>19.5.6 NativeError Object Structure * <ul> * <li>19.5.6.1 NativeError Constructors * <li>19.5.6.2 Properties of the NativeError Constructors * </ul> * </ul> */ public final class NativeErrorConstructor extends BuiltinConstructor implements Initializable { /** * 19.5.5 Native Error Types Used in This Standard * <ul> * <li>19.5.5.1 EvalError * <li>19.5.5.2 RangeError * <li>19.5.5.3 ReferenceError * <li>19.5.5.4 SyntaxError * <li>19.5.5.5 TypeError * <li>19.5.5.6 URIError * </ul> */ public enum ErrorType { EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError, InternalError; private Intrinsics prototype() { switch (this) { case EvalError: return Intrinsics.EvalErrorPrototype; case RangeError: return Intrinsics.RangeErrorPrototype; case ReferenceError: return Intrinsics.ReferenceErrorPrototype; case SyntaxError: return Intrinsics.SyntaxErrorPrototype; case TypeError: return Intrinsics.TypeErrorPrototype; case URIError: return Intrinsics.URIErrorPrototype; case InternalError: return Intrinsics.InternalErrorPrototype; default: throw new AssertionError(); } } } private final ErrorType type; /** * Constructs a new NativeError constructor function. * * @param realm * the realm object * @param type * the native error type */ public NativeErrorConstructor(Realm realm, ErrorType type) { super(realm, type.name(), 1); this.type = type; } @Override public void initialize(Realm realm) { createProperties(realm, this, propertiesForType(type)); } @Override public NativeErrorConstructor clone() { return new NativeErrorConstructor(getRealm(), type); } /** * 19.5.6.1.1 NativeError (message) * <p> * <strong>Extension</strong>: NativeError (message, fileName, lineNumber, columnNumber) */ @Override public ErrorObject call(ExecutionContext callerContext, Object thisValue, Object... args) { /* steps 1-5 */ return construct(callerContext, this, args); } /** * 19.5.6.1.1 NativeError (message) * <p> * <strong>Extension</strong>: NativeError (message, fileName, lineNumber, columnNumber) */ @Override public ErrorObject construct(ExecutionContext callerContext, Constructor newTarget, Object... args) { ExecutionContext calleeContext = calleeContext(); Object message = argument(args, 0); /* step 1 (not applicable) */ /* steps 2-3 */ ErrorObject obj = OrdinaryCreateFromConstructor(calleeContext, newTarget, type.prototype(), ErrorObject::new); /* step 4 */ if (!Type.isUndefined(message)) { CharSequence msg = ToString(calleeContext, message); obj.defineErrorProperty("message", msg, false); } /* extension: fileName, lineNumber and columnNumber arguments */ if (args.length > 1) { CharSequence fileName = ToString(calleeContext, args[1]); obj.defineErrorProperty("fileName", fileName, true); } if (args.length > 2) { int line = ToInt32(calleeContext, args[2]); obj.defineErrorProperty("lineNumber", line, true); } if (args.length > 3) { int column = ToInt32(calleeContext, args[3]); obj.defineErrorProperty("columnNumber", column, true); } /* step 5 */ return obj; } private static Class<?> propertiesForType(ErrorType errorType) { switch (errorType) { case EvalError: return EvalErrorConstructorProperties.class; case RangeError: return RangeErrorConstructorProperties.class; case ReferenceError: return ReferenceErrorConstructorProperties.class; case SyntaxError: return SyntaxErrorConstructorProperties.class; case TypeError: return TypeErrorConstructorProperties.class; case URIError: return URIErrorConstructorProperties.class; case InternalError: return InternalErrorConstructorProperties.class; default: throw new AssertionError(); } } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum EvalErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "EvalError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.EvalErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum RangeErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "RangeError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.RangeErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum ReferenceErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "ReferenceError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.ReferenceErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum SyntaxErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "SyntaxError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.SyntaxErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum TypeErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "TypeError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.TypeErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum URIErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "URIError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.URIErrorPrototype; } /** * 19.5.6.2 Properties of the NativeError Constructors */ public enum InternalErrorConstructorProperties { ; @Prototype public static final Intrinsics __proto__ = Intrinsics.Error; @Value(name = "length", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final int length = 1; @Value(name = "name", attributes = @Attributes(writable = false, enumerable = false, configurable = true)) public static final String name = "InternalError"; /** * 19.5.6.2.1 NativeError.prototype */ @Value(name = "prototype", attributes = @Attributes(writable = false, enumerable = false, configurable = false)) public static final Intrinsics prototype = Intrinsics.InternalErrorPrototype; } }