Skip to content

Commit

Permalink
Merge pull request #69 from Dinnerbone/feature/virtual_properties
Browse files Browse the repository at this point in the history
Allow for dynamic properties in Object
  • Loading branch information
Herschel authored Oct 2, 2019
2 parents bd5bed0 + b157354 commit 8a43523
Show file tree
Hide file tree
Showing 5 changed files with 273 additions and 34 deletions.
22 changes: 14 additions & 8 deletions core/src/avm1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,12 @@ impl<'gc> Avm1<'gc> {
object.call(self, context, object.as_object()?.to_owned(), &args)?;
self.stack.push(return_value);
} else {
let callable = object.as_object()?.read().get(&name);
let callable = object.as_object()?.read().get(
&name,
self,
context,
object.as_object()?.to_owned(),
);

if let Value::Undefined = callable {
return Err(format!("Object method {} is not defined", name).into());
Expand Down Expand Up @@ -640,13 +645,14 @@ impl<'gc> Avm1<'gc> {
// Flash 4-style variable
let var_path = self.pop()?;
let path = var_path.as_string()?;
let globals = self.globals;

// Special hardcoded variables
if path == "_root" || path == "this" {
self.push(context.start_clip.read().object());
return Ok(());
} else if path == "_global" {
self.push(Value::Object(self.globals));
self.push(Value::Object(globals));
return Ok(());
}

Expand All @@ -659,14 +665,14 @@ impl<'gc> Avm1<'gc> {
if let Some(clip) = node.read().as_movie_clip() {
let object = clip.object().as_object()?;
if object.read().has_property(var_name) {
result = Some(object.read().get(var_name));
result = Some(object.read().get(var_name, self, context, object));
}
}
};
}

if result.is_none() && self.globals.read().has_property(path) {
result = Some(self.globals.read().get(path));
if result.is_none() && globals.read().has_property(path) {
result = Some(globals.read().get(path, self, context, globals));
}
self.push(result.unwrap_or(Value::Undefined));
Ok(())
Expand Down Expand Up @@ -1133,10 +1139,10 @@ impl<'gc> Avm1<'gc> {
Self::resolve_slash_path_variable(context.target_clip, context.root, var_path)
{
if let Some(clip) = node.write(context.gc_context).as_movie_clip_mut() {
clip.object()
.as_object()?
let object = clip.object().as_object()?;
object
.write(context.gc_context)
.set(var_name, value);
.set(var_name, value, self, context, object);
}
}
Ok(())
Expand Down
6 changes: 3 additions & 3 deletions core/src/avm1/globals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ pub fn random<'gc>(
pub fn create_globals<'gc>(gc_context: MutationContext<'gc, '_>) -> Object<'gc> {
let mut globals = Object::object(gc_context);

globals.set_object("Math", math::create(gc_context));
globals.set_function("getURL", getURL, gc_context);
globals.set_function("random", random, gc_context);
globals.force_set("Math", Value::Object(math::create(gc_context)));
globals.force_set_function("getURL", getURL, gc_context);
globals.force_set_function("random", random, gc_context);

globals
}
24 changes: 12 additions & 12 deletions core/src/avm1/globals/math.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use std::f64::NAN;
macro_rules! wrap_std {
( $object: ident, $gc_context: ident, $($name:expr => $std:path),* ) => {{
$(
$object.set_function(
$object.force_set_function(
$name,
|_avm, _context, _this, args| -> Value<'gc> {
if let Some(input) = args.get(0) {
Expand Down Expand Up @@ -49,14 +49,14 @@ pub fn random<'gc>(
pub fn create<'gc>(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, Object<'gc>> {
let mut math = Object::object(gc_context);

math.set("E", Value::Number(std::f64::consts::E));
math.set("LN10", Value::Number(std::f64::consts::LN_10));
math.set("LN2", Value::Number(std::f64::consts::LN_2));
math.set("LOG10E", Value::Number(std::f64::consts::LOG10_E));
math.set("LOG2E", Value::Number(std::f64::consts::LOG2_E));
math.set("PI", Value::Number(std::f64::consts::PI));
math.set("SQRT1_2", Value::Number(std::f64::consts::FRAC_1_SQRT_2));
math.set("SQRT2", Value::Number(std::f64::consts::SQRT_2));
math.force_set("E", Value::Number(std::f64::consts::E));
math.force_set("LN10", Value::Number(std::f64::consts::LN_10));
math.force_set("LN2", Value::Number(std::f64::consts::LN_2));
math.force_set("LOG10E", Value::Number(std::f64::consts::LOG10_E));
math.force_set("LOG2E", Value::Number(std::f64::consts::LOG2_E));
math.force_set("PI", Value::Number(std::f64::consts::PI));
math.force_set("SQRT1_2", Value::Number(std::f64::consts::FRAC_1_SQRT_2));
math.force_set("SQRT2", Value::Number(std::f64::consts::SQRT_2));

wrap_std!(math, gc_context,
"abs" => f64::abs,
Expand All @@ -73,8 +73,8 @@ pub fn create<'gc>(gc_context: MutationContext<'gc, '_>) -> GcCell<'gc, Object<'
"tan" => f64::tan
);

math.set_function("atan2", atan2, gc_context);
math.set_function("random", random, gc_context);
math.force_set_function("atan2", atan2, gc_context);
math.force_set_function("random", random, gc_context);

GcCell::allocate(gc_context, math)
}
Expand All @@ -96,7 +96,7 @@ mod tests {
fn $test() -> Result<(), Error> {
with_avm(19, |avm, context| {
let math = create(context.gc_context);
let function = math.read().get($name);
let function = math.read().get($name, avm, context, math);

$(
assert_eq!(function.call(avm, context, math, $args)?, $out);
Expand Down
4 changes: 2 additions & 2 deletions core/src/avm1/movie_clip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use gc_arena::MutationContext;
macro_rules! with_movie_clip {
( $gc_context: ident, $object:ident, $($name:expr => $fn:expr),* ) => {{
$(
$object.set_function(
$object.force_set_function(
$name,
|_avm, _context, this, args| -> Value<'gc> {
if let Some(display_object) = this.read().display_node() {
Expand All @@ -25,7 +25,7 @@ macro_rules! with_movie_clip {
macro_rules! with_movie_clip_mut {
( $gc_context: ident, $object:ident, $($name:expr => $fn:expr),* ) => {{
$(
$object.set_function(
$object.force_set_function(
$name,
|_avm, context, this, args| -> Value<'gc> {
if let Some(display_object) = this.read().display_node() {
Expand Down
Loading

0 comments on commit 8a43523

Please sign in to comment.