From 627d0da7dc03013aeb51f3f65b0ba48d4ecf025d Mon Sep 17 00:00:00 2001 From: Martok Date: Sun, 9 Apr 2023 19:18:03 +0200 Subject: [PATCH] Issue #2142 - Change InitPropertyOperation to accept a PropertyName directy and use DefineDataProperty Based-on: m-c 1413907, 1547129 --- js/src/jit/BaselineIC.cpp | 2 +- js/src/jit/VMFunctions.cpp | 3 +-- js/src/vm/Interpreter-inl.h | 11 +++++++---- js/src/vm/Interpreter.cpp | 7 ++----- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/js/src/jit/BaselineIC.cpp b/js/src/jit/BaselineIC.cpp index 7dbe239a7e..61d77adc2e 100644 --- a/js/src/jit/BaselineIC.cpp +++ b/js/src/jit/BaselineIC.cpp @@ -4584,7 +4584,7 @@ DoSetPropFallback(JSContext* cx, BaselineFrame* frame, ICSetProp_Fallback* stub_ op == JSOP_INITLOCKEDPROP || op == JSOP_INITHIDDENPROP) { - if (!InitPropertyOperation(cx, op, obj, id, rhs)) + if (!InitPropertyOperation(cx, op, obj, name, rhs)) return false; } else if (op == JSOP_SETNAME || op == JSOP_STRICTSETNAME || diff --git a/js/src/jit/VMFunctions.cpp b/js/src/jit/VMFunctions.cpp index 01a22482eb..f191ce7d6d 100644 --- a/js/src/jit/VMFunctions.cpp +++ b/js/src/jit/VMFunctions.cpp @@ -232,8 +232,7 @@ bool InitProp(JSContext* cx, HandleObject obj, HandlePropertyName name, HandleValue value, jsbytecode* pc) { - RootedId id(cx, NameToId(name)); - return InitPropertyOperation(cx, JSOp(*pc), obj, id, value); + return InitPropertyOperation(cx, JSOp(*pc), obj, name, value); } template diff --git a/js/src/vm/Interpreter-inl.h b/js/src/vm/Interpreter-inl.h index 5c2320d3fb..79a4b90200 100644 --- a/js/src/vm/Interpreter-inl.h +++ b/js/src/vm/Interpreter-inl.h @@ -340,12 +340,15 @@ InitGlobalLexicalOperation(JSContext* cx, LexicalEnvironmentObject* lexicalEnvAr } inline bool -InitPropertyOperation(JSContext* cx, JSOp op, HandleObject obj, HandleId id, HandleValue rhs) +InitPropertyOperation(JSContext* cx, JSOp op, HandleObject obj, HandlePropertyName name, HandleValue rhs) { - if (obj->is() || obj->is()) { + RootedId id(cx, NameToId(name)); + + // {Goanna} DefineProperty works on almost any JSObject, but there's no good way to check what works + // So instead, check what we don't handle explicitly. + if (!obj->is()) { unsigned propAttrs = GetInitDataPropAttrs(op); - return NativeDefineProperty(cx, obj.as(), id, rhs, nullptr, nullptr, - propAttrs); + return DefineProperty(cx, obj, id, rhs, nullptr, nullptr, propAttrs); } MOZ_ASSERT(obj->as().layout().lookup(id)); diff --git a/js/src/vm/Interpreter.cpp b/js/src/vm/Interpreter.cpp index 5fccc00d54..b17c762eae 100644 --- a/js/src/vm/Interpreter.cpp +++ b/js/src/vm/Interpreter.cpp @@ -3744,12 +3744,9 @@ CASE(JSOP_INITHIDDENPROP) /* Load the object being initialized into lval/obj. */ ReservedRooted obj(&rootObject0, ®S.sp[-2].toObject()); - PropertyName* name = script->getName(REGS.pc); + ReservedRooted name(&rootName0, script->getName(REGS.pc)); - RootedId& id = rootId0; - id = NameToId(name); - - if (!InitPropertyOperation(cx, JSOp(*REGS.pc), obj, id, rval)) + if (!InitPropertyOperation(cx, JSOp(*REGS.pc), obj, name, rval)) goto error; REGS.sp--;