summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartok <martok@martoks-place.de>2023-04-09 19:18:03 +0200
committerMartok <martok@martoks-place.de>2023-04-30 20:56:23 +0200
commitd4be309498c8e99df597923edbe4ec2d65974606 (patch)
tree10bd533722a4e37beb18bfd87433bfa2506b889d
parent196d6a6931d32e2812162141f16888f5baf26984 (diff)
downloaduxp-d4be309498c8e99df597923edbe4ec2d65974606.tar.gz
Issue #2142 - Change InitPropertyOperation to accept a PropertyName directy and use DefineDataProperty
Based-on: m-c 1413907, 1547129
-rw-r--r--js/src/jit/BaselineIC.cpp2
-rw-r--r--js/src/jit/VMFunctions.cpp3
-rw-r--r--js/src/vm/Interpreter-inl.h11
-rw-r--r--js/src/vm/Interpreter.cpp7
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<bool Equal>
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<PlainObject>() || obj->is<JSFunction>()) {
+ 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<UnboxedPlainObject>()) {
unsigned propAttrs = GetInitDataPropAttrs(op);
- return NativeDefineProperty(cx, obj.as<NativeObject>(), id, rhs, nullptr, nullptr,
- propAttrs);
+ return DefineProperty(cx, obj, id, rhs, nullptr, nullptr, propAttrs);
}
MOZ_ASSERT(obj->as<UnboxedPlainObject>().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<JSObject*> obj(&rootObject0, &REGS.sp[-2].toObject());
- PropertyName* name = script->getName(REGS.pc);
-
- RootedId& id = rootId0;
- id = NameToId(name);
+ ReservedRooted<PropertyName*> name(&rootName0, script->getName(REGS.pc));
- if (!InitPropertyOperation(cx, JSOp(*REGS.pc), obj, id, rval))
+ if (!InitPropertyOperation(cx, JSOp(*REGS.pc), obj, name, rval))
goto error;
REGS.sp--;