Home Reference Source

src/stdlib/Error.js

'use strict';

const EasyObjectValue = require('../values/EasyObjectValue');
const ObjectValue = require('../values/ObjectValue');
const ArrayValue = require('../values/ArrayValue');
const PrimitiveValue = require('../values/PrimitiveValue');
const EmptyValue = require('../values/EmptyValue');
const ErrorValue = require('../values/ErrorValue');
const CompletionRecord = require('../CompletionRecord');
const PropertyDescriptor = require('../values/PropertyDescriptor');
const Value = require('../Value');



class ErrorObject extends EasyObjectValue {
	constructor(realm) {
		super(realm);
		this.realm = realm;
	}
	makeOne() {
		let nue = new ErrorValue(this.realm);
		let p = this.properties['prototype'];
		if ( p ) nue.setPrototype(p.value);
		return nue;
	}

	make(message, name) {
		let nue = this.makeOne();
		if ( message ) {
			nue.setImmediate('message', Value.fromNative(message));
			nue.properties['message'].enumerable = false;
			nue.createNativeAnalog().message = message;
		}

		if ( name ) {
			nue.setImmediate('name', Value.fromNative(name));
			nue.properties['name'].enumerable = false;
			nue.createNativeAnalog().name = name;
		}

		return nue;
	}

	makeFrom(err) {
		let nue = this.makeOne();
		if ( err.message ) nue.setImmediate('message', Value.fromNative(err.message));
		if ( err.name ) nue.setImmediate('name', Value.fromNative(err.name));
		err.native = err;
		return nue;
	}

	*makeThisForNew() {
		return this.makeOne();
	}

	*call(thiz, args, s, ext) {
		let asConstructor = ext && ext.asConstructor;
		if ( !asConstructor ) {
			thiz = this.makeOne();
		}

		if ( args.length > 0 ) yield * thiz.set('message', args[0], s, {enumerable: false});
		if ( args.length > 1 ) yield * thiz.set('fileName', args[1], s, {enumerable: false});
		if ( args.length > 2 ) yield * thiz.set('lineNumber', args[2], s, {enumerable: false});

		return thiz;
	}

	makeErrorType(type) {
		let proto = new ObjectValue(this.realm);
		proto.setPrototype(this.realm.ErrorPrototype);
		proto.setImmediate('name', Value.fromNative(type.name));
		proto.properties.name.enumerable = false;
		proto.wellKnownName = `%${type.name}Prototype%`;
		proto.nativeClass = type;

		let obj = new ErrorObject(this.realm);
		obj.setPrototype(proto);
		obj.properties.prototype.value = proto;
		obj.wellKnownName = `%${type.name}%`;
		proto.rawSetProperty('constructor', new PropertyDescriptor(obj, false));
		return obj;

	}

	callPrototype(realm) { return realm.ErrorPrototype; }

}

ErrorObject.prototype.wellKnownName = '%Error%';

module.exports = ErrorObject;