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

Unified Diff: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart

Issue 14079003: Implement Symbol correctly in dart2js. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
diff --git a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 6e26ddbf4b4549ebfc5b17ec729fdaa717628077..c22388b95db7033c143e2017c03be5a223cbb103 100644
--- a/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/dart/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -545,6 +545,7 @@ class ResolverTask extends CompilerTask {
new ClassResolverVisitor(compiler, element);
visitor.visit(tree);
element.resolutionState = STATE_DONE;
+ compiler.onClassResolved(element);
}));
if (element.isPatched) {
// Ensure handling patch after origin.
@@ -1619,6 +1620,31 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION
| ElementCategory.IMPLIES_TYPE;
+ // TODO(ahe): Find a way to share this with runtime implementation.
+ static final RegExp symbolValidationPattern =
+ new RegExp(r'^(?:[a-zA-Z$][a-zA-Z$0-9_]*\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|'
+ r'-|'
+ r'unary-|'
+ r'\[\]=|'
+ r'~|'
+ r'==|'
+ r'\[\]|'
+ r'\*|'
+ r'/|'
+ r'%|'
+ r'~/|'
+ r'\+|'
+ r'<<|'
+ r'>>|'
+ r'>=|'
+ r'>|'
+ r'<=|'
+ r'<|'
+ r'&|'
+ r'\^|'
+ r'\|'
+ r')$');
+
ResolverVisitor(Compiler compiler, Element element, this.mapping)
: this.enclosingElement = element,
// When the element is a field, we are actually resolving its
@@ -2162,6 +2188,15 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
Element target = resolveSend(node);
sendIsMemberAccess = oldSendIsMemberAccess;
+ if (target != null && target == compiler.mirrorSystemGetNameFunction) {
+ compiler.reportWarningCode(
+ node.selector, MessageKind.GENERIC,
ahe 2013/04/18 11:34:44 Will provide real MessageKind before submitting.
+ {'text': 'Warning: using '
+ '"${compiler.mirrorSystemClass.name.slowToString()}.'
+ '${compiler.mirrorSystemGetNameFunction.name.slowToString()}" '
+ 'will increase the size of compiled code.'});
+ }
+
if (!Elements.isUnresolved(target)) {
if (target.isAbstractField()) {
AbstractFieldElement field = target;
@@ -2411,6 +2446,7 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
}
void handleRedirectingFactoryBody(Return node) {
+ final isSymbolConstructor = enclosingElement == compiler.symbolConstructor;
if (!enclosingElement.isFactoryConstructor()) {
compiler.reportErrorCode(
node, MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY);
@@ -2445,6 +2481,12 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
world.registerStaticUse(redirectionTarget);
world.registerInstantiatedClass(
redirectionTarget.enclosingElement.declaration, mapping);
+ if (isSymbolConstructor) {
+ // Make sure that collection_dev.Symbol.validated is registered.
+ // TODO(ahe): Don't simply use head.
ahe 2013/04/18 11:34:44 Will fix before submitting.
+ world.registerStaticUse(
+ redirectionTarget.enclosingElement.constructors.head);
+ }
}
visitThrow(Throw node) {
@@ -2490,6 +2532,14 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
visitNewExpression(NewExpression node) {
Node selector = node.send.selector;
FunctionElement constructor = resolveConstructor(node);
+ final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
+ if (!node.isConst() && isSymbolConstructor) {
+ String name = compiler.symbolClass.name.slowToString();
+ compiler.reportWarningCode(
+ node.newToken, MessageKind.GENERIC,
ahe 2013/04/18 11:34:44 Will provide real MessageKind before submitting.
+ {'text': 'Warning: using "new $name" will increase the size of '
+ 'compiled code. Use "const $name" if possible.'});
+ }
resolveSelector(node.send);
resolveArguments(node.send.argumentsNode);
useElement(node.send, constructor);
@@ -2532,9 +2582,39 @@ class ResolverVisitor extends CommonResolverVisitor<Element> {
},
includeBackendMembers: false,
includeSuperMembers: true);
+
+ if (node.isConst() && isSymbolConstructor) {
+ Node argumentNode = node.send.arguments.head;
+ Constant name = compiler.metadataHandler.compileNodeWithDefinitions(
+ argumentNode, mapping, isConst: true);
+ if (!name.isString()) {
+ compiler.reportErrorCode(argumentNode, MessageKind.GENERIC,
ahe 2013/04/18 11:34:44 Will provide real MessageKind before submitting.
+ {'text': 'Not a string'});
+ } else {
+ validateSymbol(argumentNode, name.toDartString().slowToString());
+ }
+ }
+
return null;
}
+ void validateSymbol(Node node, String name) {
+ if (name.isEmpty) return;
+ if (name.startsWith('_')) {
+ compiler.reportErrorCode(node, MessageKind.GENERIC,
ahe 2013/04/18 11:34:44 Will provide real MessageKind before submitting.
+ {'text': '"$name" is a private identifier.'});
+ return;
+ }
+ if (!symbolValidationPattern.hasMatch(name)) {
+ // TODO(ahe): Better error message.
+ compiler.reportErrorCode(
+ node, MessageKind.GENERIC,
ahe 2013/04/18 11:34:44 Will provide real MessageKind before submitting.
+ {'text':
+ '"$name" must be a library name, operator name, or identifier.'});
+ }
+ }
+
+
/**
* Try to resolve the constructor that is referred to by [node].
* Note: this function may return an ErroneousFunctionElement instead of

Powered by Google App Engine
This is Rietveld 408576698