⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsj_array.c

📁 caffeine-monkey java实现的js模拟引擎
💻 C
字号:
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code, released * March 31, 1998. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ /* * This file is part of the Java-vendor-neutral implementation of LiveConnect * * It contains the code for reading and writing elements of a Java array. */#include "jsj_private.h"      /* LiveConnect internals *//* * Read the Java value at a given index into a Java array and convert it * to a JS value.  The array_component_signature describes the type of * the resulting Java value, which can be a primitive type or an object type. * More specifically it can be an array type in the case of multidimensional * arrays. */JSBooljsj_GetJavaArrayElement(JSContext *cx, JNIEnv *jEnv, jarray java_array, jsize index,                        JavaSignature *array_component_signature,                        jsval *vp){    jvalue java_value;    JavaSignatureChar component_type;    JSBool success;#define GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Type,member)                   \    (*jEnv)->Get##Type##ArrayRegion(jEnv, java_array, index, 1,              \                                    &java_value.member);                     \    if ((*jEnv)->ExceptionOccurred(jEnv)) {                                  \        jsj_ReportJavaError(cx, jEnv, "Error reading element of "            \                                      "Java primitive array");               \        return JS_FALSE;                                                     \    }    component_type = array_component_signature->type;    switch(component_type) {    case JAVA_SIGNATURE_BYTE:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Byte,b);        break;    case JAVA_SIGNATURE_CHAR:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Char,c);        break;    case JAVA_SIGNATURE_SHORT:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Short,s);        break;    case JAVA_SIGNATURE_INT:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Int,i);        break;    case JAVA_SIGNATURE_BOOLEAN:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Boolean,z);        break;    case JAVA_SIGNATURE_LONG:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Long,j);        break;      case JAVA_SIGNATURE_FLOAT:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Float,f);        break;    case JAVA_SIGNATURE_DOUBLE:        GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Double,d);        break;    /* Non-primitive (reference) type */    default:        JS_ASSERT(component_type >= JAVA_SIGNATURE_ARRAY);        java_value.l = (*jEnv)->GetObjectArrayElement(jEnv, java_array, index);        if ((*jEnv)->ExceptionOccurred(jEnv)) {            jsj_ReportJavaError(cx, jEnv, "Error reading Java object array");            return JS_FALSE;        }        success = jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_value.l, vp);        (*jEnv)->DeleteLocalRef(jEnv, java_value.l);        return success;#undef GET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY    case JAVA_SIGNATURE_UNKNOWN:    case JAVA_SIGNATURE_VOID:        JS_ASSERT(0);        /* Unknown java type signature */        return JS_FALSE;    }    return jsj_ConvertJavaValueToJSValue(cx, jEnv, array_component_signature, &java_value, vp);}JSBooljsj_SetJavaArrayElement(JSContext *cx, JNIEnv *jEnv, jarray java_array, jsize index,                        JavaSignature *array_component_signature,                        jsval js_val){    int dummy_cost;    jvalue java_value;    JavaSignatureChar component_type;    JSBool is_local_ref;    if (!jsj_ConvertJSValueToJavaValue(cx, jEnv, js_val, array_component_signature,                                       &dummy_cost, &java_value, &is_local_ref))        return JS_FALSE;#define SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Type,member)                   \    (*jEnv)->Set##Type##ArrayRegion(jEnv, java_array, index, 1,              \                                    &java_value.member);                     \    if ((*jEnv)->ExceptionOccurred(jEnv)) {                                  \        jsj_ReportJavaError(cx, jEnv, "Error assigning to element of "       \                                      "Java primitive array");               \        return JS_FALSE;                                                     \    }    component_type = array_component_signature->type;    switch(component_type) {    case JAVA_SIGNATURE_BYTE:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Byte,b);        break;    case JAVA_SIGNATURE_CHAR:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Char,c);        break;    case JAVA_SIGNATURE_SHORT:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Short,s);        break;    case JAVA_SIGNATURE_INT:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Int,i);        break;    case JAVA_SIGNATURE_BOOLEAN:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Boolean,z);        break;    case JAVA_SIGNATURE_LONG:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Long,j);        break;      case JAVA_SIGNATURE_FLOAT:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Float,f);        break;    case JAVA_SIGNATURE_DOUBLE:        SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY(Double,d);        break;    /* Non-primitive (reference) type */    default:        JS_ASSERT(IS_REFERENCE_TYPE(component_type));        (*jEnv)->SetObjectArrayElement(jEnv, java_array, index, java_value.l);        if (is_local_ref)                                                           \            (*jEnv)->DeleteLocalRef(jEnv, java_value.l);        if ((*jEnv)->ExceptionOccurred(jEnv)) {            jsj_ReportJavaError(cx, jEnv, "Error assigning to Java object array");            return JS_FALSE;        }        break;#undef SET_ELEMENT_FROM_PRIMITIVE_JAVA_ARRAY    case JAVA_SIGNATURE_UNKNOWN:    case JAVA_SIGNATURE_VOID:        JS_ASSERT(0);        /* Unknown java type signature */        return JS_FALSE;    }    return JS_TRUE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -