Mercurial Hosting > luan
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( |