Skip to content

Commit

Permalink
AMF3: Fix timing when creating a new IExternalizable instance
Browse files Browse the repository at this point in the history
  • Loading branch information
jgranick committed May 21, 2024
1 parent 0279fd4 commit 4e81d09
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 30 deletions.
18 changes: 1 addition & 17 deletions src/openfl/utils/_internal/format/amf3/AMF3Reader.hx
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class AMF3Reader

var h = new Map();

var ret = AObject(h, null, className != null ? AMF3Tools.decode(className) : null);
var ret = AObject(h, null, className != null ? AMF3Tools.decode(className) : null, isExternalizable);

// save new object in reference table
complexObjectsTable.push(ret);
Expand All @@ -159,22 +159,6 @@ class AMF3Reader
}
}
}
else
{
// create class instance and call `readExternal()` to deserialize
var input = new AMF3ReaderInput(this);
var className = AMF3Tools.decode(className);

var cls = openfl.Lib.getClassByAlias(className);
if (cls == null) cls = Type.resolveClass(className);

if (cls != null)
{
var instance = Type.createInstance(cls, []);
var field = Reflect.field(instance, "readExternal");
Reflect.callMethod(instance, field, [input]);
}
}

return ret;
}
Expand Down
31 changes: 19 additions & 12 deletions src/openfl/utils/_internal/format/amf3/AMF3Tools.hx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class AMF3Tools
{
h.set(f, encode(Reflect.field(o, f)));
}
AObject(h, null, null);
AObject(h, null, null, false);
case TClass(c):
switch (c)
{
Expand Down Expand Up @@ -101,7 +101,7 @@ class AMF3Tools
h.set(f, encode(Reflect.getProperty(o, f)));
i++;
}
AObject(h, i, Type.getClassName(_class));
AObject(h, i, Type.getClassName(_class), false);
}
default:
throw "Can't encode " + Std.string(o);
Expand All @@ -121,7 +121,7 @@ class AMF3Tools
case ADate(_): date(a);
case AArray(_, _): array(a);
case AVector(_): vector(a);
case AObject(_, _, _): object(a);
case AObject(_, _, _, _): object(a);
case AXml(_): xml(a);
case ABytes(_): bytes(a);
case AMap(_): map(a);
Expand Down Expand Up @@ -221,16 +221,15 @@ class AMF3Tools

public static function object(a:AMF3Value)
{
// TODO: Merge with unwrapValue?
// This should instantiate, and should work recursively
if (a == null) return null;
return switch (a)
{
case AObject(o, _, className):
case AObject(o, _, className, isExternalizable):
var m = new Map();
for (f in o.keys())
m.set(f, decode(o.get(f)));
trace("TODO: WHY RETURN A MAP?");
trace(m);
trace(className);
m;
default: null;
}
Expand Down Expand Up @@ -297,7 +296,7 @@ class AMF3Tools
#end
return ba;

case AObject(fields, _, className):
case AObject(fields, _, className, isExternalizable):
var obj:Dynamic = null;

if (className != null && className != "")
Expand All @@ -311,11 +310,19 @@ class AMF3Tools
}
}

if (obj == null) obj = {};

for (name in fields.keys())
if (isExternalizable && obj != null && parent != null)
{
var input = new AMF3ReaderInput(parent);
Reflect.callMethod(obj, Reflect.field(obj, "readExternal"), [input]);
}
else
{
Reflect.setProperty(obj, name, unwrapValue(fields[name], parent));
if (obj == null) obj = {};

for (name in fields.keys())
{
Reflect.setProperty(obj, name, unwrapValue(fields[name], parent));
}
}

return obj;
Expand Down
2 changes: 1 addition & 1 deletion src/openfl/utils/_internal/format/amf3/AMF3Value.hx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ enum AMF3Value
ANumber(f:Float);
AString(s:String);
ADate(d:Date);
AObject(fields:Map<String, AMF3Value>, ?size:Int, ?classname:String);
AObject(fields:Map<String, AMF3Value>, ?size:Int, ?classname:String, ?isExternalizable:Bool);
AArray(values:Array<AMF3Value>, ?extra:Map<String, AMF3Value>);
AVector(values:Vector<AMF3Value>, ?classname:String);
AXml(x:Xml);
Expand Down

0 comments on commit 4e81d09

Please sign in to comment.