Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #224 from timo/nativeattr_buildplan
buildplan operations for native attributes
  • Loading branch information
FROGGS committed Oct 28, 2013
2 parents a7f7522 + 6c853ea commit 17ecfcc
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/Perl6/Metamodel/BUILDPLAN.nqp
Expand Up @@ -12,6 +12,9 @@ role Perl6::Metamodel::BUILDPLAN {
# 2 class name attr_name = try to find initialization value, or set nqp::list()
# 3 class name attr_name = try to find initialization value, or set nqp::hash()
# 4 class attr_name code = call default value closure if needed
# 5 class name attr_name = set a native int attribute
# 6 class name attr_name = set a native num attribute
# 7 class name attr_name = set a native str attribute
method create_BUILDPLAN($obj) {
# First, we'll create the build plan for just this class.
my @plan;
Expand All @@ -31,7 +34,13 @@ role Perl6::Metamodel::BUILDPLAN {
if $_.has_accessor {
my $attr_name := $_.name;
my $name := nqp::substr($attr_name, 2);
@plan[+@plan] := [1, $obj, $name, $attr_name];
my $typespec := nqp::objprimspec($_.type);
if $typespec == 1 || $typespec == 2 || $typespec == 3 {
@plan[+@plan] := [nqp::add_i(4, $typespec),
$obj, $name, $attr_name];
} else {
@plan[+@plan] := [1, $obj, $name, $attr_name];
}
}
}
}
Expand Down
91 changes: 91 additions & 0 deletions src/core/Mu.pm
Expand Up @@ -123,6 +123,27 @@ my class Mu { # declared in BOOTSTRAP
$attr = nqp::atpos($task, 3)(self, $attr);
}
}
elsif nqp::iseq_i($code, 5) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_i(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 6) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_n(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 7) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_s(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
else {
die "Invalid BUILDALLPLAN";
}
Expand Down Expand Up @@ -177,6 +198,27 @@ my class Mu { # declared in BOOTSTRAP
$attr = nqp::atpos($task, 3)(self, $attr);
}
}
elsif nqp::iseq_i($code, 5) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_i(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 6) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_n(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 7) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_s(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
else {
die "Invalid BUILDALLPLAN";
}
Expand Down Expand Up @@ -237,6 +279,34 @@ my class Mu { # declared in BOOTSTRAP
$attr = nqp::atpos($task, 3)(self, $attr);
}
}
elsif nqp::iseq_i($code, 5) || nqp::iseq_i($code, 6) || nqp::iseq_i($code, 7) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 5) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_i(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 6) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_n(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 7) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_s(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
else {
die "Invalid BUILDALLPLAN";
}
Expand Down Expand Up @@ -288,6 +358,27 @@ my class Mu { # declared in BOOTSTRAP
$attr = nqp::atpos($task, 3)(self, $attr);
}
}
elsif nqp::iseq_i($code, 5) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_i(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 6) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_n(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
elsif nqp::iseq_i($code, 7) {
my $key_name := nqp::p6box_s(nqp::atpos($task, 2));
if %attrinit.exists_key($key_name) {
nqp::bindattr_s(self, nqp::atpos($task, 1), nqp::atpos($task, 3),
nqp::decont(%attrinit{$key_name}));
}
}
else {
die "Invalid BUILDALLPLAN";
}
Expand Down

0 comments on commit 17ecfcc

Please sign in to comment.