From a9206dd6412f8df56fc89f7017f6afde19e4c1d4 Mon Sep 17 00:00:00 2001 From: Jonathan Worthington Date: Wed, 26 Jan 2011 00:15:47 +0100 Subject: [PATCH] Add NQPNativeHOW meta-object for native types and native package declarator to go with it. --- build/Makefile.in | 4 +++- src/NQP/Actions.pm | 1 + src/NQP/Grammar.pm | 6 +++++ src/metamodel/how/NQPNativeHOW.pm | 38 +++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/metamodel/how/NQPNativeHOW.pm diff --git a/build/Makefile.in b/build/Makefile.in index 043d3ea..1942203 100644 --- a/build/Makefile.in +++ b/build/Makefile.in @@ -163,7 +163,9 @@ METAMODEL_OBJS = ../metamodel/rakudoobject$(O) ../metamodel/repr_registry$(O) ../metamodel/multi_dispatch$(O) HOW_SOURCES = src/metamodel/how/KnowHOWAttribute.pm src/metamodel/how/NQPClassHOW.pm \ - src/metamodel/how/NQPAttribute.pm src/metamodel/how/NQPMu.pm + src/metamodel/how/NQPNativeHOW.pm src/metamodel/how/NQPAttribute.pm \ + src/metamodel/how/NQPMu.pm + HOW_COMBINED = src/gen/how.pm diff --git a/src/NQP/Actions.pm b/src/NQP/Actions.pm index f2c5df8..6d61dd2 100644 --- a/src/NQP/Actions.pm +++ b/src/NQP/Actions.pm @@ -374,6 +374,7 @@ method package_declarator:sym($/) { make package($/); } method package_declarator:sym($/) { make package($/) } method package_declarator:sym($/) { make package($/) } method package_declarator:sym($/) { make package($/); } +method package_declarator:sym($/) { make package($/); } sub package($/) { my @ns := pir::clone__PP($); diff --git a/src/NQP/Grammar.pm b/src/NQP/Grammar.pm index e7a8469..7680d37 100644 --- a/src/NQP/Grammar.pm +++ b/src/NQP/Grammar.pm @@ -14,6 +14,7 @@ method TOP() { %*HOW := 'NQPClassHOW'; %*HOW := 'NQPClassHOW'; %*HOW := 'NQPRoleHOW'; + %*HOW := 'NQPNativeHOW'; # What attribute class to use with what HOW, plus a default. my $*DEFAULT-METAATTR := 'NQPAttribute'; @@ -298,6 +299,11 @@ token package_declarator:sym { :my $*PKGDECL := 'role'; } +token package_declarator:sym { + :my $*PACKAGE-SETUP := PAST::Stmts.new(); + :my $*PKGDECL := 'native'; + +} rule package_def { diff --git a/src/metamodel/how/NQPNativeHOW.pm b/src/metamodel/how/NQPNativeHOW.pm new file mode 100644 index 0000000..b44f1e2 --- /dev/null +++ b/src/metamodel/how/NQPNativeHOW.pm @@ -0,0 +1,38 @@ +knowhow NQPNativeHOW { + has $!name; + has $!composed; + + method new(:$name) { + my $obj := pir::repr_instance_of__PP(self); + $obj.BUILD(:name($name)); + $obj + } + + method BUILD(:$name) { + $!name := $name; + } + + # Create a new meta-class instance, and then a new type object + # to go with it, and return that. + # XXX Should check that this is an inlineable REPR. + method new_type(:$name = '', :$repr!) { + my $metaclass := self.new(:name($name)); + pir::repr_type_object_for__PPS($metaclass, $repr); + } + + method add_method($obj, $name, $code_obj) { + pir::die("Native types may not have methods (must be boxed to call method)"); + } + + method add_multi_method($obj, $name, $code_obj) { + pir::die("Native types may not have methods (must be boxed to call method)"); + } + + method add_attribute($obj, $meta_attr) { + pir::die("Native types may not have attributes"); + } + + method compose($obj) { + $!composed := 1; + } +}