src/stdlib/String.js
'use strict';
const EasyObjectValue = require('../values/EasyObjectValue');
const CompletionRecord = require('../CompletionRecord');
const PropertyDescriptor = require('../values/PropertyDescriptor');
class StringObject extends EasyObjectValue {
*call(thiz, args, scope, ext) {
let asConstructor = ext && ext.asConstructor;
if ( !asConstructor ) {
//Called as a function...
if ( args.length == 0 ) return scope.realm.fromNative('');
return yield * args[0].toStringValue();
}
let len = 0;
if ( args.length > 0 ) {
let pv = yield * args[0].toStringValue();
len = pv.native.length;
thiz.primativeValue = pv;
} else {
thiz.primativeValue = EasyObjectValue.emptyString;
}
var plen = new PropertyDescriptor(scope.realm.fromNative(len));
plen.enumerable = false;
plen.configurable = false;
plen.writable = false;
thiz.rawSetProperty('length', plen);
return thiz;
}
callPrototype(realm) { return realm.StringPrototype; }
constructorFor(realm) { return realm.StringPrototype; }
static *fromCharCode(thiz, args) {
let argz = new Array(args.length);
for ( let i = 0; i < args.length; ++i ) {
argz[i] = (yield * args[i].toNumberValue()).toNative();
}
return this.fromNative(String.fromCharCode.apply(String, argz));
}
static *raw(thiz, args) {
let raw = yield * args[0].get('raw');
let result = yield * raw.get(0);
for ( let i = 1; i < args.length; ++i ) {
result = yield * result.add(args[i]);
result = yield * result.add(yield * raw.get(i));
}
return result;
}
}
module.exports = StringObject;