From 4c22131634b5c564e5361f4bd761617bf9a9dd09 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Sat, 6 Apr 2013 13:56:13 -0700 Subject: [PATCH 1/4] Clean up createClass. --- src/avm2/runtime.js | 160 +++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 78 deletions(-) diff --git a/src/avm2/runtime.js b/src/avm2/runtime.js index 89a7c8dfe4..41a4c88f40 100644 --- a/src/avm2/runtime.js +++ b/src/avm2/runtime.js @@ -1182,6 +1182,45 @@ var Runtime = (function () { } } + if (instance) { + this.applyProtectedBindings(instance.prototype, cls); + this.applyInterfaceBindings(instance.prototype, cls); + } + + // Run the static initializer. + this.createFunction(classInfo.init, scope).call(cls); + + // Seal constant traits in the class object. + compatibility && this.sealConstantTraits(cls, ci.traits); + + // TODO: Seal constant traits in the instance object. This should be done after + // the instance constructor has executed. + + if (traceClasses.value) { + domain.loadedClasses.push(cls); + domain.traceLoadedClasses(); + } + + return cls; + }; + + runtime.prototype.createInterface = function createInterface(classInfo) { + var ii = classInfo.instanceInfo; + release || assert(ii.isInterface()); + if (traceExecution.value) { + var str = "Creating interface " + ii.name; + if (ii.interfaces.length) { + str += " implements " + ii.interfaces.map(function (name) { + return name.getName(); + }).join(", "); + } + print(str); + } + return new Interface(classInfo); + }; + + runtime.prototype.applyProtectedBindings = function applyProtectedBindings(obj, cls) { + // Deal with the protected namespace bullshit. In AS3, if you have the following code: // // class A { @@ -1207,56 +1246,54 @@ var Runtime = (function () { // Then we need a binding from protected$A$foo -> protected$C$foo, and // protected$B$foo -> protected$C$foo. - function applyProtectedTraits(cls) { - var map = Object.create(null); + var map = Object.create(null); - // Walks up the inheritance hierarchy and collects the last defining namespace for each - // protected member as well as all the protected namespaces from the first definition. - (function gather(cls) { - if (cls.baseClass) { - gather(cls.baseClass); - } - var ii = cls.classInfo.instanceInfo; - for (var i = 0; i < ii.traits.length; i++) { - var trait = ii.traits[i]; - if (trait.isProtected()) { - var name = trait.name.getName(); - if (!map[name]) { - map[name] = {definingNamespace: ii.protectedNs, namespaces: [], trait: trait}; - } - map[name].definingNamespace = ii.protectedNs; + // Walks up the inheritance hierarchy and collects the last defining namespace for each + // protected member as well as all the protected namespaces from the first definition. + (function gather(cls) { + if (cls.baseClass) { + gather(cls.baseClass); + } + var ii = cls.classInfo.instanceInfo; + for (var i = 0; i < ii.traits.length; i++) { + var trait = ii.traits[i]; + if (trait.isProtected()) { + var name = trait.name.getName(); + if (!map[name]) { + map[name] = {definingNamespace: ii.protectedNs, namespaces: [], trait: trait}; } + map[name].definingNamespace = ii.protectedNs; } - for (var name in map) { - map[name].namespaces.push(ii.protectedNs); - } - })(cls); - - var openMethods = instance.prototype[VM_OPEN_METHODS]; - var vmBindings = instance.prototype[VM_BINDINGS]; + } for (var name in map) { - var definingNamespace = map[name].definingNamespace; - var protectedQn = Multiname.getQualifiedName(new Multiname([definingNamespace], name)); - var namespaces = map[name].namespaces; - var trait = map[name].trait; - for (var i = 0; i < namespaces.length; i++) { - var qn = Multiname.getQualifiedName(new Multiname([namespaces[i]], name)); - if (qn !== protectedQn) { - Counter.count("Protected Aliases"); - defineNonEnumerableGetter(instance.prototype, qn, makeForwardingGetter(protectedQn)); - defineNonEnumerableSetter(instance.prototype, qn, makeForwardingSetter(protectedQn)); - vmBindings.push(qn); - if (trait.isMethod()) { - openMethods[qn] = openMethods[protectedQn]; - } + map[name].namespaces.push(ii.protectedNs); + } + })(cls); + + var openMethods = obj[VM_OPEN_METHODS]; + var vmBindings = obj[VM_BINDINGS]; + for (var name in map) { + var definingNamespace = map[name].definingNamespace; + var protectedQn = Multiname.getQualifiedName(new Multiname([definingNamespace], name)); + var namespaces = map[name].namespaces; + var trait = map[name].trait; + for (var i = 0; i < namespaces.length; i++) { + var qn = Multiname.getQualifiedName(new Multiname([namespaces[i]], name)); + if (qn !== protectedQn) { + Counter.count("Protected Aliases"); + defineNonEnumerableGetter(obj, qn, makeForwardingGetter(protectedQn)); + defineNonEnumerableSetter(obj, qn, makeForwardingSetter(protectedQn)); + vmBindings.push(qn); + if (trait.isMethod()) { + openMethods[qn] = openMethods[protectedQn]; } } } } + }; - if (instance) { - applyProtectedTraits(cls); - } + runtime.prototype.applyInterfaceBindings = function applyInterfaceBindings(obj, cls) { + var domain = this.domain; cls.implementedInterfaces = []; @@ -1296,7 +1333,6 @@ var Runtime = (function () { cls.implementedInterfaces.push(interface); applyInterfaceTraits(ii.interfaces); - var bindings = instance.prototype; var interfaceTraits = ii.traits; for (var k = 0, l = interfaceTraits.length; k < l; k++) { var interfaceTrait = interfaceTraits[k]; @@ -1313,47 +1349,15 @@ var Runtime = (function () { } }(interfaceTraitBindingQn); Counter.count("Interface Aliases"); - defineNonEnumerableGetter(bindings, interfaceTraitQn, getter); + defineNonEnumerableGetter(obj, interfaceTraitQn, getter); } } } // Apply traits of all interfaces along the inheritance chain. - var tmp = cls; - while (tmp) { - applyInterfaceTraits(tmp.classInfo.instanceInfo.interfaces); - tmp = tmp.baseClass; - } - - // Run the static initializer. - this.createFunction(classInfo.init, scope).call(cls); - - // Seal constant traits in the class object. - compatibility && this.sealConstantTraits(cls, ci.traits); - - // TODO: Seal constant traits in the instance object. This should be done after - // the instance constructor has executed. - - if (traceClasses.value) { - domain.loadedClasses.push(cls); - domain.traceLoadedClasses(); - } - - return cls; - }; - - runtime.prototype.createInterface = function createInterface(classInfo) { - var ii = classInfo.instanceInfo; - release || assert(ii.isInterface()); - if (traceExecution.value) { - var str = "Creating interface " + ii.name; - if (ii.interfaces.length) { - str += " implements " + ii.interfaces.map(function (name) { - return name.getName(); - }).join(", "); - } - print(str); + while (cls) { + applyInterfaceTraits(cls.classInfo.instanceInfo.interfaces); + cls = cls.baseClass; } - return new Interface(classInfo); }; /** From e2b5a8a5a5928735d85a0726f9ba08fd3f1bd04d Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Sat, 6 Apr 2013 14:03:01 -0700 Subject: [PATCH 2/4] Separate regression tests in pass/fail directories. --- .../correctness/{ => fail}/coerce-1.as | 0 .../correctness/{ => fail}/coerce-2.as | 0 .../correctness/{ => fail}/instance-0.as | 0 .../regress/correctness/{ => fail}/type-0.as | 0 .../regress/correctness/{ => fail}/type-3.as | 0 .../tests/regress/correctness/functions-0.as | 3 - .../correctness/{ => pass}/arrays-0.as | 0 .../regress/correctness/{ => pass}/arrays.as | 0 .../correctness/{ => pass}/callsuper1.as | 0 .../correctness/{ => pass}/callsuper2.as | 0 .../correctness/{ => pass}/callsuper3.as | 0 .../correctness/{ => pass}/callsuper4.as | 0 .../correctness/{ => pass}/callsuper5.as | 0 .../correctness/{ => pass}/callsuper6.as | 0 .../correctness/{ => pass}/callsuper7.as | 0 .../regress/correctness/pass/classes-1.as | 16 +++++ .../regress/correctness/{ => pass}/classes.as | 0 .../correctness/{ => pass}/closure0.as | 0 .../correctness/{ => pass}/coerce-0.as | 0 .../regress/correctness/{ => pass}/default.as | 0 .../correctness/{ => pass}/dictionary1.as | 0 .../correctness/{ => pass}/dynamic-0.as | 0 .../tests/regress/correctness/pass/flow.as | 34 +++++++++ .../regress/correctness/{ => pass}/for-1.as | 0 .../regress/correctness/{ => pass}/for.as | 0 .../regress/correctness/pass/functions-0.as | 4 ++ .../regress/correctness/pass/interface-0.as | 39 +++++++++++ .../correctness/{ => pass}/interfaceCast.as | 0 .../correctness/{ => pass}/literals-0.as | 0 .../regress/correctness/{ => pass}/many-0.as | 0 .../{ => pass}/method-closures-0.as | 0 .../{ => pass}/method-closures-1.as | 5 +- .../regress/correctness/{ => pass}/names.as | 0 .../correctness/{ => pass}/numbers-0.as | 0 .../tests/regress/correctness/pass/phi-0.as | 7 ++ .../regress/correctness/{ => pass}/play.as | 0 .../regress/correctness/{ => pass}/prot-0.as | 0 .../regress/correctness/{ => pass}/prot-1.as | 0 .../regress/correctness/{ => pass}/prot-2.as | 0 .../tests/regress/correctness/pass/proxy-0.as | 69 +++++++++++++++++++ .../correctness/{ => pass}/register-0.as | 0 .../regress/correctness/{ => pass}/simple.as | 0 .../regress/correctness/{ => pass}/sort.as | 0 .../regress/correctness/{ => pass}/swap.as | 0 .../regress/correctness/{ => pass}/switch1.as | 0 .../regress/correctness/{ => pass}/switch2.as | 0 .../regress/correctness/{ => pass}/type-1.as | 0 .../regress/correctness/{ => pass}/type-2.as | 0 .../correctness/{ => pass}/vectors-1.as | 2 +- .../correctness/{ => pass}/vectors-2.as | 0 .../correctness/{ => pass}/vectors-3.as | 5 +- .../regress/correctness/{ => pass}/vectors.as | 0 .../correctness/{ => pass}/verifier.as | 6 +- 53 files changed, 181 insertions(+), 9 deletions(-) rename src/avm2/tests/regress/correctness/{ => fail}/coerce-1.as (100%) rename src/avm2/tests/regress/correctness/{ => fail}/coerce-2.as (100%) rename src/avm2/tests/regress/correctness/{ => fail}/instance-0.as (100%) rename src/avm2/tests/regress/correctness/{ => fail}/type-0.as (100%) rename src/avm2/tests/regress/correctness/{ => fail}/type-3.as (100%) delete mode 100644 src/avm2/tests/regress/correctness/functions-0.as rename src/avm2/tests/regress/correctness/{ => pass}/arrays-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/arrays.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper2.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper3.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper4.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper5.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper6.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/callsuper7.as (100%) create mode 100644 src/avm2/tests/regress/correctness/pass/classes-1.as rename src/avm2/tests/regress/correctness/{ => pass}/classes.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/closure0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/coerce-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/default.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/dictionary1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/dynamic-0.as (100%) create mode 100644 src/avm2/tests/regress/correctness/pass/flow.as rename src/avm2/tests/regress/correctness/{ => pass}/for-1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/for.as (100%) create mode 100644 src/avm2/tests/regress/correctness/pass/functions-0.as create mode 100644 src/avm2/tests/regress/correctness/pass/interface-0.as rename src/avm2/tests/regress/correctness/{ => pass}/interfaceCast.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/literals-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/many-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/method-closures-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/method-closures-1.as (50%) rename src/avm2/tests/regress/correctness/{ => pass}/names.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/numbers-0.as (100%) create mode 100644 src/avm2/tests/regress/correctness/pass/phi-0.as rename src/avm2/tests/regress/correctness/{ => pass}/play.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/prot-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/prot-1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/prot-2.as (100%) create mode 100644 src/avm2/tests/regress/correctness/pass/proxy-0.as rename src/avm2/tests/regress/correctness/{ => pass}/register-0.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/simple.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/sort.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/swap.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/switch1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/switch2.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/type-1.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/type-2.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/vectors-1.as (96%) rename src/avm2/tests/regress/correctness/{ => pass}/vectors-2.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/vectors-3.as (82%) rename src/avm2/tests/regress/correctness/{ => pass}/vectors.as (100%) rename src/avm2/tests/regress/correctness/{ => pass}/verifier.as (98%) diff --git a/src/avm2/tests/regress/correctness/coerce-1.as b/src/avm2/tests/regress/correctness/fail/coerce-1.as similarity index 100% rename from src/avm2/tests/regress/correctness/coerce-1.as rename to src/avm2/tests/regress/correctness/fail/coerce-1.as diff --git a/src/avm2/tests/regress/correctness/coerce-2.as b/src/avm2/tests/regress/correctness/fail/coerce-2.as similarity index 100% rename from src/avm2/tests/regress/correctness/coerce-2.as rename to src/avm2/tests/regress/correctness/fail/coerce-2.as diff --git a/src/avm2/tests/regress/correctness/instance-0.as b/src/avm2/tests/regress/correctness/fail/instance-0.as similarity index 100% rename from src/avm2/tests/regress/correctness/instance-0.as rename to src/avm2/tests/regress/correctness/fail/instance-0.as diff --git a/src/avm2/tests/regress/correctness/type-0.as b/src/avm2/tests/regress/correctness/fail/type-0.as similarity index 100% rename from src/avm2/tests/regress/correctness/type-0.as rename to src/avm2/tests/regress/correctness/fail/type-0.as diff --git a/src/avm2/tests/regress/correctness/type-3.as b/src/avm2/tests/regress/correctness/fail/type-3.as similarity index 100% rename from src/avm2/tests/regress/correctness/type-3.as rename to src/avm2/tests/regress/correctness/fail/type-3.as diff --git a/src/avm2/tests/regress/correctness/functions-0.as b/src/avm2/tests/regress/correctness/functions-0.as deleted file mode 100644 index 356753006e..0000000000 --- a/src/avm2/tests/regress/correctness/functions-0.as +++ /dev/null @@ -1,3 +0,0 @@ -trace(Math.pow.length); -trace(Math.pow(4, 2)); -trace(Math.pow.length); \ No newline at end of file diff --git a/src/avm2/tests/regress/correctness/arrays-0.as b/src/avm2/tests/regress/correctness/pass/arrays-0.as similarity index 100% rename from src/avm2/tests/regress/correctness/arrays-0.as rename to src/avm2/tests/regress/correctness/pass/arrays-0.as diff --git a/src/avm2/tests/regress/correctness/arrays.as b/src/avm2/tests/regress/correctness/pass/arrays.as similarity index 100% rename from src/avm2/tests/regress/correctness/arrays.as rename to src/avm2/tests/regress/correctness/pass/arrays.as diff --git a/src/avm2/tests/regress/correctness/callsuper1.as b/src/avm2/tests/regress/correctness/pass/callsuper1.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper1.as rename to src/avm2/tests/regress/correctness/pass/callsuper1.as diff --git a/src/avm2/tests/regress/correctness/callsuper2.as b/src/avm2/tests/regress/correctness/pass/callsuper2.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper2.as rename to src/avm2/tests/regress/correctness/pass/callsuper2.as diff --git a/src/avm2/tests/regress/correctness/callsuper3.as b/src/avm2/tests/regress/correctness/pass/callsuper3.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper3.as rename to src/avm2/tests/regress/correctness/pass/callsuper3.as diff --git a/src/avm2/tests/regress/correctness/callsuper4.as b/src/avm2/tests/regress/correctness/pass/callsuper4.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper4.as rename to src/avm2/tests/regress/correctness/pass/callsuper4.as diff --git a/src/avm2/tests/regress/correctness/callsuper5.as b/src/avm2/tests/regress/correctness/pass/callsuper5.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper5.as rename to src/avm2/tests/regress/correctness/pass/callsuper5.as diff --git a/src/avm2/tests/regress/correctness/callsuper6.as b/src/avm2/tests/regress/correctness/pass/callsuper6.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper6.as rename to src/avm2/tests/regress/correctness/pass/callsuper6.as diff --git a/src/avm2/tests/regress/correctness/callsuper7.as b/src/avm2/tests/regress/correctness/pass/callsuper7.as similarity index 100% rename from src/avm2/tests/regress/correctness/callsuper7.as rename to src/avm2/tests/regress/correctness/pass/callsuper7.as diff --git a/src/avm2/tests/regress/correctness/pass/classes-1.as b/src/avm2/tests/regress/correctness/pass/classes-1.as new file mode 100644 index 0000000000..647f1b572a --- /dev/null +++ b/src/avm2/tests/regress/correctness/pass/classes-1.as @@ -0,0 +1,16 @@ +package { + public class A { + function A() { + trace("Construct A"); + } + } + + var a = new A(); + trace("-- SHOULD NOT CONSTRUCT AGAIN --"); + A(a); + A(a); + A(a); + A(a); + A(a); + trace("-- DONE --"); +} diff --git a/src/avm2/tests/regress/correctness/classes.as b/src/avm2/tests/regress/correctness/pass/classes.as similarity index 100% rename from src/avm2/tests/regress/correctness/classes.as rename to src/avm2/tests/regress/correctness/pass/classes.as diff --git a/src/avm2/tests/regress/correctness/closure0.as b/src/avm2/tests/regress/correctness/pass/closure0.as similarity index 100% rename from src/avm2/tests/regress/correctness/closure0.as rename to src/avm2/tests/regress/correctness/pass/closure0.as diff --git a/src/avm2/tests/regress/correctness/coerce-0.as b/src/avm2/tests/regress/correctness/pass/coerce-0.as similarity index 100% rename from src/avm2/tests/regress/correctness/coerce-0.as rename to src/avm2/tests/regress/correctness/pass/coerce-0.as diff --git a/src/avm2/tests/regress/correctness/default.as b/src/avm2/tests/regress/correctness/pass/default.as similarity index 100% rename from src/avm2/tests/regress/correctness/default.as rename to src/avm2/tests/regress/correctness/pass/default.as diff --git a/src/avm2/tests/regress/correctness/dictionary1.as b/src/avm2/tests/regress/correctness/pass/dictionary1.as similarity index 100% rename from src/avm2/tests/regress/correctness/dictionary1.as rename to src/avm2/tests/regress/correctness/pass/dictionary1.as diff --git a/src/avm2/tests/regress/correctness/dynamic-0.as b/src/avm2/tests/regress/correctness/pass/dynamic-0.as similarity index 100% rename from src/avm2/tests/regress/correctness/dynamic-0.as rename to src/avm2/tests/regress/correctness/pass/dynamic-0.as diff --git a/src/avm2/tests/regress/correctness/pass/flow.as b/src/avm2/tests/regress/correctness/pass/flow.as new file mode 100644 index 0000000000..b457ee8c7d --- /dev/null +++ b/src/avm2/tests/regress/correctness/pass/flow.as @@ -0,0 +1,34 @@ +function quickSort(arrayInput, left, right) { + var i = left; + var j = right; + var pivotPoint = arrayInput[Math.round((left+right)*.5)]; + while (i<=j) { + while (arrayInput[i]pivotPoint) { + j--; + } + if (i<=j) { + var tempStore = arrayInput[i]; + arrayInput[i] = arrayInput[j]; + i++; + arrayInput[j] = tempStore; + j--; + } + } + if (left().pop()); trace(new Vector.(1).push("A")); trace(new Vector.(10)[0]); - })(); + }); // TODO: Need to figure out the correct behaviour here. trace("-"); } \ No newline at end of file diff --git a/src/avm2/tests/regress/correctness/vectors-2.as b/src/avm2/tests/regress/correctness/pass/vectors-2.as similarity index 100% rename from src/avm2/tests/regress/correctness/vectors-2.as rename to src/avm2/tests/regress/correctness/pass/vectors-2.as diff --git a/src/avm2/tests/regress/correctness/vectors-3.as b/src/avm2/tests/regress/correctness/pass/vectors-3.as similarity index 82% rename from src/avm2/tests/regress/correctness/vectors-3.as rename to src/avm2/tests/regress/correctness/pass/vectors-3.as index 3c3e988286..55ac184d23 100644 --- a/src/avm2/tests/regress/correctness/vectors-3.as +++ b/src/avm2/tests/regress/correctness/pass/vectors-3.as @@ -1,5 +1,6 @@ package { + trace("Vector."); (function () { var v = new Vector.(); v[0] = "12"; trace(v[0] + " " + typeof (v[0])); @@ -7,6 +8,7 @@ package { v[0] = 1.23; trace(v[0] + " " + typeof (v[0])); })(); + trace("Vector."); (function () { var v = new Vector.(); v[0] = "-12"; trace(v[0] + " " + typeof (v[0])); @@ -14,12 +16,13 @@ package { v[0] = -1.23; trace(v[0] + " " + typeof (v[0])); })(); + trace("Vector."); (function () { var v = new Vector.(); v[0] = 123; trace(v[0] + " " + typeof (v[0])); v[0] = null; trace(v[0] + " " + typeof (v[0])); v[0] = undefined; trace(v[0] + " " + typeof (v[0])); - })(); + }); // TODO: Automatic coercions to specific types are not working yet. trace("DONE"); } \ No newline at end of file diff --git a/src/avm2/tests/regress/correctness/vectors.as b/src/avm2/tests/regress/correctness/pass/vectors.as similarity index 100% rename from src/avm2/tests/regress/correctness/vectors.as rename to src/avm2/tests/regress/correctness/pass/vectors.as diff --git a/src/avm2/tests/regress/correctness/verifier.as b/src/avm2/tests/regress/correctness/pass/verifier.as similarity index 98% rename from src/avm2/tests/regress/correctness/verifier.as rename to src/avm2/tests/regress/correctness/pass/verifier.as index 808bb89c3f..b722bc5e10 100644 --- a/src/avm2/tests/regress/correctness/verifier.as +++ b/src/avm2/tests/regress/correctness/pass/verifier.as @@ -165,7 +165,7 @@ package { trace(v + " " + typeof(v)); } print(new int(-10)); - print(new uint(10)); + // print(new uint(10)); print(new Array(3)); print(new Object()); print(new String("xyz")); @@ -201,7 +201,7 @@ package { } function beforeX(x:X) { - trace(x); + // trace(x); } beforeX(new X()); trace("Before New Class"); @@ -212,6 +212,6 @@ class X { } } function afterX(x:X) { - trace(x); + // trace(x); } afterX(new X()); From a1473376ed28885c3cd9304a3fc021bd66ed40ee Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Sat, 6 Apr 2013 14:44:41 -0700 Subject: [PATCH 3/4] Fix bug in verifier where we weren't looking for setter traits. --- src/avm2/compiler/inferrer.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/avm2/compiler/inferrer.js b/src/avm2/compiler/inferrer.js index 2b16224d51..b917f04327 100644 --- a/src/avm2/compiler/inferrer.js +++ b/src/avm2/compiler/inferrer.js @@ -253,18 +253,20 @@ var TraitsType = (function () { } } - traitsType.prototype.getTrait = function (mn, followSuperType) { + traitsType.prototype.getTrait = function (mn, isSetter, followSuperType) { + assert (arguments.length === 3); + if (followSuperType && this.isInstanceInfo()) { var that = this; do { - var trait = that.getTrait(mn); + var trait = that.getTrait(mn, isSetter, false); if (!trait) { that = that.super(); } } while (!trait && that); return trait; } else { - return findTraitByName(this.traits, mn); + return findTraitByName(this.traits, mn, isSetter); } }; @@ -674,7 +676,8 @@ var Verifier = (function() { // Try to find it in the scope stack. for (var i = scope.length - 1; i >= 0; i--) { if (scope[i] instanceof TraitsType) { - var trait = scope[i].getTrait(mn, true); + // TODO: Should we be looking for getter / setter traits? + var trait = scope[i].getTrait(mn, false, true); if (trait) { ti().scopeDepth = scope.length - i - 1; return scope[i]; @@ -743,7 +746,7 @@ var Verifier = (function() { function getProperty(obj, mn) { if (obj instanceof TraitsType && mn instanceof Multiname) { - var trait = obj.getTrait(mn, true); + var trait = obj.getTrait(mn, false, true); writer && writer.debugLn("getProperty(" + mn + ") -> " + trait); if (trait) { ti().trait = trait; @@ -765,7 +768,7 @@ var Verifier = (function() { function setProperty(obj, mn) { if (obj instanceof TraitsType && mn instanceof Multiname) { - var trait = obj.getTrait(mn, true); + var trait = obj.getTrait(mn, true, true); writer && writer.debugLn("setProperty(" + mn + ") -> " + trait); if (trait) { ti().trait = trait; From 45d8c6fffd86db95a38cca9a33c340c73ca61c4e Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Sat, 6 Apr 2013 15:07:49 -0700 Subject: [PATCH 4/4] Try to keep the same object key enumeration order in the compiler as the interpreter. --- src/avm2/compiler/builder.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/avm2/compiler/builder.js b/src/avm2/compiler/builder.js index 9e5e65ff9d..30241347f7 100644 --- a/src/avm2/compiler/builder.js +++ b/src/avm2/compiler/builder.js @@ -1121,7 +1121,7 @@ var c4TraceLevel = c4Options.register(new Option("tc4", "tc4", "number", 0, "Com var key = pop(); assert (isConstant(key) && isString(key.value)); key = constant(Multiname.getPublicQualifiedName(key.value)); - properties.unshift(new KeyValuePair(key, value)); + properties.push(new KeyValuePair(key, value)); } push(new NewObject(properties)); break;