Implement Symbol prototype

This commit is contained in:
Fedor 2019-07-08 13:08:37 +03:00
parent 7fd9c4b7e3
commit c2483721f0
2 changed files with 33 additions and 0 deletions

View File

@ -33,6 +33,7 @@ SymbolObject::create(JSContext* cx, JS::HandleSymbol symbol)
}
const JSPropertySpec SymbolObject::properties[] = {
JS_PSG("description", descriptionGetter, 0),
JS_PS_END
};
@ -227,6 +228,34 @@ SymbolObject::toPrimitive(JSContext* cx, unsigned argc, Value* vp)
return CallNonGenericMethod<IsSymbol, valueOf_impl>(cx, args);
}
// ES2019 Stage 4 Draft / November 28, 2018
// Symbol description accessor
// See: https://tc39.github.io/proposal-Symbol-description/
bool
SymbolObject::descriptionGetter_impl(JSContext* cx, const CallArgs& args)
{
// Get symbol object pointer.
HandleValue thisv = args.thisv();
MOZ_ASSERT(IsSymbol(thisv));
Rooted<Symbol*> sym(cx, thisv.isSymbol()
? thisv.toSymbol()
: thisv.toObject().as<SymbolObject>().unbox());
// Return the symbol's description if present, otherwise return undefined.
if (JSString* str = sym->description())
args.rval().setString(str);
else
args.rval().setUndefined();
return true;
}
bool
SymbolObject::descriptionGetter(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
return CallNonGenericMethod<IsSymbol, descriptionGetter_impl>(cx, args);
}
JSObject*
js::InitSymbolClass(JSContext* cx, HandleObject obj)
{

View File

@ -52,6 +52,10 @@ class SymbolObject : public NativeObject
static MOZ_MUST_USE bool valueOf(JSContext* cx, unsigned argc, Value* vp);
static MOZ_MUST_USE bool toPrimitive(JSContext* cx, unsigned argc, Value* vp);
// Properties defined on Symbol.prototype.
static MOZ_MUST_USE bool descriptionGetter_impl(JSContext* cx, const CallArgs& args);
static MOZ_MUST_USE bool descriptionGetter(JSContext* cx, unsigned argc, Value *vp);
static const JSPropertySpec properties[];
static const JSFunctionSpec methods[];
static const JSFunctionSpec staticMethods[];