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

Unified Diff: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart

Issue 12276002: Add a small JS parser to ease the building of ASTs (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Streamline support for var Created 7 years, 10 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: sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
index 58953651e7df4533b8dd8a71bb6043bf8818f5b5..ee104dffc57d7a9fbb7d2a436cbfd1578d57f9d5 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/emitter.dart
@@ -174,34 +174,24 @@ class CodeEmitterTask extends CompilerTask {
const RENAMING_FLAG = 0x40;
jsAst.Expression needsGetterCode(String variable) {
- // ($variable & 3) > 0
- return (js[variable] & 3) > 0;
+ return js['($variable & 3) > 0'];
}
jsAst.Expression needsSetterCode(String variable) {
- // ($variable & 2) == 0
- return (js[variable] & 2).equals(0);
+ return js['($variable & 2) == 0'];
}
jsAst.Expression isRenaming(String variable) {
- // ($variable & $RENAMING_FLAG) != 0
- return (js[variable] & RENAMING_FLAG).notEquals(0);
+ return js['($variable & $RENAMING_FLAG) != 0'];
}
jsAst.FunctionDeclaration get generateAccessorFunction {
// function generateAccessor(field, prototype) {
jsAst.Fun fun = js.fun(['field', 'prototype'], [
-
- // var len = field.length;
- js['len'].def(js['field']['length']),
-
- // var lastCharCode = field.charCodeAt(len - 1);
- js['lastCharCode'].def(js['field']['charCodeAt'](js['len'] - 1)),
-
- // var needsAccessor =
- // (lastCharCode & $SUFFIX_MASK) >= $FIRST_SUFFIX_CODE;
- js['needsAccessor'].def(
- (js['lastCharCode'] & SUFFIX_MASK) >= FIRST_SUFFIX_CODE),
+ js['var len = field.length'],
+ js['var lastCharCode = field.charCodeAt(len - 1)'],
+ js['var needsAccessor = '
+ '(lastCharCode & $SUFFIX_MASK) >= $FIRST_SUFFIX_CODE'],
// if (needsAccessor) {
js.if_('needsAccessor', [
@@ -214,42 +204,33 @@ class CodeEmitterTask extends CompilerTask {
// var renaming = ${isRenaming('lastCharCode')};
js['renaming'].def(isRenaming('lastCharCode')),
- // var accessorName = field = field.substring(0, len - 1);
- js['accessorName'].def(
- js['field'].assign(js['field']['substring']([0, js['len'] - 1]))),
+ js['var accessorName = field = field.substring(0, len - 1)'],
// if (renaming) {
js.if_('renaming', [
- // var divider = field.indexOf(":");
- js['divider'].def(js['field']['indexOf'](js.string(':'))),
-
- // accessorName = field.substring(0, divider);
- js['accessorName'].assign(js['field']['substring']([0, 'divider'])),
-
- // field = field.substring(divider + 1);
- js['field'].assign(js['field']['substring'](js['divider'] + 1))
+ js['var divider = field.indexOf(":")'],
+ js['accessorName = field.substring(0, divider)'],
+ js['field = field.substring(divider + 1)']
]),
// if (needsGetter) {
js.if_('needsGetter', [
- // var getterString = "return this." + field + ";";
- js['getterString'].def(js.string('return this.') + 'field'),
+ js['var getterString = "return this." + field'],
// prototype["${namer.getterPrefix}" + accessorName] =
// new Function(getterString);
- js['prototype'][js.string(namer.getterPrefix) + 'accessorName']
+ js['prototype["${namer.getterPrefix}" + accessorName]']
.assign(js['Function'].newWith([js['getterString']]))
]),
// if (needsSetter) {
js.if_('needsSetter', [
// var setterString = "this." + field + " = v;";
- js['setterString'].def(
- js.string('this.') + 'field' + js.string('$_=${_}v')),
+ js['var setterString = "this." + field + "$_=${_}v"'],
// prototype["${namer.setterPrefix}" + accessorName] =
// new Function("v", setterString);
- js['prototype'][js.string(namer.setterPrefix) + 'accessorName']
+ js['prototype["${namer.setterPrefix}" + accessorName]']
.assign(js['Function'].newWith([js.string('v'),
js['setterString']]))
]),
@@ -282,57 +263,35 @@ class CodeEmitterTask extends CompilerTask {
// function(cls, fields, prototype) {
return js.fun(['cls', 'fields', 'prototype'], [
-
- // var constructor;
- js['constructor'].def(),
+ js['var constructor'],
// if (typeof fields == 'function') {
js.if_(js['fields'].typeof.equals(js.string('function')), [
// constructor = fields;
- js['constructor'].assign('fields')
+ js['constructor = fields']
], /* else */ [
- // var str = "function " + cls + "(";
- js['str'].def(js.string('function ') + 'cls' + js.string('(')),
-
- // var body = "";
- js['body'].def(js.string('')),
+ js['var str = "function " + cls + "("'],
+ js['var body = ""'],
// for (var i = 0; i < fields.length; i++) {
- js.for_(js['i'].def(0),
- js['i'] < js['fields']['length'],
- js['i'].plusPlus, [
+ js.for_(js['var i = 0'], js['i < fields.length'], js['i++'], [
// if (i != 0) str += ", ";
- js.if_(js['i'].notEquals(0), js['str'].update('+', js.string(', '))),
-
- // var field = fields[i];
- js['field'].def(js['fields'][js['i']]),
-
- // field = generateAccessor(field, prototype);
- js['field'].assign(js['generateAccessor'](['field', 'prototype'])),
+ js.if_(js['i != 0'], js['str += ", "']),
- // str += field;
- js['str'].update('+', 'field'),
-
- // body += "this." + field + " = " + field + ";\\n";
- js['body'].update('+',
- js.string('this.') + 'field' + js.string(" = ") +
- 'field' + js.string(r';\n'))
+ js['var field = fields[i]'],
+ js['field = generateAccessor(field, prototype)'],
+ js['str += field'],
+ js['body += ("this." + field + " = " + field + ";\\n")']
]),
- // str += ") {" + body + "}\\nreturn " + cls;
- js['str'].update(
- '+',
- js.string(') {') + 'body' + js.string(r'}\nreturn ') + 'cls'),
+ js['str += (") {" + body + "}\\nreturn " + cls)'],
// constructor = new Function(str)();
js['constructor'].assign(js['Function'].newWith([js['str']])())
]),
- // constructor.prototype = prototype;
- js['constructor']['prototype'].assign('prototype'),
-
- // constructor.builtin\$cls = cls;
- js['constructor'][r'builtin$cls'].assign('cls'),
+ js['constructor.prototype = prototype'],
+ js['constructor.builtin\$cls = cls'],
// return constructor;
js.return_('constructor')
@@ -352,8 +311,7 @@ class CodeEmitterTask extends CompilerTask {
// TODO(8541): Remove this work around.
return [
- // var $supportsProtoName = false;
- js[supportsProtoName].def(false),
+ js['var $supportsProtoName = false'],
// var tmp = defineClass('c', ['f?'], {}).prototype;
js['tmp'].def(
@@ -363,13 +321,13 @@ class CodeEmitterTask extends CompilerTask {
{}])['prototype']),
// if (tmp.__proto__) {
- js.if_(js['tmp']['__proto__'], [
+ js.if_(js['tmp.__proto__'], [
// tmp.__proto__ = {};
js['tmp']['__proto__'].assign({}),
// if (typeof tmp.get\$f != 'undefined') $supportsProtoName = true;
js.if_(js['tmp'][r'get$f'].typeof.notEquals(js.string('undefined')),
- js[supportsProtoName].assign(true))
+ js['$supportsProtoName = true'])
])
];
@@ -391,22 +349,18 @@ class CodeEmitterTask extends CompilerTask {
// function(collectedClasses) {
return js.fun(['collectedClasses'], [
- // var isolateProperties = $isolatePropertiesName;
- js['isolateProperties'].def(isolatePropertiesName),
+ js['var isolateProperties = $isolatePropertiesName'],
// var pendingClasses = {};
js['pendingClasses'].def({}),
- // var hasOwnProperty = Object.prototype.hasOwnProperty;
- js['hasOwnProperty'].def(js['Object']['prototype']['hasOwnProperty']),
+ js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
// for (var cls in collectedClasses) {
js.forIn('cls', 'collectedClasses', [
// if (hasOwnProperty.call(collectedClasses, cls)) {
- js.if_(js['hasOwnProperty']['call'](['collectedClasses', 'cls']),[
-
- // var desc = collectedClasses[cls];
- js['desc'].def(js['collectedClasses'][js['cls']]),
+ js.if_(js['hasOwnProperty.call(collectedClasses, cls)'], [
+ js['var desc = collectedClasses[cls]'],
/* The 'fields' are either a constructor function or a
* string encoding fields, constructor and superclass. Get
@@ -416,8 +370,8 @@ class CodeEmitterTask extends CompilerTask {
*/
// var fields = desc[''], supr;
sra1 2013/02/20 01:50:24 Looking at the parser, you should be able to parse
erikcorry 2013/02/20 14:39:09 Done.
(() {
- var fields = js['desc'][''];
- var supr = js['supr'].def(null).declarations.single;
+ var fields = js["desc['']"];
+ var supr = js['var supr'].declarations.single;
var fieldsAndSupr = js['fields'].def(fields);
fieldsAndSupr.declarations.add(supr);
return fieldsAndSupr;
@@ -425,30 +379,23 @@ class CodeEmitterTask extends CompilerTask {
// if (typeof fields == 'string') {
js.if_(js['fields'].typeof.equals(js.string('string')), [
- // var s = fields.split(';');
- js['s'].def(js['fields']['split'](js.string(';'))),
-
- // supr = s[0];
- js['supr'].assign(js['s'][0]),
+ js['var s = fields.split(";")'],
+ js['supr = s[0]'],
// fields = s[1] == '' ? [] : s[1].split(',');
js['fields'].assign(
new jsAst.Conditional(
- js['s'][1].equals(js.string('')),
+ js['s[1] == ""'],
new jsAst.ArrayInitializer(0, []),
- js['s'][1]['split'](js.string(',')))),
+ js['s[1].split(",")']))
], /* else */ [
- // supr = desc['super'];
- js['supr'].assign(js['desc']['super'])
+ js['supr = desc.super']
]),
- // isolateProperties[cls] = defineClass(cls, fields, desc);
- js['isolateProperties'][js['cls']].assign(
- js['defineClass'](['cls', 'fields', 'desc'])),
+ js['isolateProperties[cls] = defineClass(cls, fields, desc)'],
// if (supr) pendingClasses[cls] = supr;
- js.if_(js['supr'],
- js['pendingClasses'][js['cls']].assign(js['supr']))
+ js.if_(js['supr'], js['pendingClasses[cls] = supr'])
])
]),
@@ -475,38 +422,24 @@ class CodeEmitterTask extends CompilerTask {
js['hasOwnProperty'].def(js['Object']['prototype']['hasOwnProperty']),
// if (hasOwnProperty.call(finishedClasses, cls)) return;
- js.if_(js['hasOwnProperty']['call'](['finishedClasses', 'cls']),
+ js.if_(js['hasOwnProperty.call(finishedClasses, cls)'],
js.return_()),
- // finishedClasses[cls] = true;
- js['finishedClasses'][js['cls']].assign(true),
-
- // var superclass = pendingClasses[cls];
- js['superclass'].def(js['pendingClasses'][js['cls']]),
+ js['finishedClasses[cls] = true'],
+ js['var superclass = pendingClasses[cls]'],
/* The superclass is only false (empty string) for Dart's Object class. */
// if (!superclass) return;
- js.if_(js['superclass'].not, js.return_()),
-
- // finishClass(superclass);
- js['finishClass']('superclass'),
-
- // var constructor = isolateProperties[cls];
- js['constructor'].def(js['isolateProperties'][js['cls']]),
-
- // var superConstructor = isolateProperties[superclass];
- js['superConstructor'].def(js['isolateProperties'][js['superclass']]),
-
- // var prototype = constructor.prototype;
- js['prototype'].def(js['constructor']['prototype']),
+ js.if_(js['!superclass'], js.return_()),
+ js['finishClass(superclass)'],
+ js['var constructor = isolateProperties[cls]'],
+ js['var superConstructor = isolateProperties[superclass]'],
+ js['var prototype = constructor.prototype'],
// if ($supportsProtoName) {
js.if_(supportsProtoName, [
- // prototype.__proto__ = superConstructor.prototype;
- js['prototype']['__proto__'].assign(js['superConstructor']['prototype']),
-
- // prototype.constructor = constructor;
- js['prototype']['constructor'].assign('constructor')
+ js['prototype.__proto__ = superConstructor.prototype'],
+ js['prototype.constructor = constructor'],
], /* else */ [
// function tmp() {};
@@ -514,29 +447,22 @@ class CodeEmitterTask extends CompilerTask {
new jsAst.VariableDeclaration('tmp'),
js.fun([], [])),
- // tmp.prototype = superConstructor.prototype;
- js['tmp']['prototype'].assign(js['superConstructor']['prototype']),
-
+ js['tmp.prototype = superConstructor.prototype'],
// var newPrototype = new tmp();
js['newPrototype'].def(js['tmp'].newWith([])),
- // constructor.prototype = newPrototype;
- js['constructor']['prototype'].assign('newPrototype'),
-
- // newPrototype.constructor = constructor;
- js['newPrototype']['constructor'].assign('constructor'),
+ js['constructor.prototype = newPrototype'],
+ js['newPrototype.constructor = constructor'],
// for (var member in prototype) {
js.forIn('member', 'prototype', [
/* Short version of: if (member == '') */
// if (!member) continue;
- js.if_(js['member'].not, new jsAst.Continue(null)),
+ js.if_(js['!member'], new jsAst.Continue(null)),
// if (hasOwnProperty.call(prototype, member)) {
- js.if_(js['hasOwnProperty']['call'](['prototype', 'member']), [
- // newPrototype[member] = prototype[member];
- js['newPrototype'][js['member']].assign(
- js['prototype'][js['member']])
+ js.if_(js['hasOwnProperty.call(prototype, member)'], [
+ js['newPrototype[member] = prototype[member]']
])
])
@@ -573,53 +499,28 @@ class CodeEmitterTask extends CompilerTask {
// function(oldIsolate) {
return js.fun('oldIsolate', [
- // var isolateProperties = oldIsolate.${namer.isolatePropertiesName};
- js['isolateProperties'].def(
- js['oldIsolate'][namer.isolatePropertiesName]),
-
- // var isolatePrototype = oldIsolate.prototype;
- js['isolatePrototype'].def(js['oldIsolate']['prototype']),
-
- // var str = "{\\n";
- js['str'].def(js.string(r'{\n')),
-
- // str += "var properties = $isolate.${namer.isolatePropertiesName};\\n";
- js['str'].update('+', js.string('var properties = '
- '$isolate.${namer.isolatePropertiesName};'
- r'\n')),
-
- // var hasOwnProperty = Object.prototype.hasOwnProperty;
- js['hasOwnProperty'].def(js['Object']['prototype']['hasOwnProperty']),
+ js['var isolateProperties = oldIsolate.${namer.isolatePropertiesName}'],
+ js['var isolatePrototype = oldIsolate.prototype'],
+ js['var str = "{\\n"'],
+ js['str += '
+ '"var properties = $isolate.${namer.isolatePropertiesName};\\n"'],
+ js['var hasOwnProperty = Object.prototype.hasOwnProperty'],
// for (var staticName in isolateProperties) {
js.forIn('staticName', 'isolateProperties', [
-
- // if (hasOwnProperty.call(isolateProperties, staticName)) {
- js.if_(js['hasOwnProperty']['call'](['isolateProperties',
- 'staticName']), [
-
- //str += "this." + staticName + "= properties." + staticName + ";\\n";
- js['str'].update(
- '+',
- js.string("this.") + 'staticName' + js.string("= properties.") +
- 'staticName' + js.string(r';\n'))
+ js.if_(js['hasOwnProperty.call(isolateProperties, staticName)'], [
+ js['str += ("this." + staticName + "= properties." + staticName + '
+ '";\\n")']
])
]),
- // str += "}\\n";
- js['str'].update('+', js.string(r'}\n')),
+ js['str += "}\\n"'],
// var newIsolate = new Function(str);
js['newIsolate'].def(js['Function'].newWith([js['str']])),
-
- // newIsolate.prototype = isolatePrototype;
- js['newIsolate']['prototype'].assign('isolatePrototype'),
-
- // isolatePrototype.constructor = newIsolate;
- js['isolatePrototype']['constructor'].assign('newIsolate'),
-
- // newIsolate.${namer.isolatePropertiesName} = isolateProperties;
- js['newIsolate'][namer.isolatePropertiesName].assign('isolateProperties'),
+ js['newIsolate.prototype = isolatePrototype'],
+ js['isolatePrototype.constructor = newIsolate'],
+ js['newIsolate.${namer.isolatePropertiesName} = isolateProperties'],
// return newIsolate;
js.return_('newIsolate')
@@ -651,48 +552,36 @@ class CodeEmitterTask extends CompilerTask {
// var sentinelInProgress = {};
js['sentinelInProgress'].def({}),
- // prototype[fieldName] = sentinelUndefined;
- js['prototype'][js['fieldName']].assign('sentinelUndefined'),
+ js['prototype[fieldName] = sentinelUndefined'],
// prototype[getterName] = function() {
js['prototype'][js['getterName']].assign(js.fun([], [
- // var result = $isolate[fieldName];
- js['result'].def(js[isolate][js['fieldName']]),
+ js['var result = $isolate[fieldName]'],
// try {
js.try_([
- // if (result === sentinelUndefined) {
- js.if_(js['result'].strictEquals('sentinelUndefined'), [
-
- // $isolate[fieldName] = sentinelInProgress;
- js[isolate][js['fieldName']].assign('sentinelInProgress'),
+ js.if_(js['result === sentinelUndefined'], [
+ js['$isolate[fieldName] = sentinelInProgress'],
// try {
js.try_([
- // result = $isolate[fieldName] = lazyValue();
- js['result'].assign(
- js[isolate][js['fieldName']].assign(js['lazyValue']()))
+ js['result = ($isolate[fieldName] = lazyValue())'],
], finallyPart: [
// Use try-finally, not try-catch/throw as it destroys the
// stack trace.
// if (result === sentinelUndefined) {
- js.if_(js['result'].strictEquals('sentinelUndefined'), [
+ js.if_(js['result === sentinelUndefined'], [
// if ($isolate[fieldName] === sentinelInProgress) {
- js.if_(js[isolate][js['fieldName']]
- .strictEquals('sentinelInProgress'), [
-
- // $isolate[fieldName] = null;
- js[isolate][js['fieldName']].assign(new jsAst.LiteralNull())
+ js.if_(js['$isolate[fieldName] === sentinelInProgress'], [
+ js['$isolate[fieldName] = null'],
])
])
])
], /* else */ [
- // } else if (result === sentinelInProgress) {
- js.if_(js['result'].strictEquals('sentinelInProgress'),
- // $cyclicThrow(staticName);
- js[cyclicThrow]('staticName')
+ js.if_(js['result === sentinelInProgress'],
+ js['$cyclicThrow(staticName)']
)
]),
@@ -700,8 +589,7 @@ class CodeEmitterTask extends CompilerTask {
js.return_('result')
], finallyPart: [
- // $isolate[getterName] = getter;
- js[isolate][js['getterName']].assign('getter')
+ js['$isolate[getterName] = getter']
])
]))
];
@@ -714,8 +602,7 @@ class CodeEmitterTask extends CompilerTask {
// defineClassFunction (it's a local declaration in init()).
generateAccessorFunction,
- // $generateAccessorHolder = generateAccessor;
- js[generateAccessorHolder].assign('generateAccessor'),
+ js['$generateAccessorHolder = generateAccessor'],
// function defineClass ...
new jsAst.FunctionDeclaration(

Powered by Google App Engine
This is Rietveld 408576698