Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: tools/js2c.py

Issue 175009: Fix an assert in the parser that fails if extensions code using 'eval'... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # 2 #
3 # Copyright 2006-2008 the V8 project authors. All rights reserved. 3 # Copyright 2006-2008 the V8 project authors. All rights reserved.
4 # Redistribution and use in source and binary forms, with or without 4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions are 5 # modification, are permitted provided that the following conditions are
6 # met: 6 # met:
7 # 7 #
8 # * Redistributions of source code must retain the above copyright 8 # * Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer. 9 # notice, this list of conditions and the following disclaimer.
10 # * Redistributions in binary form must reproduce the above 10 # * Redistributions in binary form must reproduce the above
(...skipping 27 matching lines...) Expand all
38 def ToCArray(lines): 38 def ToCArray(lines):
39 result = [] 39 result = []
40 for chr in lines: 40 for chr in lines:
41 value = ord(chr) 41 value = ord(chr)
42 assert value < 128 42 assert value < 128
43 result.append(str(value)) 43 result.append(str(value))
44 result.append("0") 44 result.append("0")
45 return ", ".join(result) 45 return ", ".join(result)
46 46
47 47
48 def RemoveCommentsAndTrailingWhitespace(lines):
49 lines = re.sub(r'//.*\n', '\n', lines) # end-of-line comments
50 lines = re.sub(re.compile(r'/\*.*?\*/', re.DOTALL), '', lines) # comments.
51 lines = re.sub(r'\s+\n+', '\n', lines) # trailing whitespace
52 return lines
53
54
48 def CompressScript(lines, do_jsmin): 55 def CompressScript(lines, do_jsmin):
49 # If we're not expecting this code to be user visible, we can run it through 56 # If we're not expecting this code to be user visible, we can run it through
50 # a more aggressive minifier. 57 # a more aggressive minifier.
51 if do_jsmin: 58 if do_jsmin:
52 return jsmin.jsmin(lines) 59 return jsmin.jsmin(lines)
53 60
54 # Remove stuff from the source that we don't want to appear when 61 # Remove stuff from the source that we don't want to appear when
55 # people print the source code using Function.prototype.toString(). 62 # people print the source code using Function.prototype.toString().
56 # Note that we could easily compress the scripts mode but don't 63 # Note that we could easily compress the scripts mode but don't
57 # since we want it to remain readable. 64 # since we want it to remain readable.
58 lines = re.sub('//.*\n', '\n', lines) # end-of-line comments 65 lines = RemoveCommentsAndTrailingWhitespace(lines)
59 lines = re.sub(re.compile(r'/\*.*?\*/', re.DOTALL), '', lines) # comments.
60 lines = re.sub('\s+\n+', '\n', lines) # trailing whitespace
61 return lines 66 return lines
62 67
63 68
64 def ReadFile(filename): 69 def ReadFile(filename):
65 file = open(filename, "rt") 70 file = open(filename, "rt")
66 try: 71 try:
67 lines = file.read() 72 lines = file.read()
68 finally: 73 finally:
69 file.close() 74 file.close()
70 return lines 75 return lines
(...skipping 18 matching lines...) Expand all
89 94
90 95
91 def ParseValue(string): 96 def ParseValue(string):
92 string = string.strip() 97 string = string.strip()
93 if string.startswith('[') and string.endswith(']'): 98 if string.startswith('[') and string.endswith(']'):
94 return string.lstrip('[').rstrip(']').split() 99 return string.lstrip('[').rstrip(']').split()
95 else: 100 else:
96 return string 101 return string
97 102
98 103
104 EVAL_PATTERN = re.compile(r'\beval\s*\(');
105 WITH_PATTERN = re.compile(r'\bwith\s*\(');
106
107
108 def Validate(lines, file):
109 lines = RemoveCommentsAndTrailingWhitespace(lines)
110 # Because of simplified context setup, eval and with is not
111 # allowed in the natives files.
112 eval_match = EVAL_PATTERN.search(lines)
113 if eval_match:
114 raise ("Eval disallowed in natives: " + file)
Christian Plesner Hansen 2009/08/31 12:42:45 The formatting operator % should be used for strin
115 with_match = WITH_PATTERN.search(lines)
116 if with_match:
117 raise ("With statements disallowed in natives: " + file)
118
119
99 def ExpandConstants(lines, constants): 120 def ExpandConstants(lines, constants):
100 for key, value in constants.items(): 121 for key, value in constants.items():
101 lines = lines.replace(key, str(value)) 122 lines = lines.replace(key, str(value))
102 return lines 123 return lines
103 124
104 125
105 def ExpandMacros(lines, macros): 126 def ExpandMacros(lines, macros):
106 for name, macro in macros.items(): 127 for name, macro in macros.items():
107 start = lines.find(name + '(', 0) 128 start = lines.find(name + '(', 0)
108 while start != -1: 129 while start != -1:
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 class PythonMacro: 169 class PythonMacro:
149 def __init__(self, args, fun): 170 def __init__(self, args, fun):
150 self.args = args 171 self.args = args
151 self.fun = fun 172 self.fun = fun
152 def expand(self, mapping): 173 def expand(self, mapping):
153 args = [] 174 args = []
154 for arg in self.args: 175 for arg in self.args:
155 args.append(mapping[arg]) 176 args.append(mapping[arg])
156 return str(self.fun(*args)) 177 return str(self.fun(*args))
157 178
158 CONST_PATTERN = re.compile('^const\s+([a-zA-Z0-9_]+)\s*=\s*([^;]*);$') 179 CONST_PATTERN = re.compile(r'^const\s+([a-zA-Z0-9_]+)\s*=\s*([^;]*);$')
159 MACRO_PATTERN = re.compile('^macro\s+([a-zA-Z0-9_]+)\s*\(([^)]*)\)\s*=\s*([^;]*) ;$') 180 MACRO_PATTERN = re.compile(r'^macro\s+([a-zA-Z0-9_]+)\s*\(([^)]*)\)\s*=\s*([^;]* );$')
160 PYTHON_MACRO_PATTERN = re.compile('^python\s+macro\s+([a-zA-Z0-9_]+)\s*\(([^)]*) \)\s*=\s*([^;]*);$') 181 PYTHON_MACRO_PATTERN = re.compile(r'^python\s+macro\s+([a-zA-Z0-9_]+)\s*\(([^)]* )\)\s*=\s*([^;]*);$')
161 182
162 def ReadMacros(lines): 183 def ReadMacros(lines):
163 constants = { } 184 constants = { }
164 macros = { } 185 macros = { }
165 for line in lines: 186 for line in lines:
166 hash = line.find('#') 187 hash = line.find('#')
167 if hash != -1: line = line[:hash] 188 if hash != -1: line = line[:hash]
168 line = line.strip() 189 line = line.strip()
169 if len(line) is 0: continue 190 if len(line) is 0: continue
170 const_match = CONST_PATTERN.match(line) 191 const_match = CONST_PATTERN.match(line)
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 for s in source: 290 for s in source:
270 if 'macros.py' == (os.path.split(str(s))[1]): 291 if 'macros.py' == (os.path.split(str(s))[1]):
271 (consts, macros) = ReadMacros(ReadLines(str(s))) 292 (consts, macros) = ReadMacros(ReadLines(str(s)))
272 else: 293 else:
273 modules.append(s) 294 modules.append(s)
274 295
275 # Build source code lines 296 # Build source code lines
276 source_lines = [ ] 297 source_lines = [ ]
277 source_lines_empty = [] 298 source_lines_empty = []
278 for s in modules: 299 for s in modules:
279 delay = str(s).endswith('-delay.js') 300 delay = str(s).endswith('-delay.js')
Christian Plesner Hansen 2009/08/31 12:42:45 We use str(s) so many places here -- maybe do some
280 lines = ReadFile(str(s)) 301 lines = ReadFile(str(s))
281 do_jsmin = lines.find('// jsminify this file, js2c: jsmin') != -1 302 do_jsmin = lines.find('// jsminify this file, js2c: jsmin') != -1
282 lines = ExpandConstants(lines, consts) 303 lines = ExpandConstants(lines, consts)
283 lines = ExpandMacros(lines, macros) 304 lines = ExpandMacros(lines, macros)
305 Validate(lines, str(s))
284 lines = CompressScript(lines, do_jsmin) 306 lines = CompressScript(lines, do_jsmin)
285 data = ToCArray(lines) 307 data = ToCArray(lines)
286 id = (os.path.split(str(s))[1])[:-3] 308 id = (os.path.split(str(s))[1])[:-3]
287 if delay: id = id[:-6] 309 if delay: id = id[:-6]
288 if delay: 310 if delay:
289 delay_ids.append((id, len(lines))) 311 delay_ids.append((id, len(lines)))
290 else: 312 else:
291 ids.append((id, len(lines))) 313 ids.append((id, len(lines)))
292 source_lines.append(SOURCE_DECLARATION % { 'id': id, 'data': data }) 314 source_lines.append(SOURCE_DECLARATION % { 'id': id, 'data': data })
293 source_lines_empty.append(SOURCE_DECLARATION % { 'id': id, 'data': 0 }) 315 source_lines_empty.append(SOURCE_DECLARATION % { 'id': id, 'data': 0 })
294 316
295 # Build delay support functions 317 # Build delay support functions
296 get_index_cases = [ ] 318 get_index_cases = [ ]
297 get_script_source_cases = [ ] 319 get_script_source_cases = [ ]
298 get_script_name_cases = [ ] 320 get_script_name_cases = [ ]
299 321
300 i = 0 322 i = 0
301 for (id, length) in delay_ids: 323 for (id, length) in delay_ids:
302 native_name = "native %s.js" % id 324 native_name = "native %s.js" % id
303 get_index_cases.append(GET_DELAY_INDEX_CASE % { 'id': id, 'i': i }) 325 get_index_cases.append(GET_DELAY_INDEX_CASE % { 'id': id, 'i': i })
304 get_script_source_cases.append(GET_DELAY_SCRIPT_SOURCE_CASE % { 326 get_script_source_cases.append(GET_DELAY_SCRIPT_SOURCE_CASE % {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 378
357 def main(): 379 def main():
358 natives = sys.argv[1] 380 natives = sys.argv[1]
359 natives_empty = sys.argv[2] 381 natives_empty = sys.argv[2]
360 type = sys.argv[3] 382 type = sys.argv[3]
361 source_files = sys.argv[4:] 383 source_files = sys.argv[4:]
362 JS2C(source_files, [natives, natives_empty], { 'TYPE': type }) 384 JS2C(source_files, [natives, natives_empty], { 'TYPE': type })
363 385
364 if __name__ == "__main__": 386 if __name__ == "__main__":
365 main() 387 main()
OLDNEW
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698