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

Unified Diff: frog/leg/emitter.dart

Issue 9750003: Write our JS blobs for handling native classes in Dart. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 9 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: frog/leg/emitter.dart
===================================================================
--- frog/leg/emitter.dart (revision 5817)
+++ frog/leg/emitter.dart (working copy)
@@ -37,11 +37,13 @@
final Namer namer;
final NativeEmitter nativeEmitter;
Set<ClassElement> generatedClasses;
+ StringBuffer mainBuffer;
CodeEmitterTask(Compiler compiler)
: namer = compiler.namer,
nativeEmitter = new NativeEmitter(compiler),
generatedClasses = new Set<ClassElement>(),
+ mainBuffer = new StringBuffer(),
super(compiler);
String get name() => 'CodeEmitter';
@@ -54,12 +56,12 @@
return namer.isolatePropertyAccess(objectClass);
}
- void addInheritFunctionIfNecessary(StringBuffer buffer) {
+ void addInheritFunctionIfNecessary() {
if (addedInheritFunction) return;
addedInheritFunction = true;
- buffer.add('$inheritsName = ');
- buffer.add(INHERIT_FUNCTION);
- buffer.add(';\n');
+ mainBuffer.add('$inheritsName = ');
+ mainBuffer.add(INHERIT_FUNCTION);
+ mainBuffer.add(';\n');
}
void addParameterStub(FunctionElement member,
@@ -158,7 +160,7 @@
if (isNative) {
nativeEmitter.emitParameterStub(
member, invocationName, parametersString, argumentsBuffer,
- indexOfLastOptionalArgumentInParameters, buffer);
+ indexOfLastOptionalArgumentInParameters);
} else {
String arguments = Strings.join(argumentsBuffer, ",");
buffer.add(' return this.${namer.getName(member)}($arguments)');
@@ -262,7 +264,7 @@
void emitInherits(ClassElement cls, StringBuffer buffer) {
ClassElement superclass = cls.superclass;
if (superclass !== null) {
- addInheritFunctionIfNecessary(buffer);
+ addInheritFunctionIfNecessary();
String className = namer.isolatePropertyAccess(cls);
String superName = namer.isolatePropertyAccess(superclass);
buffer.add('${inheritsName}($className, $superName);\n');
@@ -280,8 +282,13 @@
ensureGenerated(classElement.superclass, buffer);
if (classElement.isNative()) {
- nativeEmitter.generateNativeClass(classElement, buffer);
+ nativeEmitter.generateNativeClass(classElement);
return;
+ } else {
+ // TODO(ngeoffray): Instead of switching between buffer, we
+ // should create code sections, and decide where to emit them at
+ // the end.
+ buffer = mainBuffer;
}
String className = namer.isolatePropertyAccess(classElement);
@@ -687,19 +694,20 @@
String assembleProgram() {
measure(() {
- StringBuffer buffer = new StringBuffer();
- buffer.add('function ${namer.ISOLATE}() {');
- emitStaticNonFinalFieldInitializations(buffer);
- buffer.add('}\n\n');
- emitClasses(buffer);
- emitStaticFunctions(buffer);
- emitStaticFunctionGetters(buffer);
- emitCompileTimeConstants(buffer);
- emitStaticFinalFieldInitializations(buffer);
- nativeEmitter.emitDynamicDispatchMetadata(buffer);
- buffer.add('var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n');
- emitMain(buffer);
- compiler.assembledCode = buffer.toString();
+ mainBuffer.add('function ${namer.ISOLATE}() {');
+ emitStaticNonFinalFieldInitializations(mainBuffer);
+ mainBuffer.add('}\n\n');
+ emitClasses(mainBuffer);
+ emitStaticFunctions(mainBuffer);
+ emitStaticFunctionGetters(mainBuffer);
+ emitCompileTimeConstants(mainBuffer);
+ emitStaticFinalFieldInitializations(mainBuffer);
+ nativeEmitter.emitDynamicDispatchMetadata();
+ mainBuffer.add(
+ 'var ${namer.CURRENT_ISOLATE} = new ${namer.ISOLATE}();\n');
+ nativeEmitter.assembleCode(mainBuffer);
+ emitMain(mainBuffer);
+ compiler.assembledCode = mainBuffer.toString();
});
return compiler.assembledCode;
}

Powered by Google App Engine
This is Rietveld 408576698