comparison src/luan/interp/LuaParser.java @ 35:e51906de0f11

implement metatables git-svn-id: https://luan-java.googlecode.com/svn/trunk@36 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Tue, 18 Dec 2012 07:05:58 +0000
parents 0cdc1da466ee
children e3624b7cd603
comparison
equal deleted inserted replaced
34:0cdc1da466ee 35:e51906de0f11
21 import luan.LuaState; 21 import luan.LuaState;
22 22
23 23
24 class LuaParser extends BaseParser<Object> { 24 class LuaParser extends BaseParser<Object> {
25 25
26 static final String _G = "_G";
27 static final String _ENV = "_ENV"; 26 static final String _ENV = "_ENV";
28 27
29 static final class Frame { 28 static final class Frame {
30 final Frame parent; 29 final Frame parent;
31 final List<String> symbols = new ArrayList<String>(); 30 final List<String> symbols = new ArrayList<String>();
35 final List<String> upValueSymbols = new ArrayList<String>(); 34 final List<String> upValueSymbols = new ArrayList<String>();
36 final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>(); 35 final List<UpValue.Getter> upValueGetters = new ArrayList<UpValue.Getter>();
37 36
38 Frame() { 37 Frame() {
39 this.parent = null; 38 this.parent = null;
40 upValueSymbols.add(_G);
41 upValueGetters.add(UpValue.globalGetter);
42 upValueSymbols.add(_ENV); 39 upValueSymbols.add(_ENV);
43 upValueGetters.add(UpValue.globalGetter); 40 upValueGetters.add(UpValue.globalGetter);
44 } 41 }
45 42
46 Frame(Frame parent) { 43 Frame(Frame parent) {
671 Object obj2 = pop(); 668 Object obj2 = pop();
672 if( obj2==null ) 669 if( obj2==null )
673 return true; 670 return true;
674 Object obj1 = pop(); 671 Object obj1 = pop();
675 if( obj1 != null ) 672 if( obj1 != null )
676 return push( new GetExpr( expr(obj1), expr(obj2) ) ); 673 return push( new IndexExpr( expr(obj1), expr(obj2) ) );
677 String name = (String)obj2; 674 String name = (String)obj2;
678 int index = stackIndex(name); 675 int index = stackIndex(name);
679 if( index != -1 ) 676 if( index != -1 )
680 return push( new GetLocalVar(index) ); 677 return push( new GetLocalVar(index) );
681 index = upValueIndex(name); 678 index = upValueIndex(name);
682 if( index != -1 ) 679 if( index != -1 )
683 return push( new GetUpVar(index) ); 680 return push( new GetUpVar(index) );
684 return push( new GetExpr( env(), new ConstExpr(name) ) ); 681 return push( new IndexExpr( env(), new ConstExpr(name) ) );
685 } 682 }
686 683
687 // function should be on top of the stack 684 // function should be on top of the stack
688 Rule Args() { 685 Rule Args() {
689 return Sequence( 686 return Sequence(