internal override void GenCode0(CodeGenContext context) { // hash = new Hash(); context.newobj(Runtime.Hash.ctor); int hash = context.StoreInTemp("hash", Runtime.HashRef, location); Node entry = elements; while (entry != null) { bool key_created, value_created; ISimple key = context.PreCompute0(entry, "key", out key_created); entry = entry.nd_next; ISimple value = context.PreCompute0(entry, "value", out value_created); entry = entry.nd_next; // hash.Add(key, value); context.ldloc(hash); key.GenSimple(context); value.GenSimple(context); context.callvirt(Runtime.Hash.Add); context.ReleaseLocal(key, key_created); context.ReleaseLocal(value, value_created); } context.ldloc(hash); context.ReleaseLocal(hash, true); }
internal override ISimple GenArgList(CodeGenContext context, out bool created) { bool single = true; // ArgList arglist = new ArgList(); context.newobj(Runtime.ArgList.ctor); int arglist = context.StoreInTemp("arglist", Runtime.ArgListRef, location); int added = 0; for (Node arg = parameters; arg != null; arg = arg.nd_next) { //object argument = arg; bool argument_created; ISimple argument = context.PreCompute0(arg, "arg", out argument_created); // arglist.Add(argument); context.ldloc(arglist); argument.GenSimple(context); context.callvirt(Runtime.ArgList.Add); added++; context.ReleaseLocal(argument, argument_created); } if (added != 1) single = false; if (hashlist != null) { // object hash = hashlist; bool hash_created; ISimple hash = context.PreCompute(new HASH(hashlist, hashlist.location), "hashlist", out hash_created); // arglist.Add(hash); context.ldloc(arglist); hash.GenSimple(context); context.callvirt(Runtime.ArgList.Add); single = false; context.ReleaseLocal(hash, hash_created); } if (array != null) { // object list = array; bool list_created; ISimple list = context.PreCompute(array, "array", out list_created); // arglist.AddArray(list, caller); context.ldloc(arglist); list.GenSimple(context); context.ldloc(0); context.callvirt(Runtime.ArgList.AddArray); single = false; context.ReleaseLocal(list, list_created); } if (block != null) { // object b = block; bool b_created; ISimple b = context.PreCompute(block, "block", Runtime.ProcRef, out b_created); // arglist.block = b; context.ldloc(arglist); b.GenSimple(context); context.stfld(Runtime.ArgList.block); context.ReleaseLocal(b, b_created); } if (single) { context.ldloc(arglist); context.PushTrue(); context.stfld(Runtime.ArgList.single_arg); } created = true; return new LOCAL(arglist, location); }
internal override List<ISimple> GenFixedArgs(CodeGenContext context, out List<bool> created) { List<ISimple> fixed_args = new List<ISimple>(); created = new List<bool>(); if (block != null) { bool b_created; fixed_args.Add(context.PreCompute(block, "block", Runtime.ProcRef, out b_created)); created.Add(b_created); } else { fixed_args.Add(new AST.NIL(location)); created.Add(false); } for (Node arg = parameters; arg != null; arg = arg.nd_next) { //object argument = arg; bool argument_created; fixed_args.Add(context.PreCompute0(arg, "arg", out argument_created)); created.Add(argument_created); } return fixed_args; }