2020-01-26 23:33:47 +01:00
|
|
|
// Copyright (c) 2019-2020 Alexander Medvednikov. All rights reserved.
|
2019-11-16 22:58:09 +01:00
|
|
|
// Use of this source code is governed by an MIT license
|
|
|
|
// that can be found in the LICENSE file.
|
|
|
|
module compiler
|
|
|
|
|
|
|
|
fn (p mut Parser) inline_asm() {
|
|
|
|
if !p.inside_unsafe {
|
2019-11-19 07:43:02 +01:00
|
|
|
p.error('asm() needs to be run inside `unsafe {}`')
|
2019-12-19 22:29:37 +01:00
|
|
|
}
|
2019-11-16 22:58:09 +01:00
|
|
|
p.next()
|
2019-11-18 02:53:46 +01:00
|
|
|
p.check(.lcbr)
|
2019-11-16 22:58:09 +01:00
|
|
|
s := p.check_string()
|
|
|
|
p.genln('asm("$s"')
|
2020-03-15 00:46:08 +01:00
|
|
|
for p.tok == .string{
|
2019-11-16 22:58:09 +01:00
|
|
|
p.genln('"$p.lit"')
|
|
|
|
p.next()
|
2019-12-19 22:29:37 +01:00
|
|
|
}
|
2019-11-16 22:58:09 +01:00
|
|
|
for p.tok == .colon {
|
|
|
|
p.next()
|
|
|
|
arg := p.check_string()
|
|
|
|
p.gen(': "$arg"')
|
|
|
|
if p.tok == .lpar {
|
|
|
|
p.next()
|
|
|
|
var_name := p.check_name()
|
|
|
|
if !p.known_var(var_name) {
|
|
|
|
p.error('unknown variable `$var_name`')
|
2019-12-19 22:29:37 +01:00
|
|
|
}
|
2019-11-16 22:58:09 +01:00
|
|
|
p.check(.rpar)
|
|
|
|
p.genln('($var_name)')
|
2019-12-19 22:29:37 +01:00
|
|
|
}
|
|
|
|
}
|
2019-11-16 22:58:09 +01:00
|
|
|
p.genln(');')
|
2019-11-18 02:53:46 +01:00
|
|
|
p.check(.rcbr)
|
2019-12-19 22:29:37 +01:00
|
|
|
}
|
|
|
|
|