| /******************************************************************************* |
| * Copyright (c) 2016 Google, Inc and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Stefan Xenos (Google) - Initial implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.core.nd.java; |
| |
| import org.eclipse.jdt.internal.compiler.codegen.AnnotationTargetTypeConstants; |
| import org.eclipse.jdt.internal.core.nd.Nd; |
| import org.eclipse.jdt.internal.core.nd.db.Database; |
| import org.eclipse.jdt.internal.core.nd.field.FieldByte; |
| import org.eclipse.jdt.internal.core.nd.field.FieldPointer; |
| import org.eclipse.jdt.internal.core.nd.field.StructDef; |
| |
| public class NdTypeAnnotation extends NdAnnotation { |
| public static final FieldByte TARGET_TYPE; |
| public static final FieldByte TARGET_ARG0; |
| public static final FieldByte TARGET_ARG1; |
| public static final FieldByte PATH_LENGTH; |
| public static final FieldPointer PATH; |
| |
| @SuppressWarnings("hiding") |
| public static final StructDef<NdTypeAnnotation> type; |
| |
| static { |
| type = StructDef.create(NdTypeAnnotation.class, NdAnnotation.type); |
| TARGET_TYPE = type.addByte(); |
| TARGET_ARG0 = type.addByte(); |
| TARGET_ARG1 = type.addByte(); |
| PATH_LENGTH = type.addByte(); |
| PATH = type.addPointer(); |
| type.done(); |
| } |
| |
| private static final byte[] NO_TYPE_PATH = new byte[0]; |
| |
| public NdTypeAnnotation(Nd nd, long address) { |
| super(nd, address); |
| } |
| |
| public NdTypeAnnotation(Nd nd) { |
| super(nd); |
| } |
| |
| public void setPath(byte[] path) { |
| freePath(); |
| Nd nd = getNd(); |
| PATH_LENGTH.put(nd, this.address, (byte)path.length); |
| if (path.length > 0) { |
| long pathArray = nd.getDB().malloc(path.length, Database.POOL_MISC); |
| PATH.put(nd, this.address, pathArray); |
| nd.getDB().putBytes(pathArray, path, path.length); |
| } |
| } |
| |
| public void setTargetInfo(int arg) { |
| TARGET_ARG0.put(getNd(), this.address, (byte)((arg >> 8) & 0xff)); |
| TARGET_ARG1.put(getNd(), this.address, (byte)(arg & 0xff)); |
| } |
| |
| public byte getTargetInfoArg0() { |
| return TARGET_ARG0.get(getNd(), this.address); |
| } |
| |
| public byte getTargetInfoArg1() { |
| return TARGET_ARG1.get(getNd(), this.address); |
| } |
| |
| public int getTarget() { |
| int arg0 = TARGET_ARG0.get(getNd(), this.address) & 0xff; |
| int arg1 = TARGET_ARG1.get(getNd(), this.address) & 0xff; |
| int result = (arg0 << 8) | arg1; |
| return result; |
| } |
| |
| public void setTargetInfo(byte arg0, byte arg1) { |
| TARGET_ARG0.put(getNd(), this.address, arg0); |
| TARGET_ARG1.put(getNd(), this.address, arg1); |
| } |
| |
| /** |
| * @param targetType one of the constants from {@link AnnotationTargetTypeConstants} |
| */ |
| public void setTargetType(int targetType) { |
| TARGET_TYPE.put(getNd(), this.address, (byte)targetType); |
| } |
| |
| /** |
| * @return one of the constants from {@link AnnotationTargetTypeConstants} |
| */ |
| public int getTargetType() { |
| return TARGET_TYPE.get(getNd(), this.address); |
| } |
| |
| public byte[] getTypePath() { |
| long pathPointer = PATH.get(getNd(), this.address); |
| if (pathPointer == 0) { |
| return NO_TYPE_PATH; |
| } |
| int pathLength = PATH_LENGTH.get(getNd(), this.address); |
| byte[] result = new byte[pathLength]; |
| getNd().getDB().getBytes(pathPointer, result); |
| return result; |
| } |
| |
| @Override |
| public void destruct() { |
| freePath(); |
| super.destruct(); |
| } |
| |
| private void freePath() { |
| Nd nd = getNd(); |
| long pathPointer = PATH.get(nd, this.address); |
| nd.getDB().free(pathPointer, Database.POOL_MISC); |
| } |
| } |