File Coverage

blib/lib/PJVM/Runtime/Class.pm
Criterion Covered Total %
statement 15 52 28.8
branch 0 4 0.0
condition n/a
subroutine 5 11 45.4
pod 0 5 0.0
total 20 72 27.7


line stmt bran cond sub pod time code
1             package PJVM::Runtime::Class;
2              
3 4     4   32059 use strict;
  4         8  
  4         137  
4 4     4   21 use warnings;
  4         8  
  4         96  
5              
6 4     4   2203 use PJVM::Types;
  4         10  
  4         156  
7 4     4   1870 use PJVM::Access qw(:flags);
  4         11  
  4         868  
8              
9 4         29 use Object::Tiny qw(
10             qname
11             methods
12             methods_access
13             fields
14             fields_access
15             ee
16 4     4   4569 );
  4         1743  
17              
18             sub new_from_spec {
19 0     0 0   my ($pkg, $runtime, $spec) = @_;
20            
21             # Methods
22 0           my $ee = $runtime->default_execution_engine;
23 0           my (%methods, %methods_access);
24 0           for my $method (@{$spec->methods}) {
  0            
25 0           my $mkey = $method->name . "#" . $method->signature;
26            
27             # Let the engine have a chance to compile this if we want too
28 0           my $cb = $ee->compile($method->code);
29 0 0   0     $methods{$mkey} = ref $cb eq "CODE" ? $cb : sub { $ee->execute($cb) };
  0            
30 0           $methods_access{$mkey} = $method->access_flags;
31             }
32            
33             # Fields
34 0           my (%fields, %fields_access);
35 0           for my $field (@{$spec->fields}) {
  0            
36 0           $fields{$field->name} = $field->signature;
37 0           $fields_access{$field->name} = $field->access_flags;
38             }
39            
40 0           my $self = $pkg->SUPER::new(
41             qname => $spec->name,
42             methods => \%methods,
43             methods_acces => \%methods_access,
44             fields => \%fields,
45             fields_access => \%fields_access,
46             access_flags => $spec->access_flags,
47             );
48            
49 0           return $self;
50             }
51              
52             sub class {
53 0     0 0   my $self = shift;
54 0           return $self;
55             }
56              
57             sub get_method {
58 0     0 0   my ($self, $signature) = @_;
59 0           my $method = $self->{methods}->{$signature};
60 0 0         die "AbstractMethodError" unless $method;
61 0           return $method;
62             }
63             sub static_fields {
64 0     0 0   my $self = shift;
65 0           my $fields = $self->fields;
66 0           my $fields_access = $self->fields_access;
67 0           my %static = map { $_ => $fields->{$_} } grep { $fields_access->{$_} & ACC_STATIC } keys %$fields;
  0            
  0            
68 0           return \%static;
69             }
70              
71             sub instance_fields {
72 0     0 0   my $self = shift;
73 0           my $fields = $self->fields;
74 0           my $fields_access = $self->fields_access;
75 0           my %static = map { $_ => $fields->{$_} } grep { !($fields_access->{$_} & ACC_STATIC) } keys %$fields;
  0            
  0            
76 0           return \%static;
77             }
78              
79             1;
80             __END__