Recovered from cvs revision 2007-10-30 03:08:00

This commit is contained in:
hyung-hwan 2007-10-31 00:01:00 +00:00
parent 8ca13ac266
commit a72a41480a
4 changed files with 78 additions and 7 deletions

View File

@ -1,11 +1,29 @@
/* /*
* $Id: Context.java,v 1.6 2007/10/17 14:38:28 bacon Exp $ * $Id: Context.java,v 1.7 2007/10/29 15:20:13 bacon Exp $
*/ */
package ase.awk; package ase.awk;
public class Context public class Context
{ {
public static int GLOBAL_ARGC = 0;
public static int GLOBAL_ARGV = 1;
public static int GLOBAL_CONVFMT = 2;
public static int GLOBAL_FILENAME = 3;
public static int GLOBAL_FNR = 4;
public static int GLOBAL_FS = 5;
public static int GLOBAL_IGNORECASE = 6;
public static int GLOBAL_NF = 7;
public static int GLOBAL_NR = 8;
public static int GLOBAL_OFILENAME = 9;
public static int GLOBAL_OFMT = 10;
public static int GLOBAL_OFS = 11;
public static int GLOBAL_ORS = 12;
public static int GLOBAL_RLENGTH = 13;
public static int GLOBAL_RS = 14;
public static int GLOBAL_RSTART = 15;
public static int GLOBAL_SUBSEP = 16;
private Awk awk; private Awk awk;
private long runid; private long runid;
private Object custom; private Object custom;
@ -52,7 +70,21 @@ public class Context
stop (this.runid); stop (this.runid);
} }
public void setGlobal (int id, Return ret) throws Exception
{
// regardless of the result, the value field
// of the return object is reset to 0 by setglobal.
setglobal (this.runid, id, ret);
}
/*
public void getGlobal (int id, Argument arg) throws Exception
{
}
*/
protected native void stop (long runid); protected native void stop (long runid);
protected native void setglobal (long runid, int id, Return ret);
// TODO: // TODO:
// setGlobal // setGlobal

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Return.java,v 1.4 2007/10/24 14:17:32 bacon Exp $ * $Id: Return.java,v 1.5 2007/10/29 15:20:13 bacon Exp $
*/ */
package ase.awk; package ase.awk;
@ -14,6 +14,12 @@ public class Return
* referenced that way, the setXXX methods may cause * referenced that way, the setXXX methods may cause
* JVM to crash */ * JVM to crash */
public Return (Context ctx)
{
this.runid = ctx.getId();
this.valid = 0;
}
Return (long runid, long valid) Return (long runid, long valid)
{ {
this.runid = runid; this.runid = runid;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: jni.c,v 1.40 2007/10/24 14:17:32 bacon Exp $ * $Id: jni.c,v 1.41 2007/10/29 15:20:13 bacon Exp $
* *
* {License} * {License}
*/ */
@ -1788,9 +1788,11 @@ static int handle_bfn (
if (vi != 0) if (vi != 0)
{ {
ase_awk_setretval (run, (ase_awk_val_t*)vi); ase_awk_setretval (run, (ase_awk_val_t*)vi);
/* invalidate the value field in return object */
ase_awk_refdownval (run, (ase_awk_val_t*)vi); ase_awk_refdownval (run, (ase_awk_val_t*)vi);
(*env)->SetLongField (env, ret, run_data->return_valid, (jlong)0);
} }
(*env)->SetLongField (env, ret, run_data->return_valid, (jlong)0);
(*env)->DeleteLocalRef (env, args); (*env)->DeleteLocalRef (env, args);
(*env)->DeleteLocalRef (env, ret); (*env)->DeleteLocalRef (env, ret);
@ -2323,6 +2325,34 @@ JNIEXPORT void JNICALL Java_ase_awk_Context_stop (JNIEnv* env, jobject obj, jlon
ase_awk_stop ((ase_awk_run_t*)runid); ase_awk_stop ((ase_awk_run_t*)runid);
} }
JNIEXPORT void JNICALL Java_ase_awk_Context_setglobal (JNIEnv* env, jobject obj, jlong runid, jint id, jobject ret)
{
ase_awk_run_t* run = (ase_awk_run_t*)runid;
run_data_t* run_data;
jlong vi;
run_data = (run_data_t*)ase_awk_getruncustomdata (run);
vi = (*env)->GetLongField (env, ret, run_data->return_valid);
if (vi != 0)
{
if (ase_awk_setglobal(run, id, (ase_awk_val_t*)vi) == -1)
{
/* invalidate the value field in the return object
* even when an exception is thrown. otherwise,
* the value might never be freed. */
ase_awk_refdownval (run, (ase_awk_val_t*)vi);
(*env)->SetLongField (env, ret, run_data->return_valid, (jlong)0);
THROW_RUN_EXCEPTION (env, run);
return;
}
/* invalidate the value field in the return object */
ase_awk_refdownval (run, (ase_awk_val_t*)vi);
(*env)->SetLongField (env, ret, run_data->return_valid, (jlong)0);
}
}
JNIEXPORT jlong JNICALL Java_ase_awk_Argument_getintval (JNIEnv* env, jobject obj, jlong runid, jlong valid) JNIEXPORT jlong JNICALL Java_ase_awk_Argument_getintval (JNIEnv* env, jobject obj, jlong runid, jlong valid)
{ {
@ -2879,7 +2909,6 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedstrval (JNIEnv* env, jobjec
} }
} }
JNIEXPORT void JNICALL Java_ase_awk_Return_clearval (JNIEnv* env, jobject obj, jlong runid, jlong valid) JNIEXPORT void JNICALL Java_ase_awk_Return_clearval (JNIEnv* env, jobject obj, jlong runid, jlong valid)
{ {
ase_awk_run_t* run = (ase_awk_run_t*)runid; ase_awk_run_t* run = (ase_awk_run_t*)runid;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: AseAwkPanel.java,v 1.13 2007/10/28 15:03:22 bacon Exp $ * $Id: AseAwkPanel.java,v 1.14 2007/10/29 15:20:13 bacon Exp $
*/ */
import java.awt.*; import java.awt.*;
@ -100,7 +100,7 @@ public class AseAwkPanel extends Panel
setWord ("OFMT", "ofmt"); setWord ("OFMT", "ofmt");
} }
public void sleep (Context ctx, String name, Return ret, Argument[] args) public void sleep (Context ctx, String name, Return ret, Argument[] args) throws ase.awk.Exception
{ {
try { Thread.sleep (args[0].getIntValue() * 1000); } try { Thread.sleep (args[0].getIntValue() * 1000); }
catch (InterruptedException e) {} catch (InterruptedException e) {}
@ -111,6 +111,10 @@ public class AseAwkPanel extends Panel
ret.setIndexedStringValue (3, "3dk3kd"); ret.setIndexedStringValue (3, "3dk3kd");
ret.setIndexedIntValue (4, 444); ret.setIndexedIntValue (4, 444);
ret.setIndexedIntValue (5, 55555); ret.setIndexedIntValue (5, 55555);
Return r = new Return (ctx);
r.setStringValue ("[[%.6f]]");
ctx.setGlobal (Context.GLOBAL_CONVFMT, ret);
} }
protected int openSource (int mode) protected int openSource (int mode)