[1281] in Coldmud discussion meeting

root meeting help first previous next last

[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++;
         }
     }