From 558290d2b54b6fa9d1319a3cbc4a6463d390a060 Mon Sep 17 00:00:00 2001 From: sulyi Date: Mon, 12 Dec 2016 17:23:52 +0100 Subject: [PATCH] [jsinterp] Adding object ast to parser test --- test/test_jsinterp_parser.py | 48 +++++++++++++++++++++++++++++--- youtube_dl/jsinterp/jsgrammar.py | 2 +- youtube_dl/jsinterp/jsinterp.py | 5 ++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/test/test_jsinterp_parser.py b/test/test_jsinterp_parser.py index 71c8ce161..85987d531 100644 --- a/test/test_jsinterp_parser.py +++ b/test/test_jsinterp_parser.py @@ -732,7 +732,6 @@ class TestJSInterpreterParser(unittest.TestCase): self.assertEqual(list(jsi.statements()), ast) def test_switch(self): - # ASAP switch statement test jsi = JSInterpreter( ''' function a(x) { @@ -898,7 +897,6 @@ class TestJSInterpreterParser(unittest.TestCase): ast = [] self.assertEqual(list(jsi.statements()), ast) - @unittest.skip('Test not yet implemented: missing ast') def test_object(self): # ASAP object literal test jsi = JSInterpreter(''' @@ -911,8 +909,50 @@ class TestJSInterpreterParser(unittest.TestCase): return o; } ''') - ast = [] - self.assertEqual(list(jsi.statements()), ast) + ast = [ + (Token.FUNC, 'f', [], + (Token.BLOCK, [ + (Token.VAR, + zip(['o'], + [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.OBJECT, [ + ('a', (Token.PROPVALUE, (Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.INT, 7), None, None) + ]), None))), + ('b', (Token.PROPGET, (Token.BLOCK, [ + (Token.RETURN, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.RSV, 'this'), None, (Token.FIELD, 'a', None)), + (Token.MEMBER, (Token.INT, 1), None, None), + (Token.OP, _OPERATORS['+'][1]) + ]), None)])) + ]))), + ('c', (Token.PROPSET, 'x', (Token.BLOCK, [ + (Token.EXPR, [ + (Token.ASSIGN, + _ASSIGN_OPERATORS['='][1], + (Token.OPEXPR, [ + (Token.MEMBER, (Token.RSV, 'this'), None, (Token.FIELD, 'a', None)) + ]), + + (Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.ID, 'x'), None, None), + (Token.MEMBER, (Token.INT, 2), None, None), + (Token.OP, _OPERATORS['/'][1]) + ]), None)) + ]) + ]))) + + ]), + None, None) + ]), None)] + ) + ), + (Token.RETURN, (Token.EXPR, [(Token.ASSIGN, None, (Token.OPEXPR, [ + (Token.MEMBER, (Token.ID, 'o'), None, None)]), None)])) + ])) + ] + result = list(jsi.statements()) + self.assertEqual(list(traverse(result)), list(traverse(ast))) @unittest.skip('Test not yet implemented: missing code and ast') def test_try(self): diff --git a/youtube_dl/jsinterp/jsgrammar.py b/youtube_dl/jsinterp/jsgrammar.py index 87cba7869..262b5ca6b 100644 --- a/youtube_dl/jsinterp/jsgrammar.py +++ b/youtube_dl/jsinterp/jsgrammar.py @@ -11,7 +11,7 @@ _token_keys = ('COPEN', 'CCLOSE', 'POPEN', 'PCLOSE', 'SOPEN', 'SCLOSE', 'BOR', 'BXOR', 'BAND', 'RSHIFT', 'LSHIFT', 'URSHIFT', 'SUB', 'ADD', 'MOD', 'DIV', 'MUL', 'OP', 'AOP', 'UOP', 'LOP', 'REL', 'COMMENT', 'TOKEN', 'PUNCT', - 'NULL', 'BOOL', 'ID', 'STR', 'INT', 'FLOAT', 'REGEX', + 'NULL', 'BOOL', 'ID', 'STR', 'INT', 'FLOAT', 'REGEX', 'OBJECT', 'REFLAGS', 'REBODY', 'FUNC', 'BLOCK', 'VAR', 'EXPR', 'IF', 'ITER', 'CONTINUE', 'BREAK', 'RETURN', 'WITH', 'LABEL', 'SWITCH', diff --git a/youtube_dl/jsinterp/jsinterp.py b/youtube_dl/jsinterp/jsinterp.py index 79726540e..d0e6f2ced 100644 --- a/youtube_dl/jsinterp/jsinterp.py +++ b/youtube_dl/jsinterp/jsinterp.py @@ -516,9 +516,10 @@ class JSInterpreter(object): property_list = [] while True: token_id, token_value, token_pos = token_stream.pop() - if token_id.CCLOSE: - token_stream.pop() + if token_id is Token.CCLOSE: break + elif token_id is Token.COMMA: + continue # ASAP refactor elif token_value == 'get': token_id, token_value, token_pos = token_stream.pop()