void ECodesAssembler :: readMessage(TokenInfo& token, int& verbId, IdentifierString& subject, int& paramCount) { verbId = mapVerb(token.value); if (verbId == 0) { if (token.check("dispatch")) { verbId = DISPATCH_MESSAGE_ID; } else verbId = EVAL_MESSAGE_ID; } token.read(); while (token.value[0] == '&') { subject.append(token.value); token.read(); subject.append(token.value); token.read(); if (token.value[0] == '$') { subject.append(token.value); token.read(); } } if (token.value[0] == '[') { paramCount = token.readInteger(constants); } else token.raiseErr("Invalid operand (%d)"); token.read("]", "Invalid operand (%d)"); }
void ECodesAssembler :: compileProcedure(TokenInfo& token, _Module* binary, bool inlineMode, bool aligned) { LabelInfo info; token.read(); ReferenceNs refName(binary->Name(), token.value); ref_t reference = binary->mapReference(refName) | mskCodeRef; if (binary->mapSection(reference, true)!=NULL) { throw AssemblerException("Procedure already exists (%d)\n", token.terminal.row); } _Memory* code = binary->mapSection(reference, false); MemoryWriter writer(code); writer.writeDWord(0); token.read(); while (!token.check("end")) { compileCommand(token, writer, info, binary); } (*code)[0] = writer.Position() - 4; }
void ECodesAssembler :: compileExtCommand(ByteCode code, TokenInfo& token, MemoryWriter& writer, _Module* binary) { ident_t word = token.read(); if (word.compare("extern")) { token.read(":", "Invalid operand (%d)"); token.read(); if (token.check("'dlls'", 6)) { ReferenceNs function(DLL_NAMESPACE, token.value + 6); token.read(".", "dot expected (%d)\n"); function.append("."); function.append(token.read()); size_t reference = binary->mapReference(function) | mskImportRef; writeCommand(ByteCommand(code, reference), writer); return; } else { ReferenceNs function(DLL_NAMESPACE, RTDLL_FORWARD); function.append("."); function.append(token.value); size_t reference = binary->mapReference(function) | mskImportRef; writeCommand(ByteCommand(code, reference), writer); return; } } else if (word.compare("api")) { token.read(":", "Invalid operand (%d)"); token.read(); ReferenceNs functionName(NATIVE_MODULE, CORE_MODULE); functionName.combine(token.value); size_t reference = binary->mapReference(functionName) | mskNativeCodeRef; writeCommand(ByteCommand(code, reference), writer); return; } throw AssemblerException("Invalid operand (%d)\n", token.terminal.row); }