1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
use lang:bs;
use lang:bs:macro;
use core:lang;
use core:asm;
use lang:bnf;
/**
* An array of regular expressions stored as a literal.
*/
package class RegexArray extends Expr {
private Regex[] data;
init(Regex[] data) {
init(SrcPos()) { data = data; }
}
ExprResult result() {
ExprResult(Value(named{Regex[]}));
}
void code(CodeGen state, CodeResult result) {
if (result.needed) {
var v = result.location(state);
state.l << mov(v, objPtr(data));
result.created(state);
}
}
Str toS() {
data.toS;
}
}
/**
* A regex stored as a literal.
*/
package class RegexValue extends Expr {
// We store a pointer to this in the code listing.
class RegexClass {
Regex regex;
init(Regex x) {
init { regex = x; }
}
void toS(StrBuf to) {
to << "Regex[\"" << regex << "\"]";
}
}
private RegexClass data;
init(Regex data) {
init(SrcPos()) { data(data); }
}
ExprResult result() {
ExprResult(Value(named{Regex}).asRef());
}
void code(CodeGen state, CodeResult result) {
unless (result.needed)
return;
var offset = named{RegexClass:regex<RegexClass>}.offset;
if (result.type.ref) {
var v = result.location(state);
state.l << mov(v, objPtr(data));
state.l << add(v, ptrConst(offset));
result.created(state);
} else {
var v = result.location(state);
state.l << mov(ptrA, objPtr(data));
state.l << add(ptrA, ptrConst(offset));
state.l << lea(ptrB, v);
state.l << fnParam(ptrDesc, ptrB);
state.l << fnParam(ptrDesc, ptrA);
state.l << fnCall(result.type.copyCtor, false);
}
}
Str toS() {
data.toS;
}
}
|