From 94bda906b10f3f793c8acd4384e98ac27368200f Mon Sep 17 00:00:00 2001 From: Andy Alm Date: Tue, 27 Jul 2010 16:18:08 -0700 Subject: [PATCH] fixed javascript error when custom functions have been added to Array.prototype --- src/Spark.JsTests/CodeConstructsTests.html | 13 +++++++++ src/Spark.JsTests/Spark.JsTests.csproj | 3 +- .../CodeConstructs/_IterationOfObjects.spark | 4 +++ .../JavascriptGeneratedCodeVisitor.cs | 28 +++++++++++++------ 4 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 src/Spark.JsTests/Views/CodeConstructs/_IterationOfObjects.spark diff --git a/src/Spark.JsTests/CodeConstructsTests.html b/src/Spark.JsTests/CodeConstructsTests.html index 1c4bc9c8..60e3ef9e 100644 --- a/src/Spark.JsTests/CodeConstructsTests.html +++ b/src/Spark.JsTests/CodeConstructsTests.html @@ -7,6 +7,7 @@ + @@ -37,6 +38,18 @@ assertContains("

2/3:gamma

", contents); } + function testIterationWithArrayPrototype() + { + Array.prototype.customFunc = function() { } + + var contents = Spark.CodeConstructs._IterationOfObjects.RenderView({ stuff: [{ prop: 'alpha' }, { prop: 'beta' }, { prop: 'gamma'}] }); + assertContains("

alpha

", contents); + assertContains("

beta

", contents); + assertContains("

gamma

", contents); + + delete Array.prototype.customFunc; + } + diff --git a/src/Spark.JsTests/Spark.JsTests.csproj b/src/Spark.JsTests/Spark.JsTests.csproj index 49b5813d..532611cb 100644 --- a/src/Spark.JsTests/Spark.JsTests.csproj +++ b/src/Spark.JsTests/Spark.JsTests.csproj @@ -1,4 +1,4 @@ - + Debug AnyCPU @@ -145,6 +145,7 @@ + diff --git a/src/Spark.JsTests/Views/CodeConstructs/_IterationOfObjects.spark b/src/Spark.JsTests/Views/CodeConstructs/_IterationOfObjects.spark new file mode 100644 index 00000000..cb10c190 --- /dev/null +++ b/src/Spark.JsTests/Views/CodeConstructs/_IterationOfObjects.spark @@ -0,0 +1,4 @@ + + +

${item.prop}

+
diff --git a/src/Spark/Compiler/Javascript/ChunkVisitors/JavascriptGeneratedCodeVisitor.cs b/src/Spark/Compiler/Javascript/ChunkVisitors/JavascriptGeneratedCodeVisitor.cs index e3fe9732..346f482e 100644 --- a/src/Spark/Compiler/Javascript/ChunkVisitors/JavascriptGeneratedCodeVisitor.cs +++ b/src/Spark/Compiler/Javascript/ChunkVisitors/JavascriptGeneratedCodeVisitor.cs @@ -123,19 +123,26 @@ protected override void Visit(ForEachChunk chunk) autoCount.Detected = true; } + string iteratorName = "__iter__" + inspector.VariableName; + if (autoCount.Detected) { - // var itemCount=0;for(var __iter__item in coll){++itemCount;} + // var itemCount=0;for(var __iter__item in coll){if(typeof(__iter__item)!='function'){++itemCount;}} _source .Append("var ") .Append(inspector.VariableName) - .Append("Count=0;for(var __iter__") - .Append(inspector.VariableName) + .Append("Count=0;for(var ") + .Append(iteratorName) .Append(" in ") .Append(inspector.CollectionCode) - .Append("){++") + .Append("){ if(typeof(") + .Append(inspector.CollectionCode) + .Append("[") + .Append(iteratorName) + .Append("])!='function') {") + .Append("++") .Append(inspector.VariableName) - .Append("Count;}"); + .Append("Count;}}"); } if (autoIndex.Detected) @@ -152,8 +159,8 @@ protected override void Visit(ForEachChunk chunk) // for(var __iter__item in coll) { _source - .Append("for (var __iter__") - .Append(inspector.VariableName) + .Append("for (var ") + .Append(iteratorName) .Append(" in ") .Append(inspector.CollectionCode) .Append(") {"); @@ -168,6 +175,11 @@ protected override void Visit(ForEachChunk chunk) .Append(inspector.VariableName) .Append("];"); + // if(typeof(item)!='function') { + _source.Append("if(typeof(") + .Append(inspector.VariableName) + .Append(")!='function') {"); + if (autoIsLast.Detected) { // var itemIsLast=(itemIndex==itemCount-1); @@ -197,7 +209,7 @@ protected override void Visit(ForEachChunk chunk) _source.Append("++").Append(inspector.VariableName).Append("Index;"); } - _source.AppendLine("}"); + _source.AppendLine("}}"); } else {