Skip to content

Commit

Permalink
Implement Mu.new, which sets up attributes automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jul 25, 2010
1 parent 607036c commit 67aa90a
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CORE.setting
Expand Up @@ -383,6 +383,12 @@ PRE-INIT {
(getfield klass (cast DynObject (@ (l self))))]
[l $obj])
} });
Mu.HOW.add-method(Q:CgOp { (w (clr_string "CREATE")) },
anon method CREATE() { Q:CgOp {
(rawscall Kernel.DefaultNew (@ (l self))) } });
Mu.HOW.add-method(Q:CgOp { (w (clr_string "new")) },
anon method new() { Q:CgOp {
(rawscall Kernel.DefaultNew (@ (l self))) } });

Any.HOW.add-method(Q:CgOp { (w (clr_string "flat")) },
anon method flat() { self, });
Expand Down
1 change: 1 addition & 0 deletions CodeGen.pm
Expand Up @@ -54,6 +54,7 @@ use 5.010;
'Kernel.Bind' => [c => 'Void'],
'Kernel.Assign' => [c => 'Void'],
'Kernel.Fetch' => [c => 'IP6'],
'Kernel.DefaultNew' => [m => 'Variable'],
'Kernel.NewROScalar' => [m => 'Variable'],
'Kernel.NewRWScalar' => [m => 'Variable'],
'Kernel.NewRWListVar' => [m => 'Variable'],
Expand Down
13 changes: 13 additions & 0 deletions Kernel.cs
Expand Up @@ -622,6 +622,19 @@ public class Kernel {
return th;
}

public static Variable DefaultNew(IP6 proto) {
DynObject n = new DynObject(((DynObject)proto).klass);
List<DynMetaObject> mro = n.klass.mro;

for (int i = mro.Count - 1; i >= 0; i--) {
foreach (string s in mro[i].local_attr.Keys) {
n.slots[s] = NewRWScalar(AnyP);
}
}

return NewROScalar(n);
}

public static IP6 AnyP;

public static Frame PackageLookup(Frame th, IP6 parent,
Expand Down

0 comments on commit 67aa90a

Please sign in to comment.