Recovered from cvs revision 2007-10-31 13:56:00

This commit is contained in:
hyung-hwan 2007-10-31 22:56:00 +00:00
parent a72a41480a
commit 1debaa5302
4 changed files with 60 additions and 11 deletions

View File

@ -1,9 +1,11 @@
/* /*
* $Id: Context.java,v 1.7 2007/10/29 15:20:13 bacon Exp $ * $Id: Context.java,v 1.8 2007/10/30 15:01:31 bacon Exp $
*/ */
package ase.awk; package ase.awk;
import java.util.Stack;
public class Context public class Context
{ {
public static int GLOBAL_ARGC = 0; public static int GLOBAL_ARGC = 0;
@ -24,15 +26,34 @@ public class Context
public static int GLOBAL_RSTART = 15; public static int GLOBAL_RSTART = 15;
public static int GLOBAL_SUBSEP = 16; public static int GLOBAL_SUBSEP = 16;
private Awk awk; protected Awk awk;
private long runid; protected long runid;
private Object custom; protected Object custom;
protected Stack returnStack;
Context (Awk awk) Context (Awk awk)
{ {
this.awk = awk; this.awk = awk;
this.runid = 0; this.runid = 0;
this.custom = null; this.custom = null;
this.returnStack = new Stack ();
}
void clear ()
{
Return r;
while ((r = popReturn()) != null) r.clear ();
}
void pushReturn (Return ret)
{
returnStack.push (ret);
}
Return popReturn ()
{
if (returnStack.empty()) return null;
return (Return)returnStack.pop ();
} }
public Awk getAwk () public Awk getAwk ()

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Return.java,v 1.5 2007/10/29 15:20:13 bacon Exp $ * $Id: Return.java,v 1.6 2007/10/30 15:01:31 bacon Exp $
*/ */
package ase.awk; package ase.awk;
@ -16,6 +16,7 @@ public class Return
public Return (Context ctx) public Return (Context ctx)
{ {
ctx.pushReturn (this);
this.runid = ctx.getId(); this.runid = ctx.getId();
this.valid = 0; this.valid = 0;
} }
@ -136,7 +137,6 @@ public class Return
setindexedstrval (this.runid, this.valid, Long.toString(index), v); setindexedstrval (this.runid, this.valid, Long.toString(index), v);
} }
public void clear () public void clear ()
{ {
clearval (this.runid, this.valid); clearval (this.runid, this.valid);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: jni.c,v 1.41 2007/10/29 15:20:13 bacon Exp $ * $Id: jni.c,v 1.42 2007/10/30 15:01:31 bacon Exp $
* *
* {License} * {License}
*/ */
@ -121,6 +121,8 @@ struct run_data_t
jmethodID exception_get_line; jmethodID exception_get_line;
jmethodID exception_get_message; jmethodID exception_get_message;
jmethodID context_clear;
jfieldID return_valid; jfieldID return_valid;
jobject context_object; jobject context_object;
@ -725,11 +727,16 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk
env, run_data.exception_class, "getLine", "()I"); env, run_data.exception_class, "getLine", "()I");
run_data.exception_get_message = (*env)->GetMethodID ( run_data.exception_get_message = (*env)->GetMethodID (
env, run_data.exception_class, "getMessage", "()Ljava/lang/String;"); env, run_data.exception_class, "getMessage", "()Ljava/lang/String;");
ASE_ASSERT (run_data.exception_get_code != ASE_NULL); ASE_ASSERT (run_data.exception_get_code != ASE_NULL);
ASE_ASSERT (run_data.exception_get_line != ASE_NULL); ASE_ASSERT (run_data.exception_get_line != ASE_NULL);
ASE_ASSERT (run_data.exception_get_message != ASE_NULL); ASE_ASSERT (run_data.exception_get_message != ASE_NULL);
run_data.context_clear = (*env)->GetMethodID (
env, run_data.context_class, "clear", "()V");
ASE_ASSERT (run_data.context_clear != ASE_NULL);
run_data.return_valid = (*env)->GetFieldID ( run_data.return_valid = (*env)->GetFieldID (
env, run_data.return_class, FIELD_VALID, "J"); env, run_data.return_class, FIELD_VALID, "J");
if (run_data.return_valid == ASE_NULL) if (run_data.return_valid == ASE_NULL)
@ -1710,11 +1717,19 @@ static int handle_bfn (
if (is_debug(awk)) (*env)->ExceptionDescribe (env); if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env); (*env)->ExceptionClear (env);
(*env)->DeleteLocalRef (env, args); (*env)->DeleteLocalRef (env, args);
/* invoke context.clear */
(*env)->CallVoidMethod (env, run_data->context_object, run_data->context_clear);
if ((*env)->ExceptionCheck(env))
{
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
}
/* refdown on ret.valid is needed here */ /* refdown on ret.valid is needed here */
vi = (*env)->GetLongField (env, ret, run_data->return_valid); vi = (*env)->GetLongField (env, ret, run_data->return_valid);
if (vi != 0) ase_awk_refdownval (run, v); if (vi != 0) ase_awk_refdownval (run, v);
(*env)->SetLongField (env, ret, run_data->return_valid,(jlong)0); (*env)->SetLongField (env, ret, run_data->return_valid ,(jlong)0);
(*env)->DeleteLocalRef (env, ret); (*env)->DeleteLocalRef (env, ret);
(*env)->DeleteLocalRef (env, name); (*env)->DeleteLocalRef (env, name);
@ -1798,6 +1813,16 @@ static int handle_bfn (
(*env)->DeleteLocalRef (env, ret); (*env)->DeleteLocalRef (env, ret);
(*env)->DeleteLocalRef (env, name); (*env)->DeleteLocalRef (env, name);
(*env)->CallVoidMethod (env, run_data->context_object, run_data->context_clear);
if ((*env)->ExceptionCheck(env))
{
/* TODO #1: if exception is thrown in clear, it seems to end with a lot of memory leask. PLEASE CHECK THIS */
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
ase_awk_setrunerrnum (run, ASE_AWK_EBFNIMPL);
return -1;
}
return 0; return 0;
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: AseAwkPanel.java,v 1.14 2007/10/29 15:20:13 bacon Exp $ * $Id: AseAwkPanel.java,v 1.15 2007/10/30 15:01:31 bacon Exp $
*/ */
import java.awt.*; import java.awt.*;
@ -114,6 +114,9 @@ public class AseAwkPanel extends Panel
Return r = new Return (ctx); Return r = new Return (ctx);
r.setStringValue ("[[%.6f]]"); r.setStringValue ("[[%.6f]]");
Return r2 = new Return (ctx);
r.setStringValue ("[[%.6f]]");
ctx.setGlobal (Context.GLOBAL_CONVFMT, ret); ctx.setGlobal (Context.GLOBAL_CONVFMT, ret);
} }