On Aug 24, 7:50 pm, Nathan <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I've just upgraded from 1.5R4 to 1.7R1 and some scripts that used to
> compile now no longer compile.
>
> My code is pretty much as follows:
>
> context.setGeneratingDebug( true );
> context.setOptimizationLevel( 0 );
> this.script = context.compileReader( reader, fileName, 1, null );
>
> Then I call a function multiple times on the same script, throwing the
> scope away after each execution:
>
> Scriptable scope = new ImporterTopLevel();
> this.script.exec( context, scope );
> Object functionObject = scope.get( functionName, scope );
> if ( functionObject instanceof Function )
> {
> Function function = (Function)functionObject;
> function.call( context, scope, null, args );
> }
>
> The first question is whether this usage is acceptable. I want to
> reuse the compiled code to save perm gen space and compilation time.
> I need to throw away the scope between executions to save heap space
> between function calls.
>
> Some of my scripts don't compile properly any more. The error I get
> is when I call compileReader:
>
> java.lang.VerifyError: (class: org/mozilla/javascript/gen/c3, method:
> _c1 signature: (Lorg/mozilla/javascript/gen/c3;Lorg/mozilla/javascript/
> Context;Lorg/mozilla/javascript/Scriptable;Lorg/mozilla/javascript/
> Scriptable;[Ljava/lang/Object;)Ljava/lang/Object;) Accessing value
> from uninitialized register 9
> at java.lang.Class.getDeclaredConstructors0(Native Method)
> at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
> at java.lang.Class.getConstructor0(Class.java:2699)
> at java.lang.Class.newInstance0(Class.java:326)
> at java.lang.Class.newInstance(Class.java:308)
> at
> org.mozilla.javascript.optimizer.Codegen.createScriptObject(Codegen.java:
> 106)
> at org.mozilla.javascript.Context.compileImpl(Context.java:2293)
> at org.mozilla.javascript.Context.compileReader(Context.java:1202)
> at org.mozilla.javascript.Context.compileReader(Context.java:1174)
>
> I've isolated the part of the script that causes the error (below).
> If I remove one of the inner-most try-catch errors, the error
> disappears. If I remove the finally section, the error also
> disappears. I don't see anything obviously wrong with the code, so is
> this a bug?
>
> Thanks,
>
> Nathan
>
> /**
> * Checks whether the business exists in the system
> */
> function isBuyerBusinessRegistered(p_communityMemberCode, p_buyerFlag,
> p_communityCode)
> {
> //
> // Return values from SP
> //
> var v_id_business;
> var v_fl_exists;
> var v_NO_error;
>
> if ( g_testMode == "true" )
> {
> return 1;
> }
>
> g_log.logInfo( "Checking if business registered with parameters
> p_communityCode '" + p_communityCode + "' and p_communityMemberCode '"
> + p_communityMemberCode + "' and p_buyerFlag '" + p_buyerFlag +
> "'" );
>
> try
> {
> try
> {
> //
> // Get the connection that we will be working with in this
> scope
> //
> g_conn =
>
> DBConnectionManagerFactory.getDBConnectionManager().getConnection();
> g_sql = "{ call " + g_spBusExists +
> "( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) }";
> g_stmt = g_conn.prepareCall( g_sql );
> //
> // Call the Stored Procedure
> //
> //1 (p_CD_community IN community.CD_community
> %TYPE,
> //2 p_CD_business IN
> community_member.CD_buyer_business%TYPE,
> //3 p_FL_buyer_business IN NUMBER DEFAULT 1,
> //4 p_NO_error OUT NUMBER,
> //5 p_ID_business OUT business.ID_business
> %TYPE,
> //6 p_NM_business OUT business.NM_business
> %TYPE,
> //7 p_TX_EMAIL OUT business.TX_email%TYPE,
> //8 p_ID_ADDRESS OUT business.ID_address%TYPE,
> //9 p_ID_ADDRESS_DELIVERY OUT
> business.ID_address_delivery%TYPE,
> //10 p_TX_PHONE OUT business.TX_phone%TYPE,
> //11 p_TX_FAX OUT business.TX_fax%TYPE,
> //12 p_CD_INVOICE_TEMPLATE OUT
> business.CD_invoice_template%TYPE,
> //13 p_NM_CONTACT OUT business.NM_contact
> %TYPE,
> //14 p_TX_COMMENT OUT business.TX_comment
> %TYPE,
> //15 p_FL_ENABLED OUT business.FL_enabled
> %TYPE,
> //16 p_AM_CREDIT_LIMIT OUT business.AM_credit_limit
> %TYPE,
> //17 p_CD_DIVISION OUT business.CD_division
> %TYPE) AS
>
> g_stmt.setString( 1, p_communityCode );
> g_stmt.setString( 2, p_communityMemberCode );
> g_stmt.setString( 3, p_buyerFlag );
>
> g_stmt.registerOutParameter( 4 , java.sql.Types.INTEGER );
> g_stmt.registerOutParameter( 5 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 6 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 7 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 8 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 9 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 10 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 11 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 12 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 13 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 14 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 15 , java.sql.Types.INTEGER );
> g_stmt.registerOutParameter( 16 , java.sql.Types.VARCHAR );
> g_stmt.registerOutParameter( 17 , java.sql.Types.VARCHAR );
>
> g_stmt.execute();
> }
> catch( ex )
> {
> iCISScriptExceptionUtil.handleException( "Could not lookup
> community member '" + p_communityMemberCode + "' using stored
> procedure.", ex );
> }
> try
> {
> //
> // Get the result
> //
> v_id_business = g_stmt.getInt( 5 );
> v_NO_error = g_stmt.getInt( 4 );
> v_fl_enabled = g_stmt.getInt( 15 );
> g_defaultEmail = g_stmt.getString( 7 );
>
> //g_log.logInfo( "Method returned: v_id_business '" +
> v_id_business + "'\n" +
> // " v_NO_error '" + v_NO_error
> + "'\n" +
> // " v_fl_enabled '" +
> v_fl_enabled + "'"
> // );
>
> g_buyerBusinessId = v_id_business;
>
> //return v_fl_exists;
>
> if ( v_fl_enabled == 1 && v_NO_error == 0 )
> return 1;
> else
> return 0;
> }
> catch( ex )
> {
> iCISScriptExceptionUtil.handleException( "Could not retrieve
> return parameters from stored procedure for community member '" +
> p_communityMemberCode + "'.", ex );
> }
> }
> catch( ex )
> {
> // dont do anything on an error, just return null for the business
> number
> // and it will go out in the BAM
> iCISScriptExceptionUtil.handleException( "Failed to find business,
> exception encountered", ex);
> //return null;
> }
> finally
> {
> try
> {
> g_stmt.close();
> }
> catch ( ignored ) { }
> try
> {
> g_conn.close();
> }
> catch ( ignored ) { }
> }
>
> }
The way you're using Rhino is fine; the VerifyError is a bug. Can you
create a bug report (https://bugzilla.mozilla.org/enter_bug.cgi?
product=Rhino) and attach .js file you quote above as the line
wrapping has made it unparseable as is?
It may be possible to work around the problem by moving some of the
innermost try-catch blocks to a new function.
Thanks,
Norris
_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino