|
@@ -1,5 +1,6 @@
|
|
|
using Jint.Native.Object;
|
|
|
-using Jint.Runtime.Descriptors.Specialized;
|
|
|
+using Jint.Runtime;
|
|
|
+using Jint.Runtime.Interop;
|
|
|
|
|
|
namespace Jint.Native.Error
|
|
|
{
|
|
@@ -8,34 +9,70 @@ namespace Jint.Native.Error
|
|
|
/// </summary>
|
|
|
public sealed class ErrorPrototype : ObjectInstance
|
|
|
{
|
|
|
- private ErrorPrototype(Engine engine)
|
|
|
+ private readonly string _name;
|
|
|
+
|
|
|
+ private ErrorPrototype(Engine engine, string name)
|
|
|
: base(engine)
|
|
|
{
|
|
|
+ _name = name;
|
|
|
}
|
|
|
|
|
|
public static ErrorPrototype CreatePrototypeObject(Engine engine, ErrorConstructor errorConstructor, string name)
|
|
|
{
|
|
|
- var obj = new ErrorPrototype(engine) { Extensible = true };
|
|
|
+ var obj = new ErrorPrototype(engine, name) { Extensible = true };
|
|
|
+ obj.Prototype = engine.Object.PrototypeObject;
|
|
|
|
|
|
obj.FastAddProperty("constructor", errorConstructor, false, false, false);
|
|
|
|
|
|
-
|
|
|
return obj;
|
|
|
}
|
|
|
|
|
|
public void Configure()
|
|
|
{
|
|
|
// Error prototype properties
|
|
|
- DefineOwnProperty("message", new ClrAccessDescriptor<ErrorInstance>(Engine, x => x.Message), false);
|
|
|
- DefineOwnProperty("name", new ClrAccessDescriptor<ErrorInstance>(Engine, x => x.Name), false);
|
|
|
+ FastAddProperty("message", "", true, false, true);
|
|
|
+ FastAddProperty("name", _name, true, false, true);
|
|
|
|
|
|
// Error prototype functions
|
|
|
- DefineOwnProperty("toString", new ClrDataDescriptor<ErrorInstance, object>(Engine, ToErrorString), false);
|
|
|
+ FastAddProperty("toString", new ClrFunctionInstance<object, object>(Engine, ToString), true, false, true);
|
|
|
}
|
|
|
|
|
|
- private static object ToErrorString(ErrorInstance thisObject, object[] arguments)
|
|
|
+ private object ToString(object thisObject, object[] arguments)
|
|
|
{
|
|
|
- return thisObject.ToErrorString();
|
|
|
+ var o = thisObject as ObjectInstance;
|
|
|
+ if (o == null)
|
|
|
+ {
|
|
|
+ throw new JavaScriptException(Engine.TypeError);
|
|
|
+ }
|
|
|
+
|
|
|
+ var name = o.Get("name");
|
|
|
+ if (name == Undefined.Instance)
|
|
|
+ {
|
|
|
+ name = _name;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ name = TypeConverter.ToString(name);
|
|
|
+ }
|
|
|
+
|
|
|
+ var msg = o.Get("message");
|
|
|
+ if (msg == Undefined.Instance)
|
|
|
+ {
|
|
|
+ msg = "";
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ msg = TypeConverter.ToString(msg);
|
|
|
+ }
|
|
|
+ if (name == "")
|
|
|
+ {
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+ if (msg == "")
|
|
|
+ {
|
|
|
+ return name;
|
|
|
+ }
|
|
|
+ return name + ": " + msg;
|
|
|
}
|
|
|
}
|
|
|
}
|