mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[jsinterp] Fix nested attributes and object extraction (#12760)
Authored by: bashonly, seproDev Co-authored-by: sepro <sepro@sepr0.com>
This commit is contained in:
		| @@ -188,6 +188,7 @@ _COMP_OPERATORS = {'===', '!==', '==', '!=', '<=', '>=', '<', '>'} | ||||
| _NAME_RE = r'[a-zA-Z_$][\w$]*' | ||||
| _MATCHING_PARENS = dict(zip(*zip('()', '{}', '[]'))) | ||||
| _QUOTES = '\'"/' | ||||
| _NESTED_BRACKETS = r'[^[\]]+(?:\[[^[\]]+(?:\[[^\]]+\])?\])?' | ||||
| 
 | ||||
| 
 | ||||
| class JS_Undefined: | ||||
| @@ -606,15 +607,18 @@ class JSInterpreter: | ||||
| 
 | ||||
|         m = re.match(fr'''(?x) | ||||
|             (?P<assign> | ||||
|                 (?P<out>{_NAME_RE})(?:\[(?P<index>[^\]]+?)\])?\s* | ||||
|                 (?P<out>{_NAME_RE})(?:\[(?P<index>{_NESTED_BRACKETS})\])?\s* | ||||
|                 (?P<op>{"|".join(map(re.escape, set(_OPERATORS) - _COMP_OPERATORS))})? | ||||
|                 =(?!=)(?P<expr>.*)$ | ||||
|             )|(?P<return> | ||||
|                 (?!if|return|true|false|null|undefined|NaN)(?P<name>{_NAME_RE})$ | ||||
|             )|(?P<attribute> | ||||
|                 (?P<var>{_NAME_RE})(?: | ||||
|                     (?P<nullish>\?)?\.(?P<member>[^(]+)| | ||||
|                     \[(?P<member2>{_NESTED_BRACKETS})\] | ||||
|                 )\s* | ||||
|             )|(?P<indexing> | ||||
|                 (?P<in>{_NAME_RE})\[(?P<idx>.+)\]$ | ||||
|             )|(?P<attribute> | ||||
|                 (?P<var>{_NAME_RE})(?:(?P<nullish>\?)?\.(?P<member>[^(]+)|\[(?P<member2>[^\]]+)\])\s* | ||||
|             )|(?P<function> | ||||
|                 (?P<fname>{_NAME_RE})\((?P<args>.*)\)$ | ||||
|             )''', expr) | ||||
| @@ -707,7 +711,7 @@ class JSInterpreter: | ||||
|                 if obj is NO_DEFAULT: | ||||
|                     if variable not in self._objects: | ||||
|                         try: | ||||
|                             self._objects[variable] = self.extract_object(variable) | ||||
|                             self._objects[variable] = self.extract_object(variable, local_vars) | ||||
|                         except self.Exception: | ||||
|                             if not nullish: | ||||
|                                 raise | ||||
| @@ -847,7 +851,7 @@ class JSInterpreter: | ||||
|             raise self.Exception('Cannot return from an expression', expr) | ||||
|         return ret | ||||
| 
 | ||||
|     def extract_object(self, objname): | ||||
|     def extract_object(self, objname, *global_stack): | ||||
|         _FUNC_NAME_RE = r'''(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')''' | ||||
|         obj = {} | ||||
|         obj_m = re.search( | ||||
| @@ -869,7 +873,8 @@ class JSInterpreter: | ||||
|         for f in fields_m: | ||||
|             argnames = f.group('args').split(',') | ||||
|             name = remove_quotes(f.group('key')) | ||||
|             obj[name] = function_with_repr(self.build_function(argnames, f.group('code')), f'F<{name}>') | ||||
|             obj[name] = function_with_repr( | ||||
|                 self.build_function(argnames, f.group('code'), *global_stack), f'F<{name}>') | ||||
| 
 | ||||
|         return obj | ||||
| 
 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 bashonly
					bashonly