00001
00013 #ifndef NEWTOBJ_H
00014 #define NEWTOBJ_H
00015
00016
00017
00018 #include "NewtType.h"
00019
00020
00021
00023
00024 #define NOBJ_ADDR_SHIFT 0
00025
00026
00027 #define NewtRefIsInt30(r) ((r & 3) == 0)
00028 #define NewtRefToInt30(r) (int32_t)((int32_t)r >> 2)
00029 #define NewtMakeInt30(v) (newtRef)((int32_t)(v) << 2)
00030
00031 #define NewtRefIsPointer(r) ((r & 3) == 1)
00032 #define NewtRefToPointer(r) (newtObjRef)((uint32_t)r - 1)
00033 #define NewtMakePointer(v) (newtRef)((uint32_t)(v) + 1)
00034
00035 #define NewtRefIsCharacter(r) ((r & 0xF) == 6)
00036 #define NewtRefToCharacter(r) (int)(((uint32_t)r >> 4) & 0xFFFF)
00037 #define NewtMakeCharacter(v) (newtRef)(((uint32_t)(v) << 4) | 6)
00038
00039 #define NewtRefIsSpecial(r) ((r & 0xF) == 2)
00040 #define NewtRefToSpecial(r) (int32_t)((uint32_t)r >> 2)
00041
00042 #define NewtRefIsMagicPointer(r) ((r & 3) == 3)
00043
00044 #ifdef __NAMED_MAGIC_POINTER__
00045 #define NewtMakeNamedMP(r) ((newtRef)((uint32_t)NewtMakeSymbol(r) | 3))
00046 #define NewtMPToSymbol(r) ((newtRef)((uint32_t)r & 0xFFFFFFFD))
00047 #define NewtSymbolToMP(r) ((newtRef)((uint32_t)r | 3))
00048 #else
00049 #define NewtMakeMagicPointer(t, i) ((newtRef)((t << 14) | ((i & 0x03ff) << 2) | 3))
00050 #define NewtMPToTable(r) ((int32_t)((uint32_t)r >> 14))
00051 #define NewtMPToIndex(r) ((int32_t)(((uint32_t)r >> 2) & 0x03ff))
00052 #endif
00053
00054 #define NewtRefIsNotNIL(v) (! NewtRefIsNIL(v))
00055 #define NewtMakeBoolean(v) ((newtRef)((v)?(kNewtRefTRUE):(kNewtRefNIL)))
00056
00057 #define NewtRefToBinary(r) ((uint8_t *)NewtRefToData(r))
00058 #define NewtRefToSymbol(r) ((newtSymDataRef)NewtRefToData(r))
00059 #define NewtRefToString(r) ((char *)NewtRefToData(r))
00060 #define NewtRefToSlots(r) ((newtRef *)NewtRefToData(r))
00061
00062
00063 #define NewtArrayLength(r) NewtSlotsLength(r)
00064 #define NewtFrameLength(r) NewtSlotsLength(r)
00065
00066
00067 #define NewtObjType(v) (v->header.h & 3)
00068 #define NewtObjIsSlotted(v) ((v->header.h & kNewtObjSlotted) != 0)
00069 #define NewtObjIsArray(v) (NewtObjType(v) == 1)
00070 #define NewtObjIsFrame(v) (NewtObjType(v) == 3)
00071 #define NewtObjIsLiteral(v) ((v->header.h & kNewtObjLiteral) == kNewtObjLiteral)
00072 #define NewtObjIsSweep(v, mark) (((v->header.h & kNewtObjSweep) == kNewtObjSweep) == mark)
00073 #define NewtObjSize(v) (v->header.h >> 8)
00074 #define NewtObjBinaryClass(v) (v->as.klass)
00075 #define NewtObjArrayClass(v) (v->as.klass)
00076 #define NewtObjToBinary(v) ((uint8_t *)NewtObjData(v))
00077 #define NewtObjToSymbol(v) ((newtSymDataRef)NewtObjData(v))
00078 #define NewtObjToString(v) ((char *)NewtObjData(v))
00079 #define NewtObjToSlots(v) ((newtRef *)NewtObjData(v))
00080
00081
00082 #define NewtHasVar(name) NVMHasVar(name)
00083 #define NewtObjIsReadonly(obj) NewtObjIsLiteral(obj)
00084 #define NewtRefIsReadonly(r) NewtRefIsLiteral(r)
00085
00086 #ifdef __USE_OBSOLETE_STYLE__
00087
00088 #define NewtMakeNativeFn(funcPtr, numArgs, doc) NewtMakeNativeFn0(funcPtr, numArgs, false, doc)
00089 #define NewtDefGlobalFn(sym, funcPtr, numArgs, doc) NewtDefGlobalFn0(sym, funcPtr, numArgs, false, doc)
00090
00091 #endif
00092
00093
00094 #define NewtMakeNativeFunc(funcPtr, numArgs, doc) NewtMakeNativeFunc0(funcPtr, numArgs, false, doc)
00095 #define NewtDefGlobalFunc(sym, funcPtr, numArgs, doc) NewtDefGlobalFunc0(sym, funcPtr, numArgs, false, doc)
00096
00097
00098
00099
00100 enum {
00101 kNewtNotFunction = 0,
00102 kNewtCodeBlock,
00103 kNewtNativeFn,
00104 kNewtNativeFunc
00105 };
00106
00107
00108
00109
00111 typedef void(*newt_install_t)(void);
00112
00113
00114
00115
00116 #ifdef __cplusplus
00117 extern "C" {
00118 #endif
00119
00120
00121 uint32_t NewtSymbolHashFunction(const char * name);
00122 newtRef NewtLookupSymbol(newtRefArg r, const char * name, uint32_t hash, int32_t st);
00123 newtRef NewtLookupSymbolArray(newtRefArg r, newtRefArg name, int32_t st);
00124 const char* NewtSymbolGetName(newtRefArg inSymbol);
00125
00126 uint16_t NewtGetRefType(newtRefArg r, bool detail);
00127 uint16_t NewtGetObjectType(newtObjRef obj, bool detail);
00128
00129 uint32_t NewtObjCalcDataSize(uint32_t n);
00130 newtObjRef NewtObjAlloc(newtRefArg r, uint32_t n, uint16_t type, bool literal);
00131 newtObjRef NewtObjResize(newtObjRef r, uint32_t n);
00132 void * NewtObjData(newtObjRef obj);
00133 newtRef NewtObjClone(newtRefArg r);
00134 newtRef NewtPackLiteral(newtRefArg r);
00135
00136 bool NewtRefIsLiteral(newtRefArg r);
00137 bool NewtRefIsSweep(newtRefArg r, bool mark);
00138 bool NewtRefIsNIL(newtRefArg r);
00139 bool NewtRefIsSymbol(newtRefArg r);
00140 uint32_t NewtRefToHash(newtRefArg r);
00141 bool NewtRefIsString(newtRefArg r);
00142 bool NewtRefIsInteger(newtRefArg r);
00143 int32_t NewtRefToInteger(newtRefArg r);
00144 bool NewtRefIsInt32(newtRefArg r);
00145 bool NewtRefIsReal(newtRefArg r);
00146 double NewtRefToReal(newtRefArg r);
00147 bool NewtRefIsBinary(newtRefArg r);
00148 void * NewtRefToData(newtRefArg r);
00149 bool NewtRefIsArray(newtRefArg r);
00150 bool NewtRefIsFrame(newtRefArg r);
00151 bool NewtRefIsFrameOrArray(newtRefArg r);
00152 bool NewtRefIsImmediate(newtRefArg r);
00153 bool NewtRefIsCodeBlock(newtRefArg r);
00154 bool NewtRefIsNativeFn(newtRefArg r);
00155 bool NewtRefIsNativeFunc(newtRefArg r);
00156 bool NewtRefIsFunction(newtRefArg r);
00157 int NewtRefFunctionType(newtRefArg r);
00158 bool NewtRefIsRegex(newtRefArg r);
00159 void * NewtRefToAddress(newtRefArg r);
00160
00161 newtRef NewtMakeBinary(newtRefArg klass, uint8_t * data, uint32_t size, bool literal);
00162 newtRef NewtMakeSymbol(const char *s);
00163 newtRef NewtMakeString(const char *s, bool literal);
00164 newtRef NewtMakeString2(const char *s, uint32_t len, bool literal);
00165 newtRef NewtBinarySetLength(newtRefArg r, uint32_t n);
00166 newtRef NewtStringSetLength(newtRefArg r, uint32_t n);
00167 newtRef NewtMakeInteger(int32_t v);
00168 newtRef NewtMakeInt32(int32_t v);
00169 newtRef NewtMakeReal(double v);
00170 newtRef NewtMakeArray(newtRefArg klass, uint32_t n);
00171 newtRef NewtMakeArray2(newtRefArg klass, uint32_t n, newtRefVar v[]);
00172 newtRef NewtMakeMap(newtRefArg superMap, uint32_t n, newtRefVar v[]);
00173 void NewtSetMapFlags(newtRefArg map, int32_t bit);
00174 void NewtClearMapFlags(newtRefArg map, int32_t bit);
00175 uint32_t NewtMapLength(newtRefArg map);
00176 newtRef NewtMakeFrame(newtRefArg map, uint32_t n);
00177 newtRef NewtMakeFrame2(uint32_t n, newtRefVar v[]);
00178 newtRef NewtMakeSlotsObj(newtRefArg r, uint32_t n, uint16_t type);
00179 uint32_t NewtObjSlotsLength(newtObjRef obj);
00180 newtRef NewtObjAddArraySlot(newtObjRef obj, newtRefArg v);
00181 newtRef NewtSlotsSetLength(newtRefArg r, uint32_t n, newtRefArg v);
00182 newtRef NewtSetLength(newtRefArg r, uint32_t n);
00183 newtRef NewtMakeAddress(void * addr);
00184
00185 newtRef NewtThrow0(int32_t err);
00186 newtRef NewtThrow(int32_t err, newtRefArg value);
00187 newtRef NewtThrowSymbol(int32_t err, newtRefArg symbol);
00188 newtRef NewtErrOutOfBounds(newtRefArg value, int32_t index);
00189 void NewtErrMessage(int32_t err);
00190
00191 int NewtSymbolCompareLex(newtRefArg r1, newtRefArg r2);
00192 int16_t NewtObjectCompare(newtRefArg r1, newtRefArg r2);
00193 bool NewtRefEqual(newtRefArg r1, newtRefArg r2);
00194 bool NewtObjectEqual(newtRefArg r1, newtRefArg r2);
00195 bool NewtSymbolEqual(newtRefArg r1, newtRefArg r2);
00196
00197 uint32_t NewtLength(newtRefArg r);
00198 uint32_t NewtDeeplyLength(newtRefArg r);
00199 uint32_t NewtBinaryLength(newtRefArg r);
00200 uint32_t NewtSymbolLength(newtRefArg r);
00201 uint32_t NewtStringLength(newtRefArg r);
00202 uint32_t NewtSlotsLength(newtRefArg r);
00203 uint32_t NewtDeeplyFrameLength(newtRefArg r);
00204
00205 newtRef NewtObjGetSlot(newtObjRef obj, newtRefArg slot);
00206 newtRef NewtObjSetSlot(newtObjRef obj, newtRefArg slot, newtRefArg v);
00207 void NewtObjRemoveSlot(newtObjRef obj, newtRefArg slot);
00208
00209 newtRef NewtGetMapIndex(newtRefArg r, uint32_t index, uint32_t * indexP);
00210 int32_t NewtFindArrayIndex(newtRefArg r, newtRefArg v, uint16_t st);
00211 bool NewtFindMapIndex(newtRefArg r, newtRefArg v, uint32_t * indexP);
00212 newtRef NewtFrameMap(newtRefArg r);
00213
00214 int32_t NewtFindSlotIndex(newtRefArg frame, newtRefArg slot);
00215 bool NewtHasProto(newtRefArg frame);
00216 bool NewtHasSlot(newtRefArg frame, newtRefArg slot);
00217 newtRef NewtSlotsGetPath(newtRefArg r, newtRefArg p);
00218 bool NewtHasPath(newtRefArg r, newtRefArg p);
00219 newtRef NewtGetPath(newtRefArg r, newtRefArg p, newtRefVar * slotP);
00220 newtRef NewtGetBinarySlot(newtRefArg r, uint32_t p);
00221 newtRef NewtSetBinarySlot(newtRefArg r, uint32_t p, newtRefArg v);
00222 newtRef NewtGetStringSlot(newtRefArg r, uint32_t p);
00223 newtRef NewtSetStringSlot(newtRefArg r, uint32_t p, newtRefArg v);
00224 newtRef NewtSlotsGetSlot(newtRefArg r, uint32_t p);
00225 newtRef NewtSlotsSetSlot(newtRefArg r, uint32_t p, newtRefArg v);
00226 newtRef NewtSlotsInsertSlot(newtRefArg r, uint32_t p, newtRefArg v);
00227 newtRef NewtGetArraySlot(newtRefArg r, uint32_t p);
00228 newtRef NewtSetArraySlot(newtRefArg r, uint32_t p, newtRefArg v);
00229 newtRef NewtInsertArraySlot(newtRefArg r, uint32_t p, newtRefArg v);
00230 newtRef NewtGetFrameSlot(newtRefArg r, uint32_t p);
00231 newtRef NewtSetFrameSlot(newtRefArg r, uint32_t p, newtRefArg v);
00232 newtRef NewtGetFrameKey(newtRefArg inFrame, uint32_t inIndex);
00233
00234 newtRef NewtARef(newtRefArg r, uint32_t p);
00235 newtRef NewtSetARef(newtRefArg r, uint32_t p, newtRefArg v);
00236
00237 bool NewtAssignment(newtRefArg start, newtRefArg name, newtRefArg value);
00238 bool NewtLexicalAssignment(newtRefArg start, newtRefArg name, newtRefArg value);
00239 bool NewtHasLexical(newtRefArg start, newtRefArg name);
00240 bool NewtHasVariable(newtRefArg r, newtRefArg name);
00241
00242 void * NewtRefToNativeFn(newtRefArg r);
00243
00244 newtRef NewtMakeNativeFn0(void * funcPtr, uint32_t numArgs, bool indefinite, char * doc);
00245 newtRef NewtDefGlobalFn0(newtRefArg sym, void * funcPtr, uint32_t numArgs, bool indefinite, char * doc);
00246
00247 newtRef NewtMakeNativeFunc0(void * funcPtr, uint32_t numArgs, bool indefinite, char * doc);
00248 newtRef NewtDefGlobalFunc0(newtRefArg sym, void * funcPtr, uint32_t numArgs, bool indefinite, char * doc);
00249
00250 bool NewtHasSubclass(newtRefArg sub, newtRefArg supr);
00251 bool NewtIsSubclass(newtRefArg sub, newtRefArg supr);
00252 bool NewtIsInstance(newtRefArg obj, newtRefArg r);
00253
00254 newtRef NewtStrCat(newtRefArg r, char * s);
00255 newtRef NewtStrCat2(newtRefArg r, char * s, uint32_t slen);
00256
00257 newtRef NewtGetEnv(const char * s);
00258
00259
00260 #ifdef __cplusplus
00261 }
00262 #endif
00263
00264
00265 #endif
00266
00267