| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 the V8 project authors. All rights reserved. | 2 # Copyright 2014 the V8 project authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import itertools | 6 import itertools |
| 7 import js2c | 7 import js2c |
| 8 import multiprocessing | 8 import multiprocessing |
| 9 import optparse | 9 import optparse |
| 10 import os | 10 import os |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 # TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION | 44 # TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION |
| 45 | 45 |
| 46 # Counts of functions in each detection state. These are used to assert | 46 # Counts of functions in each detection state. These are used to assert |
| 47 # that the parser doesn't bit-rot. Change the values as needed when you add, | 47 # that the parser doesn't bit-rot. Change the values as needed when you add, |
| 48 # remove or change runtime functions, but make sure we don't lose our ability | 48 # remove or change runtime functions, but make sure we don't lose our ability |
| 49 # to parse them! | 49 # to parse them! |
| 50 EXPECTED_FUNCTION_COUNT = 358 | 50 EXPECTED_FUNCTION_COUNT = 358 |
| 51 EXPECTED_FUZZABLE_COUNT = 325 | 51 EXPECTED_FUZZABLE_COUNT = 325 |
| 52 EXPECTED_CCTEST_COUNT = 6 | 52 EXPECTED_CCTEST_COUNT = 6 |
| 53 EXPECTED_UNKNOWN_COUNT = 5 | 53 EXPECTED_UNKNOWN_COUNT = 5 |
| 54 EXPECTED_BUILTINS_COUNT = 782 | 54 EXPECTED_BUILTINS_COUNT = 797 |
| 55 | 55 |
| 56 | 56 |
| 57 # Don't call these at all. | 57 # Don't call these at all. |
| 58 BLACKLISTED = [ | 58 BLACKLISTED = [ |
| 59 "Abort", # Kills the process. | 59 "Abort", # Kills the process. |
| 60 "AbortJS", # Kills the process. | 60 "AbortJS", # Kills the process. |
| 61 "CompileForOnStackReplacement", # Riddled with ASSERTs. | 61 "CompileForOnStackReplacement", # Riddled with ASSERTs. |
| 62 "IS_VAR", # Not implemented in the runtime. | 62 "IS_VAR", # Not implemented in the runtime. |
| 63 "ListNatives", # Not available in Release mode. | 63 "ListNatives", # Not available in Release mode. |
| 64 "SetAllocationTimeout", # Too slow for fuzzing. | 64 "SetAllocationTimeout", # Too slow for fuzzing. |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 "InternalNumberFormat": [_NUMBER_FORMAT, None, None], | 152 "InternalNumberFormat": [_NUMBER_FORMAT, None, None], |
| 153 "InternalNumberParse": [_NUMBER_FORMAT, None, None], | 153 "InternalNumberParse": [_NUMBER_FORMAT, None, None], |
| 154 "IsSloppyModeFunction": ["function() {}", None], | 154 "IsSloppyModeFunction": ["function() {}", None], |
| 155 "LoadMutableDouble": ["{foo: 1.2}", None, None], | 155 "LoadMutableDouble": ["{foo: 1.2}", None, None], |
| 156 "NewObjectFromBound": ["(function() {}).bind({})", None], | 156 "NewObjectFromBound": ["(function() {}).bind({})", None], |
| 157 "NumberToRadixString": [None, "2", None], | 157 "NumberToRadixString": [None, "2", None], |
| 158 "ParseJson": ["\"{}\"", 1], | 158 "ParseJson": ["\"{}\"", 1], |
| 159 "RegExpExecMultiple": [None, None, "['a']", "['a']", None], | 159 "RegExpExecMultiple": [None, None, "['a']", "['a']", None], |
| 160 "SetAccessorProperty": [None, None, "undefined", "undefined", None, None, | 160 "SetAccessorProperty": [None, None, "undefined", "undefined", None, None, |
| 161 None], | 161 None], |
| 162 "SetCreateIterator": [None, "2", None], | 162 "SetIteratorInitialize": [None, None, "2", None], |
| 163 "SetDebugEventListener": ["undefined", None, None], | 163 "SetDebugEventListener": ["undefined", None, None], |
| 164 "SetFunctionBreakPoint": [None, 200, None, None], | 164 "SetFunctionBreakPoint": [None, 200, None, None], |
| 165 "StringBuilderConcat": ["[1, 2, 3]", 3, None, None], | 165 "StringBuilderConcat": ["[1, 2, 3]", 3, None, None], |
| 166 "StringBuilderJoin": ["['a', 'b']", 4, None, None], | 166 "StringBuilderJoin": ["['a', 'b']", 4, None, None], |
| 167 "StringMatch": [None, None, "['a', 'b']", None], | 167 "StringMatch": [None, None, "['a', 'b']", None], |
| 168 "StringNormalize": [None, 2, None], | 168 "StringNormalize": [None, 2, None], |
| 169 "StringReplaceGlobalRegExpWithString": [None, None, None, "['a']", None], | 169 "StringReplaceGlobalRegExpWithString": [None, None, None, "['a']", None], |
| 170 "TypedArrayInitialize": [None, 6, "new ArrayBuffer(8)", None, 4, None], | 170 "TypedArrayInitialize": [None, 6, "new ArrayBuffer(8)", None, 4, None], |
| 171 "TypedArrayInitializeFromArrayLike": [None, 6, None, None, None], | 171 "TypedArrayInitializeFromArrayLike": [None, 6, None, None, None], |
| 172 "TypedArraySetFastCases": [None, None, "0", None], | 172 "TypedArraySetFastCases": [None, None, "0", None], |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 result += self._JSObject(key_name, recursion_budget - 1) | 516 result += self._JSObject(key_name, recursion_budget - 1) |
| 517 else: | 517 else: |
| 518 result += self._Object(key_name, recursion_budget - 1) | 518 result += self._Object(key_name, recursion_budget - 1) |
| 519 result += self._Object(value_name, recursion_budget - 1) | 519 result += self._Object(value_name, recursion_budget - 1) |
| 520 result.append("%s.set(%s, %s)" % (name, key_name, value_name)) | 520 result.append("%s.set(%s, %s)" % (name, key_name, value_name)) |
| 521 return result | 521 return result |
| 522 | 522 |
| 523 def _JSMapIterator(self, name, recursion_budget): | 523 def _JSMapIterator(self, name, recursion_budget): |
| 524 map_name = name + "_map" | 524 map_name = name + "_map" |
| 525 result = self._JSMap(map_name, recursion_budget) | 525 result = self._JSMap(map_name, recursion_budget) |
| 526 iterator_type = random.randint(1, 3) | 526 iterator_type = random.choice(['keys', 'values', 'entries']) |
| 527 return (result + self._Variable(name, "%%MapCreateIterator(%s, %d)" % | 527 return (result + self._Variable(name, "%s.%s()" % |
| 528 (map_name, iterator_type))) | 528 (map_name, iterator_type))) |
| 529 | 529 |
| 530 def _JSProxy(self, name, recursion_budget): | 530 def _JSProxy(self, name, recursion_budget): |
| 531 # TODO(jkummerow): Revisit this as the Proxy implementation evolves. | 531 # TODO(jkummerow): Revisit this as the Proxy implementation evolves. |
| 532 return self._Variable(name, "Proxy.create(%s)" % self.PROXY_TRAPS) | 532 return self._Variable(name, "Proxy.create(%s)" % self.PROXY_TRAPS) |
| 533 | 533 |
| 534 def _JSRegExp(self, name, recursion_budget): | 534 def _JSRegExp(self, name, recursion_budget): |
| 535 flags = random.choice(["", "g", "i", "m", "gi"]) | 535 flags = random.choice(["", "g", "i", "m", "gi"]) |
| 536 string = "a(b|c)*a" # TODO(jkummerow): Be more creative here? | 536 string = "a(b|c)*a" # TODO(jkummerow): Be more creative here? |
| 537 ctor = random.choice(["/%s/%s", "new RegExp(\"%s\", \"%s\")"]) | 537 ctor = random.choice(["/%s/%s", "new RegExp(\"%s\", \"%s\")"]) |
| 538 return self._Variable(name, ctor % (string, flags)) | 538 return self._Variable(name, ctor % (string, flags)) |
| 539 | 539 |
| 540 def _JSSet(self, name, recursion_budget, weak=""): | 540 def _JSSet(self, name, recursion_budget, weak=""): |
| 541 result = self._Variable(name, "new %sSet()" % weak) | 541 result = self._Variable(name, "new %sSet()" % weak) |
| 542 num_entries = random.randint(0, 3) | 542 num_entries = random.randint(0, 3) |
| 543 for i in range(num_entries): | 543 for i in range(num_entries): |
| 544 element_name = "%s_e%d" % (name, i) | 544 element_name = "%s_e%d" % (name, i) |
| 545 if weak: | 545 if weak: |
| 546 result += self._JSObject(element_name, recursion_budget - 1) | 546 result += self._JSObject(element_name, recursion_budget - 1) |
| 547 else: | 547 else: |
| 548 result += self._Object(element_name, recursion_budget - 1) | 548 result += self._Object(element_name, recursion_budget - 1) |
| 549 result.append("%s.add(%s)" % (name, element_name)) | 549 result.append("%s.add(%s)" % (name, element_name)) |
| 550 return result | 550 return result |
| 551 | 551 |
| 552 def _JSSetIterator(self, name, recursion_budget): | 552 def _JSSetIterator(self, name, recursion_budget): |
| 553 set_name = name + "_set" | 553 set_name = name + "_set" |
| 554 result = self._JSSet(set_name, recursion_budget) | 554 result = self._JSSet(set_name, recursion_budget) |
| 555 iterator_type = random.randint(2, 3) | 555 iterator_type = random.choice(['values', 'entries']) |
| 556 return (result + self._Variable(name, "%%SetCreateIterator(%s, %d)" % | 556 return (result + self._Variable(name, "%s.%s()" % |
| 557 (set_name, iterator_type))) | 557 (set_name, iterator_type))) |
| 558 | 558 |
| 559 def _JSTypedArray(self, name, recursion_budget): | 559 def _JSTypedArray(self, name, recursion_budget): |
| 560 arraytype = random.choice(["Int8", "Int16", "Int32", "Uint8", "Uint16", | 560 arraytype = random.choice(["Int8", "Int16", "Int32", "Uint8", "Uint16", |
| 561 "Uint32", "Float32", "Float64", "Uint8Clamped"]) | 561 "Uint32", "Float32", "Float64", "Uint8Clamped"]) |
| 562 ctor_type = random.randint(0, 3) | 562 ctor_type = random.randint(0, 3) |
| 563 if ctor_type == 0: | 563 if ctor_type == 0: |
| 564 length = random.randint(0, 1000) | 564 length = random.randint(0, 1000) |
| 565 return self._Variable(name, "new %sArray(%d)" % (arraytype, length), | 565 return self._Variable(name, "new %sArray(%d)" % (arraytype, length), |
| 566 fallback="new %sArray(8)" % arraytype) | 566 fallback="new %sArray(8)" % arraytype) |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 "JSArray": ["new Array()", _JSArray], | 659 "JSArray": ["new Array()", _JSArray], |
| 660 "JSArrayBuffer": ["new ArrayBuffer(8)", _JSArrayBuffer], | 660 "JSArrayBuffer": ["new ArrayBuffer(8)", _JSArrayBuffer], |
| 661 "JSArrayBufferView": ["new Int32Array(2)", _JSArrayBufferView], | 661 "JSArrayBufferView": ["new Int32Array(2)", _JSArrayBufferView], |
| 662 "JSDataView": ["new DataView(new ArrayBuffer(24))", _JSDataView], | 662 "JSDataView": ["new DataView(new ArrayBuffer(24))", _JSDataView], |
| 663 "JSDate": ["new Date()", _JSDate], | 663 "JSDate": ["new Date()", _JSDate], |
| 664 "JSFunction": ["function() {}", _JSFunction], | 664 "JSFunction": ["function() {}", _JSFunction], |
| 665 "JSFunctionProxy": ["Proxy.createFunction({}, function() {})", | 665 "JSFunctionProxy": ["Proxy.createFunction({}, function() {})", |
| 666 _JSFunctionProxy], | 666 _JSFunctionProxy], |
| 667 "JSGeneratorObject": ["(function*(){ yield 1; })()", _JSGeneratorObject], | 667 "JSGeneratorObject": ["(function*(){ yield 1; })()", _JSGeneratorObject], |
| 668 "JSMap": ["new Map()", _JSMap], | 668 "JSMap": ["new Map()", _JSMap], |
| 669 "JSMapIterator": ["%MapCreateIterator(new Map(), 3)", _JSMapIterator], | 669 "JSMapIterator": ["new Map().entries()", _JSMapIterator], |
| 670 "JSObject": ["new Object()", _JSObject], | 670 "JSObject": ["new Object()", _JSObject], |
| 671 "JSProxy": ["Proxy.create({})", _JSProxy], | 671 "JSProxy": ["Proxy.create({})", _JSProxy], |
| 672 "JSReceiver": ["new Object()", _JSReceiver], | 672 "JSReceiver": ["new Object()", _JSReceiver], |
| 673 "JSRegExp": ["/ab/g", _JSRegExp], | 673 "JSRegExp": ["/ab/g", _JSRegExp], |
| 674 "JSSet": ["new Set()", _JSSet], | 674 "JSSet": ["new Set()", _JSSet], |
| 675 "JSSetIterator": ["%SetCreateIterator(new Set(), 2)", _JSSetIterator], | 675 "JSSetIterator": ["new Set().values()", _JSSetIterator], |
| 676 "JSTypedArray": ["new Int32Array(2)", _JSTypedArray], | 676 "JSTypedArray": ["new Int32Array(2)", _JSTypedArray], |
| 677 "JSValue": ["new String('foo')", _JSValue], | 677 "JSValue": ["new String('foo')", _JSValue], |
| 678 "JSWeakCollection": ["new WeakMap()", _JSWeakCollection], | 678 "JSWeakCollection": ["new WeakMap()", _JSWeakCollection], |
| 679 "Name": ["\"name\"", _Name], | 679 "Name": ["\"name\"", _Name], |
| 680 "Number": ["1.5", _Number], | 680 "Number": ["1.5", _Number], |
| 681 "Object": ["new Object()", _Object], | 681 "Object": ["new Object()", _Object], |
| 682 "PropertyDetails": ["513", _PropertyDetails], | 682 "PropertyDetails": ["513", _PropertyDetails], |
| 683 "SeqOneByteString": ["\"seq 1-byte\"", _SeqString], | 683 "SeqOneByteString": ["\"seq 1-byte\"", _SeqString], |
| 684 "SeqString": ["\"seqstring\"", _SeqString], | 684 "SeqString": ["\"seqstring\"", _SeqString], |
| 685 "SeqTwoByteString": ["\"seq \\u2082-byte\"", _SeqTwoByteString], | 685 "SeqTwoByteString": ["\"seq \\u2082-byte\"", _SeqTwoByteString], |
| (...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1314 for i in range(len(processes)): | 1314 for i in range(len(processes)): |
| 1315 processes[i].join() | 1315 processes[i].join() |
| 1316 except KeyboardInterrupt: | 1316 except KeyboardInterrupt: |
| 1317 stop_running.set() | 1317 stop_running.set() |
| 1318 for i in range(len(processes)): | 1318 for i in range(len(processes)): |
| 1319 processes[i].join() | 1319 processes[i].join() |
| 1320 return 0 | 1320 return 0 |
| 1321 | 1321 |
| 1322 if __name__ == "__main__": | 1322 if __name__ == "__main__": |
| 1323 sys.exit(Main()) | 1323 sys.exit(Main()) |
| OLD | NEW |