OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 """This module provides shared functionality for the system to generate | 6 """This module provides shared functionality for the system to generate |
7 Dart:html APIs from the IDL database.""" | 7 Dart:html APIs from the IDL database.""" |
8 | 8 |
9 from systemfrog import * | 9 from systemfrog import * |
10 from systeminterface import * | 10 from systeminterface import * |
(...skipping 1304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1315 | 1315 |
1316 factory_provider = '_' + interface_name + 'FactoryProvider' | 1316 factory_provider = '_' + interface_name + 'FactoryProvider' |
1317 emitter = self._system._ImplFileEmitter(factory_provider) | 1317 emitter = self._system._ImplFileEmitter(factory_provider) |
1318 emitter.Emit( | 1318 emitter.Emit( |
1319 template, | 1319 template, |
1320 FACTORYPROVIDER=factory_provider, | 1320 FACTORYPROVIDER=factory_provider, |
1321 CONSTRUCTOR=interface_name, | 1321 CONSTRUCTOR=interface_name, |
1322 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), | 1322 PARAMETERS=constructor_info.ParametersImplementationDeclaration(), |
1323 NAMED_CONSTRUCTOR=constructor_info.name or interface_name, | 1323 NAMED_CONSTRUCTOR=constructor_info.name or interface_name, |
1324 ARGUMENTS=self._UnwrappedParameters(constructor_info, | 1324 ARGUMENTS=self._UnwrappedParameters(constructor_info, |
1325 len(constructor_info.arg_infos))) | 1325 len(constructor_info.param_infos))) |
1326 | 1326 |
1327 def _UnwrappedParameters(self, operation_info, length): | 1327 def _UnwrappedParameters(self, operation_info, length): |
1328 """Returns string for an argument list that unwraps first |length| | 1328 """Returns string for an argument list that unwraps first |length| |
1329 parameters.""" | 1329 parameters.""" |
1330 def UnwrapArgInfo(arg_info): | 1330 def UnwrapParamInfo(param_info): |
1331 (name, type, value) = arg_info | |
1332 # TODO(sra): Type dependent unwrapping. | 1331 # TODO(sra): Type dependent unwrapping. |
1333 return '_unwrap(%s)' % name | 1332 return '_unwrap(%s)' % param_info.name |
1334 | 1333 |
1335 return ', '.join(map(UnwrapArgInfo, operation_info.arg_infos[:length])) | 1334 return ', '.join(map(UnwrapParamInfo, operation_info.param_infos[:length])) |
1336 | 1335 |
1337 def _BaseClassName(self, interface): | 1336 def _BaseClassName(self, interface): |
1338 if not interface.parents: | 1337 if not interface.parents: |
1339 return '_DOMTypeBase' | 1338 return '_DOMTypeBase' |
1340 | 1339 |
1341 supertype = DartType(interface.parents[0].type.id) | 1340 supertype = DartType(interface.parents[0].type.id) |
1342 | 1341 |
1343 if IsDartListType(supertype) or IsDartCollectionType(supertype): | 1342 if IsDartListType(supertype) or IsDartCollectionType(supertype): |
1344 return 'DOMWrapperBase' | 1343 return 'DOMWrapperBase' |
1345 | 1344 |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1607 Returns True if the dispatch can fall through on failure, False if the code | 1606 Returns True if the dispatch can fall through on failure, False if the code |
1608 always dispatches. | 1607 always dispatches. |
1609 """ | 1608 """ |
1610 | 1609 |
1611 def NullCheck(name): | 1610 def NullCheck(name): |
1612 return '%s === null' % name | 1611 return '%s === null' % name |
1613 | 1612 |
1614 def TypeCheck(name, type): | 1613 def TypeCheck(name, type): |
1615 return '%s is %s' % (name, type) | 1614 return '%s is %s' % (name, type) |
1616 | 1615 |
1617 if position == len(info.arg_infos): | 1616 if position == len(info.param_infos): |
1618 if len(overloads) > 1: | 1617 if len(overloads) > 1: |
1619 raise Exception('Duplicate operations ' + str(overloads)) | 1618 raise Exception('Duplicate operations ' + str(overloads)) |
1620 operation = overloads[0] | 1619 operation = overloads[0] |
1621 self.GenerateSingleOperation(emitter, info, indent, operation) | 1620 self.GenerateSingleOperation(emitter, info, indent, operation) |
1622 return False | 1621 return False |
1623 | 1622 |
1624 # FIXME: Consider a simpler dispatch that iterates over the | 1623 # FIXME: Consider a simpler dispatch that iterates over the |
1625 # overloads and generates an overload specific check. Revisit | 1624 # overloads and generates an overload specific check. Revisit |
1626 # when we move to named optional arguments. | 1625 # when we move to named optional arguments. |
1627 | 1626 |
1628 # Partition the overloads to divide and conquer on the dispatch. | 1627 # Partition the overloads to divide and conquer on the dispatch. |
1629 positive = [] | 1628 positive = [] |
1630 negative = [] | 1629 negative = [] |
1631 first_overload = overloads[0] | 1630 first_overload = overloads[0] |
1632 (param_name, param_type, param_default) = info.arg_infos[position] | 1631 param = info.param_infos[position] |
1633 | 1632 |
1634 if position < len(first_overload.arguments): | 1633 if position < len(first_overload.arguments): |
1635 # FIXME: This will not work if the second overload has a more | 1634 # FIXME: This will not work if the second overload has a more |
1636 # precise type than the first. E.g., | 1635 # precise type than the first. E.g., |
1637 # void foo(Node x); | 1636 # void foo(Node x); |
1638 # void foo(Element x); | 1637 # void foo(Element x); |
1639 type = DartType(first_overload.arguments[position].type.id) | 1638 type = DartType(first_overload.arguments[position].type.id) |
1640 test = TypeCheck(param_name, type) | 1639 test = TypeCheck(param.name, type) |
1641 pred = lambda op: (len(op.arguments) > position and | 1640 pred = lambda op: (len(op.arguments) > position and |
1642 DartType(op.arguments[position].type.id) == type) | 1641 DartType(op.arguments[position].type.id) == type) |
1643 else: | 1642 else: |
1644 type = None | 1643 type = None |
1645 test = NullCheck(param_name) | 1644 test = NullCheck(param.name) |
1646 pred = lambda op: position >= len(op.arguments) | 1645 pred = lambda op: position >= len(op.arguments) |
1647 | 1646 |
1648 for overload in overloads: | 1647 for overload in overloads: |
1649 if pred(overload): | 1648 if pred(overload): |
1650 positive.append(overload) | 1649 positive.append(overload) |
1651 else: | 1650 else: |
1652 negative.append(overload) | 1651 negative.append(overload) |
1653 | 1652 |
1654 if positive and negative: | 1653 if positive and negative: |
1655 (true_code, false_code) = emitter.Emit( | 1654 (true_code, false_code) = emitter.Emit( |
(...skipping 11 matching lines...) Expand all Loading... |
1667 | 1666 |
1668 if negative: | 1667 if negative: |
1669 raise Exception('Internal error, must be all positive') | 1668 raise Exception('Internal error, must be all positive') |
1670 | 1669 |
1671 # All overloads require the same test. Do we bother? | 1670 # All overloads require the same test. Do we bother? |
1672 | 1671 |
1673 # If the test is the same as the method's formal parameter then checked mode | 1672 # If the test is the same as the method's formal parameter then checked mode |
1674 # will have done the test already. (It could be null too but we ignore that | 1673 # will have done the test already. (It could be null too but we ignore that |
1675 # case since all the overload behave the same and we don't know which types | 1674 # case since all the overload behave the same and we don't know which types |
1676 # in the IDL are not nullable.) | 1675 # in the IDL are not nullable.) |
1677 if type == param_type: | 1676 if type == param.dart_type: |
1678 return self.GenerateDispatch( | 1677 return self.GenerateDispatch( |
1679 emitter, info, indent, position + 1, positive) | 1678 emitter, info, indent, position + 1, positive) |
1680 | 1679 |
1681 # Otherwise the overloads have the same type but the type is a substype of | 1680 # Otherwise the overloads have the same type but the type is a substype of |
1682 # the method's synthesized formal parameter. e.g we have overloads f(X) and | 1681 # the method's synthesized formal parameter. e.g we have overloads f(X) and |
1683 # f(Y), implemented by the synthesized method f(Z) where X<Z and Y<Z. The | 1682 # f(Y), implemented by the synthesized method f(Z) where X<Z and Y<Z. The |
1684 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee | 1683 # dispatch has removed f(X), leaving only f(Y), but there is no guarantee |
1685 # that Y = Z-X, so we need to check for Y. | 1684 # that Y = Z-X, so we need to check for Y. |
1686 true_code = emitter.Emit( | 1685 true_code = emitter.Emit( |
1687 '$(INDENT)if ($COND) {\n' | 1686 '$(INDENT)if ($COND) {\n' |
1688 '$!TRUE' | 1687 '$!TRUE' |
1689 '$(INDENT)}\n', | 1688 '$(INDENT)}\n', |
1690 COND=test, INDENT=indent) | 1689 COND=test, INDENT=indent) |
1691 self.GenerateDispatch( | 1690 self.GenerateDispatch( |
1692 true_code, info, indent + ' ', position + 1, positive) | 1691 true_code, info, indent + ' ', position + 1, positive) |
1693 return True | 1692 return True |
OLD | NEW |