Pekka Lampila
2007-Aug-24 11:54 UTC
[Swfdec] 7 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.h libswfdec/swfdec_as_string.c test/trace
libswfdec/swfdec_as_context.c | 7 + libswfdec/swfdec_as_interpret.c | 9 +- libswfdec/swfdec_as_object.h | 3 libswfdec/swfdec_as_string.c | 128 ++++++++++++++++++++++-------------- test/trace/Makefile.am | 14 +++ test/trace/string-fake-5.swf |binary test/trace/string-fake-5.swf.trace | 12 +++ test/trace/string-fake-6.swf |binary test/trace/string-fake-6.swf.trace | 12 +++ test/trace/string-fake-7.swf |binary test/trace/string-fake-7.swf.trace | 12 +++ test/trace/string-fake.as | 35 +++++++++ test/trace/string-trace-5.swf |binary test/trace/string-trace-5.swf.trace | 8 ++ test/trace/string-trace-6.swf |binary test/trace/string-trace-6.swf.trace | 8 ++ test/trace/string-trace-7.swf |binary test/trace/string-trace-7.swf.trace | 8 ++ test/trace/string-trace.as | 27 +++++++ 19 files changed, 233 insertions(+), 50 deletions(-) New commits: diff-tree 641a6cfdd685460f61676f732b3f081f2e007c9f (from b132dd4594747f32a97fed84d447973bdc768ae8) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:46:32 2007 +0300 Forgot to add string-fake test to Makefile.am diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index b00d70a..004d23d 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -1067,6 +1067,13 @@ EXTRA_DIST = \ string-convert-6.swf.trace \ string-convert-7.swf \ string-convert-7.swf.trace \ + string-fake.as \ + string-fake-5.swf \ + string-fake-5.swf.trace \ + string-fake-6.swf \ + string-fake-6.swf.trace \ + string-fake-7.swf \ + string-fake-7.swf.trace \ string-indexof.as \ string-indexof-5.swf \ string-indexof-5.swf.trace \ diff-tree b132dd4594747f32a97fed84d447973bdc768ae8 (from 9bab9da501869ee04f07294e9172dbe996c86045) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:45:46 2007 +0300 Add test case for tracing strings objects diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 231d8df..b00d70a 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -1097,6 +1097,13 @@ EXTRA_DIST = \ string-split-empty-6.swf.trace \ string-split-empty-7.swf \ string-split-empty-7.swf.trace \ + string-trace.as \ + string-trace-5.swf \ + string-trace-5.swf.trace \ + string-trace-6.swf \ + string-trace-6.swf.trace \ + string-trace-7.swf \ + string-trace-7.swf.trace \ stringlength.as \ stringlength-5.swf \ stringlength-5.swf.trace \ diff --git a/test/trace/string-trace-5.swf b/test/trace/string-trace-5.swf new file mode 100644 index 0000000..923ebed Binary files /dev/null and b/test/trace/string-trace-5.swf differ diff --git a/test/trace/string-trace-5.swf.trace b/test/trace/string-trace-5.swf.trace new file mode 100644 index 0000000..7ce9d46 --- /dev/null +++ b/test/trace/string-trace-5.swf.trace @@ -0,0 +1,8 @@ +internal +internal +internal +internal +internal +valueOf +internal +valueOf diff --git a/test/trace/string-trace-6.swf b/test/trace/string-trace-6.swf new file mode 100644 index 0000000..d554fae Binary files /dev/null and b/test/trace/string-trace-6.swf differ diff --git a/test/trace/string-trace-6.swf.trace b/test/trace/string-trace-6.swf.trace new file mode 100644 index 0000000..7ce9d46 --- /dev/null +++ b/test/trace/string-trace-6.swf.trace @@ -0,0 +1,8 @@ +internal +internal +internal +internal +internal +valueOf +internal +valueOf diff --git a/test/trace/string-trace-7.swf b/test/trace/string-trace-7.swf new file mode 100644 index 0000000..850345b Binary files /dev/null and b/test/trace/string-trace-7.swf differ diff --git a/test/trace/string-trace-7.swf.trace b/test/trace/string-trace-7.swf.trace new file mode 100644 index 0000000..7ce9d46 --- /dev/null +++ b/test/trace/string-trace-7.swf.trace @@ -0,0 +1,8 @@ +internal +internal +internal +internal +internal +valueOf +internal +valueOf diff --git a/test/trace/string-trace.as b/test/trace/string-trace.as new file mode 100644 index 0000000..699ac4b --- /dev/null +++ b/test/trace/string-trace.as @@ -0,0 +1,27 @@ +// makeswf -v 7 -r 1 -o string-to-string-7.swf string-to-string.as + +var a = new String ("internal"); + +var b = new String ("internal"); +b.toString = function () { return "toString"; }; + +var c = new String ("internal"); +c.valueOf = function () { return "valueOf"; }; + +var d = new String ("internal"); +d.toString = function () { return "toString"; }; +d.valueOf = function () { return "valueOf"; }; + +trace (a); +trace ("" + a); + +trace (b); +trace ("" + b); + +trace (c); +trace ("" + c); + +trace (d); +trace ("" + d); + +loadMovie ("FSCommand:quit", ""); diff-tree 9bab9da501869ee04f07294e9172dbe996c86045 (from 13aa81dbca1a430cdaca848d23ef36a8192ca54c) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:44:15 2007 +0300 Add special case to trace: Print string objects using the internal presentation diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index d08b00a..44e7c5a 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -27,6 +27,7 @@ #include "swfdec_as_function.h" #include "swfdec_as_script_function.h" #include "swfdec_as_stack.h" +#include "swfdec_as_string.h" #include "swfdec_as_strings.h" #include "swfdec_as_super.h" #include "swfdec_as_with.h" @@ -552,10 +553,14 @@ swfdec_action_trace (SwfdecAsContext *cx const char *s; val = swfdec_as_stack_peek (cx, 1); - if (val->type == SWFDEC_AS_TYPE_UNDEFINED) + if (val->type == SWFDEC_AS_TYPE_UNDEFINED) { s = SWFDEC_AS_STR_undefined; - else + } else if (val->type == SWFDEC_AS_TYPE_OBJECT && + SWFDEC_IS_AS_STRING (swfdec_as_value_to_object (cx, val))) { + s = SWFDEC_AS_STRING (swfdec_as_value_to_object (cx, val))->string; + } else { s = swfdec_as_value_to_string (cx, val); + } swfdec_as_stack_pop (cx); g_signal_emit_by_name (cx, "trace", s); } diff-tree 13aa81dbca1a430cdaca848d23ef36a8192ca54c (from 3aeb7081c80edcbb50e66d58265e400d637f75fb) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:26:11 2007 +0300 Remove the swfdec_as_object_to_string and just use local helper function diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index f166b37..28a1dd7 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -1237,27 +1237,3 @@ swfdec_as_object_resolve (SwfdecAsObject return klass->resolve (object); } - -/** - * swfdec_as_object_to_string: - * @context: a #SwfdecAsContext - * @object: a #SwfdecAsObject - * - * Converts @object to a string according to the rules of Flash. This might - * cause calling back into the script engine. - * <warning>Never use this function for debugging purposes.</warning> - * - * Returns: a garbage-collected string representing @object. The value will - * never be %NULL. - **/ -const char * -swfdec_as_object_to_string (SwfdecAsContext *context, SwfdecAsObject *object) -{ - SwfdecAsValue val; - - g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL); - - SWFDEC_AS_VALUE_SET_OBJECT (&val, object); - - return swfdec_as_value_to_string (context, &val); -} diff --git a/libswfdec/swfdec_as_string.c b/libswfdec/swfdec_as_string.c index c9739c9..c05156f 100644 --- a/libswfdec/swfdec_as_string.c +++ b/libswfdec/swfdec_as_string.c @@ -69,6 +69,19 @@ swfdec_as_string_init (SwfdecAsString *s /*** AS CODE ***/ +static const char * +swfdec_as_string_object_to_string (SwfdecAsContext *context, + SwfdecAsObject *object) +{ + SwfdecAsValue val; + + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL); + + SWFDEC_AS_VALUE_SET_OBJECT (&val, object); + + return swfdec_as_value_to_string (context, &val); +} + static inline const char * swfdec_as_str_nth_char (const char *s, guint n) { @@ -82,7 +95,7 @@ void swfdec_as_string_lastIndexOf (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); gsize len; const char *s; @@ -110,7 +123,7 @@ void swfdec_as_string_indexOf (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); int offset=0, len, i=-1; const char *s, *t = NULL; @@ -135,7 +148,7 @@ void swfdec_as_string_charAt (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); int i; const char *s, *t; @@ -159,7 +172,7 @@ void swfdec_as_string_charCodeAt (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); int i; const char *s; gunichar c; @@ -309,7 +322,7 @@ swfdec_as_string_split_5 (SwfdecAsContex const char *str, *end, *delim; int count; - str = swfdec_as_object_to_string (cx, object); + str = swfdec_as_string_object_to_string (cx, object); arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx)); if (arr == NULL) return; @@ -363,7 +376,7 @@ swfdec_as_string_split_6 (SwfdecAsContex int count; guint len; - str = swfdec_as_object_to_string (cx, object); + str = swfdec_as_string_object_to_string (cx, object); arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx)); if (arr == NULL) return; @@ -437,7 +450,7 @@ void swfdec_as_string_substr (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); int from, to, len; from = swfdec_as_value_to_integer (cx, &argv[0]); @@ -471,7 +484,7 @@ void swfdec_as_string_substring (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); int from, to, len; len = g_utf8_strlen (string, -1); @@ -500,7 +513,7 @@ void swfdec_as_string_toLowerCase (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); char *s; s = g_utf8_strdown (string, -1); @@ -513,7 +526,7 @@ void swfdec_as_string_toUpperCase (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - const char *string = swfdec_as_object_to_string (cx, object); + const char *string = swfdec_as_string_object_to_string (cx, object); char *s; s = g_utf8_strup (string, -1); diff-tree 3aeb7081c80edcbb50e66d58265e400d637f75fb (from f2f9a954cf51088ac352e55ac62fc21f0af5e737) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:22:30 2007 +0300 Added test for using String's method in normal Object diff --git a/test/trace/string-fake-5.swf b/test/trace/string-fake-5.swf new file mode 100644 index 0000000..5d2fd1a Binary files /dev/null and b/test/trace/string-fake-5.swf differ diff --git a/test/trace/string-fake-5.swf.trace b/test/trace/string-fake-5.swf.trace new file mode 100644 index 0000000..20b8340 --- /dev/null +++ b/test/trace/string-fake-5.swf.trace @@ -0,0 +1,12 @@ +o: goodbye +toString: hello +valueOf: goodbye +HELLO +hello +l +108 +1 +1 +el +h,llo +ell diff --git a/test/trace/string-fake-6.swf b/test/trace/string-fake-6.swf new file mode 100644 index 0000000..803f50b Binary files /dev/null and b/test/trace/string-fake-6.swf differ diff --git a/test/trace/string-fake-6.swf.trace b/test/trace/string-fake-6.swf.trace new file mode 100644 index 0000000..20b8340 --- /dev/null +++ b/test/trace/string-fake-6.swf.trace @@ -0,0 +1,12 @@ +o: goodbye +toString: hello +valueOf: goodbye +HELLO +hello +l +108 +1 +1 +el +h,llo +ell diff --git a/test/trace/string-fake-7.swf b/test/trace/string-fake-7.swf new file mode 100644 index 0000000..cda34fd Binary files /dev/null and b/test/trace/string-fake-7.swf differ diff --git a/test/trace/string-fake-7.swf.trace b/test/trace/string-fake-7.swf.trace new file mode 100644 index 0000000..20b8340 --- /dev/null +++ b/test/trace/string-fake-7.swf.trace @@ -0,0 +1,12 @@ +o: goodbye +toString: hello +valueOf: goodbye +HELLO +hello +l +108 +1 +1 +el +h,llo +ell diff --git a/test/trace/string-fake.as b/test/trace/string-fake.as new file mode 100644 index 0000000..323c792 --- /dev/null +++ b/test/trace/string-fake.as @@ -0,0 +1,35 @@ +// makeswf -v 7 -r 1 -o test-7.swf test.as + +var o = new Object (); +o.toString = function () { return "hello"; }; +o.valueOf = function () { return "goodbye"; }; + +trace ("o: " + o); +trace ("toString: " + o.toString ()); +trace ("valueOf: " + o.valueOf ()); + +o.toUpperCase = String.prototype.toUpperCase; +o.toLowerCase = String.prototype.toLowerCase; +o.charAt = String.prototype.charAt; +o.charCodeAt = String.prototype.charCodeAt; +//o.concat = String.prototype.concat; +o.indexOf = String.prototype.indexOf; +o.lastIndexOf = String.prototype.lastIndexOf; +//o.slice = String.prototype.slice; +o.substring = String.prototype.substring; +o.split = String.prototype.split; +o.substr = String.prototype.substr; + +trace (o.toUpperCase ()); +trace (o.toLowerCase ()); +trace (o.charAt (3)); +trace (o.charCodeAt (2)); +//trace (o.concat (", and thanks for the fish!")); +trace (o.indexOf ("e")); +trace (o.lastIndexOf ("e")); +//trace (o.slice (1, 3)); +trace (o.substring (1, 3)); +trace (o.split ("e")); +trace (o.substr (1, 3)); + +loadMovie ("FSCommand:quit", ""); diff-tree f2f9a954cf51088ac352e55ac62fc21f0af5e737 (from 6360caf2cc3bd3b3b576b3cd36320108aa15e5b5) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 14:21:21 2007 +0300 Make most String's functions work with any Object Added swfdec_as_object_to_string function that calls swfdec_as_value_to_string diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 28a1dd7..f166b37 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -1237,3 +1237,27 @@ swfdec_as_object_resolve (SwfdecAsObject return klass->resolve (object); } + +/** + * swfdec_as_object_to_string: + * @context: a #SwfdecAsContext + * @object: a #SwfdecAsObject + * + * Converts @object to a string according to the rules of Flash. This might + * cause calling back into the script engine. + * <warning>Never use this function for debugging purposes.</warning> + * + * Returns: a garbage-collected string representing @object. The value will + * never be %NULL. + **/ +const char * +swfdec_as_object_to_string (SwfdecAsContext *context, SwfdecAsObject *object) +{ + SwfdecAsValue val; + + g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (object), NULL); + + SWFDEC_AS_VALUE_SET_OBJECT (&val, object); + + return swfdec_as_value_to_string (context, &val); +} diff --git a/libswfdec/swfdec_as_object.h b/libswfdec/swfdec_as_object.h index a61bc4b..2de6d04 100644 --- a/libswfdec/swfdec_as_object.h +++ b/libswfdec/swfdec_as_object.h @@ -177,6 +177,9 @@ void swfdec_as_object_call (SwfdecAsOb void swfdec_as_object_run (SwfdecAsObject * object, SwfdecScript * script); +const char* swfdec_as_object_to_string (SwfdecAsContext * context, + SwfdecAsObject * object); + G_END_DECLS #endif diff --git a/libswfdec/swfdec_as_string.c b/libswfdec/swfdec_as_string.c index 5cb4d18..c9739c9 100644 --- a/libswfdec/swfdec_as_string.c +++ b/libswfdec/swfdec_as_string.c @@ -30,6 +30,7 @@ #include "swfdec_as_native_function.h" #include "swfdec_as_strings.h" #include "swfdec_debug.h" +#include "swfdec_player_internal.h" G_DEFINE_TYPE (SwfdecAsString, swfdec_as_string, SWFDEC_TYPE_AS_OBJECT) @@ -76,11 +77,12 @@ swfdec_as_str_nth_char (const char *s, g return s; } -static void +SWFDEC_AS_NATIVE (251, 9, swfdec_as_string_lastIndexOf) +void swfdec_as_string_lastIndexOf (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); gsize len; const char *s; @@ -91,23 +93,24 @@ swfdec_as_string_lastIndexOf (SwfdecAsCo SWFDEC_AS_VALUE_SET_INT (ret, -1); return; } - len = g_utf8_offset_to_pointer (string->string, offset + 1) - string->string; + len = g_utf8_offset_to_pointer (string, offset + 1) - string; } else { len = G_MAXSIZE; } - s = g_strrstr_len (string->string, len, s); + s = g_strrstr_len (string, len, s); if (s) { - SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_pointer_to_offset (string->string, s)); + SWFDEC_AS_VALUE_SET_INT (ret, g_utf8_pointer_to_offset (string, s)); } else { SWFDEC_AS_VALUE_SET_INT (ret, -1); } } -static void +SWFDEC_AS_NATIVE (251, 8, swfdec_as_string_indexOf) +void swfdec_as_string_indexOf (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); int offset=0, len, i=-1; const char *s, *t = NULL; @@ -116,22 +119,23 @@ swfdec_as_string_indexOf (SwfdecAsContex offset = swfdec_as_value_to_integer (object->context, &argv[1]); if (offset < 0) offset = 0; - len = g_utf8_strlen (string->string, -1); + len = g_utf8_strlen (string, -1); if (offset < len) { - t = strstr (g_utf8_offset_to_pointer (string->string, offset), s); + t = strstr (g_utf8_offset_to_pointer (string, offset), s); } if (t != NULL) { - i = g_utf8_pointer_to_offset (string->string, t); + i = g_utf8_pointer_to_offset (string, t); } SWFDEC_AS_VALUE_SET_INT (ret, i); } -static void +SWFDEC_AS_NATIVE (251, 5, swfdec_as_string_charAt) +void swfdec_as_string_charAt (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); int i; const char *s, *t; @@ -140,7 +144,7 @@ swfdec_as_string_charAt (SwfdecAsContext SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_EMPTY); return; } - s = swfdec_as_str_nth_char (string->string, i); + s = swfdec_as_str_nth_char (string, i); if (*s == 0) { SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_EMPTY); return; @@ -150,11 +154,12 @@ swfdec_as_string_charAt (SwfdecAsContext SWFDEC_AS_VALUE_SET_STRING (ret, s); } -static void +SWFDEC_AS_NATIVE (251, 6, swfdec_as_string_charCodeAt) +void swfdec_as_string_charCodeAt (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); int i; const char *s; gunichar c; @@ -164,7 +169,7 @@ swfdec_as_string_charCodeAt (SwfdecAsCon SWFDEC_AS_VALUE_SET_NUMBER (ret, NAN); return; } - s = swfdec_as_str_nth_char (string->string, i); + s = swfdec_as_str_nth_char (string, i); if (*s == 0) { if (cx->version > 5) { SWFDEC_AS_VALUE_SET_NUMBER (ret, NAN); @@ -266,7 +271,8 @@ swfdec_as_string_construct (SwfdecAsCont } } -static void +SWFDEC_AS_NATIVE (251, 2, swfdec_as_string_toString) +void swfdec_as_string_toString (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { @@ -275,7 +281,8 @@ swfdec_as_string_toString (SwfdecAsConte SWFDEC_AS_VALUE_SET_STRING (ret, string->string); } -static void +SWFDEC_AS_NATIVE (251, 1, swfdec_as_string_valueOf) +void swfdec_as_string_valueOf (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { @@ -302,7 +309,7 @@ swfdec_as_string_split_5 (SwfdecAsContex const char *str, *end, *delim; int count; - str = SWFDEC_AS_STRING (object)->string; + str = swfdec_as_object_to_string (cx, object); arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx)); if (arr == NULL) return; @@ -347,7 +354,7 @@ swfdec_as_string_split_5 (SwfdecAsContex } static void -swfdec_as_string_split (SwfdecAsContext *cx, SwfdecAsObject *object, +swfdec_as_string_split_6 (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { SwfdecAsArray *arr; @@ -356,7 +363,7 @@ swfdec_as_string_split (SwfdecAsContext int count; guint len; - str = SWFDEC_AS_STRING (object)->string; + str = swfdec_as_object_to_string (cx, object); arr = SWFDEC_AS_ARRAY (swfdec_as_array_new (cx)); if (arr == NULL) return; @@ -402,6 +409,18 @@ swfdec_as_string_split (SwfdecAsContext } } +SWFDEC_AS_NATIVE (251, 12, swfdec_as_string_split) +void +swfdec_as_string_split (SwfdecAsContext *cx, SwfdecAsObject *object, + guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) +{ + if (cx->version == 5) { + swfdec_as_string_split_5 (cx, object, argc, argv, ret); + } else { + swfdec_as_string_split_6 (cx, object, argc, argv, ret); + } +} + static const char * swfdec_as_str_sub (SwfdecAsContext *cx, const char *str, guint offset, guint len) { @@ -413,15 +432,16 @@ swfdec_as_str_sub (SwfdecAsContext *cx, return str; } -static void +SWFDEC_AS_NATIVE (251, 13, swfdec_as_string_substr) +void swfdec_as_string_substr (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); int from, to, len; from = swfdec_as_value_to_integer (cx, &argv[0]); - len = g_utf8_strlen (string->string, -1); + len = g_utf8_strlen (string, -1); if (argc > 1) { to = swfdec_as_value_to_integer (cx, &argv[1]); @@ -443,17 +463,18 @@ swfdec_as_string_substr (SwfdecAsContext from += len; from = CLAMP (from, 0, len); to = CLAMP (to, 0, len - from); - SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_str_sub (cx, string->string, from, to)); + SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_str_sub (cx, string, from, to)); } -static void +SWFDEC_AS_NATIVE (251, 11, swfdec_as_string_substring) +void swfdec_as_string_substring (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); int from, to, len; - len = g_utf8_strlen (string->string, -1); + len = g_utf8_strlen (string, -1); from = swfdec_as_value_to_integer (cx, &argv[0]); if (argc > 1) { to = swfdec_as_value_to_integer (cx, &argv[1]); @@ -471,29 +492,31 @@ swfdec_as_string_substring (SwfdecAsCont to = from; from = tmp; } - SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_str_sub (cx, string->string, from, to - from)); + SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_str_sub (cx, string, from, to - from)); } -static void +SWFDEC_AS_NATIVE (251, 4, swfdec_as_string_toLowerCase) +void swfdec_as_string_toLowerCase (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); char *s; - s = g_utf8_strdown (string->string, -1); + s = g_utf8_strdown (string, -1); SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_get_string (cx, s)); g_free (s); } -static void +SWFDEC_AS_NATIVE (251, 3, swfdec_as_string_toUpperCase) +void swfdec_as_string_toUpperCase (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - SwfdecAsString *string = SWFDEC_AS_STRING (object); + const char *string = swfdec_as_object_to_string (cx, object); char *s; - s = g_utf8_strup (string->string, -1); + s = g_utf8_strup (string, -1); SWFDEC_AS_VALUE_SET_STRING (ret, swfdec_as_context_get_string (cx, s)); g_free (s); } @@ -748,21 +771,17 @@ swfdec_as_string_init_context (SwfdecAsC SWFDEC_AS_VALUE_SET_OBJECT (&val, string); 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_charAt, SWFDEC_TYPE_AS_STRING, swfdec_as_string_charAt, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_indexOf, SWFDEC_TYPE_AS_STRING, swfdec_as_string_indexOf, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_lastIndexOf, SWFDEC_TYPE_AS_STRING, swfdec_as_string_lastIndexOf, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_charCodeAt, SWFDEC_TYPE_AS_STRING, swfdec_as_string_charCodeAt, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_substr, SWFDEC_TYPE_AS_STRING, swfdec_as_string_substr, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_substring, SWFDEC_TYPE_AS_STRING, swfdec_as_string_substring, 1); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toLowerCase, SWFDEC_TYPE_AS_STRING, swfdec_as_string_toLowerCase, 0); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_charAt, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_charAt, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_indexOf, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_indexOf, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_lastIndexOf, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_lastIndexOf, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_charCodeAt, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_charCodeAt, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_substr, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_substr, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_substring, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_substring, 1); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toLowerCase, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_toLowerCase, 0); swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toString, SWFDEC_TYPE_AS_STRING, swfdec_as_string_toString, 0); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toUpperCase, SWFDEC_TYPE_AS_STRING, swfdec_as_string_toUpperCase, 0); + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_toUpperCase, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_toUpperCase, 0); swfdec_as_object_add_function (proto, SWFDEC_AS_STR_valueOf, SWFDEC_TYPE_AS_STRING, swfdec_as_string_valueOf, 0); - if (context->version < 6) { - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_split, SWFDEC_TYPE_AS_STRING, swfdec_as_string_split_5, 1); - } else { - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_split, SWFDEC_TYPE_AS_STRING, swfdec_as_string_split, 1); - } + swfdec_as_object_add_function (proto, SWFDEC_AS_STR_split, SWFDEC_TYPE_AS_OBJECT, swfdec_as_string_split, 1); SWFDEC_AS_VALUE_SET_OBJECT (&val, context->Object_prototype); swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR___proto__, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); diff-tree 6360caf2cc3bd3b3b576b3cd36320108aa15e5b5 (from 728258ea82c104389bddb4730402eeac931e3a14) Author: Pekka Lampila <pekka.lampila at iki.fi> Date: Fri Aug 24 10:38:56 2007 +0300 Add a FIXME about unimplemented ASSetPropFlags feature (creating length prop) diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index ccb6a3c..b1b8efc 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -1120,6 +1120,13 @@ swfdec_as_context_ASSetPropFlags (Swfdec obj = SWFDEC_AS_VALUE_GET_OBJECT (&argv[0]); flags[0] = swfdec_as_value_to_integer (cx, &argv[2]); flags[1] = (argc > 3) ? swfdec_as_value_to_integer (cx, &argv[3]) : 0; + + if (flags[0] == 0 && flags[1] == 0) { + // we should add autosizing length attribute here + SWFDEC_FIXME ("ASSetPropFlags to set special length attribute not implemented"); + return; + } + if (SWFDEC_AS_VALUE_IS_NULL (&argv[1])) { swfdec_as_object_foreach (obj, swfdec_as_context_ASSetPropFlags_foreach, flags); } else {
Reasonably Related Threads
- Branch 'as' - 3 commits - libswfdec/swfdec_as_string.c libswfdec/swfdec_as_strings.c test/trace
- libswfdec/swfdec_as_array.c libswfdec/swfdec_as_string.c
- Branch 'as' - 3 commits - libswfdec/swfdec_as_array.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_math.c libswfdec/swfdec_as_native_function.c libswfdec/swfdec_as_number.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_string.c
- Branch 'as' - 13 commits - libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_object.h
- Branch 'as' - 14 commits - libswfdec-gtk/swfdec_playback_alsa.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h