Skip to content

Commit

Permalink
Rebootstrap; redo categoricals for new role setup
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jan 28, 2012
1 parent ddbbcc4 commit a325d40
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 40 deletions.
2 changes: 1 addition & 1 deletion FETCH_URL
@@ -1 +1 @@
https://github.com/downloads/sorear/niecza/niecza-13.zip
https://github.com/downloads/sorear/niecza/niecza-13.90.zip
15 changes: 14 additions & 1 deletion lib/Builtins.cs
Expand Up @@ -2652,12 +2652,25 @@ class CrossSource: ItemSource {
}

public static Variable enum_mixin_role(string name, P6any meth) {
STable r = new STable("ANON");
STable r = new STable('{' + name + '}');
r.mo.FillRole(new STable[0], null);
r.typeObject = r.initObject = new P6opaque(r);
r.typeVar = r.initVar = Kernel.NewROScalar(r.typeObject);
r.mo.AddMethod(0, name, meth);
r.mo.Revalidate();
r.SetupVTables();
return r.typeVar;
}

// TODO: merge
public static Variable cat_mixin_role(string name, P6any meth) {
STable r = new STable('{' + name + '}');
r.mo.FillRole(new STable[0], null);
r.typeObject = r.initObject = new P6opaque(r);
r.typeVar = r.initVar = Kernel.NewROScalar(r.typeObject);
r.mo.AddMethod(P6how.M_MULTI, name, meth);
r.mo.Revalidate();
r.SetupVTables();
return r.typeVar;
}

Expand Down
2 changes: 1 addition & 1 deletion src/CgOp.pm6
Expand Up @@ -11,7 +11,7 @@ method _register_ops(*@ops) {
my $fnc = anon sub CgOperator (\|@parcel) {
Q:CgOp {
(letn arr {[@parcel]}
items (getslot items vvarlist (@ (l arr)))
items (getslot List $!items vvarlist (@ (l arr)))
(sink (vvarlist_shift (l items)))
(vvarlist_unshift (l items) {$name})
(l arr))
Expand Down
3 changes: 3 additions & 0 deletions src/NieczaBackendDotnet.pm6
Expand Up @@ -74,6 +74,9 @@ method new(*%_) {
sub downcall(*@args) {
Q:CgOp { (rawscall Niecza.Downcaller,CompilerBlob.DownCall {@args}) }
}
method make_role($name, $meth) {
Q:CgOp { (cat_mixin_role (obj_getstr {$name}) (@ {$meth})) }
}
method cached_but($cls, $role) {
# TODO: Object hashes!
Expand Down
61 changes: 24 additions & 37 deletions src/NieczaFrontendSTD.pm6
Expand Up @@ -72,27 +72,6 @@ method balanced ($start,$stop) { self.mixin( rolecache("B$start\0$stop", {STD::s
method unbalanced ($stop) { self.mixin( rolecache("U$stop", {STD::stop[$stop]}) ); }
method unitstop ($stop) { self.mixin( rolecache("N$stop", {STD::unitstop[$stop]}) ); }

# MOP will be used to install $*rx into appropriate method field
role sym_categorical[$name,$cat,$sym] {
$*name = $name;
$*rxm = anon token sym_categorical () {
$sym $<sym>={$sym} $<name>={$name}
$<O>={ self.cat_O($cat, $sym) }
}
}

role bracket_categorical[$name,$cat,$sym1,$sym2] {
$*name = $name;
$*rxm = anon token bracket_categorical () {
:my $*GOAL := $sym2;
$sym1 {}:s
$<name>={$name}
[ :lang($¢.unbalanced($sym2)) <semilist> ]
[ $sym2 || <.FAILGOAL($sym2, $name, self.pos)> ]
$<O>={ self.cat_O($cat, "$sym1 $sym2") } $<sym>={ [$sym1,$sym2] }
}
}

method add_categorical($name) {
state %cat_cache;

Expand All @@ -109,28 +88,36 @@ method add_categorical($name) {
return self.cursor_fresh(%*LANG<MAIN>);
}

my $cat = ~$0;
my $sym = ~$1;
my ($role, $*rxm, $*name);
my $cat ::= ~$0;
my $sym ::= ~$1;
my $role;
# need these readonly for proper LTM

if $sym ~~ /\s+/ {
my $sym1 = $sym.substr(0, $/.from);
my $sym2 = $sym.substr($/.to, $sym.chars - $/.to);
$role = OUR::bracket_categorical["{$cat}:sym<$sym1 $sym2>",
$cat, $sym1, $sym2];
my $sym1 ::= $sym.substr(0, $/.from);
my $sym2 ::= $sym.substr($/.to, $sym.chars - $/.to);
my $mname = "{$cat}:sym<$sym1 $sym2>";

my $meth = anon token bracket_categorical () {
:my $*GOAL := $sym2;
$sym1 {}:s
$<name>={$mname}
[ :lang($¢.unbalanced($sym2)) <semilist> ]
[ $sym2 || <.FAILGOAL($sym2, $mname, self.pos)> ]
$<O>={ self.cat_O($cat, "$sym1 $sym2") } $<sym>={ [$sym1,$sym2] }
}

$role = $Backend.make_role($mname, $meth);
} else {
$role = OUR::sym_categorical["{$cat}:sym<$sym>", $cat, $sym];
my $mname = "{$cat}:sym<$sym>";
my $meth = anon token sym_categorical () {
$sym $<sym>={$sym} $<name>={$mname}
$<O>={ self.cat_O($cat, $sym) }
}
$role = $Backend.make_role($mname, $meth);
}
%cat_cache{$name} := $role;

# $*name will be set if the role blocks are run. If $*name is not set,
# then a cached role was reused and there is no need to fix up method names.
if defined $*name {
Q:CgOp { (rnull (_addmethod (obj_llhow (@ {$role})) 8
(obj_getstr {$*name}) (@ {$*rxm}))) };
Q:CgOp { (rnull (_invalidate (obj_llhow (@ {$role})))) };
}

%*LANG<MAIN> = $Backend.cached_but(self.WHAT, $role);
self.cursor_fresh(%*LANG<MAIN>);
}
Expand Down

0 comments on commit a325d40

Please sign in to comment.