Changeset 244
- Timestamp:
- 09/20/07 18:43:48 (6 years ago)
- Location:
- lang/perl/PlPy/trunk/PlPy
- Files:
-
- 1 added
- 6 modified
-
lib/PlPy.pm (modified) (12 diffs)
-
lib/PlPy/BuiltinClassMethod.pm (added)
-
lib/PlPy/Builtins/int.pm (modified) (2 diffs)
-
lib/PlPy/Builtins/list.pm (modified) (1 diff)
-
lib/PlPy/Builtins/map.pm (modified) (2 diffs)
-
lib/PlPy/Builtins/str.pm (modified) (2 diffs)
-
t/vm_test.t (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/PlPy/trunk/PlPy/lib/PlPy.pm
r239 r244 17 17 use PlPy::Builtins::tuple; 18 18 use PlPy::Builtins::int; 19 20 use PlPy::BuiltinClassMethod; 19 21 20 22 use Inline Python => <<'...'; … … 142 144 my @stack; 143 145 146 debug { "Code is:\n$src" }; 144 147 run_vm($co, \@stack, 0, undef, {}); 145 148 } … … 215 218 216 219 if ($ENV{DEBUG}) { 217 printGREEN, "# @{[ '--' x $call ]} $op_name $oparg", RESET, "\n";220 warn GREEN, "# @{[ '--' x $call ]} $op_name $oparg", RESET, "\n"; 218 221 } 219 222 … … 264 267 case 'LOAD_LOCALS' { 265 268 push @$stack, +{ map { $co->{co_names}->[$_] => $vars[$_] } 0..scalar(@vars)-1 }; 269 } 270 271 case 'UNPACK_SEQUENCE' { 272 debug { "unpack sequence" }; 273 my $tos = $stack->pop; 274 for my $x (@$tos) { 275 $stack->push($x); 276 } 266 277 } 267 278 … … 357 368 my $tos = $stack->pop; 358 369 my $name = $co->{co_names}->[$oparg]; 359 debug { "Replaces TOS($tos) with getattr(TOS($tos), co_names[namei]($name))" }; 360 no strict 'refs'; 361 push @$stack, $tos->__getattr($name); 370 debug { "Replaces TOS($tos) with getattr(TOS(@{[ ref $tos ]} $tos), co_names[namei]($name))" }; 371 if (ref($tos) =~ /^PlPy::Class/) { 372 $stack->push($tos->__getattr($name)); # pushes PlPy::Method instance. 373 } elsif (ref($tos) =~ /^PlPy::Builtins::/) { 374 # builtin class. 375 $stack->push(PlPy::BuiltinClassMethod->new($tos, $name)); 376 } else { 377 die "hmmm... invalid class? @{[ ref $tos ]}"; 378 } 362 379 } 363 380 case 'STORE_ATTR' { … … 380 397 my $w = $stack->pop; 381 398 382 if ( ref $w eq 'PlPy::Builtins::list' ) { 383 push @$stack, $w->[$v]; 384 } 385 elsif ( ref $w eq 'PlPy::Builtins::map' ) { 386 push @$stack, $w->{$v}; 387 } 388 else { 389 die "INVALID TYPE"; 390 } 399 debug { "get item from $w [ $v ] => @{[ $w->__getitem__($v) ]}" }; 400 401 $stack->push( $w->__getitem__($v) ); 391 402 } 392 403 … … 423 434 } 424 435 436 case 'ROT_TWO' { 437 # TOS <=> TOS1 438 my $tos = $stack->pop; 439 my $tos1 = $stack->pop; 440 $stack->push($tos); 441 $stack->push($tos1); 442 } 425 443 case 'ROT_THREE' { 426 444 # TOS TOS1 … … 441 459 my $tos2 = $stack->pop; 442 460 443 if (ref $tos1 eq 'PlPy::Builtins::map') { 444 $tos1->{$tos} = $tos2; 445 } elsif (ref $tos1 eq 'PlPy::Builtins::list') { 446 debug { "$tos1 [ $tos ] = $tos2" }; 447 $tos1->[$tos] = $tos2; 448 } else { 449 die "INVALID TYPE : $tos1"; 450 } 461 $tos1->__setitem__($tos, $tos2); 451 462 } 452 463 … … 495 506 my $kwargs_num = $oparg >> 8 ; # #kwargs 496 507 508 debug { "calling function: the number of arguments: $args_num; kwargs: $kwargs_num" }; 509 497 510 my $func_code = $stack->[scalar(@$stack)-$args_num-($kwargs_num*2)-1]; 511 debug { "FUNC CODE IS $func_code" }; 498 512 my $op_vars; 499 513 … … 502 516 my $orig_func_code = $func_code; 503 517 if (ref $func_code eq 'PlPy::Class') { 518 debug { "constructing class" }; 519 504 520 no strict 'refs'; 505 521 my $f = $func_code->__getattr('__init__'); … … 558 574 } 559 575 576 debug { "OPVARS: @{[ Dumper($op_vars) ]}" }; 577 560 578 # store default arguments 561 579 my @default_args = @{ $func_code->{default_args} || [] }; … … 575 593 }; 576 594 577 run_vm($func_code, $stack, $call+1, $op_vars, $next_global_vars); 595 if ($func_code->isa('PlPy::BuiltinClassMethod')) { 596 debug { "BUILT IN CLASS METHOD" }; 597 my $ret = $func_code->call($op_vars); 598 debug { "ret value is $ret" }; 599 $stack->push($ret); 600 } else { 601 debug { "RUN THE NEXT VM" }; 602 run_vm($func_code, $stack, $call+1, $op_vars, $next_global_vars); 603 } 578 604 579 605 if ($class_fg) { -
lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/int.pm
r222 r244 3 3 use warnings; 4 4 use base qw/PlPy::Builtins::object/; 5 use Digest::MD5; 5 6 6 7 sub new { … … 30 31 sub __cmp__ { my ($self, $other) = @_; ${$self} <=> ${$other} } 31 32 33 sub __hash__ { Digest::MD5::md5_hex(shift) } 34 32 35 1; 33 36 -
lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/list.pm
r222 r244 19 19 } 20 20 21 sub __getitem__ { 22 my ($self, $idx) = @_; 23 return $self->[$idx]; 24 } 25 26 sub __setitem__ { 27 my ($self, $idx, $val) = @_; 28 $self->[$idx] = $val; 29 } 30 21 31 1; 22 32 -
lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/map.pm
r222 r244 4 4 use base qw/PlPy::Builtins::object/; 5 5 use Tie::RefHash; 6 use autobox; 7 use autobox::Core; 8 9 my $name_for; 6 10 7 11 sub new { 8 12 my ($class, ) = @_; 9 my %x; 10 tie %x, 'Tie::RefHash'; 11 bless \%x, $class; 13 bless {}, $class; 12 14 } 13 15 14 16 sub __str__ { 15 17 my $self = shift; 18 16 19 return '{' . join( 17 20 ", ", 18 21 map { 19 $self->___stringify($ _) . " : "22 $self->___stringify($name_for->{$_}) . " : " 20 23 . $self->___stringify( $self->{$_} ) 21 24 } keys %$self … … 25 28 sub __setitem__ { 26 29 my ($self, $key, $val) = @_; 27 $self->{$key} = $val; 30 $name_for->{$key->__hash__} = $key; 31 $self->{$key->__hash__} = $val; 32 } 33 34 sub __getitem__ { 35 my ($self, $key) = @_; 36 return $self->{$key->__hash__}; 37 } 38 39 sub keys { 40 my ($self, ) = @_; 41 return PlPy::Builtins::list->new([map { $name_for->{$_} } keys %$self]); 28 42 } 29 43 -
lang/perl/PlPy/trunk/PlPy/lib/PlPy/Builtins/str.pm
r222 r244 4 4 use base qw/PlPy::Builtins::object/; 5 5 use Scalar::Util qw/reftype/; 6 use Digest::MD5; 6 7 7 8 sub new { … … 21 22 } 22 23 24 # This is dummy ;-( 25 sub __hash__ { 26 my $self = shift; 27 Digest::MD5::md5_hex($self); 28 } 29 23 30 1; 24 31 -
lang/perl/PlPy/trunk/PlPy/t/vm_test.t
r240 r244 21 21 # raise. 22 22 # builtin functions. 23 # break statement. 24 # continue statement. 23 # builtin class methods. 25 24 # yield 26 # dictionary should contain the object.25 # error handling 27 26 # use Class::MOP. 28 27 29 28 __END__ 30 29 30 === Array.__setitem__ 31 --- SKIP 32 --- input 33 a=['fuga'] 34 a.__setitem__(0, 'hoge') 35 print a 36 --- expected 37 hoge 38 39 === builtin functions abs 40 --- SKIP 41 --- input 42 print abs(3) 43 print -4 44 print abs(-4) 45 --- expected 46 3 47 -4 48 4 49 31 50 === simple 32 51 --- input … … 48 67 49 68 === String.__str__ 50 --- SKIP51 69 --- input 52 70 print "FOO".__str__() … … 443 461 --- expected 444 462 CONSTRUCTOR 463 464 === Dict.keys 465 --- input 466 print {'foo':'bar', 'moe':'nae'}.keys() 467 --- expected 468 ['moe', 'foo'] 445 469 446 470 === call constructor with argument … … 645 669 [4, 5] 646 670 671 === Foo.lower() 672 --- input 673 print "FOO".lower() 674 print "Foo".lower() 675 print "foO".lower() 676 print "foo".lower() 677 --- expected 678 foo 679 foo 680 foo 681 foo 682
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)