Skip to content

Commit

Permalink
Optimize generation of static ctors w/o var declarations
Browse files Browse the repository at this point in the history
  • Loading branch information
nikhilk committed Aug 27, 2012
1 parent 53f4374 commit 4cd0a4b
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 20 deletions.
23 changes: 15 additions & 8 deletions src/Core/Compiler/Generator/TypeGenerator.cs
Expand Up @@ -321,15 +321,22 @@ internal static class TypeGenerator {
if (classSymbol.StaticConstructor != null) { if (classSymbol.StaticConstructor != null) {
ScriptTextWriter writer = generator.Writer; ScriptTextWriter writer = generator.Writer;


writer.Write("(function"); SymbolImplementation implementation = classSymbol.StaticConstructor.Implementation;
writer.WriteTrimmed(" () "); bool requiresFunctionScope = implementation.DeclaresVariables;
writer.Write("{");
writer.WriteNewLine(); if (requiresFunctionScope) {
writer.Indent++; writer.Write("(function");
writer.WriteTrimmed(" () ");
writer.Write("{");
writer.WriteNewLine();
writer.Indent++;
}
CodeGenerator.GenerateScript(generator, classSymbol.StaticConstructor); CodeGenerator.GenerateScript(generator, classSymbol.StaticConstructor);
writer.Indent--; if (requiresFunctionScope) {
writer.Write("})();"); writer.Indent--;
writer.WriteSignificantNewLine(); writer.Write("})();");
writer.WriteSignificantNewLine();
}
} }
} }


Expand Down
11 changes: 11 additions & 0 deletions src/Core/Compiler/ScriptModel/Symbols/SymbolImplementation.cs
Expand Up @@ -21,6 +21,17 @@ internal sealed class SymbolImplementation {
_statements = statements; _statements = statements;
} }


public bool DeclaresVariables {
get {
foreach (Statement statement in _statements) {
if (statement is VariableDeclarationStatement) {
return true;
}
}
return false;
}
}

public SymbolScope Scope { public SymbolScope Scope {
get { get {
return _scope; return _scope;
Expand Down
8 changes: 2 additions & 6 deletions tests/TestCases/Member/Constructors/Baseline.txt
Expand Up @@ -38,10 +38,6 @@ test.MyClass2.registerClass('test.MyClass2');
test.MyClass3.registerClass('test.MyClass3'); test.MyClass3.registerClass('test.MyClass3');
test.MyClass4.registerClass('test.MyClass4', test.MyClass3); test.MyClass4.registerClass('test.MyClass4', test.MyClass3);
test.MyClass2.x = null; test.MyClass2.x = null;
(function () { test.MyClass2.x = 'Hello';
test.MyClass2.x = 'Hello';
})();
test.MyClass3.c = null; test.MyClass3.c = null;
(function () { test.MyClass3.c = new test.MyClass();
test.MyClass3.c = new test.MyClass();
})();
4 changes: 1 addition & 3 deletions tests/TestCases/Member/Methods/Baseline.txt
Expand Up @@ -87,9 +87,7 @@ $.fn.extend = function(x, i) {


test.Test.registerClass('test.Test'); test.Test.registerClass('test.Test');
test.X.registerClass('test.X'); test.X.registerClass('test.X');
(function () { alert('Startup code in FooBar');
alert('Startup code in FooBar');
})();
(function () { (function () {
var timeStamp = new Date().getMilliseconds(); var timeStamp = new Date().getMilliseconds();
alert('Startup code in FooBar: ' + timeStamp); alert('Startup code in FooBar: ' + timeStamp);
Expand Down
31 changes: 28 additions & 3 deletions tests/TestCases/Member/StaticConstructors/Baseline.txt
Expand Up @@ -14,6 +14,27 @@ test.MyClass = function(d) {
} }




////////////////////////////////////////////////////////////////////////////////
// test.MyClassEmpty

test.MyClassEmpty = function() {
}


////////////////////////////////////////////////////////////////////////////////
// test.MyClassSimple

test.MyClassSimple = function() {
}


////////////////////////////////////////////////////////////////////////////////
// test.MyClassSimpleMulti

test.MyClassSimpleMulti = function() {
}


//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// test.MyBehavior // test.MyBehavior


Expand All @@ -24,11 +45,15 @@ test.MyBehavior = function(element) {


test.Behavior.registerClass('test.Behavior'); test.Behavior.registerClass('test.Behavior');
test.MyClass.registerClass('test.MyClass'); test.MyClass.registerClass('test.MyClass');
test.MyClassEmpty.registerClass('test.MyClassEmpty');
test.MyClassSimple.registerClass('test.MyClassSimple');
test.MyClassSimpleMulti.registerClass('test.MyClassSimpleMulti');
test.MyBehavior.registerClass('test.MyBehavior', test.Behavior); test.MyBehavior.registerClass('test.MyBehavior', test.Behavior);
test.MyClass.instance = null; test.MyClass.instance = null;
(function () { test.MyClass.instance = new test.MyClass(Date.get_now());
test.MyClass.instance = new test.MyClass(Date.get_now()); alert('simple static ctor');
})(); alert('simple static ctor with multiple statements');
document.getElementById('foo').innerHTML = '...';
(function () { (function () {
var e = document.body; var e = document.body;
var b = true; var b = true;
Expand Down
21 changes: 21 additions & 0 deletions tests/TestCases/Member/StaticConstructors/Code.cs
Expand Up @@ -25,6 +25,27 @@ public sealed class MyClass {
} }
} }


public sealed class MyClassEmpty {

static MyClassEmpty() {
}
}

public sealed class MyClassSimple {

static MyClassSimple() {
Window.Alert("simple static ctor");
}
}

public sealed class MyClassSimpleMulti {

static MyClassSimpleMulti() {
Window.Alert("simple static ctor with multiple statements");
Document.GetElementById("foo").InnerHTML = "...";
}
}

public sealed class MyBehavior : Behavior { public sealed class MyBehavior : Behavior {


static MyBehavior() { static MyBehavior() {
Expand Down

0 comments on commit 4cd0a4b

Please sign in to comment.