Skip to content

Commit bd2a9d1

Browse files
Lord-McSweeneyLord-McSweeney
Lord-McSweeney
authored andcommitted
avm2: Make ClassObject::from_class_partial and ClassObject::link_prototype infallible
1 parent 88c75a5 commit bd2a9d1

File tree

3 files changed

+23
-30
lines changed

3 files changed

+23
-30
lines changed

core/src/avm2/activation.rs

+1
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ impl<'a, 'gc> Activation<'a, 'gc> {
392392
abc_method,
393393
body,
394394
)?;
395+
395396
ClassObject::from_class(&mut dummy_activation, activation_class, None)
396397
})?;
397398

core/src/avm2/globals.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -555,20 +555,20 @@ pub fn load_player_globals<'gc>(
555555
let gs = scope.chain(mc, &[Scope::new(globals.into())]);
556556
activation.set_outer(gs);
557557

558-
let object_class = ClassObject::from_class_partial(activation, object_i_class, None)?;
558+
let object_class = ClassObject::from_class_partial(activation, object_i_class, None);
559559
let object_proto =
560560
ScriptObject::custom_object(mc, object_i_class, None, object_class.instance_vtable());
561561

562562
let class_class =
563-
ClassObject::from_class_partial(activation, class_i_class, Some(object_class))?;
563+
ClassObject::from_class_partial(activation, class_i_class, Some(object_class));
564564
let class_proto = ScriptObject::custom_object(
565565
mc,
566566
object_i_class,
567567
Some(object_proto),
568568
object_class.instance_vtable(),
569569
);
570570

571-
let fn_class = ClassObject::from_class_partial(activation, fn_classdef, Some(object_class))?;
571+
let fn_class = ClassObject::from_class_partial(activation, fn_classdef, Some(object_class));
572572
let fn_proto = ScriptObject::custom_object(
573573
mc,
574574
fn_classdef,
@@ -577,13 +577,13 @@ pub fn load_player_globals<'gc>(
577577
);
578578

579579
// Now to weave the Gordian knot...
580-
object_class.link_prototype(activation, object_proto)?;
580+
object_class.link_prototype(activation, object_proto);
581581
object_class.link_type(mc, class_proto);
582582

583-
fn_class.link_prototype(activation, fn_proto)?;
583+
fn_class.link_prototype(activation, fn_proto);
584584
fn_class.link_type(mc, class_proto);
585585

586-
class_class.link_prototype(activation, class_proto)?;
586+
class_class.link_prototype(activation, class_proto);
587587
class_class.link_type(mc, class_proto);
588588

589589
// At this point, we need at least a partial set of system classes in
@@ -607,7 +607,7 @@ pub fn load_player_globals<'gc>(
607607

608608
// Function's prototype is an instance of itself
609609
let fn_proto = fn_class.construct(activation, &[])?.as_object().unwrap();
610-
fn_class.link_prototype(activation, fn_proto)?;
610+
fn_class.link_prototype(activation, fn_proto);
611611

612612
// Object prototype is enough
613613
globals.set_proto(mc, object_class.prototype());

core/src/avm2/object/class_object.rs

+15-23
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,14 @@ impl<'gc> ClassObject<'gc> {
9090
self,
9191
activation: &mut Activation<'_, 'gc>,
9292
superclass_object: Option<ClassObject<'gc>>,
93-
) -> Result<Object<'gc>, Error<'gc>> {
93+
) -> Object<'gc> {
9494
let proto = ScriptObject::new_object(activation);
9595

9696
if let Some(superclass_object) = superclass_object {
9797
let base_proto = superclass_object.prototype();
9898
proto.set_proto(activation.gc(), base_proto);
9999
}
100-
Ok(proto)
100+
proto
101101
}
102102

103103
/// Construct a class.
@@ -114,10 +114,10 @@ impl<'gc> ClassObject<'gc> {
114114
class: Class<'gc>,
115115
superclass_object: Option<ClassObject<'gc>>,
116116
) -> Result<Self, Error<'gc>> {
117-
let class_object = Self::from_class_partial(activation, class, superclass_object)?;
118-
let class_proto = class_object.allocate_prototype(activation, superclass_object)?;
117+
let class_object = Self::from_class_partial(activation, class, superclass_object);
118+
let class_proto = class_object.allocate_prototype(activation, superclass_object);
119119

120-
class_object.link_prototype(activation, class_proto)?;
120+
class_object.link_prototype(activation, class_proto);
121121

122122
let class_class_proto = activation.avm2().classes().class.prototype();
123123
class_object.link_type(activation.gc(), class_class_proto);
@@ -141,7 +141,7 @@ impl<'gc> ClassObject<'gc> {
141141
activation: &mut Activation<'_, 'gc>,
142142
class: Class<'gc>,
143143
superclass_object: Option<ClassObject<'gc>>,
144-
) -> Result<Self, Error<'gc>> {
144+
) -> Self {
145145
let c_class = class
146146
.c_class()
147147
.expect("Can only call ClassObject::from_class on i_classes");
@@ -176,14 +176,14 @@ impl<'gc> ClassObject<'gc> {
176176
instance_scope
177177
)
178178
.set(instance_scope);
179-
class_object.init_instance_vtable(activation)?;
179+
class_object.init_instance_vtable(activation);
180180

181181
class.add_class_object(activation.gc(), class_object);
182182

183-
Ok(class_object)
183+
class_object
184184
}
185185

186-
fn init_instance_vtable(self, activation: &mut Activation<'_, 'gc>) -> Result<(), Error<'gc>> {
186+
fn init_instance_vtable(self, activation: &mut Activation<'_, 'gc>) {
187187
let class = self.inner_class_definition();
188188

189189
self.instance_vtable().init_vtable(
@@ -194,9 +194,7 @@ impl<'gc> ClassObject<'gc> {
194194
activation.gc(),
195195
);
196196

197-
self.link_interfaces(activation)?;
198-
199-
Ok(())
197+
self.link_interfaces(activation);
200198
}
201199

202200
/// Finish initialization of the class.
@@ -244,26 +242,22 @@ impl<'gc> ClassObject<'gc> {
244242
}
245243

246244
/// Link this class to a prototype.
247-
pub fn link_prototype(
248-
self,
249-
activation: &mut Activation<'_, 'gc>,
250-
class_proto: Object<'gc>,
251-
) -> Result<(), Error<'gc>> {
245+
pub fn link_prototype(self, activation: &mut Activation<'_, 'gc>, class_proto: Object<'gc>) {
252246
let mc = activation.gc();
253247

254248
unlock!(Gc::write(mc, self.0), ClassObjectData, prototype).set(Some(class_proto));
255-
class_proto.set_string_property_local(istr!("constructor"), self.into(), activation)?;
249+
class_proto
250+
.set_string_property_local(istr!("constructor"), self.into(), activation)
251+
.expect("Prototype is a dynamic object");
256252
class_proto.set_local_property_is_enumerable(mc, istr!("constructor"), false);
257-
258-
Ok(())
259253
}
260254

261255
/// Link this class to it's interfaces.
262256
///
263257
/// This should be done after all instance traits has been resolved, as
264258
/// instance traits will be resolved to their corresponding methods at this
265259
/// time.
266-
pub fn link_interfaces(self, activation: &mut Activation<'_, 'gc>) -> Result<(), Error<'gc>> {
260+
fn link_interfaces(self, activation: &mut Activation<'_, 'gc>) {
267261
let class = self.inner_class_definition();
268262

269263
// FIXME - we should only be copying properties for newly-implemented
@@ -283,8 +277,6 @@ impl<'gc> ClassObject<'gc> {
283277
}
284278
}
285279
}
286-
287-
Ok(())
288280
}
289281

290282
/// Manually set the type of this `Class`.

0 commit comments

Comments
 (0)