null);
sb.append(EOBJECT_DESC);
}
sb.append(")V");
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", sb.toString(),
null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
if (exported) {
mv.visitLdcInsn(module_name);
mv.visitLdcInsn(function_name);
mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>",
"(Ljava/lang/String;Ljava/lang/String;)V");
} else {
mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V");
}
if (lambda != null) {
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, 1);
mv.visitFieldInsn(PUTFIELD, full_inner_name, "pid",
EPID_TYPE.getDescriptor());
}
for (int i = 0; i < freevars; i++) {
mv.visitVarInsn(ALOAD, 0);
mv.visitVarInsn(ALOAD, i + 2);
mv.visitFieldInsn(PUTFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);
}
mv.visitInsn(RETURN);
mv.visitMaxs(3, 3);
mv.visitEnd();
if (lambda != null) {
mv = cw.visitMethod(ACC_PROTECTED, "get_env", "()" + ESEQ_DESC,
null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC, ERT_NAME, "NIL",
ENIL_TYPE.getDescriptor());
for (int i = freevars - 1; i >= 0; i--) {
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i,
EOBJECT_DESC);
mv.visitMethodInsn(INVOKEVIRTUAL, ESEQ_NAME, "cons", "("
+ EOBJECT_DESC + ")" + ESEQ_DESC);
}
mv.visitInsn(ARETURN);
mv.visitMaxs(3, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PROTECTED, "get_pid", "()" + EOBJECT_DESC,
null, null);
mv.visitCode();
mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, full_inner_name, "pid",
EPID_TYPE.getDescriptor());
mv.visitInsn(ARETURN);
mv.visitMaxs(3, 3);
mv.visitEnd();
mv = cw.visitMethod(ACC_PROTECTED, "get_id",
"()" + Type.getDescriptor(FunID.class), null, null);
mv.visitCode();
mv.visitFieldInsn(GETSTATIC,
outer_name,
anon_fun_name(lambda), Type.getDescriptor(LocalFunID.class));
mv.visitInsn(ARETURN);
mv.visitMaxs(3, 3);
mv.visitEnd();
}
}