Mercurial Hosting > luan
comparison core/src/luan/impl/IndexExpr.java @ 502:d3183a330ff5
improve the __index metamethod to work with any type;
simplify luan_proxy to eliminate base;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 19 May 2015 17:57:20 -0600 |
parents | b48cfa14ba60 |
children | 2da0bcb979b5 |
comparison
equal
deleted
inserted
replaced
501:f26485a3692c | 502:d3183a330ff5 |
---|---|
1 package luan.impl; | 1 package luan.impl; |
2 | 2 |
3 import luan.Luan; | |
4 import luan.LuanException; | 3 import luan.LuanException; |
5 import luan.LuanTable; | 4 import luan.LuanTable; |
6 import luan.LuanFunction; | |
7 import luan.LuanElement; | 5 import luan.LuanElement; |
8 import luan.LuanMeta; | |
9 import luan.modules.StringLuan; | |
10 import luan.modules.BinaryLuan; | |
11 import luan.modules.JavaLuan; | |
12 | 6 |
13 | 7 |
14 final class IndexExpr extends BinaryOpExpr { | 8 final class IndexExpr extends BinaryOpExpr { |
15 | 9 |
16 IndexExpr(LuanElement el,Expr op1,Expr op2) { | 10 IndexExpr(LuanElement el,Expr op1,Expr op2) { |
17 super(el,op1,op2); | 11 super(el,op1,op2); |
18 } | 12 } |
19 | 13 |
20 @Override public Object eval(LuanStateImpl luan) throws LuanException { | 14 @Override public Object eval(LuanStateImpl luan) throws LuanException { |
21 return index(luan,op1.eval(luan),op2.eval(luan)); | 15 return LuanTable.index( luan.bit(op1.el()), op1.eval(luan), op2.eval(luan) ); |
22 } | 16 } |
23 | 17 |
24 private Object index(LuanStateImpl luan,Object obj,Object key) throws LuanException { | |
25 if( obj instanceof LuanTable ) { | |
26 LuanTable tbl = (LuanTable)obj; | |
27 return tbl.get(luan,key); | |
28 } | |
29 if( obj instanceof String ) | |
30 return StringLuan.__index(luan,(String)obj,key); | |
31 if( obj instanceof byte[] ) | |
32 return BinaryLuan.__index(luan,(byte[])obj,key); | |
33 if( obj != null && luan.currentEnvironment().hasJava() ) | |
34 return JavaLuan.__index(luan,obj,key); | |
35 else | |
36 throw luan.bit(op1.el()).exception( "attempt to index '"+op1.el().text()+"' (a " + Luan.type(obj) + " value)" ); | |
37 } | |
38 } | 18 } |