summaryrefslogtreecommitdiff
path: root/js/src/jsscript.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jsscript.cpp')
-rw-r--r--js/src/jsscript.cpp35
1 files changed, 23 insertions, 12 deletions
diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp
index bdd411d043..ba2e540e41 100644
--- a/js/src/jsscript.cpp
+++ b/js/src/jsscript.cpp
@@ -1407,19 +1407,10 @@ ScriptSourceObject::initFromOptions(JSContext* cx, HandleScriptSource source,
MOZ_ASSERT(source->getReservedSlot(ELEMENT_PROPERTY_SLOT).isMagic(JS_GENERIC_MAGIC));
MOZ_ASSERT(source->getReservedSlot(INTRODUCTION_SCRIPT_SLOT).isMagic(JS_GENERIC_MAGIC));
- RootedValue element(cx, ObjectOrNullValue(options.element()));
- if (!cx->compartment()->wrap(cx, &element))
+ RootedObject element(cx, options.element());
+ RootedString elementAttributeName(cx, options.elementAttributeName());
+ if (!initElementProperties(cx, source, element, elementAttributeName))
return false;
- source->setReservedSlot(ELEMENT_SLOT, element);
-
- RootedValue elementAttributeName(cx);
- if (options.elementAttributeName())
- elementAttributeName = StringValue(options.elementAttributeName());
- else
- elementAttributeName = UndefinedValue();
- if (!cx->compartment()->wrap(cx, &elementAttributeName))
- return false;
- source->setReservedSlot(ELEMENT_PROPERTY_SLOT, elementAttributeName);
// There is no equivalent of cross-compartment wrappers for scripts. If the
// introduction script and ScriptSourceObject are in different compartments,
@@ -1437,6 +1428,26 @@ ScriptSourceObject::initFromOptions(JSContext* cx, HandleScriptSource source,
return true;
}
+bool
+ScriptSourceObject::initElementProperties(JSContext* cx, HandleScriptSource source,
+ HandleObject element, HandleString elementAttrName)
+{
+ RootedValue elementValue(cx, ObjectOrNullValue(element));
+ if (!cx->compartment()->wrap(cx, &elementValue))
+ return false;
+
+ RootedValue nameValue(cx);
+ if (elementAttrName)
+ nameValue = StringValue(elementAttrName);
+ if (!cx->compartment()->wrap(cx, &nameValue))
+ return false;
+
+ source->setReservedSlot(ELEMENT_SLOT, elementValue);
+ source->setReservedSlot(ELEMENT_PROPERTY_SLOT, nameValue);
+
+ return true;
+}
+
/* static */ bool
JSScript::loadSource(JSContext* cx, ScriptSource* ss, bool* worked)
{