diff --git a/ts2panda/src/compilerUtils.ts b/ts2panda/src/compilerUtils.ts index 79979cf0e04016401c0dac217158f55fbc68e78d..992bcfd8dda57a927786b33aa1acaab959943649 100644 --- a/ts2panda/src/compilerUtils.ts +++ b/ts2panda/src/compilerUtils.ts @@ -276,12 +276,14 @@ function compileObjectDestructuring(obj: ts.ObjectBindingOrAssignmentPattern, pa } // create before to store the properties - let properties: Array = new Array(); - let excludedProp: Array = new Array(); + let propertiesReg: Array = new Array(); + let properties: Array = new Array(); + let excludedProp: Array = new Array(); for (let i = 0; i < elementsLength; i++) { let tmp = pandaGen.getTemp(); properties.push(tmp); + propertiesReg.push(tmp); } for (let i = 0; i < elementsLength; i++) { @@ -294,7 +296,7 @@ function compileObjectDestructuring(obj: ts.ObjectBindingOrAssignmentPattern, pa break; } - excludedProp.push(properties[i]); + // excludedProp.push(properties[i]); let loadedValue: VReg = pandaGen.getTemp(); let key: ts.Expression | ts.ComputedPropertyName; @@ -342,17 +344,16 @@ function compileObjectDestructuring(obj: ts.ObjectBindingOrAssignmentPattern, pa } // compile key - if (ts.isComputedPropertyName(key)) { - compiler.compileExpression(key.expression); + if (ts.isIdentifier(key)) { + let keyName: string = jshelpers.getTextOfIdentifierOrLiteral(key); + properties[i] = keyName; } else { - if (ts.isIdentifier(key)) { - let keyName = jshelpers.getTextOfIdentifierOrLiteral(key); - pandaGen.loadAccumulatorString(key, keyName); - } else { - compiler.compileExpression(key); - } + ts.isComputedPropertyName(key) ? compiler.compileExpression(key.expression) : + compiler.compileExpression(key); + pandaGen.storeAccumulator(key, properties[i]); } - pandaGen.storeAccumulator(key, properties[i]); + + excludedProp.push(properties[i]); // create left reference let lRef = LReference.generateLReference(compiler, target, isDeclaration); @@ -387,10 +388,10 @@ function compileObjectDestructuring(obj: ts.ObjectBindingOrAssignmentPattern, pa pandaGen.freeTemps(loadedValue); } - pandaGen.freeTemps(value, ...properties); + pandaGen.freeTemps(value, ...propertiesReg); } -function emitRestProperty(restProperty: ts.BindingElement | ts.SpreadAssignment, excludedProp: Array, +function emitRestProperty(restProperty: ts.BindingElement | ts.SpreadAssignment, excludedProp: Array, obj: VReg, pandaGen: PandaGen, compiler: Compiler) { let isDeclaration = ts.isBindingElement(restProperty) ? true : false; let target = isDeclaration ? (restProperty).name : (restProperty).expression; @@ -404,10 +405,23 @@ function emitRestProperty(restProperty: ts.BindingElement | ts.SpreadAssignment, } // Create a Object with the information of excluded properties - pandaGen.createObjectWithExcludedKeys(restProperty, obj, excludedProp); + let namedPropRegs: Array = new Array(); + for (let i = 0; i < excludedProp.length; i++) { + let prop: VReg | string = excludedProp[i]; + if (prop instanceof VReg) { + continue; + } + + let propReg: VReg = pandaGen.getTemp(); + namedPropRegs.push(propReg); + pandaGen.loadAccumulatorString(restProperty, prop); + pandaGen.storeAccumulator(restProperty, propReg); + excludedProp[i] = propReg; + } + pandaGen.createObjectWithExcludedKeys(restProperty, obj, >excludedProp); lRef.setValue(); - pandaGen.freeTemps(undefinedReg); + pandaGen.freeTemps(undefinedReg, ...namedPropRegs); } function isRestElement(node: ts.BindingElement) {