summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPhilipp Hagemeister <[email protected]>2014-11-17 05:03:46 +0100
committerPhilipp Hagemeister <[email protected]>2014-11-17 05:03:46 +0100
commit33a266f4bae7b53ad12bd79293bcc1f11ae6d407 (patch)
treeea91d78e28a75d037bc2f2700d266949700dbe5b
parent6b592d93a29163664d3125761fbf6d7c9fe5f56c (diff)
downloadyoutube-dl-33a266f4bae7b53ad12bd79293bcc1f11ae6d407.tar.gz
youtube-dl-33a266f4bae7b53ad12bd79293bcc1f11ae6d407.zip
[swfinterp] Implement charCodeAt
-rw-r--r--test/swftests/StringCharCodeAt.as11
-rw-r--r--youtube_dl/swfinterp.py26
2 files changed, 36 insertions, 1 deletions
diff --git a/test/swftests/StringCharCodeAt.as b/test/swftests/StringCharCodeAt.as
new file mode 100644
index 000000000..c20d74d65
--- /dev/null
+++ b/test/swftests/StringCharCodeAt.as
@@ -0,0 +1,11 @@
+// input: []
+// output: 9897
+
+package {
+public class StringCharCodeAt {
+ public static function main():int{
+ var s:String = "abc";
+ return s.charCodeAt(1) * 100 + s.charCodeAt();
+ }
+}
+}
diff --git a/youtube_dl/swfinterp.py b/youtube_dl/swfinterp.py
index 4b47df29d..7369c94fc 100644
--- a/youtube_dl/swfinterp.py
+++ b/youtube_dl/swfinterp.py
@@ -411,7 +411,9 @@ class SWFInterpreter(object):
self._classes_by_name, avm_class.variables])
while True:
opcode = _read_byte(coder)
- if opcode == 16: # jump
+ if opcode == 9: # label
+ pass # Spec says: "Do nothing."
+ elif opcode == 16: # jump
offset = s24()
coder.seek(coder.tell() + offset)
elif opcode == 17: # iftrue
@@ -436,6 +438,12 @@ class SWFInterpreter(object):
value1 = stack.pop()
if value2 != value1:
coder.seek(coder.tell() + offset)
+ elif opcode == 21: # iflt
+ offset = s24()
+ value2 = stack.pop()
+ value1 = stack.pop()
+ if value1 < value2:
+ coder.seek(coder.tell() + offset)
elif opcode == 32: # pushnull
stack.append(None)
elif opcode == 33: # pushundefined
@@ -516,6 +524,13 @@ class SWFInterpreter(object):
res = obj.split(args[0])
stack.append(res)
continue
+ elif mname == 'charCodeAt':
+ assert len(args) <= 1
+ idx = 0 if len(args) == 0 else args[0]
+ assert isinstance(idx, int)
+ res = ord(obj[idx])
+ stack.append(res)
+ continue
elif isinstance(obj, list):
if mname == 'slice':
assert len(args) == 1
@@ -687,6 +702,11 @@ class SWFInterpreter(object):
value1 = stack.pop()
res = value1 - value2
stack.append(res)
+ elif opcode == 162: # multiply
+ value2 = stack.pop()
+ value1 = stack.pop()
+ res = value1 * value2
+ stack.append(res)
elif opcode == 164: # modulo
value2 = stack.pop()
value1 = stack.pop()
@@ -702,6 +722,10 @@ class SWFInterpreter(object):
value1 = stack.pop()
result = value1 >= value2
stack.append(result)
+ elif opcode == 192: # increment_i
+ value = stack.pop()
+ assert isinstance(value, int)
+ stack.append(value + 1)
elif opcode == 208: # getlocal_0
stack.append(registers[0])
elif opcode == 209: # getlocal_1