[1281] in Coldmud discussion meeting
[COLD] [patch] method_bytecode
daemon@ATHENA.MIT.EDU (Mon Apr 21 09:53:18 1997
)
Date: Mon, 21 Apr 1997 15:48:11 +0200 (MET DST)
From: Miroslav Silovic <silovic@mare.zesoi.fer.hr>
To: coldstuff@cold.org
This fixes all method_bytecode problems known to me.
--- orig/Genesis-1.0p27/src/ops/object.c Thu Apr 10 22:06:33 1997
+++ Genesis-1.0p27/src/ops/object.c Mon Apr 21 15:45:51 1997
@@ -896,7 +896,8 @@
push_int(cur_frame->object->objnum);
}
-INTERNAL cList * add_op_arg(cList * out, Int type, Long op, Obj * obj) {
+INTERNAL cList * add_op_arg(cList * out, Int type, Long op, Obj * obj,
+ Method * method) {
cData d;
switch (type) {
@@ -913,10 +914,35 @@
d.u.error = object_get_ident(obj, op);
break;
case IDENT:
- case VAR:
d.type = SYMBOL;
d.u.symbol = object_get_ident(obj, op);
break;
+ case VAR: {
+ Long id;
+
+ d.type = SYMBOL;
+
+ if (op < method->num_args) {
+ op = method->num_args - op - 1;
+ id = object_get_ident(obj, method->argnames[op]);
+ d.u.symbol = id;
+ break;
+ }
+ op -= method->num_args;
+
+ if (method->rest != -1) {
+ if (op == 0) {
+ id = object_get_ident(obj, method->rest);
+ d.u.symbol = id;
+ break;
+ }
+ op--;
+ }
+
+ id = object_get_ident(obj, method->varnames[op]);
+ d.u.symbol = id;
+ break;
+ }
case STRING:
d.type = STRING;
d.u.str = object_get_string(obj, op);
@@ -971,12 +997,14 @@
x++;
if (info->arg1) {
- list = add_op_arg(list, info->arg1, ops[x], method->object);
+ list = add_op_arg(list, info->arg1, ops[x], method->object,
+ method);
x++;
}
if (info->arg2) {
- list = add_op_arg(list, info->arg1, ops[x], method->object);
+ list = add_op_arg(list, info->arg1, ops[x], method->object,
+ method);
x++;
}
}