Beispiel #1
0
int lua_type(lua_State* L, int index)
{
    const Value* value = GetValueForIndex(L, index);
    if (value == &L->dummyObject)
    {
        return LUA_TNONE;
    }
    return Value_GetType(value);
}
Beispiel #2
0
Table* Value_GetMetatable(lua_State* L, const Value* value)
{
    switch (value->tag)
    {
    case Tag_Table:
        return value->table->metatable;
    case Tag_Userdata:
        return value->userData->metatable;
    }
    // Get the global metatable for the type.
    int type = Value_GetType(value);
    ASSERT(type >= 0 && type < NUM_TYPES );
    return L->metatable[type];
}
Beispiel #3
0
void Value_SetMetatable(lua_State* L, Value* value, Table* table)
{
    switch (value->tag)
    {
    case Tag_Table:
        if (table != NULL)
        {
            Gc_IncrementReference(&L->gc, value->table, table);
        }
        if (value->table->metatable != NULL)
        {
            Gc_DecrementReference(L, &L->gc, value->table->metatable);
        }
        value->table->metatable = table;
        break;
    case Tag_Userdata:
        if (table != NULL)
        {
            Gc_IncrementReference(&L->gc, value->userData, table);
        }
        if (value->userData->metatable != NULL)
        {
            Gc_DecrementReference(L, &L->gc, value->userData->metatable);
        }
        value->userData->metatable = table;
         break;
    default:
        {
            // Set the global metatable for the type.
            int type = Value_GetType(value);
            ASSERT(type >= 0 && type < NUM_TYPES );
            L->metatable[type] = table;
        }
        break;
    }
}
AwaError GetValuePointer(const ResponseCommon * response, const char * path, const void ** value, size_t * valueSize, AwaResourceType resourceType, int resourceSize, bool withNull)
{
    AwaError result = AwaError_Unspecified;
    if (path != NULL)
    {
        if (Path_IsValidForResource(path))
        {
            if (response != NULL)
            {
                if (value != NULL)
                {
                    const Value * storedValue = ResponseCommon_GetValue(response, path);
                    if (storedValue != NULL)
                    {
                        AwaResourceType type = Value_GetType(storedValue);
                        if (type == resourceType || (type == AwaResourceType_None && resourceType == AwaResourceType_Opaque /* Execute arguments payload */))
                        {
                            const void * data = Value_GetData(storedValue);
                            size_t length = Value_GetLength(storedValue);
                            // -1 used for e.g. string values as we can't know how long they are without reading them first
                            if (resourceSize != -1 && length != resourceSize)
                            {
                                result = LogErrorWithEnum(AwaError_Internal, "Unexpected length for %s value: %zu expects %d", Utils_ResourceTypeToString(resourceType), length, resourceSize);
                            }
                            else
                            {
                                if (withNull)
                                {
                                    char * nulledValue = (char *)malloc(length+1);

                                    if ((nulledValue != NULL))
                                    {
                                        memcpy(nulledValue, data, length);
                                        nulledValue[length] = '\0';
                                        if (valueSize != NULL)
                                        {
                                            *valueSize = length + 1;
                                        }

                                        Map_Put(response->NulledValues, path, nulledValue);

                                        *value = nulledValue;
                                        result = AwaError_Success;
                                    }
                                    else
                                    {
                                        result = LogErrorWithEnum(AwaError_OutOfMemory);
                                    }
                                }
                                else
                                {
                                    *value = (length > 0) ? data : NULL;
                                    if (valueSize != NULL)
                                    {
                                        *valueSize = length;
                                    }

                                    result = AwaError_Success;
                                }
                            }
                        }
                        else
                        {
                            result = LogErrorWithEnum(AwaError_TypeMismatch, "Resource %s is not of type %s", path, Utils_ResourceTypeToString(resourceType));
                        }
                    }
                    else
                    {
                        // no value stored for this path
                        result = LogErrorWithEnum(AwaError_PathNotFound, "No value for path %s", path);
                    }
                }
                else
                {
                    result = LogErrorWithEnum(AwaError_OperationInvalid, "Value is null");
                }
            }
            else
            {
                result = LogErrorWithEnum(AwaError_OperationInvalid, "Invalid Get Response");
            }
        }
        else
        {
            result = LogErrorWithEnum(AwaError_PathInvalid, "%s is not a resource path", path);
        }
    }
    else
    {
        result = LogErrorWithEnum(AwaError_PathInvalid, "No path specified");
    }
    return result;
}