文档章节

Array 分析

bytebear
 bytebear
发布于 2014/08/01 22:43
字数 356
阅读 10
收藏 0

参考http://blog.csdn.net/allenlooplee/article/details/4680601

 

 

ecall.cpp中宏定义

#define FCFuncFlags(intrinsicID, dynamicID) \
    (BYTE*)( (((BYTE)intrinsicID) << 16) + (((BYTE)dynamicID) << 24) )

 

#define GetEEFuncEntryPoint(pfn) ((LPVOID)(pfn))

 

#define FCFuncElement(name, impl) FCFuncFlags(CORINFO_INTRINSIC_Illegal, ECall::InvalidDynamicFCallId), \
    GetEEFuncEntryPoint(impl), NULL, NULL, (LPVOID)name,

#define FCFuncStart(name) static LPVOID name[] = {
#define FCFuncEnd() FCFuncFlag_EndOfArray + FCFuncFlags(CORINFO_INTRINSIC_Illegal, ECall::InvalidDynamicFCallId) };

FCFuncStart(gArrayFuncs)

    FCFuncElement("InternalCreate", COMArrayInfo::CreateInstance)

FCFuncEnd()

 

 

 

 

展开后

  static LPVOID InternalCreate[]={

((LPVOID)(pfn)),NULL,NULL

}

函数声明  fcall.h

#define FCIMPL4(rettype, funcname, a1, a2, a3, a4) rettype F_CALL_CONV funcname(int /* EAX */, a2, a1, a4, a3) { FCIMPL_PROLOG(funcname)

需要下面的宏

#ifdef __GNUC__

#define F_CALL_CONV __attribute__((stdcall, regparm(3)))

#else

#define F_CALL_CONV __fastcall

#endif

#define FCALL_TRANSITION_BEGIN()

#define FC_COMMON_PROLOG(target, assertFn) FCALL_TRANSITION_BEGIN()

 

#define GetEEFuncEntryPointMacro(func)  ((LPVOID)(func))

#define FCIMPL_PROLOG(funcname)  \
    LPVOID __me; \
    __me = GetEEFuncEntryPointMacro(funcname); \
    FC_COMMON_PROLOG(__me, FCallAssert)

 

#define FCIMPLEND   FCIMPL_EPILOG(); }

 

 

Array InternalCreate的Runtime实现代码

FCIMPL4(Object*, COMArrayInfo::CreateInstance, void* elementTypeHandle, INT32 rank, INT32* pLengths, INT32* pLowerBounds)
{
    CONTRACTL {
        SO_TOLERANT;
        THROWS;
        DISABLED(GC_TRIGGERS);  // reenable once GC_TRIGGERS allowed in FCALLs
        PRECONDITION(rank > 0);
        PRECONDITION(CheckPointer(pLengths));
        PRECONDITION(CheckPointer(pLowerBounds, NULL_OK));
    } CONTRACTL_END;
    OBJECTREF pRet = NULL;
    TypeHandle elementType = TypeHandle::FromPtr(elementTypeHandle);
    _ASSERTE(!elementType.IsNull());
    // pLengths and pLowerBounds are pinned buffers. No need to protect them.
    HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB(Frame::FRAME_ATTR_RETURNOBJ);
    CheckElementType(elementType);
    CorElementType CorType = elementType.GetSignatureCorElementType();
    CorElementType kind = ELEMENT_TYPE_ARRAY;
    // Is it ELEMENT_TYPE_SZARRAY array?
    if (rank == 1 && (pLowerBounds == NULL || pLowerBounds[0] == 0))
    {
        // Shortcut for common cases
        if (CorTypeInfo::IsPrimitiveType(CorType))
        {
            pRet = AllocatePrimitiveArray(CorType,pLengths[0]);
            goto Done;
        }
        else
        if (CorTypeInfo::IsObjRef(CorType))
        {
            pRet = AllocateObjectArray(pLengths[0],elementType);
            goto Done;
        }
        kind = ELEMENT_TYPE_SZARRAY;
        pLowerBounds = NULL;
    }
    {
        // Find the Array class...
        TypeHandle typeHnd = ClassLoader::LoadArrayTypeThrowing(elementType, kind, rank);
        DWORD  boundsSize;
        INT32* bounds;
        if (pLowerBounds != NULL) {
            boundsSize = rank*2;
            bounds = (INT32*) _alloca(boundsSize * sizeof(INT32));
            for (int i=0;i<rank;i++) {
                bounds[2*i] = pLowerBounds[i];
                bounds[2*i+1] = pLengths[i];
            }
        }
        else {
            boundsSize = rank;
            bounds = (INT32*) _alloca(boundsSize * sizeof(INT32));
            // We need to create a private copy of pLengths to avoid holes caused
            // by caller mutating the array
            for (int i=0;i<rank;i++)
                bounds[i] = pLengths[i];
        }
        pRet = AllocateArrayEx(typeHnd, bounds, boundsSize);
    }
Done: ;
    HELPER_METHOD_FRAME_END();
    return OBJECTREFToObject(pRet);
}
FCIMPLEND

© 著作权归作者所有

上一篇: pharse.js开发
bytebear
粉丝 5
博文 256
码字总数 18259
作品 0
拉萨
程序员
私信 提问
nginx源码分析—数组结构ngx_array_t

本博客(http://blog.csdn.net/livelylittlefish )贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正! Content 0.序 1.数组结构 1.1ngx_array_t结构 1.2ngx_array_t的逻辑结...

晨曦之光
2012/03/09
191
0
定义对象或数组直接量时不同引擎对多余逗号的处理

这种错误已经我已经多次犯了,一次用Ext做abcc的demo,一次是abcc查询模块。 js报错分为两种:语法错误和运行错误 1、js引擎在代码载入时进行语法分析,如果js写的不规范则语法分析通不过。这...

snandy
2011/01/30
0
0
Java并发学习(八)-AtomicIntegerArray数组类型类

前一篇文章学习了AtomicXXX基本数据类型类,可以为int,boolean或者reference类型,也就是单个元素的原子类。那么数组类型呢? 下面以为例进行分析。 AtomicXXXArray包括三种具体类:,,。 ...

anLA_
2017/11/28
0
0
常用排序算法之JavaScript实现

1、插入排序 1)算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插...

开心303
2014/09/05
0
0
php-数据分析 余弦相似度实现

<?php /** * 数据分析引擎 * 分析向量的元素 必须和基准向量的元素一致,取最大个数,分析向量不足元素以0填补。 * 求出分析向量与基准向量的余弦值 * @author Foyon */ /** * 获得向量的模 ...

Foyon
2012/09/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
6
0
Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部