Home Reference Source

src/stdlib/RegExp.js

'use strict';

const Value = require('../Value');
const CompletionRecord = require('../CompletionRecord');

const EasyObjectValue = require('../values/EasyObjectValue');
const RegExpValue = require('../values/RegExpValue');


class RegExpObject extends EasyObjectValue {

	*call(thiz, args, s) {
		let pattern = '';
		let flags = '';

		if ( (args.length > 0) && (args[0] instanceof RegExpValue) ) {
			if ( args.length > 1 && args[1].truthy ) return yield CompletionRecord.makeTypeError(s.realm, 'Cannot supply flags when constructing one RegExp from another');
			return RegExpValue.make(new RegExp(args[0].regexp), s.realm);
		}

		if ( args.length > 0 && args[0].jsTypeName !== 'undefined' ) pattern = yield * args[0].toStringNative();
		if ( args.length > 1 && args[1].jsTypeName !== 'undefined' ) flags = yield * args[1].toStringNative();

		let rx;
		try {
			rx = new RegExp(pattern, flags);
		} catch ( ex ) {
			return yield new CompletionRecord(CompletionRecord.THROW, Value.fromNative(ex, s.realm));
		}

		return RegExpValue.make(rx, s.realm);
	}

	callPrototype(realm) { return realm.RegExpPrototype; }
	get callLength() { return 2; }
}

RegExpObject.prototype.wellKnownName = '%RegExp%';

module.exports = RegExpObject;