Skip to content

Commit e51bb9f

Browse files
committed
Add support for member access in assembly
1 parent cc2865e commit e51bb9f

File tree

8 files changed

+11988
-5106
lines changed

8 files changed

+11988
-5106
lines changed

package-lock.json

Lines changed: 10419 additions & 3697 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/ASTBuilder.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,8 @@ const transformAST = {
13381338
let names = ctx.assemblyIdentifierOrList()
13391339
if (names.identifier()) {
13401340
names = [this.visit(names.identifier())]
1341+
} else if (names.assemblyMember()) {
1342+
names = [this.visit(names.assemblyMember())]
13411343
} else {
13421344
names = this.visit(names.assemblyIdentifierList().identifier())
13431345
}
@@ -1369,6 +1371,8 @@ const transformAST = {
13691371
let names = ctx.assemblyIdentifierOrList()
13701372
if (names.identifier()) {
13711373
names = [this.visit(names.identifier())]
1374+
} else if (names.assemblyMember()) {
1375+
names = [this.visit(names.assemblyMember())]
13721376
} else {
13731377
names = this.visit(names.assemblyIdentifierList().identifier())
13741378
}
@@ -1379,6 +1383,15 @@ const transformAST = {
13791383
}
13801384
},
13811385

1386+
AssemblyMember(ctx) {
1387+
const [accessed, member] = ctx.identifier()
1388+
return {
1389+
type: 'AssemblyMemberAccess',
1390+
expression: this.visit(accessed),
1391+
memberName: this.visit(member),
1392+
}
1393+
},
1394+
13821395
LabelDefinition(ctx) {
13831396
return {
13841397
name: toText(ctx.identifier())

src/lib/Solidity.interp

Lines changed: 2 additions & 1 deletion
Large diffs are not rendered by default.

src/lib/SolidityLexer.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated from antlr/Solidity.g4 by ANTLR 4.7.2
1+
// Generated from antlr/Solidity.g4 by ANTLR 4.8
22
// jshint ignore: start
33
var antlr4 = require('../antlr4/index');
44

@@ -1417,6 +1417,5 @@ SolidityLexer.prototype.ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4",
14171417
SolidityLexer.prototype.grammarFileName = "Solidity.g4";
14181418

14191419

1420-
14211420
exports.SolidityLexer = SolidityLexer;
14221421

src/lib/SolidityListener.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated from antlr/Solidity.g4 by ANTLR 4.7.2
1+
// Generated from antlr/Solidity.g4 by ANTLR 4.8
22
// jshint ignore: start
33
var antlr4 = require('../antlr4/index');
44

@@ -623,6 +623,15 @@ SolidityListener.prototype.exitAssemblyExpression = function(ctx) {
623623
};
624624

625625

626+
// Enter a parse tree produced by SolidityParser#assemblyMember.
627+
SolidityListener.prototype.enterAssemblyMember = function(ctx) {
628+
};
629+
630+
// Exit a parse tree produced by SolidityParser#assemblyMember.
631+
SolidityListener.prototype.exitAssemblyMember = function(ctx) {
632+
};
633+
634+
626635
// Enter a parse tree produced by SolidityParser#assemblyCall.
627636
SolidityListener.prototype.enterAssemblyCall = function(ctx) {
628637
};

src/lib/SolidityParser.js

Lines changed: 1486 additions & 1405 deletions
Large diffs are not rendered by default.

test/ast.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,6 +1933,54 @@ describe('AST', () => {
19331933
})
19341934
})
19351935

1936+
it("AssemblyAssignment, left member access", function() {
1937+
var ast = parseAssembly("a.slot := 10")
1938+
assert.deepEqual(ast, {
1939+
"type": "AssemblyAssignment",
1940+
"names": [
1941+
{
1942+
"type": "AssemblyMemberAccess",
1943+
"expression": {
1944+
"name": "a",
1945+
"type": "Identifier"
1946+
},
1947+
"memberName": {
1948+
"name": "slot",
1949+
"type": "Identifier"
1950+
}
1951+
}
1952+
],
1953+
"expression": {
1954+
"type": "DecimalNumber",
1955+
"value": "10"
1956+
}
1957+
})
1958+
})
1959+
1960+
it("AssemblyAssignment, right member access", function() {
1961+
var ast = parseAssembly("o := x.offset")
1962+
assert.deepEqual(ast, {
1963+
"type": "AssemblyAssignment",
1964+
"names": [
1965+
{
1966+
"type": "Identifier",
1967+
"name": "o"
1968+
}
1969+
],
1970+
"expression": {
1971+
"type": "AssemblyMemberAccess",
1972+
"expression": {
1973+
"name": "x",
1974+
"type": "Identifier"
1975+
},
1976+
"memberName": {
1977+
"name": "offset",
1978+
"type": "Identifier"
1979+
}
1980+
}
1981+
})
1982+
})
1983+
19361984
it("LabelDefinition", function() {
19371985
var ast = parseAssembly("loop:")
19381986
assert.deepEqual(ast, {

test/test.sol

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,3 +694,12 @@ contract FunctionsNamedAsKeywords {
694694
contract ImmutableKeyword {
695695
uint immutable foo;
696696
}
697+
698+
contract AssemblySlotNotation {
699+
function foo() {
700+
assembly {
701+
ds.slot := position
702+
offset := x.offset
703+
}
704+
}
705+
}

0 commit comments

Comments
 (0)