Further cleanup: always look up streamers by their java name.
- Sliiiiightly less efficient in a few cases. - But: looking typed arrays up by class didn't work anyway, there was some duplicated code in jname and class lookup, and the jname thing handles Lists from the server. So overall I think this is a win. Less code is better code. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5610 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -159,10 +159,11 @@ public class ObjectInputStream
|
||||
return null;
|
||||
}
|
||||
|
||||
var streamer :Streamer = (type is Class)
|
||||
? Streamer.getStreamerByClass(type as Class)
|
||||
: Streamer.getStreamerByJavaName(type as String);
|
||||
|
||||
var jname :String = type as String;
|
||||
if (type is Class) {
|
||||
jname = Translations.getToServer(ClassUtil.getClassName(type));
|
||||
}
|
||||
var streamer :Streamer = Streamer.getStreamerByJavaName(jname);
|
||||
if (streamer == null) {
|
||||
throw new Error("Cannot field stream " + type);
|
||||
}
|
||||
|
||||
@@ -42,39 +42,13 @@ public class Streamer
|
||||
{
|
||||
public static function getStreamer (obj :Object) :Streamer
|
||||
{
|
||||
var jname :String;
|
||||
if (obj is TypedArray) {
|
||||
return getStreamerByJavaName(TypedArray(obj).getJavaType());
|
||||
jname = TypedArray(obj).getJavaType();
|
||||
} else {
|
||||
return getStreamerByClass(ClassUtil.getClass(obj));
|
||||
jname = Translations.getToServer(ClassUtil.getClassName(obj));
|
||||
}
|
||||
}
|
||||
|
||||
public static function getStreamerByClass (clazz :Class) :Streamer
|
||||
{
|
||||
initStreamers();
|
||||
|
||||
if (clazz === TypedArray) {
|
||||
throw new Error("Broken, TODO");
|
||||
}
|
||||
|
||||
var streamer :Streamer = _byClass[clazz] as Streamer;
|
||||
if (streamer != null) {
|
||||
return streamer;
|
||||
}
|
||||
|
||||
if (ClassUtil.isAssignableAs(Enum, clazz)) {
|
||||
streamer = new EnumStreamer(clazz);
|
||||
|
||||
} else if (ClassUtil.isAssignableAs(Streamable, clazz)) {
|
||||
streamer = new Streamer(clazz);
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
// add the new streamer and return it
|
||||
registerStreamer(streamer);
|
||||
return streamer;
|
||||
return getStreamerByJavaName(jname);
|
||||
}
|
||||
|
||||
public static function getStreamerByJavaName (jname :String) :Streamer
|
||||
@@ -97,6 +71,9 @@ public class Streamer
|
||||
|
||||
} else {
|
||||
// otherwise see if it represents a Streamable
|
||||
// usually this is called from ObjectInputStream, but when it's called from
|
||||
// ObjectOutputStream it's a bit annoying, because we started with a class/object.
|
||||
// But: the code is smaller, so that wins
|
||||
var clazz :Class = ClassUtil.getClassByName(Translations.getFromServer(jname));
|
||||
|
||||
if (ClassUtil.isAssignableAs(Enum, clazz)) {
|
||||
@@ -131,14 +108,6 @@ public class Streamer
|
||||
return _jname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the Class identifying that which we stream, or null to not be registered.
|
||||
*/
|
||||
public function getClass () :Class
|
||||
{
|
||||
return _target;
|
||||
}
|
||||
|
||||
public function writeObject (obj :Object, out :ObjectOutputStream) :void
|
||||
//throws IOError
|
||||
{
|
||||
@@ -161,11 +130,6 @@ public class Streamer
|
||||
protected static function registerStreamer (st :Streamer) :void
|
||||
{
|
||||
_byJName[st.getJavaClassName()] = st;
|
||||
trace(": registered " + st.getJavaClassName());
|
||||
var c :Class = st.getClass();
|
||||
if (c != null) {
|
||||
_byClass[c] = st;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -179,7 +143,6 @@ public class Streamer
|
||||
return;
|
||||
}
|
||||
_byJName = new Dictionary();
|
||||
_byClass = new Dictionary();
|
||||
for each (var c :Class in
|
||||
[ StringStreamer, NumberStreamer, ByteStreamer, IntegerStreamer, LongStreamer,
|
||||
FloatStreamer, ArrayStreamer, ByteArrayStreamer ]) {
|
||||
@@ -191,7 +154,6 @@ public class Streamer
|
||||
|
||||
protected var _jname :String;
|
||||
|
||||
protected static var _byClass :Dictionary;
|
||||
protected static var _byJName :Dictionary;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,11 +56,12 @@ public class Translations
|
||||
// initialize some standard classes
|
||||
addTranslation("Object", "java.lang.Object");
|
||||
addTranslation("String", "java.lang.String");
|
||||
addTranslation("flash.utils.ByteArray", "[B");
|
||||
addTranslation("com.threerings.util.langBoolean", "java.lang.Boolean");
|
||||
addTranslation("com.threerings.util.Byte", "java.lang.Byte");
|
||||
addTranslation("com.threerings.util.Integer", "java.lang.Integer");
|
||||
addTranslation("com.threerings.util.Long", "java.lang.Long");
|
||||
addTranslation("com.threerings.util.Float", "java.lang.Float");
|
||||
addTranslation("Array", "[Ljava.lang.Object;");
|
||||
addTranslation("flash.utils.ByteArray", "[B");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,13 +66,6 @@ public class ArrayStreamer extends Streamer
|
||||
}
|
||||
}
|
||||
|
||||
override public function getClass () :Class
|
||||
{
|
||||
// this is a little weird, but basically, we don't want to be registered for Array
|
||||
// unless we're the basic Object array streamer.
|
||||
return (_jname == "[Ljava.lang.Object;") ? Array : null;
|
||||
}
|
||||
|
||||
override public function createObject (ins :ObjectInputStream) :Object
|
||||
{
|
||||
var ta :TypedArray = new TypedArray(_jname);
|
||||
|
||||
Reference in New Issue
Block a user