mudos解释器中lpc数组==操作的代码分析

4 篇文章 0 订阅

void main()
{
debug_message("%O","hello" == "hello");
debug_message("%O",[1,2]==[1,2]);
}


这段lpc代码会输出什么呢?

我们先从字节码分析吧。

[quote]
STRINGS:
0: a.c
1: %O
2: hello

0000: push string 1, string 2, string 2
0005: ==
0006: debug_message 2
[color=red]0009: push string 1, number 1, number 2
000e: aggregate 2
0011: push number 1, number 2
0015: aggregate 2[/color]
0018: ==
0019: debug_message 2
001c: return_zero
[/quote]

红色的这四行先在栈顶上创建了两个数组。先push数字,再aggregate出数组
aggregate 对应的代码:

{
array_t *v;

LOAD_SHORT(offset, pc);
offset += num_varargs;
num_varargs = 0;
v = allocate_empty_array( (int)offset);
/*
* transfer svalues in reverse...popping stack as we go
*/
while (offset--) {
v->item[offset] = *sp--;
}
(++sp)->type = T_ARRAY;
sp->u.arr = v;
}

num_varargs由F_EXPAND_VARARGS字节码来赋值,用于以下情况

int *i = [1,2];
int *j = [3,i...];

num_varargs就是1

至此两个数组已经创建出来了。
这与Java中的数组创建方式不一样。Java是先分配数组,再根据下标来给分配好的数组赋值。字节码多点,但粒度更细更灵活。
[quote]
0: iconst_2
1: newarray int
3: dup
4: iconst_0
5: bipush 10
7: iastore
8: dup
9: iconst_1
10: bipush 20
12: iastore
[/quote]

接下来就是==字节码了。


void f_eq(){
……
case T_STRING:
{
if (SVALUE_STRLEN_DIFFERS(sp - 1, sp) )
{
i = 0;
}
else
{
i = !strcmp( (sp - 1)->u.string, sp->u.string);
}
free_string_svalue(sp--);
free_string_svalue(sp);
break;
}
case T_ARRAY:
{
i = (sp - 1)->u.arr == sp->u.arr;
free_array( (sp--)->u.arr);
free_array(sp->u.arr);
break;
}
……
}


两个数组==比较,只是比较了地址。所以输出是1 0
但数组在lpc中比较地址,有什么意义呢?python是比较数组内容的,我觉得可以改善一下。

[color=white]作者:翁志艺[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值