[Swfdec] 3 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_function.c test/trace

Pekka Lampila medar at kemper.freedesktop.org
Wed Aug 22 05:02:14 PDT 2007


 libswfdec/swfdec_as_array.c    |   18 +---
 libswfdec/swfdec_as_function.c |    3 
 test/trace/trace_properties.as |  165 +++++++++++++++++++++++++++++------------
 3 files changed, 129 insertions(+), 57 deletions(-)

New commits:
diff-tree adebed995585fa9f993062a75df17ff464113e93 (from 99c2574700ed7aaeef5cadbc45c7bfdd9ad7a6dd)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Aug 22 15:00:41 2007 +0300

    Change Array's properties and flags to match flash player
    
    Set Array.constructor and Array.prototype.constructor flags to hidden and
    permanent. Don't set length in prototype but in constructor and
    swfdec_as_array_new.

diff --git a/libswfdec/swfdec_as_array.c b/libswfdec/swfdec_as_array.c
index 864915d..28888ae 100644
--- a/libswfdec/swfdec_as_array.c
+++ b/libswfdec/swfdec_as_array.c
@@ -323,14 +323,6 @@ swfdec_as_array_append_array (SwfdecAsAr
  */
 
 static void
-swfdec_as_array_add (SwfdecAsObject *object)
-{
-  swfdec_as_array_set_length (object, 0);
-
-  SWFDEC_AS_OBJECT_CLASS (swfdec_as_array_parent_class)->add (object);
-}
-
-static void
 swfdec_as_array_set (SwfdecAsObject *object, const char *variable,
     const SwfdecAsValue *val, guint flags)
 {
@@ -367,7 +359,6 @@ swfdec_as_array_class_init (SwfdecAsArra
 {
   SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass);
 
-  asobject_class->add = swfdec_as_array_add;
   asobject_class->set = swfdec_as_array_set;
 }
 
@@ -401,6 +392,7 @@ swfdec_as_array_new (SwfdecAsContext *co
   ret = g_object_new (SWFDEC_TYPE_AS_ARRAY, NULL);
   swfdec_as_object_add (ret, context, sizeof (SwfdecAsArray));
   swfdec_as_object_set_constructor (ret, context->Array);
+  swfdec_as_array_set_length (ret, 0);
   return ret;
 }
 
@@ -1064,6 +1056,8 @@ swfdec_as_array_construct (SwfdecAsConte
     swfdec_as_array_set_length (object, l < 0 ? 0 : l);
   } else if (argc > 0) {
     swfdec_as_array_append (array, argc, argv);
+  } else {
+    swfdec_as_array_set_length (object, 0);
   }
 
   SWFDEC_AS_VALUE_SET_OBJECT (ret, object);
@@ -1090,7 +1084,8 @@ swfdec_as_array_init_context (SwfdecAsCo
 
   /* set the right properties on the Array object */
   SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Function);
-  swfdec_as_object_set_variable (array, SWFDEC_AS_STR_constructor, &val);
+  swfdec_as_object_set_variable_and_flags (array, SWFDEC_AS_STR_constructor,
+      &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
   SWFDEC_AS_VALUE_SET_NUMBER (&val, ARRAY_SORT_OPTION_CASEINSENSITIVE);
   swfdec_as_object_set_variable (array, SWFDEC_AS_STR_CASEINSENSITIVE, &val);
   SWFDEC_AS_VALUE_SET_NUMBER (&val, ARRAY_SORT_OPTION_DESCENDING);
@@ -1104,7 +1099,8 @@ swfdec_as_array_init_context (SwfdecAsCo
 
   /* set the right properties on the Array.prototype object */
   SWFDEC_AS_VALUE_SET_OBJECT (&val, array);
-  swfdec_as_object_set_variable (proto, SWFDEC_AS_STR_constructor, &val);
+  swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR_constructor,
+      &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
   swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toString, 0,
       swfdec_as_array_toString, 0);
   swfdec_as_object_add_function (proto, SWFDEC_AS_STR_join,
diff-tree 99c2574700ed7aaeef5cadbc45c7bfdd9ad7a6dd (from 91ff6faecc598f3122830193a476bf866b917a42)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Aug 22 14:51:08 2007 +0300

    Set functions' constructor as hidden and permanent when creating it

diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c
index 9782a9c..d16110f 100644
--- a/libswfdec/swfdec_as_function.c
+++ b/libswfdec/swfdec_as_function.c
@@ -86,7 +86,8 @@ swfdec_as_function_set_constructor (Swfd
   context = object->context;
   if (context->Function) {
     SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Function);
-    swfdec_as_object_set_variable (object, SWFDEC_AS_STR_constructor, &val);
+    swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR_constructor,
+	&val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT);
   }
   if (context->Function_prototype) {
     SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Function_prototype);
diff-tree 91ff6faecc598f3122830193a476bf866b917a42 (from c5efffeed0afc0e64f4d01a4323c9137189bf41f)
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Aug 22 14:05:39 2007 +0300

    Flash 5 fixes and output cleanup to trace_properties.as
    
    Construct _global variable by hand when in flash 5, base it on values from
    flash 6. Make the script output less useless information.

diff --git a/test/trace/trace_properties.as b/test/trace/trace_properties.as
index e547478..bfa256c 100644
--- a/test/trace/trace_properties.as
+++ b/test/trace/trace_properties.as
@@ -1,4 +1,71 @@
-// doesn't work for Flash 5
+#if __SWF_VERSION__ == 5
+// create a _global object, since it doesn't have one, these are ver 6 values
+_global = new_empty_object ();
+_global.ASSetNative = ASSetNative;
+_global.ASSetNativeAccessor = ASSetNativeAccessor;
+_global.ASSetPropFlags = ASSetPropFlags;
+_global.ASconstructor = ASconstructor;
+_global.ASnative = ASnative;
+_global.Accessibility = Accessibility;
+_global.Array = Array;
+_global.AsBroadcaster = AsBroadcaster;
+_global.AsSetupError = AsSetupError;
+_global.Boolean = Boolean;
+_global.Button = Button;
+_global.Camera = Camera;
+_global.Color = Color;
+_global.ContextMenu = ContextMenu;
+_global.ContextMenuItem = ContextMenuItem;
+_global.Date = Date;
+_global.Error = Error;
+_global.Function = Function;
+_global.Infinity = Infinity;
+_global.Key = Key;
+_global.LoadVars = LoadVars;
+_global.LocalConnection = LocalConnection;
+_global.Math = Math;
+_global.Microphone = Microphone;
+_global.Mouse = Mouse;
+_global.MovieClip = MovieClip;
+_global.MovieClipLoader = MovieClipLoader;
+_global.NaN = NaN;
+_global.NetConnection = NetConnection;
+_global.NetStream = NetStream;
+_global.Number = Number;
+_global.Object = Object;
+_global.PrintJob = PrintJob;
+_global.RemoteLSOUsage = RemoteLSOUsage;
+_global.Selection = Selection;
+_global.SharedObject = SharedObject;
+_global.Sound = Sound;
+_global.Stage = Stage;
+_global.String = String;
+_global.System = System;
+_global.TextField = TextField;
+_global.TextFormat = TextFormat;
+_global.TextSnapshot = TextSnapshot;
+_global.Video = Video;
+_global.XML = XML;
+_global.XMLNode = XMLNode;
+_global.XMLSocket = XMLSocket;
+_global.clearInterval = clearInterval;
+_global.clearTimeout = clearTimeout;
+_global.enableDebugConsole = enableDebugConsole;
+_global.escape = escape;
+_global.flash = flash;
+_global.isFinite = isFinite;
+_global.isNaN = isNaN;
+_global.o = o;
+_global.parseFloat = parseFloat;
+_global.parseInt = parseInt;
+_global.setInterval = setInterval;
+_global.setTimeout = setTimeout;
+_global.showRedrawRegions = showRedrawRegions;
+_global.textRenderer = textRenderer;
+_global.trace = trace;
+_global.unescape = unescape;
+_global.updateAfterEvent = updateAfterEvent;
+#endif
 
 function new_empty_object () {
   var hash = new Object ();
@@ -65,7 +132,8 @@ function hasOwnProperty (o, prop)
 	if (o[prop] != o.__proto__[prop]) {
 	  return true;
 	} else {
-	  trace ("ERROR: can't test property '" + prop + "', __proto__ has superconstant version");
+	  trace ("ERROR: can't test property '" + prop +
+	      "', __proto__ has superconstant version");
 	  return false;
 	}
       }
@@ -79,7 +147,8 @@ function hasOwnProperty (o, prop)
 
     o.__proto__[prop] = old;
     if (o.__proto__[prop] != old)
-      trace ("Error: Couldn't set __proto__[\"" + prop + "\"] back to old value");
+      trace ("Error: Couldn't set __proto__[\"" + prop +
+	  "\"] back to old value");
     if (constant)
       ASSetPropFlags (o.__proto__, prop, 4);
 
@@ -123,12 +192,15 @@ function is_blaclisted (o, prop)
   if (prop == "mySecretId" || prop == "globalSecretId")
     return true;
 
-#if __SWF_VERSION__ >= 6
   if (o == _global.Camera && prop == "names")
     return true;
 
   if (o == _global.Microphone && prop == "names")
     return true;
+
+#if __SWF_VERSION__ < 6
+  if (prop == "__proto__" && o[prop] == undefined)
+    return true;
 #endif
 
   return false;
@@ -260,71 +332,63 @@ function trace_properties_recurse (o, pr
     if (flags != "")
       flags = " (" + flags + ")";
 
-    var id_string = "";
-    if (typeof (o[prop]) == "object" || typeof (o[prop]) == "function")
-      id_string = "[" + o[prop]["mySecretId"] + "]";
-
-    // put things together
-    var output = prop + flags + " = " + typeof (o[prop]) + id_string;
-
+    var value = "";
     // add value depending on the type
     if (typeof (o[prop]) == "number" || typeof (o[prop]) == "boolean") {
-      output += " : " + o[prop];
+      value += " : " + o[prop];
     } else if (typeof (o[prop]) == "string") {
-      output += " : \"" + o[prop] + "\"";
-    } else if (typeof (o[prop]) == "object") {
-      output += " : toString => \"" + o[prop] + "\"";
+      value += " : \"" + o[prop] + "\"";
     }
 
-    // print it out
-    trace (indentation + output);
-
-    // recurse if it's object or function that hasn't been seen earlier
-    if ((typeof (o[prop]) == "object" || typeof (o[prop]) == "function") &&
-	prefix + (prefix != "" ? "." : "") + identifier + "." + prop == o[prop]["mySecretId"])
+    // recurse if it's object or function and this is the place it has been
+    // named after
+    if (typeof (o[prop]) == "object" || typeof (o[prop]) == "function")
     {
-      trace_properties_recurse (o[prop], prefix + (prefix != "" ? "." : "") +
-	  identifier, prop, level + 1);
+      if (prefix + (prefix != "" ? "." : "") + identifier + "." + prop ==
+	  o[prop]["mySecretId"])
+      {
+	trace (indentation + prop + flags + " = " + typeof (o[prop]));
+	trace_properties_recurse (o[prop], prefix + (prefix != "" ? "." : "") +
+	    identifier, prop, level + 1);
+      }
+      else
+      {
+	trace (indentation + prop + flags + " = " + o[prop]["mySecretId"]);
+      }
+    }
+    else
+    {
+      trace (indentation + prop + flags + " = " + typeof (o[prop]) + value);
     }
   }
 }
 
 function generate_names (o, prefix, identifier)
 {
-  var info = new_info ();
-
   // mark the ones that are not hidden
-  for (var prop in o)
-  {
-    // only get the ones that are not only in the __proto__
-    if (is_blaclisted (o, prop) == false) {
-      if (hasOwnProperty (o, prop) == true)
-	set_info (info, prop, "hidden", false);
-    }
+  var nothidden = new Array ();
+  for (var prop in o) {
+    nothidden.push (prop);
   }
 
   // unhide everything
   ASSetPropFlags (o, null, 0, 1);
 
   var all = new Array ();
-  var hidden = new Array ();
   for (var prop in o)
   {
-    // only get the ones that are not only in the __proto__
     if (is_blaclisted (o, prop) == false) {
+      // only get the ones that are not only in the __proto__
       if (hasOwnProperty (o, prop) == true) {
 	all.push (prop);
-	if (get_info (info, prop, "hidden") != false) {
-	  set_info (info, prop, "hidden", true);
-	  hidden.push (prop);
-	}
       }
     }
   }
   all.sort ();
 
   // hide the ones that were already hidden
-  ASSetPropFlags (o, hidden, 1, 0);
+  ASSetPropFlags (o, null, 1, 0);
+  ASSetPropFlags (o, nothidden, 0, 1);
 
   for (var i = 0; i < all.length; i++) {
     var prop = all[i];
@@ -359,12 +423,23 @@ function trace_properties (o, prefix, id
 
   generate_names (o, prefix, identifier);
 
-  var output = identifier + " " + typeof (o) + "[" + prefix +
-    (prefix != "" ? "." : "") + identifier + "]";
-  if (typeof (o) == "object")
-    output += " : toString => \"" + o[prop] + "\"";
-  trace (output);
-
   if (typeof (o) == "object" || typeof (o) == "function")
+  {
+    if (prefix + (prefix != "" ? "." : "") + identifier == o["mySecretId"])
+    {
+      trace (prefix + (prefix != "" ? "." : "") + identifier + " = " +
+	  typeof (o));
+    }
+    else
+    {
+      trace (prefix + (prefix != "" ? "." : "") + identifier + " = " +
+	  o["mySecretId"]);
+    }
     trace_properties_recurse (o, prefix, identifier, 1);
+  }
+  else
+  {
+    trace (prefix + (prefix != "" ? "." : "") + identifier + " = " +
+	typeof (o[prop]) + value);
+  }
 }


More information about the Swfdec mailing list