From 37d63066dd745595eab3b1b05076ce9b3538de7b Mon Sep 17 00:00:00 2001 From: sulyi Date: Sun, 10 Jun 2018 06:01:51 +0200 Subject: [PATCH] [jsinterp] Adding `JSArrayPrototype#_slice` --- youtube_dl/jsinterp2/jsbuilt_ins/jsarray.py | 13 ++++++++++--- youtube_dl/jsinterp2/jsinterp.py | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/youtube_dl/jsinterp2/jsbuilt_ins/jsarray.py b/youtube_dl/jsinterp2/jsbuilt_ins/jsarray.py index 1fb0c2e37..d1a52cd86 100644 --- a/youtube_dl/jsinterp2/jsbuilt_ins/jsarray.py +++ b/youtube_dl/jsinterp2/jsbuilt_ins/jsarray.py @@ -59,11 +59,18 @@ class JSArrayPrototype(JSObjectPrototype): def _slice(self, start, end=None): from .utils import to_js - length = to_uint32(to_js(len(self.value))) - start = to_integer(to_js(start)) - end = length if end is undefined else to_integer(to_js(end)) + start = to_js(start) + end = to_js(end) + length = to_js(len(self.value)) + + length = to_uint32(length) + start = to_integer(start) + end = length if end is undefined else to_integer(end) + start = min(start, length) if start > 0 else max(length + start, 0) + # TODO add jstest for it + return self.value[start:end] def _sort(self, cmp): diff --git a/youtube_dl/jsinterp2/jsinterp.py b/youtube_dl/jsinterp2/jsinterp.py index 3c7654655..994c900ce 100644 --- a/youtube_dl/jsinterp2/jsinterp.py +++ b/youtube_dl/jsinterp2/jsinterp.py @@ -241,9 +241,16 @@ class JSInterpreter(object): elif name is Token.ID: # XXX error handling (unknown id) - ref = (self.this[expr[1]] if expr[1] in self.this else - self.global_vars[expr[1]]) - + id = expr[1] + try: + ref = (self.this[id] if id in self.this else + self.global_vars[id]) + except KeyError: + try: + ref = Reference(self.extract_object(id)) + except AttributeError: + ref = Reference(self.extract_function(id)) + # literal elif name in token_keys: ref = Reference(expr[1])