Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "ModuleScript.h"
8 : #include "mozilla/HoldDropJSObjects.h"
9 : #include "ScriptLoader.h"
10 :
11 : namespace mozilla {
12 : namespace dom {
13 :
14 : // A single module script. May be used to satisfy multiple load requests.
15 :
16 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ModuleScript)
17 0 : NS_INTERFACE_MAP_END
18 :
19 : NS_IMPL_CYCLE_COLLECTION_CLASS(ModuleScript)
20 :
21 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ModuleScript)
22 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK(mLoader)
23 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK(mBaseURL)
24 0 : tmp->UnlinkModuleRecord();
25 0 : NS_IMPL_CYCLE_COLLECTION_UNLINK_END
26 :
27 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(ModuleScript)
28 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLoader)
29 0 : NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
30 :
31 0 : NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(ModuleScript)
32 0 : NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mModuleRecord)
33 0 : NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mException)
34 0 : NS_IMPL_CYCLE_COLLECTION_TRACE_END
35 :
36 0 : NS_IMPL_CYCLE_COLLECTING_ADDREF(ModuleScript)
37 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(ModuleScript)
38 :
39 0 : ModuleScript::ModuleScript(ScriptLoader* aLoader, nsIURI* aBaseURL,
40 0 : JS::Handle<JSObject*> aModuleRecord)
41 : : mLoader(aLoader),
42 : mBaseURL(aBaseURL),
43 : mModuleRecord(aModuleRecord),
44 0 : mInstantiationState(Uninstantiated)
45 : {
46 0 : MOZ_ASSERT(mLoader);
47 0 : MOZ_ASSERT(mBaseURL);
48 0 : MOZ_ASSERT(mModuleRecord);
49 0 : MOZ_ASSERT(mException.isUndefined());
50 :
51 : // Make module's host defined field point to this module script object.
52 : // This is cleared in the UnlinkModuleRecord().
53 0 : JS::SetModuleHostDefinedField(mModuleRecord, JS::PrivateValue(this));
54 0 : HoldJSObjects(this);
55 0 : }
56 :
57 : void
58 0 : ModuleScript::UnlinkModuleRecord()
59 : {
60 : // Remove module's back reference to this object request if present.
61 0 : if (mModuleRecord) {
62 0 : MOZ_ASSERT(JS::GetModuleHostDefinedField(mModuleRecord).toPrivate() ==
63 : this);
64 0 : JS::SetModuleHostDefinedField(mModuleRecord, JS::UndefinedValue());
65 : }
66 0 : mModuleRecord = nullptr;
67 0 : mException.setUndefined();
68 0 : }
69 :
70 0 : ModuleScript::~ModuleScript()
71 : {
72 0 : if (mModuleRecord) {
73 : // The object may be destroyed without being unlinked first.
74 0 : UnlinkModuleRecord();
75 : }
76 0 : DropJSObjects(this);
77 0 : }
78 :
79 : void
80 0 : ModuleScript::SetInstantiationResult(JS::Handle<JS::Value> aMaybeException)
81 : {
82 0 : MOZ_ASSERT(mInstantiationState == Uninstantiated);
83 0 : MOZ_ASSERT(mModuleRecord);
84 0 : MOZ_ASSERT(mException.isUndefined());
85 :
86 0 : if (aMaybeException.isUndefined()) {
87 0 : mInstantiationState = Instantiated;
88 : } else {
89 0 : mModuleRecord = nullptr;
90 0 : mException = aMaybeException;
91 0 : mInstantiationState = Errored;
92 : }
93 0 : }
94 :
95 : } // dom namespace
96 : } // mozilla namespace
|