dvander@26: /* dvander@26: * Copyright (C) 2012 David Anderson dvander@26: * dvander@118: * This file is part of SourcePawn. dvander@26: * dvander@118: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@26: * the terms of the GNU General Public License as published by the Free dvander@26: * Software Foundation, either version 3 of the License, or (at your option) dvander@26: * any later version. dvander@26: * dvander@118: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@26: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@26: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@26: * dvander@26: * You should have received a copy of the GNU General Public License along with dvander@118: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@26: */ dvander@26: #ifndef _include_jitcraft_function_h_ dvander@26: #define _include_jitcraft_function_h_ dvander@26: dvander@26: #include "Heap.h" dvander@26: #include "Barriers.h" dvander@26: #include "Types.h" dvander@195: #include "Opcodes.h" dvander@26: dvander@59: namespace ke { dvander@26: dvander@26: class Code; dvander@26: class Module; dvander@64: class String; dvander@26: dvander@26: class Function : public Object dvander@26: { dvander@26: Barriered code_; dvander@195: Barriered type_; dvander@64: Barriered name_; dvander@26: SourcePosition pos_; dvander@26: dvander@26: public: dvander@195: static Function *New(Zone *zone, Handle code, Handle type, Handle name, dvander@26: const SourcePosition &pos); dvander@26: dvander@26: Code *code() const { dvander@26: return code_; dvander@26: } dvander@195: FunctionType *type() const { dvander@26: return type_; dvander@26: } dvander@64: String *name() const { dvander@64: return name_; dvander@64: } dvander@26: const SourcePosition &pos() { dvander@26: return pos_; dvander@26: } dvander@26: unsigned nargs() { dvander@26: return type()->parameters()->length(); dvander@26: } dvander@26: Type *argType(size_t index) { dvander@26: return type()->parameterAt(index); dvander@26: } dvander@26: dvander@44: // Begin GC Descriptor. dvander@44: static inline size_t offsetOfCode() { danderson@91: return OFFSETOF(Function, code_); dvander@44: } dvander@44: static inline size_t offsetOfType() { danderson@91: return OFFSETOF(Function, type_); dvander@44: } dvander@68: static inline size_t offsetOfName() { danderson@91: return OFFSETOF(Function, name_); dvander@68: } dvander@44: // End GC Descriptor. dvander@44: dvander@26: static inline Function *cast(Object *obj) { dvander@28: assert(!obj || obj->is(MapKind_Function)); dvander@26: return reinterpret_cast(obj); dvander@26: } dvander@26: }; dvander@26: dvander@68: // A Native is a function with a very specialized calling convention, intended dvander@68: // for earlier ISourcePawnEngine API compatibility. dvander@68: class Native : public Object dvander@68: { dvander@195: Barriered type_; dvander@195: dvander@195: // Index into the Zone's native table. dvander@195: size_t index_; dvander@68: dvander@68: public: dvander@195: static Native *New(Zone *zone, Handle type, size_t index); dvander@68: dvander@195: FunctionType *type() { dvander@68: return type_; dvander@68: } dvander@195: size_t index() const { dvander@195: return index_; dvander@68: } dvander@68: dvander@68: // Begin GC Descriptor. dvander@68: static inline size_t offsetOfType() { danderson@91: return OFFSETOF(Native, type_); dvander@68: } dvander@68: // End GC Descriptor. dvander@68: dvander@68: static inline Native *cast(Object *obj) { dvander@68: assert(!obj || obj->is(MapKind_Native)); dvander@68: return reinterpret_cast(obj); dvander@68: } dvander@68: }; dvander@68: dvander@26: } dvander@26: dvander@26: #endif // _include_jitcraft_function_h_