36
ObjectProperty,
37
ObjectPropertyKey,
38
Place,
39
+ PropertyLiteral,
40
ReturnTerminal,
41
SourceLocation,
42
SpreadPattern,
43
ThrowTerminal,
44
Type,
45
makeInstructionId,
46
+ makePropertyLiteral,
47
makeType,
48
promoteTemporary,
49
} from './HIR';
2019
});
2020
2021
// Save the result back to the property
2020
- if (typeof property === 'string') {
2022
+ if (typeof property === 'string' || typeof property === 'number') {
2023
return {
2024
kind: 'PropertyStore',
2025
object: {...object},
2024
- property,
2026
+ property: makePropertyLiteral(property),
2027
value: {...newValuePlace},
2028
loc: leftExpr.node.loc ?? GeneratedSource,
2029
};
2318
const argument = expr.get('argument');
2319
if (argument.isMemberExpression()) {
2320
const {object, property} = lowerMemberExpression(builder, argument);
2319
- if (typeof property === 'string') {
2321
+ if (typeof property === 'string' || typeof property === 'number') {
2322
return {
2323
kind: 'PropertyDelete',
2324
object,
2323
- property,
2325
+ property: makePropertyLiteral(property),
2326
loc: exprLoc,
2327
};
2328
} else {
2429
2430
// Save the result back to the property
2431
let newValuePlace;
2430
- if (typeof property === 'string') {
2432
+ if (typeof property === 'string' || typeof property === 'number') {
2433
newValuePlace = lowerValueToTemporary(builder, {
2434
kind: 'PropertyStore',
2435
object: {...object},
2434
- property,
2436
+ property: makePropertyLiteral(property),
2437
value: {...updatedValue},
2438
loc: leftExpr.node.loc ?? GeneratedSource,
2439
});
3059
3060
type LoweredMemberExpression = {
3061
object: Place;
3060
- property: Place | string;
3062
+ property: Place | string | number;
3063
value: InstructionValue;
3064
};
3065
function lowerMemberExpression(
3074
const object =
3075
loweredObject ?? lowerExpressionToTemporary(builder, objectNode);
3076
3075
- if (!expr.node.computed) {
3076
- if (!propertyNode.isIdentifier()) {
3077
+ if (!expr.node.computed || expr.node.property.type === 'NumericLiteral') {
3078
+ let property: PropertyLiteral;
3079
+ if (propertyNode.isIdentifier()) {
3080
+ property = makePropertyLiteral(propertyNode.node.name);
3081
+ } else if (propertyNode.isNumericLiteral()) {
3082
+ property = makePropertyLiteral(propertyNode.node.value);
3083
+ } else {
3084
builder.errors.push({
3085
reason: `(BuildHIR::lowerMemberExpression) Handle ${propertyNode.type} property`,
3086
severity: ErrorSeverity.Todo,
3096
const value: InstructionValue = {
3097
kind: 'PropertyLoad',
3098
object: {...object},
3092
- property: propertyNode.node.name,
3099
+ property,
3100
loc: exprLoc,
3101
};
3095
- return {object, property: propertyNode.node.name, value};
3102
+ return {object, property, value};
3103
} else {
3104
if (!propertyNode.isExpression()) {
3105
builder.errors.push({
3217
return lowerValueToTemporary(builder, {
3218
kind: 'PropertyLoad',
3219
object: objectPlace,
3213
- property,
3220
+ property: makePropertyLiteral(property),
3221
loc,
3222
});
3223
}
3633
const lvalue = lvaluePath as NodePath<t.MemberExpression>;
3634
const property = lvalue.get('property');
3635
const object = lowerExpressionToTemporary(builder, lvalue.get('object'));
3629
- if (!lvalue.node.computed) {
3630
- if (!property.isIdentifier()) {
3636
+ if (!lvalue.node.computed || lvalue.get('property').isNumericLiteral()) {
3637
+ let temporary;
3638
+ if (property.isIdentifier()) {
3639
+ temporary = lowerValueToTemporary(builder, {
3640
+ kind: 'PropertyStore',
3641
+ object,
3642
+ property: makePropertyLiteral(property.node.name),
3643
+ value,
3644
+ loc,
3645
+ });
3646
+ } else if (property.isNumericLiteral()) {
3647
+ temporary = lowerValueToTemporary(builder, {
3648
+ kind: 'PropertyStore',
3649
+ object,
3650
+ property: makePropertyLiteral(property.node.value),
3651
+ value,
3652
+ loc,
3653
+ });
3654
+ } else {
3655
builder.errors.push({
3656
reason: `(BuildHIR::lowerAssignment) Handle ${property.type} properties in MemberExpression`,
3657
severity: ErrorSeverity.Todo,
3660
});
3661
return {kind: 'UnsupportedNode', node: lvalueNode, loc};
3662
}
3639
- const temporary = lowerValueToTemporary(builder, {
3640
- kind: 'PropertyStore',
3641
- object,
3642
- property: property.node.name,
3643
- value,
3644
- loc,
3645
- });
3663
return {kind: 'LoadLocal', place: temporary, loc: temporary.loc};
3664
} else {
3665
if (!property.isExpression()) {